<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Home on Blackratel Blog</title>
    <link>https://blackratel.com/blog/</link>
    <description>Recent content in Home on Blackratel Blog</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en</language>
    <copyright>© 2026 blackratel</copyright>
    <lastBuildDate>Tue, 05 May 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://blackratel.com/blog/index.xml" rel="self" type="application/rss+xml" />
    
    <item>
      <title>Claude Code のカスタムスラッシュコマンドでワークフローを自動化する</title>
      <link>https://blackratel.com/blog/posts/claudecodecommand.ja/</link>
      <pubDate>Tue, 05 May 2026 00:00:00 +0000</pubDate>
      
      <guid>https://blackratel.com/blog/posts/claudecodecommand.ja/</guid>
      <description>&lt;p&gt;このブログの記事作成フローは、以前の記事で紹介したように git commit・git push をトリガーにプレビューや本番反映が自動で流れる仕組みになっている。&lt;/p&gt;&#xA;&lt;p&gt;ただ、毎回 Claude Code を開いて「プレビューして」「本番に反映して」と伝えるのは手間だ。&lt;strong&gt;記事を書くことだけに集中したい。&lt;/strong&gt; そこで Claude Code のカスタムスラッシュコマンドを使って、これらの操作をワンコマンド化した。&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;カスタムスラッシュコマンドとは&#xA;    &lt;div id=&#34;カスタムスラッシュコマンドとは&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;&#xA;    &#xA;    &lt;span&#xA;        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;&#xA;        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#%e3%82%ab%e3%82%b9%e3%82%bf%e3%83%a0%e3%82%b9%e3%83%a9%e3%83%83%e3%82%b7%e3%83%a5%e3%82%b3%e3%83%9e%e3%83%b3%e3%83%89%e3%81%a8%e3%81%af&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Claude Code には、独自のスラッシュコマンドを作れる仕組みがある。所定の場所に Markdown ファイルを置くだけで、そのファイル名がそのままコマンド名になる。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;ファイル名 = コマンド名&lt;/strong&gt; というシンプルなルールだ。&lt;/p&gt;&#xA;&lt;p&gt;たとえば &lt;code&gt;preview.md&lt;/code&gt; というファイルを置けば &lt;code&gt;/preview&lt;/code&gt; というコマンドが使えるようになり、そのファイルの中身がプロンプトとして Claude に渡される。コマンドを入力するだけで、ファイルに書いた指示を Claude が実行してくれる。&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;配置場所とスコープ&#xA;    &lt;div id=&#34;配置場所とスコープ&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;&#xA;    &#xA;    &lt;span&#xA;        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;&#xA;        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#%e9%85%8d%e7%bd%ae%e5%a0%b4%e6%89%80%e3%81%a8%e3%82%b9%e3%82%b3%e3%83%bc%e3%83%97&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;コマンドファイルの置き場所によって有効範囲が変わる。&lt;/p&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;配置場所&lt;/th&gt;&#xA;          &lt;th&gt;スコープ&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;&amp;lt;プロジェクトルート&amp;gt;/.claude/commands/&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;そのプロジェクトのみ&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;~/.claude/commands/&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;全プロジェクトで有効&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;p&gt;プロジェクト固有の操作はプロジェクト側に置く。こうすると他のプロジェクトで Claude を使っても同名のコマンドが干渉しない。git で管理できるので、チームで共有するときもそのまま使える。&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>git commit で Hugo ローカルサーバへの自動デプロイを実現する</title>
      <link>https://blackratel.com/blog/posts/git-hook-ansible-auto-deploy.ja/</link>
      <pubDate>Tue, 05 May 2026 00:00:00 +0000</pubDate>
      
      <guid>https://blackratel.com/blog/posts/git-hook-ansible-auto-deploy.ja/</guid>
      <description>&lt;p&gt;このブログは Hugo で構築している。記事作成時は Ansible でローカルの Hugo を更新してプレビューし、確認後に本番へアップロードするフローで運用している。&lt;/p&gt;&#xA;&lt;p&gt;これまではコミット後に &lt;code&gt;ansible-playbook&lt;/code&gt; コマンドを手動で実行していたが、コミットしたら自動で Hugo が更新されプレビューに集中できる環境を作りたかった。&lt;/p&gt;&#xA;&lt;p&gt;この記事では、&lt;strong&gt;git の post-commit hook と Ansible を組み合わせた自動デプロイの仕組み&lt;/strong&gt;を紹介する。&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;構成の概要&#xA;    &lt;div id=&#34;構成の概要&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;&#xA;    &#xA;    &lt;span&#xA;        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;&#xA;        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#%e6%a7%8b%e6%88%90%e3%81%ae%e6%a6%82%e8%a6%81&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;このブログは以下の構成で運用している。&lt;/p&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;役割&lt;/th&gt;&#xA;          &lt;th&gt;内容&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;記事管理&lt;/td&gt;&#xA;          &lt;td&gt;git リポジトリの &lt;code&gt;files/*.md&lt;/code&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;ローカルデプロイ&lt;/td&gt;&#xA;          &lt;td&gt;Ansible Playbook (&lt;code&gt;ansible_connection=local&lt;/code&gt;)&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;プレビュー&lt;/td&gt;&#xA;          &lt;td&gt;ローカルの Hugo サーバ&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;p&gt;自動化の対象は「コミット → Ansible 実行」の部分だ。&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;なぜ git hook を選んだか&#xA;    &lt;div id=&#34;なぜ-git-hook-を選んだか&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;&#xA;    &#xA;    &lt;span&#xA;        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;&#xA;        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#%e3%81%aa%e3%81%9c-git-hook-%e3%82%92%e9%81%b8%e3%82%93%e3%81%a0%e3%81%8b&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;git hook にした理由は以下の通りだ。&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>git push で本番サーバへの自動同期を実現する</title>
      <link>https://blackratel.com/blog/posts/git-push-production-sync.ja/</link>
      <pubDate>Tue, 05 May 2026 00:00:00 +0000</pubDate>
      
      <guid>https://blackratel.com/blog/posts/git-push-production-sync.ja/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://blackratel.com/blog/posts/git-hook-ansible-auto-deploy.ja/&#34; &gt;前回の記事&lt;/a&gt;では &lt;code&gt;git commit&lt;/code&gt; をトリガーに Ansible でローカルの Hugo を自動更新する仕組みを構築した。今回はその続きで、&lt;strong&gt;&lt;code&gt;git push&lt;/code&gt; のタイミングで本番サーバへの同期も自動化&lt;/strong&gt;した話を紹介する。&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;やりたいこと&#xA;    &lt;div id=&#34;やりたいこと&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;&#xA;    &#xA;    &lt;span&#xA;        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;&#xA;        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#%e3%82%84%e3%82%8a%e3%81%9f%e3%81%84%e3%81%93%e3%81%a8&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;これまでは本番反映を手動で実行していたが、&lt;code&gt;git push&lt;/code&gt; に統合し、push するだけで本番まで反映されるようにしたかった。&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;git に post-push フックはない&#xA;    &lt;div id=&#34;git-に-post-push-フックはない&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;&#xA;    &#xA;    &lt;span&#xA;        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;&#xA;        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#git-%e3%81%ab-post-push-%e3%83%95%e3%83%83%e3%82%af%e3%81%af%e3%81%aa%e3%81%84&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;git には &lt;code&gt;post-commit&lt;/code&gt; のように「push 後」に処理を実行する &lt;code&gt;post-push&lt;/code&gt; フックが存在しない。&lt;/p&gt;&#xA;&lt;p&gt;代わりに &lt;strong&gt;&lt;code&gt;pre-push&lt;/code&gt; フック&lt;/strong&gt;を使う。これは push が実行される直前に呼ばれるフックで、処理が失敗（exit 1）すると push 自体を中止できる。&lt;/p&gt;&#xA;&lt;p&gt;本番同期に失敗したまま GitHub へ push されるのを防げるため、むしろ都合がいい。&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;実装&#xA;    &lt;div id=&#34;実装&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;&#xA;    &#xA;    &lt;span&#xA;        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;&#xA;        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#%e5%ae%9f%e8%a3%85&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;code&gt;.githooks/pre-push&lt;/code&gt; に本番同期の処理を記述し、実行権限を付与してコミットする。&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>Let&#39;s Encrypt / Certbot 運用チートシート</title>
      <link>https://blackratel.com/blog/posts/certbot-cheatsheet.ja/</link>
      <pubDate>Tue, 05 May 2026 00:00:00 +0000</pubDate>
      
      <guid>https://blackratel.com/blog/posts/certbot-cheatsheet.ja/</guid>
      <description>&lt;p&gt;HTTPS 対応サイトを運用していると、「証明書が増えてきた」「更新テストをしたい」「自動更新の設定が合っているか不安」といった場面が定期的にやってくる。&lt;/p&gt;&#xA;&lt;p&gt;この記事では、Certbot の日常運用でよく使う操作を一か所にまとめた。セットアップ手順ではなく、&lt;strong&gt;運用フェーズで実際に使うコマンドと設定&lt;/strong&gt;に絞っている。&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;1. 証明書の確認・削除&#xA;    &lt;div id=&#34;1-証明書の確認削除&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;&#xA;    &#xA;    &lt;span&#xA;        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;&#xA;        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#1-%e8%a8%bc%e6%98%8e%e6%9b%b8%e3%81%ae%e7%a2%ba%e8%aa%8d%e5%89%8a%e9%99%a4&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;まず現状把握から。取得済みの証明書は一覧で確認できる。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight-wrapper&#34;&gt;&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;-webkit-text-size-adjust:none;&#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 certbot certificates&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&lt;p&gt;有効期限・ドメイン・証明書名が表示されるので、不要なものがあれば削除する。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight-wrapper&#34;&gt;&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;-webkit-text-size-adjust:none;&#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;&lt;span style=&#34;color:#75715e&#34;&gt;# 対話形式で選択&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo certbot delete&#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:#75715e&#34;&gt;# 証明書名を直接指定&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo certbot delete --cert-name example.com&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&lt;p&gt;削除すると &lt;code&gt;/etc/letsencrypt/live/&lt;/code&gt;・&lt;code&gt;archive/&lt;/code&gt;・&lt;code&gt;renewal/&lt;/code&gt; 配下のファイルが一括で消え、自動更新の対象からも外れる。&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;2. dry-run で事前テスト&#xA;    &lt;div id=&#34;2-dry-run-で事前テスト&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;&#xA;    &#xA;    &lt;span&#xA;        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;&#xA;        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#2-dry-run-%e3%81%a7%e4%ba%8b%e5%89%8d%e3%83%86%e3%82%b9%e3%83%88&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;証明書の取得・更新に失敗し続けると Let&amp;rsquo;s Encrypt のレート制限に引っかかる。本番実行の前に &lt;strong&gt;dry-run&lt;/strong&gt; でテストしておくのが鉄則だ。&lt;/p&gt;&#xA;&lt;p&gt;dry-run ではステージング環境が使われるため、レート制限の心配なく何度でも試せる。&lt;/p&gt;&#xA;&#xA;&lt;h3 class=&#34;relative group&#34;&gt;新規取得のテスト&#xA;    &lt;div id=&#34;新規取得のテスト&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;&#xA;    &#xA;    &lt;span&#xA;        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;&#xA;        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#%e6%96%b0%e8%a6%8f%e5%8f%96%e5%be%97%e3%81%ae%e3%83%86%e3%82%b9%e3%83%88&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight-wrapper&#34;&gt;&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;-webkit-text-size-adjust:none;&#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 certbot certonly --dry-run --webroot &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;  -w /var/www/acme-challenge &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;  -d example.com&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&#xA;&lt;h3 class=&#34;relative group&#34;&gt;既存証明書の更新テスト（推奨）&#xA;    &lt;div id=&#34;既存証明書の更新テスト推奨&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;&#xA;    &#xA;    &lt;span&#xA;        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;&#xA;        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#%e6%97%a2%e5%ad%98%e8%a8%bc%e6%98%8e%e6%9b%b8%e3%81%ae%e6%9b%b4%e6%96%b0%e3%83%86%e3%82%b9%e3%83%88%e6%8e%a8%e5%a5%a8&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;既存の &lt;code&gt;.conf&lt;/code&gt; 設定（&lt;code&gt;authenticator = webroot&lt;/code&gt; など）を読み込んで実行される。&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>apt update の警告: PPA への接続タイムアウトが出たときの対処法</title>
      <link>https://blackratel.com/blog/posts/aptupdatewarn.ja/</link>
      <pubDate>Mon, 04 May 2026 00:00:00 +0000</pubDate>
      
      <guid>https://blackratel.com/blog/posts/aptupdatewarn.ja/</guid>
      <description>&lt;p&gt;&lt;code&gt;sudo apt update&lt;/code&gt; を実行すると、次のような警告が表示されることがあります。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight-wrapper&#34;&gt;&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;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;W: Failed to fetch https://ppa.launchpadcontent.net/gns3/ppa/ubuntu/dists/...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   connection timed out&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;警告の原因&#xA;    &lt;div id=&#34;警告の原因&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;&#xA;    &#xA;    &lt;span&#xA;        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;&#xA;        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#%e8%ad%a6%e5%91%8a%e3%81%ae%e5%8e%9f%e5%9b%a0&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;追加済みの PPA（Personal Package Archive）リポジトリへの接続がタイムアウトしたことを示しています。&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;W:&lt;/code&gt; プレフィックスは &lt;strong&gt;Warning（警告）&lt;/strong&gt; であり、エラー（&lt;code&gt;E:&lt;/code&gt;）ではありません。パッケージのインストールや更新など、通常の &lt;code&gt;apt&lt;/code&gt; 操作への影響は軽微です。ただし、&lt;code&gt;apt update&lt;/code&gt; のたびに表示されるため、放置すると煩わしくなります。&lt;/p&gt;&#xA;&lt;p&gt;タイムアウトが発生する主な原因は次の2つです。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Launchpad サーバー側の一時的な障害・メンテナンス&lt;/li&gt;&#xA;&lt;li&gt;PPA を追加したままにしており、サーバーへの疎通が取れなくなっている&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;対処法&#xA;    &lt;div id=&#34;対処法&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;&#xA;    &#xA;    &lt;span&#xA;        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;&#xA;        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#%e5%af%be%e5%87%a6%e6%b3%95&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&#xA;&lt;h3 class=&#34;relative group&#34;&gt;一時的な問題の場合&#xA;    &lt;div id=&#34;一時的な問題の場合&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;&#xA;    &#xA;    &lt;span&#xA;        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;&#xA;        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#%e4%b8%80%e6%99%82%e7%9a%84%e3%81%aa%e5%95%8f%e9%a1%8c%e3%81%ae%e5%a0%b4%e5%90%88&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;時間をおいてから再度 &lt;code&gt;sudo apt update&lt;/code&gt; を実行してください。サーバー側の問題であれば自然に解消されます。&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>KVM/virsh で Ubuntu 26.04 を自動セットアップ — autoinstall &#43; seed ISO</title>
      <link>https://blackratel.com/blog/posts/kvm-ubuntu2604-autoinstall-virsh.ja/</link>
      <pubDate>Mon, 04 May 2026 00:00:00 +0000</pubDate>
      
      <guid>https://blackratel.com/blog/posts/kvm-ubuntu2604-autoinstall-virsh.ja/</guid>
      <description>&lt;h2 class=&#34;relative group&#34;&gt;はじめに&#xA;    &lt;div id=&#34;はじめに&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;&#xA;    &#xA;    &lt;span&#xA;        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;&#xA;        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#%e3%81%af%e3%81%98%e3%82%81%e3%81%ab&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;KVM 環境で Ubuntu 26.04 の VM を何度も作成する機会があり、毎回インストーラーを手動操作するのが手間だったため、&lt;strong&gt;完全ノータッチで VM を立ち上げる構成&lt;/strong&gt;を整えた。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;autoinstall&lt;/strong&gt; は Ubuntu のインストーラー（Subiquity）が提供する機能で、設定ファイルを &lt;strong&gt;seed ISO&lt;/strong&gt; として渡すだけで、対話操作なしにインストールが自動で完了する。&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;autoinstall の仕組み&#xA;    &lt;div id=&#34;autoinstall-の仕組み&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;&#xA;    &#xA;    &lt;span&#xA;        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;&#xA;        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#autoinstall-%e3%81%ae%e4%bb%95%e7%b5%84%e3%81%bf&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Ubuntu 20.04 以降のサーバーインストーラー（Subiquity）は &lt;strong&gt;autoinstall&lt;/strong&gt; という設定ファイル形式をサポートしている。&lt;code&gt;#cloud-config&lt;/code&gt; ヘッダーを持つ YAML ファイルに、ロケール・ネットワーク・ストレージ・ユーザーなどを記述しておくと、インストーラーが対話なしに処理を進める。&lt;/p&gt;&#xA;&lt;p&gt;この設定ファイル（&lt;code&gt;user-data&lt;/code&gt;）をインストーラーに渡す方法はいくつかあるが、今回は &lt;strong&gt;NoCloud データソース&lt;/strong&gt;を使った &lt;strong&gt;seed ISO&lt;/strong&gt; 方式を採用した。&lt;/p&gt;&#xA;&lt;p&gt;seed ISO の中身は &lt;code&gt;user-data&lt;/code&gt; と &lt;code&gt;meta-data&lt;/code&gt; の 2 ファイルだけで、ボリュームラベルを &lt;code&gt;cidata&lt;/code&gt; にするルールがある。&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>Qwen Code — Squidプロキシで見えた「隠れたアクセス」</title>
      <link>https://blackratel.com/blog/posts/qwen-code-sakura-squid-telemetry.ja/</link>
      <pubDate>Mon, 04 May 2026 00:00:00 +0000</pubDate>
      
      <guid>https://blackratel.com/blog/posts/qwen-code-sakura-squid-telemetry.ja/</guid>
      <description>&lt;h2 class=&#34;relative group&#34;&gt;はじめに&#xA;    &lt;div id=&#34;はじめに&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;&#xA;    &#xA;    &lt;span&#xA;        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;&#xA;        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#%e3%81%af%e3%81%98%e3%82%81%e3%81%ab&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Alibaba が開発した AI コーディングエージェント &lt;strong&gt;Qwen Code&lt;/strong&gt; は、OpenAI 互換 API を持つ任意のエンドポイントを向け先として指定できる。今回は &lt;strong&gt;さくらのAI Engine&lt;/strong&gt;（&lt;code&gt;api.ai.sakura.ad.jp&lt;/code&gt;）を API バックエンドとして設定し、KVM 上の Ubuntu 26.04 VM で動作させた。&lt;/p&gt;&#xA;&lt;p&gt;通信制御に &lt;strong&gt;Squid 明示プロキシ（FQDN ホワイトリスト方式）&lt;/strong&gt; を導入した。プロキシのアクセスログを確認したところ、さくらの API 以外にも &lt;strong&gt;Alibaba Cloud の外部サービスへのアクセスが発生している&lt;/strong&gt;ことが判明した。&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;環境構成&#xA;    &lt;div id=&#34;環境構成&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;&#xA;    &#xA;    &lt;span&#xA;        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;&#xA;        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#%e7%92%b0%e5%a2%83%e6%a7%8b%e6%88%90&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&#xA;&lt;h3 class=&#34;relative group&#34;&gt;iptables（ファイアウォール）&#xA;    &lt;div id=&#34;iptablesファイアウォール&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;&#xA;    &#xA;    &lt;span&#xA;        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;&#xA;        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#iptables%e3%83%95%e3%82%a1%e3%82%a4%e3%82%a2%e3%82%a6%e3%82%a9%e3%83%bc%e3%83%ab&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;外向き通信は &lt;strong&gt;デフォルト DROP&lt;/strong&gt; とし、Squid 実行ユーザのプロセスのみ 443/80 への通信を許可する構成にした。&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>暇つぶしゲーム置いてみた</title>
      <link>https://blackratel.com/blog/posts/game-introduction.ja/</link>
      <pubDate>Mon, 04 May 2026 00:00:00 +0000</pubDate>
      
      <guid>https://blackratel.com/blog/posts/game-introduction.ja/</guid>
      <description>&lt;h2 class=&#34;relative group&#34;&gt;暇つぶしゲーム&#xA;    &lt;div id=&#34;暇つぶしゲーム&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;&#xA;    &#xA;    &lt;span&#xA;        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;&#xA;        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#%e6%9a%87%e3%81%a4%e3%81%b6%e3%81%97%e3%82%b2%e3%83%bc%e3%83%a0&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;このサイトに暇つぶし用のゲームページを置いた。&lt;/p&gt;&#xA;&lt;p&gt;2048 やブロック崩しなど、ちょっとした隙間時間に遊べるゲームを集めている。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://blackratel.com/game.html&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;暇つぶしゲームはこちら&lt;/a&gt;&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>メールサーバー(Postfix / Dovecot / Roundcube)</title>
      <link>https://blackratel.com/blog/posts/mailserverdesign.ja/</link>
      <pubDate>Sun, 03 May 2026 00:00:00 +0000</pubDate>
      
      <guid>https://blackratel.com/blog/posts/mailserverdesign.ja/</guid>
      <description>&lt;blockquote&gt;&lt;p&gt;Ubuntu 24.04 / Postfix / Dovecot / Roundcube / SpamAssassin による受信専用メールサーバー&lt;/p&gt;&#xA;&lt;/blockquote&gt;&lt;hr&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;1. 要件&#xA;    &lt;div id=&#34;1-要件&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;&#xA;    &#xA;    &lt;span&#xA;        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;&#xA;        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#1-%e8%a6%81%e4%bb%b6&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&#xA;&lt;h3 class=&#34;relative group&#34;&gt;機能要件&#xA;    &lt;div id=&#34;機能要件&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;&#xA;    &#xA;    &lt;span&#xA;        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;&#xA;        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#%e6%a9%9f%e8%83%bd%e8%a6%81%e4%bb%b6&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h3&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;項目&lt;/th&gt;&#xA;          &lt;th&gt;内容&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;メールドメイン&lt;/td&gt;&#xA;          &lt;td&gt;blackratel.com&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;受信&lt;/td&gt;&#xA;          &lt;td&gt;外部メールサーバーから SMTP port 25 で受信&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;メール閲覧&lt;/td&gt;&#xA;          &lt;td&gt;IMAP port 143（localhost のみ）/ Roundcube WebUI&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;スパムフィルタ&lt;/td&gt;&#xA;          &lt;td&gt;SpamAssassin（content_filter 方式）&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;送信&lt;/td&gt;&#xA;          &lt;td&gt;&lt;strong&gt;対象外&lt;/strong&gt;（受信専用）&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;認証&lt;/td&gt;&#xA;          &lt;td&gt;Dovecot 認証（IMAP・Roundcube ログイン）&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;メールボックス形式&lt;/td&gt;&#xA;          &lt;td&gt;Maildir&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;ユーザー管理&lt;/td&gt;&#xA;          &lt;td&gt;バーチャルユーザー（OS ユーザーと分離）&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&#xA;&lt;h3 class=&#34;relative group&#34;&gt;非機能要件&#xA;    &lt;div id=&#34;非機能要件&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;&#xA;    &#xA;    &lt;span&#xA;        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;&#xA;        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#%e9%9d%9e%e6%a9%9f%e8%83%bd%e8%a6%81%e4%bb%b6&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h3&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;項目&lt;/th&gt;&#xA;          &lt;th&gt;内容&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;OS&lt;/td&gt;&#xA;          &lt;td&gt;Ubuntu 24.04 LTS&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;TLS 証明書&lt;/td&gt;&#xA;          &lt;td&gt;Postfix（port 25 STARTTLS）と Apache（HTTPS）のみ使用。Dovecot は localhost のみのため SSL 不要&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;パスワード保存&lt;/td&gt;&#xA;          &lt;td&gt;ARGON2ID ハッシュ&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;ホスティング&lt;/td&gt;&#xA;          &lt;td&gt;OCI Free Tier（アウトバウンド port 25 はブロックのため送信不可）&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&#xA;&lt;h3 class=&#34;relative group&#34;&gt;スコープ外&#xA;    &lt;div id=&#34;スコープ外&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;&#xA;    &#xA;    &lt;span&#xA;        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;&#xA;        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#%e3%82%b9%e3%82%b3%e3%83%bc%e3%83%97%e5%a4%96&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;メール送信（OCI Free Tier のためアウトバウンド port 25 が利用不可）&lt;/li&gt;&#xA;&lt;li&gt;SPF / DKIM / DMARC 設定（送信しないため不要）&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;hr&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;2. 環境・構成情報&#xA;    &lt;div id=&#34;2-環境構成情報&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;&#xA;    &#xA;    &lt;span&#xA;        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;&#xA;        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#2-%e7%92%b0%e5%a2%83%e6%a7%8b%e6%88%90%e6%83%85%e5%a0%b1&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&#xA;&lt;h3 class=&#34;relative group&#34;&gt;ミドルウェア&#xA;    &lt;div id=&#34;ミドルウェア&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;&#xA;    &#xA;    &lt;span&#xA;        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;&#xA;        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#%e3%83%9f%e3%83%89%e3%83%ab%e3%82%a6%e3%82%a7%e3%82%a2&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h3&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;ソフトウェア&lt;/th&gt;&#xA;          &lt;th&gt;役割&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Postfix&lt;/td&gt;&#xA;          &lt;td&gt;MTA（外部からの受信）&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Dovecot&lt;/td&gt;&#xA;          &lt;td&gt;MDA + MRA（メール保存・IMAP 提供）&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;SpamAssassin&lt;/td&gt;&#xA;          &lt;td&gt;スパムフィルタ（content_filter 方式）&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Roundcube&lt;/td&gt;&#xA;          &lt;td&gt;WebUI（ブラウザでのメール閲覧）&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Apache2&lt;/td&gt;&#xA;          &lt;td&gt;Roundcube のリバースプロキシ&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&#xA;&lt;h3 class=&#34;relative group&#34;&gt;ポート構成&#xA;    &lt;div id=&#34;ポート構成&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;&#xA;    &#xA;    &lt;span&#xA;        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;&#xA;        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#%e3%83%9d%e3%83%bc%e3%83%88%e6%a7%8b%e6%88%90&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h3&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;ポート&lt;/th&gt;&#xA;          &lt;th&gt;プロトコル&lt;/th&gt;&#xA;          &lt;th&gt;用途&lt;/th&gt;&#xA;          &lt;th&gt;接続元&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;25&lt;/td&gt;&#xA;          &lt;td&gt;SMTP&lt;/td&gt;&#xA;          &lt;td&gt;外部メールサーバーからの受信&lt;/td&gt;&#xA;          &lt;td&gt;外部（OCI Security List + UFW で開放）&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;143&lt;/td&gt;&#xA;          &lt;td&gt;IMAP&lt;/td&gt;&#xA;          &lt;td&gt;Roundcube → Dovecot（メール取得）&lt;/td&gt;&#xA;          &lt;td&gt;localhost のみ&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;443&lt;/td&gt;&#xA;          &lt;td&gt;HTTPS&lt;/td&gt;&#xA;          &lt;td&gt;Roundcube WebUI&lt;/td&gt;&#xA;          &lt;td&gt;外部&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;blockquote&gt;&lt;p&gt;port 110 / 465 / 587 / 993 / 995 は無効化。&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>メールサーバー構築 トラブルシューティング記録</title>
      <link>https://blackratel.com/blog/posts/troubleshooting.ja/</link>
      <pubDate>Sun, 03 May 2026 00:00:00 +0000</pubDate>
      
      <guid>https://blackratel.com/blog/posts/troubleshooting.ja/</guid>
      <description>&lt;blockquote&gt;&lt;p&gt;メールサーバー構築（Postfix / Dovecot / Roundcube / SpamAssassin）で発生したトラブルと解決策&lt;/p&gt;&#xA;&lt;/blockquote&gt;&lt;hr&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;1. Roundcube: Internal Error（INBOX が存在しない）&#xA;    &lt;div id=&#34;1-roundcube-internal-errorinbox-が存在しない&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;&#xA;    &#xA;    &lt;span&#xA;        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;&#xA;        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#1-roundcube-internal-errorinbox-%e3%81%8c%e5%ad%98%e5%9c%a8%e3%81%97%e3%81%aa%e3%81%84&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;strong&gt;症状&lt;/strong&gt;&lt;br&gt;&#xA;ログインは成功するが画面に &amp;ldquo;Internal Error&amp;rdquo; が表示される。ブラウザの開発者ツールで確認したレスポンス：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight-wrapper&#34;&gt;&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;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;exec&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;this.display_message(\&amp;#34;サーバーエラー: STATUS: Internal error occurred.\&amp;#34;, \&amp;#34;error\&amp;#34;, 0);&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&lt;p&gt;&lt;strong&gt;原因&lt;/strong&gt;&lt;br&gt;&#xA;IMAP の &lt;code&gt;STATUS&lt;/code&gt; コマンドが失敗。メール未受信のため Maildir の INBOX ディレクトリが存在しなかった。エラーログには何も出力されないため原因特定にブラウザの開発者ツールが必要だった。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;解決策&lt;/strong&gt;&lt;br&gt;&#xA;Dovecot に INBOX 自動作成設定を追加した。初回ログイン時に INBOX ディレクトリが自動生成される。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight-wrapper&#34;&gt;&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;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;# dovecot 10-mail.conf&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;namespace inbox {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  inbox = yes&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  mailbox INBOX {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    auto = subscribe&#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&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&lt;hr&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;2. Postfix: 外部送信タイムアウト（OCI Free Tier）&#xA;    &lt;div id=&#34;2-postfix-外部送信タイムアウトoci-free-tier&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;&#xA;    &#xA;    &lt;span&#xA;        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;&#xA;        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#2-postfix-%e5%a4%96%e9%83%a8%e9%80%81%e4%bf%a1%e3%82%bf%e3%82%a4%e3%83%a0%e3%82%a2%e3%82%a6%e3%83%88oci-free-tier&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;strong&gt;症状&lt;/strong&gt;&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>スロット×ブロック崩しアプリを作りました</title>
      <link>https://blackratel.com/blog/posts/blockbreaker.ja/</link>
      <pubDate>Wed, 29 Apr 2026 00:00:00 +0000</pubDate>
      
      <guid>https://blackratel.com/blog/posts/blockbreaker.ja/</guid>
      <description>&lt;p&gt;スロット要素を組み合わせたブロック崩しゲーム(slot brick breaker)を作りました。&#xA;リラックスモードだと、アイテムがたくさん落ちるので爽快でサクサク遊べます。&#xA;物足りない人は、ハードモードを挑戦してください。&lt;/p&gt;&#xA;&lt;p&gt;ブロックを崩しながら、アイテムやスロットでパワーアップしよう——シンプルだけど何度でも遊びたくなる一本です。&lt;/p&gt;&#xA;&lt;lite-youtube videoid=&#34;MAzXZB0iGgw&#34; playlabel=&#34;MAzXZB0iGgw&#34; params=&#34;&#34;&gt;&lt;/lite-youtube&gt;&#xA;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;遊び方&#xA;    &lt;div id=&#34;遊び方&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;&#xA;    &#xA;    &lt;span&#xA;        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;&#xA;        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#%e9%81%8a%e3%81%b3%e6%96%b9&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;画面下のパドルを左右に動かしてボールを跳ね返す&lt;/li&gt;&#xA;&lt;li&gt;すべてのブロックを崩せばステージクリア&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;特徴&#xA;    &lt;div id=&#34;特徴&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;&#xA;    &#xA;    &lt;span&#xA;        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;&#xA;        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#%e7%89%b9%e5%be%b4&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;strong&gt;スロットでパワーアップ&lt;/strong&gt;&#xA;ボールが通過するとスロットを回せます。マルチボール・貫通弾・巨大ボールなど、運次第で強力な効果が手に入ります。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;シンプルな操作&lt;/strong&gt;&#xA;パドルをスライドするだけ。直感的に遊べます。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://play.google.com/store/apps/details?id=com.blackratel.apps.blockbreaker&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;Google Play からダウンロード&lt;/a&gt;&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>宝石ソートパズルアプリを作りました</title>
      <link>https://blackratel.com/blog/posts/gemsortpuzzle.ja/</link>
      <pubDate>Mon, 27 Apr 2026 00:00:00 +0000</pubDate>
      
      <guid>https://blackratel.com/blog/posts/gemsortpuzzle.ja/</guid>
      <description>&lt;p&gt;宝石のソートパズルゲーム(gem sort puzzle)を作りました。よかったら遊んでみてください。&lt;/p&gt;&#xA;&lt;p&gt;バラバラになった宝石を、同じ色ごとに水晶ボックスへ——じっくり考えながら解いていくパズルです。&lt;/p&gt;&#xA;&lt;div style=&#34;display:flex; gap:8px; margin:1em 0;&#34;&gt;&#xA;&lt;img src=&#34;https://blackratel.com/blog/images/gemsortpuzzle_01.png&#34; style=&#34;flex:1; width:0; height:auto; object-fit:cover;&#34; loading=&#34;lazy&#34;&gt;&#xA;&lt;img src=&#34;https://blackratel.com/blog/images/gemsortpuzzle_02.png&#34; style=&#34;flex:1; width:0; height:auto; object-fit:cover;&#34; loading=&#34;lazy&#34;&gt;&#xA;&#xA;&lt;/div&gt;&#xA;&#xA;&lt;p&gt;ステージとステージの間に広告が入らないので、集中して遊び続けられます。&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;遊び方&#xA;    &lt;div id=&#34;遊び方&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;&#xA;    &#xA;    &lt;span&#xA;        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;&#xA;        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#%e9%81%8a%e3%81%b3%e6%96%b9&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;水晶ボックスをタップして一番上の宝石を選び、移動先の試験管をタップ&lt;/li&gt;&#xA;&lt;li&gt;同じ色の上か、空の水晶ボックスにしか置けない&lt;/li&gt;&#xA;&lt;li&gt;すべての水晶ボックスを同じ色にすればステージクリア！&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;特徴&#xA;    &lt;div id=&#34;特徴&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;&#xA;    &#xA;    &lt;span&#xA;        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;&#xA;        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#%e7%89%b9%e5%be%b4&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;strong&gt;シンプルな操作&lt;/strong&gt;&#xA;タップで動かすだけ。すぐに始められます。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;自然に上がる難易度&lt;/strong&gt;&#xA;ステージが進むにつれて水晶ボックスの数や宝石の格納数が増えていきます。急に難しくなるのではなく、じわじわと難しくなります。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;カスタマイズ&lt;/strong&gt;&#xA;クリア時のエフェクトを変更できます。遊びながらポイントを貯めて、自分好みに整えてください。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://play.google.com/store/apps/details?id=com.blackratel.apps.gemsortpuzzle&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;Google Play からダウンロード&lt;/a&gt;&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>このブログを Hugo で構築した理由</title>
      <link>https://blackratel.com/blog/posts/why-hugo.ja/</link>
      <pubDate>Sun, 26 Apr 2026 00:00:00 +0000</pubDate>
      
      <guid>https://blackratel.com/blog/posts/why-hugo.ja/</guid>
      <description>&lt;h2 class=&#34;relative group&#34;&gt;はじめに&#xA;    &lt;div id=&#34;はじめに&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;&#xA;    &#xA;    &lt;span&#xA;        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;&#xA;        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#%e3%81%af%e3%81%98%e3%82%81%e3%81%ab&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;ブログを始めるにあたって、まず悩んだのがプラットフォームの選定だ。&lt;br&gt;&#xA;WordPress をはじめとする CMS は機能が豊富な反面、DB・PHP・プラグイン管理など&#xA;運用コストが高い。今回は「&lt;strong&gt;書くことに集中できる、軽量で安全な構成&lt;/strong&gt;」を目指した。&lt;/p&gt;&#xA;&lt;p&gt;その結果として選んだのが &lt;strong&gt;Hugo&lt;/strong&gt; だ。&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;なぜ Hugo を選んだのか&#xA;    &lt;div id=&#34;なぜ-hugo-を選んだのか&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;&#xA;    &#xA;    &lt;span&#xA;        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;&#xA;        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#%e3%81%aa%e3%81%9c-hugo-%e3%82%92%e9%81%b8%e3%82%93%e3%81%a0%e3%81%ae%e3%81%8b&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&#xA;&lt;h3 class=&#34;relative group&#34;&gt;1. セキュリティ&#xA;    &lt;div id=&#34;1-セキュリティ&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;&#xA;    &#xA;    &lt;span&#xA;        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;&#xA;        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#1-%e3%82%bb%e3%82%ad%e3%83%a5%e3%83%aa%e3%83%86%e3%82%a3&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h3&gt;&#xA;&lt;p&gt;Hugo は静的サイトジェネレーター（SSG）であり、ビルド時にすべてのページを&#xA;HTML ファイルとして生成する。つまり：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;SQL インジェクション不可&lt;/li&gt;&#xA;&lt;li&gt;php等の言語の脆弱性と無縁&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;さらに Hugo は &lt;strong&gt;単一の Go バイナリ&lt;/strong&gt;として配布されており、&#xA;npm のようなサプライチェーンリスクもない。&#xA;依存パッケージがゼロというのは、セキュリティ観点では大きな強みだ。&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>宝石占いアプリを作りました</title>
      <link>https://blackratel.com/blog/posts/oraclecard01.ja/</link>
      <pubDate>Sun, 26 Apr 2026 00:00:00 +0000</pubDate>
      
      <guid>https://blackratel.com/blog/posts/oraclecard01.ja/</guid>
      <description>&lt;p&gt;宝石カードを使った占いアプリを作りました。よかったら使ってみてください。&lt;/p&gt;&#xA;&lt;div style=&#34;display:flex; gap:8px; margin:1em 0;&#34;&gt;&#xA;&lt;img src=&#34;https://blackratel.com/blog/images/oraclecard01_01.webp&#34; style=&#34;flex:1; width:0; height:auto; object-fit:cover;&#34; loading=&#34;lazy&#34;&gt;&#xA;&lt;img src=&#34;https://blackratel.com/blog/images/oraclecard01_02.webp&#34; style=&#34;flex:1; width:0; height:auto; object-fit:cover;&#34; loading=&#34;lazy&#34;&gt;&#xA;&lt;img src=&#34;https://blackratel.com/blog/images/oraclecard01_03.webp&#34; style=&#34;flex:1; width:0; height:auto; object-fit:cover;&#34; loading=&#34;lazy&#34;&gt;&#xA;&#xA;&lt;/div&gt;&#xA;&#xA;&lt;p&gt;朝のちょっとした時間に、大切な決断の前に、恋のことで迷った時に——そんな場面で、そっと背中を押してくれるアプリを目指しました。&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;できること&#xA;    &lt;div id=&#34;できること&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;&#xA;    &#xA;    &lt;span&#xA;        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;&#xA;        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#%e3%81%a7%e3%81%8d%e3%82%8b%e3%81%93%e3%81%a8&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;3種類の占いが使えます。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;朝の1分占い&lt;/strong&gt;&#xA;朝、今日の指針をカードに聞いてみる。それだけでなんとなく気持ちが整う気がします。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;恋愛診断&lt;/strong&gt;&#xA;恋のことで迷った時に。答えを出すというより、自分の気持ちを整理するヒントになればと思っています。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;3枚カードリーディング&lt;/strong&gt;&#xA;過去・現在・未来の流れを3枚のカードで読みます。少し込み入ったことを考えたい時に。&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;カードの選び方&#xA;    &lt;div id=&#34;カードの選び方&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;&#xA;    &#xA;    &lt;span&#xA;        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;&#xA;        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#%e3%82%ab%e3%83%bc%e3%83%89%e3%81%ae%e9%81%b8%e3%81%b3%e6%96%b9&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;指で画面上に円を描くようになぞると、自然と1枚が選ばれます。論理的に選ぶのではなく、その瞬間の直感に任せる仕組みです。&lt;/p&gt;&#xA;&lt;p&gt;34種類の宝石カードがあり、それぞれに固有のメッセージがあります。&lt;/p&gt;&#xA;&lt;p&gt;シンプルに使えることを意識して作ったので、完全無料・課金なしです。&lt;/p&gt;&#xA;&lt;p&gt;気が向いたら使ってみてください。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://play.google.com/store/apps/details?id=com.blackratel.apps.oraclecard01&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;Google Play からダウンロード&lt;/a&gt;&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>麻雀点数計算アプリを作りました</title>
      <link>https://blackratel.com/blog/posts/mahjongcalc.ja/</link>
      <pubDate>Sun, 26 Apr 2026 00:00:00 +0000</pubDate>
      
      <guid>https://blackratel.com/blog/posts/mahjongcalc.ja/</guid>
      <description>&lt;p&gt;麻雀の点数計算アプリを作りました。よかったら使ってみてください。&lt;/p&gt;&#xA;&lt;p&gt;「この手、何点？」——対局中にそんな疑問が浮かんだ時、すぐに答えが出るアプリがほしくて作りました。役・点数を表示してくれるのはもちろん、&lt;strong&gt;ずんだもんが音声で読み上げてくれる&lt;/strong&gt;のが一番の特徴です。&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;使い方&#xA;    &lt;div id=&#34;使い方&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;&#xA;    &#xA;    &lt;span&#xA;        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;&#xA;        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#%e4%bd%bf%e3%81%84%e6%96%b9&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;鳴きがある場合はまず、暗カン・明カン・ポン・チーの数を入力します。続いて牌画像をタップして手牌を入力。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://blackratel.com/blog/images/mahjongcalc_01.webp&#34; alt=&#34;入力画面１&#34; loading=&#34;lazy&#34;&gt;&#xA;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;親・子、自風・場風、リーチ・一発の有無を選択します。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://blackratel.com/blog/images/mahjongcalc_02.webp&#34; alt=&#34;入力画面２&#34; loading=&#34;lazy&#34;&gt;&#xA;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;ツモ・海底などのあがり方と、ドラ（ドラ・裏ドラ・赤ドラすべての合計）の枚数を設定。最後にあがり牌を選択します。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://blackratel.com/blog/images/mahjongcalc_03.webp&#34; alt=&#34;計算結果画面&#34; loading=&#34;lazy&#34;&gt;&#xA;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;すると、成立した役と点数が一覧で表示されます。そして——&lt;strong&gt;ずんだもんが役名と得点を読み上げてくれます&lt;/strong&gt;。対局中、画面を見ずに耳で確認できるのは地味に便利です。&lt;/p&gt;&#xA;&lt;p&gt;符計算の詳細内訳（底符・面子符・雀頭符・待ち符など）も表示できるので、「なぜこの点数になるのか」を確認しながら覚えることもできます。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://blackratel.com/blog/images/mahjongcalc_04.webp&#34; alt=&#34;符計算詳細&#34; loading=&#34;lazy&#34;&gt;&#xA;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;音声はON/OFFを切り替えられます。喰いタンのあり・なし設定にも対応しています。&lt;/p&gt;&#xA;&lt;p&gt;無料で使えます。気が向いたらぜひ。&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://play.google.com/store/apps/details?id=com.blackratel.apps.mahjongcalc&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;Google Play からダウンロード&lt;/a&gt;&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;p&gt;&lt;em&gt;音声合成: VOICEVOX:ずんだもん&lt;/em&gt;&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>ホーム</title>
      <link>https://blackratel.com/blog/_index.ja/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>https://blackratel.com/blog/_index.ja/</guid>
      <description></description>
      
    </item>
    
  </channel>
</rss>
