<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>髭、はえ初めし頃。</title>
    <link>https://d3.haro.jp/</link>
    <description>Recent content on 髭、はえ初めし頃。</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>ja-jp</language>
    <lastBuildDate>Sun, 15 Feb 2026 13:02:19 +0900</lastBuildDate><atom:link href="https://d3.haro.jp/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>HX99G が Bazzite で快適になったよ</title>
      <link>https://d3.haro.jp/docs/2026/bazzite_on_hx99g/</link>
      <pubDate>Sun, 15 Feb 2026 13:02:19 +0900</pubDate>
      
      <guid>https://d3.haro.jp/docs/2026/bazzite_on_hx99g/</guid>
      <description><![CDATA[ <h1 id="hx99g-が-bazzite-で快適になったよ">
  HX99G が Bazzite で快適になったよ
  <a class="anchor" href="#hx99g-%e3%81%8c-bazzite-%e3%81%a7%e5%bf%ab%e9%81%a9%e3%81%ab%e3%81%aa%e3%81%a3%e3%81%9f%e3%82%88">#</a>
</h1>
<p>快適になったので、将来の自分のために書き残すよ。<br>
やったことメモしておいて、Claude に渡したら全部整理してくれたよ。楽ちん</p>
<h2 id="環境">
  環境
  <a class="anchor" href="#%e7%92%b0%e5%a2%83">#</a>
</h2>
<table>
  <thead>
      <tr>
          <th>項目</th>
          <th>内容</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>マシン</td>
          <td>MINISFORUM HX99G</td>
      </tr>
      <tr>
          <td>CPU/APU</td>
          <td>AMD Ryzen 9 6900HX</td>
      </tr>
      <tr>
          <td>GPU</td>
          <td>AMD Radeon RX 6600M</td>
      </tr>
      <tr>
          <td>Wi-Fi</td>
          <td>MediaTek RZ616（MT7922）</td>
      </tr>
      <tr>
          <td>有線LAN</td>
          <td>Intel Ethernet Controller I226-V</td>
      </tr>
      <tr>
          <td>OS</td>
          <td><a href="https://bazzite.gg/" target="_blank" rel="noopener">Bazzite</a>
（KDE Plasma）</td>
      </tr>
  </tbody>
</table>
<h2 id="概要">
  概要
  <a class="anchor" href="#%e6%a6%82%e8%a6%81">#</a>
</h2>
<ul>
<li>Bazzite で Steam 専用機にするよ
<ul>
<li>Linux デスクトップ機 (Fedora) としても使えるけど、用途は基本 Steam のホスト</li>
<li>Steam Link のかわりに、Sunshine + Moonlight 使うよ</li>
<li>Bazzite は「バザイト」らしいよ</li>
</ul>
</li>
<li>ネットワークとかグラフィック周りとか、何も設定しなくても大丈夫だったよ
<ul>
<li>画面周りの転送が追いついてない感じの現象がなくなった</li>
<li>Wake On LAN も問題なし</li>
</ul>
</li>
</ul>
<h2 id="経緯">
  経緯
  <a class="anchor" href="#%e7%b5%8c%e7%b7%af">#</a>
</h2>
<ul>
<li>Steam Link のホストとして快適に利用している HX99G、いつの頃からかネットワーク周りが調子悪い</li>
<li>AMD のドライバーがどうもアレで、ドラクエ 7 リイマジンドするのに障りがある（タイムアウト連発）</li>
<li>いっそのこと専用機にしてしまえってことで、Bazzite 導入。想像していたより快適なので、当分このままで</li>
<li>Windows 実験環境がなくなるけど、ANBERNIC WIN600 あるからいいや</li>
</ul>
<h2 id="導入">
  導入
  <a class="anchor" href="#%e5%b0%8e%e5%85%a5">#</a>
</h2>
<p>外付 HDD や 外付 SSD に導入する時はそれぞれトラブルあったけど、内蔵 SSD に導入する分には、トラブルなし。ISO は <code>Desktop</code> / <code>AMD(RX 4xx+ | AI)</code>/ <code>KDE</code>を選択。Steam Gaming Mode は <code>YES</code>で導入したけど、オフにすることに（後述）。</p>
<h2 id="bios">
  BIOS
  <a class="anchor" href="#bios">#</a>
</h2>
<p>Wake On LAN のため、BIOS で <code>Advanced &gt; PCIE Devices &gt; Wake On LAN: Enable</code>らしい。</p>
<p>「らしい」 ってのは、Win11 の時にすでに設定済みだったので、今回いじってないです。</p>
<h2 id="基本設定">
  基本設定
  <a class="anchor" href="#%e5%9f%ba%e6%9c%ac%e8%a8%ad%e5%ae%9a">#</a>
</h2>
<ol>
<li>
<p><code>システム設定 &gt; ディスプレイとモニター</code></p>
<ul>
<li>解像度: <code>1920 x 1080</code>
<ul>
<li>リモート端末が <code>1920x1080</code>なので、デスクトップ環境も合わせてるだけ</li>
</ul>
</li>
<li>グローバルスケール: <code>100%</code>
<ul>
<li>デフォだと <code>130%</code> とかなってて、リモートから Moonlight で接続時、左上に縮小表示&amp; 周りに虹、みたいになったので</li>
</ul>
</li>
</ul>
</li>
<li>
<p><code>システム設定 &gt; Wi-Fi とネットワーク</code></p>
<ul>
<li>何もしなくても有線でつながったのでそのまま。CLI で指定しやすいよう名称だけ「有線接続」を「LAN1」に</li>
<li>Wi-Fi は設定してません</li>
</ul>
</li>
<li>
<p>Wake ON LAN</p>
<ul>
<li>システム設定で設定項目見つけられなかったので、CLI で設定
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#75715e"># ネットワーク接続名を確認</span>
</span></span><span style="display:flex;"><span>$ nmcli connection show
</span></span><span style="display:flex;"><span><span style="color:#75715e"># magic packet</span>
</span></span><span style="display:flex;"><span>$ sudo nmcli connection modify <span style="color:#e6db74">&#34;LAN1&#34;</span> 802-3-ethernet.wake-on-lan magic
</span></span><span style="display:flex;"><span><span style="color:#75715e"># 設定項目確認</span>
</span></span><span style="display:flex;"><span>$ nmcli connection show <span style="color:#e6db74">&#34;LAN1&#34;</span> | grep 802-3-ethernet.wake-on-lan
</span></span></code></pre></div></li>
</ul>
</li>
<li>
<p>カーネルパラメーター変更（2026/02/28 追記）</p>
</li>
</ol>
<ul>
<li>
<p>NVMe SSD がディープスリープしないようにした</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>rpm-ostree kargs --append<span style="color:#f92672">=</span><span style="color:#e6db74">&#39;nvme_core.default_ps_max_latency_us=0&#39;</span>
</span></span></code></pre></div><ol>
<li>ドラクエ7r でセーブしようとすると「セーブデータが壊れているので新たにセーブします」と表示されて固まる。大丈夫な時もある</li>
<li>このエラーになると、強制再起動するしかなくなる（ように見える）</li>
<li><code>journalctl -b -1 -p 3 -k</code>で調査</li>
</ol>
<ul>
<li>
<ul>
<li>
<p>一つ前のブート <code>-b -1</code>のエラーレベル 3 <code>-p -3</code>の Kernel が吐いた <code>-k</code> エラーログ（エラーレベルは Gemini に教えてもらった）</p>
</li>
<li>
<p>大量の エラー</p>
<pre tabindex="0"><code>bazzite kernel: nvme0n1: I/O Cmd ...... I/O Error ....... 
bazzite kernel: critical target error, dev nvme0n1, .......
 (以下繰り返し)
</code></pre></li>
</ul>
</li>
</ul>
<ol start="4">
<li>SSD 見つからなくて死んでるのかな？　と思ったので。ググった感じアルアルっぽいので、効果があるかお試し中</li>
</ol>
</li>
</ul>
<h2 id="steam-の設定">
  Steam の設定
  <a class="anchor" href="#steam-%e3%81%ae%e8%a8%ad%e5%ae%9a">#</a>
</h2>
<ul>
<li>タイムゾーンを「日本 +0900」に変更しても、保存されない。ゲームのセーブデータは日本時間になってるみたいなので、そんなもんかと思って深追いしてない</li>
<li>ドラクエ 7 リイマジンドは、外付け環境の時 <code>Proton 10</code> では不安定だったので、<code>Proton 9.0-4</code> にした。内蔵 SSD なら大丈夫かもしれないけど、ゲームできればいいので試してない</li>
</ul>
<h2 id="リモート設定">
  リモート設定
  <a class="anchor" href="#%e3%83%aa%e3%83%a2%e3%83%bc%e3%83%88%e8%a8%ad%e5%ae%9a">#</a>
</h2>
<p>Bazzite に最初から入ってる Sunshine を自動起動し、クライアントからは Moonlight で接続する</p>
<h3 id="自動起動">
  自動起動
  <a class="anchor" href="#%e8%87%aa%e5%8b%95%e8%b5%b7%e5%8b%95">#</a>
</h3>
<ol>
<li><code>システム設定 &gt; 自動起動</code></li>
<li>「＋追加」→「アプリケーション」</li>
<li>検索バーに Sunshine</li>
</ol>
<h3 id="クライアントの登録">
  クライアントの登録
  <a class="anchor" href="#%e3%82%af%e3%83%a9%e3%82%a4%e3%82%a2%e3%83%b3%e3%83%88%e3%81%ae%e7%99%bb%e9%8c%b2">#</a>
</h3>
<ol>
<li>Bazzite で Sunshine が起動していることを確認
<ul>
<li>起動したら右下タスクバーに常駐している</li>
<li>タスクバーで右クリック→Open Sunshine
<ul>
<li>Firefox で設定画面が開くが、Firefox のセキュリティ設定にひっかかるので、先に Firefox 起動しておかないとダメかも
<ul>
<li>接続はプライベートではありません→詳細設定→localhostに進む</li>
<li>URL はたぶん https://localhost:47990</li>
</ul>
</li>
</ul>
</li>
<li>初回は ID と PW を決める</li>
<li>リモートから接続するための画面を選択。デフォのままでいいと思う
<ul>
<li>Desktop</li>
<li>Desktop (Low Res Desktop)</li>
<li>Steam (Big Picture)</li>
</ul>
</li>
</ul>
</li>
<li>クライアントで Moonlight 起動する
<ul>
<li>私は Android と macOS</li>
<li>同じネットワークにつながっていると「bazzite」という名前の PC が登場するのでクリック</li>
<li>「Sunshine で PIN　コードを入力しろ」と表示される</li>
</ul>
</li>
<li>Bazzite の Firefox の Sunshine 設定画面のタブ「PIN」で、4桁のPIN 入力
<ul>
<li>登録終わったら、Firefox は終了して OK</li>
</ul>
</li>
<li>以降、Moonlight から接続可能
<ul>
<li>WoL でのシャットダウンからの起動も Moonlight からできる。便利</li>
</ul>
</li>
</ol>
<h3 id="放置するとつながらなくなる問題">
  放置するとつながらなくなる問題
  <a class="anchor" href="#%e6%94%be%e7%bd%ae%e3%81%99%e3%82%8b%e3%81%a8%e3%81%a4%e3%81%aa%e3%81%8c%e3%82%89%e3%81%aa%e3%81%8f%e3%81%aa%e3%82%8b%e5%95%8f%e9%a1%8c">#</a>
</h3>
<p>リモートで遊んでる時は PC のディスプレイは消してるので、リモートからつないだまま放置すると Sunshine　が</p>
<pre tabindex="0"><code>Error: Couldn&#39;t find monitor [0]
</code></pre><p>とエラーを吐いて、Moonlight からつながらなくなる。ホストは生きてるので歩いていって Sunshine を Restart すればいいんだけど、そのうち HDMI のダミープラグでもつなごう。<br>
→ （2026/02/28 追記） HDMI ダミープラグつないで一週間、発生していません。</p>
<p>以上。これで、HX99G は快適 Steam 機になった。以降は、オマ環なこと。</p>
<h2 id="起動が遅いことの解消">
  起動が遅いことの解消
  <a class="anchor" href="#%e8%b5%b7%e5%8b%95%e3%81%8c%e9%81%85%e3%81%84%e3%81%93%e3%81%a8%e3%81%ae%e8%a7%a3%e6%b6%88">#</a>
</h2>
<p>期待値は 1 分未満での起動なんだけど、どうも数分かかるし、スプラッシュスクリーンが 2 回表示されてりするので、起動時に再チャレンジしたりしてる？　と思って調査。</p>
<h3 id="解決策">
  解決策
  <a class="anchor" href="#%e8%a7%a3%e6%b1%ba%e7%ad%96">#</a>
</h3>
<p>20〜30秒くらいで起動するようになった。満足。</p>
<p>参考: <a href="https://www.reddit.com/r/Bazzite/comments/1ddwucj/comment/l9ae5c9/" target="_blank" rel="noopener">https://www.reddit.com/r/Bazzite/comments/1ddwucj/comment/l9ae5c9/</a>
</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>$ sudo tee /etc/sddm.conf.d/yy-desktop-mode.conf <span style="color:#e6db74">&lt;&lt; &#39;EOF&#39;
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">[Autologin]
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">Session=plasma.desktop
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">Relogin=false
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">EOF</span>
</span></span></code></pre></div><h3 id="解決手順">
  解決手順
  <a class="anchor" href="#%e8%a7%a3%e6%b1%ba%e6%89%8b%e9%a0%86">#</a>
</h3>
<ol>
<li>
<p>デスクトップ左上にある「Return to Gaming Mode」クリックしても Desktop Mode に戻ってくるので、端末起動時もそうなってるんじゃないだろうか？</p>
</li>
<li>
<p>おった</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>$ journalctl -b | egrep -i <span style="color:#e6db74">&#34;(gamescript|gaming|steam)&#34;</span>
</span></span><span style="display:flex;"><span>.
</span></span><span style="display:flex;"><span>.
</span></span><span style="display:flex;"><span> 2月 <span style="color:#ae81ff">14</span> 21:19:56 bazzite steam<span style="color:#f92672">[</span>10597<span style="color:#f92672">]</span>: reaping pid: <span style="color:#ae81ff">13062</span> -- steam
</span></span><span style="display:flex;"><span> 2月 <span style="color:#ae81ff">14</span> 21:21:44 bazzite steam<span style="color:#f92672">[</span>10597<span style="color:#f92672">]</span>: <span style="color:#f92672">[</span>2026-02-14 21:21:44<span style="color:#f92672">]</span> Background update loop checking <span style="color:#66d9ef">for</span> update. . .
</span></span><span style="display:flex;"><span>.
</span></span><span style="display:flex;"><span>.
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>$ journalctl -b --no-pager | egrep -i <span style="color:#e6db74">&#34;(sddm|plasm|kwin|compositor)&#34;</span>
</span></span><span style="display:flex;"><span>.
</span></span><span style="display:flex;"><span>.
</span></span><span style="display:flex;"><span> 2月 <span style="color:#ae81ff">14</span> 21:17:49 bazzite sddm-helper<span style="color:#f92672">[</span>1797<span style="color:#f92672">]</span>: Detected locale <span style="color:#e6db74">&#34;C&#34;</span> with character encoding <span style="color:#e6db74">&#34;ANSI_X3.4-1968&#34;</span>, which is not UTF-8.
</span></span><span style="display:flex;"><span> .
</span></span><span style="display:flex;"><span> .
</span></span><span style="display:flex;"><span> 2月 <span style="color:#ae81ff">14</span> 21:17:49 bazzite sddm-helper<span style="color:#f92672">[</span>1797<span style="color:#f92672">]</span>: Starting Wayland user session: <span style="color:#e6db74">&#34;/etc/sddm/wayland-session&#34;</span> <span style="color:#e6db74">&#34;gamescope-session-plus steam&#34;</span>
</span></span><span style="display:flex;"><span>.
</span></span><span style="display:flex;"><span>.
</span></span><span style="display:flex;"><span> 2月 <span style="color:#ae81ff">14</span> 21:17:53 bazzite gamescope-session-plus<span style="color:#f92672">[</span>2270<span style="color:#f92672">]</span>: <span style="color:#f92672">[</span>gamescope<span style="color:#f92672">]</span> <span style="color:#f92672">[</span>Info<span style="color:#f92672">]</span>  wlserver: Running compositor on wayland display <span style="color:#e6db74">&#39;gamescope-0&#39;</span>
</span></span><span style="display:flex;"><span>.
</span></span><span style="display:flex;"><span>.
</span></span><span style="display:flex;"><span> 2月 <span style="color:#ae81ff">14</span> 21:18:08 bazzite sddm-helper<span style="color:#f92672">[</span>1797<span style="color:#f92672">]</span>: pam_unix<span style="color:#f92672">(</span>sddm-autologin:session<span style="color:#f92672">)</span>: session closed <span style="color:#66d9ef">for</span> user higemaru
</span></span><span style="display:flex;"><span> .
</span></span><span style="display:flex;"><span> .
</span></span><span style="display:flex;"><span> 2月 <span style="color:#ae81ff">14</span> 21:18:09 bazzite sddm-helper<span style="color:#f92672">[</span>3493<span style="color:#f92672">]</span>: Detected locale <span style="color:#e6db74">&#34;C&#34;</span> with character encoding <span style="color:#e6db74">&#34;ANSI_X3.4-1968&#34;</span>, which is not UTF-8.
</span></span></code></pre></div></li>
<li>
<p>KDE システム設定の SDDM 設定をいじっても状況変わらず。 Bazzite は Immutable OS だから、ここの設定いじってもダメなのかな？</p>
</li>
<li>
<p>/etc/ 以下は書き込み可能みたいなんで、設定探すよ</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>$ ls /etc/sddm.conf.d/
</span></span><span style="display:flex;"><span>kde_settings.conf  steamos.conf  virtualkbd.conf  zz-steamos-autologin.conf
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>$ cat /etc/sddm.conf.d/steamos.conf
</span></span><span style="display:flex;"><span><span style="color:#f92672">[</span>General<span style="color:#f92672">]</span>
</span></span><span style="display:flex;"><span>DisplayServer<span style="color:#f92672">=</span>wayland
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">[</span>Autologin<span style="color:#f92672">]</span>
</span></span><span style="display:flex;"><span>Relogin<span style="color:#f92672">=</span>true
</span></span><span style="display:flex;"><span>Session<span style="color:#f92672">=</span>gamescope-session.desktop
</span></span><span style="display:flex;"><span>User<span style="color:#f92672">=</span>higemaru
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">[</span>X11<span style="color:#f92672">]</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># Janky workaround for wayland sessions not stopping in sddm, kills</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># all active sddm-helper sessions on teardown</span>
</span></span><span style="display:flex;"><span>DisplayStopCommand<span style="color:#f92672">=</span>/usr/bin/gamescope-wayland-teardown-workaround
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>$ cat /etc/sddm.conf.d/zz-steamos-autologin.conf
</span></span><span style="display:flex;"><span><span style="color:#f92672">[</span>Autologin<span style="color:#f92672">]</span>
</span></span><span style="display:flex;"><span>Session<span style="color:#f92672">=</span>plasma-steamos-wayland-oneshot.desktop
</span></span></code></pre></div><p>おった。これや</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#f92672">[</span>Autologin<span style="color:#f92672">]</span>
</span></span><span style="display:flex;"><span>Relogin<span style="color:#f92672">=</span>true
</span></span><span style="display:flex;"><span>Session<span style="color:#f92672">=</span>gamescope-session.desktop
</span></span><span style="display:flex;"><span>User<span style="color:#f92672">=</span>higemaru
</span></span></code></pre></div></li>
<li>
<p>gamescope-session がもれなくエラーになって再ログインすることになるので、数分かかるし、セッション変わるのでログインもやりなおしだし、いいことないので</p>
<ul>
<li>plasma.desktop で固定</li>
<li>Relogin なし（ここは気にしなくてよかったかもしれない）</li>
<li>zz- は一時的な設定ファイルで、起動時に削除される仕様
<ul>
<li><code>zz-steamos-autologin.conf</code> がずっとあるのは、ずっと失敗してるってことだな</li>
</ul>
</li>
<li>yy- はユーザーが意図的に上書き設定する時の prefix</li>
</ul>
</li>
</ol>
<h2 id="スクショを自動でクラウドに">
  スクショを自動でクラウドに
  <a class="anchor" href="#%e3%82%b9%e3%82%af%e3%82%b7%e3%83%a7%e3%82%92%e8%87%aa%e5%8b%95%e3%81%a7%e3%82%af%e3%83%a9%e3%82%a6%e3%83%89%e3%81%ab">#</a>
</h2>
<p>あまりゲームのスクショとったりしないんだけど、たまにしかとらないから、よけいに取得に手間かけたくないのですよ。</p>
<ul>
<li>pCloud に自動で同期</li>
<li>Bazzite は Gaming Mode ではバックグラウンドアプリはサスペンドされるかも、ということだったので、pCloud アプリに任せず、rclone + systemd でやる
<ul>
<li>結果的に常時 Desktop Mode だけど、まあいいや</li>
</ul>
</li>
<li>Bazzite は、Mac ユーザーにはお馴染み Homebrew が入ってるよ。楽ちん</li>
<li>rclone は同期先に pCloud を選択できるよ。楽ちん</li>
</ul>
<h3 id="導入--テスト">
  導入 &amp; テスト
  <a class="anchor" href="#%e5%b0%8e%e5%85%a5--%e3%83%86%e3%82%b9%e3%83%88">#</a>
</h3>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>$ brew install rclone
</span></span><span style="display:flex;"><span>$ rclone config <span style="color:#75715e"># ひたすら return 。pCloud は45番くらい。OAuth の時 Firefox 起動する</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>$ ls ~/.local/share/Steam/userdata/ <span style="color:#75715e"># 数字連番の SteamID</span>
</span></span><span style="display:flex;"><span>$ ls ~/.local/share/Steam/userdata/&lt;SteamID&gt;/760/remote/ <span style="color:#75715e"># 数字連番のフォルダ（ゲーム毎のデータ）</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>$ rclone copy ~/.local/share/Steam/userdata/&lt;SteamID&gt;/760/ pcloud:me/hx99g_Bazzite/ -n <span style="color:#75715e"># dry-run で確認</span>
</span></span></code></pre></div><h3 id="自動化">
  自動化
  <a class="anchor" href="#%e8%87%aa%e5%8b%95%e5%8c%96">#</a>
</h3>
<p>追記: 最初 rclone-screen.path 使ってたけど、PathChanged は階層的にチェックはしてくれないことに気づいたので、 <code>brew install inotify-tools</code>して、inotifywait に変更</p>
<ul>
<li>
<p>設置する場所を調べる</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>$ systemctl --user --no-pager --property UnitPath show
</span></span></code></pre></div></li>
<li>
<p>service unit (実行)</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>$ cat ~/.config/systemd/user/rclone-screenshots.service
</span></span><span style="display:flex;"><span><span style="color:#f92672">[</span>Unit<span style="color:#f92672">]</span>
</span></span><span style="display:flex;"><span>Description<span style="color:#f92672">=</span>Copy screenshots to pCloud using rclone
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">[</span>Service<span style="color:#f92672">]</span>
</span></span><span style="display:flex;"><span>Type<span style="color:#f92672">=</span>simple
</span></span><span style="display:flex;"><span>ExecStart<span style="color:#f92672">=</span>/bin/bash -c <span style="color:#e6db74">&#39;/home/linuxbrew/.linuxbrew/bin/inotifywait -r -e close_write,moved_to /home/higemaru/.local/share/Steam/userdata/1204200924/760/remote/ &amp;&amp; /home/linuxbrew/.linuxbrew/bin/rclone sync %h/.local/share/Steam/userdata/1204200924/760/ pcloud:me/hx99g_Bazzite/&#39;</span>
</span></span><span style="display:flex;"><span>Restart<span style="color:#f92672">=</span>on-success
</span></span><span style="display:flex;"><span>RestartSec<span style="color:#f92672">=</span>3s
</span></span></code></pre></div></li>
<li>
<p>有効化</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>$ systemctl --user daemon-reload
</span></span><span style="display:flex;"><span>$ systemctl --user enable --now rclone-screenshots.service
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>$ systemctl --user status rclone-screenshots.service <span style="color:#75715e"># 監視状態の確認</span>
</span></span><span style="display:flex;"><span>$ systemctl --user start rclone-screenshots.service <span style="color:#75715e"># 手動実行</span>
</span></span><span style="display:flex;"><span>$ journalctl --user -u rclone-screenshots.service <span style="color:#75715e"># ログ確認</span>
</span></span></code></pre></div></li>
</ul>
]]></description>
    </item>
    
    <item>
      <title>brew upgrade 半自動でやる</title>
      <link>https://d3.haro.jp/docs/2026/brew-upgrade-semi-auto/</link>
      <pubDate>Fri, 16 Jan 2026 19:43:50 +0900</pubDate>
      
      <guid>https://d3.haro.jp/docs/2026/brew-upgrade-semi-auto/</guid>
      <description><![CDATA[ <h1 id="brew-upgrade-半自動でやる">
  brew upgrade 半自動でやる
  <a class="anchor" href="#brew-upgrade-%e5%8d%8a%e8%87%aa%e5%8b%95%e3%81%a7%e3%82%84%e3%82%8b">#</a>
</h1>
<p><code>brew update &amp;&amp; brew upgrade &amp;&amp; brew cleanup &amp;&amp; brew autoremove </code></p>
<p>を手動でやるのが面倒になって、<a href="https://github.com/DomT4/homebrew-autoupdate" target="_blank" rel="noopener">homebrew-update</a>
 試そうとしたんだけど「チェックだけする。自動アップグレードしない」のやり方がよくわからなくて、仕方ないので shell script 書いた。想像してたより気に入ったんで職場で共有。そしてここでも公開。</p>
<p>コメントは生成 AI がいれてくれたよ。素敵</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#75715e">#!/bin/bash
</span></span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># brew-outdated-check.sh</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># Homebrewの更新をチェックして通知します</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">#</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># セットアップ:</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># 1. brew install terminal-notifier</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># 2. システム設定 &gt; 通知 で terminal-notifier の通知を許可</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">#    (初回起動時にダイアログが出るので、それに沿って設定で OK)</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># 3. ~/.bashrc または ~/.zshrc に以下を追加:</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">#    (前回ターミナル起動が 12 時間以上前ならチェック)</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">#</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># CHECK_FILE=&#34;/tmp/brew_check_last_${USER}&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># CHECK_SH=&#34;$HOME/bin/brew-outdated-check.sh&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># if [[ ! -f &#34;$CHECK_FILE&#34; || $(find &#34;$CHECK_FILE&#34; -mmin +720) ]]; then</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">#     (bash &#34;$CHECK_SH&#34; &amp;) &gt; /dev/null 2&gt;&amp;1</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">#     touch &#34;$CHECK_FILE&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># fi</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># 0. Terminal, iTerm, WezTerm ....</span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">case</span> <span style="color:#e6db74">&#34;</span>$TERM_PROGRAM<span style="color:#e6db74">&#34;</span> in
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;WezTerm&#34;</span><span style="color:#f92672">)</span>        TERM_APP<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;WezTerm&#34;</span> ;;
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;iTerm.app&#34;</span><span style="color:#f92672">)</span>      TERM_APP<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;iTerm&#34;</span> ;;
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;Apple_Terminal&#34;</span><span style="color:#f92672">)</span> TERM_APP<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;Terminal&#34;</span> ;;
</span></span><span style="display:flex;"><span>    *<span style="color:#f92672">)</span>                TERM_APP<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;Terminal&#34;</span> ;; <span style="color:#75715e"># デフォルト</span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">esac</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># 1. 依存ツールのチェック</span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">if</span> ! command -v terminal-notifier &amp;&gt; /dev/null; <span style="color:#66d9ef">then</span>
</span></span><span style="display:flex;"><span>    echo <span style="color:#e6db74">&#34;⚠️  terminal-notifier がインストールされていません。&#34;</span>
</span></span><span style="display:flex;"><span>    echo <span style="color:#e6db74">&#34;通知機能を利用するために、以下のコマンドでインストールしてください：&#34;</span>
</span></span><span style="display:flex;"><span>    echo <span style="color:#e6db74">&#34;brew install terminal-notifier&#34;</span>
</span></span><span style="display:flex;"><span>    exit <span style="color:#ae81ff">1</span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">fi</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># 2. 更新があるかチェック</span>
</span></span><span style="display:flex;"><span>brew update &gt; /dev/null 2&gt;&amp;<span style="color:#ae81ff">1</span>
</span></span><span style="display:flex;"><span>OUTDATED_COUNT<span style="color:#f92672">=</span><span style="color:#66d9ef">$(</span>brew outdated --quiet | wc -l | tr -d <span style="color:#e6db74">&#39; &#39;</span><span style="color:#66d9ef">)</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># 3. 更新があったら通知</span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">if</span> <span style="color:#f92672">[</span> <span style="color:#e6db74">&#34;</span>$OUTDATED_COUNT<span style="color:#e6db74">&#34;</span> -gt <span style="color:#ae81ff">0</span> <span style="color:#f92672">]</span>; <span style="color:#66d9ef">then</span>
</span></span><span style="display:flex;"><span>    MAINTENANCE_CMD<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;brew upgrade &amp;&amp; brew cleanup &amp;&amp; brew autoremove&#34;</span>;
</span></span><span style="display:flex;"><span>    terminal-notifier <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span>        -group <span style="color:#e6db74">&#34;brew-maintenance&#34;</span> <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span>        -title <span style="color:#e6db74">&#34;🍺 Homebrew Update&#34;</span> <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span>        -message <span style="color:#e6db74">&#34;</span><span style="color:#e6db74">${</span>OUTDATED_COUNT<span style="color:#e6db74">}</span><span style="color:#e6db74">件の更新があります。クリックでコマンドをコピーしてターミナルを開きます。ペーストして実行してください。&#34;</span> <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span>        -sound default <span style="color:#ae81ff">\
</span></span></span><span style="display:flex;"><span>        -execute <span style="color:#e6db74">&#34;echo &#39;</span>$MAINTENANCE_CMD<span style="color:#e6db74">&#39; | pbcopy &amp;&amp; open -a &#39;</span>$TERM_APP<span style="color:#e6db74">&#39;&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">#        -execute &#34;osascript -e &#39;tell application \&#34;${TERM_APP}\&#34; to activate&#39; -e &#39;delay 0.5&#39; -e &#39;tell application \&#34;System Events\&#34; to keystroke \&#34;$MAINTENANCE_CMD\&#34; &amp; return&#39;&#34;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    echo <span style="color:#e6db74">&#34;通知を送信しました (</span><span style="color:#e6db74">${</span>OUTDATED_COUNT<span style="color:#e6db74">}</span><span style="color:#e6db74">件の更新)&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">else</span>
</span></span><span style="display:flex;"><span>    echo <span style="color:#e6db74">&#34;✅ 更新はありません&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">fi</span>
</span></span></code></pre></div>]]></description>
    </item>
    
    <item>
      <title>技術書典 19 に参加しました</title>
      <link>https://d3.haro.jp/docs/2025/techbookfest19_result/</link>
      <pubDate>Sat, 13 Dec 2025 20:13:32 +0900</pubDate>
      
      <guid>https://d3.haro.jp/docs/2025/techbookfest19_result/</guid>
      <description><![CDATA[ <h1 id="技術書典-19-に参加しました">
  技術書典 19 に参加しました
  <a class="anchor" href="#%e6%8a%80%e8%a1%93%e6%9b%b8%e5%85%b8-19-%e3%81%ab%e5%8f%82%e5%8a%a0%e3%81%97%e3%81%be%e3%81%97%e3%81%9f">#</a>
</h1>
<p>サークル名「<a href="https://techbookfest.org/organization/jUrzL74GcsSsjLvEjJarFp" target="_blank" rel="noopener">髭、はえ初めし頃。</a>
」で参加した「技術書典」、オンライン参加なので、ハッシュタグ追いかけたり YouTube 見たりエゴサしたりしてただけですが、それでも参加してる感あって、楽しうございました。</p>
<p>元々何かしら書くことは好きなので、書いてるだけで楽しくはあったのですが、やはり気になりますよね。「何冊売れるだろう？」</p>
<ul>
<li>売れる売れないではなく、需要ゼロだとへこむなぁ</li>
<li>5冊くらい売れるといいなぁ</li>
<li>3つ出展してるので、それぞれ 5 冊くらい売れるといいなぁ</li>
<li>開催期間中は、毎日 X でなんか呟こう</li>
</ul>
<p>実際、毎日つぶやいたりはしましたが、それ以外に何をするということもなく。そして、いざ参加してみると</p>
<ul>
<li>出展したという事実だけで楽しい</li>
<li>1冊でも売れると、なお嬉しい</li>
</ul>
<p>という心境だし、オンライン参加 &amp; ダウンロード販売オンリーなので、ぶっちゃけ赤字の心配もありません。とはいうものの、数字で結果がわかるものって、やっぱり気になりますよね。</p>
<p>はい、結果発表。</p>
<table>
  <thead>
      <tr>
          <th>タイトル</th>
          <th>頒布数</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Typora でお手軽出版</td>
          <td>8</td>
      </tr>
      <tr>
          <td>縦書き駆動執筆 〜Typora で縦書きでもお手軽出版〜</td>
          <td>4</td>
      </tr>
      <tr>
          <td>楽して作ろう！ はじめての OpenSCAD</td>
          <td>22</td>
      </tr>
  </tbody>
</table>
<p>思ってたより多くの方にお届けできました。満足。「<a href="https://techbookfest.org/product/a7CMvyPkY3y7KciDjYu9jc?productVariantID=cy6zSySPZ9a99CriFqe8Wq" target="_blank" rel="noopener">技術季報Vol.19</a>
」によると、<strong>オンラインのみの頒布の場合、平均 25、中央値が 10</strong> ということなので、平均的な感じですね。</p>
<p>……というおもしろみのない結果ではありましたが、フォロワーもリア友も少ない状態のオンライン参加でこのくらいです、という参考に。</p>
<p>ほんとは紙の本が満足感あるし、間口も広がると思うし、オフライン参加もしたいのですが、</p>
<ul>
<li>体力的にオフラインはちょっと無理</li>
<li>紙の本の在庫を持つと、それが気持ちのカセになるかもしれない</li>
</ul>
<p>という理由で、今後も当面オンラインでの参加になるとは思いますが、少なからず自分の思いをお届けできたことで、どこかにいる同好の士を見つけたような、嬉しい気持ちでございます。</p>
<p>売れる売れないじゃなく、書きたいから書くのです。<br>
書ける書けないじゃなく、書きたいから書くのです。</p>
<p>おそまつさまでございました。</p>
]]></description>
    </item>
    
    <item>
      <title> 技術書典 19 に参加します</title>
      <link>https://d3.haro.jp/docs/2025/techbookfest19/</link>
      <pubDate>Wed, 12 Nov 2025 23:36:18 +0900</pubDate>
      
      <guid>https://d3.haro.jp/docs/2025/techbookfest19/</guid>
      <description><![CDATA[ <h1 id="技術書典-19-に参加します">
  技術書典 19 に参加します
  <a class="anchor" href="#%e6%8a%80%e8%a1%93%e6%9b%b8%e5%85%b8-19-%e3%81%ab%e5%8f%82%e5%8a%a0%e3%81%97%e3%81%be%e3%81%99">#</a>
</h1>
<p>サークル名「<a href="https://techbookfest.org/organization/jUrzL74GcsSsjLvEjJarFp" target="_blank" rel="noopener">髭、はえ初めし頃。</a>
」です。対戦よろしくお願いします。</p>
<p><img src="https://filedn.com/l2luTWp3NzbpjAodhk9Fxpy/techbookfest19.png" alt="" /></p>
<p>Typora で紙書籍を作る方法を整理したいなぁ、と思ってから早幾年……</p>

<p>つうか一年半ですね。</p>

<p>本にしてみたら嬉しかったので、せっかくなので参加です。</p>
<p>写真は自分用に作ってみた紙書籍ですが、今回は PDF のみです。2ヶ月くらいで、まがりなりにも 3 冊書いたんだから、初参加にしては我ながら、がんばったと思うよ。燃えつきないようにしないと。</p>
<h2 id="typora-でお手軽出版">
  Typora でお手軽出版
  <a class="anchor" href="#typora-%e3%81%a7%e3%81%8a%e6%89%8b%e8%bb%bd%e5%87%ba%e7%89%88">#</a>
</h2>
<p>Markdown で書いた原稿から紙書籍を作る方法はたくさんのウェブサイトや書籍で紹介されていますが、Typora から PDF 出力して pixivFACTORY でオンデマンド印刷、というのが想像してたよりお手軽だったので、手順を書き残しました。</p>
<h2 id="縦書き駆動執筆-typora-で縦書きでもお手軽出版">
  縦書き駆動執筆 〜Typora で縦書きでもお手軽出版〜
  <a class="anchor" href="#%e7%b8%a6%e6%9b%b8%e3%81%8d%e9%a7%86%e5%8b%95%e5%9f%b7%e7%ad%86-typora-%e3%81%a7%e7%b8%a6%e6%9b%b8%e3%81%8d%e3%81%a7%e3%82%82%e3%81%8a%e6%89%8b%e8%bb%bd%e5%87%ba%e7%89%88">#</a>
</h2>
<p>縦書き書籍も作りたいよね、というのは当然の帰結。せっかくなんでサンプルとして短編小説書きました。</p>
<h2 id="楽して作ろう-はじめての-openscad">
  楽して作ろう！ はじめての OpenSCAD
  <a class="anchor" href="#%e6%a5%bd%e3%81%97%e3%81%a6%e4%bd%9c%e3%82%8d%e3%81%86-%e3%81%af%e3%81%98%e3%82%81%e3%81%a6%e3%81%ae-openscad">#</a>
</h2>
<p>3Dプリンターで印刷する箱や自作キーボードのキーキャップ、ケースなどのデータを作成する時、OpenSCAD + BOSL2 を使っています。自分用のチートシート的な位置づけ。</p>
]]></description>
    </item>
    
    <item>
      <title>BOOTH で同人誌</title>
      <link>https://d3.haro.jp/docs/2025/my-first-openscad/</link>
      <pubDate>Sun, 31 Aug 2025 16:18:36 +0900</pubDate>
      
      <guid>https://d3.haro.jp/docs/2025/my-first-openscad/</guid>
      <description><![CDATA[ <h1 id="booth-で同人誌とか">
  BOOTH で同人誌とか
  <a class="anchor" href="#booth-%e3%81%a7%e5%90%8c%e4%ba%ba%e8%aa%8c%e3%81%a8%e3%81%8b">#</a>
</h1>
<p>pixivFACTORY で本を作ってみたら思っていたよりいい感じだったので嬉しくなって、勢いでそのまま BOOTH で公開しました。</p>
<p><a href="https://higemaru.booth.pm/" target="_blank" rel="noopener">https://higemaru.booth.pm/</a>
</p>
<p><img src="https://filedn.com/l2luTWp3NzbpjAodhk9Fxpy/my-first-openscad00.png" alt="" /><img src="https://filedn.com/l2luTWp3NzbpjAodhk9Fxpy/my-first-openscad01.png" alt="" /></p>
]]></description>
    </item>
    
    <item>
      <title>OpenSCAD でドット絵を描く</title>
      <link>https://d3.haro.jp/docs/2025/openscad_dot/</link>
      <pubDate>Mon, 11 Aug 2025 13:54:49 +0900</pubDate>
      
      <guid>https://d3.haro.jp/docs/2025/openscad_dot/</guid>
      <description><![CDATA[ <h1 id="openscad-でドット絵を描く">
  OpenSCAD でドット絵を描く
  <a class="anchor" href="#openscad-%e3%81%a7%e3%83%89%e3%83%83%e3%83%88%e7%b5%b5%e3%82%92%e6%8f%8f%e3%81%8f">#</a>
</h1>
<p>MakerChip 作る時のQR コード、SVG 読み込むんじゃなくて直接書けばいいじゃん、と思ったので、まずはドットを打つ部分を。<br>
URL 文字列→QR コード→配列生成がキモなんで、そこを用意するまでは手打ちドッターとして遊ぶ用。</p>
<p>追記: Gemini に「qrencode で QRコードを ASCII 出力して、それを整形するシェルスクリプト」を所望したらすぐ作ってくれたよ。動くので細かいチェックはしてない</p>
<p><img src="https://filedn.com/l2luTWp3NzbpjAodhk9Fxpy/openscad_dot.png" alt="" /></p>
<h2 id="openscad">
  OpenSCAD
  <a class="anchor" href="#openscad">#</a>
</h2>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-js" data-lang="js"><span style="display:flex;"><span><span style="color:#a6e22e">$fs</span> <span style="color:#f92672">=</span> <span style="color:#ae81ff">0.1</span>;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">module</span> <span style="color:#a6e22e">make_dots_</span>(<span style="color:#a6e22e">pos</span><span style="color:#f92672">=</span>[]) {
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">x</span> <span style="color:#f92672">=</span> <span style="color:#ae81ff">1</span>; <span style="color:#75715e">// ドットの幅
</span></span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">t</span> <span style="color:#f92672">=</span> <span style="color:#ae81ff">1</span>; <span style="color:#75715e">// 厚さ
</span></span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">rows</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">len</span>(<span style="color:#a6e22e">pos</span>);    <span style="color:#75715e">// 行数
</span></span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">cols</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">len</span>(<span style="color:#a6e22e">pos</span>[<span style="color:#ae81ff">0</span>]); <span style="color:#75715e">// 列数
</span></span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">translate</span>([<span style="color:#f92672">-</span><span style="color:#a6e22e">x</span><span style="color:#f92672">*</span><span style="color:#a6e22e">cols</span><span style="color:#f92672">/</span><span style="color:#ae81ff">2</span>,<span style="color:#a6e22e">x</span><span style="color:#f92672">*</span><span style="color:#a6e22e">rows</span><span style="color:#f92672">/</span><span style="color:#ae81ff">2</span><span style="color:#f92672">-</span><span style="color:#ae81ff">1</span>,<span style="color:#ae81ff">0</span>]) { <span style="color:#75715e">// センターに揃える
</span></span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">for</span> ( <span style="color:#a6e22e">r</span> <span style="color:#f92672">=</span> [ <span style="color:#ae81ff">0</span> <span style="color:#f92672">:</span> <span style="color:#a6e22e">len</span>(<span style="color:#a6e22e">pos</span>) <span style="color:#f92672">-</span><span style="color:#ae81ff">1</span> ] ) { <span style="color:#75715e">// 行ループ
</span></span></span><span style="display:flex;"><span>            <span style="color:#66d9ef">for</span> ( <span style="color:#a6e22e">c</span> <span style="color:#f92672">=</span> [ <span style="color:#ae81ff">0</span> <span style="color:#f92672">:</span> <span style="color:#a6e22e">len</span>(<span style="color:#a6e22e">pos</span>[<span style="color:#a6e22e">r</span>]) <span style="color:#f92672">-</span><span style="color:#ae81ff">1</span> ] ) { <span style="color:#75715e">// 列ループ
</span></span></span><span style="display:flex;"><span>                <span style="color:#66d9ef">if</span> ( <span style="color:#a6e22e">pos</span>[<span style="color:#a6e22e">r</span>][<span style="color:#a6e22e">c</span>] <span style="color:#f92672">!=</span> <span style="color:#ae81ff">0</span> ) { <span style="color:#75715e">// 0 じゃない時ドット
</span></span></span><span style="display:flex;"><span>                    <span style="color:#a6e22e">translate</span>([<span style="color:#a6e22e">x</span><span style="color:#f92672">*</span><span style="color:#a6e22e">c</span>, <span style="color:#f92672">-</span><span style="color:#a6e22e">x</span><span style="color:#f92672">*</span><span style="color:#a6e22e">r</span>, <span style="color:#ae81ff">0</span>])
</span></span><span style="display:flex;"><span>                        <span style="color:#a6e22e">cube</span>([<span style="color:#a6e22e">x</span>,<span style="color:#a6e22e">x</span>,<span style="color:#a6e22e">t</span>]);
</span></span><span style="display:flex;"><span>                }
</span></span><span style="display:flex;"><span>            }
</span></span><span style="display:flex;"><span>        }
</span></span><span style="display:flex;"><span>    }
</span></span><span style="display:flex;"><span>}
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">pos</span> <span style="color:#f92672">=</span> [
</span></span><span style="display:flex;"><span>    [<span style="color:#ae81ff">0</span>,<span style="color:#ae81ff">0</span>,<span style="color:#ae81ff">0</span>,<span style="color:#ae81ff">1</span>,<span style="color:#ae81ff">1</span>,<span style="color:#ae81ff">0</span>,<span style="color:#ae81ff">0</span>,<span style="color:#ae81ff">0</span>],
</span></span><span style="display:flex;"><span>    [<span style="color:#ae81ff">0</span>,<span style="color:#ae81ff">0</span>,<span style="color:#ae81ff">1</span>,<span style="color:#ae81ff">1</span>,<span style="color:#ae81ff">1</span>,<span style="color:#ae81ff">1</span>,<span style="color:#ae81ff">0</span>,<span style="color:#ae81ff">0</span>],
</span></span><span style="display:flex;"><span>    [<span style="color:#ae81ff">0</span>,<span style="color:#ae81ff">1</span>,<span style="color:#ae81ff">1</span>,<span style="color:#ae81ff">1</span>,<span style="color:#ae81ff">1</span>,<span style="color:#ae81ff">1</span>,<span style="color:#ae81ff">1</span>,<span style="color:#ae81ff">0</span>],
</span></span><span style="display:flex;"><span>    [<span style="color:#ae81ff">1</span>,<span style="color:#ae81ff">1</span>,<span style="color:#ae81ff">0</span>,<span style="color:#ae81ff">1</span>,<span style="color:#ae81ff">1</span>,<span style="color:#ae81ff">0</span>,<span style="color:#ae81ff">1</span>,<span style="color:#ae81ff">1</span>],
</span></span><span style="display:flex;"><span>    [<span style="color:#ae81ff">1</span>,<span style="color:#ae81ff">1</span>,<span style="color:#ae81ff">1</span>,<span style="color:#ae81ff">1</span>,<span style="color:#ae81ff">1</span>,<span style="color:#ae81ff">1</span>,<span style="color:#ae81ff">1</span>,<span style="color:#ae81ff">1</span>],
</span></span><span style="display:flex;"><span>    [<span style="color:#ae81ff">0</span>,<span style="color:#ae81ff">0</span>,<span style="color:#ae81ff">1</span>,<span style="color:#ae81ff">0</span>,<span style="color:#ae81ff">0</span>,<span style="color:#ae81ff">1</span>,<span style="color:#ae81ff">0</span>,<span style="color:#ae81ff">0</span>],
</span></span><span style="display:flex;"><span>    [<span style="color:#ae81ff">0</span>,<span style="color:#ae81ff">1</span>,<span style="color:#ae81ff">0</span>,<span style="color:#ae81ff">1</span>,<span style="color:#ae81ff">1</span>,<span style="color:#ae81ff">0</span>,<span style="color:#ae81ff">1</span>,<span style="color:#ae81ff">0</span>],
</span></span><span style="display:flex;"><span>    [<span style="color:#ae81ff">1</span>,<span style="color:#ae81ff">0</span>,<span style="color:#ae81ff">1</span>,<span style="color:#ae81ff">0</span>,<span style="color:#ae81ff">0</span>,<span style="color:#ae81ff">1</span>,<span style="color:#ae81ff">0</span>,<span style="color:#ae81ff">1</span>],
</span></span><span style="display:flex;"><span>];
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">make_dots_</span>(<span style="color:#a6e22e">pos</span>);
</span></span></code></pre></div><h2 id="qrencode">
  qrencode
  <a class="anchor" href="#qrencode">#</a>
