<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Blog</title><link>https://blog.wtnqk.org/</link><description>Recent content on Blog</description><generator>Hugo -- gohugo.io</generator><language>ja</language><lastBuildDate>Sat, 24 Jan 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://blog.wtnqk.org/index.xml" rel="self" type="application/rss+xml"/><item><title>ftdv紹介</title><link>https://blog.wtnqk.org/posts/2026-01-28/</link><pubDate>Sat, 24 Jan 2026 00:00:00 +0000</pubDate><guid>https://blog.wtnqk.org/posts/2026-01-28/</guid><description>&lt;p&gt;以前自分がせっせこ作っていたTUIツールになります。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;サイト&lt;/th&gt;
&lt;th&gt;URL&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;GitHub&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/wtnqk/ftdv"&gt;https://github.com/wtnqk/ftdv&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;crates.io&lt;/td&gt;
&lt;td&gt;&lt;a href="https://crates.io/crates/ftdv"&gt;https://crates.io/crates/ftdv&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;ftdv (File Tree Diff Viewer) は、&lt;a href="https://github.com/dlvhdr/diffnav"&gt;diffnav&lt;/a&gt; と &lt;a href="https://github.com/jesseduffield/lazygit"&gt;lazygit&lt;/a&gt; にインスパイアされたターミナルベースのdiffビューアで、Rustの &lt;a href="https://github.com/ratatui-org/ratatui"&gt;ratatui&lt;/a&gt; で構築されています。
diffnavの直感的なファイルナビゲーションとlazygitの柔軟なdiffツール設定システムを組み合わせ、delta、bat、ydiff、difftasticなどの様々なdiffツールをサポートするgit diffの対話的なインターフェースを提供します。&lt;/p&gt;
&lt;h2 id="概要"&gt;概要&lt;/h2&gt;
&lt;p&gt;![image][461091774-43ab0c27-0764-4342-a049-fb4930463811.png]&lt;/p&gt;
&lt;h2 id="設計思想"&gt;設計思想&lt;/h2&gt;
&lt;p&gt;ftdvは、対話的なgit統合に焦点を当てたモダンなTUI diffページャーです：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;直接的なgit統合&lt;/strong&gt;: gitオペレーションのネイティブサポート（&lt;code&gt;ftdv branch1 branch2&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ファイル単位のdiff&lt;/strong&gt;: 選択されたファイルごとに新しいdiffコンテンツ&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;外部ツール統合&lt;/strong&gt;: delta、difftastic、bat、ydiffなどの柔軟な設定&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;対話的なナビゲーション&lt;/strong&gt;: 永続的な状態を持つファイルツリーインターフェース&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="機能"&gt;機能&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;ディレクトリ折りたたみ機能を持つ対話的なファイルツリーナビゲーション（diffnavにインスパイア）&lt;/li&gt;
&lt;li&gt;テンプレート変数を使用した柔軟なdiffツール設定（lazygitにインスパイア）&lt;/li&gt;
&lt;li&gt;複数のdiffツールのサポート：delta、bat、ydiff、difftasticなど&lt;/li&gt;
&lt;li&gt;ANSIカラーサポート - カラー出力を自動的に検出してレンダリング&lt;/li&gt;
&lt;li&gt;レビュー済みファイルをマークするチェックボックス機能（レビュー追跡）&lt;/li&gt;
&lt;li&gt;チェック済みファイルの永続的な状態管理&lt;/li&gt;
&lt;li&gt;リアルタイムフィルタリング付き検索機能&lt;/li&gt;
&lt;li&gt;Vimスタイルのキーボードナビゲーション&lt;/li&gt;
&lt;li&gt;カスタマイズ可能なテーマとカラー&lt;/li&gt;
&lt;li&gt;直接的なファイル/ディレクトリ比較サポート&lt;/li&gt;
&lt;li&gt;複数の操作モードを持つGit統合&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="インストール"&gt;インストール&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# crates.ioからインストール&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cargo install ftdv
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# またはソースからクローンしてビルド&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git clone https://github.com/wtnqk/ftdv.git
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; ftdv
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cargo install --path .
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="使い方"&gt;使い方&lt;/h2&gt;
&lt;h3 id="基本コマンド"&gt;基本コマンド&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 作業ディレクトリの変更を表示（デフォルト）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ftdv
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ステージされた変更を表示&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ftdv --cached
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 特定のコミット/ブランチと比較&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ftdv main
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 2つのコミット/ブランチを比較&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ftdv main feature-branch
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 2つのファイルを比較&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ftdv file1.txt file2.txt
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 2つのディレクトリを比較&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ftdv dir1/ dir2/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# シェル補完を生成&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ftdv completions bash &amp;gt; ftdv.bash
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="キーボードショートカット"&gt;キーボードショートカット&lt;/h3&gt;
&lt;h4 id="ナビゲーション"&gt;ナビゲーション&lt;/h4&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;キー&lt;/th&gt;
&lt;th&gt;アクション&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;j&lt;/code&gt; / &lt;code&gt;↓&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;ファイルリストで下に移動&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;k&lt;/code&gt; / &lt;code&gt;↑&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;ファイルリストで上に移動&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;g&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;ファイルリストの最上部へジャンプ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;G&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;ファイルリストの最下部へジャンプ&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 id="diffコンテンツスクロール"&gt;Diffコンテンツスクロール&lt;/h4&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;キー&lt;/th&gt;
&lt;th&gt;アクション&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;h&lt;/code&gt; / &lt;code&gt;←&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;diff左スクロール（5文字）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;l&lt;/code&gt; / &lt;code&gt;→&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;diff右スクロール（5文字）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;H&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;diff左スクロール（20文字）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;L&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;diff右スクロール（20文字）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;e&lt;/code&gt; / &lt;code&gt;J&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;diff下スクロール（1行）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;y&lt;/code&gt; / &lt;code&gt;K&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;diff上スクロール（1行）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;d&lt;/code&gt; / &lt;code&gt;PageDown&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;diff下スクロール（10行）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;u&lt;/code&gt; / &lt;code&gt;PageUp&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;diff上スクロール（10行）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;f&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;diff下スクロール（20行）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;b&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;diff上スクロール（20行）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 id="ファイル操作"&gt;ファイル操作&lt;/h4&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;キー&lt;/th&gt;
&lt;th&gt;アクション&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Enter&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;ディレクトリの展開/折りたたみ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Space&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;diffコンテンツの更新&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Tab&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;ファイルチェックボックスの切替&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 id="検索"&gt;検索&lt;/h4&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;キー&lt;/th&gt;
&lt;th&gt;アクション&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;検索モードに入る&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Enter&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;検索確定（検索中）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Esc&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;検索モードを終了&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Backspace&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;文字を削除（検索中）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 id="アプリケーション"&gt;アプリケーション&lt;/h4&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;キー&lt;/th&gt;
&lt;th&gt;アクション&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;q&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;アプリケーションを終了&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Esc&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;アプリケーションを終了（検索中でない場合）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="設定"&gt;設定&lt;/h2&gt;
&lt;p&gt;ftdvは &lt;code&gt;~/.config/ftdv/config.yaml&lt;/code&gt; にあるYAML設定ファイルを使用します。&lt;/p&gt;</description></item><item><title>webassemblyで画像フィルタをつくる</title><link>https://blog.wtnqk.org/posts/2026-01-19/</link><pubDate>Mon, 19 Jan 2026 00:00:00 +0000</pubDate><guid>https://blog.wtnqk.org/posts/2026-01-19/</guid><description>&lt;p&gt;この記事は以前企業ブログに寄稿したものとなります&lt;/p&gt;
&lt;h2 id="リンク"&gt;&lt;a href="https://tec.tecotec.co.jp/entry/2025/12/03/000000"&gt;リンク&lt;/a&gt;&lt;/h2&gt;
&lt;h1 id="1-webassemblyとは何か"&gt;1. WebAssemblyとは何か&lt;/h1&gt;
&lt;p&gt;── WASMがなぜ使われるのか、どこが嬉しいのか&lt;/p&gt;
&lt;p&gt;WebAssembly（WASM）はもう珍しい技術ではなく、すでに&lt;strong&gt;普段使用している主要Webサービスの裏側で動いています&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Google Meet&lt;/strong&gt;：背景ぼかし・ノイズ除去&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Google Earth Web&lt;/strong&gt;：3D処理のコア&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;「JavaScriptじゃ重い画像処理や数学処理を軽くするための技術」…&lt;br&gt;
として広く紹介されていますが、個人的には&lt;strong&gt;設計の自由度が上がること&lt;/strong&gt;にあると考えています&lt;/p&gt;
&lt;!-- more --&gt;
&lt;p&gt;MDNはWebAssemblyを次のように説明しています：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;“WebAssembly（Wasm）は、ネイティブに近いパフォーマンスで実行されるコンパクトなバイナリフォーマット”&lt;/strong&gt;&lt;br&gt;
— &lt;a href="https://developer.mozilla.org/ja/docs/WebAssembly"&gt;https://developer.mozilla.org/ja/docs/WebAssembly&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;“WebAssembly コードは安全な、サンドボックス化された実行環境で実行される”&lt;/strong&gt;&lt;br&gt;
— &lt;a href="https://developer.mozilla.org/ja/docs/WebAssembly/Concepts"&gt;https://developer.mozilla.org/ja/docs/WebAssembly/Concepts&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;公式仕様書では、以下のように定義されています：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;“WebAssembly defines a portable, efficient and safe low-level bytecode.”&lt;/strong&gt;&lt;br&gt;
— &lt;a href="https://webassembly.github.io/spec/core/intro/introduction.html"&gt;https://webassembly.github.io/spec/core/intro/introduction.html&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;また、内部実行モデルについて：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;“The execution semantics of WebAssembly are defined using a stack machine.”&lt;/strong&gt;&lt;br&gt;
— &lt;a href="https://webassembly.github.io/spec/core/exec/instructions.html"&gt;https://webassembly.github.io/spec/core/exec/instructions.html&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;つまりWebAssemblyは、&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ブラウザで直接実行される&lt;/li&gt;
&lt;li&gt;スタックマシンベースの &lt;strong&gt;仮想命令セット（virtual ISA）&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;安全なサンドボックス上で動く&lt;/li&gt;
&lt;li&gt;コンパクトで高速なバイトコード形式&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;といった特徴を備えた実行環境です&lt;/p&gt;
&lt;hr&gt;
&lt;h1 id="2-wasmで画像フィルタ"&gt;2. WASMで画像フィルタ&lt;/h1&gt;
&lt;p&gt;JS→WASM→JSの流れでCanvasに反映します&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;HTML (UI)
↓
JavaScript (画像読込・Canvas)
↓
WebAssembly (ピクセル処理)
↓
JavaScript (結果描画)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;JavaScriptはUI/Canvasのみ担当し、&lt;br&gt;
&lt;strong&gt;ピクセル処理はWASMが行う&lt;/strong&gt;という責務分離が実現します&lt;/p&gt;</description></item><item><title>tmux学習</title><link>https://blog.wtnqk.org/posts/2026-01-14/</link><pubDate>Wed, 14 Jan 2026 00:00:00 +0000</pubDate><guid>https://blog.wtnqk.org/posts/2026-01-14/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;
&lt;p&gt;開発作業をしていると、複数のターミナルセッションを効率的に管理したいと思うことはありませんか？SSHで作業中に接続が切れて、実行中のプロセスが止まってしまった経験はないでしょうか？&lt;/p&gt;
&lt;p&gt;今回は、そんな悩みを解決してくれるターミナルマルチプレクサ「tmux」の魅力について紹介します。&lt;/p&gt;
&lt;h2 id="tmuxとは"&gt;tmuxとは&lt;/h2&gt;
&lt;p&gt;tmuxは、1つのターミナルで複数のセッションを管理できるターミナルマルチプレクサです。
以下がtmuxの特徴になります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;セッションの永続化&lt;/strong&gt;: デタッチ・アタッチ機能により、ターミナルを閉じても作業を継続可能&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;画面分割&lt;/strong&gt;: 1つの画面を複数のペインに分割して作業効率UP&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SSHセッションの保護&lt;/strong&gt;: 接続が切れても実行中のプロセスは継続&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="なぜtmuxを選ぶのか"&gt;なぜtmuxを選ぶのか&lt;/h2&gt;
&lt;h3 id="設計思想コアは薄く拡張性は高く"&gt;設計思想：「コアは薄く、拡張性は高く」&lt;/h3&gt;
&lt;p&gt;tmuxの最大の魅力は、必要最小限の機能だけを提供し、ユーザーが自由に拡張できる設計にあります。これにより、&lt;strong&gt;&amp;ldquo;for me&amp;quot;な環境&lt;/strong&gt;を自分で作る楽しさを体験できます。&lt;/p&gt;
&lt;h3 id="プロセスとターミナルの分離"&gt;プロセスとターミナルの分離&lt;/h3&gt;
&lt;p&gt;tmuxはクライアント・サーバーアーキテクチャを採用しており、ターミナル（表示）とプロセス（実行）が分離されています。通常のターミナルでは、ターミナルを閉じるとそこで実行中のプロセスも一緒に終了してしまいますが、tmuxではサーバー側でプロセスが動作し続けるため、ターミナルの切断がプロセスに影響しません。&lt;/p&gt;
&lt;p&gt;これが特に活きる場面として：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;バッチ実行中のSSH切断&lt;/strong&gt;: 長時間かかるデプロイやビルドの途中でSSH接続が切れても、プロセスはtmuxサーバー上で動き続ける&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ネットワーク不安定な環境&lt;/strong&gt;: 再接続して&lt;code&gt;tmux attach&lt;/code&gt;するだけで、作業状態がそのまま復元される&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;意図的なデタッチ&lt;/strong&gt;: 重い処理を走らせたまま&lt;code&gt;Ctrl-b d&lt;/code&gt;でデタッチし、別の作業に移れる&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;nohup&lt;/code&gt;や&lt;code&gt;disown&lt;/code&gt; でも同様のことは可能ですが、tmuxなら実行中の出力をいつでも確認でき、対話的な操作も再開できる点が大きな違いです。&lt;/p&gt;
&lt;h3 id="豊富なプラグインエコシステム"&gt;豊富なプラグインエコシステム&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://github.com/tmux-plugins/list"&gt;tmux-plugins&lt;/a&gt;では、数多くのプラグインが公開されています：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;tmux-resurrect&lt;/strong&gt;: セッションの保存・復元&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;tmux-continuum&lt;/strong&gt;: 自動保存機能&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;tmux-yank&lt;/strong&gt;: コピー機能の拡張&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;tmux-fzf&lt;/strong&gt;: fuzzy finderとの連携&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="tmuxの基本概念"&gt;tmuxの基本概念&lt;/h2&gt;
&lt;p&gt;tmuxは3つの階層で管理されます：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;セッション
├── ウィンドウ1（タブのような概念）
│ ├── ペイン1
│ └── ペイン2
└── ウィンドウ2
└── ペイン1
&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;セッション&lt;/strong&gt;: プロジェクトごとなどの作業単位&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ウィンドウ&lt;/strong&gt;: ブラウザのタブのような概念&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ペイン&lt;/strong&gt;: 画面分割の単位&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="基本的な使い方"&gt;基本的な使い方&lt;/h2&gt;
&lt;h3 id="セッション管理"&gt;セッション管理&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 新規セッション作成&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;tmux new -s session-name
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# セッション一覧&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;tmux ls
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# セッションにアタッチ&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;tmux attach -t session-name
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# セッションからデタッチ&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# セッション内で: Ctrl-b d&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="よく使うキーバインド"&gt;よく使うキーバインド&lt;/h3&gt;
&lt;p&gt;デフォルトのプレフィックスキーは &lt;code&gt;Ctrl-b&lt;/code&gt; です：&lt;/p&gt;</description></item><item><title>このブログの構成</title><link>https://blog.wtnqk.org/posts/2026-01-05/</link><pubDate>Mon, 05 Jan 2026 00:00:00 +0000</pubDate><guid>https://blog.wtnqk.org/posts/2026-01-05/</guid><description>&lt;p&gt;このブログの技術構成についてまとめる。&lt;/p&gt;
&lt;h2 id="概要"&gt;概要&lt;/h2&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Obsidian (執筆)
↓
Hugo (ビルド)
↓
GitHub Actions (CI/CD)
↓
Cloudflare Pages (ホスティング)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;インフラ管理にはTerraformを使用している。&lt;/p&gt;
&lt;h2 id="静的サイトジェネレーター-hugo"&gt;静的サイトジェネレーター: Hugo&lt;/h2&gt;
&lt;p&gt;静的サイトジェネレーターとして &lt;a href="https://gohugo.io/"&gt;Hugo&lt;/a&gt; を採用した。&lt;/p&gt;
&lt;p&gt;選定理由:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Go製のシングルバイナリで依存関係が少ない&lt;/li&gt;
&lt;li&gt;テーマが豊富&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;テーマは &lt;a href="https://github.com/hugo-sid/hugo-blog-awesome"&gt;hugo-blog-awesome&lt;/a&gt; を使用。ミニマルでかっこいい、ダークモード対応。&lt;/p&gt;
&lt;h2 id="記事管理-obsidian"&gt;記事管理: Obsidian&lt;/h2&gt;
&lt;p&gt;記事の執筆・管理には &lt;a href="https://obsidian.md/"&gt;Obsidian&lt;/a&gt; を使用している。&lt;/p&gt;
&lt;p&gt;&lt;img src="Screenshot%202026-01-05%20at%2021.55.31.png" alt="Obsidianでの執筆画面"&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;content/posts&lt;/code&gt; ディレクトリをObsidian Vaultとして開くことで、Markdownエディタとして活用できる。Obsidianの利点:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Markdownのプレビューがリアルタイム&lt;/li&gt;
&lt;li&gt;内部リンクやバックリンクで記事間の関連を把握できる&lt;/li&gt;
&lt;li&gt;プラグインで機能拡張可能&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="記事のディレクトリ構成"&gt;記事のディレクトリ構成&lt;/h3&gt;
&lt;p&gt;各記事は独立したディレクトリとして管理する。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;content/posts/
├── .obsidian/ # Obsidian設定
├── 2026-01-05/
│ ├── index.md # 記事本体
│ └── image.png # 記事に使う画像
└── 2026-01-06/
└── index.md
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;簡素だがこのようなMakefileを用意した&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-Bash" data-lang="Bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;post: &lt;span class="c1"&gt;## Create new post (usage: make post)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; @if &lt;span class="o"&gt;[&lt;/span&gt; -z &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;TITLE&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Usage: make post&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nb"&gt;exit&lt;/span&gt; 1&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; @DIR&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;content/posts/&lt;/span&gt;&lt;span class="nv"&gt;$$&lt;/span&gt;&lt;span class="s2"&gt;(date +%Y-%m-%d)&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; mkdir -p &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$$&lt;/span&gt;&lt;span class="s2"&gt;DIR&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; hugo new &lt;span class="s2"&gt;&amp;#34;posts/&lt;/span&gt;&lt;span class="nv"&gt;$$&lt;/span&gt;&lt;span class="s2"&gt;(date +%Y-%m-%d)/index.md&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Created: &lt;/span&gt;&lt;span class="nv"&gt;$$&lt;/span&gt;&lt;span class="s2"&gt;DIR/index.md&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;この構成により:&lt;/p&gt;</description></item></channel></rss>