<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Xrandr on K-Life Hack | システムアーキテクチャ &amp; DevOps</title><link>https://klifehack.com/tags/xrandr/</link><description>Recent content in Xrandr on K-Life Hack | システムアーキテクチャ &amp; DevOps</description><generator>Hugo -- gohugo.io</generator><language>ja</language><lastBuildDate>Tue, 25 Aug 2026 10:10:41 +0900</lastBuildDate><atom:link href="https://klifehack.com/tags/xrandr/index.xml" rel="self" type="application/rss+xml"/><item><title>MagicMirror²における自動起動制御と画面回転・タッチ座標系のキャリブレーション</title><link>https://klifehack.com/p/magicmirror-pm2-systemd-xrandr-xinput-setup/</link><pubDate>Tue, 25 Aug 2026 10:10:41 +0900</pubDate><guid>https://klifehack.com/p/magicmirror-pm2-systemd-xrandr-xinput-setup/</guid><description>&lt;p&gt;組み込みディスプレイやスマートミラー基盤の運用において、OS起動時のプロセス自動復旧と画面表示の同期制御は重要です。ネットワークインターフェースが有効化される前にフロントエンドアプリケーションが起動すると、外部RSSフィードやAPIの非同期リクエストが失敗し、描画不良を起こすリスクが存在します。また、液晶パネルを縦置き（Portrait）や上下反転で設置する場合、表示出力（&lt;code&gt;xrandr&lt;/code&gt;）のみを変更してもタッチパネル（&lt;code&gt;xinput&lt;/code&gt;）の入力座標系が同期されず、操作軸が逆転する問題が生じます。&lt;/p&gt;&#10;&lt;p&gt;本稿では、PM2とSystemdを組み合わせた遅延起動シーケンスの設計、ディスプレイの回転設定およびタッチ座標変換行列（Coordinate Transformation Matrix）のキャリブレーション、モジュールコードの改修手順について整理します。&lt;/p&gt;&#10;&lt;h2 id="1-プロセス自動起動とシステムデーモン構成"&gt;1. プロセス自動起動とシステムデーモン構成&#10;&lt;/h2&gt;&lt;p&gt;アプリケーションのプロセス生存確認およびOS再起動時の自動復旧を担保するため、PM2およびSystemdを利用した管理構成を導入します。&lt;/p&gt;&#10;&lt;h3 id="pm2のグローバルインストールと初期化"&gt;PM2のグローバルインストールと初期化&#10;&lt;/h3&gt;&lt;p&gt;Node.js環境下でプロセス管理を行うPM2を導入します。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;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;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo npm install -g pm2&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;PM2をOSのスタートアップデーモンとして登録するため、以下のコマンドを実行して生成されたSystemd登録コマンドを端末で実行します。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;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;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;pm2 startup&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="遅延起動スクリプト-mmsh-の作成"&gt;遅延起動スクリプト (mm.sh) の作成&#10;&lt;/h3&gt;&lt;p&gt;ネットワーク接続が確立される前にアプリケーションが起動するのを防ぐため、バッファ時間を設けた実行スクリプトをユーザーホームディレクトリ配下に作成します。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;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;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cd ~&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;nano mm.sh&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;スクリプトの内部実装は以下の通りです。&lt;code&gt;sleep 10&lt;/code&gt; を配置することでWi-Fi/EthernetのIPアドレス取得完了を待機し、&lt;code&gt;DISPLAY=:0&lt;/code&gt; によってX11セッションの出力先を明示的にバインドします。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;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;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#!/bin/bash&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sleep &lt;span style="color:#ae81ff"&gt;10&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cd ./MagicMirror&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;DISPLAY&lt;span style="color:#f92672"&gt;=&lt;/span&gt;:0 npm start&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;実行権限を付与します。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;chmod +x mm.sh&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="プロセス状態の保存とsystemd制御"&gt;プロセス状態の保存とSystemd制御&#10;&lt;/h3&gt;&lt;p&gt;PM2で起動したプロセス状態を永続化します。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;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;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;pm2 save&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Systemdサービスとして自動起動を有効化・無効化するコマンドは以下の通りです。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;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;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# スタートアップ有効化&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo systemctl enable magicmirror.service&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# スタートアップ無効化&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo systemctl disable magicmirror.service&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="2-ディスプレイ電源制御と構文静的解析"&gt;2. ディスプレイ電源制御と構文静的解析&#10;&lt;/h2&gt;&lt;p&gt;連続稼働を行うサイネージ環境において、OSデフォルトのスクリーンセーバーや省電力ブラックアウトを防止する必要があります。&lt;/p&gt;&#10;&lt;h3 id="スリープ機能の無効化"&gt;スリープ機能の無効化&#10;&lt;/h3&gt;&lt;p&gt;&lt;code&gt;xscreensaver&lt;/code&gt; を導入し、GUI設定画面または構成ファイルよりスクリーンセーバーおよびディスプレイのブランク化機能を「Disable Screen Saver」へ変更します。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;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;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt install xscreensaver&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="設定ファイル-configjs-の構文チェック"&gt;設定ファイル (config.js) の構文チェック&#10;&lt;/h3&gt;&lt;p&gt;&lt;code&gt;config/config.js&lt;/code&gt; の記述ミス（ブラケットの閉じ忘れやカンマの過不足）はランタイムエラーを引き起こします。デプロイ前に静的解析ツール（JSHint等）へソースコードを通し、構文の無謬性を確認します。&lt;/p&gt;&#10;&lt;h2 id="3-xrandrおよびxinputによる表示タッチ座標同期"&gt;3. xrandrおよびxinputによる表示・タッチ座標同期&#10;&lt;/h2&gt;&lt;p&gt;物理ディスプレイの配置変更に伴い、X11の表示出力（&lt;code&gt;xrandr&lt;/code&gt;）とタッチ入力デバイス（&lt;code&gt;xinput&lt;/code&gt;）の座標変換行列を合致させる必要があります。&lt;/p&gt;&#10;&lt;h3 id="標準hdmi出力の回転-xrandr"&gt;標準HDMI出力の回転 (xrandr)&#10;&lt;/h3&gt;&lt;p&gt;&lt;code&gt;HDMI-1&lt;/code&gt; デバイスに対する回転設定のコマンドパラメータです。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;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;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 通常表示 (横置き)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;xrandr --output HDMI-1 --rotate normal&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 左90度回転 (縦置き)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;xrandr --output HDMI-1 --rotate left&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 右90度回転 (縦置き)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;xrandr --output HDMI-1 --rotate right&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 180度反転&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;xrandr --output HDMI-1 --rotate inverted&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="タッチパネル座標系キャリブレーション-xinput"&gt;タッチパネル座標系キャリブレーション (xinput)&#10;&lt;/h3&gt;&lt;p&gt;DSI接続のタッチディスプレイ（例: &lt;code&gt;FT5406 memory based driver&lt;/code&gt;）を使用する場合、画面回転に合わせて &lt;code&gt;Coordinate Transformation Matrix&lt;/code&gt;（3x3行列）を計算・設定する必要があります。&lt;/p&gt;&#10;&lt;h4 id="1-通常配置-normal"&gt;1. 通常配置 (normal)&#10;&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;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;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;xrandr --output DSI-1 --rotate normal&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;xinput --set-prop &lt;span style="color:#e6db74"&gt;&amp;#34;FT5406 memory based driver&amp;#34;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Coordinate Transformation Matrix&amp;#34;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="2-反時計回り90度回転-left"&gt;2. 反時計回り90度回転 (left)&#10;&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;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;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;xrandr --output DSI-1 --rotate left&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;xinput --set-prop &lt;span style="color:#e6db74"&gt;&amp;#34;FT5406 memory based driver&amp;#34;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Coordinate Transformation Matrix&amp;#34;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; -1 &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="3-時計回り90度回転-right"&gt;3. 時計回り90度回転 (right)&#10;&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;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;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;xrandr --output DSI-1 --rotate right&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;xinput --set-prop &lt;span style="color:#e6db74"&gt;&amp;#34;FT5406 memory based driver&amp;#34;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Coordinate Transformation Matrix&amp;#34;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; -1 &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="4-180度上下反転-inverted"&gt;4. 180度上下反転 (inverted)&#10;&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;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;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;xrandr --output DSI-1 --rotate inverted&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;xinput --set-prop &lt;span style="color:#e6db74"&gt;&amp;#34;FT5406 memory based driver&amp;#34;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Coordinate Transformation Matrix&amp;#34;&lt;/span&gt; -1 &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; -1 &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="4-mmm-backgroundslideshow-モジュールのソースコード改修"&gt;4. MMM-BackgroundSlideshow モジュールのソースコード改修&#10;&lt;/h2&gt;&lt;p&gt;背景スライドショーを表示するモジュール &lt;code&gt;MMM-BackgroundSlideshow&lt;/code&gt; において、画面上のヘッダーテキスト（&amp;ldquo;Picture Info&amp;rdquo;）および画像カウント情報（例: &amp;ldquo;1 of 10&amp;rdquo;）を無効化するためのリファクタリング例です。&lt;/p&gt;&#10;&lt;p&gt;対象ファイル: &lt;code&gt;MMM-BackgroundSlideshow.js&lt;/code&gt;&lt;/p&gt;&#10;&lt;h3 id="修正前コード"&gt;修正前コード&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;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;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;case&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;imagecount&amp;#39;&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;imageProps&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;push&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;`&lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;imageIndex&lt;/span&gt;&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt; of &lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;imageList&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;length&lt;/span&gt;&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;`&lt;/span&gt;);&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;break&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;default&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;Log&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;warn&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;prop&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39; is not a valid value for imageInfo. Please check your configuration&amp;#39;&lt;/span&gt;);&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;});&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;innerHTML&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;&amp;lt;header class=&amp;#34;infoDivHeader&amp;#34;&amp;gt;Picture Info&amp;lt;/header&amp;gt;&amp;#39;&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;imageProps&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;forEach&lt;/span&gt;((&lt;span style="color:#a6e22e"&gt;val&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;idx&lt;/span&gt;) &lt;span style="color:#f92672"&gt;=&amp;amp;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;gt&lt;/span&gt;; {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;innerHTML&lt;/span&gt; &lt;span style="color:#f92672"&gt;+=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;val&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;&amp;lt;br/&amp;gt;&amp;#39;&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;});&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="修正後コード"&gt;修正後コード&#10;&lt;/h3&gt;&lt;p&gt;配列への追加処理をコメントアウトし、&lt;code&gt;innerHTML&lt;/code&gt; の初期値を空文字列に置き換えることでUI上の非表示化を実現します。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;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;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;case&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;imagecount&amp;#39;&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// カウント情報の非表示化のため配列挿入を無効化&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// imageProps.push(`${this.imageIndex} of ${this.imageList.length}`);&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;break&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;default&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;Log&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;warn&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;prop&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39; is not a valid value for imageInfo. Please check your configuration&amp;#39;&lt;/span&gt;);&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;});&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// ヘッダーテキストを完全に除去&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;innerHTML&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;&amp;#39;&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;imageProps&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;forEach&lt;/span&gt;((&lt;span style="color:#a6e22e"&gt;val&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;idx&lt;/span&gt;) &lt;span style="color:#f92672"&gt;=&amp;amp;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;gt&lt;/span&gt;; {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;innerHTML&lt;/span&gt; &lt;span style="color:#f92672"&gt;+=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;val&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;&amp;lt;br/&amp;gt;&amp;#39;&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;});&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="5-troubleshooting"&gt;5. Troubleshooting&#10;&lt;/h2&gt;&lt;h3 id="ディスプレイ非バインドによる起動失敗-display-環境変数不備"&gt;ディスプレイ非バインドによる起動失敗 (DISPLAY 環境変数不備)&#10;&lt;/h3&gt;&lt;p&gt;💡 &lt;b&gt;現象&lt;/b&gt;: SystemdやCron経由の起動時に &lt;code&gt;Error: Cannot open display: null&lt;/code&gt; が発生し、Electronウィンドウが立ち上がりません。&lt;/p&gt;&#10;&lt;p&gt;🛠️ &lt;b&gt;原因&lt;/b&gt;: 非対話型シェル環境からプロセスを実行する際、X11ディスプレイ環境変数 &lt;code&gt;$DISPLAY&lt;/code&gt; が定義されていません。&lt;/p&gt;&#10;&lt;p&gt;⚠️ &lt;b&gt;対策&lt;/b&gt;: &lt;code&gt;mm.sh&lt;/code&gt; などの実行スクリプト内部で &lt;code&gt;export DISPLAY=:0&lt;/code&gt; を明示的に宣言してからコマンドを実行します。&lt;/p&gt;&#10;&lt;h3 id="タッチパネルの操作軸ずれ-xinput-行列のミスマッチ"&gt;タッチパネルの操作軸ずれ (xinput 行列のミスマッチ)&#10;&lt;/h3&gt;&lt;p&gt;💡 &lt;b&gt;現象&lt;/b&gt;: 画面表示は縦向きに切り替わっていますが、画面の上部をタッチすると右側にカーソルが移動します。&lt;/p&gt;&#10;&lt;p&gt;🛠️ &lt;b&gt;原因&lt;/b&gt;: &lt;code&gt;xrandr&lt;/code&gt; によるグラフィック出力の回転のみが適用され、入力カーネルドライバー側の変換行列が更新されていません。&lt;/p&gt;&#10;&lt;p&gt;⚠️ &lt;b&gt;対策&lt;/b&gt;: &lt;code&gt;xinput list&lt;/code&gt; でデバイス識別名を確認し、該当回転角に対応する &lt;code&gt;Coordinate Transformation Matrix&lt;/code&gt; パラメータを再適用します。&lt;/p&gt;&#10;&lt;h2 id="6-システム検証ログ-system-verification-logs"&gt;6. システム検証ログ (System Verification Logs)&#10;&lt;/h2&gt;&lt;p&gt;デプロイ後のプロセスの稼働状態、X11ディスプレイの割り当て状態、および入力デバイスのプロパティ整合性を確認したターミナルログ例です。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;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;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ pm2 status&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;┌────┬─────────────────┬─────────────┬─────────┬─────────┬─────────┬────────┬─────┬───────────┬──────────┬──────────┐&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ id │ name │ namespace │ version │ mode │ pid │ uptime │ ↺ │ status │ cpu │ mem │&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;├────┼─────────────────┼─────────────┼─────────┼─────────┼─────────┼────────┼─────┼───────────┼──────────┼──────────┤&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│ 0 │ magicmirror │ default │ 2.25.0 │ fork │ 2104 │ 12m │ 0 │ online │ 1.2% │ 142.5MB │&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;└────┴─────────────────┴─────────────┴─────────┴─────────┴─────────┴────────┴─────┴───────────┴──────────┴──────────┘&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ xrandr --query&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Screen 0: minimum 320 x 200, current 1080 x 1920, maximum 7680 x 7680&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;DSI-1 connected primary 1080x1920+0+0 right (normal left inverted right x axis y axis) 154mm x 85mm&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 1080x1920 60.00*+&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ xinput list-props &amp;#34;FT5406 memory based driver&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Device &amp;#39;FT5406 memory based driver&amp;#39;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;Device Enabled (115):&#9;1&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;Coordinate Transformation Matrix (117):&#9;0.000000, 1.000000, 0.000000, -1.000000, 0.000000, 1.000000, 0.000000, 0.000000, 1.000000&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="7-lessons-learned"&gt;7. Lessons Learned&#10;&lt;/h2&gt;&lt;p&gt;組み込みサイネージ環境の安定運用においては、ソフトウェアレイヤー（PM2/Node.js）だけでなく、OSの表示サブシステム（X11/xrandr）および入力デバイスドライバー（xinput）の相互依存関係を包括的に把握することが重要です。特にスタートアップ時にネットワークとディスプレイサーバーが完全に準備されるまでの時間的タイミング（Race Condition）を設計段階で考慮することにより、フィールドデプロイ後の不要な再起動トラブルを大幅に抑止できます。&lt;/p&gt;&#10;</description></item></channel></rss>