</h2>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#75715e">#!/bin/sh
</span></span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># set -e: コマンドがエラーで終了したら、スクリプトを即座に終了する</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># set -u: 未定義の変数を使用しようとしたらエラーで終了する</span>
</span></span><span style="display:flex;"><span>set -eu
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># --- 依存コマンドのチェック ---</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># スクリプトが必要とする &#39;qrencode&#39; と &#39;awk&#39; が存在するかを確認する</span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">if</span> ! command -v qrencode &gt;/dev/null 2&gt;&amp;1; <span style="color:#66d9ef">then</span>
</span></span><span style="display:flex;"><span>    echo <span style="color:#e6db74">&#34;エラー: &#39;qrencode&#39; コマンドが見つかりません。&#34;</span> &gt;&amp;<span style="color:#ae81ff">2</span>
</span></span><span style="display:flex;"><span>    echo <span style="color:#e6db74">&#34;先にインストールしてください (例: &#39;sudo apt-get install qrencode&#39; or &#39;brew install qrencode&#39;)。&#34;</span> &gt;&amp;<span style="color:#ae81ff">2</span>
</span></span><span style="display:flex;"><span>    exit <span style="color:#ae81ff">1</span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">fi</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">if</span> ! command -v awk &gt;/dev/null 2&gt;&amp;1; <span style="color:#66d9ef">then</span>
</span></span><span style="display:flex;"><span>    echo <span style="color:#e6db74">&#34;エラー: &#39;awk&#39; コマンドが見つかりません。&#34;</span> &gt;&amp;<span style="color:#ae81ff">2</span>
</span></span><span style="display:flex;"><span>    echo <span style="color:#e6db74">&#34;awkは多くのUnix系システムで標準コマンドです。環境を確認してください。&#34;</span> &gt;&amp;<span style="color:#ae81ff">2</span>
</span></span><span style="display:flex;"><span>    exit <span style="color:#ae81ff">1</span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">fi</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># --- 引数のチェック ---</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># スクリプトに渡された引数が1つでない場合は、使い方を表示して終了する</span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">if</span> <span style="color:#f92672">[</span> <span style="color:#e6db74">&#34;</span>$#<span style="color:#e6db74">&#34;</span> -ne <span style="color:#ae81ff">1</span> <span style="color:#f92672">]</span>; <span style="color:#66d9ef">then</span>
</span></span><span style="display:flex;"><span>    <span style="color:#75715e"># basename &#34;$0&#34; はスクリプトファイル名を取得する</span>
</span></span><span style="display:flex;"><span>    echo <span style="color:#e6db74">&#34;使い方: </span><span style="color:#66d9ef">$(</span>basename <span style="color:#e6db74">&#34;</span>$0<span style="color:#e6db74">&#34;</span><span style="color:#66d9ef">)</span><span style="color:#e6db74"> \&#34;QRコードにしたい文字列\&#34;&#34;</span> &gt;&amp;<span style="color:#ae81ff">2</span>
</span></span><span style="display:flex;"><span>    echo <span style="color:#e6db74">&#34;例: </span><span style="color:#66d9ef">$(</span>basename <span style="color:#e6db74">&#34;</span>$0<span style="color:#e6db74">&#34;</span><span style="color:#66d9ef">)</span><span style="color:#e6db74"> \&#34;Hello, OpenSCAD!\&#34; &gt; qr_data.scad&#34;</span> &gt;&amp;<span style="color:#ae81ff">2</span>
</span></span><span style="display:flex;"><span>    exit <span style="color:#ae81ff">1</span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">fi</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># --- メイン処理 ---</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># 最初の引数を変数に格納する</span>
</span></span><span style="display:flex;"><span>TEXT_TO_ENCODE<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;</span>$1<span style="color:#e6db74">&#34;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># qrencodeでマージンなし(&#34;-m 0&#34;)のASCIIアートを生成し、パイプでawkに渡して整形する</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># qrencode の &#34;--&#34; は、引数がハイフンで始まる場合でもそれをオプションと誤認させないための記述</span>
</span></span><span style="display:flex;"><span>qrencode -t ASCII -m <span style="color:#ae81ff">0</span> -o - -- <span style="color:#e6db74">&#34;</span>$TEXT_TO_ENCODE<span style="color:#e6db74">&#34;</span> | awk <span style="color:#e6db74">&#39;
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">BEGIN {
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">    # 配列の開始部分を出力
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">    print &#34;qr_matrix = [&#34;;
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">    # 最初の行かどうかを判定するためのフラグ
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">    first_line = 1;
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">}
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">{
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">    # 2行目以降は、前の行の終わりにカンマと改行を出力
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">    if (!first_line) {
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">        printf &#34;,\n&#34;;
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">    }
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">    first_line = 0;
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">    # 各行の処理: 行の開始ブラケットを出力
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">    printf &#34;  [&#34;;
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">    # 1文字ずつループして処理
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">    for (i = 1; i &lt;= length($0); i++) {
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">        char = substr($0, i, 1);
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">        # &#34;#&#34; なら 1、スペースなら 0 に変換
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">        val = (char == &#34;#&#34;) ? 1 : 0;
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">        # 数値と、行末でなければカンマを出力
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">        printf &#34;%d%s&#34;, val, (i == length($0) ? &#34;&#34; : &#34;,&#34;);
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">    }
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">    # 行の終了ブラケットを出力
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">    printf &#34;]&#34;;
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">}
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">END {
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">    # 配列の終了部分を出力
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">    print &#34;\n];&#34;;
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">}
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">&#39;</span>
</span></span></code></pre></div><h3 id="実行結果">
  実行結果
  <a class="anchor" href="#%e5%ae%9f%e8%a1%8c%e7%b5%90%e6%9e%9c">#</a>
</h3>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-txt" data-lang="txt"><span style="display:flex;"><span>$ qrcode-txt.sh &#34;https://d3.haro.jp/&#34;
</span></span><span style="display:flex;"><span>qr_matrix = [
</span></span><span style="display:flex;"><span>  [1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1],
</span></span><span style="display:flex;"><span>  [1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,1,0,0,1,1,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,1],
</span></span><span style="display:flex;"><span>  [1,1,0,0,1,1,1,1,1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,1,1,1,1,1,0,0,1,1],
</span></span><span style="display:flex;"><span>  [1,1,0,0,1,1,1,1,1,1,0,0,1,1,0,0,1,1,1,1,1,1,0,0,1,1,1,1,0,0,0,0,0,0,0,0,1,1,0,0,1,1,1,1,1,1,0,0,1,1],
</span></span><span style="display:flex;"><span>  [1,1,0,0,1,1,1,1,1,1,0,0,1,1,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,1,1,0,0,1,1,0,0,1,1,1,1,1,1,0,0,1,1],
</span></span><span style="display:flex;"><span>  [1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,1],
</span></span><span style="display:flex;"><span>  [1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1],
</span></span><span style="display:flex;"><span>  [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
</span></span><span style="display:flex;"><span>  [1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0],
</span></span><span style="display:flex;"><span>  [0,0,0,0,0,0,1,1,0,0,1,1,0,0,0,0,0,0,0,0,1,1,0,0,1,1,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0],
</span></span><span style="display:flex;"><span>  [0,0,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,0,0,1,1,0,0,0,0,1,1,1,1,1,1,1,1,0,0,1,1,0,0,0,0,1,1,0,0,1,1,1,1],
</span></span><span style="display:flex;"><span>  [0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,1,1,0,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,1,1,0,0,0,0,0,0,0,0,1,1],
</span></span><span style="display:flex;"><span>  [1,1,1,1,0,0,0,0,0,0,0,0,1,1,0,0,1,1,1,1,1,1,0,0,1,1,0,0,1,1,0,0,0,0,0,0,1,1,0,0,1,1,0,0,1,1,1,1,1,1],
</span></span><span style="display:flex;"><span>  [1,1,1,1,0,0,1,1,1,1,1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,1,0,0,1,1,0,0,1,1,0,0],
</span></span><span style="display:flex;"><span>  [1,1,0,0,0,0,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1,1,0,0,1,1,0,0,1,1,1,1,1,1,0,0,1,1,1,1],
</span></span><span style="display:flex;"><span>  [1,1,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,1,1,0,0,1,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,1,1],
</span></span><span style="display:flex;"><span>  [1,1,0,0,0,0,1,1,1,1,0,0,1,1,1,1,0,0,1,1,1,1,1,1,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,0,0,0,0],
</span></span><span style="display:flex;"><span>  [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,0,1,1,1,1,1,1,0,0,1,1,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0],
</span></span><span style="display:flex;"><span>  [1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,0,0,1,1,0,0,0,0,1,1,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,1,1,1,1],
</span></span><span style="display:flex;"><span>  [1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,0,0,0,0,0,0,1,1,1,1,0,0,1,1,0,0],
</span></span><span style="display:flex;"><span>  [1,1,0,0,1,1,1,1,1,1,0,0,1,1,0,0,1,1,0,0,0,0,0,0,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,0,0,1,1],
</span></span><span style="display:flex;"><span>  [1,1,0,0,1,1,1,1,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1],
</span></span><span style="display:flex;"><span>  [1,1,0,0,1,1,1,1,1,1,0,0,1,1,0,0,1,1,1,1,0,0,1,1,1,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,1,1],
</span></span><span style="display:flex;"><span>  [1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,1,0,0,0,0,1,1,0,0,0,0,1,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,0,0,0,0,1,1],
</span></span><span style="display:flex;"><span>  [1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
</span></span><span style="display:flex;"><span>];
</span></span></code></pre></div>]]></description>
    </item>
    
    <item>
      <title>OpenSCAD と Bambu Studio で多色印刷</title>
      <link>https://d3.haro.jp/docs/2025/openscad_3mf/</link>
      <pubDate>Mon, 11 Aug 2025 11:31:12 +0900</pubDate>
      
      <guid>https://d3.haro.jp/docs/2025/openscad_3mf/</guid>
      <description><![CDATA[ <h1 id="openscad-と-bambu-studio-で多色印刷">
  OpenSCAD と Bambu Studio で多色印刷
  <a class="anchor" href="#openscad-%e3%81%a8-bambu-studio-%e3%81%a7%e5%a4%9a%e8%89%b2%e5%8d%b0%e5%88%b7">#</a>
</h1>
<p>OpenSCAD の color() はあくまでもプレビュー画面での色指定であって、残念ながら Bambu Studio にもっていった時に color() 指定した単位にオブジェクトが分かれたりしないようだ。<br>
でも、少しでも楽に多色指定したいので、ちょっと工夫してみた。これでもうまくいかないケースはありますけどね。</p>
<ol>
<li>OpenSCAD で、color() で色を指定しつつ、各色のオブジェクト群同士が重ならないように配置する
<ul>
<li>重なっていると、Bambu Studio で 1 つのオブジェクトになってしまって、個別にさわれなくなるので</li>
<li>例えば「x 方向に 20mm」シフトしておいて、Bambu Studio 側で -20mm して元に戻す</li>
</ul>
</li>
<li><code>File &gt; Export</code> で、3mf 形式でエクスポート。　STL ではないので注意</li>
<li>Bambu Studio で開く
<ul>
<li>「この 3mf ファイルは Bambu Lab.製ではないため、ジオメトリデータのみを読み込みます。」 とアラートが出るが気にしない</li>
</ul>
</li>
<li>オブジェクトごとに分かれているので<br>
<img src="https://filedn.com/l2luTWp3NzbpjAodhk9Fxpy/openscad_3mf_obj00.png" alt="" />
<ol>
<li>フィラメントを指定する</li>
<li>重ならないようにシフトしていたオブジェクトを元に戻す</li>
</ol>
</li>
<li>オブジェクトごとに分かれていなかった場合は「パーツに分割」してみる<br>
<img src="https://filedn.com/l2luTWp3NzbpjAodhk9Fxpy/openscad_3mf_obj01.png" alt="" /><br>
<img src="https://filedn.com/l2luTWp3NzbpjAodhk9Fxpy/openscad_3mf_obj02.png" alt="" /></li>
</ol>
<p>ちなみに .3mf は必要なファイル群を zip で固めたものなので、xml マイスターな方は</p>
<ol>
<li>拡張子を .zip にして復元</li>
<li>xml ファイルをなんとかする</li>
<li>zip 圧縮し、拡張子を .3mf</li>
</ol>
<p>という方法もなくはない</p>
]]></description>
    </item>
    
    <item>
      <title>CotEditor 用の OpenSCAD シンタックス定義</title>
      <link>https://d3.haro.jp/docs/2025/coteditor-syntax-for-openscad/</link>
      <pubDate>Sat, 09 Aug 2025 13:53:36 +0900</pubDate>
      
      <guid>https://d3.haro.jp/docs/2025/coteditor-syntax-for-openscad/</guid>
      <description><![CDATA[ <h1 id="coteditor-用の-openscad-シンタックス定義">
  CotEditor 用の OpenSCAD シンタックス定義
  <a class="anchor" href="#coteditor-%e7%94%a8%e3%81%ae-openscad-%e3%82%b7%e3%83%b3%e3%82%bf%e3%83%83%e3%82%af%e3%82%b9%e5%ae%9a%e7%be%a9">#</a>
</h1>
<p>ドキュメントがあれば、他のエディタ用のを探してコンバートして終わり、とも思ったんだけど、見つからなかった。<br>
ソースコード読む元気もないので、GUI でポチポチ設定。</p>
<p>で、バックアップ用にエクスポートしたら、ソートされてしまって人に優しくなかったので、整えて保存。需要があるかわからんが、せっかくなので公開しておく。</p>
<p>こういう時、生成 AI は便利だね。Gemini に手伝ってもらったらすぐできた。</p>
<p><strong>2026/05 追記:</strong> <a href="https://coteditor.com/news/2026/CotEditor_7.0.0.ja" target="_blank" rel="noopener">CotEditor 7.0 以降、シンタックス定義が変わりました</a>
。このページの内容は 6.x までのもの。7.0 対応版は GitHub におきました。</p>
<p><a href="https://github.com/higemaru/OpenSCAD-coteditor" target="_blank" rel="noopener">https://github.com/higemaru/OpenSCAD-coteditor</a>
</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#75715e"># CotEditor Syntax Definition for OpenSCAD</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># --- 基本情報 ---</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">metadata</span>:
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">name</span>: <span style="color:#ae81ff">OpenSCAD</span>
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">author</span>: <span style="color:#ae81ff">KAWABATA, Kazumichi</span>
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">version</span>: <span style="color:#e6db74">&#39;1.0&#39;</span>
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">description</span>: <span style="color:#ae81ff">Syntax definition for OpenSCAD.</span>
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">lastModified</span>: <span style="color:#e6db74">&#39;2025-08-09&#39;</span>
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">license</span>: <span style="color:#ae81ff">Same as CotEditor</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># --- ファイル関連付け ---</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># .scad ファイルに自動で適用するための設定</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">extensions</span>:
</span></span><span style="display:flex;"><span>- <span style="color:#f92672">keyString</span>: <span style="color:#ae81ff">scad</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># --- コメントの定義 ---</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">commentDelimiters</span>:
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">beginDelimiter</span>: <span style="color:#ae81ff">/*</span>
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">endDelimiter</span>: <span style="color:#e6db74">&#39;*/&#39;</span>
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">inlineDelimiter</span>: <span style="color:#ae81ff">//</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># --- 文字列の定義 ---</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">strings</span>:
</span></span><span style="display:flex;"><span>- <span style="color:#f92672">beginString</span>: <span style="color:#e6db74">&#39;&#34;&#39;</span>
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">endString</span>: <span style="color:#e6db74">&#39;&#34;&#39;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># --- 数値の定義 ---</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">numbers</span>:
</span></span><span style="display:flex;"><span>- <span style="color:#f92672">beginString</span>: <span style="color:#ae81ff">\b-?[0-9]+(\.[0-9]+)?\b</span>
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">regularExpression</span>: <span style="color:#66d9ef">true</span>
</span></span><span style="display:flex;"><span>- <span style="color:#f92672">beginString</span>: <span style="color:#ae81ff">\b-?0[xX][0-9a-fA-F]+(_[0-9a-fA-F]+)*\b</span>
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">description</span>: <span style="color:#ae81ff">hexadecimal</span>
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">regularExpression</span>: <span style="color:#66d9ef">true</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># --- 演算子と記号 ---</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">characters</span>:
</span></span><span style="display:flex;"><span><span style="color:#75715e"># Arithmetic</span>
</span></span><span style="display:flex;"><span>- <span style="color:#f92672">beginString</span>: <span style="color:#e6db74">&#34;+&#34;</span>
</span></span><span style="display:flex;"><span>- <span style="color:#f92672">beginString</span>: <span style="color:#e6db74">&#34;-&#34;</span>
</span></span><span style="display:flex;"><span>- <span style="color:#f92672">beginString</span>: <span style="color:#e6db74">&#34;*&#34;</span>
</span></span><span style="display:flex;"><span>- <span style="color:#f92672">beginString</span>: <span style="color:#e6db74">&#34;/&#34;</span>
</span></span><span style="display:flex;"><span>- <span style="color:#f92672">beginString</span>: <span style="color:#e6db74">&#34;%&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># Comparison</span>
</span></span><span style="display:flex;"><span>- <span style="color:#f92672">beginString</span>: <span style="color:#e6db74">&#34;==&#34;</span>
</span></span><span style="display:flex;"><span>- <span style="color:#f92672">beginString</span>: <span style="color:#e6db74">&#34;!=&#34;</span>
</span></span><span style="display:flex;"><span>- <span style="color:#f92672">beginString</span>: <span style="color:#e6db74">&#34;&lt;&#34;</span>
</span></span><span style="display:flex;"><span>- <span style="color:#f92672">beginString</span>: <span style="color:#e6db74">&#34;&gt;&#34;</span>
</span></span><span style="display:flex;"><span>- <span style="color:#f92672">beginString</span>: <span style="color:#e6db74">&#34;&lt;=&#34;</span>
</span></span><span style="display:flex;"><span>- <span style="color:#f92672">beginString</span>: <span style="color:#e6db74">&#34;&gt;=&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># Logical</span>
</span></span><span style="display:flex;"><span>- <span style="color:#f92672">beginString</span>: <span style="color:#e6db74">&#34;&amp;&amp;&#34;</span>
</span></span><span style="display:flex;"><span>- <span style="color:#f92672">beginString</span>: <span style="color:#e6db74">&#34;||&#34;</span>
</span></span><span style="display:flex;"><span>- <span style="color:#f92672">beginString</span>: <span style="color:#e6db74">&#34;!&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># Assignment</span>
</span></span><span style="display:flex;"><span>- <span style="color:#f92672">beginString</span>: <span style="color:#e6db74">&#34;=&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># Ternary</span>
</span></span><span style="display:flex;"><span>- <span style="color:#f92672">beginString</span>: <span style="color:#e6db74">&#34;?&#34;</span>
</span></span><span style="display:flex;"><span>- <span style="color:#f92672">beginString</span>: <span style="color:#e6db74">&#34;:&#34;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># --- キーワードと定数 ---</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">keywords</span>:
</span></span><span style="display:flex;"><span><span style="color:#75715e"># 定数</span>
</span></span><span style="display:flex;"><span>- <span style="color:#f92672">beginString</span>: <span style="color:#e6db74">&#34;true&#34;</span>
</span></span><span style="display:flex;"><span>- <span style="color:#f92672">beginString</span>: <span style="color:#e6db74">&#34;false&#34;</span>
</span></span><span style="display:flex;"><span>- <span style="color:#f92672">beginString</span>: <span style="color:#e6db74">&#34;undef&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># 構造定義</span>
</span></span><span style="display:flex;"><span>- <span style="color:#f92672">beginString</span>: <span style="color:#e6db74">&#34;module&#34;</span>
</span></span><span style="display:flex;"><span>- <span style="color:#f92672">beginString</span>: <span style="color:#e6db74">&#34;function&#34;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># --- コマンド、制御文、関数 ---</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">commands</span>:
</span></span><span style="display:flex;"><span><span style="color:#75715e"># 制御文</span>
</span></span><span style="display:flex;"><span>- <span style="color:#f92672">beginString</span>: <span style="color:#e6db74">&#34;if&#34;</span>
</span></span><span style="display:flex;"><span>- <span style="color:#f92672">beginString</span>: <span style="color:#e6db74">&#34;else&#34;</span>
</span></span><span style="display:flex;"><span>- <span style="color:#f92672">beginString</span>: <span style="color:#e6db74">&#34;for&#34;</span>
</span></span><span style="display:flex;"><span>- <span style="color:#f92672">beginString</span>: <span style="color:#e6db74">&#34;intersection_for&#34;</span>
</span></span><span style="display:flex;"><span>- <span style="color:#f92672">beginString</span>: <span style="color:#e6db74">&#34;let&#34;</span>
</span></span><span style="display:flex;"><span>- <span style="color:#f92672">beginString</span>: <span style="color:#e6db74">&#34;use&#34;</span>
</span></span><span style="display:flex;"><span>- <span style="color:#f92672">beginString</span>: <span style="color:#e6db74">&#34;include&#34;</span>
</span></span><span style="display:flex;"><span>- <span style="color:#f92672">beginString</span>: <span style="color:#e6db74">&#34;import&#34;</span>
</span></span><span style="display:flex;"><span>- <span style="color:#f92672">beginString</span>: <span style="color:#e6db74">&#34;import_dxf&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># 2D/3D Primitives</span>
</span></span><span style="display:flex;"><span>- <span style="color:#f92672">beginString</span>: <span style="color:#e6db74">&#34;circle&#34;</span>
</span></span><span style="display:flex;"><span>- <span style="color:#f92672">beginString</span>: <span style="color:#e6db74">&#34;square&#34;</span>
</span></span><span style="display:flex;"><span>- <span style="color:#f92672">beginString</span>: <span style="color:#e6db74">&#34;polygon&#34;</span>
</span></span><span style="display:flex;"><span>- <span style="color:#f92672">beginString</span>: <span style="color:#e6db74">&#34;text&#34;</span>
</span></span><span style="display:flex;"><span>- <span style="color:#f92672">beginString</span>: <span style="color:#e6db74">&#34;sphere&#34;</span>
</span></span><span style="display:flex;"><span>- <span style="color:#f92672">beginString</span>: <span style="color:#e6db74">&#34;cube&#34;</span>
</span></span><span style="display:flex;"><span>- <span style="color:#f92672">beginString</span>: <span style="color:#e6db74">&#34;cylinder&#34;</span>
</span></span><span style="display:flex;"><span>- <span style="color:#f92672">beginString</span>: <span style="color:#e6db74">&#34;polyhedron&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># Transformations</span>
</span></span><span style="display:flex;"><span>- <span style="color:#f92672">beginString</span>: <span style="color:#e6db74">&#34;translate&#34;</span>
</span></span><span style="display:flex;"><span>- <span style="color:#f92672">beginString</span>: <span style="color:#e6db74">&#34;rotate&#34;</span>
</span></span><span style="display:flex;"><span>- <span style="color:#f92672">beginString</span>: <span style="color:#e6db74">&#34;scale&#34;</span>
</span></span><span style="display:flex;"><span>- <span style="color:#f92672">beginString</span>: <span style="color:#e6db74">&#34;resize&#34;</span>
</span></span><span style="display:flex;"><span>- <span style="color:#f92672">beginString</span>: <span style="color:#e6db74">&#34;mirror&#34;</span>
</span></span><span style="display:flex;"><span>- <span style="color:#f92672">beginString</span>: <span style="color:#e6db74">&#34;multmatrix&#34;</span>
</span></span><span style="display:flex;"><span>- <span style="color:#f92672">beginString</span>: <span style="color:#e6db74">&#34;color&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># Boolean &amp; Other Operations</span>
</span></span><span style="display:flex;"><span>- <span style="color:#f92672">beginString</span>: <span style="color:#e6db74">&#34;union&#34;</span>
</span></span><span style="display:flex;"><span>- <span style="color:#f92672">beginString</span>: <span style="color:#e6db74">&#34;difference&#34;</span>
</span></span><span style="display:flex;"><span>- <span style="color:#f92672">beginString</span>: <span style="color:#e6db74">&#34;intersection&#34;</span>
</span></span><span style="display:flex;"><span>- <span style="color:#f92672">beginString</span>: <span style="color:#e6db74">&#34;offset&#34;</span>
</span></span><span style="display:flex;"><span>- <span style="color:#f92672">beginString</span>: <span style="color:#e6db74">&#34;hull&#34;</span>
</span></span><span style="display:flex;"><span>- <span style="color:#f92672">beginString</span>: <span style="color:#e6db74">&#34;minkowski&#34;</span>
</span></span><span style="display:flex;"><span>- <span style="color:#f92672">beginString</span>: <span style="color:#e6db74">&#34;render&#34;</span>
</span></span><span style="display:flex;"><span>- <span style="color:#f92672">beginString</span>: <span style="color:#e6db74">&#34;surface&#34;</span>
</span></span><span style="display:flex;"><span>- <span style="color:#f92672">beginString</span>: <span style="color:#e6db74">&#34;linear_extrude&#34;</span>
</span></span><span style="display:flex;"><span>- <span style="color:#f92672">beginString</span>: <span style="color:#e6db74">&#34;rotate_extrude&#34;</span>
</span></span><span style="display:flex;"><span>- <span style="color:#f92672">beginString</span>: <span style="color:#e6db74">&#34;projection&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># Built-in Functions</span>
</span></span><span style="display:flex;"><span>- <span style="color:#f92672">beginString</span>: <span style="color:#e6db74">&#34;abs&#34;</span>
</span></span><span style="display:flex;"><span>- <span style="color:#f92672">beginString</span>: <span style="color:#e6db74">&#34;acos&#34;</span>
</span></span><span style="display:flex;"><span>- <span style="color:#f92672">beginString</span>: <span style="color:#e6db74">&#34;asin&#34;</span>
</span></span><span style="display:flex;"><span>- <span style="color:#f92672">beginString</span>: <span style="color:#e6db74">&#34;atan&#34;</span>
</span></span><span style="display:flex;"><span>- <span style="color:#f92672">beginString</span>: <span style="color:#e6db74">&#34;atan2&#34;</span>
</span></span><span style="display:flex;"><span>- <span style="color:#f92672">beginString</span>: <span style="color:#e6db74">&#34;ceil&#34;</span>
</span></span><span style="display:flex;"><span>- <span style="color:#f92672">beginString</span>: <span style="color:#e6db74">&#34;cos&#34;</span>
</span></span><span style="display:flex;"><span>- <span style="color:#f92672">beginString</span>: <span style="color:#e6db74">&#34;sin&#34;</span>
</span></span><span style="display:flex;"><span>- <span style="color:#f92672">beginString</span>: <span style="color:#e6db74">&#34;tan&#34;</span>
</span></span><span style="display:flex;"><span>- <span style="color:#f92672">beginString</span>: <span style="color:#e6db74">&#34;exp&#34;</span>
</span></span><span style="display:flex;"><span>- <span style="color:#f92672">beginString</span>: <span style="color:#e6db74">&#34;ln&#34;</span>
</span></span><span style="display:flex;"><span>- <span style="color:#f92672">beginString</span>: <span style="color:#e6db74">&#34;log&#34;</span>
</span></span><span style="display:flex;"><span>- <span style="color:#f92672">beginString</span>: <span style="color:#e6db74">&#34;pow&#34;</span>
</span></span><span style="display:flex;"><span>- <span style="color:#f92672">beginString</span>: <span style="color:#e6db74">&#34;sqrt&#34;</span>
</span></span><span style="display:flex;"><span>- <span style="color:#f92672">beginString</span>: <span style="color:#e6db74">&#34;round&#34;</span>
</span></span><span style="display:flex;"><span>- <span style="color:#f92672">beginString</span>: <span style="color:#e6db74">&#34;sign&#34;</span>
</span></span><span style="display:flex;"><span>- <span style="color:#f92672">beginString</span>: <span style="color:#e6db74">&#34;floor&#34;</span>
</span></span><span style="display:flex;"><span>- <span style="color:#f92672">beginString</span>: <span style="color:#e6db74">&#34;max&#34;</span>
</span></span><span style="display:flex;"><span>- <span style="color:#f92672">beginString</span>: <span style="color:#e6db74">&#34;min&#34;</span>
</span></span><span style="display:flex;"><span>- <span style="color:#f92672">beginString</span>: <span style="color:#e6db74">&#34;cross&#34;</span>
</span></span><span style="display:flex;"><span>- <span style="color:#f92672">beginString</span>: <span style="color:#e6db74">&#34;norm&#34;</span>
</span></span><span style="display:flex;"><span>- <span style="color:#f92672">beginString</span>: <span style="color:#e6db74">&#34;len&#34;</span>
</span></span><span style="display:flex;"><span>- <span style="color:#f92672">beginString</span>: <span style="color:#e6db74">&#34;concat&#34;</span>
</span></span><span style="display:flex;"><span>- <span style="color:#f92672">beginString</span>: <span style="color:#e6db74">&#34;lookup&#34;</span>
</span></span><span style="display:flex;"><span>- <span style="color:#f92672">beginString</span>: <span style="color:#e6db74">&#34;str&#34;</span>
</span></span><span style="display:flex;"><span>- <span style="color:#f92672">beginString</span>: <span style="color:#e6db74">&#34;chr&#34;</span>
</span></span><span style="display:flex;"><span>- <span style="color:#f92672">beginString</span>: <span style="color:#e6db74">&#34;ord&#34;</span>
</span></span><span style="display:flex;"><span>- <span style="color:#f92672">beginString</span>: <span style="color:#e6db74">&#34;rands&#34;</span>
</span></span><span style="display:flex;"><span>- <span style="color:#f92672">beginString</span>: <span style="color:#e6db74">&#34;version&#34;</span>
</span></span><span style="display:flex;"><span>- <span style="color:#f92672">beginString</span>: <span style="color:#e6db74">&#34;version_num&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># Type Checks</span>
</span></span><span style="display:flex;"><span>- <span style="color:#f92672">beginString</span>: <span style="color:#e6db74">&#34;is_undef&#34;</span>
</span></span><span style="display:flex;"><span>- <span style="color:#f92672">beginString</span>: <span style="color:#e6db74">&#34;is_bool&#34;</span>
</span></span><span style="display:flex;"><span>- <span style="color:#f92672">beginString</span>: <span style="color:#e6db74">&#34;is_num&#34;</span>
</span></span><span style="display:flex;"><span>- <span style="color:#f92672">beginString</span>: <span style="color:#e6db74">&#34;is_string&#34;</span>
</span></span><span style="display:flex;"><span>- <span style="color:#f92672">beginString</span>: <span style="color:#e6db74">&#34;is_list&#34;</span>
</span></span><span style="display:flex;"><span>- <span style="color:#f92672">beginString</span>: <span style="color:#e6db74">&#34;is_function&#34;</span>
</span></span><span style="display:flex;"><span>- <span style="color:#f92672">beginString</span>: <span style="color:#e6db74">&#34;is_object&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># Other</span>
</span></span><span style="display:flex;"><span>- <span style="color:#f92672">beginString</span>: <span style="color:#e6db74">&#34;assert&#34;</span>
</span></span><span style="display:flex;"><span>- <span style="color:#f92672">beginString</span>: <span style="color:#e6db74">&#34;echo&#34;</span>
</span></span><span style="display:flex;"><span>- <span style="color:#f92672">beginString</span>: <span style="color:#e6db74">&#34;children&#34;</span>
</span></span><span style="display:flex;"><span>- <span style="color:#f92672">beginString</span>: <span style="color:#e6db74">&#34;parent_module&#34;</span>
</span></span><span style="display:flex;"><span>- <span style="color:#f92672">beginString</span>: <span style="color:#e6db74">&#34;search&#34;</span>
</span></span><span style="display:flex;"><span>- <span style="color:#f92672">beginString</span>: <span style="color:#e6db74">&#34;fontmetrics&#34;</span>
</span></span><span style="display:flex;"><span>- <span style="color:#f92672">beginString</span>: <span style="color:#e6db74">&#34;textmetrics&#34;</span>
</span></span><span style="display:flex;"><span>- <span style="color:#f92672">beginString</span>: <span style="color:#e6db74">&#34;fill&#34;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># --- 変数 ---</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">variables</span>:
</span></span><span style="display:flex;"><span>- <span style="color:#f92672">beginString</span>: <span style="color:#ae81ff">\$[a-zA-Z0-9_]+</span>
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">regularExpression</span>: <span style="color:#66d9ef">true</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># --- コメント内の特別キーワード (TODOなど) ---</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">attributes</span>:
</span></span><span style="display:flex;"><span>- <span style="color:#f92672">beginString</span>: <span style="color:#e6db74">&#34;(TODO|FIXME|XXX):?&#34;</span>
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">regularExpression</span>: <span style="color:#66d9ef">true</span>
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">description</span>: <span style="color:#ae81ff">Keywords that want to highlight in comments. Not working.</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># --- アウトラインメニューの定義 ---</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">outlineMenu</span>:
</span></span><span style="display:flex;"><span>- <span style="color:#f92672">beginString</span>: <span style="color:#ae81ff">^([\t ]*)(module|function)([^{]*)\{</span>
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">description</span>: <span style="color:#ae81ff">module / function</span>
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">display</span>: <span style="color:#e6db74">&#34;$2 ($1)&#34;</span> <span style="color:#75715e"># 例: my_module (module)</span>
</span></span></code></pre></div>]]></description>
    </item>
    
    <item>
      <title>Tweet 2025/07</title>
      <link>https://d3.haro.jp/docs/2025/tweet202507/</link>
      <pubDate>Thu, 31 Jul 2025 23:00:00 +0900</pubDate>
      
      <guid>https://d3.haro.jp/docs/2025/tweet202507/</guid>
      <description><![CDATA[ <h1 id="tweet-202507">
  Tweet 2025/07
  <a class="anchor" href="#tweet-202507">#</a>
</h1>
<p><br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
</p>
]]></description>
    </item>
    
    <item>
      <title>Tweet 2025/06</title>
      <link>https://d3.haro.jp/docs/2025/tweet202506/</link>
      <pubDate>Mon, 30 Jun 2025 18:13:00 +0900</pubDate>
      
      <guid>https://d3.haro.jp/docs/2025/tweet202506/</guid>
      <description><![CDATA[ <h1 id="tweet-202506">
  Tweet 2025/06
  <a class="anchor" href="#tweet-202506">#</a>
</h1>
<p><br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
</p>
]]></description>
    </item>
    
    <item>
      <title>Tweet 2025/05</title>
      <link>https://d3.haro.jp/docs/2025/tweet202505/</link>
      <pubDate>Sat, 31 May 2025 22:57:00 +0900</pubDate>
      
      <guid>https://d3.haro.jp/docs/2025/tweet202505/</guid>
      <description><![CDATA[ <h1 id="tweet-202505">
  Tweet 2025/05
  <a class="anchor" href="#tweet-202505">#</a>
</h1>
<p><br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
</p>
]]></description>
    </item>
    
    <item>
      <title>Tweet 2025/04</title>
      <link>https://d3.haro.jp/docs/2025/tweet202504/</link>
      <pubDate>Wed, 30 Apr 2025 21:46:00 +0900</pubDate>
      
      <guid>https://d3.haro.jp/docs/2025/tweet202504/</guid>
      <description><![CDATA[ <h1 id="tweet-202504">
  Tweet 2025/04
  <a class="anchor" href="#tweet-202504">#</a>
</h1>
<p><br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
</p>
]]></description>
    </item>
    
    <item>
      <title>謎の香りはパン屋から</title>
      <link>https://d3.haro.jp/docs/2025/from_the_bakery/</link>
      <pubDate>Sat, 19 Apr 2025 09:39:36 +0900</pubDate>
      
      <guid>https://d3.haro.jp/docs/2025/from_the_bakery/</guid>
      <description><![CDATA[ <h1 id="謎の香りはパン屋から">
  謎の香りはパン屋から
  <a class="anchor" href="#%e8%ac%8e%e3%81%ae%e9%a6%99%e3%82%8a%e3%81%af%e3%83%91%e3%83%b3%e5%b1%8b%e3%81%8b%e3%82%89">#</a>
</h1>
<p>地元というものの、石橋駅近辺は行動範囲外なので、モデルとなったパン屋とかはわからなかった。カレーパンなら、サニーサイドのサクサクしたカレーパンおいしい。</p>
<p>物騒な事件はなくて穏やかで読みやすかったけど、このミス大賞なので読む前からハードルあがってはいましたね。</p>

<div class="amazon-widget">
  <a href="https://www.amazon.co.jp/gp/product/B0DQP52YFG/?tag=higemaru-22" target="_blank"></a>
  <div class="amazon-widget-img">
    
    <img src="http://images.amazon.com/images/P/B0DQP52YFG.09_SL110_.jpg" />
  </div>
  <div class="amazon-widget-info">
    <span class="amazon-widget-title">
      謎の香りはパン屋から
    </span>
    <span class="amazon-widget-via">
      <img src="https://www.amazon.co.jp/favicon.ico" />
      amazon.co.jp
    </span>
  </div>
</div>


]]></description>
    </item>
    
    <item>
      <title>Tweet 2025/03</title>
      <link>https://d3.haro.jp/docs/2025/tweet202503/</link>
      <pubDate>Mon, 31 Mar 2025 22:09:00 +0900</pubDate>
      
      <guid>https://d3.haro.jp/docs/2025/tweet202503/</guid>
      <description><![CDATA[ <h1 id="tweet-202503">
  Tweet 2025/03
  <a class="anchor" href="#tweet-202503">#</a>
</h1>
<p><br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
</p>
]]></description>
    </item>
    
    <item>
      <title>Tweet 2025/02</title>
      <link>https://d3.haro.jp/docs/2025/tweet202502/</link>
      <pubDate>Thu, 27 Feb 2025 23:01:00 +0900</pubDate>
      
      <guid>https://d3.haro.jp/docs/2025/tweet202502/</guid>
      <description><![CDATA[ <h1 id="tweet-202502">
  Tweet 2025/02
  <a class="anchor" href="#tweet-202502">#</a>
</h1>
<p><br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
</p>
]]></description>
    </item>
    
  </channel>
</rss>
