<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>THINKING MEGANE</title><link>https://blog.monochromegane.com/</link><description>Recent content on THINKING MEGANE</description><generator>Hugo -- gohugo.io</generator><language>ja-jp</language><lastBuildDate>Sun, 11 Jan 2026 11:47:04 +0900</lastBuildDate><atom:link href="/" rel="self" type="application/rss+xml"/><item><title>tmuxのpopupを使ってターミナル画面でClaude Codeと棲み分ける</title><link>https://blog.monochromegane.com/blog/2026/01/11/popup/</link><pubDate>Sun, 11 Jan 2026 11:47:04 +0900</pubDate><guid>https://blog.monochromegane.com/blog/2026/01/11/popup/</guid><description>&lt;p&gt;Claude CodeをはじめとするCLI型のコーディングエージェントはターミナル画面中の一定領域を占有します。&lt;/p&gt;
&lt;p&gt;元々自分は、ターミナルマルチプレクサであるtmuxを利用していて、リポジトリをプロジェクトとみなし、一つのウィンドウを対応させ、その中でペインを分ける構成をとっていました。
その配置と各ペインのサイズのなかで、エージェントの入る余地はなく、どうしてもペイン内で共有させるか、異なるウィンドウを割り当てる必要がありました。
しかしながら、役割を共有させたペインの裏側や異なるウィンドウに散らばったエージェントのセッションを探し回るのは非常に面倒に感じていました。&lt;/p&gt;
&lt;p&gt;そんな中、以下のtmux popupの活用記事がしっくりきたので、参考にさせてもらいました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://qiita.com/hanlio/items/432ed4065073a2e6196a"&gt;【Tmux】Claude Code を popup で快適に使う&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://zenn.dev/skanehira/articles/2020-10-25-tmux-toggle-popup"&gt;tmuxのpopupが便利&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="利用の様子"&gt;利用の様子&lt;/h2&gt;
&lt;p&gt;&lt;img src="https://blog.monochromegane.com/images/2026/01/popup.png" alt="Popup"&gt;&lt;/p&gt;
&lt;p&gt;画面の中央の前面領域がtmux popupでClaude Codeを動かしている箇所です。
このpopupの表示・非表示を指定したキーバインドで瞬時にトグルできる体験が非常に良いです。
トグルの様子は、上記の記事のデモが分かりやすいのでぜひご覧いただきたいです。&lt;/p&gt;
&lt;p&gt;特に、tmuxのセッションのdetachとattachを行うため、popupを隠しても処理が継続され、ターミナル領域をお気に入りの配置のままコードの確認などが快適に行えるのが非常に有用です。
また、以下の設定で見ていただける通り、tmux側のpopupやキーバインドを使うため、操作中のClaude Codeに干渉しない点もポイントが高いです。&lt;/p&gt;
&lt;p&gt;（余談ですが&lt;code&gt;IS_DEMO&lt;/code&gt;環境変数をつけてClaude Codeを起動すると組織名やメールアドレスが非表示になってこういうスクリーンショットの時に便利です）&lt;/p&gt;
&lt;h2 id="実際の設定"&gt;実際の設定&lt;/h2&gt;
&lt;p&gt;上記の記事はfishだったのでzshで使うために以下のようにしました。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;functions/_tmuxpopup&lt;/code&gt;でカレントディレクトリ（リポジトリ名）をベースにセッション名を組み立て、セッションがなければ作成、あればattachとdetachをトグルできるようにしています。
セッション名の組み立てのところを自分の環境に合わせると使いまわせると思います。&lt;/p&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;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; _tmuxpopup&lt;span style="color:#f92672"&gt;()&lt;/span&gt; &lt;span style="color:#f92672"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; local initial_cmd&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;1&lt;span style="color:#66d9ef"&gt;:-&lt;/span&gt;&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; local title&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;2&lt;span style="color:#66d9ef"&gt;:-&lt;/span&gt;&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; local width&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;80%&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; local height&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;80%&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; local session
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; session&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;tmux display-message -p -F &lt;span style="color:#e6db74"&gt;&amp;#39;#{session_name}&amp;#39;&lt;/span&gt; 2&amp;gt;/dev/null&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;||&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; local pane_path
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; pane_path&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;tmux display-message -p -F &lt;span style="color:#e6db74"&gt;&amp;#39;#{pane_current_path}&amp;#39;&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;||&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; local home_src&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;HOME&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;/src&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; local key&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; &lt;span style="color:#f92672"&gt;[[&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$pane_path&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#e6db74"&gt;${&lt;/span&gt;home_src&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;/*/*/*&lt;span style="color:#f92672"&gt;(&lt;/span&gt;|/*&lt;span style="color:#f92672"&gt;)&lt;/span&gt; &lt;span style="color:#f92672"&gt;]]&lt;/span&gt;; &lt;span style="color:#66d9ef"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; local rest&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;pane_path#&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;home_src&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;/&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; local parts&lt;span style="color:#f92672"&gt;=(&lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;(s:/:)rest&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; local org&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;parts[2]&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; local repo&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;parts[3]&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; repo&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;repo%-wt&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; key&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;org&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;/&lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;repo&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; key&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;pane_path:t&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; local safe_key&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;key//&lt;span style="color:#ae81ff"&gt;\/&lt;/span&gt;/_&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; safe_key&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;safe_key//[^A-Za-z0-9_.-]/_&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; local popup_session&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;popup_&lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;title&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;_&lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;safe_key&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; &lt;span style="color:#f92672"&gt;[[&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$session&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;==&lt;/span&gt; popup_* &lt;span style="color:#f92672"&gt;]]&lt;/span&gt;; &lt;span style="color:#66d9ef"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; tmux detach-client
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; local exec_cmd
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; &lt;span style="color:#f92672"&gt;[[&lt;/span&gt; -n &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$initial_cmd&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;]]&lt;/span&gt;; &lt;span style="color:#66d9ef"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; exec_cmd&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;tmux attach -t &lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;popup_session&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt; || tmux new -s &lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;popup_session&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt; &amp;#39;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;initial_cmd&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; exec_cmd&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;tmux attach -t &lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;popup_session&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt; || tmux new -s &lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;popup_session&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; tmux display-popup &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -d &lt;span style="color:#e6db74"&gt;&amp;#34;#{pane_current_path}&amp;#34;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -xC -yC &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -w &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$width&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt; -h &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$height&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -T &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$title&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -E &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$exec_cmd&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;上記の関数はpopup時に起動したいコマンドとpopupのタイトルを受け付けられる共通関数なので、Claude Codeを立ち上げるため具体的な実装を&lt;code&gt;functions/_tmuxpopup-claude&lt;/code&gt;に記述しました。&lt;/p&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;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; _tmuxpopup-claude&lt;span style="color:#f92672"&gt;()&lt;/span&gt; &lt;span style="color:#f92672"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; _tmuxpopup &lt;span style="color:#e6db74"&gt;&amp;#34;claude&amp;#34;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;claude&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;上記の関数たちを&lt;code&gt;.zshrc&lt;/code&gt;でautoloadしておきます。これでこの関数がいつでも呼び出せるようになります。&lt;/p&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;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;autoload -Uz _tmuxpopup
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;autoload -Uz _tmuxpopup-claude
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;実際の呼び出しはコマンドではなく&lt;code&gt;tmux.conf&lt;/code&gt;にキーバインドとして登録しておきます。こうすることで、popup内のClaude Code起動中でもpopupをいつでも隠すことができます。&lt;/p&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;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;bind , run-shell &lt;span style="color:#e6db74"&gt;&amp;#39;zsh -ic &amp;#34;_tmuxpopup-claude&amp;#34;&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;これでprefix + &amp;lsquo;,&amp;lsquo;でpopupをトグルできるようになりました。非常に快適です。&lt;/p&gt;
&lt;h2 id="並列実行"&gt;並列実行&lt;/h2&gt;
&lt;p&gt;これだけだと再紹介にしかならないので、並列実行のために試しているものも紹介しておきます。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/kbwo/ccmanager"&gt;ccmanager&lt;/a&gt;はClaude Codeをはじめとするコーディングエージェントの並列実行を管理するためのツールです。
エージェント単位でgit worktreeを割り当てることができるので、並列実行時のコンフリクトなども回避することができます。&lt;/p&gt;
&lt;p&gt;上で紹介した&lt;code&gt;_tmuxpopup&lt;/code&gt;は起動したいコマンドを差し替えるだけで使えるのでccmanagerを呼ぶようにするだけで良いです。&lt;/p&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;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; _tmuxpopup-ccmanager&lt;span style="color:#f92672"&gt;()&lt;/span&gt; &lt;span style="color:#f92672"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; _tmuxpopup &lt;span style="color:#e6db74"&gt;&amp;#34;ccmanager&amp;#34;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;ccmanager&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;これでプロジェクトごとの並列実行はかなり便利になりますが、いわゆる承認疲れの現象が発生するため、ある程度の権限を持たせた上で安全に実行したくなります。
そこで、Dev Containerと組み合わせます。
幸い、ccmanagerはDev Containerの利用も視野に入れているようで、探すと専用のオプションがあります。
それを踏まえて、先の関数を以下のように変更できます。&lt;/p&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;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; _tmuxpopup-ccmanager&lt;span style="color:#f92672"&gt;()&lt;/span&gt; &lt;span style="color:#f92672"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; _tmuxpopup &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;ccmanager --devc-up-command &amp;#34;devcontainer up --docker-path podman --workspace-folder .&amp;#34; --devc-exec-command &amp;#34;devcontainer exec --docker-path podman --workspace-folder .&amp;#34;&amp;#39;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;ccmanager&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;podman&lt;/code&gt;を使う場合のオプションが含まれているので環境に応じて適宜読み替えていただければと思います。
また、予め&lt;a href="https://github.com/devcontainers/cli"&gt;Dev Container CLI&lt;/a&gt;もインストールしておく必要があります。&lt;/p&gt;
&lt;p&gt;これで、プロジェクトのDev Containerの設定（&lt;code&gt;.devcontainer&lt;/code&gt;ディレクトリ）を使ってccmanagerがよしなにやってくれます。
なお、コンテナ内にClaude Codeが含まれる必要があるため、&lt;a href="https://github.com/anthropics/devcontainer-features"&gt;Dev Container Features&lt;/a&gt;などで追加しておくと良いです。&lt;/p&gt;
&lt;p&gt;以下のように設定し、Claude Codeのpopupと使い分けることができます。&lt;/p&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;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;bind . run-shell &lt;span style="color:#e6db74"&gt;&amp;#39;zsh -ic &amp;#34;_tmuxpopup-ccmanager&amp;#34;&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="おわりに"&gt;おわりに&lt;/h2&gt;
&lt;p&gt;tmux popupを使うことでClaude Codeとターミナル領域をうまく棲み分けることができて非常に快適になりました。
しかしながら、並列実行の部分は実はまだ試行錯誤中です。
特に、Dev Container + git worktree + Claude Codeの相性はあまり良くないと思っていて、マウント周りを工夫する必要があり、なかなか全てのリポジトリで気軽に使えてないのが現状です。
また、Dev Containerであれローカルであれ、単純に自分が起点にエージェントとやりとりする構造から逆転させないと目指す並列は近づけないなあとも思っているので、引き続き試行錯誤していきたいと思います。&lt;/p&gt;</description></item><item><title>プロジェクトのスケルトンをテンプレートから展開するstampというCLIツールを作った</title><link>https://blog.monochromegane.com/blog/2026/01/10/stamp/</link><pubDate>Sat, 10 Jan 2026 14:17:46 +0900</pubDate><guid>https://blog.monochromegane.com/blog/2026/01/10/stamp/</guid><description>&lt;p&gt;CLIツールを多く作っていると、最初のコミットまでに機械的に準備する自分なりの一式（利用するコマンドラインパーサーによる初期実装、GitHub Actionの定義、Makefile、ライセンスファイル等々）ができてくるかと思います。
このような一式を予め用意しておくことが、普段通りの開発作法に従ってスムーズに開発を始めるための土台となります。
また、最近では、コーディングエージェントへ依頼する際に、このような一式を揃えて実装時の補助線としてもらう方が、認識が揃うことも多いように感じています。&lt;/p&gt;
&lt;p&gt;自分の場合、この一式の準備には直近のリポジトリからコピーしてくることが多いですが、細々とした置換などが面倒でした。
秘蔵スクリプトを持っている方も多いのではないでしょうか。&lt;/p&gt;
&lt;p&gt;このようなニーズのため、プロジェクトのスケルトンを管理するツールが開発されています（&lt;a href="https://github.com/copier-org/copier"&gt;copier&lt;/a&gt;などがあるようです）。
一方で、これらのツールはテンプレートの適用後の継続的な同期まで面倒を見るために、プロジェクト開始時に一度展開できれば良いという自分のユースケースに対しては機能的に持て余してしまう印象がありました。&lt;/p&gt;
&lt;p&gt;そこで、自分用に&lt;a href="https://github.com/monochromegane/stamp"&gt;stamp&lt;/a&gt;と言うCLIツールを作りました。&lt;/p&gt;
&lt;p&gt;機能は単純で、予め用意しておいた、テンプレート一式（ツールがスタンプなのでシートと呼んでいます）をディレクトリ構造のままコピーしてくるだけです。
各ファイルはGo言語のテンプレートとして処理されるため、&lt;code&gt;{{.name}}&lt;/code&gt;のような記述に対して、動的な値を設定できます。&lt;/p&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;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# my-appシートにhello.txtを登録（拡張子.stampでテンプレートとして解釈）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ echo &lt;span style="color:#e6db74"&gt;&amp;#34;Hello {{.name}}!&amp;#34;&lt;/span&gt; &amp;gt; &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;stamp config-dir&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;&lt;span style="color:#e6db74"&gt;/sheets/my-app/hello.txt.stamp&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&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;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# my-appシートを適用&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ cd /path/to/workspace
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ stamp -s my-app name&lt;span style="color:#f92672"&gt;=&lt;/span&gt;alice
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&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;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 結果を確認&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ ls
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;hello.txt
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ cat hello.txt
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Hello alice!
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;a href="https://www.chezmoi.io/"&gt;chezmoi&lt;/a&gt;をご存知の方は、これを都度任意のディレクトリへapplyできるものと考えてもらうと想像しやすいかもしれません。&lt;/p&gt;
&lt;h2 id="使用例"&gt;使用例&lt;/h2&gt;
&lt;p&gt;自身の具体的な利用ケースとして、Go言語のCLIのリポジトリを作成するシートを用意しています（というかこのために作った）。
拡張子.stampのファイルに含まれるモジュール名などを作成したいCLIツールの名称等に合わせてコピー時に設定することができます。&lt;/p&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;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ tree &lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;stamp config-dir&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;~/.config/stamp/
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;├── sheets
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│   └── go-cli &lt;span style="color:#75715e"&gt;# go-cliというシート名で配下のディレクトリ構造を管理&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│   ├── bootstrap.sh &lt;span style="color:#75715e"&gt;# go mod tidyやgitのinitial commitなどを行う（後述）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│   ├── cmd &lt;span style="color:#75715e"&gt;# 以下はCLIツールのスケルトンやMakefile、LICENSEなど&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│   │   ├── cli_test.go
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│   │   ├── cli.go.stamp
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│   │   └── version.go
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│   ├── go.mod.stamp
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│   ├── internal
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│   │   └── greet
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│   │   ├── greet_test.go
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│   │   └── greet.go
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│   ├── LICENSE.stamp
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│   ├── main.go.stamp
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│   ├── Makefile.stamp
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;│   └── README.md.stamp
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;└── stamp.yaml &lt;span style="color:#75715e"&gt;# ユーザー名などのデフォルト値を管理（後述）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;以下のように実行すると、テストが通る状態でプロジェクトを開始できます。また、GitHubにpushすれば&lt;a href="https://github.com/Songmu/tagpr"&gt;tagpr&lt;/a&gt;を用いたリリースの設定まで完了した状態になります。&lt;/p&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;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;APPNAME&lt;span style="color:#f92672"&gt;=&lt;/span&gt;sample; &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;mkdir &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$APPNAME&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; cd &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$APPNAME&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; stamp -s go-cli appname&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$APPNAME&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; sh bootstrap.sh
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;興味がある方はこちらを参照ください。シートをさらにchezmoiで管理していますが内容はそのまま確認できます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/monochromegane/dotfiles/commit/56ccfd6dc17e53df25e027b86ba142ba29fcab4a"&gt;Go言語のCLIのリポジトリを作成するテンプレート一式（シート）&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="便利な機能"&gt;便利な機能&lt;/h2&gt;
&lt;p&gt;stampの基本機能はこれだけですが、利用にあたり少し便利な機能ももう少し作っているので軽く紹介します。&lt;/p&gt;
&lt;h3 id="シート登録の支援"&gt;シート登録の支援&lt;/h3&gt;
&lt;p&gt;既存のディレクトリやファイルをシートとして登録するための&lt;code&gt;collect&lt;/code&gt;サブコマンドを用意しています。&lt;/p&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;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# カレントディレクトリを再帰的にテンプレートとして（.stamp拡張子をつけて）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# sampleシートとして登録&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ stamp collect -s sample -t .
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="デフォルト値の指定"&gt;デフォルト値の指定&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;$(stamp config-dir)/stamp.yaml&lt;/code&gt;にシートのテンプレート展開時にデフォルトで指定する値をキーごとに設定しておくことができます。
コマンド実行時に指定があればそちらが優先されます。&lt;/p&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;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;year: &lt;span style="color:#ae81ff"&gt;2026&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;username: monochromegane
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="パラメータ不足チェック機能"&gt;パラメータ不足チェック機能&lt;/h3&gt;
&lt;p&gt;事前にテンプレートに必要なパラメータの値を覚えておいたり覗いて回って思い出すのは時間がかかります。
stampでは、必要なパラメータをうろ覚えのまま実行しても、不足があれば適用前に教えてくれます。どのファイルに何のパラメータが必要かが分かるので、便利です。&lt;/p&gt;
&lt;p&gt;例えば、先ほどのgo-cliでは、stamp.yamlで定義しているデフォルトの値の他に、必ずappnameと言うキーに対して値を与えなければなりませんが、これをせずに実行するとこういうエラーがでます。&lt;/p&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;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# stamp -s go-cli appname=monochromeganeとして呼ぶべき&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ stamp -s go-cli
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Error: stamp failed: missing required template variables:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - appname
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; used in:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - .gitignore.stamp
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - LICENSE.stamp
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - Makefile.stamp
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - README.md.stamp
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - cmd/cli.go.stamp
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - go.mod.stamp
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - main.go.stamp
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Provide missing variables using:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - Command line: stamp -s &amp;lt;sheet&amp;gt; -d &amp;lt;dest&amp;gt; appname&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&amp;lt;value&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - Config file: Create stamp.yaml in sheet or config directory
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="その他"&gt;その他&lt;/h3&gt;
&lt;p&gt;将来シートを増やした際の共通シートが欲しくなることを想定して、複数シートを同時に指定できる機能なども設けています。&lt;/p&gt;
&lt;p&gt;なお、機能をシンプルに保ちたいため、適用後に実施したいスクリプトなどを実行する機能は持たせないことにしました。
ひとまずは、シート中に以下のような&lt;code&gt;bootstrap.sh&lt;/code&gt;などを用意し、stampコマンド実行後に続けて実行する運用にしています。&lt;/p&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;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#!/usr/bin/env sh
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;set -e
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;go mod tidy
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git init
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git add . &lt;span style="color:#e6db74"&gt;&amp;#34;:!./&lt;/span&gt;$0&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git commit -m &lt;span style="color:#e6db74"&gt;&amp;#34;Add project skeleton&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;make test
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;rm -- &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$0&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="おわりに"&gt;おわりに&lt;/h2&gt;
&lt;p&gt;今回のツール実装はClaude Codeに任せ、コマンドラインとしての使い心地の観点からコメントしながら進めました。
ただし、出発点は上述のシート相当のプロジェクト構成を与えた上で実装を開始してもらったため、実装の方向性については想定した範囲に収まりやすかったかなと感じています。&lt;/p&gt;
&lt;p&gt;CLIツール開発の着手時の迅速化のみならず、コーディングエージェントへの実装補助線を与えるという点でも役立つツールかなと思いますので、よければ使ってみてください。&lt;/p&gt;</description></item><item><title>dotfilesを5年ぶりに整備した</title><link>https://blog.monochromegane.com/blog/2026/01/03/dotfiles/</link><pubDate>Sat, 03 Jan 2026 10:21:55 +0900</pubDate><guid>https://blog.monochromegane.com/blog/2026/01/03/dotfiles/</guid><description>&lt;p&gt;なんとdotfilesも5年更新していなかった。
なにかと気忙しいのではあるが、木こりのジレンマに陥らないよう再起動していきたい。&lt;/p&gt;
&lt;p&gt;さて、昨年末にMacbook Proを新調してまっさらな開発環境が手に入ったのに合わせてdotfilesを見直した。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/monochromegane/dotfiles"&gt;monochromegane/dotfiles&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;大きくは以下。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;dotfiles管理を&lt;a href="https://www.chezmoi.io/"&gt;chezmoi&lt;/a&gt;に変更&lt;/li&gt;
&lt;li&gt;開発ツール管理を&lt;a href="https://mise.jdx.dev/"&gt;mise&lt;/a&gt;に変更&lt;/li&gt;
&lt;li&gt;ターミナルエミュレーターを&lt;a href="https://ghostty.org/"&gt;Ghostty&lt;/a&gt;に変更&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;以下、それぞれについて簡単にメモをしておく。&lt;/p&gt;
&lt;h2 id="chezmoi"&gt;chezmoi&lt;/h2&gt;
&lt;p&gt;各ツールの設定などは大幅に変えていないのだが、dotfiles管理には&lt;a href="https://www.chezmoi.io/"&gt;chezmoi&lt;/a&gt;を導入した。
これまで自作インストールスクリプトは、メンテナンスできていなかったし、設定ファイルの変更後のリポジトリへの反映ルールのようなものがなく反映漏れなど生じていたので、これを機にchezmoiの流儀に任せることにした。&lt;/p&gt;
&lt;h3 id="設定ファイル"&gt;設定ファイル&lt;/h3&gt;
&lt;p&gt;既存dotfilesがある場合、ファイルを&lt;code&gt;chezumoi add&lt;/code&gt;していくと、chezmoiの命名規則に沿ったファイル名でリポジトリに加えていくことができる。
命名規則はホームディレクトリ以下のディレクトリもしくはファイル名のそれぞれについて&lt;code&gt;.&lt;/code&gt;を&lt;code&gt;dot_&lt;/code&gt;に置き換えたものになる。
例えば、&lt;code&gt;~/.config/zsh/.zshrc&lt;/code&gt;であれば&lt;code&gt;dot_config/zsh/dot_zshrc&lt;/code&gt;として管理する。&lt;/p&gt;
&lt;p&gt;自分の場合は、このタイミングでXDG Base Directoryに合わせるようにもしたかったのと新しいPCで&lt;code&gt;~&lt;/code&gt;が綺麗だったのもあり、chezmoi側（&lt;code&gt;chezmoi cd&lt;/code&gt;で移動できるリポジトリのclone先。&lt;code&gt;~/.local/share/chezmoi&lt;/code&gt;）で上記の命名に合わせて変更した上で、&lt;code&gt;chezmoi apply&lt;/code&gt;をすることで反映する方法を取った。&lt;/p&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;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ chezmoi init git@github.com:monochromegane/dotfiles.git
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ chezmoi cd
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ mv zshrc dot_config/zsh/dot_zshrc
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;(&lt;/span&gt;snip&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ chezmoi apply
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;今もリポジトリへの反映を忘れないよう基本はchezmoi側で修正してapplyをする運用にしている。&lt;/p&gt;
&lt;p&gt;なお、dotfiles内の実行権限が必要なファイルについてはファイルに属性付与ではなく、&lt;code&gt;bin/executable_git_diff_wrapper&lt;/code&gt;のように命名規則で制御する必要がある。&lt;/p&gt;
&lt;h3 id="インストールスクリプト"&gt;インストールスクリプト&lt;/h3&gt;
&lt;p&gt;chezmoiではインストールスクリプトも管理できる。
dotfilesリポジトリの直下におくこともできるが&lt;code&gt;.chezmoiscripts&lt;/code&gt;という名前のディレクトリを作ると複数スクリプトがあっても整理されるのでこの構成を採用した。&lt;/p&gt;
&lt;p&gt;管理用ツールを導入するからには動作確認の必要な自作スクリプトの役割は最低限にしたかったので、パッケージ管理ツールのインストールのみに抑え、各パッケージのインストールなどはパッケージマネージャーに任せるようにしている。&lt;/p&gt;
&lt;p&gt;具体的には、ツールや開発環境のパッケージ管理のためのHomebrew、miseと、Vim用のミニマルなパッケージ管理である&lt;a href="https://github.com/k-takata/minpac"&gt;minpac&lt;/a&gt;だけをインストールしている。&lt;/p&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;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ chezmoi cd
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ ls .chezmoiscripts
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;run_once_after_01_install-brew.sh run_once_after_03_install-mise.sh
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;run_once_after_02_install-minpac.sh
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;上記のような命名にすることで、apply後に一度だけスクリプトが順番に実行される。&lt;/p&gt;
&lt;h2 id="mise"&gt;mise&lt;/h2&gt;
&lt;p&gt;開発環境やツール類はHomebrewで雑多に入れていたのと、言語ランタイムの&lt;code&gt;*env&lt;/code&gt;系が増えてしまっていたのを整理すべく、&lt;a href="https://mise.jdx.dev/"&gt;mise&lt;/a&gt;に寄せることにした。&lt;/p&gt;
&lt;p&gt;&amp;ldquo;The front-end to your dev env&amp;quot;というコンセプト通り、開発環境構築に関連する多くのことができるのだが、ひとまずは、グローバルに各種言語ランタイムといくつかのツールを入れるようにしている。
ディレクトリごとに&lt;code&gt;mise.toml&lt;/code&gt;を作って利用するツールを使い分けられるのはとても良さそう。&lt;/p&gt;
&lt;p&gt;例えば、このブログで使っている&lt;a href="https://gohugo.io/"&gt;hugo&lt;/a&gt;コマンドなどはブログ用のリポジトリでだけ使えれば良いので&lt;code&gt;mise use go:github.com/gohugoio/hugo@latest&lt;/code&gt;とすれば、そのディレクトリ配下では&lt;code&gt;~/.local/share/mise/installs/go-github-com-gohugoio-hugo/0.154.2/bin/hugo&lt;/code&gt;がPATH環境変数に追加されてコマンドが認識される状態になる。&lt;/p&gt;
&lt;p&gt;なお、caskが便利なのもあり、しばらくはBrewfileによるHomebrewと併用していくことになると思う。&lt;/p&gt;
&lt;h2 id="ghostty"&gt;Ghostty&lt;/h2&gt;
&lt;p&gt;長年iTerm2を使っていて特に不満はなかったが、chezmoi導入にあたって設定をファイルで管理したくなり、Ghosttyを使ってみることにした。&lt;/p&gt;
&lt;p&gt;&amp;ldquo;Zero Configuration Philosophy&amp;quot;を謳っているだけあり、以下の設定で十分、動作も軽快で特に問題なく利用できている。念の為iTerm2もまだ入れているがこのまま乗り換えで良さそう。&lt;/p&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;"&gt;&lt;code class="language-txt" data-lang="txt"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;command = /opt/homebrew/bin/zsh -l
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;mouse-hide-while-typing = true
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;# Theme
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;theme = Dracula+
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;background = #0f1015
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;# Title bar
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;macos-titlebar-proxy-icon = hidden
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;# Font
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;font-family = Moralerspace Neon
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;font-thicken = true
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;font-thicken-strength = 1
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;font-feature = -dlig
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;font-size = 15
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;# Cursor
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;shell-integration-features = no-cursor
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cursor-style = block
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cursor-style-blink = false
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;# TERM
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;term = &amp;#34;xterm-256color&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="フォントとテーマ"&gt;フォントとテーマ&lt;/h3&gt;
&lt;p&gt;せっかくなので、フォントやテーマも変更してみた。&lt;/p&gt;
&lt;p&gt;Ghosttyの標準だと日本語表示が微妙だったので、フォントとして&lt;a href="https://github.com/yuru7/moralerspace"&gt;Moralerspace&lt;/a&gt;を導入し、&lt;code&gt;Neon&lt;/code&gt;を設定し、上記設定にあるように太め大きめにしている。&lt;/p&gt;
&lt;p&gt;また、テーマには、ダーク系のテーマでVim側ともマッチするものとして、&lt;code&gt;Dracula+&lt;/code&gt;テーマを採用した。
&lt;a href="https://draculatheme.com/ghostty"&gt;Dracula Theme for Ghostty&lt;/a&gt;としてもあるが、標準で選択できるようになっている。
Vim側も&lt;a href="https://draculatheme.com/vim"&gt;Dracula Theme for Vim&lt;/a&gt;として公開されているので、minpackで以下のように設定を追加した。&lt;/p&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;"&gt;&lt;code class="language-vimrc" data-lang="vimrc"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;call&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;minpac&lt;/span&gt;#&lt;span style="color:#a6e22e"&gt;add&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;dracula/vim&amp;#39;&lt;/span&gt;, {&lt;span style="color:#e6db74"&gt;&amp;#39;name&amp;#39;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#39;dracula&amp;#39;&lt;/span&gt;})
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;テーマそのままだと背景がグレー寄りで個人的にはややぼやけたように見えてしまうので、Ghostty側で&lt;code&gt;background&lt;/code&gt;を設定し、以下のようにctermbgをNoneにすることでGhostty側の背景色と同じにして統一感を出している。&lt;/p&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;"&gt;&lt;code class="language-vimrc" data-lang="vimrc"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&amp;#34;colorschemeを設定する&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;function&lt;/span&gt;! &lt;span style="color:#a6e22e"&gt;s&lt;/span&gt;:&lt;span style="color:#a6e22e"&gt;customize_dracula_bg&lt;/span&gt;() &lt;span style="color:#a6e22e"&gt;abort&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;highlight&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Normal&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;ctermbg&lt;/span&gt;=&lt;span style="color:#a6e22e"&gt;None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;highlight&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;CursorLine&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;ctermbg&lt;/span&gt;=&lt;span style="color:#a6e22e"&gt;None&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;cterm&lt;/span&gt;=underline
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;endfunction&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;augroup&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;DraculaCustomization&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;autocmd&lt;/span&gt;!
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;autocmd&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;ColorScheme&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;dracula&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;call&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;s&lt;/span&gt;:&lt;span style="color:#a6e22e"&gt;customize_dracula_bg&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;augroup&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;END&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;colorscheme&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;dracula&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;GhosttyでDraculaで、背景色&lt;code&gt;#0f1015&lt;/code&gt;の青みがかった夜空みたいな色でコンセプト的にも統一できてなかなか気に入っている。&lt;/p&gt;
&lt;h2 id="その他"&gt;その他&lt;/h2&gt;
&lt;p&gt;いわゆるコーディングエージェント系の設定も見直していってるが長くなるのでまた次回とする。&lt;/p&gt;
&lt;h2 id="後記的なもの"&gt;後記的なもの&lt;/h2&gt;
&lt;p&gt;昨年、ブログを一本も書いていないことに気づいたのが今日。
年始に『&lt;a href="https://www.kodansha.co.jp/book/products/0000415692"&gt;「書くこと」の哲学　ことばの再履修&lt;/a&gt;』を読みながら、今回の記事のような、やったことや事実ベースの「書きえる」ことすら書かずして、何を書けようという気持ちからブログ再開してみたのであるが、ただ書き出すことの爽快さを思い出せてとても良かった。
気負わずに再開していきたい。&lt;/p&gt;</description></item><item><title>2024</title><link>https://blog.monochromegane.com/blog/2024/12/31/2024/</link><pubDate>Tue, 31 Dec 2024 18:54:15 +0900</pubDate><guid>https://blog.monochromegane.com/blog/2024/12/31/2024/</guid><description>&lt;p&gt;今年は、九州大学大学院システム情報科学府博士後期課程を修了し、博士（情報科学）の学位を授与されたことが、一番のハイライトだった。
指導くださった先生方、ペパボ研究所の皆さんをはじめとする同僚、切磋琢磨した社会人学生の皆さん、そして家族へ、改めて心から感謝したい。&lt;/p&gt;
&lt;p&gt;達成感でいっぱいであるものの、年度中の博士論文執筆と事業への貢献の両立は、想像以上に大変だった。
研究においては元々、事業への貢献も求められるため、自身の専門領域から様々な分析や提案、実装を並行して進めていたが、博士論文の執筆中は、その複雑さと膨大さゆえに脳内のリソースを極限まで使い続ける日々であり、これまで以上に研究と実務の両立の難易度が高かったように思う。
それでも、最後までやり切ることができたことに、今はただ安堵している。
一方で、これらの分析や提案については、伝え方や巻き込む人々の選定をもっと考えることで、より事業成果につなげられたのではないかという反省もある。&lt;/p&gt;
&lt;p&gt;来年は博士として、今の専門性に加え、さらに高い期待が寄せられる立場となるはずである。
不確実で混沌とした課題領域において、比較・体系化・言語化を通じて、誰もがその課題を共有し、迅速かつ効果的な対策を講じられる基盤を整えることが求められる。
このスキルを活かし、事業に携わる人々が互いの専門性を最大限に発揮し、成果につながる環境を作り上げることを目指していきたい。&lt;/p&gt;
&lt;p&gt;振り返れば、多忙の連続であった一年で、正直なところ鮮明な記憶が残っていない。
それでも、この積み重ねや振り返りが今後の糧になると信じ、今後も一歩一歩進んでいきたい。
来年もどうぞよろしくお願いいたします。&lt;/p&gt;
&lt;h1 id="実績"&gt;実績&lt;/h1&gt;
&lt;p&gt;以下、実績を列挙する。&lt;/p&gt;
&lt;h2 id="論文"&gt;論文&lt;/h2&gt;
&lt;p&gt;博論と国際会議論文1本。本数としては少なくなってしまったが博論と並行して国際会議に投稿・発表し、博論の質を向上させることができたのは自身を褒めてあげたい。
来年はより水準の高い会議へも挑戦していきたい。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;三宅 悠介, 多様かつ継続的に変化する環境に適応する情報システム, 九州大学博士学位論文, 2024. &lt;a href="https://speakerdeck.com/monochromegane/thesis-defense-presentation"&gt;[発表資料]&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Yusuke Miyake, Ryuji Watanabe, Tsunenori Mine, &lt;a href="https://ieeexplore.ieee.org/document/10633680"&gt;Online Nonstationary and Nonlinear Bandits with Recursive Weighted Gaussian Process&lt;/a&gt;, The 48th IEEE International Conference on Computers, Software, and Applications (COMPSAC 2024), pp.11-20, Jul 2024. &lt;a href="https://speakerdeck.com/monochromegane/online-nonstationary-and-nonlinear-bandits-with-recursive-weighted-gaussian-process"&gt;[発表資料]&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="国内発表"&gt;国内発表&lt;/h2&gt;
&lt;p&gt;福岡で開催した技術イベントで1回（博論の公聴会を除く）。
来年は全国規模の技術イベントへの復帰を果たしたいところ。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;三宅 悠介 &lt;a href="https://speakerdeck.com/monochromegane/fukuokago20-afa"&gt;Go言語でターミナルフレンドリーなAIコマンド、afaを作った&lt;/a&gt;, &lt;a href="https://fukuokago.connpass.com/event/330951/"&gt;Fukuoka.go#20&lt;/a&gt;, 2024年10月.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="oss"&gt;OSS&lt;/h2&gt;
&lt;p&gt;AIを開発環境に取り込んでいくためのツール群を整えた。来年はもう一歩先の統合を目指したい。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/monochromegane/afa"&gt;AFA - AFA is a terminal-friendly AI command.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/monochromegane/afa-tui"&gt;AFA-TUI - AFA-TUI is a rich Text User Interface for AFA.&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="コミュニティ活動"&gt;コミュニティ活動&lt;/h2&gt;
&lt;p&gt;Fukuoka.goを再開できたのがよかった。いつの間にか10周年だったので来年3月ごろにお祝い的な会も開催を考えている。学会系では、研究会の運営委員を継続している。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://fukuokago.connpass.com/event/330951/"&gt;Fukuoka.go#20&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="ブログ"&gt;ブログ&lt;/h2&gt;
&lt;p&gt;3本。ここ数年に比べると増えた。OSS紹介、思い出、考えのまとめなど雑多な内容だが、博士課程が終わってとにかく思いついたら書くことができているので来年も継続的に書いていきたい。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://blog.monochromegane.com/blog/2024/09/16/afa/"&gt;ターミナルフレンドリーなAIコマンド、afaを作った&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.monochromegane.com/blog/2024/10/05/doctor-information-science/"&gt;ペパボに入って12年が経った。気付けば博士になっていた&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.monochromegane.com/blog/2024/12/23/nakayoku/"&gt;みんなと仲良くすること&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="その他"&gt;その他&lt;/h2&gt;
&lt;p&gt;研究所で開催した社内向けの勉強会の記事。来年はAI前提を踏まえこれらを事業にどんどん適用していく。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://rand.pepabo.com/article/2024/03/28/ai/"&gt;AIを前提とした体験の実現に向けての勉強会を開催しました&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;国際会議採択のニュースリリース。
来年はプレスリリース目指して頑張りたい。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://pepabo.com/news/information/202404231200/?_gl=1*19uunue*_ga*MTM3Mjc5NzQyMC4xNzEzODUwNzk1*_ga_LER6JRTV8K*MTczNTY1MzAwMS42MC4xLjE3MzU2NTQ4MzcuMC4wLjA.#_ga=2.198738415.1525457293.1735640790-1372797420.1713850795"&gt;ペパボ研究所の論文がIEEEの国際会議「COMPSAC 2024」に採択&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>みんなと仲良くすること</title><link>https://blog.monochromegane.com/blog/2024/12/23/nakayoku/</link><pubDate>Mon, 23 Dec 2024 10:36:20 +0900</pubDate><guid>https://blog.monochromegane.com/blog/2024/12/23/nakayoku/</guid><description>&lt;p&gt;ここ数ヶ月、思うように成果が出なかったことに対するボスからのフィードバックを中心に自分なりに来年の仕事の指針としてまとめておく。&lt;/p&gt;
&lt;p&gt;多くの事業では、環境の変化へ追従するためにプロジェクトの優先順位は目まぐるしく整理・最適化されていく。
また、近年では、データ駆動な意思決定、機械学習やAIのような新しい自動化の導入によって、事業に求められる水準も高度化している。
このような質・量ともに認知負荷の高い状況に対処するため、専門性を高めた分業やチーム体制が出来上がるのは必然である。
しかしながら、例え、各々が目的やビジョンを揃えていたとしても、皆が足並みを揃えて進むことは存外に難しい。
この要因として、分業した専門の観点ごとにゴールまでの過程における課題の内容や具体度が異なることが考えられる。
描く経路が異なれば、当然、足並みが揃うことはない。&lt;/p&gt;
&lt;p&gt;よって、ある程度以上の規模や難易度の仕事を成功させるなら、関わる人々の間での関心度を高めないといけない。
しかし、分業による過程のカプセル化と無関心は紙一重である。
せっかく認知負荷を下げることができたのだから、わざわざ相手の事情を汲むような工程を挟まずに、阿吽の呼吸で足並みを揃えて進んでほしいと思いたくもなる。
それでもやはり、関わる範囲が広範囲だったり内容が高度になるに伴い、表面上の理解や想像による補完では立ち行かなくなってしまう。
だからこそ、互いの専門領域の広さと難しさを前提とし、労力を払って関心を維持することが仕事を成功させるために必要になってくる。&lt;/p&gt;
&lt;p&gt;もちろん、全体としてのコミュニケーションコストを低減させるため、各々の専門領域に照らした道程について、聞き手に応じた表現で過不足なく効率的に伝えることが求められる。
そのために、伝えたいことを抽象的な概念上の枠組みに変換し、効率的に伝えるために図解をはじめとした表現方法を駆使するスキルが求められる。
発信側の労力も抑えるため、この実現にはAIも積極的に活用し、聞き手に応じたバリエーション生成まで即時に行える仕組みも構築したい。
また、関心は関係する人々がそれぞれ双方向に接続されている状態が望ましいが、返報性の原理を期待して、まずは制御可能な自身から関心を維持することを始めるのが良いだろう。&lt;/p&gt;
&lt;p&gt;ペパボで大切にしている三つのことのうち一つに「みんなと仲良くすること」というものがある。
これを表面上の摩擦がない状態と捉えてしまうと無関心に通じてしまうので、仕事の達成を念頭において、伝えるべきことをしっかり伝えるというのが、自身のこれまでの理解であった。
ただ、これも一方向のコミュニケーションに過ぎず、ある種の無関心とも言えるのではないかと考え直したのが今回である。
今後は、仕事を達成するため、もう一段階踏み込んだ「みんなと仲良くすること」を常に意識的に実施していきたい。
そうすることで、無関心による安易な想像に起因する問題を回避したり、問題が生じたとしても、なぜ齟齬が発生しているのかを構造ベースで捉えて建設的に解決に進めることができると思う。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;実際はフィードバックは以下のように端的にまとめてくれていたのだが、自分なりの解釈に落とし込むために書いてみました。これぐらいズバッとまとめられるようになりたい。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.monochromegane.com/images/2024/12/boss.png" alt="feedback"&gt;&lt;/p&gt;</description></item><item><title>ペパボに入って12年が経った。気付けば博士になっていた</title><link>https://blog.monochromegane.com/blog/2024/10/05/doctor-information-science/</link><pubDate>Sat, 05 Oct 2024 09:58:42 +0900</pubDate><guid>https://blog.monochromegane.com/blog/2024/10/05/doctor-information-science/</guid><description>&lt;p&gt;先月、博士（情報科学）の学位を取得した。&lt;/p&gt;
&lt;p&gt;12年前、&lt;code&gt;福岡 おもしろい it 会社&lt;/code&gt;と検索をして、株式会社paperboy&amp;amp;co.（現GMOペパボ株式会社）に運用開発エンジニアとして転職した時&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;からすると、予想だにしなかった状態である。
転機は2017年1月だった。
ペパボで切磋琢磨できる仲間に恵まれ、OSS活動や登壇を通したアウトプット、社内での成果を自負する一方で、社内でもレベルの高いエンジニアとの仕事の機会を通して、自分の限界も感じ始めていた。
そんな折、研究所の所長から研究職への打診があった。
確か、当時進めていたログ活用基盤の構築とその内容の研究所のコンセプトへの親和性からだったように記憶している。
感じていた限界を「コンピュータサイエンス」ってやつや「研究的アプローチ」ってやつで突破できるかもしれない、研究って何もわからないけれども何とかなるだろう、渡りに船だとばかりにこの誘いに乗ることにした。&lt;/p&gt;
&lt;p&gt;結果、丸々二年間、滑稽なぐらい迷走した&lt;sup id="fnref:2"&gt;&lt;a href="#fn:2" class="footnote-ref" role="doc-noteref"&gt;2&lt;/a&gt;&lt;/sup&gt;。
「研究」をするぞと意気込みは空回りし、研究所の同僚からのアドバイスも虚しく、納得する成果を出せずに時間だけが過ぎ、短時間で効果が出るものを求め悪循環が始まった。
元来の己の精神的な弱さ、四十歳前後という年齢特有の焦り、人生最高潮に達したあらゆるものに対する固執が目を曇らせ、足を引っ張った。
長く暗い時期だったが、ほんとうにほんとうにありがたいことに、さまざまな人に支えられ、何度も内省を進めることでかろうじて持ち直していった。
研究所の同僚、エンジニアと研究者が集うWSA研&lt;sup id="fnref:3"&gt;&lt;a href="#fn:3" class="footnote-ref" role="doc-noteref"&gt;3&lt;/a&gt;&lt;/sup&gt;、研究者の先輩方、そして家族には感謝の念が尽きることはない。
それでも距離をおくことを選択した縁もあり、たくさん迷惑をかけてしまった。&lt;/p&gt;
&lt;p&gt;「研究」は難しい。
これは高度という意味での難しさではなく、ソフトウェアによる課題解決とは目的が違うことに起因する難しさについてである。
博士課程を終えて、研究とは「人類が新たに学べる領域を作り出すこと」であると考えるようになった。
すなわち、ソフトウェアによる課題解決は、目的に連なる目標のうちの一つであり、その解決も含めて、新たに学べる状態に仕上げねばならない。
そして、後進が学べる状態であるには、どこがこれまでの方法と異なるのか、どれぐらいの効果があるのか、それらが主張とその裏付けという形で明確に述べられたかといった要件に落とし込まれる。
これは、論文における「新規性」「有用性」「了解性」の観点に対応し、論文を記述する際には、これらの観点を満たすための様々なサーベイやライティング手法を駆使して臨むことになる。
そのような過程を経ることで初めてそのアウトプットは、未来の誰かの手による学べる領域の更なる拡大を支えていくことができる。
落とし穴は、ソフトウェアによる課題解決を目標ではなく目的に据えてしまうことである。
ここに陥ると、課題の解決こそが研究であり、課題解決のみで研究であるためには、大層な水準の課題を解決せねばならないとなりかねない。
自分が最初に躓いたのはここではないかと思う。&lt;/p&gt;
&lt;p&gt;この頃の自身の振り返りを読むと、感情との付き合い方&lt;sup id="fnref:4"&gt;&lt;a href="#fn:4" class="footnote-ref" role="doc-noteref"&gt;4&lt;/a&gt;&lt;/sup&gt;の他に、研究とは何かを手探りで模索している様子が見て取れる&lt;sup id="fnref:5"&gt;&lt;a href="#fn:5" class="footnote-ref" role="doc-noteref"&gt;5&lt;/a&gt;&lt;/sup&gt; &lt;sup id="fnref:6"&gt;&lt;a href="#fn:6" class="footnote-ref" role="doc-noteref"&gt;6&lt;/a&gt;&lt;/sup&gt; &lt;sup id="fnref:7"&gt;&lt;a href="#fn:7" class="footnote-ref" role="doc-noteref"&gt;7&lt;/a&gt;&lt;/sup&gt;。
解決したことを伝えていかないといけないのだな、そのためにはたくさんの根拠を示さないといけないのだな、だから一朝一夕じゃ無理で時間をかけて向き合うことが必要なんだな、程度の理解度ではあるものの、この辺りから前に進み出したのだろうと思う。
2020年6月に初めてジャーナルの採録通知を受け取り&lt;sup id="fnref:8"&gt;&lt;a href="#fn:8" class="footnote-ref" role="doc-noteref"&gt;8&lt;/a&gt;&lt;/sup&gt;、10月には社会人学生として九州大学大学院システム情報科学府博士後期課程へ社会人学生として進学した&lt;sup id="fnref:9"&gt;&lt;a href="#fn:9" class="footnote-ref" role="doc-noteref"&gt;9&lt;/a&gt;&lt;/sup&gt;。
進学の後押しも研究所の所長だったと思う。
これまでの経緯もあり、及び腰だった自分に「研究職続けるなら博士号はあった方がいいし、いずれは取るのだから最短で効果が出せることをやったらいいんじゃないですか」と言われ、それもそうだなと挑戦を決めた。
暗中模索の中でも進めていた十本弱の研究報告やジャーナルの実績をもって修士を飛ばしての出願と入学が認められたこともあり、積み重ねは無駄じゃなかったなあ、ようしやるぞとここからは順風満帆。
といかないのがいかにも自分らしくて思い出しても苦笑してしまうのだが。&lt;/p&gt;
&lt;p&gt;博士課程の修了には一定数の実績が必要となる。
自分の場合は、在学中に国内ジャーナル論文をもう一本、一定水準以上の国際会議での採択が一回が最低基準であった。
国内ジャーナルこそなんとか通せたものの、国際会議については、2021年5月の初投稿から丸二年、七回目の挑戦にしてようやくの採択となり長い我慢の時期を過ごした&lt;sup id="fnref:10"&gt;&lt;a href="#fn:10" class="footnote-ref" role="doc-noteref"&gt;10&lt;/a&gt;&lt;/sup&gt;。
そんな中、指導教官は一貫して、研究という最短ルートはない道程において、同じ道を回ることなく、常に何かしらの前進という成果を得るためのアドバイスを与えてくれたと思う。
それは例えば「難しいものと認識した上でそれに挑戦する喜び」であったり「ダメだった場合は改善してただ次に行くだけ」であったり、「自分で決めて悔いのないように進む」こと、そして「結果に対して本質的な面白さを見出して言語化し、これまでの取り組みと有機的に関連づけていくこと」などである。
博士課程という自分の研究の型を体得していく中で、指導教官の存在は本当にありがたいものであった。
指導教官は、分野の専門性が重なっていることが望ましいが、それ以上に相性があると思うので、できれば共著を先に一度執筆するなどコミュニケーションを取れると良いと思う。
幸い、自分の場合は、進学前の共同研究の際に知り合うことができたのでこの点でも恵まれていたと思う。&lt;/p&gt;
&lt;p&gt;とはいえ、博士課程は、自身で主体的に研究を推進しなければならない。
これは、博士課程が「人類が新たに学べる領域を作り出すこと」という研究を達成する、「その方法論を、特定の研究テーマに基づく実践を通して身につける課程」だからだと思われる。
新たに学べる領域を作り上げているのであるから、指導教官にとってもわからない部分を切り開いていくのであり、そしてその開拓の方法は、自身でやり方を模索していかなければならない。
主体性については、能動的に動くことが前提の社会人であれば特段問題にならないかと思う。
博士課程での大変さは、この研究を推し進めるやり方の模索に対するフィードバックが、アウトプットに対してのみ得られるという点だったと思う。
それは主に査読結果や、国際会議での発表に対する議論の形を取るが、いずれにせよ論文の形にまとめる必要がある。
これは研究を学ぶには研究をしなければならないという構造であり、研究テーマ自体も発展させなければならないことも相まって、随分鍛えられたと感じている。
幸い、指導教官のアドバイスはこれに即したものであり、博士論文に着手する前の三年間で研究報告や不採択のものも含めると十六本、おおよそ二、三ヶ月に一本は何かしら研究成果を出して論文執筆していたことになる。
成長が遅いのは仕方ないとはいえ、研究開発員として、事業への貢献も求められる中でも諦めずに課程を継続したことは自分を褒めてあげたい。&lt;/p&gt;
&lt;p&gt;2024年4月には、追加でもう一つ国際会議に採択され、最終的に、入学前のジャーナル論文と合わせて計四本の実績をもとに、学位申請のための博士論文を執筆した&lt;sup id="fnref:11"&gt;&lt;a href="#fn:11" class="footnote-ref" role="doc-noteref"&gt;11&lt;/a&gt;&lt;/sup&gt;。
博論の執筆では、これまでの実績を「人類が新たに学べる領域」として再構成する。
四本の論文の整合性を取りながら、領域の世界観の確立も必要で、非常に難易度の高い執筆であり、実績達成以上にまだ大変な工程が残っているのかと驚いた。
しかしながら、この工程を通して初めて、ボトムアップな進め方であった自身の研究テーマに対し、トップダウンからの位置付けを与えることができたように思える。
実際に、自身の研究観である「人類が新たに学べる領域を作り出すこと」というのもこの段階を経て感じるようになった。
これまで各論文においても「新規性」「有用性」「了解性」の観点を満たせるよう突き詰めてきたが、複数論文をまとめる中で、それぞれの点が関連し、補い合う形で（まだ非常に狭いながら）初めて領域として形をなしていったように思う。
なお、世界観の確立については、ペパボ研究所のコンセプトである「なめらかなシステム」についての、所長との数年間に渡るディスカッションが非常に役立った。
このようなハイコンセプトな思考だけでなく実践的にも抽象的にも自在に観点を行き来しながら多面的に研究を見直す機会があるのがペパボ研究所の長所だと思う。
博士課程を考えている方はぜひ検討してほしい。
その後、公聴会を経て、2024年9月25日付けで博士（情報科学）の学位を授与された。
在学は四年間。
標準年度の三年には間に合わなかったが、なんとか修了に漕ぎ着けることができて安堵している。&lt;/p&gt;
&lt;p&gt;さて、ここまでして博士課程を終了する必要はあったのか。そしてこれからも研究をする必要はあるのか。
サンクコストを差し引いたとしても、自分自身としては「はい」と答えたい。
「課題解決」と「研究（新たに学べる領域を作り出すこと）」は相補的な関係であり、それぞれの存在がお互いを必要としていると思う。
また、特にソフトウェアやエンジニアリングの分野においては、それぞれは明確に分離している訳でもないと思う。
研究的なアプローチによって、同じ課題に対しても体系化・一般化・言語化・比較整理などを通して、多面的に捉え直し、新しい観点からちょっと面白い発想が出るかもしれない。
研究による成果物によって、ある課題に対してある状況において有用な方式を広く適用できるかもしれない。
その方式がうまくいかない場合も、理論的な裏付けもしくは再現可能な部分評価を元に、そこから学んで最短で適用できる改善を思いつけるかもしれない。
学べる状態にするのは手間がかかる。
それでもどこかの誰かの巨人の肩になるのだと信じて、研究というのを仕事にする人がいても良いのではないかと思う。&lt;/p&gt;
&lt;p&gt;もちろん、企業研究所に所属する研究員としては、より実践的に、博士課程で得たスキルを早速活用していきたい。
改めて、博士号を取得したということは、不確実で混沌とした課題領域においても、比較・体系化・言語化を通して、誰もがその課題を共有し、時間をかけることなく効果のある対策を講じられる基盤を整えられるスキルを持つ、すなわち、学べる領域を作り出せる人材であることが期待されるようになったのだと思う。
今後は、自身の研究テーマの推進はもちろんのこと、さまざまな施策において、所属する研究所のミッションである「研究開発により『事業を差別化できる技術』を生み出す」ことができるよう、さらに精進していきたい。
そして、これまで辛抱強く支えてくれたペパボに恩返ししていきたい。&lt;/p&gt;
&lt;p&gt;ペパボに入社して十二年。
タイトルの「気付けば」も大袈裟ではなくて、特に研究職になってからは時間が飛ぶようにすぎていった。
それでも、いろんなことがあったけれども、誰かと比較してではなく、過去最高の自分に仕上がっているというのは四十三歳にしては悪くないのではないか。
これからも「虚仮の一念、岩をも通す」の精神で頑張っていきたい。&lt;/p&gt;
&lt;h3 id="お知らせ"&gt;お知らせ&lt;/h3&gt;
&lt;p&gt;僕のキャリアを支援してくれたことからも分かるように、GMOペパボ株式会社はどうすればインターネットを面白くできるのか、これを真面目に考えてさまざまななやり方で取り組んでいます。
研究開発的なアプローチに対してでも良いですし、事業に対してでも大丈夫です。
こんなペパボに興味持たれた方、もっと雰囲気知りたい方、お気軽にお声がけください。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://rand.pepabo.com/"&gt;ペパボ研究所&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="参考"&gt;参考&lt;/h3&gt;
&lt;div class="footnotes" role="doc-endnotes"&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;&lt;a href="https://blog.monochromegane.com/blog/2016/10/30/5th-year-at-pepabo/"&gt;ペパボに入って4年が経った&lt;/a&gt;&amp;#160;&lt;a href="#fnref:1" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:2"&gt;
&lt;p&gt;&lt;a href="https://blog.monochromegane.com/blog/2017/12/31/2017/"&gt;2017年, 12月のライオン&lt;/a&gt;&amp;#160;&lt;a href="#fnref:2" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:3"&gt;
&lt;p&gt;&lt;a href="https://websystemarchitecture.hatenablog.jp/"&gt;WSA研&lt;/a&gt;&amp;#160;&lt;a href="#fnref:3" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:4"&gt;
&lt;p&gt;&lt;a href="https://blog.monochromegane.com/blog/2018/08/16/reason/"&gt;理性の人&lt;/a&gt;&amp;#160;&lt;a href="#fnref:4" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:5"&gt;
&lt;p&gt;&lt;a href="https://blog.monochromegane.com/blog/2019/02/25/entrance-of-research/"&gt;わかるとわからないの間&lt;/a&gt;&amp;#160;&lt;a href="#fnref:5" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:6"&gt;
&lt;p&gt;&lt;a href="https://blog.monochromegane.com/blog/2019/11/27/guidepost_for_writing_paper/"&gt;論文執筆の道しるべ&lt;/a&gt;&amp;#160;&lt;a href="#fnref:6" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:7"&gt;
&lt;p&gt;&lt;a href="https://blog.monochromegane.com/blog/2019/12/31/2019/"&gt;2019&lt;/a&gt;&amp;#160;&lt;a href="#fnref:7" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:8"&gt;
&lt;p&gt;&lt;a href="https://blog.monochromegane.com/blog/2020/06/28/my-first-journal/"&gt;ペパ研から研究をはじめてジャーナルでのアクセプトまでいけた日&lt;/a&gt;&amp;#160;&lt;a href="#fnref:8" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:9"&gt;
&lt;p&gt;&lt;a href="https://blog.monochromegane.com/blog/2020/09/21/isee-kyushu-u/"&gt;九州大学大学院システム情報科学府博士後期課程に入学します&lt;/a&gt;&amp;#160;&lt;a href="#fnref:9" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:10"&gt;
&lt;p&gt;&lt;a href="https://blog.monochromegane.com/blog/2023/12/30/international-conference-struggles/"&gt;社会人大学院生の七転び八起き国際会議奮闘記&lt;/a&gt;&amp;#160;&lt;a href="#fnref:10" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:11"&gt;
&lt;p&gt;&lt;a href="https://rand.pepabo.com/article/2024/09/25/miyakey-doctor/"&gt;博士後期課程を修了し、博士（情報科学）の学位を授与されました&lt;/a&gt;&amp;#160;&lt;a href="#fnref:11" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</description></item><item><title>ターミナルフレンドリーなAIコマンド、afaを作った</title><link>https://blog.monochromegane.com/blog/2024/09/16/afa/</link><pubDate>Mon, 16 Sep 2024 10:48:05 +0900</pubDate><guid>https://blog.monochromegane.com/blog/2024/09/16/afa/</guid><description>&lt;p&gt;Go言語で、AIモデルに対する推論をコマンドラインで実行する&lt;a href="https://github.com/monochromegane/afa"&gt;afa&lt;/a&gt;というツールを作りました。入出力としてテキストストリームを前提としており、パイプやリダイレクトを用いて他のコマンドと連携しやすいのが特徴です。&lt;/p&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;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ echo $ERROR_MESSAGE | afa new -p &lt;span style="color:#e6db74"&gt;&amp;#34;What is happening?&amp;#34;&lt;/span&gt; /path/to/file1 /path/to/file2
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;与えるプロンプトやコンテキスト情報によってAIモデルが柔軟に振る舞いを変えてくれるので、これまでの個別ツールでは対応が難しかった用途における自動化にも有用でしょう。
また、テキストストリームを扱えるリッチなTUIのコマンド&lt;a href="https://github.com/monochromegane/afa-tui"&gt;afa-tui&lt;/a&gt;も別途提供しているので、ターミナル上でのチャットも快適です。&lt;/p&gt;
&lt;h2 id="デモ"&gt;デモ&lt;/h2&gt;
&lt;h3 id="リッチtuiによるチャット"&gt;リッチTUIによるチャット&lt;/h3&gt;
&lt;p&gt;快適なインタラクティブチャットのため、Markdownを装飾して描画しつつ、&lt;code&gt;less&lt;/code&gt;コマンド相当の操作感のページャーと、プロンプトの入力欄を持つViewerと連携できます。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.monochromegane.com/images/2024/09/chat.gif" alt="Chat"&gt;&lt;/p&gt;
&lt;h3 id="zsh-line-editorzleを用いたターミナル上でのコマンド提案"&gt;Zsh Line Editor(ZLE)を用いたターミナル上でのコマンド提案&lt;/h3&gt;
&lt;p&gt;ZLEと連携すれば、コマンドライン上でのプロンプトをそのまま提案されたコマンドに置き換えて実行できます。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.monochromegane.com/images/2024/09/command_suggestion.gif" alt="Command Suggestions"&gt;&lt;/p&gt;
&lt;h3 id="vim上でのコード提案"&gt;Vim上でのコード提案&lt;/h3&gt;
&lt;p&gt;Vimと連携すれば、選択範囲のコードを提案されたものに置換できます。使い慣れたエディタであればdiff表示や差分の部分反映もお手のものですね。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.monochromegane.com/images/2024/09/code_suggestion.gif" alt="Code Suggestions"&gt;&lt;/p&gt;
&lt;h2 id="機能一覧"&gt;機能一覧&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;ターミナルフレンドリーなAIコマンドとして機能します。&lt;/li&gt;
&lt;li&gt;リッチなターミナルユーザーインターフェース（TUI）を持つチャットクライアントとして機能します。&lt;/li&gt;
&lt;li&gt;システムとユーザーのための文脈に応じたプロンプトをテンプレートを使用してサポートします。&lt;/li&gt;
&lt;li&gt;プロンプト、標準入力、およびファイルパスを文脈として受け付けます。&lt;/li&gt;
&lt;li&gt;セッションを管理し、&lt;code&gt;resume&lt;/code&gt; サブコマンドを介して迅速に再開できるようにします。&lt;/li&gt;
&lt;li&gt;安全にエスケープされたJSONオプションで構造化された出力をサポートし、他のコマンドとの統合を容易にします。&lt;/li&gt;
&lt;li&gt;コアアプリケーションはサードパーティライブラリに依存せずに独立して動作します。&lt;/li&gt;
&lt;li&gt;AIモデルとして&lt;code&gt;OpenAI&lt;/code&gt;をサポートします（他のAIモデルのサポートは将来計画されています）。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;なお、この文章は、英語で書かれたafaのREADMEのFeatures項目をコピーして、&lt;code&gt;pbpaste | afa new -script -p &amp;quot;翻訳して&amp;quot; | pbcopy&lt;/code&gt;で貼り付けました。便利ですね。&lt;/p&gt;
&lt;h2 id="基本的な使い方"&gt;基本的な使い方&lt;/h2&gt;
&lt;p&gt;Viewerを使用しないシンプルなチャットを起動する。&lt;/p&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;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ afa new
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Viewerを使用してチャットを起動する。&lt;/p&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;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ afa new -V
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;コンテキスト情報を加えてチャットを起動する。コンテキスト情報には「標準入力」「プロンプトメッセージ(-pオプションによるもの)」、そして「ファイルパス」を与えることができる。
ただし、仕様上、標準入力を与えるとキーボードからの入力を継続できないため、インタラクティブなチャットはできない。この場合は、プロセス置換（&lt;code&gt;&amp;lt;()&lt;/code&gt;）をファイルパスとして与えることを検討されたい。&lt;/p&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;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ echo $ERROR_MESSAGE | afa new -p &lt;span style="color:#e6db74"&gt;&amp;#34;What is happening?&amp;#34;&lt;/span&gt; /path/to/file1 /path/to/file2
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Please be cautious; when standard input is provided, interactive mode is disabled.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Consider using process substitution.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#=&amp;gt; afa new -p &amp;#34;What is happening?&amp;#34; /path/to/file1 /path/to/file2 &amp;lt;( echo $ERROR_MESSAGE )&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;直近のセッションを再開する。&lt;/p&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;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ afa resume
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;指定したセッションを再開する。なお、&lt;code&gt;afa list&lt;/code&gt;コマンドでセッション一覧を表示できる。&lt;/p&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;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# The command `afa list` displays past sessions.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ afa source -l SESSION_NAME
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ユーザープロンプトを指定する。ユーザープロンプトは、Go言語のテンプレート形式であり、テンプレート内ではプリセットの値としてコンテキスト情報に対応する、&lt;code&gt;Message&lt;/code&gt;、&lt;code&gt;MessageStdin&lt;/code&gt;、そして &lt;code&gt;Name&lt;/code&gt;と&lt;code&gt;Content&lt;/code&gt;をメンバとする&lt;code&gt;File&lt;/code&gt;構造体のリストである&lt;code&gt;Files&lt;/code&gt;を以下のように呼べる。これにより動的なプロンプトの生成が可能となる。&lt;/p&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;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# `Message`, `MessageStdin`, and `Files` that include `File` with `Name` and `Content` members can be used in the template file.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ echo &lt;span style="color:#e6db74"&gt;&amp;#34;Please explain the following.\n{{ (index .Files 0).Content }}&amp;#34;&lt;/span&gt; &amp;gt; CONFIG_PATH/templates/user/explain.tmpl
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;afa -u explain /path/to/file
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;スクリプトモードを指定して起動する。コマンドライン実行に適したモードのオプション設定を一括で行う&lt;code&gt;-script&lt;/code&gt;オプションを指定することで、他のコマンドとの連携が容易になる。具体的には&lt;code&gt;-I=false -H=false -S=false -V=false -L=false&lt;/code&gt;が設定される。&lt;/p&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;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;pbpaste | afa new -script -p &lt;span style="color:#e6db74"&gt;&amp;#34;Transrate this&amp;#34;&lt;/span&gt; | pbcopy
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;OpenAI&lt;/code&gt;の独自機能として提供される&lt;code&gt;Structured Output&lt;/code&gt;用のスキーマを指定できる。これは指定したJSON構造体に沿うような出力を強制する機能である。例えば、余分な説明が不要なコマンド提案などに適している。
クオート文字のエスケープを担う&lt;code&gt;-Q&lt;/code&gt;オプションと合わせて使うことで&lt;code&gt;jq&lt;/code&gt;による整形が容易になるので活用されたい。&lt;/p&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;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ cat &lt;span style="color:#f92672"&gt;&amp;lt;&amp;lt;&amp;lt;&lt;/span&gt; EOS &amp;gt; CONFIG_PATH/schemas/command_suggestion.json
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;object&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;properties&amp;#34;&lt;/span&gt;: &lt;span style="color:#f92672"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;suggested_command&amp;#34;&lt;/span&gt;: &lt;span style="color:#f92672"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;string&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;}&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;additionalProperties&amp;#34;&lt;/span&gt;: false,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;required&amp;#34;&lt;/span&gt;: &lt;span style="color:#f92672"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;suggested_command&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;EOS
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ P&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;List Go files from the directory named &amp;#39;internal&amp;#39; and print the first line of each file.&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ afa new -script -Q -j command_suggestion -p $P | jq &lt;span style="color:#e6db74"&gt;&amp;#39;. | fromjson&amp;#39;&lt;/span&gt; | jq -r &lt;span style="color:#e6db74"&gt;&amp;#39;.suggested_command&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#=&amp;gt; find internal -name &amp;#39;*.go&amp;#39; -exec head -n 1 {} \;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="実践例"&gt;実践例&lt;/h2&gt;
&lt;p&gt;実践例を列挙します。
もし使いたい例があれば、GitHubのリポジトリの&lt;a href="https://github.com/monochromegane/afa?tab=readme-ov-file#practical-examples"&gt;README&lt;/a&gt;にプロンプトや設定例と共に載せているので参考にしてみてください。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Zsh Line Editor(ZLE)を用いたターミナル上でのコマンド提案
&lt;ul&gt;
&lt;li&gt;デモで紹介したものです&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Vim上でのコード提案
&lt;ul&gt;
&lt;li&gt;これもデモで紹介したものです&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ターミナルに表示されたエラーメッセージの分析
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;tmux&lt;/code&gt;の&lt;code&gt;capture-pane&lt;/code&gt;を使って直近の実行結果を分析できます。複数行にわたるエラーメッセージのコピペの手間が省けて便利ですね&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;GitHubのプルリクエストの自動生成
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;git diff&lt;/code&gt;と&lt;code&gt;git log&lt;/code&gt;の情報を元にタイトルと要約を生成してプルリクエストを開きます。ZLEを想定しているので背景情報も踏まえて考えてもらえるようになっています。また、既存のテンプレートの上に要約を差し込む形にしているので、どのリポジトリでも使いやすいかなと思います。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;pecoを用いたセッションの絞り込みと読み込み
&lt;ul&gt;
&lt;li&gt;インタラクティブな絞り込みで素早く過去のセッションにアクセスできます。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="afa"&gt;AFA&lt;/h2&gt;
&lt;p&gt;AFAは&lt;code&gt;AI for All&lt;/code&gt;の略で、あらゆるコマンドラインツールに対して連携可能（$\forall x \in X , \exists \mathrm{AI}(x)$、つまりコマンドラインツールの集合&lt;code&gt;X&lt;/code&gt;の全ての要素&lt;code&gt;x&lt;/code&gt;に対し、その結果を入力とする&lt;code&gt;AI(x)&lt;/code&gt;な組み合わせが存在する）なAIコマンドになるといいなと思って付けた名前です。&lt;/p&gt;
&lt;p&gt;現時点でもまだViewerの入力欄が不調になることがあったりWindowsでの動作確認ができていないなど課題はありますが、通常使う分には十分な品質になったと思うので公開しました。よく使うオプションセットをconfigに設定し、いくつかのユーザープロンプトを登録しておいて&lt;code&gt;alias af='afa new'&lt;/code&gt;とするだけで、個人的には、調べ物やチャットを含め、ブラウザの利用頻度がかなり減ったことを実感しています。&lt;/p&gt;
&lt;p&gt;Homebrewによるインストール&lt;code&gt;brew install monochromegane/tap/afa monochromegane/tap/afa-tui&lt;/code&gt;も提供していますので、よければ使ってみてください。&lt;/p&gt;
&lt;p&gt;将来的には、サーバー上での異常検知のような定式化の難易度が高いタスクでの適用も検討しています（サードパーティー製ライブラリへの非依存とViewerツールとの分離は、そのためでもあります）。AFAであれば、他のコマンドラインツールとの親和性を活かして、通知やロギングは従来の仕組みも活用できると考えています。適用例など共有してもらえたら嬉しいです。&lt;/p&gt;</description></item><item><title>社会人大学院生の七転び八起き国際会議奮闘記</title><link>https://blog.monochromegane.com/blog/2023/12/30/international-conference-struggles/</link><pubDate>Sat, 30 Dec 2023 10:23:08 +0900</pubDate><guid>https://blog.monochromegane.com/blog/2023/12/30/international-conference-struggles/</guid><description>&lt;p&gt;2023年10月に初めてのアカデミックな国際会議での発表を終えました。
社会人博士課程に進学後、2021年5月の初投稿から丸2年、7回目の挑戦にしてようやくの採択ということで、自慢できるものではないのですが、同様に博士課程において日々挑戦している方々に何かの参考になればと思い、まとめておきます。&lt;/p&gt;
&lt;h1 id="略歴と背景"&gt;略歴と背景&lt;/h1&gt;
&lt;p&gt;2017年から&lt;a href="https://rand.pepabo.com/"&gt;ペパボ研究所&lt;/a&gt;で研究開発職に従事しています。
情報システムの自律適応等の研究に取り組み、&lt;a href="https://blog.monochromegane.com/blog/2020/09/21/isee-kyushu-u/"&gt;2020年10月に社会人博士課程に進学&lt;/a&gt;しました。
博士課程では、多様かつ継続的に変化する環境に適応する実用的な情報システムの実現に向けて、多腕バンディット方策を用いる機構の研究を進めています。&lt;/p&gt;
&lt;p&gt;修士を飛ばした進学であったこともあり、進学時の実績としては&lt;a href="https://blog.monochromegane.com/blog/2020/06/28/my-first-journal/"&gt;国内ジャーナル論文1本&lt;/a&gt;のみでしたので、博士号取得に向けてはジャーナル論文をもう1本と、水準を満たす国際会議での採択1本を目指しての挑戦となりました。&lt;/p&gt;
&lt;h1 id="年表"&gt;年表&lt;/h1&gt;
&lt;p&gt;以下に挑戦した国際会議とその結果について時系列にまとめました。&lt;/p&gt;
&lt;h2 id="recsys2021-reject"&gt;RecSys2021 (Reject)&lt;/h2&gt;
&lt;p&gt;2021/05投稿。
提案手法において変化する環境への適応能力を向上させるべく進学後に試行錯誤した結果をまとめたものを投稿。&lt;/p&gt;
&lt;p&gt;2021/07不採択通知。
Review結果は5点中、1点4点2点2点2点と散々でした。
総評としてはアイディアやアプローチの萌芽は理解できるが、それらを納得させるような位置付けや妥当性の説明が不十分であるというもの。
この時点では、国際会議に向けての&lt;a href="https://blog.monochromegane.com/blog/2021/05/15/survey-method/"&gt;集中的サーベイ&lt;/a&gt;や、初めての英語論文を書き上げるのに精一杯で、論文としてまだ議論の土台に立てていなかったと思います。&lt;/p&gt;
&lt;h2 id="wsdm2022-reject"&gt;WSDM2022 (Reject)&lt;/h2&gt;
&lt;p&gt;2021/08投稿。
前回のRecSys2021の指摘事項を踏まえ、記述を見直して投稿。
当初は前回投稿に対するレビュアーからの指摘事項を個別に反映しただけでしたが、指導教官より、研究の位置付けが明確になるよう全体を通した見直しはどうですかとアドバイスをいただき、導入や関連研究を中心に大幅にリライトして投稿。&lt;/p&gt;
&lt;p&gt;2021/10不採択通知。
Review結果は、Weak rejectが3名、Rejectが1名でまだまだ採択には遠かったです。
それでも、総評には、サーベイの充実度や記述の了解性に対する前向きなコメントが多く、前進が感じられました。
なお、分野のexpertからは、提案の新規性や理論的な裏付け、もう一歩踏み込んだ評価の必要性などが指摘されています。&lt;/p&gt;
&lt;h2 id="sac2022-rs-track-reject"&gt;SAC2022 RS Track (Reject)&lt;/h2&gt;
&lt;p&gt;2021/10投稿。
前回のWSDM2022の指摘のうち、提案手法を維持したまま対応できる部分を記述面で更新して投稿。&lt;/p&gt;
&lt;p&gt;2021/12不採択通知。
Review結果は、スコアが明記されていないもののReject寄りのコメントが2名、Accept寄りのコメントが1名でした。
採択に多少は近づいたように感じられるものの、総評としては前回とほぼ同様であり、次の提案方式の検討も進んでいたことから、この方式での国際会議への挑戦はここで一旦終えています。&lt;/p&gt;
&lt;p&gt;なお、この方式については、国内の論文誌に投稿し、無事採択されました（2本目の国内ジャーナル論文の実績）。
その査読においても新規性・有用性に関しての議論は行われ、採録条件に応える中で、これらを向上させることができたと思います。&lt;/p&gt;
&lt;h2 id="cikm2022-reject"&gt;CIKM2022 (Reject)&lt;/h2&gt;
&lt;p&gt;2022/05投稿。
提案手法において変化する環境への適応能力とオンライン性能を両立させるための方式を検討したものを投稿。
先んじて国内研究会で途中経過をまとめる機会があったこと、前年の執筆経験が蓄積されていることもあり、同様に新規書き下ろしであったRecSys2021の時よりも短い期間で投稿できました。&lt;/p&gt;
&lt;p&gt;2022/08不採択通知。
Review結果は、Weak rejectが1名、Weak acceptが2名で、メタの判断によっては採択されていたかもしれず、惜しいと感じました。
総評は、研究の位置付けやアプローチの妥当性、記述の了解性に対しては一定の水準を満たすものの、手法の有効性を示すための評価方法の改善を求める指摘が多くありました。
前年と比べて手法自体の新規性の観点では認められつつあるなと感じるものの、その有用性を示すための工夫をどうするべきか考えあぐねていた時期だったと思います。&lt;/p&gt;
&lt;h2 id="aamas2023-reject"&gt;AAMAS2023 (Reject)&lt;/h2&gt;
&lt;p&gt;2022/10投稿。
前回のCIKM2022の通知を待つ間に、提案手法に関連するサーベイが進んだこともあり、位置付けの補強を兼ねて、それらを盛り込み、イントロダクションと関連研究を中心にリライトして投稿。&lt;/p&gt;
&lt;p&gt;2023/01不採択通知。
Review結果は、Weak paperが1名、Decent paperが2名。
総評としては、やや厳し目で、了解性や位置付けに関する指摘が再発してしまいました。
おそらく追加的なサーベイを自身で消化しきれておらず、結果的に解決したい課題に対して不要に広い議論となってしまったのではないかと考えています。
また、前回の有用性をどう示すかという指摘についても、具体的な解決策を検討できないまま、記述で頑張ろうとしてしまったのも不明瞭になった遠因かもしれません。&lt;/p&gt;
&lt;p&gt;この時期は、なかなか国際会議に採択されないため、博論執筆に向けた実績を満たせないことに対する焦りが募っていきました。&lt;/p&gt;
&lt;h2 id="pakdd2023-reject"&gt;PAKDD2023 (Reject)&lt;/h2&gt;
&lt;p&gt;2022/12投稿。
AAMAS2023への投稿と並行して、提案手法のもう一つの要素技術についてコンセプト的な実装と評価を進めていたものを投稿。&lt;/p&gt;
&lt;p&gt;2023/02不採択通知。
Review結果は、Weak rejectが2名、Weak acceptが2名でした。
総評は、課題と提案の位置付けや妥当性は納得できるものの、提案の新規性に関する疑問があるとのことで、課題に対する提案手法の検討の甘さが見透かされたように思えます。&lt;/p&gt;
&lt;h2 id="smc2023-accept"&gt;SMC2023 (Accept!)&lt;/h2&gt;
&lt;p&gt;2023/04投稿。
研究としてはAAMAS2023の手法とPAKDD2023の手法が二つ並行している状態でしたが、まずは提案として完成しているAAMAS2023の手法を着地させるべく投稿。
一度、PAKDD2023の研究で離れたことが功を奏したのか、改めて関連文献を読み込む機会を通して知識の再整理が進み、提案手法の課題設定と採用するアプローチにおいて無理なく接続できるような定式化と説明ができたと喜んだ記憶があります。
また、執筆中に最新のサーベイで類似手法が見つかって焦る場面もありましたが、提案手法との差異を検討する中で結果的に提案の新規性の主張が明確にできたのでよかったです。&lt;/p&gt;
&lt;p&gt;2023/06採択通知。
Review結果は、スコアが明記されていないもののAccept寄りのコメントが3名、Reject寄りのコメントが1名でした。
総評では、研究や提案の位置付け、記述の明快さなどについて前向きなコメントがあり、新規性の多寡についての議論も若干ありました。
一方で、有用性や評価に関する不足のコメントがほぼ見られなかったのは興味深かったです。
これは定式化を進め、課題設定や解決する部分についての曖昧性が減少したことで、最小限の記述で過不足ない評価内容について、査読者と認識を揃えることができたためではないかと考えています。
この論文の執筆を通して、改めて、査読者のコメントを局所的に解釈するのではなく、その疑問が発生する根本について対局的にみて解決していくことの重要性を感じました。
これは2度目のWSDM2022への投稿時に指導教官からのアドバイスそのものであり、ようやく自分のものとすることができた時だったのかなと思えます。&lt;/p&gt;
&lt;h1 id="まとめ"&gt;まとめ&lt;/h1&gt;
&lt;p&gt;国際会議への長い挑戦を通して、研究を世界的な基準で議論できる水準まで押し上げていくのは一朝一夕にできるものではないのだなあと感じました。
自分の場合は、自身の研究の発展はもちろんのこと、研究を推し進めていく力を高めたいと考え、博士後期課程へ挑戦したこともあり、研究自体と研究力を同時に前進させる必要があり、特に時間がかかってしまっているのだろうと思います。
すぐ成果が出るものではないと頭では分かっているつもりでしたが、やはり2年間全く結果が出なかったというのは心理的な負担が大きかったです。
特に、研究開発員として、事業への貢献も求められる中、不採択による論文執筆期間の延長は、各種施策のスケジュールにも影響するため、とても心苦しい思いをしました。&lt;/p&gt;
&lt;p&gt;そのような中でも、最初の国際会議の採択に漕ぎ着けることができたのは、ひとえに指導教官、研究所の仲間、そして会社の皆様の支援のおかげだと考えています。
本当にありがとうございます。&lt;/p&gt;
&lt;p&gt;最後に、自分にとって研究は「&lt;a href="https://blog.monochromegane.com/blog/2017/12/31/2017/"&gt;自分の思い描く世界に至るための過程&lt;/a&gt;」であり、そのためには問題に向き合い続けることが大切だと考えています。
問題に向き合い続けるには、行き詰まらないよう多面的に見ることが重要です。
とは言え、博士課程の進学前は、多面的にあれこれ手を出すことはできていたものの、どこかでやりきれなかったり発散してしまっていたように思えます。
しかし、博士課程の進学後は、指導教官からの指導の中で、絶対に止まらない方法、収束させる方法というのを体得できているように感じます。
それは例えば、「難しいものと認識した上でそれに挑戦する喜び」であったり「ダメだった場合は改善してただ次に行くだけ」であったり、「自分で決めて悔いのないように進む」こと、そして「結果に対して本質的な面白さを見出して言語化し、これまでの取り組みと有機的に関連づけていくこと」などです。
これらはつまり、研究という最短ルートはない道程において、同じ道を回ることなく、常に何かしらの前進という成果を得るための能力です。
現在は、2回目の国際会議に向けてPAKDD2023に挑戦した時の手法を一層発展させたものを投稿中です。
この論文の取り組みは、国際会議の実績を得た後に更に取り組んだもので、継続的な研究が常態となったことを示すものなのかなと思っています。&lt;/p&gt;
&lt;p&gt;来年はおそらく博論に着手できる状態ですので、4年目に突入してしまいましたが博士号を確実に取得できるよう精一杯頑張ります。
そして、このように時間をかけて体得してきた研究と研究力の、支えてくれた皆様への還元を始めていきたいです。&lt;/p&gt;</description></item><item><title>カーネルリッジ回帰 入門</title><link>https://blog.monochromegane.com/blog/2022/09/11/kernel-ridge-regression/</link><pubDate>Sun, 11 Sep 2022 12:00:00 +0900</pubDate><guid>https://blog.monochromegane.com/blog/2022/09/11/kernel-ridge-regression/</guid><description>&lt;p&gt;基底関数を用いた線形回帰モデルのように入力に非線形な変換を施してモデルの表現力の向上を図る手法では、以下の2つの問題が発生する。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;特徴ベクトルの次元数の増加に伴う計算量の増加&lt;/li&gt;
&lt;li&gt;予測に有用な基底関数の選定&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;カーネルリッジ回帰は、カーネル関数を用いて上記の課題を解決する。
このエントリは、このカーネルリッジ回帰を最初に学んだ際の内容を自分なりにまとめたものである。&lt;/p&gt;
&lt;p&gt;以下では、はじめに、記法の整理を兼ねて基本的な線形回帰モデルを説明する。
次に、カーネル法を用いた線形回帰であるカーネルリッジ回帰の説明を通して上記の課題の解決アプローチを学ぶ。
最後に、カーネル法における計算量の課題を解決するためのアプローチである、Random Fourier Featuresも紹介する。&lt;/p&gt;
&lt;h2 id="1-線形回帰モデル"&gt;1. 線形回帰モデル&lt;/h2&gt;
&lt;p&gt;線形回帰モデルの問題設定と解法について述べる。
いま、$N$個の入力$X=(\boldsymbol{x}_1,\ldots,\boldsymbol{x}_N)^{\top} \in \mathbb{R}^{N \times D}$と出力$\boldsymbol{y}=(y_1,\ldots,y_N)^{\top} \in \mathbb{R}^{N}$が与えられている。
このとき、$y$は$\boldsymbol{x}$を入力とした線形回帰モデル$\hat{y} = \boldsymbol{w}^{\top}\boldsymbol{\phi}(\boldsymbol{x})$の出力として得られると仮定する。
ここで、$\boldsymbol{\phi}(\boldsymbol{x}) = (\phi_1(\boldsymbol{x}),\ldots,\phi_F(\boldsymbol{x}))^{\top} \in \mathbb{R}^{F}$は$F$個の基底関数$\phi: \mathbb{R}^{D} \rightarrow \mathbb{R}$からなる特徴ベクトル、$\boldsymbol{w} \in \mathbb{R}^{F}$はこれに対応する係数ベクトルである。
このとき、この係数ベクトル$\boldsymbol{w}$を推定することが本問題の目標である。&lt;/p&gt;
&lt;p&gt;推定には最小二乗法を用いる。
なお、実用上は汎化性能の考慮から正則化を施すことが多いと思われるので、これを適用した&lt;strong&gt;リッジ回帰&lt;/strong&gt;を行う。
すなわち、$\Phi = (\boldsymbol{\phi}(\boldsymbol{x}_1),\ldots,\boldsymbol{\phi}(\boldsymbol{x}_N))^{\top} \in \mathbb{R}^{N \times F}$としたとき、学習データに対する誤差の二乗和（に正則化項を加えたもの）$E(\boldsymbol{w}) = \| \Phi \boldsymbol{w} - \boldsymbol{y} \|^2 + \lambda \| \boldsymbol{w} \|^2$を最小化する$\boldsymbol{w}$を求める。&lt;/p&gt;
&lt;p&gt;このために、まず$E(\boldsymbol{w})$を次のように整理する。&lt;/p&gt;
&lt;p&gt;\begin{align}
\begin{split}
E(\boldsymbol{w}) &amp;amp;= (\Phi \boldsymbol{w} - \boldsymbol{y})^{\top}(\Phi \boldsymbol{w} - \boldsymbol{y}) + \lambda\boldsymbol{w}^{\top}\boldsymbol{w} \\
&amp;amp;= ((\Phi \boldsymbol{w})^{\top} - \boldsymbol{y}^{\top})(\Phi \boldsymbol{w} - \boldsymbol{y}) + \lambda\boldsymbol{w}^{\top}\boldsymbol{w}\\
&amp;amp;= ( \boldsymbol{w}^{\top}\Phi^{\top} - \boldsymbol{y}^{\top})(\Phi \boldsymbol{w} - \boldsymbol{y}) + \lambda\boldsymbol{w}^{\top}\boldsymbol{w}\\
&amp;amp;= \boldsymbol{w}^{\top}\Phi^{\top}\Phi\boldsymbol{w} - \boldsymbol{w}^{\top}\Phi^{\top}\boldsymbol{y} - \boldsymbol{y}^{\top}\Phi\boldsymbol{w} + \boldsymbol{y}^{\top}\boldsymbol{y} + \lambda\boldsymbol{w}^{\top}\boldsymbol{w}\\
&amp;amp;= \boldsymbol{w}^{\top}\Phi^{\top}\Phi\boldsymbol{w} - \boldsymbol{w}^{\top}\Phi^{\top}\boldsymbol{y} - \boldsymbol{w}^{\top}\Phi^{\top}\boldsymbol{y} + \boldsymbol{y}^{\top}\boldsymbol{y} + \lambda\boldsymbol{w}^{\top}\boldsymbol{w}\\
&amp;amp;= \boldsymbol{w}^{\top}\Phi^{\top}\Phi\boldsymbol{w} - 2\boldsymbol{w}^{\top}\Phi^{\top}\boldsymbol{y} + \boldsymbol{y}^{\top}\boldsymbol{y} + \lambda\boldsymbol{w}^{\top}\boldsymbol{w}.
\label{eq:ew}
\end{split}
\end{align}&lt;/p&gt;
&lt;p&gt;整理には、行列の定理$(AB)^{\top}=B^{\top}A^{\top}$と、スカラーは転置しても値が同じであることを利用した（$\boldsymbol{y}^{\top}\Phi\boldsymbol{w} = (\boldsymbol{y}^{\top}\Phi\boldsymbol{w})^{\top} = \boldsymbol{w}^{\top}\Phi^{\top}\boldsymbol{y}$）。&lt;/p&gt;
&lt;p&gt;次に、$E(\boldsymbol{w})$を最小化する$\boldsymbol{w}$を求めるために$\boldsymbol{w}$について偏微分して0とおく。&lt;/p&gt;
&lt;p&gt;\begin{align}
\frac{\partial E(\boldsymbol{w})}{\partial \boldsymbol{w}} &amp;amp;= 2\Phi^{\top}\Phi\boldsymbol{w} -2\Phi^{\top}\boldsymbol{y} + 0 + 2\lambda\boldsymbol{w} = 0.
\end{align}&lt;/p&gt;
&lt;p&gt;偏微分には、対称行列（$A=\Phi^{\top}\Phi=A^{\top}$）に対する二次形式（$\boldsymbol{w}^{\top}A\boldsymbol{w}$）の$\boldsymbol{w}$の偏微分が$(A + A^{\top})\boldsymbol{w} = 2A\boldsymbol{w}$であること、$\boldsymbol{w}^{\top}\boldsymbol{a}, \boldsymbol{a}=\Phi^{\top}\boldsymbol{y}$としたときの$\boldsymbol{w}$の偏微分が$\boldsymbol{a}$であることを利用した。&lt;/p&gt;
&lt;p&gt;最後に、$\boldsymbol{w}$について整理する。&lt;/p&gt;
&lt;p&gt;\begin{align}
\begin{split}
2\Phi^{\top}\Phi\boldsymbol{w} -2\Phi^{\top}\boldsymbol{y} + 2\lambda\boldsymbol{w} &amp;amp;= 0\\
2\Phi^{\top}\Phi\boldsymbol{w} + 2\lambda\boldsymbol{w} &amp;amp;= 2\Phi^{\top}\boldsymbol{y}\\
\Phi^{\top}\Phi\boldsymbol{w} + \lambda\boldsymbol{w} &amp;amp;= \Phi^{\top}\boldsymbol{y}\\
(\Phi^{\top}\Phi + \lambda I_F)\boldsymbol{w} &amp;amp;= \Phi^{\top}\boldsymbol{y}\\
\boldsymbol{w} &amp;amp;= (\Phi^{\top}\Phi + \lambda I_F)^{-1}\Phi^{\top}\boldsymbol{y}.
\label{eq:w}
\end{split}
\end{align}&lt;/p&gt;
&lt;p&gt;ここでは、行列のサイズが$F \times F$の単位行列を$I_{F}$と表記した。&lt;/p&gt;
&lt;p&gt;新しい入力$\boldsymbol{x}$に対する出力は推定した$\boldsymbol{w}$を用いて、$\hat{y} = \boldsymbol{w}^{\top}\boldsymbol{\phi}(\boldsymbol{x})$と予測できる。&lt;/p&gt;
&lt;h2 id="2-カーネル法による線形回帰モデル"&gt;2. カーネル法による線形回帰モデル&lt;/h2&gt;
&lt;p&gt;上述の線形回帰モデルを利用する際には、基底関数を増やし多くの特徴量の候補から予測に有用なものに重み付けできれば良いと考えられることから、特徴ベクトルの次元数$F$を増やすアプローチが検討される。
しかしながら、この場合、パラメータ$\boldsymbol{w}$の推定や出力$\hat{y}$の予測に必要な計算量も同時に増加してしまう。
そこで、カーネル法による線形回帰モデルでは、パラメータの次元数を$N$に抑えるようなアプローチをとる。
これは、学習データ数$N$が特徴ベクトルの次元数$F$よりも少ない場合に有効である。
また、線形回帰モデルにはもう一つ、予測に対して有用な基底関数の種類や数が明らかではないという課題がある。
これに対しカーネル法による線形回帰モデルは、カーネル関数を導入することで、基底関数の選定を省略することができる。&lt;/p&gt;
&lt;p&gt;以下、上述のリッジ回帰にカーネル法を適用した&lt;strong&gt;カーネルリッジ回帰&lt;/strong&gt;を説明する。&lt;/p&gt;
&lt;h3 id="21-線形回帰モデルの双対表現"&gt;2.1. 線形回帰モデルの双対表現&lt;/h3&gt;
&lt;p&gt;パラメータの次元数を$N$に抑えるため、$F$次元の$\boldsymbol{w}$についての線形モデル$\hat{y} = \boldsymbol{w}^{\top}\boldsymbol{\phi}(\boldsymbol{x})$を、$N$個の学習データ$\Phi$に対応するパラメータ$\boldsymbol{\alpha} \in \mathbb{R}^{N}$で表現することを考える。&lt;/p&gt;
&lt;p&gt;そのために、式\eqref{eq:w}の3行目以降の変形を以下のように進める。&lt;/p&gt;
&lt;p&gt;\begin{align}
\begin{split}
\Phi^{\top}\Phi\boldsymbol{w} + \lambda\boldsymbol{w} &amp;amp;= \Phi^{\top}\boldsymbol{y}\\
\lambda\boldsymbol{w} &amp;amp;= - \Phi^{\top}\Phi\boldsymbol{w} + \Phi^{\top}\boldsymbol{y}\\
\lambda\boldsymbol{w} &amp;amp;= - \Phi^{\top}(\Phi\boldsymbol{w} - \boldsymbol{y})\\
\boldsymbol{w} &amp;amp;= - \frac{1}{\lambda} \Phi^{\top}(\Phi\boldsymbol{w} - \boldsymbol{y}).
\end{split}
\end{align}&lt;/p&gt;
&lt;p&gt;ここで$\boldsymbol{\alpha} = - \frac{1}{\lambda}(\Phi\boldsymbol{w} - \boldsymbol{y})$とすると、$\boldsymbol{w} = \Phi^{\top}\boldsymbol{\alpha}$となる。
これにより、元の線形回帰モデルを$\hat{y} = (\Phi^{\top}\boldsymbol{\alpha})^{\top}\phi(\boldsymbol{x})$と、（右辺にも$\boldsymbol{w}$は含まれるが）見かけ上は$\boldsymbol{w}$を含まない形で表現できるようになった（&lt;strong&gt;双対表現&lt;/strong&gt;）。&lt;/p&gt;
&lt;p&gt;この双対表現の線形回帰モデルについて、最小二乗法を用いて$\boldsymbol{\alpha}$を推定する。
これは上述の$E(\boldsymbol{w})$を双対表現の線形回帰モデルで記述し、解を求めることと同等である。&lt;/p&gt;
&lt;p&gt;このために、式\eqref{eq:ew}に$\boldsymbol{w} = \Phi^{\top}\boldsymbol{\alpha}$を代入し$\boldsymbol{\alpha}$についての関数$E(\boldsymbol{\alpha})$とした上で、以下のように整理する。&lt;/p&gt;
&lt;p&gt;\begin{align}
\begin{split}
E(\boldsymbol{\alpha}) &amp;amp;= (\Phi^{\top}\boldsymbol{\alpha})^{\top}\Phi^{\top}\Phi(\Phi^{\top}\boldsymbol{\alpha}) - 2(\Phi^{\top}\boldsymbol{\alpha})^{\top}\Phi^{\top}\boldsymbol{y} + \boldsymbol{y}^{\top}\boldsymbol{y} + \lambda(\Phi^{\top}\boldsymbol{\alpha})^{\top}(\Phi^{\top}\boldsymbol{\alpha})\\
&amp;amp;= \boldsymbol{\alpha}^{\top}\Phi\Phi^{\top}\Phi\Phi^{\top}\boldsymbol{\alpha} - 2\boldsymbol{\alpha}^{\top}\Phi\Phi^{\top}\boldsymbol{y} + \boldsymbol{y}^{\top}\boldsymbol{y} + \lambda\boldsymbol{\alpha}^{\top}\Phi\Phi^{\top}\boldsymbol{\alpha}\\
&amp;amp;= \boldsymbol{\alpha}^{\top}KK\boldsymbol{\alpha} - 2\boldsymbol{\alpha}^{\top}K\boldsymbol{y} + \boldsymbol{y}^{\top}\boldsymbol{y} + \lambda\boldsymbol{\alpha}^{\top}K\boldsymbol{\alpha}.
\end{split}
\end{align}&lt;/p&gt;
&lt;p&gt;なお、
\[
K = \Phi\Phi^{\top} =
\begin{pmatrix}
\boldsymbol{\phi}(\boldsymbol{x}_1)^{\top}\boldsymbol{\phi}(\boldsymbol{x}_1) &amp;amp; \ldots &amp;amp; \boldsymbol{\phi}(\boldsymbol{x}_1)^{\top}\boldsymbol{\phi}(\boldsymbol{x}_N) \\
\vdots &amp;amp; \ddots &amp;amp; \vdots \\
\boldsymbol{\phi}(\boldsymbol{x}_N)^{\top}\boldsymbol{\phi}(\boldsymbol{x}_1) &amp;amp; \ldots &amp;amp; \boldsymbol{\phi}(\boldsymbol{x}_N)^{\top}\boldsymbol{\phi}(\boldsymbol{x}_N)
\end{pmatrix} =
\begin{pmatrix}
k(\boldsymbol{x}_1,\boldsymbol{x}_1) &amp;amp; \ldots &amp;amp; k(\boldsymbol{x}_1,\boldsymbol{x}_N) \\
\vdots &amp;amp; \ddots &amp;amp; \vdots \\
k(\boldsymbol{x}_N,\boldsymbol{x}_1) &amp;amp; \ldots &amp;amp; k(\boldsymbol{x}_N,\boldsymbol{x}_N)
\end{pmatrix}
\in \mathbb{R}^{N \times N}
\]
とした。
ここで、入力$\boldsymbol{p}$と$\boldsymbol{q}$を$\boldsymbol{\phi}$によって特徴ベクトルに変換し内積をとる操作である$k(\boldsymbol{p},\boldsymbol{q})$をカーネル関数と呼ぶ。
また、学習データ$X$に対する全ての組み合わせである$K$をグラム行列と呼ぶ。&lt;/p&gt;
&lt;p&gt;次に、$E(\boldsymbol{\alpha})$を最小化する$\boldsymbol{\alpha}$を求めるために$\boldsymbol{\alpha}$について偏微分して0とおく。&lt;/p&gt;
&lt;p&gt;\begin{align}
\begin{split}
\frac{\partial E(\boldsymbol{\alpha})}{\partial \boldsymbol{\alpha}} &amp;amp;= 2KK\boldsymbol{\alpha} - 2K\boldsymbol{y} + 0 + 2\lambda K\boldsymbol{\alpha}= 0.
\end{split}
\end{align}&lt;/p&gt;
&lt;p&gt;最後に、$\boldsymbol{\alpha}$について整理する。&lt;/p&gt;
&lt;p&gt;\begin{align}
\begin{split}
2KK\boldsymbol{\alpha} - 2K\boldsymbol{y} + 2\lambda K\boldsymbol{\alpha} &amp;amp;= 0\\
KK\boldsymbol{\alpha} - K\boldsymbol{y} + \lambda K\boldsymbol{\alpha} &amp;amp;= 0\\
KK\boldsymbol{\alpha} + \lambda K\boldsymbol{\alpha} &amp;amp;= K\boldsymbol{y}\\
K\boldsymbol{\alpha} + \lambda \boldsymbol{\alpha} &amp;amp;= \boldsymbol{y}\\
(K + \lambda I_N)\boldsymbol{\alpha} &amp;amp;= \boldsymbol{y}\\
\boldsymbol{\alpha} &amp;amp;= (K + \lambda I_N)^{-1}\boldsymbol{y}.
\label{eq:alpha}
\end{split}
\end{align}&lt;/p&gt;
&lt;p&gt;新しい入力$\boldsymbol{x}$に対する出力は、推定した$\boldsymbol{\alpha}$を用いて以下のように予測できる。&lt;/p&gt;
&lt;p&gt;\begin{align}
\begin{split}
\hat{y} &amp;amp;= (\Phi^{\top}\boldsymbol{\alpha})^{\top}\boldsymbol{\phi}(\boldsymbol{x}) \\
&amp;amp;= \boldsymbol{\alpha}^{\top}\Phi\boldsymbol{\phi}(\boldsymbol{x}) \\
&amp;amp;= \sum_{n=1}^{N} \alpha_n \boldsymbol{\phi}(\boldsymbol{x}_n)^{\top}\boldsymbol{\phi}(\boldsymbol{x}) \\
&amp;amp;= \sum_{n=1}^{N} \alpha_n k(\boldsymbol{x}_n, \boldsymbol{x}).
\label{eq:yk}
\end{split}
\end{align}&lt;/p&gt;
&lt;p&gt;すなわち、$F$次元の$\boldsymbol{w}$を用いず、学習データ数$N$を次元とする$\boldsymbol{\alpha}$で予測できるようになった。&lt;/p&gt;
&lt;h3 id="22-カーネル関数の構成"&gt;2.2. カーネル関数の構成&lt;/h3&gt;
&lt;p&gt;ここまで、$F$個の基底関数$\phi$を用いた特徴ベクトルとしての$\boldsymbol{\phi}$同士の内積として、カーネル関数をボトムアップ的に定義した。&lt;/p&gt;
&lt;p&gt;この場合、どのような基底関数を選定するかという線形回帰モデルのもう一つの課題が残る。
カーネル法を用いた線形回帰モデルでは、発想を逆転させ、カーネル関数をトップダウン的に先に直接定義することで、その内部の基底関数を陽に知らずにすませるというアプローチをとる。&lt;/p&gt;
&lt;p&gt;ただし、この場合は定義したカーネル関数が正定値性を満たす必要がある。
すなわち、任意の$M$個の点から計算される、定義したカーネル関数による$M \times M$のグラム行列$K$の2次形式が常に非負（任意の$\boldsymbol{\mu} \in \mathbb{R}^M$に対して$\boldsymbol{\mu}^{\top}K\boldsymbol{\mu} \geq 0$）となる必要がある。&lt;/p&gt;
&lt;p&gt;このような条件を満たすカーネル関数を直接定義できたならば、これはなんらかの特徴ベクトル同士の内積と考えることができる。
ありがたいことに、式\eqref{eq:yk}は基底関数$\phi$を使わず全てカーネル関数$k$で表現できているため、直接定義したカーネル関数があれば、基底関数の選定が不要となる（&lt;strong&gt;カーネルトリック&lt;/strong&gt;）。&lt;/p&gt;
&lt;p&gt;幸い、さまざまなカーネル関数が考案されているため、まずはそれらのカーネル関数を利用することとなる。
以下、多項式カーネルとガウスカーネルを紹介する。&lt;/p&gt;
&lt;h4 id="多項式カーネル"&gt;多項式カーネル&lt;/h4&gt;
&lt;p&gt;多項式カーネルは$k(\boldsymbol{p}, \boldsymbol{q}) = (\boldsymbol{p}^{\top}\boldsymbol{q} + c)^{m}$の形をとるカーネル関数である。
上述のカーネルリッジ回帰を利用するにあたってはどのような特徴ベクトルが利用されているのかを陽に知る必要はないが、例えば$m=2,\boldsymbol{p},\boldsymbol{q} \in \mathbb{R}^2$であれば次のような特徴ベクトルが対応することが分かる。&lt;/p&gt;
&lt;p&gt;対応する特徴ベクトルを調べるために、多項式カーネルを特徴ベクトルの内積$\boldsymbol{\phi}(\boldsymbol{p})^{\top}\boldsymbol{\phi}(\boldsymbol{q})$に変形する。&lt;/p&gt;
&lt;p&gt;\begin{align}
\begin{split}
k(\boldsymbol{p}, \boldsymbol{q}) &amp;amp;= (\boldsymbol{p}^{\top}\boldsymbol{q} + c)^{2} \\
&amp;amp;= ((p_1, p_2)^{\top}(q_1, q_2) + c)^2 \\
&amp;amp;= (p_1q_1 + p_2q_2 + c)^2 \\
&amp;amp;= p_1^2q_1^2 + p_2^2q_2^2 + c^2 + 2p_1q_1p_2q_2 + 2cp_2q_2 + 2cp_1q_1\\
&amp;amp;= p_1^2q_1^2 + p_2^2q_2^2 + c^2 + 2p_1p_2q_1q_2 + 2cp_2q_2 + 2cp_1q_1\\
&amp;amp;= p_1^2q_1^2 + p_2^2q_2^2 + c^2 + \sqrt{2}p_1p_2\sqrt{2}q_1q_2 + \sqrt{2c}p_2\sqrt{2c}q_2 + \sqrt{2c}p_1\sqrt{2c}q_1\\
&amp;amp;= (p_1^2, p_2^2, c, \sqrt{2}p_1p_2, \sqrt{2c}p_2, \sqrt{2c}p_1)^{\top}(q_1^2, q_2^2, c, \sqrt{2}q_1q_2, \sqrt{2c}q_2, \sqrt{2c}q_1).
\end{split}
\end{align}&lt;/p&gt;
&lt;p&gt;つまり、今回の例では、特徴ベクトルが$\boldsymbol{\phi}(\boldsymbol{x}) = (x_1^2, x_2^2, c, \sqrt{2}x_1x_2, \sqrt{2c}x_2, \sqrt{2c}x_1)$として扱われていたことが分かる。
言葉を返せば、多項式カーネルを用いると、このような変換を行う6つの基底関数を明示的に選定して地道に内積を取った場合と同様の結果を得られる。&lt;/p&gt;
&lt;p&gt;なお、多項式カーネルの$m=1,c=0$の場合、これを線形カーネルと呼び、この時の特徴ベクトルは入力と等しい（$\boldsymbol{\phi}(\boldsymbol{x}) = \boldsymbol{x}$）。&lt;/p&gt;
&lt;h4 id="ガウスカーネル"&gt;ガウスカーネル&lt;/h4&gt;
&lt;p&gt;ガウスカーネルは$k(\boldsymbol{p}, \boldsymbol{q}) = \exp(-\frac{\| \boldsymbol{p} - \boldsymbol{q}\|^2}{2\sigma^2})$の形をとるカーネル関数である。&lt;/p&gt;
&lt;p&gt;以下では、ガウスカーネルにどのような特徴ベクトルが対応するかを確認する。
まず、ガウスカーネルを以下のように展開、変形する。&lt;/p&gt;
&lt;p&gt;\begin{align}
\begin{split}
k(\boldsymbol{p}, \boldsymbol{q}) &amp;amp;= \exp(-\frac{\| \boldsymbol{p} - \boldsymbol{q}\|^2}{2\sigma^2}) \\
&amp;amp;= \exp(-\frac{(\boldsymbol{p} - \boldsymbol{q})^{\top}(\boldsymbol{p} - \boldsymbol{q})}{2\sigma^2}) \\
&amp;amp;= \exp(-\frac{(\boldsymbol{p}^{\top} - \boldsymbol{q}^{\top})(\boldsymbol{p} - \boldsymbol{q})}{2\sigma^2}) \\
&amp;amp;= \exp(-\frac{\boldsymbol{p}^{\top}\boldsymbol{p} - \boldsymbol{q}^{\top}\boldsymbol{p} - \boldsymbol{p}^{\top}\boldsymbol{q} + \boldsymbol{q}^{\top}\boldsymbol{q}}{2\sigma^2}) \\
&amp;amp;= \exp(-\frac{\boldsymbol{p}^{\top}\boldsymbol{p} - (\boldsymbol{q}^{\top}\boldsymbol{p})^{\top} - \boldsymbol{p}^{\top}\boldsymbol{q} + \boldsymbol{q}^{\top}\boldsymbol{q}}{2\sigma^2}) \\
&amp;amp;= \exp(-\frac{\boldsymbol{p}^{\top}\boldsymbol{p} - \boldsymbol{p}^{\top}\boldsymbol{q} - \boldsymbol{p}^{\top}\boldsymbol{q} + \boldsymbol{q}^{\top}\boldsymbol{q}}{2\sigma^2}) \\
&amp;amp;= \exp(-\frac{\boldsymbol{p}^{\top}\boldsymbol{p} - 2\boldsymbol{p}^{\top}\boldsymbol{q} + \boldsymbol{q}^{\top}\boldsymbol{q}}{2\sigma^2}) \\
&amp;amp;= \exp(\frac{-\boldsymbol{p}^{\top}\boldsymbol{p}}{2\sigma^2} + \frac{\boldsymbol{p}^{\top}\boldsymbol{q}}{\sigma^2} + \frac{-\boldsymbol{q}^{\top}\boldsymbol{q}}{2\sigma^2}) \\
&amp;amp;= \exp(\frac{-\boldsymbol{p}^{\top}\boldsymbol{p}}{2\sigma^2})\exp(\frac{\boldsymbol{p}^{\top}\boldsymbol{q}}{\sigma^2})\exp(\frac{-\boldsymbol{q}^{\top}\boldsymbol{q}}{2\sigma^2}) \\
&amp;amp;= \rho\exp(\frac{\boldsymbol{p}^{\top}\boldsymbol{q}}{\sigma^2})\psi \\
&amp;amp;= \rho\psi\exp(\frac{\boldsymbol{p}^{\top}\boldsymbol{q}}{\sigma^2}).
\end{split}
\end{align}&lt;/p&gt;
&lt;p&gt;最後の2行では以降の展開を見やすくするため、$\rho=\exp(\frac{-\boldsymbol{p}^{\top}\boldsymbol{p}}{2\sigma^2}), \psi=\exp(\frac{-\boldsymbol{q}^{\top}\boldsymbol{q}}{2\sigma^2})$とおいた。&lt;/p&gt;
&lt;p&gt;次に、$e^x$のマクローリン展開の公式（$e^x = \sum_{i=0}^{\infty} \frac{x^i}{i!} = 1 + x + \frac{x^2}{2} + \frac{x^3}{6} + \cdots$）を使い、特徴ベクトルの内積$\boldsymbol{\phi}(\boldsymbol{p})^{\top}\boldsymbol{\phi}(\boldsymbol{q})$に変形する。&lt;/p&gt;
&lt;p&gt;簡単のため$\sigma=1$とすると、次のような式が得られる。&lt;/p&gt;
&lt;p&gt;\begin{align}
\begin{split}
\rho\psi\exp(\boldsymbol{p}^{\top}\boldsymbol{q}) &amp;amp;= \rho\psi \left(1 + (\boldsymbol{p}^{\top}\boldsymbol{q})^1 + \frac{(\boldsymbol{p}^{\top}\boldsymbol{q})^2}{2} + \frac{(\boldsymbol{p}^{\top}\boldsymbol{q})^3}{6} + \ldots \right).
\end{split}
\end{align}&lt;/p&gt;
&lt;p&gt;これは$c=0$の多項式カーネルを次数$m$を増やしながら無限回足したものである。
よって例えば、$\boldsymbol{p},\boldsymbol{q} \in \mathbb{R}^2$では、次のような&lt;strong&gt;無限次元&lt;/strong&gt;の特徴ベクトルが対応することが分かる。&lt;/p&gt;
&lt;p&gt;\begin{align}
\begin{split}
\rho\psi\exp(\boldsymbol{p}^{\top}\boldsymbol{q}) &amp;amp;= \rho\psi \left(1 + (\boldsymbol{p}^{\top}\boldsymbol{q})^1 + \frac{(\boldsymbol{p}^{\top}\boldsymbol{q})^2}{2} + \frac{(\boldsymbol{p}^{\top}\boldsymbol{q})^3}{6} + \ldots \right) \\
&amp;amp;= \rho\psi \left(1 + (p_1q_1 + p_2q_2) + \frac{p_1^2q_1^2 + p_2^2q_2^2 + \sqrt{2}p_1p_2\sqrt{2}q_1q_2}{2} + \frac{p_1^3q_1^3 + p_2^3q_2^3 + \sqrt{3}p_1^2p_2\sqrt{3}q_1^2q_2 + \sqrt{3}p_1p_2^2\sqrt{3}q_1q_2^2}{6} + \ldots \right) \\
&amp;amp;= \rho\left(1, p_1, p_2, \frac{p_1^2}{\sqrt{2}}, \frac{p_2^2}{\sqrt{2}}, \frac{\sqrt{2}p_1p_2}{\sqrt{2}}, \frac{p_1^3}{\sqrt{6}}, \frac{p_2^3}{\sqrt{6}}, \frac{\sqrt{3}p_1^2p_2}{\sqrt{6}}, \frac{\sqrt{3}p_1p_2^2}{\sqrt{6}}, \ldots \right)^{\top}\psi\left(1, q_1, q_2, \frac{q_1^2}{\sqrt{2}}, \frac{q_2^2}{\sqrt{2}}, \frac{\sqrt{2}q_1q_2}{\sqrt{2}}, \frac{q_1^3}{\sqrt{6}}, \frac{q_2^3}{\sqrt{6}}, \frac{\sqrt{3}q_1^2q_2}{\sqrt{6}}, \frac{\sqrt{3}q_1q_2^2}{\sqrt{6}},\ldots \right) \\
&amp;amp;= \rho\left(1, p_1, p_2, \frac{p_1^2}{\sqrt{2}}, \frac{p_2^2}{\sqrt{2}}, p_1p_2, \frac{p_1^3}{\sqrt{6}}, \frac{p_2^3}{\sqrt{6}}, \frac{p_1^2p_2}{\sqrt{2}}, \frac{p_1p_2^2}{\sqrt{2}}, \ldots \right)^{\top}\psi\left(1, q_1, q_2, \frac{q_1^2}{\sqrt{2}}, \frac{q_2^2}{\sqrt{2}}, q_1q_2, \frac{q_1^3}{\sqrt{6}}, \frac{q_2^3}{\sqrt{6}}, \frac{q_1^2q_2}{\sqrt{2}}, \frac{q_1q_2^2}{\sqrt{2}},\ldots \right).
\end{split}
\end{align}&lt;/p&gt;
&lt;p&gt;ガウスカーネルでは、このような無限個の基底関数を用意して内積を地道に計算した結果が、$k(\boldsymbol{p}, \boldsymbol{q}) = \exp(-\frac{\| \boldsymbol{p} - \boldsymbol{q}\|^2}{2\sigma^2})$のみの計算から得られるとも考えられる。&lt;/p&gt;
&lt;h2 id="3-random-fourier-features乱択化フーリエ特徴"&gt;3. Random Fourier Features（乱択化フーリエ特徴）&lt;/h2&gt;
&lt;p&gt;カーネルリッジ回帰による入力$\boldsymbol{x}$に対する予測は式\eqref{eq:alpha}\eqref{eq:yk}より、$\hat{y} = \sum_{n=1}^{N} \alpha_n k(\boldsymbol{x}_n, \boldsymbol{x}), \boldsymbol{\alpha} = (K + \lambda I_N)^{-1}\boldsymbol{y}$となるのであった。
カーネルリッジ回帰では、$F \gg N$となるような学習データ数$N$に対し十分大きい$F$個の基底関数を用いる場合に、双対表現によってパラメータ数を$N$に抑えつつ、カーネル関数の導入によって$F$次元の特徴ベクトルの直接的な算出を回避できた。&lt;/p&gt;
&lt;p&gt;しかしながら、カーネルリッジ回帰は、学習データ数$N$に対して計算量が指数的に増加してしまう課題がある。
これは、グラム行列$K$のサイズが$N \times N$であるため、$\boldsymbol{\alpha}$の計算にあたって、必要なカーネル関数の計算が$N^2$のオーダーで増加することからも分かる。
また、逆行列の計算も$K$のサイズに応じて計算量が増加する。
加えて、$\hat{y}$の計算にあたっても、新しい入力$\boldsymbol{x}$に対して$N$回のカーネル関数の計算が都度必要となってしまう。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Random Fourier Features&lt;/strong&gt;は、ある確率分布からのサンプリング結果でカーネル関数とグラム行列を近似することで、上述の課題を解決する、高速化のための手法である。&lt;/p&gt;
&lt;p&gt;この手法では、$\mathbb{R}^D$上のカーネル関数$k(\boldsymbol{p},\boldsymbol{q})$が$\boldsymbol{p}$と$\boldsymbol{q}$の差の形（$k(\boldsymbol{p}-\boldsymbol{q})$）で表せるとき、このカーネル関数が、ある確率密度関数$p(\boldsymbol{\omega})$のフーリエ変換で表せることを利用する。&lt;/p&gt;
&lt;p&gt;\begin{align}
\begin{split}
k(\boldsymbol{p},\boldsymbol{q}) &amp;amp;= k(\boldsymbol{p} - \boldsymbol{q})\\
&amp;amp;= \int_{\mathbb{R}^{D}} p(\boldsymbol{\omega}) \exp(i \boldsymbol{\omega}^{\top}(\boldsymbol{p} - \boldsymbol{q}))d\boldsymbol{\omega} \\
&amp;amp;= \mathbb{E}_{\boldsymbol{\omega}}[\exp(i \boldsymbol{\omega}^{\top}(\boldsymbol{p} - \boldsymbol{q}))] \\
&amp;amp;= \mathbb{E}_{\boldsymbol{\omega}}[\cos(\boldsymbol{\omega}^{\top}(\boldsymbol{p} - \boldsymbol{q}))] \\
&amp;amp;= \mathbb{E}_{\boldsymbol{\omega},b}[\sqrt{2}\cos(\boldsymbol{\omega}^{\top}\boldsymbol{p} + b) \cdot \sqrt{2}\cos(\boldsymbol{\omega}^{\top}\boldsymbol{q} + b)] \\
&amp;amp;\approx \frac{1}{R} \sum_{r=1}^{R} \sqrt{2}\cos(\boldsymbol{\omega}_r^{\top}\boldsymbol{p} + b_r) \cdot \sqrt{2}\cos(\boldsymbol{\omega}_r^{\top}\boldsymbol{q} + b_r).
\end{split}
\end{align}&lt;/p&gt;
&lt;p&gt;ここで、$\boldsymbol{\omega} \sim p(\boldsymbol{\omega}), b \sim \text{Uniform}(0, 2\pi)$である。
なお、$p(\boldsymbol{\omega})$は利用するカーネル関数によって異なるが、ガウスカーネルの場合、$\boldsymbol{w} = (w_d)^{1 \leq d \leq D}, w_d \sim \mathcal{N}(0, \sigma^2)$となる。&lt;/p&gt;
&lt;p&gt;最後の行は、この確率分布の期待値（$=$カーネル関数の結果）を$R$個のサンプリング結果の平均で近似することを示している。&lt;/p&gt;
&lt;p&gt;すなわち、各サンプルから求めた結果を、$z_r(\boldsymbol{x}) = \cos(\boldsymbol{\omega}_{r}^{\top}\boldsymbol{x} + b_r)$、$R$個の$z_r$を$\boldsymbol{z}(\boldsymbol{x}) = \sqrt{\frac{2}{R}}(z_1(\boldsymbol{x}),\ldots,z_R(\boldsymbol{x}))^{\top}$とおくと、カーネル関数$k$の近似$\hat{k}$が$\hat{k}(\boldsymbol{p},\boldsymbol{q}) = \boldsymbol{z}(\boldsymbol{p})^{\top}\boldsymbol{z}(\boldsymbol{q})$のように得られる。
また、学習データ$X$に対する$\boldsymbol{z}$の集合を$Z = (\boldsymbol{z}(\boldsymbol{x}_1)^{\top}, \ldots, \boldsymbol{z}(\boldsymbol{x}_N)^{\top})^{\top} \in \mathbb{R}^{N \times R}$とすると、$\hat{K} = ZZ^{\top}$の操作によって$N \times N$行列の各要素がカーネル関数$k$の近似$\hat{k}(\boldsymbol{x}_i, \boldsymbol{x}_j) = \boldsymbol{z}(\boldsymbol{x}_i)^{\top}\boldsymbol{z}(\boldsymbol{x}_j)$となるグラム行列$K$の近似$\hat{K}$を得られる。&lt;/p&gt;
&lt;p&gt;よって、これらの近似を用いたカーネルリッジ回帰のパラメータ$\boldsymbol{\alpha}$の近似$\hat{\boldsymbol{\alpha}}$は、$\hat{\boldsymbol{\alpha}} = (\hat{K} + \lambda I_{N})^{-1}\boldsymbol{y}$となる。
ただし、この手法では、$\hat{K} = ZZ^{\top}$であることを利用して、計算量を学習データ数$N$ではなくサンプリング数$R$のオーダーに変えることができる。
そのため、$R \ll N$であるならば、非常に効率よく予測が可能となる。&lt;/p&gt;
&lt;p&gt;以下に、$\hat{K}$や$\hat{\boldsymbol{\alpha}}$を消去していく経過と合わせて、この手法における予測式を示す。&lt;/p&gt;
&lt;p&gt;\begin{align}
\begin{split}
\hat{y} &amp;amp;= \sum_{n=1}^{N} \hat{\alpha}_n \hat{k}(\boldsymbol{x}_n, \boldsymbol{x}) \\
&amp;amp;= \sum_{n=1}^{N} \hat{\alpha}_n \hat{k}(\boldsymbol{x}, \boldsymbol{x}_n) \\
&amp;amp;= \sum_{n=1}^{N} \hat{\alpha}_n \boldsymbol{z}(\boldsymbol{x})^{\top}\boldsymbol{z}(\boldsymbol{x}_n) \\
&amp;amp;= \boldsymbol{z}(\boldsymbol{x})^{\top} \sum_{n=1}^{N} \hat{\alpha}_n \boldsymbol{z}(\boldsymbol{x}_n) \\
&amp;amp;= \boldsymbol{z}(\boldsymbol{x})^{\top} Z^{\top} \hat{\boldsymbol{\alpha}} \\
&amp;amp;= \boldsymbol{z}(\boldsymbol{x})^{\top} Z^{\top} (\hat{K} + \lambda I_{N})^{-1}\boldsymbol{y} \\
&amp;amp;= \boldsymbol{z}(\boldsymbol{x})^{\top} Z^{\top} (ZZ^{\top} + \lambda I_{N})^{-1}\boldsymbol{y} \\
&amp;amp;= \boldsymbol{z}(\boldsymbol{x})^{\top} (Z^{\top}Z + \lambda I_{R})^{-1}Z^{\top} \boldsymbol{y}.
\end{split}
\end{align}&lt;/p&gt;
&lt;p&gt;よって、$A=(Z^{\top}Z + \lambda I_{R}) \in \mathbb{R}^{R \times R}$、$\boldsymbol{b} = (Z^{\top} \boldsymbol{y}) \in \mathbb{R}^{R}$、$\boldsymbol{\beta} = A^{-1}\boldsymbol{b}$として、$\hat{y} = \boldsymbol{z}(\boldsymbol{x})^{\top} \boldsymbol{\beta}$と予測できる。
$Z$は$N \times R$であるものの、逆行列のサイズは$R \times R$となること、$\hat{y}$の計算も、新しい入力$\boldsymbol{x}$に対して$R$回の計算で済む$\boldsymbol{z}(\boldsymbol{x})$のみで良いことから、計算量が抑えられることが分かる。&lt;/p&gt;
&lt;p&gt;なお、最後の行では逆行列の補題（$P(I_N + QP)^{-1} = (I_R +PQ)^{-1}P, P \in \mathbb{R}^{R \times N}, Q \in \mathbb{R}^{N \times R}$）を用いた。&lt;/p&gt;
&lt;h2 id="参考"&gt;参考&lt;/h2&gt;
&lt;h3 id="線形回帰モデル"&gt;線形回帰モデル&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://manabitimes.jp/math/1128"&gt;正規方程式の導出と計算例&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.kspub.co.jp/book/detail/5161968.html"&gt;スタンフォード　ベクトル・行列からはじめる最適化数学&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.kspub.co.jp/book/detail/1529267.html"&gt;ガウス過程と機械学習&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="カーネル法による線形回帰モデル"&gt;カーネル法による線形回帰モデル&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://qiita.com/wsuzume/items/09a59036c8944fd563ff"&gt;線形な手法とカーネル法（回帰分析）&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://qiita.com/kilometer/items/66e6116cc661019ead59"&gt;カーネルトリック&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.slideshare.net/KeisukeSugawara/slide0629"&gt;PRML第６章「カーネル法」&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.slideshare.net/hagino_3000/prml-61-17081123"&gt;PRML 6.1章 カーネル法と双対表現&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.iwanami.co.jp/book/b257891.html"&gt;カーネル多変量解析 非線形データ解析の新しい展開&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://towardsdatascience.com/truly-understanding-the-kernel-trick-1aeb11560769"&gt;Understanding the Kernel Trick with fundamentals&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Radial_basis_function_kernel"&gt;Radial basis function kernel&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="random-fourier-features"&gt;Random Fourier Features&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://qiita.com/githug0906/items/448daec79fac2ffd82a0"&gt;乱択化フーリエ特徴を用いたリッジ回帰&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.kyoritsu-pub.co.jp/book/b10003381.html"&gt;機械学習のためのカーネル100問 with Python&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gregorygundersen.com/blog/2019/12/23/random-fourier-features/"&gt;Random Fourier Features&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://proceedings.neurips.cc/paper/2007/hash/013a006f03dbc5392effeb8f18fda755-Abstract.html"&gt;Rahimi, Ali, and Benjamin Recht. &amp;ldquo;Random features for large-scale kernel machines.&amp;rdquo; Advances in neural information processing systems 20 (2007).&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>gonum/matパッケージを直感的に操作するMatrix Adapterをつくった</title><link>https://blog.monochromegane.com/blog/2022/07/02/matrix-adapter/</link><pubDate>Sat, 02 Jul 2022 11:59:22 +0900</pubDate><guid>https://blog.monochromegane.com/blog/2022/07/02/matrix-adapter/</guid><description>&lt;p&gt;gonum/matによる行列計算を幾分か直感的に扱える薄いラッパーを作りました。
具体的には、計算結果用に空の行列を予め用意するのではなく、計算結果を戻り値で受け取れるように統一します。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/monochromegane/mat"&gt;Matrix Adapter&lt;/a&gt;: Small adapter which provides method signatures that allow intuitive operation with fewer lines of code for gonum/mat.&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id="背景と課題感"&gt;背景と課題感&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://github.com/gonum/gonum/tree/master/mat"&gt;Gonumプロジェクトのmatパッケージ&lt;/a&gt;はGo言語での行列計算ライブラリを提供してくれています。
こういった正確さと速度の求められる数値計算の処理には、（趣味は別として）自作ではなく、多くの人に使われ実績のあるライブラリを採用したいことから、このパッケージを利用しています。&lt;/p&gt;
&lt;p&gt;非常に便利に使わせていただいている一方で、自分の場合、スムーズに書けないことがありました。
理由としては、計算結果の受け取り方法に対する一貫性の崩れがあるだろうと考えています。&lt;/p&gt;
&lt;p&gt;matパッケージでは、予め空の行列を用意し、これをレシーバーとして計算対象となる行列を引数で渡します。&lt;/p&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;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;c&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;mat&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;Dense&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;c&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;Product&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;a&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;b&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;元の行列が維持されるこの設計は非常にありがたいです。
しかしながら、一部の関数（例えば &lt;code&gt;Dense.T&lt;/code&gt;）は結果が戻り値として得られます。&lt;/p&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;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;ct&lt;/span&gt; &lt;span style="color:#f92672"&gt;:=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;c&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;T&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;この一貫性の崩れは不変と可変の混在にあるのではないかと考えています。
gonum/matパッケージでは、&lt;a href="https://pkg.go.dev/gonum.org/v1/gonum/mat#hdr-Invariants"&gt;引数で渡す行列は計算操作に対して不変&lt;/a&gt;とされています。
これは、関数のパラメータの方が、&lt;code&gt;mat.Matrix&lt;/code&gt;インターフェースであることからも読み取れます。
実際、このインターフェースには、&lt;code&gt;Dims()&lt;/code&gt;, &lt;code&gt;At()&lt;/code&gt;といった参照系かレシーバーを壊さない&lt;code&gt;T()&lt;/code&gt;のみが用意されています。&lt;/p&gt;
&lt;p&gt;一方で、このインターフェースを実装した&lt;code&gt;mat.Dense&lt;/code&gt;などは自身をレシーバーとして内容を変更する操作を認めています。
この差異により、mat.Matrixインターフェースのシグネチャの一つである&lt;code&gt;T()&lt;/code&gt;は戻り値を返すが、Denseの関数ではレシーバーを変更するという振る舞いの違いがあるのではないかと思われました。&lt;/p&gt;
&lt;p&gt;gonum/matパッケージではほとんどの関数が空の行列を予め用意する方式に従っているため、慣れれば問題ない程度ではありますが、久しぶりに使う場合など、多少まごつくことが何度かありました。
個人的に、Go言語で何か書くときは迷わず書きたいという欲求があり、迷わないため一貫性のあるラッパーを作ることとしました。&lt;/p&gt;
&lt;h1 id="matrix-adapter"&gt;Matrix Adapter&lt;/h1&gt;
&lt;p&gt;今回は、計算結果を戻り値で受け取れるように統一します。
これにより、利用側からはDenseらも不変であるかのように扱え、一貫性という側面から認知負荷が減ると考えるためです。&lt;/p&gt;
&lt;p&gt;Matrix Adapterを適用した場合、先ほどの例は以下のようになります。
&lt;code&gt;c&lt;/code&gt;がレシーバーではなく、先ほどは引数となっていた&lt;code&gt;a&lt;/code&gt;がレシーバーとなっていることに注意してください。
&lt;code&gt;c&lt;/code&gt;は戻り値として受け取ることになりました。&lt;/p&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;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;c&lt;/span&gt; &lt;span style="color:#f92672"&gt;:=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;a&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;Product&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;b&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="実装と使い方"&gt;実装と使い方&lt;/h2&gt;
&lt;p&gt;Adapterの実装は単純明快で、元の構造体を埋め込み（embedding）し、結果を戻り値で返すように関数のシグネチャを変更しました。
変更が不要なものは移譲されます。
いわゆるGoFのデザインパターンにおけるAdapterパターンというやつです。&lt;/p&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;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;type&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Dense&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;struct&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;mat&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;Dense&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;func&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;m&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;Dense&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;Add&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;b&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;mat&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;Matrix&lt;/span&gt;) &lt;span style="color:#f92672"&gt;*&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;Dense&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;dense&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;mat&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;Dense&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;dense&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;Add&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;m&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;Dense&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;b&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;Dense&lt;/span&gt;{&lt;span style="color:#f92672"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;dense&lt;/span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;現状、DenseとVecDenseに対するAdapterを提供しています。
既存と同名の&lt;code&gt;NewDense()&lt;/code&gt;と&lt;code&gt;NewVecDense()&lt;/code&gt;を使って、ラップされたDenseやVecDenseを作成できます。&lt;/p&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;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;package&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;main&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; (
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;fmt&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;github.com/monochromegane/mat/adapter&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;func&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;main&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;m&lt;/span&gt; &lt;span style="color:#f92672"&gt;:=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;adapter&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;NewDense&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;, []&lt;span style="color:#66d9ef"&gt;float64&lt;/span&gt;{&lt;span style="color:#ae81ff"&gt;1.0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;2.0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;3.0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;4.0&lt;/span&gt;})
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;fmt&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;Printf&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;%v\n&amp;#34;&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;m&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// ⎡1 2⎤&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// ⎣3 4⎦&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ちなみに、提供されるDenseとVecDenseは&lt;code&gt;fmt.Stringer&lt;/code&gt;インターフェースを実装し、行列の内容を整形して出力するようにしています。&lt;/p&gt;
&lt;p&gt;ここで、少し実践的な例として、リッジ回帰によるパラメータ推定（$\hat{\theta} = (X^{\top}X + \lambda I)^{-1} X^{\top}Y$）を実装し、比較してみます。&lt;/p&gt;
&lt;h3 id="matrix-adapterでの実装"&gt;Matrix Adapterでの実装&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;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;X&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;Y&lt;/span&gt; &lt;span style="color:#f92672"&gt;:=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;syntheticData&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;N&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;theta&lt;/span&gt;) &lt;span style="color:#75715e"&gt;// Return adapter.Dense&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;I&lt;/span&gt; &lt;span style="color:#f92672"&gt;:=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;mat&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;NewDiagDense&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;, []&lt;span style="color:#66d9ef"&gt;float64&lt;/span&gt;{&lt;span style="color:#ae81ff"&gt;1.0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;1.0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;1.0&lt;/span&gt;})
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;reg&lt;/span&gt; &lt;span style="color:#f92672"&gt;:=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;DenseCopyOf&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;I&lt;/span&gt;).&lt;span style="color:#a6e22e"&gt;Scale&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;lambda&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;XTXinv&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;_&lt;/span&gt; &lt;span style="color:#f92672"&gt;:=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;X&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;Transpose&lt;/span&gt;().&lt;span style="color:#a6e22e"&gt;Product&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;X&lt;/span&gt;).&lt;span style="color:#a6e22e"&gt;Add&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;reg&lt;/span&gt;).&lt;span style="color:#a6e22e"&gt;Inverse&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;XTY&lt;/span&gt; &lt;span style="color:#f92672"&gt;:=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;X&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;Transpose&lt;/span&gt;().&lt;span style="color:#a6e22e"&gt;Product&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;Y&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;estimated&lt;/span&gt; &lt;span style="color:#f92672"&gt;:=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;XTXinv&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;Product&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;XTY&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="gonummatでの実装"&gt;gonum/matでの実装&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;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;X&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;Y&lt;/span&gt; &lt;span style="color:#f92672"&gt;:=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;syntheticData&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;N&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;theta&lt;/span&gt;) &lt;span style="color:#75715e"&gt;// Return adapter.Dense&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;XTXinv&lt;/span&gt; &lt;span style="color:#f92672"&gt;:=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;mat&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;NewDense&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nil&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;XTXinv&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;Product&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;X&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;T&lt;/span&gt;(), &lt;span style="color:#a6e22e"&gt;X&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;I&lt;/span&gt; &lt;span style="color:#f92672"&gt;:=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;mat&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;NewDiagDense&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;, []&lt;span style="color:#66d9ef"&gt;float64&lt;/span&gt;{&lt;span style="color:#ae81ff"&gt;1.0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;1.0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;1.0&lt;/span&gt;})
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;reg&lt;/span&gt; &lt;span style="color:#f92672"&gt;:=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;mat&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;DenseCopyOf&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;I&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;reg&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;Scale&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;lambda&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;reg&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;XTXinv&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;Add&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;XTXinv&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;reg&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;XTXinv&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;Inverse&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;XTXinv&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;XTY&lt;/span&gt; &lt;span style="color:#f92672"&gt;:=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;mat&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;NewDense&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nil&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;XTY&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;Product&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;X&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;T&lt;/span&gt;(), &lt;span style="color:#a6e22e"&gt;Y&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;estimated&lt;/span&gt; &lt;span style="color:#f92672"&gt;:=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;mat&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;NewDense&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nil&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;estimated&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;Product&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;XTXinv&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;XTY&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;この例では、gonum/matでの実装に比べてMatrix Adapterでの実装が、結果用の&lt;code&gt;Dense&lt;/code&gt;の準備が省略できたこと、各関数で受け取る引数が減ったことなどから、幾分か簡潔に記述できているかと思います。&lt;/p&gt;
&lt;p&gt;なお、Adapterでの実装では、Method Chainによる行数の短縮も見てとれます。
これについては、戻り値を返す実装としたことで副次的に得られた、本Adapterの特徴です。
Go言語におけるMethod Chainは、errorを含む多値の戻り値との相性から、積極的に採用されていないと認識しています。
ただ、今回は元のパッケージが各計算においてerrorを返さないものが多く、多値にならない関数が多くできたため、結果としてMethod Chainがつながる場合ができています（&lt;code&gt;Inverse()&lt;/code&gt;などerrorを返すものもあるため全部は繋げません）。
この辺りのエラー処理については、一考の価値があると思いますが、現時点で本Adapterの対象外（従来パッケージを踏襲）としています。&lt;/p&gt;
&lt;h2 id="相互運用性"&gt;相互運用性&lt;/h2&gt;
&lt;p&gt;Adapterの提供する関数でも、引数は&lt;code&gt;mat.Matrix&lt;/code&gt;（や&lt;code&gt;mat.Vector&lt;/code&gt;）を使うため、既存のラップしていないものを入力として受け取れます。
また、これらのAdapterは、&lt;code&gt;mat.Dense&lt;/code&gt;（や&lt;code&gt;mat.VecDense&lt;/code&gt;）構造体を埋め込んでいるため、&lt;code&gt;mat.Matrix&lt;/code&gt;（や&lt;code&gt;mat.Vector&lt;/code&gt;）の実装を満たします。
よって、ラップされた&lt;code&gt;adapter.Dense&lt;/code&gt;（や&lt;code&gt;adapter.VecDense&lt;/code&gt;）を既存の関数の入力として渡すことができます。&lt;/p&gt;
&lt;p&gt;また、&lt;code&gt;T()&lt;/code&gt;は&lt;code&gt;mat.Matrix&lt;/code&gt;として維持しなければならない関数であることから、同等の&lt;code&gt;Transpose()&lt;/code&gt;を提供しています。
これにより、転置行列がレシーバーとなるような呼び出しであっても、&lt;code&gt;adapter.Dense&lt;/code&gt;として振る舞うことができるようになり、Matrix Adapterとの親和性が向上します。&lt;/p&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;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// X.T().Product(Y) is invalid due to mat.Matrix has no method Product.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;XTY&lt;/span&gt; &lt;span style="color:#f92672"&gt;:=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;X&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;Transpose&lt;/span&gt;().&lt;span style="color:#a6e22e"&gt;Product&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;Y&lt;/span&gt;) &lt;span style="color:#75715e"&gt;// Valid&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id="まとめ"&gt;まとめ&lt;/h1&gt;
&lt;p&gt;本エントリでは、gonum/matパッケージを直感的に操作するための&lt;a href="https://github.com/monochromegane/mat"&gt;Matrix Adapter&lt;/a&gt;を紹介しました。
本Adapterの作成とエントリ執筆において、「直感的でない」と主観的に感じる理由について、不変と可変の混在に起因するものではないかなと言語化できたのがよかったかなあと思います。&lt;/p&gt;
&lt;p&gt;自分の利用範囲だと、DenseとVecDenseで事足りる場合が多いのですが、必要に応じて対象を増やしていこうかと思います。&lt;/p&gt;
&lt;h1 id="参考"&gt;参考&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://po3rin.com/blog/gonum"&gt;Go + Gonum を使った行列計算まとめ&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;関数の直感性を上げるための独自関数や、行列のフォーマットなどを参考にさせていただきました。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/gorgonia/tensor"&gt;gorgonia/tensor&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;gonum/matではないGo言語の行列計算パッケージ。戻り値で結果を受け取れたりerrorも返すので本Adapterの目指すところに近いとは思います。速度含めて検証が必要なのもあり、今回は慣れて使っている方が多いであろうgonum/matをラップする方式を採用しました。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>2022年2月のアイオー</title><link>https://blog.monochromegane.com/diary/20220226-io/</link><pubDate>Sat, 26 Feb 2022 11:53:35 +0900</pubDate><guid>https://blog.monochromegane.com/diary/20220226-io/</guid><description>&lt;p&gt;月ごとのインプットとアウトプットの記録。&lt;/p&gt;
&lt;h2 id="インプット"&gt;インプット&lt;/h2&gt;
&lt;h3 id="書籍"&gt;書籍&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;『&lt;a href="https://amzn.to/3sok7MY"&gt;未踏の蒼穹&lt;/a&gt;』&lt;/p&gt;
&lt;p&gt;趣味のSFとして。ジェイムズ・Ｐ・ホーガンの長編作品。作者の『星を継ぐもの』ほど惹かれなかったが、十分面白く読むことができた。作者の科学者に対する理想像の実現が『星を継ぐもの』から今作の間にこのように変わったのだなあという観点で裏読みできたのでもう少し間の作品を埋めてみようかな。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;『&lt;a href="https://amzn.to/3LZAxTL"&gt;情報検索と言語処理 (言語と計算)&lt;/a&gt;』&lt;/p&gt;
&lt;p&gt;今月は情報検索関連でまとまったインプットが必要になったので。初版1999年と古いが（今から見ると）技術的な打ち手がまだ少ない時代は、定量的な評価が難しい人の認知モデルも含めた幅広い議論が交わされており、個人的には立ち返る意味があると思っている。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;『&lt;a href="https://amzn.to/3M11yGd"&gt;情報検索アルゴリズム&lt;/a&gt;』&lt;/p&gt;
&lt;p&gt;同じく情報検索関連のインプットとして。初版2002年。ベクトル空間からの近傍探索、アドホックな文字列照会による検索、索引構築を備えた検索などの基本が広く紹介されている。現在では前半の、これらを一貫して評価するための検索モデルや基準などの整理が参考になると思われた。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;『&lt;a href="https://amzn.to/3BUPj9v"&gt;情報検索のためのユーザインタフェース&lt;/a&gt;』&lt;/p&gt;
&lt;p&gt;同上。初版2011年。以前読んだものだが検索の個人化について章が割り当てられていたので目を通した。フィードバックをどう負担なく獲得しかつ有用に活かすかについて各研究が苦労している様が見てとれる。全体的な傾向を活かすところから順次粒度を細かくしていくのが王道だろうか。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;『&lt;a href="https://amzn.to/33W6I5e"&gt;AIアルゴリズムマーケティング 自動化のための機械学習/経済モデル、ベストプラクティス、アーキテクチャ&lt;/a&gt;』&lt;/p&gt;
&lt;p&gt;同上。初版2018年。主に検索部分に目を通した。各施策に対してビジネス的な目標をおいた上でモデルやアーキテクチャを検討している。検索においては、その目標に沿って主観的にコントロール可能な部分が例示されており参考になった。上述の評価指標と組み合わせることで検索機構に対して求める性能の解像度を上げることができたと思う。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;『&lt;a href="https://amzn.to/33RIPLZ"&gt;Elasticsearch実践ガイド&lt;/a&gt;』&lt;/p&gt;
&lt;p&gt;同上。初版2018年。施策を具体的な実装に落とし込む際の用語の紐付けのために読んだ。アーキテクチャの全体と基本的な使い方がわかりやすく図解で紹介されており素早く目的を達成できた。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;『&lt;a href="https://amzn.to/3hgxvMA"&gt;Pythonではじめる 情報検索プログラミング&lt;/a&gt;』&lt;/p&gt;
&lt;p&gt;同上。初版2020年。情報検索に関する基本的なアルゴリズムを実際に手を動かしながら体験できる。具体的にどういう結果がえられるのか、アルゴリズムごとの特性の違いは何かなど勘所をつかむ上で良さそう。特にうまく検索できないパターンなどを具体的なイメージを得られるのではないだろうか。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;『&lt;a href="https://amzn.to/3Ho8OIw"&gt;情報検索 :検索エンジンの実装と評価&lt;/a&gt;』&lt;/p&gt;
&lt;p&gt;同上。初版2020年。タイトルの通り検索エンジンを実装し評価するために必要な技術が詳細に解説されている。今回は検索サーバを使う上での観点が必要だったのでパート3の検索とランキング部分を読んだ。検索サーバで提供されていない基準でどういう手法をとれるかという知識のインデックスを増やせたと思う。必要に応じて読み直すつもり。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;『&lt;a href="https://amzn.to/35bOoFF"&gt;A/Bテスト実践ガイド　真のデータドリブンへ至る信用できる実験とは&lt;/a&gt;』&lt;/p&gt;
&lt;p&gt;同上。初版2021年。情報検索の施策の有用性の評価の参考のため読んだ。A/Bテストの重要性や手法に加え、それを文化として根付かせるためのノウハウが紹介されている。個人的には多腕バンディットで解決できる部分も多いと思っていたが、その背景にある対照実験のための知識は重要だと改めて認識できたという面で参考になった。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;『&lt;a href="https://amzn.to/3BThXI8"&gt;入門 機械学習による異常検知―Rによる実践ガイド&lt;/a&gt;』&lt;/p&gt;
&lt;p&gt;時系列データの変化点検出をやりたくなり、以前も参考にしていた『&lt;a href="https://amzn.to/3BQL132"&gt;異常検知と変化検知&lt;/a&gt;』とあわせて読んだ。非常に参考になるが、分布の仮定が今回解きたいものと合わないかもしれないなあというところで引き続き調べている。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;『&lt;a href="https://amzn.to/3hieMQH"&gt;Machine Learning for Data Streams: with Practical Examples in MOA (Adaptive Computation and Machine Learning series) (English Edition)&lt;/a&gt;』&lt;/p&gt;
&lt;p&gt;同じく変化点検出の方式調査で読んでいる。多腕バンディットやフィードバック制御など逐次的に適応していくような仕組みが好きなのだが、そのような仕組みのひとつで一時期調べていたADWINの提案者が執筆に参加しているもの。各方式については簡単な紹介だけなので英語であっても読みやすいが、アルゴリズム等の詳細は論文を読む必要があると思う。自分の興味範囲を整理整頓するのに良いと思い少しづつ読むことにした。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="論文"&gt;論文&lt;/h3&gt;
&lt;p&gt;読めていなかった〜。&lt;/p&gt;
&lt;h2 id="アウトプット"&gt;アウトプット&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://github.com/monochromegane/banditalgorithms"&gt;Bandit algorithms&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;研究のシミュレーションで使う比較用の多腕バンディットのアルゴリズムをテスト込みできちんと整備することにした。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>2022年1月のアイオー</title><link>https://blog.monochromegane.com/diary/20220130-io/</link><pubDate>Sun, 30 Jan 2022 19:04:47 +0900</pubDate><guid>https://blog.monochromegane.com/diary/20220130-io/</guid><description>&lt;p&gt;月ごとのインプットとアウトプットの記録。&lt;/p&gt;
&lt;h2 id="インプット"&gt;インプット&lt;/h2&gt;
&lt;h3 id="書籍"&gt;書籍&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;『&lt;a href="https://amzn.to/3rerg1O"&gt;未来は予測するものではなく創造するものである　――考える自由を取り戻すための〈ＳＦ思考〉&lt;/a&gt;』&lt;/p&gt;
&lt;p&gt;2022年の目標である100倍研究のため、入出力の幅を広げられたらと思い読んだもの。SFプロトタイピング、実例などが紹介されている。自分や研究所として、実際にSFとして仕立てる必要はないと思うが、研究テーマやストーリーの生成に、バックキャスティング、フォアキャスティングの反復を意識的に取り入れることは重要だなと思えた。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;『&lt;a href="https://amzn.to/3oakVlW"&gt;WEB+DB PRESS Vol.126&lt;/a&gt;』&lt;/p&gt;
&lt;p&gt;特集の「Goで作って学ぶ検索エンジン」が気になって読んだ。この特集自体は『&lt;a href="https://amzn.to/3rerRk4"&gt;情報検索の基礎&lt;/a&gt;』を思い出しながらふむふむとさっくり読めた。実装もついている点も良かった。せっかくなので他の記事も読んだが、コンテナやプライバシー関連の動向など界隈の新しめの情報が端的にまとまっており継続して読んでおこうと思えた。自身の研究がアルゴリズム寄りになりつつあるが、システムとして導入、評価できるという強みは保っておきたいことだし。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;『&lt;a href="https://amzn.to/3Ght26m"&gt;データサイエンスの無駄遣い 日常の些細な出来事を真面目に分析する&lt;/a&gt;』&lt;/p&gt;
&lt;p&gt;もっと機械学習等をどんどん使っていって普段の選択肢を広げたいなあとは思っているので、アイディアのヒントがないかなと読んだもの。なるほどこういう動機や解決策もあるんだなあと思いつつ、現時点ではあまりヒントにはならなかったかな。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;『&lt;a href="https://amzn.to/3reDk33"&gt;完全独習 ベイズ統計学入門&lt;/a&gt;』&lt;/p&gt;
&lt;p&gt;以前読んだはずだけど、所長が読んだという情報から内容が全然思い出せなかったので再読。今よりベイズ統計がさらにわかってなかった時に読んだのだが、今ならすんなり理解ができるので少しは成長した様子。離散から連続確率になるときに条件付き確率と記述されているのが尤度関数になる部分に納得がいかなかったのだが、研究所で教えてもらって理解がより深まった感じ。ありがたい。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;『&lt;a href="https://amzn.to/3oa1d9I"&gt;ガイダンス 確率統計: 基礎から学び本質の理解へ&lt;/a&gt;』&lt;/p&gt;
&lt;p&gt;確率統計はずっと苦手意識があるので何度目かの再入門として読んだ。証明や練習問題もありしっかりサポートしてくれているので、もう一周すればだいぶ理解が深まりそうだが、目を通したところまで。確率と集合の記号がもっと動いて見えるまで慣れないとダメだなあ。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;『&lt;a href="https://amzn.to/3gaCz4I"&gt;円　劉慈欣短篇集&lt;/a&gt;』&lt;/p&gt;
&lt;p&gt;趣味のSFとして。『三体』の作者の短編集。単純にどの作品も面白かったが、SF思考の後に読んだので、短編ごとになるほどそういう世界観で、その技術体系を導くのか等、いつもより多角的な視点で読めて良かった。個人的には「詩雲」「二〇一八年四月一日」「人生」が印象に残ったのだが共通点を振り返って自分でも意外だった。多様で飽きのこない短編集だった。おすすめ。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;『&lt;a href="https://amzn.to/3ISWykL"&gt;実践 時系列解析 ―統計と機械学習による予測&lt;/a&gt;』&lt;/p&gt;
&lt;p&gt;研究で時系列を扱う機会はとても多いので新しい観点が得られればと思い読んだもの。解析手法だけでなく、前処理や探索的な解析、データ保存手段、時系列データの探し方、解析の実例等幅広く扱っている。個人的には解析手法における分類自体がそもそもありがたいと感じた。ただし個別の説明はあまりわかりやすいものではないと感じたので、知識のインデックスの増強として割り切って読んだ。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="論文"&gt;論文&lt;/h3&gt;
&lt;p&gt;バンディット系を2本。ちょっと少ないので来月はこの辺を改善しようと思う。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://arxiv.org/abs/2010.00827"&gt;Neural Thompson Sampling&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://arxiv.org/abs/1909.09146"&gt;Weighted Linear Bandits for Non-Stationary Environments&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="アウトプット"&gt;アウトプット&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://github.com/monochromegane/banditsflow"&gt;BanditsFlow&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;100倍研究の出力側の施策として。研究で扱うシミュレーションに纏わる、開発効率の改善や再現性の確保といったいくつかの課題を解決する。シミュレーションにおける定型化可能なワークフロー、ならびにこれらのパラメータや結果の管理を一元に行えるフレームワークである。Gitとあわせて実験内容とその結果を時系列的にコード管理する予定。来月から玄人実行していく。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="100倍アイオーのために"&gt;100倍アイオーのために&lt;/h2&gt;
&lt;p&gt;今月はTwitterを制限して読書量が増えたので良かった。
全然見ないというのも情報収集に支障が出るので、以下のような雑スクリプトを一日一回だけ実行している。&lt;/p&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;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#!/bin/bash
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;argv&lt;span style="color:#f92672"&gt;=(&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$@&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; i in &lt;span style="color:#e6db74"&gt;`&lt;/span&gt;seq &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; $#&lt;span style="color:#e6db74"&gt;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; yesterday&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;`&lt;/span&gt;date -v-1d &lt;span style="color:#e6db74"&gt;&amp;#39;+%Y-%m-%d&amp;#39;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; encoded&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;`&lt;/span&gt;echo &lt;span style="color:#e6db74"&gt;&amp;#34;https://twitter.com/search?q=from:&lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;argv[$i-1]&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt; since:&lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;yesterday&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;_00:00:00_JST until:&lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;yesterday&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;_23:59:59_JST&amp;amp;src=typed_query&amp;amp;f=live&amp;#34;&lt;/span&gt; | ruby -r uri -ne &lt;span style="color:#e6db74"&gt;&amp;#39;print URI.encode $_.chomp&amp;#39;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; open $encoded
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;done&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;以下のように実行すると、@hogeさんと@fugaさんと@piyoさんの昨日のTweetだけがそれぞれ検索結果のページとして開く。&lt;/p&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;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ ./tw.sh hoge fuga piyo
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Twitterの中毒性は、未読を消化するべく無限に見てしまうことだと思う。
この検索結果のページでは過去にスクロールできないため、やめ時が明確になる点が良い。
今のところはうまくいっていると思う。&lt;/p&gt;
&lt;p&gt;検索クエリは&lt;a href="https://scrapbox.io/june29/"&gt;29box&lt;/a&gt;を参考にしました。ありがとうございます。&lt;/p&gt;</description></item><item><title>2021</title><link>https://blog.monochromegane.com/blog/2021/12/29/2021/</link><pubDate>Wed, 29 Dec 2021 16:03:57 +0900</pubDate><guid>https://blog.monochromegane.com/blog/2021/12/29/2021/</guid><description>&lt;p&gt;2021年は、自分の研究テーマとひたすら向き合った年となった。
昨年10月より博士後期課程に在学していることもあり、まずは1本国際会議に通すべく、自身の提案手法の改善、評価と従来手法との比較分析を、1年間ひたすら続けていた。
研究の進捗の節目ごとに投稿していた国際会議は、残念ながら3回投稿して全てリジェクトとなってしまったが、これらのフィードバックや方式の改善の結果、論文の質や提案手法の性能はこの1年間で随分上がったのではないかと思う。&lt;/p&gt;
&lt;p&gt;実際に、これらの進捗を議論すべく報告した、国内の2回の研究会では3つの賞を受賞することができ、客観的にも、自分の研究テーマとの向き合ってきた結果が出てきていると思える。
昨年度の受賞は、優秀プレゼンテーション賞という発表の分かりやすさの側面が強かったが、今年は、それに加え、座長や運営委員による選定という、より内容に踏み込んだ評価の上での受賞であり、非常に嬉しかったし、国際会議挑戦を継続するにあたって励みになった。&lt;/p&gt;
&lt;p&gt;来年は引き続き国際会議への挑戦と研究の発展を進めたい。
そのために、結果に一喜一憂せずに淡々と継続することを心がけていく。
また、手法改善の基盤となる数学的な能力向上や先行研究のサーベイは一過性ではなく計画的に長期的に取り組めるような枠組みを作り上げたい。
加えて、来年度は、個人のみの研究の位置付けからもう少し視座を高め、例えば研究所の取り組みと各研究員の研究、会社のサービスやビジョンとの関係性などから、方針や行動を見定め、それらに向かって導いたり知ってもらえるような振る舞いなど、今よりも先を見通し、今よりも大きく影響を与えることも意識していきたい。&lt;/p&gt;
&lt;p&gt;2022年からは、支えてくれる周りの人にも、恩返しだったり良い影響を与えることをできるようになりたいと思う。
来年もよろしくお願いします。&lt;/p&gt;
&lt;h1 id="実績"&gt;実績&lt;/h1&gt;
&lt;p&gt;以下、実績を列挙する。&lt;/p&gt;
&lt;h2 id="表彰"&gt;表彰&lt;/h2&gt;
&lt;p&gt;2021年は2つの研究会で3つの賞を受賞できた。
聴講者だけでなく運営委員や座長による評価をいただけるような研究を継続的に出せるようになっていることは素直に嬉しい。
また、研究所の共著論文でも2つの賞を受賞しており、研究所全体の盛り上げにも貢献できてよかったと思う。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.sigwi2.org/prev-awardlist"&gt;ARG 第17回Webインテリジェンスとインタラクション研究会 優秀研究賞&lt;/a&gt;, 三宅 悠介, 峯 恒憲, 仮想的な探索を用いて文脈や時間の経過による番狂わせにも迅速に追従する多腕バンディット手法, 2021年12月.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://sites.google.com/view/sig-macc/smash/smash21-summer-symposium"&gt;SMASH21 Summer Symposium 優秀賞&lt;/a&gt;, 三宅 悠介, 峯 恒憲, Synapse: 文脈と時間経過に応じて推薦手法の選択を最適化するメタ推薦システム, 2021年9月.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://sites.google.com/view/sig-macc/smash/smash21-summer-symposium"&gt;SMASH21 Summer Symposium 奨励賞&lt;/a&gt;, 三宅 悠介, 峯 恒憲, Synapse: 文脈と時間経過に応じて推薦手法の選択を最適化するメタ推薦システム, 2021年9月.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="論文"&gt;論文&lt;/h2&gt;
&lt;p&gt;招待講演1本、研究報告2本。
実際には国際会議3回投稿、投稿中の国内ジャーナル1本があり、体感的な執筆量は例年と変わらない程度であったと思う。
また、研究報告のラストオーサーを2本、国内査読付き論文と国際会議（ワークショップ）論文でそれぞれ1本づつ共著を務めた。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;三宅 悠介, 峯 恒憲, &lt;a href="https://www.sigwi2.org/d_library"&gt;仮想的な探索を用いて文脈や時間の経過による番狂わせにも迅速に追従する多腕バンディット手法&lt;/a&gt;, ARG Webインテリジェンスとインタラクション研究会 第17回研究会予稿集, No.17, pp.19-24, Dec 2021. &lt;a href="https://rand.pepabo.com/papers/wi2-17-miyakey.pdf"&gt;[論文]&lt;/a&gt; &lt;a href="https://speakerdeck.com/monochromegane/wi2-lkf-bandits"&gt;[発表資料]&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;三宅 悠介, 峯 恒憲, &lt;a href="http://id.nii.ac.jp/1001/00212709/"&gt;Synapse: 文脈と時間経過に応じて推薦手法の選択を最適化するメタ推薦システム&lt;/a&gt;, 研究報告知能システム（ICS）, Vol.2021-ICS-204, No.9, pp.1-8, Sep 2021. &lt;a href="https://rand.pepabo.com/papers/smash21-miyakey.pdf"&gt;[論文]&lt;/a&gt; &lt;a href="https://speakerdeck.com/monochromegane/smash21-synapse"&gt;[発表資料]&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;三宅 悠介, 栗林 健太郎, &lt;a href="https://tsys.jp/dicomo/2021/program/program_abst.html#8A-1"&gt;(招待講演) なめらかなシステムと運用維持の未来&lt;/a&gt;, マルチメディア，分散，協調とモバイル（DICOMO2021）シンポジウム論文集, 2021, p.1509, Jun-Jul 2021.&lt;a href="https://rand.pepabo.com/papers/dicomo2021-miyakey.pdf"&gt;[論文]&lt;/a&gt; &lt;a href="https://speakerdeck.com/monochromegane/dicomo2021-coherently-fittable-system"&gt;[発表資料]&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="国内発表"&gt;国内発表&lt;/h2&gt;
&lt;p&gt;技術イベント、研究会での発表をそれぞれ1回（学会の研究会、シンポジウムを除く）。
今年はFukuoka.goもWSAも開催が少なかったこともあり、随分控えめになってしまった。
来年はもう少し機会を見つけて登壇していきたい。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;三宅 悠介 &lt;a href="https://speakerdeck.com/monochromegane/fukoukago17-go-code-embedding"&gt;go:embedでExplainable Binaryを作る&lt;/a&gt;, &lt;a href="https://fukuokago.connpass.com/event/202570/"&gt;Fukuoka.go#17(オンライン開催)&lt;/a&gt;, 2021年6月.&lt;/li&gt;
&lt;li&gt;三宅 悠介 &lt;a href="https://blog.monochromegane.com/blog/2021/06/08/wsa8-predictive-exploratory-model/"&gt;非定常な多腕バンディット問題において効率的に変化を察知する方式の検討&lt;/a&gt;, &lt;a href="https://wsa.connpass.com/event/207143/"&gt;Web System Architecture 研究会 (WSA研) #8&lt;/a&gt;, 2021年6月.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="oss"&gt;OSS&lt;/h2&gt;
&lt;p&gt;Fukuoka.go用に書いたツールが1本。
先行研究の実装など随分とコードは書いている気がするので研究とOSSもうまくつないでいきたいところ。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/monochromegane/go-code-embedding"&gt;go-code-embedding&lt;/a&gt; A tool to embed Go source code into binary using go:embed.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="コミュニティ活動"&gt;コミュニティ活動&lt;/h2&gt;
&lt;p&gt;今年よりこれまでのFukuoka.goに加え、学会系の活動も手伝うようになった。
具体的には研究会の運営委員への就任に伴う運営従事の他、査読、座長、シンポジウムのプログラム委員などを務めた。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://fukuokago.connpass.com/event/202570/"&gt;Fukuoka.go#17 (オンライン開催)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.iot.ipsj.or.jp/"&gt;情報処理学会 インターネットと運用技術研究会 運営委員 就任&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.iot.ipsj.or.jp/symposium/iots2021/"&gt;第14回 インターネットと運用技術シンポジウム（IOTS 2021）プログラム委員&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="ブログ"&gt;ブログ&lt;/h2&gt;
&lt;p&gt;2本。昨年までに比べるとかなり少なめだが、研究の進め方シリーズとして集中的サーベイは研究所のみんなに紹介するなど役立ったと思う。
このような手探りからやり方に昇華できたものは今後もブログにまとめていきたい。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://blog.monochromegane.com/blog/2021/06/08/wsa8-predictive-exploratory-model/"&gt;非定常な多腕バンディット問題において効率的に変化を察知する方式の検討&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.monochromegane.com/blog/2021/05/15/survey-method/"&gt;研究の位置づけを明確にする集中型の論文サーベイ方法&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>非定常な多腕バンディット問題において効率的に変化を察知する方式の検討</title><link>https://blog.monochromegane.com/blog/2021/06/08/wsa8-predictive-exploratory-model/</link><pubDate>Tue, 08 Jun 2021 10:52:04 +0900</pubDate><guid>https://blog.monochromegane.com/blog/2021/06/08/wsa8-predictive-exploratory-model/</guid><description>&lt;p&gt;このエントリは、&lt;a href="https://wsa.connpass.com/event/207143/"&gt;第8回 Web System Architecture 研究会 (WSA研)&lt;/a&gt;の予稿です。&lt;/p&gt;
&lt;h1 id="非定常な多腕バンディット問題において効率的に変化を察知する方式の検討"&gt;非定常な多腕バンディット問題において効率的に変化を察知する方式の検討&lt;/h1&gt;
&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;
&lt;p&gt;適応的なシステムの実現には、利用者と情報システムが互いの状態をよく理解するためのコミュニケーションと、それに応じた振る舞いの変更が必要となる。
一方で、そのコミュニケーションから得られる情報や利益の価値を考慮しなければならない環境では、確実な情報に基づく振る舞いを選択しつつ、まだ得られていない情報を引き出すために、価値の低いコミュニケーションを敢行しなければならない。&lt;/p&gt;
&lt;p&gt;これは、多腕バンディット問題として定式化できる。
多腕バンディット問題では、振る舞いの選択肢のことを腕と呼び、ある時点までの情報をもとに有効な腕を選択することを「活用」、腕の可能性を探るために有効ではない腕を選択することを「探索」と呼ぶ。
それぞれの腕はある確率分布に従い報酬を生成する。
中でも、選択肢の相対的な有効性が時間経過とともに変化する問題設定は非定常な多腕バンディット問題と呼ばれ、いくつかの解法が提案されている。&lt;/p&gt;
&lt;p&gt;非定常な多腕バンディット問題に対する解法には、腕の有効性の変化に応じた評価の更新が重要とされてきた。
しかしながら、選択による機会損失の低減を目的とした多腕バンディット問題の設定では、ある時点で有効性の低い選択肢が利用される機会は少なく、腕の有効性の変化を察知する、それ自体がまず難しい。&lt;/p&gt;
&lt;p&gt;本研究では、このような非定常な多腕バンディット問題における変化を素早く察知するにあたり、探索による機会損失を抑制した、効率的な方式を検討する。
なお、多腕バンディット問題の設定は、同時に文脈付きの問題設定に拡張することができるが、課題の本質は同じであること、方式検討の容易性から、本方向では文脈の考慮は行わない。&lt;/p&gt;
&lt;h2 id="非定常な多腕バンディット問題の解法における変化察知の課題"&gt;非定常な多腕バンディット問題の解法における、変化察知の課題&lt;/h2&gt;
&lt;p&gt;非定常な多腕バンディット問題への解法では、腕の報酬分布が変化した際に、過去に観測した報酬に捉われずに腕の評価を迅速に更新しなくてはならない。
この問題の解法には大きく4つのアプローチがある。
一つ目は、腕の報酬分布が変化することを前提にして、観測時点からの経過に応じて腕の評価に重み付けをするアプローチである（減衰型）。
二つ目も、同様の前提において、新しく観測した報酬から一定の期間のみの情報で報酬分布を評価する（ウィンドウ型）。
三つ目は、腕の報酬分布の変化を契機として、腕を再評価するものである（変化検出型）。
このアプローチでは、変化検出の手法を用いて腕の報酬の変化を検出し、変化前の観測を取り除くことで、新しく観測された報酬を重視する。
これは変化検出による可変のウィンドウ型とみなすこともできる。
四つ目は、現時点の腕の評価を継続的に推定するものである。
このアプローチでは、腕の状態として状態空間モデルを仮定し、カルマンフィルタや粒子フィルタを推定に用いる。&lt;/p&gt;
&lt;p&gt;これらの全てのアプローチは、変化後の報酬分布から得られる報酬のサンプルを一定数必要とする。
選択による機会損失の低減を目的とした多腕バンディット問題の設定では、ある時点で評価の高い腕を最も多く活用する。
そのため、評価の高い腕が、ある時点で有効性が低くなるようなケースでは、十分な報酬のサンプルを観測することができ、各アプローチは有効に働く。
反対に、評価の低かった腕が、ある時点で有効性が高くなるケースでは、その腕に対する報酬のサンプルを得るまでに時間が掛かり、機会損失の発生に繋がると考えられる。
例えば、ECサイトの推薦アルゴリズムのコールドスタートのような、一定の嗜好情報が蓄積されることでその有効性を増すような選択肢がある場合に、この問題が発生する。&lt;/p&gt;
&lt;p&gt;この問題に直接挑んだ先行研究[1][2]では、いずれもなんらかの非定常な多腕バンディットの解法に従い腕の選択を行うが、一定の割合で、ランダムに腕を選択することで、腕の選択の偏りの解消を試みている。
また、上述のアプローチのうち、報酬の観測数の上限を変化させるような、減衰型、ウィンドウ型、変化検出型でも、間接的に腕の選択の偏りが緩和される。
なぜなら、多くの多腕バンディットの解法では、観測数の少なさを評価の不確かさと捉え、探索を促すからである。&lt;/p&gt;
&lt;p&gt;これらの探索を増やすアプローチは、トレードオフが発生する。
すなわち、相対的な腕の評価が逆転しない期間では、その期間中の探索が機会損失につながってしまう。
そのため、評価の低い腕の有効性の変化を素早く察知できるよう探索を行いつつ、その探索に伴う機会損失を減らすことが求められる。&lt;/p&gt;
&lt;h2 id="非定常な多腕バンディット問題の解法における効率的な変化察知の方式の検討"&gt;非定常な多腕バンディット問題の解法における、効率的な変化察知の方式の検討&lt;/h2&gt;
&lt;p&gt;本研究では、評価の低い腕に対する変化の察知について、素早さと機会損失低減の観点を両立させるため、この探索行為を多腕バンディット内の多腕バンディットとみなす。
そして、この多腕バンディット内の多腕バンディットの評価基準に、腕の不安定性と、将来性を採用することで、探索時の機会損失低減を目指す。&lt;/p&gt;
&lt;p&gt;本報告では、先行研究の一定の割合で実施される探索行為を対象として機会損失の改善を目指す。
すなわち、腕の選定の比率が同一となるようなランダム選定ではなく、腕の不安定性と将来性を基準に、腕の選定の比率を変化させる。
提案手法では、腕の不安定性と将来性を扱うために、獲得報酬の時系列予測を行う。
時系列予測には、将来性の変化を扱えるよう少なくともトレンド成分を扱うことができ、不安定性を扱えるよう予測の幅も扱えるようなモデルが望ましい。
そこで、これらを満たすベイズ型統計モデルを採用する。
扱う報酬の形式により、カルマンフィルタや粒子フィルタを選択可能である。
探索には、各腕でn時点先の評価を予測値と信用区間に基づき腕の不安定性と将来性が高い腕を選定する。
予測値が将来性、信用区間の広さが不安定性に該当する。
なお、これらのモデルでは時系列予測の時点が進むにつれ、その信用区間が広がっていくことから、無限の将来を想定した腕の選定では、先行研究と同じ振る舞いになると考えられる。&lt;/p&gt;
&lt;h2 id="評価"&gt;評価&lt;/h2&gt;
&lt;p&gt;カルマンフィルタベースの提案方式のコンセプト実装し、トイ・シミュレーションで機会損失を抑えられることを評価した。&lt;/p&gt;
&lt;h3 id="シミュレーション設定"&gt;シミュレーション設定&lt;/h3&gt;
&lt;p&gt;評価環境として、腕の数が3、1000回の試行において、期間中に有効性の最も低かった腕が最も高くなるよう設定した。
なお、このシミュレーションでは、先行研究における一定数の割合の探索の試行のみを取り出したことを想定している。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://user-images.githubusercontent.com/1845486/120578001-10a3b200-c460-11eb-83f6-d9b4d703125b.png" alt="plot_true_reward"&gt;&lt;/p&gt;
&lt;h3 id="評価方法"&gt;評価方法&lt;/h3&gt;
&lt;p&gt;そして、以下のそれぞれの方式に対して、機会損失を抑える性能と変化を素早く察知する性能を評価した。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;random: ランダムな探索（予測できない未来を想定）ε-Greedy(ε=1.0)&lt;/li&gt;
&lt;li&gt;epsilon: 現在の情報に基づく探索（予測できない未来を想定）ε-Greedy(ε=0.1)&lt;/li&gt;
&lt;li&gt;state model: 予測に基づく探索（予測できる未来を想定）ε-Greedy(ε=0.1)だが活用時はカルマンフィルタによる100期先予測の値で選定する&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;なお、本報告の提案手法のコンセプト実装では、将来性のみを扱い、不安定性の考慮はできていない。&lt;/p&gt;
&lt;p&gt;本評価では、機会損失を抑える性能を、累積リグレットの低さによって評価する。
本報告で、累積リグレットとは、各時点での最適な腕から得られる期待報酬額と方策が選定した腕から得られた報酬額の差の合計のことを指す。
また、変化を素早く察知する性能を、腕の真の有効性が切り替わった時点以降で新しい最適な腕を選択した回数が一定数を超えるまでの期間の短さによって評価する。&lt;/p&gt;
&lt;p&gt;なお、準備期間の関係上、シミュレーションは複数回行っていないため、変動する可能性がある。&lt;/p&gt;
&lt;h3 id="機会損失を抑える性能の評価"&gt;機会損失を抑える性能の評価&lt;/h3&gt;
&lt;p&gt;各方式の累積リグレットの推移を下図に示す。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://user-images.githubusercontent.com/1845486/120577990-0e415800-c460-11eb-9521-bc81e83b2f38.png" alt="plot_cum_regret"&gt;&lt;/p&gt;
&lt;p&gt;均等に腕を選択するrandomではおおよそ線形にリグレットが増加する。
epsilonでは、変化前のリグレットの増加は抑えられるが、変化後には追従が遅れ、リグレットが大きく増加した。
これは、腕の選定の偏りによって探索が十分に行えないことと、過去データにひきづられて腕の評価の更新が遅れていることから発生していると考えられる。&lt;/p&gt;
&lt;p&gt;提案のstate modelでは、シミュレーション初期にrandomと同じ程度のリグレットの増加が確認された。
これは、予測に基づく活用が精度が低かったことに起因する。
50時点以降は予測が安定することで、リグレットの増加がepsilonと同等になった。
そして、変化後であっても、リグレットの増加が抑えられていることが確認できる。
これは、予測によって、将来性がある探索すべき腕を決定し、評価の更新をいち早く行えたためである。&lt;/p&gt;
&lt;h3 id="変化を素早く察知する性能の評価"&gt;変化を素早く察知する性能の評価&lt;/h3&gt;
&lt;p&gt;切り替わり後の最適な腕を選択した累積回数の推移を下図に示す。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://user-images.githubusercontent.com/1845486/120577999-10a3b200-c460-11eb-8798-e56325190308.png" alt="plot_sampled_new_arm"&gt;&lt;/p&gt;
&lt;p&gt;均等に腕を選定するrandomではおおよそ線形に腕が選定される。
本研究の課題設定では、この増加より大きいことが望まれる。
epsilonでは、腕の有効性の変化に追従できず、ε-Greedyの探索割合に応じた増加にとどまった。
これは、腕の選択肢が増加するほど、探索が行われない可能性が増すことも示している。
提案のstate modelでは、予測によって、将来性がある探索すべき腕を決定し、該当の腕に対する探索がrandomと比べて多く行われた。
これにより、変化の察知が素早く進むことが期待できる。&lt;/p&gt;
&lt;p&gt;腕の有効性の変更に対する、提案方式の100時点先の予測を下図に示す。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://user-images.githubusercontent.com/1845486/120577996-0f728500-c460-11eb-963f-63cf25f17038.png" alt="plot_predicted_reward"&gt;&lt;/p&gt;
&lt;p&gt;本評価のシミュレーション設定は非常に単純なものであったため、予測がおおよそ正しかったことがわかる。&lt;/p&gt;
&lt;h2 id="まとめ"&gt;まとめ&lt;/h2&gt;
&lt;p&gt;本報告では、非定常な多腕バンディットにおける変化の察知の課題を整理し、腕の不安定性と将来性に着目した予測型の多腕バンディット方策を提案した。
将来性を考慮可能なコンセプト実装では、シミュレーションにおいて、累積リグレットを抑えた素早い変化察知の可能性が示唆された。
今後はコンセプト実装に、不安定性の考慮を組み込むこと、そのためにε-Greedyではなくトンプソンサンプリングをベースにした手法との統合を進めたい。
また、文脈を考慮した場合での実装とシミュレーションの拡張を行う。
加えて、探索割合自体を環境の変化の度合いに応じて変動させる方式も検討する。&lt;/p&gt;
&lt;h2 id="参考文献"&gt;参考文献&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;[1] Fang Liu, Joohyun Lee, and Ness Shroff. 2018. A change-detection based framework for piecewise-stationary multi-armed bandit problem. In Proceedings of the AAAI Conference on Artificial Intelligence, Vol. 32.&lt;/li&gt;
&lt;li&gt;[2] Yang Cao, Zheng Wen, Branislav Kveton, and Yao Xie. 2019. Nearly optimal adaptive procedure with change detection for piecewise-stationary bandit. In The 22nd International Conference on Artificial Intelligence and Statistics. PMLR, 418–427.&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id="発表スライド"&gt;発表スライド&lt;/h1&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;h1 id="発表を終えて"&gt;発表を終えて&lt;/h1&gt;
&lt;!-- raw HTML omitted --&gt;</description></item><item><title>研究の位置づけを明確にする集中型の論文サーベイ方法</title><link>https://blog.monochromegane.com/blog/2021/05/15/survey-method/</link><pubDate>Sat, 15 May 2021 15:35:14 +0900</pubDate><guid>https://blog.monochromegane.com/blog/2021/05/15/survey-method/</guid><description>&lt;p&gt;博士課程に進学し、国際会議に論文を投稿した際に行った論文サーベイの流れやツールについてまとめておく。
今回のサーベイを行うにあたり、既存研究に対する自身の研究の位置づけを明らかにすることを目標とした。
すなわち、自身の提案がある程度カタチになっていることを前提とした集中的サーベイ方法である。&lt;/p&gt;
&lt;h1 id="論文サーベイの流れ"&gt;論文サーベイの流れ&lt;/h1&gt;
&lt;p&gt;以下に行った工程を示す。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;会議名とキーワード検索による候補のリストアップ&lt;/li&gt;
&lt;li&gt;各候補のアブストラクトによる選定&lt;/li&gt;
&lt;li&gt;各候補の精読&lt;/li&gt;
&lt;li&gt;必要に応じて参考になる会議名、キーワード、参照論文を候補に追加&lt;/li&gt;
&lt;li&gt;候補がなくなるまで繰り返す&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;以降、各工程について利用したツールや工夫などを述べる。&lt;/p&gt;
&lt;h1 id="1-会議名とキーワード検索による候補のリストアップ"&gt;1. 会議名とキーワード検索による候補のリストアップ&lt;/h1&gt;
&lt;p&gt;サーベイは十分な量の候補を必要とする。
自身の研究分野や貢献と完全に一致する論文は多くはないが、全くゼロではない。
もし多すぎるのであれば、自身の研究の貢献や目的が十分に掘り下げられていない可能性がある。
もしゼロであれば、自身の研究に有用性がないか、十分な調査ができていないかもしれない。
自身の研究を信じる我々は、いずれにせよ十分に候補を見つける必要がある。&lt;/p&gt;
&lt;p&gt;候補の選定には、&lt;a href="https://scholar.google.com/"&gt;Google Scholar&lt;/a&gt;によるキーワード検索を用いる。
なるべく多くの論文を候補とするため、キーワードは関連しそうなキーワードを複数挙げて、ORで繋ぐと良い。
この時、指導教官からのアドバイスで会議名を絞って検索するようにした。
これは、検索クエリに &lt;code&gt;source:SIGKDD&lt;/code&gt; などと指定することで実現できる。&lt;/p&gt;
&lt;p&gt;そして、検索結果から以下の情報をリスト化する。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Title&lt;/li&gt;
&lt;li&gt;Citiations&lt;/li&gt;
&lt;li&gt;URL&lt;/li&gt;
&lt;li&gt;Authors&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;おおよそ、Google Scholarではキーワードへの関連性が高いものから並べてくれているため、会議ごとに上位20-50本程度を候補とすれば十分であったように思える。&lt;/p&gt;
&lt;p&gt;リスト化にはGoogleスプレッドシートを利用した。後の工程のため、関連有無フラグとメモ欄をカラムとして追加する。&lt;/p&gt;
&lt;p&gt;なお、検索〜リスト作成は手動では面倒なので、スクリプトを用意した。&lt;/p&gt;
&lt;h1 id="2-各候補のアブストラクトによる選定"&gt;2. 各候補のアブストラクトによる選定&lt;/h1&gt;
&lt;p&gt;1.でリストアップした候補について、精読すべきかの選定を行う。
なお、選定はアブストラクトのみで行うこと。
ここで、個別に精読を始めると時間がいくらあっても足りないからである（逆に言えば自身の研究もやはりアブストラクトに提案と貢献をしっかり記述する必要がある）。&lt;/p&gt;
&lt;p&gt;選定基準は自身の研究や提案、貢献に関連がありそうかとする。
また、いくつか読んでいく中で判断基準が徐々に形成されていくので、効率よく見直せるよう、メモを書いておく。
メモには、どういう提案や手法かを一行程度書けば良い。
精読すべきと判断したものには、リストに丸をつけ、フィルタなり色付けして候補を見つけやすくしておく。&lt;/p&gt;
&lt;h1 id="3-各候補の精読"&gt;3. 各候補の精読&lt;/h1&gt;
&lt;p&gt;2.で選定した精読候補を読み、まとめる。
多くの論文を読まなければならないこと、最終的に自分の研究との相対的な位置づけを整理する必要があるため、効率よく見直せるようまとめを残す必要がある。
まとめがないと何度も同じ論文をイチから読み直す必要があるので絶対にまとめること。
以下にまとめの観点とこれを実現するツールについて示す。&lt;/p&gt;
&lt;h2 id="まとめの観点"&gt;まとめの観点&lt;/h2&gt;
&lt;p&gt;まとめの粒度や項目が統一されていることが望ましい。
自分は、&lt;a href="https://www.slideshare.net/Ochyai/1-ftma15/"&gt;落合メソッド&lt;/a&gt;をアレンジして使っている。
つまり、自分の研究の位置づけを整理するのに適した問いかけにしている。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;どんなもの？&lt;/li&gt;
&lt;li&gt;先行研究と比べてどこがすごい？（どんな課題を解決する？）&lt;/li&gt;
&lt;li&gt;技術や手法のキモはどこ？（どうやって解決した？）&lt;/li&gt;
&lt;li&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;h2 id="まとめのためのツール"&gt;まとめのためのツール&lt;/h2&gt;
&lt;p&gt;これまで論文管理には、&lt;a href="https://www.mendeley.com/"&gt;Mendeley&lt;/a&gt;を利用し、&lt;a href="https://www.papershipapp.com/"&gt;PaperShip&lt;/a&gt;と同期、必要に応じてiPadで書き込みを行っていた。&lt;/p&gt;
&lt;p&gt;しかしながら、今回まとめには&lt;a href="https://www.notion.so/"&gt;Notion&lt;/a&gt;を別途利用した。
Notionは、論文への直接書き込みの場合の、十分な余白がない点や論文同士の関係性を横串で把握しにくかった点を解消してくれる。
Notionで、上述のアレンジ版落合メソッドを含んだテンプレートを用意し、サーベイDATABASEに論文ごとに1ページ作り、読みながらまとめを作っていく。&lt;/p&gt;
&lt;p&gt;この時、最初からまとめようとすると論文全体を覚えておかなくてはならないので、自由に記入可能なメモ欄を用意して、読みながら、そちらにわかったこと疑問に思ったことなどを気楽に書いて、最後にまとめる方法をとっている。
メモ欄も残したままにしておくと後から読み直した時に記憶が蘇りやすいのでそのまま残している。&lt;/p&gt;
&lt;p&gt;また、Notionでは各ページに対してPropertyを付与することで絞り込みができるため、会議名タグ、論文の発行年度、論文のURL、その論文を読んだ日付、キーワードのタグをPropertyとして設定している。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.monochromegane.com/images/2021/05/notion_survey_template.png" alt="notion-survey-template"&gt;&lt;/p&gt;
&lt;h1 id="4-必要に応じて参考になる会議名キーワード参照論文を候補に追加"&gt;4. 必要に応じて参考になる会議名、キーワード、参照論文を候補に追加&lt;/h1&gt;
&lt;p&gt;精読の中で、気になる会議名、キーワードが追加された場合、もう一度、1.の検索に戻り候補を追加する。
また、参照されている論文も候補に追加する。&lt;/p&gt;
&lt;p&gt;コツとしては、追加された候補に対してすぐにアブストや精読を始めずに、候補として追加に止める事。
この追加した候補はまた新しい候補を増やすので、ゴールが見えなくなってしまうからである。
なので、最初に決めた候補まで読み切ってから、新しい候補の処理に着手すると気分的に進捗感が出て楽であった（これはまあ人による）。&lt;/p&gt;
&lt;h1 id="5-候補がなくなるまで繰り返す"&gt;5. 候補がなくなるまで繰り返す&lt;/h1&gt;
&lt;p&gt;以上を候補がなくなるまで繰り返す。
参考文献が参考文献を呼んで終わらないのではないかと思われたが、2-3周もすれば新しい文献も出てこなくなってくる。
まとめの中で自身の研究が位置付けられてくるので、そこを一旦の止め時とした。&lt;/p&gt;
&lt;h1 id="まとめ"&gt;まとめ&lt;/h1&gt;
&lt;p&gt;国際会議への投稿にあたって、自身の研究の位置づけを明確にするための論文サーベイの方法をまとめた。
今回は、最初のリストが243本、精読が47本であった。
会議を分けてサーベイすることで会議ごとに同じキーワードでも論文に特色があることなどが分かり興味深かった。
また、トップカンファレンスに限ることで、サーベイ効率も高まったと思う。
指導教官に感謝である。&lt;/p&gt;
&lt;p&gt;Notion上の47ページの論文まとめは執筆中、何度も読み直したが自分なりのまとめメモが入っていること、自分の研究との位置づけが一言でまとめられていることから、効率よく記憶が蘇らせることができた。
結果として、複数の論文同士の関係性を整理するという目標に自身のリソースを采配することができたと思う。&lt;/p&gt;
&lt;p&gt;一方で、キーワード検索では、既読管理と相性が悪いため、普段のインプットとしての継続的なサーベイには向かない。
RSSフィード的なインプットの方法を探したい。&lt;/p&gt;</description></item></channel></rss>