<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Posts on takeokunn's blog</title><link>https://www.takeokunn.org/posts/</link><description>Recent content in Posts on takeokunn's blog</description><generator>Hugo -- gohugo.io</generator><language>ja-jp</language><lastBuildDate>Sat, 10 Jan 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://www.takeokunn.org/posts/index.xml" rel="self" type="application/rss+xml"/><item><title>nix-darwinのlinux-builderでNixOSを動かす</title><link>https://www.takeokunn.org/posts/fleeting/20251130151735-run_nixos_apple_linux_builder/</link><pubDate>Sat, 10 Jan 2026 00:00:00 +0000</pubDate><guid>https://www.takeokunn.org/posts/fleeting/20251130151735-run_nixos_apple_linux_builder/</guid><description>&lt;h2 id="背景-動機"&gt;背景・動機&lt;/h2&gt;
&lt;p&gt;元々OrbStack VMでNixOSを動かしていたのだが、k8sを動かす時にOrbStackだと動かずDocker for Macだと動くという事象が発生した。&lt;/p&gt;
&lt;p&gt;調査をした所、nix-darwinがlinux-builderというものをサポートしてることがわかったのでメモしておく。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://scrapbox.io/kanna/nix_linux-builder"&gt;https://scrapbox.io/kanna/nix_linux-builder&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="試したこと-やったこと"&gt;試したこと・やったこと&lt;/h2&gt;
&lt;h3 id="1-dot-linux-builderについて調査"&gt;1. linux-builderについて調査&lt;/h3&gt;
&lt;p&gt;このあたりに纏まっている。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://scrapbox.io/kanna/nix_linux-builder"&gt;nix linux-builder - scrapbox&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://nixcademy.com/posts/macos-linux-builder/"&gt;Build and Deploy Linux Systems from macOS&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;nix-darwinには &lt;a href="https://github.com/nix-darwin/nix-darwin/blob/master/modules/nix/linux-builder.nix"&gt;modules/nix/linux-builder.nix&lt;/a&gt; が提供されており、 &lt;code&gt;enable=true&lt;/code&gt; するだけで &lt;code&gt;launchd.daemons&lt;/code&gt; に登録されるようだ。&lt;/p&gt;
&lt;h3 id="2-dot-nix-darwinを導入してみる"&gt;2. nix-darwinを導入してみる&lt;/h3&gt;
&lt;p&gt;現状の設定は以下。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/takeokunn/nixos-configuration/blob/9b70ffde2c5d0233c0c78b63a1ad36d2638d5268/nix-darwin/config/linux-builder.nix"&gt;https://github.com/takeokunn/nixos-configuration/blob/9b70ffde2c5d0233c0c78b63a1ad36d2638d5268/nix-darwin/config/linux-builder.nix&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-nix" data-lang="nix"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{ lib&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;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; nix&lt;span style="color:#f92672"&gt;.&lt;/span&gt;linux-builder &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; enable &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ephemeral &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;false&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; systems &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [ &lt;span style="color:#e6db74"&gt;&amp;#34;aarch64-linux&amp;#34;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;x86_64-linux&amp;#34;&lt;/span&gt; ];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; config &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; boot&lt;span style="color:#f92672"&gt;.&lt;/span&gt;binfmt&lt;span style="color:#f92672"&gt;.&lt;/span&gt;emulatedSystems &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [ &lt;span style="color:#e6db74"&gt;&amp;#34;x86_64-linux&amp;#34;&lt;/span&gt; ];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; virtualisation &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; cores &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;6&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; memorySize &lt;span style="color:#f92672"&gt;=&lt;/span&gt; lib&lt;span style="color:#f92672"&gt;.&lt;/span&gt;mkForce (&lt;span style="color:#ae81ff"&gt;1024&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;16&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; diskSize &lt;span style="color:#f92672"&gt;=&lt;/span&gt; lib&lt;span style="color:#f92672"&gt;.&lt;/span&gt;mkForce (&lt;span style="color:#ae81ff"&gt;1024&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;200&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; nix&lt;span style="color:#f92672"&gt;.&lt;/span&gt;settings &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; experimental-features &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;nix-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:#e6db74"&gt;&amp;#34;flakes&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; security&lt;span style="color:#f92672"&gt;.&lt;/span&gt;sudo&lt;span style="color:#f92672"&gt;.&lt;/span&gt;extraRules &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&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; users &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [ &lt;span style="color:#e6db74"&gt;&amp;#34;builder&amp;#34;&lt;/span&gt; ];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; commands &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&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; command &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;ALL&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; options &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [ &lt;span style="color:#e6db74"&gt;&amp;#34;NOPASSWD&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&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&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;h3 id="3-dot-動いてることを確認する"&gt;3. 動いてることを確認する&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;take&lt;/code&gt; 部分はwhoamiに読み替えてください。&lt;/p&gt;</description></item><item><title>2025年12月 個人的claude codeワークフロー</title><link>https://www.takeokunn.org/posts/permanent/20251220235900-my_claude_code_workflow/</link><pubDate>Tue, 30 Dec 2025 00:00:00 +0000</pubDate><guid>https://www.takeokunn.org/posts/permanent/20251220235900-my_claude_code_workflow/</guid><description>&lt;h2 id="1-dot-はじめに"&gt;1. はじめに&lt;/h2&gt;
&lt;p&gt;Claude Codeを本格的に使い始めました。&lt;/p&gt;
&lt;p&gt;最初はGitHub Copilotと同じ感覚で、コード生成ツールの延長として使っていたのですが、あるとき気づきました。「セキュリティレビューをお願いしたら、コードスタイルの指摘ばかり返ってきた」「昨日と同じ質問をしたのに、まったく違うフォーマットで回答された」「プロジェクトの規約を毎回説明するのが面倒」。これ、Claude Codeの問題じゃなくて、自分の使い方の問題でした。&lt;/p&gt;
&lt;p&gt;試行錯誤を重ねるうちに、Claude Codeは単なるコード補完ツールではなく、適切に設定すればマルチエージェントシステムとして機能することに気づきました。&lt;/p&gt;
&lt;p&gt;この記事では、構築したワークフローを共有します。&lt;/p&gt;
&lt;p&gt;ちなみに、この記事も大半はClaude Codeに書いてもらいました。&lt;/p&gt;
&lt;h2 id="2-dot-背景と設計哲学"&gt;2. 背景と設計哲学&lt;/h2&gt;
&lt;h3 id="2-dot-1-dot-感じていた課題"&gt;2.1. 感じていた課題&lt;/h3&gt;
&lt;p&gt;Claude Codeを本格的に使い始める前、いくつかの課題を感じていました。&lt;/p&gt;
&lt;p&gt;一番大きかったのは専門性の欠如です。単一のAIエージェントでは、コード品質・セキュリティ・テスト・ドキュメントなど複数のドメインにまたがるタスクをうまく処理できませんでした。セキュリティの観点でレビューをお願いしても、コードスタイルの指摘が混在して、本当に確認したいポイントが埋もれてしまいます。&lt;/p&gt;
&lt;p&gt;出力の不安定性も悩みの種でした。構造化されたプロンプトなしでは、AIの応答品質やフォーマットが毎回異なります。昨日と同じ質問をしても、回答の形式がまったく違うということがよくありました。&lt;/p&gt;
&lt;p&gt;繰り返しの説明にも時間を取られていました。同じパターンや好みを何度もAIに説明する必要があり、徒労感がありました。&lt;/p&gt;
&lt;h3 id="2-dot-2-dot-5つのルール"&gt;2.2. 5つのルール&lt;/h3&gt;
&lt;p&gt;CLAUDE.mdには5つの &lt;code&gt;critical&lt;/code&gt; ルールを定義しています。この5つが私のワークフローの根幹になっています。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;サブエージェントへの委譲 : 親エージェントは方針決定とオーケストレーションに集中し、詳細な作業は専門エージェントに任せる&lt;/li&gt;
&lt;li&gt;Serenaメモリの事前確認 : 実装前に必ず &lt;code&gt;list_memories&lt;/code&gt; と &lt;code&gt;read_memory&lt;/code&gt; でプロジェクトの規約やパターンを確認する&lt;/li&gt;
&lt;li&gt;シンボルレベルの操作 : ファイル全体を読み込むのではなく、Serenaの &lt;code&gt;find_symbol&lt;/code&gt; などでシンボル単位で操作する&lt;/li&gt;
&lt;li&gt;perlでテキスト処理 : sed/awkは使わない。 &lt;code&gt;perl -pe 's/foo/bar/g'&lt;/code&gt; で統一&lt;/li&gt;
&lt;li&gt;英語で出力 : 出力は常に英語に統一&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;なぜこの5つなのか。1と2はマルチエージェント構成の核心、3はトークン効率の改善、4と5は出力の一貫性を担保するためです。&lt;/p&gt;
&lt;h2 id="3-dot-プロンプト設計の基盤"&gt;3. プロンプト設計の基盤&lt;/h2&gt;
&lt;p&gt;ここで紹介するプロンプトの多くは、Claude Code自身に生成させました。「こういう形式で書いて」と伝えて、その出力を調整しながら現在の形に至りました。&lt;/p&gt;
&lt;p&gt;Claude Codeのプロンプトは構造化されたXMLで記述しています。&lt;/p&gt;
&lt;h3 id="3-dot-1-dot-xmlによる構造化プロンプト"&gt;3.1. XMLによる構造化プロンプト&lt;/h3&gt;
&lt;h4 id="3-dot-1-dot-1-dot-なぜxmlなのか"&gt;3.1.1. なぜXMLなのか&lt;/h4&gt;
&lt;p&gt;Markdownやプレーンテキストではなく、XMLを採用しました。これは公式のベストプラクティスではなく、個人的な経験に基づく選択です。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/use-xml-tags"&gt;Anthropicの公式ドキュメント&lt;/a&gt;では、XMLタグについて次のように説明されています:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;There are no canonical &amp;ldquo;best&amp;rdquo; XML tags that Claude has been trained with in particular, although we recommend that your tag names make sense with the information they surround.&lt;/p&gt;</description></item><item><title>「The Rust Programming Language 日本語版」の読書記録</title><link>https://www.takeokunn.org/posts/literature/therustp1-online/</link><pubDate>Thu, 25 Dec 2025 00:00:00 +0000</pubDate><guid>https://www.takeokunn.org/posts/literature/therustp1-online/</guid><description>&lt;h2 id="文献情報"&gt;文献情報&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;出典: &lt;a href="https://doc.rust-jp.rs/book-ja/title-page.html"&gt;The Rust Programming Language 日本語版&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;著者: Rust日本語ドキュメント翻訳プロジェクト&lt;/li&gt;
&lt;li&gt;参照日: 2025-12-25&lt;/li&gt;
&lt;li&gt;種別: オンライン書籍&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="読む目的-背景"&gt;読む目的・背景&lt;/h2&gt;
&lt;p&gt;社内でRustを使っているため、業務で必要な知識として勉強する必要があった。
他言語で得た知識で知ったかぶりせず、Rust固有の概念を正確に理解したい。
特に所有権・借用・ライフタイム・スマートポインタといった概念の本質を理解することを目標とした。&lt;/p&gt;
&lt;h2 id="重要ポイントと引用"&gt;重要ポイントと引用&lt;/h2&gt;
&lt;h3 id="所有権-ownership"&gt;所有権（Ownership）&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;Rustの各値は、所有者と呼ばれる変数と対応している。いかなる時も所有者は一つである。所有者がスコープから外れたら、値は破棄される。&lt;/p&gt;
&lt;p&gt;&amp;mdash; &lt;a href="https://doc.rust-jp.rs/book-ja/ch04-01-what-is-ownership.html"&gt;第4章 所有権を理解する&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;所有権はRustのもっとも特徴的な機能であり、ガベージコレクタなしでメモリ安全性を保証する仕組みになっている。
C/C++ではプログラマが手動でメモリを管理する必要があり、解放忘れ（メモリリーク）や二重解放といったバグが発生しやすかった。
一方、JavaやPythonなどのGC言語では実行時のオーバーヘッドが発生する。
Rustは所有権システムによって、コンパイル時にメモリ管理の正しさを検証し、実行時コストなしで安全性を実現している。&lt;/p&gt;
&lt;p&gt;所有権には3つのルールがある。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Rustの各値は所有者と呼ばれる変数をもつ&lt;/li&gt;
&lt;li&gt;いかなる時も所有者は1つだけ&lt;/li&gt;
&lt;li&gt;所有者がスコープから外れると、値は破棄される（ &lt;code&gt;drop&lt;/code&gt; が呼ばれる）。&lt;/li&gt;
&lt;/ol&gt;
&lt;!--listend--&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-rust" data-lang="rust"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;fn&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:#66d9ef"&gt;let&lt;/span&gt; s1 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; String::from(&lt;span style="color:#e6db74"&gt;&amp;#34;hello&amp;#34;&lt;/span&gt;); &lt;span style="color:#75715e"&gt;// s1が所有者
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; s2 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; s1; &lt;span style="color:#75715e"&gt;// 所有権がs2にムーブ
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt; &lt;span style="color:#75715e"&gt;// println!(&amp;#34;{}&amp;#34;, s1); // エラー: s1は無効
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;println!&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;{}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;, s2); &lt;span style="color:#75715e"&gt;// OK: s2が所有者
&lt;/span&gt;&lt;/span&gt;&lt;/span&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ヒープに確保されるデータ（ &lt;code&gt;String&lt;/code&gt; など）は代入時に所有権がムーブする。
スタックに確保される固定サイズのデータ（整数など）は &lt;code&gt;Copy&lt;/code&gt; トレイトを実装しており、コピーされる。&lt;/p&gt;
&lt;h3 id="借用-borrowing"&gt;借用（Borrowing）&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;関数の引数に参照を取ることを借用と呼びます。現実生活のように、誰かが何かを所有していたら、それを借りることができます。用が済んだら、返さなきゃいけないわけです。&lt;/p&gt;
&lt;p&gt;&amp;mdash; &lt;a href="https://doc.rust-jp.rs/book-ja/ch04-02-references-and-borrowing.html"&gt;第4章 参照と借用&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;借用は所有権をムーブせずにデータにアクセスする仕組みになっている。
関数に値を渡すたびに所有権が移動すると、呼び出し元で値が使えなくなり不便になる。
借用を使えば、所有権を保持したまま一時的にデータへのアクセスを許可できる。&lt;/p&gt;
&lt;p&gt;借用には2種類ある。
不変参照（ &lt;code&gt;&amp;amp;T&lt;/code&gt; ）は読み取り専用で、同時に複数存在できる。
可変参照（ &lt;code&gt;&amp;amp;mut T&lt;/code&gt; ）は書き込み可能だが、同時に1つしか存在できない。&lt;/p&gt;</description></item><item><title>blogをdev.toサポートした</title><link>https://www.takeokunn.org/posts/fleeting/20251124235900-support_dev_to/</link><pubDate>Thu, 25 Dec 2025 00:00:00 +0000</pubDate><guid>https://www.takeokunn.org/posts/fleeting/20251124235900-support_dev_to/</guid><description>&lt;h2 id="背景-動機"&gt;背景・動機&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://github.com/takeokunn/blog"&gt;takeokunn/blog&lt;/a&gt; でdev.toの記事を管理できるようにしたのでメモしておく。&lt;/p&gt;
&lt;h2 id="試したこと-やったこと"&gt;試したこと・やったこと&lt;/h2&gt;
&lt;h3 id="1-dot-対応理由整理"&gt;1. 対応理由整理&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://github.com/takeokunn/blog"&gt;takeokunn/blog&lt;/a&gt; は次の3つのターゲットに対してorg-roamでコンテンツ管理をしている。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Hugo
&lt;ul&gt;
&lt;li&gt;Repo: &lt;a href="https://github.com/takeokunn/blog/tree/main/hugo"&gt;https://github.com/takeokunn/blog/tree/main/hugo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Url: &lt;a href="https://www.takeokunn.org/"&gt;https://www.takeokunn.org/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Zenn
&lt;ul&gt;
&lt;li&gt;Repo: &lt;a href="https://github.com/takeokunn/blog/tree/main/zenn"&gt;https://github.com/takeokunn/blog/tree/main/zenn&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Url: &lt;a href="https://zenn.dev/takeokunn"&gt;https://zenn.dev/takeokunn&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;PDF（Typst）
&lt;ul&gt;
&lt;li&gt;Repo: &lt;a href="https://github.com/takeokunn/blog/tree/main/typst"&gt;https://github.com/takeokunn/blog/tree/main/typst&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Url: &lt;a href="https://www.takeokunn.org/pdf/phperkaigi-2026-pamphlet.pdf"&gt;https://www.takeokunn.org/pdf/phperkaigi-2026-pamphlet.pdf&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;以前から英語でもブログを書きたいという欲求があった。
ホスティング先はどこがよいのか検討した所、&lt;a href="https://dev.to/"&gt;dev.to&lt;/a&gt; がなんだかんだ安牌であることがわかったので対応することにした。&lt;/p&gt;
&lt;h3 id="2-dot-nixでbuildできるようにする"&gt;2. NixでBuildできるようにする&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;flake.nix&lt;/code&gt; は以下。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/takeokunn/blog/blob/main/devto/flake.nix"&gt;https://github.com/takeokunn/blog/blob/main/devto/flake.nix&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-nix" data-lang="nix"&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; packages &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; build-devto &lt;span style="color:#f92672"&gt;=&lt;/span&gt; pkgs&lt;span style="color:#f92672"&gt;.&lt;/span&gt;stdenv&lt;span style="color:#f92672"&gt;.&lt;/span&gt;mkDerivation {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; name &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;build-devto&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; src &lt;span style="color:#f92672"&gt;=&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; nativeBuildInputs &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;with&lt;/span&gt; pkgs; [
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; (emacsPkg&lt;span style="color:#f92672"&gt;.&lt;/span&gt;pkgs&lt;span style="color:#f92672"&gt;.&lt;/span&gt;withPackages (epkgs: (&lt;span style="color:#66d9ef"&gt;with&lt;/span&gt; epkgs&lt;span style="color:#f92672"&gt;.&lt;/span&gt;melpaPackages; [ ox-gfm ])))
&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; buildPhase &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; mkdir -p ./articles
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; emacs --batch --load scripts/ox-devto.el --funcall export-org-devto-files
&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;&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; installPhase &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; mkdir -p $out
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; # Article Sync Format: articles/{slug}/article.json + article.md
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; for dir in ./articles/*/; do
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; if [ -f &amp;#34;$dir/article.json&amp;#34; ]; then
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; cp -r &amp;#34;$dir&amp;#34; $out/
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; fi
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; done
&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;&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; };
&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;&lt;code&gt;ox-devto.el&lt;/code&gt; を適当に作り、 &lt;code&gt;ox-gfm&lt;/code&gt; をdev.to用にwrapした。&lt;/p&gt;</description></item><item><title>Neovimの設定をNixvimに移行した</title><link>https://www.takeokunn.org/posts/fleeting/20251124235900-migrate_nixvim/</link><pubDate>Thu, 25 Dec 2025 00:00:00 +0000</pubDate><guid>https://www.takeokunn.org/posts/fleeting/20251124235900-migrate_nixvim/</guid><description>&lt;h2 id="背景-動機"&gt;背景・動機&lt;/h2&gt;
&lt;p&gt;私はEmacsユーザだが、最近同僚エンジニアが全員Neovimユーザの会社に転職してしまった。
よい機会だしある程度Neovimを使えた方がいいなと思い、Neovimをひととおり設定したのでメモしておく。&lt;/p&gt;
&lt;h2 id="試したこと-やったこと"&gt;試したこと・やったこと&lt;/h2&gt;
&lt;h3 id="1-dot-管理方法選定"&gt;1. 管理方法選定&lt;/h3&gt;
&lt;p&gt;次のニーズを満たすものを探していた。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;普段メインで触らないので塩漬ビリティの高い状態にする&lt;/li&gt;
&lt;li&gt;lua scriptは可能なら書きたくない、期間が開くとどうせ忘れる&lt;/li&gt;
&lt;li&gt;AIに書かせても動くことを保証しやすい状態にする&lt;/li&gt;
&lt;li&gt;プラグイン管理と設定が近い状態にする&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Nixにないかなと調査してた所、&lt;a href="https://github.com/nix-community/nixvim"&gt;Nixvim&lt;/a&gt; を使えば上記の要件を満たせることがわかったので導入してみた。&lt;/p&gt;
&lt;p&gt;余談だが公式ドキュメントは情報量が少ないのでソースコードを読んだ方がいい。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://nix-community.github.io/nixvim/index.html"&gt;https://nix-community.github.io/nixvim/index.html&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="2-dot-初期構築"&gt;2. 初期構築&lt;/h3&gt;
&lt;p&gt;インストールガイドなどを参考に導入する。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://nix-community.github.io/nixvim/user-guide/install.html"&gt;https://nix-community.github.io/nixvim/user-guide/install.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;flake.nixで設定する。&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-nix" data-lang="nix"&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; inputs &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; nixvim &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; url &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;github:nix-community/nixvim&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; inputs&lt;span style="color:#f92672"&gt;.&lt;/span&gt;nixpkgs&lt;span style="color:#f92672"&gt;.&lt;/span&gt;follows &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;nixpkgs&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&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;home-managerのsharedModulesで読み込む。&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-nix" data-lang="nix"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;nix-darwin&lt;span style="color:#f92672"&gt;.&lt;/span&gt;lib&lt;span style="color:#f92672"&gt;.&lt;/span&gt;darwinSystem {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; modules &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; home-manager&lt;span style="color:#f92672"&gt;.&lt;/span&gt;darwinModules&lt;span style="color:#f92672"&gt;.&lt;/span&gt;home-manager
&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; home-manager &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; sharedModules &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [ nixvim&lt;span style="color:#f92672"&gt;.&lt;/span&gt;homeModules&lt;span style="color:#f92672"&gt;.&lt;/span&gt;nixvim ];
&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&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;あとはNixvimを有効にするだけ。&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-nix" data-lang="nix"&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; programs&lt;span style="color:#f92672"&gt;.&lt;/span&gt;nixvim &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; enable &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;true&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; colorschemes&lt;span style="color:#f92672"&gt;.&lt;/span&gt;catppuccin&lt;span style="color:#f92672"&gt;.&lt;/span&gt;enable &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; plugins&lt;span style="color:#f92672"&gt;.&lt;/span&gt;lualine&lt;span style="color:#f92672"&gt;.&lt;/span&gt;enable &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;true&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="3-dot-aiに設定させる"&gt;3. AIに設定させる&lt;/h3&gt;
&lt;p&gt;あとは好みの設定をするだけ。&lt;/p&gt;</description></item><item><title>社内読書会でThe Rust Programming Languageを読破した</title><link>https://www.takeokunn.org/posts/permanent/20251220235900-read_the_rust_programming_language/</link><pubDate>Thu, 25 Dec 2025 00:00:00 +0000</pubDate><guid>https://www.takeokunn.org/posts/permanent/20251220235900-read_the_rust_programming_language/</guid><description>&lt;h2 id="1-dot-introduction"&gt;1. Introduction&lt;/h2&gt;
&lt;p&gt;社内でRust本の読書会を開催したのですが、大成功で終わりました。
過去に社内読書会に参加した経験から、読書会というのはうまくいかないものだと思っていました。
途中で自然消滅したり、一部の人だけが話して終わったり、結局何も身につかなかったりと、苦い経験がいくつもあります。&lt;/p&gt;
&lt;p&gt;今回は全員満足度も理解度も高く大成功に終わったという実感があるので、何が良かったのか後学の為に纏めておきます。&lt;/p&gt;
&lt;p&gt;あくまで私個人の経験に基づく独断と偏見が多分に含まれている点をご了承ください。&lt;/p&gt;
&lt;h2 id="2-dot-開催情報"&gt;2. 開催情報&lt;/h2&gt;
&lt;h3 id="2-dot-1-dot-基本情報"&gt;2.1. 基本情報&lt;/h3&gt;
&lt;p&gt;次の期間/時間に開催しました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;2025年9月〜2025年12月&lt;/li&gt;
&lt;li&gt;毎日平日 17:00〜17:30&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;20章と分量のある&lt;a href="https://doc.rust-jp.rs/book-ja/title-page.html#the-rust-programming-language-%E6%97%A5%E6%9C%AC%E8%AA%9E%E7%89%88"&gt;The Rust Programming Language 日本語版&lt;/a&gt;を読破しました。
メンバーは8人程度で、2人がRust熟練者、それ以外はRust初学者という構成でした。&lt;/p&gt;
&lt;h3 id="2-dot-2-dot-時間設定の意図"&gt;2.2. 時間設定の意図&lt;/h3&gt;
&lt;p&gt;17:00〜17:30という時間帯は業務の終盤で集中力が切れやすい時間帯です。
読書会にあてることでリラックスできたかなと思っています。&lt;/p&gt;
&lt;p&gt;30分という短い時間の意図はそもそもが業務時間内というのと毎日継続するのにちょうどよい長さだからでした。
長時間の読書会は準備も負担も大きくなりがちですが、30分であれば「今日はちょっと疲れているな」という日でも参加しやすかったです。&lt;/p&gt;
&lt;h3 id="2-dot-3-dot-進め方"&gt;2.3. 進め方&lt;/h3&gt;
&lt;p&gt;30分間の内訳は以下です。
ドキュメントツールに開催日付で記事を作り、共同編集で学んだことをメモする形式にしていました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;前半20分: 前回の続きから読書、学んだことや発見や疑問を雑にメモする&lt;/li&gt;
&lt;li&gt;後半10分: メモを見ながら全員に共有&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="3-dot-個人的な目標"&gt;3. 個人的な目標&lt;/h2&gt;
&lt;p&gt;「落ち着いて座学をやる」というのが年々苦手になってきていた実感があったので、「ちゃんと机に座ってひとつずつ落ち着いて理解しながら進めていく」というのを目標に掲げていました。
プログラミング言語の勉強といえど、手を一切動かさず、頭だけで理論を理解することを徹底しました。&lt;/p&gt;
&lt;p&gt;特に今回の題材は理論を丁寧に理解していく必要があるRustだったので、題材としてはうってつけでした。&lt;/p&gt;
&lt;p&gt;また、「他言語で得た知識で知ったかぶりしない」という目標もありました。
良くも悪くも普段プログラムを書いているせいで大体の言語は手なりに書けてしまっていますし、特に最近はAIのせいで深く考えなくても良くなってしまっています。
これが成長の足枷になってしまっているなという実感があったので、今回は理解が浅い部分の理解をサボらないことにしました。&lt;/p&gt;
&lt;h2 id="4-dot-うまくいった理由の考察"&gt;4. うまくいった理由の考察&lt;/h2&gt;
&lt;p&gt;主に次の3パターンの取り組みをしました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;元の文章を読む&lt;/li&gt;
&lt;li&gt;Geminiで理解の浅い所を深堀する&lt;/li&gt;
&lt;li&gt;自分の理解した部分を有識者に語る会を開く&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="4-dot-1-dot-geminiの活用"&gt;4.1. Geminiの活用&lt;/h3&gt;
&lt;p&gt;普段の読書会中は、その日に読む分をGeminiに質問しまくりながら読んでいました。
Geminiに「自分の理解ではこうだけどあってる?」のようにとにかく聞いて正確な理解に努めました。
一般的な知識なのでハルシネーションがほぼなかったです。&lt;/p&gt;
&lt;p&gt;具体的には次のような質問を投げていました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;「このコードがコンパイルエラーになる理由を、ライフタイムの観点から説明して」&lt;/li&gt;
&lt;li&gt;「自分の理解ではこうだけど合ってる？」という確認&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;疑問点をすぐに解消できたのが助かりました。&lt;/p&gt;
&lt;h3 id="4-dot-2-dot-有識者に語る会"&gt;4.2. 有識者に語る会&lt;/h3&gt;
&lt;p&gt;とはいえ、Rustは「所有権」や「借用」や「ライフタイム」や「スマートポインタ」など理解しにくい概念がいくつもあります。
そこで、必要に応じて「自分の理解した部分を有識者に語る会」を30分設けてもらいました。有識者にひたすら自分の理解を喋りまくるという形式です。&lt;/p&gt;
&lt;p&gt;「有識者に語る」というのが非常に重要でした。
言葉を適当に濁せないし、用語を適当に使えないし、ちゃんと準備をしないといけないのが体験としてよかったです。
Geminiに質問攻めして「何が説明できれば俺は理解してるといえると思う?」とプロンプトに投げまくってました。&lt;/p&gt;
&lt;p&gt;有識者に説明すると新しい知識が出てきたり、自分の中でしっくりする理解ができたのが良かったです。&lt;/p&gt;
&lt;p&gt;世間的にはファインマンテクニックと呼ばれる手法です。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://qiita.com/KanNishida/items/e2e926bb194fd280c6d9"&gt;人生を変える最強学習メソッド、ファインマン・テクニック - Qiita&lt;/a&gt;&lt;/p&gt;</description></item><item><title>複数人でAirbnbを借りた時の清算方法</title><link>https://www.takeokunn.org/posts/fleeting/20251130154336-airbnb_warikan/</link><pubDate>Thu, 25 Dec 2025 00:00:00 +0000</pubDate><guid>https://www.takeokunn.org/posts/fleeting/20251130154336-airbnb_warikan/</guid><description>&lt;h2 id="背景-動機"&gt;背景・動機&lt;/h2&gt;
&lt;p&gt;毎年VimConfでは秋葉原付近に2泊3日でAirbnbを借りて参加している。
10人くらい入れる物件を借りて、複数人が色んなパターンで遊びに来る。
きれいに清算をしたい時のTipsをメモしておく。&lt;/p&gt;
&lt;h2 id="試したこと-やったこと"&gt;試したこと・やったこと&lt;/h2&gt;
&lt;h3 id="1-dot-条件を整理する"&gt;1. 条件を整理する&lt;/h3&gt;
&lt;p&gt;割り勘をするにあたって、ステータスに応じて重みづけしたい。
学生には多く払わせる訳にはいかないし、途中で帰ったりする人にもある程度支払ってもらいたいもの。&lt;/p&gt;
&lt;p&gt;とはいえ、あまり複雑にしてもややこしくなるので、次の2軸で重みつけして清算することにした。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;宿泊数
&lt;ul&gt;
&lt;li&gt;基本はコアメンバーで割り勘&lt;/li&gt;
&lt;li&gt;一泊したら1、途中で帰ったら0.5みたいに雑に計算する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;役割
&lt;ul&gt;
&lt;li&gt;学生は0倍、新卒は0.5倍、多く出していい人は1.5〜2倍などを用意する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="2-dot-清算シートを作る"&gt;2. 清算シートを作る&lt;/h3&gt;
&lt;p&gt;次のように清算シートを作った。
人ごとに重みつけをして支払い金額を按分し、100円単位で丸める。&lt;/p&gt;
&lt;p&gt;あとはslack上で専用チャンネルを作り、支払い先を用意して払ってもらい、シート上で支払い状況を可視化して、未払の人に対してリマインドしやすい形を作る。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://docs.google.com/spreadsheets/d/13xlbYMcAHZ_7I0vcUYEmQ4fnoPiOXdbbdrOmfoaerHA/edit?gid=551108005#gid=551108005"&gt;https://docs.google.com/spreadsheets/d/13xlbYMcAHZ_7I0vcUYEmQ4fnoPiOXdbbdrOmfoaerHA/edit?gid=551108005#gid=551108005&lt;/a&gt;&lt;/p&gt;
&lt;figure&gt;&lt;img src="https://www.takeokunn.org/images/A07647FD-EDD8-42C4-9665-E8DAD086833E.png"&gt;
&lt;/figure&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;h2 id="今後の展開-検討事項"&gt;今後の展開・検討事項&lt;/h2&gt;
&lt;p&gt;この考え方を使えば他のユースケースでも使えるのであらゆる所で使いたい。&lt;/p&gt;</description></item><item><title>digツールはdoggoが便利</title><link>https://www.takeokunn.org/posts/fleeting/20251220235900-dig_tool_doggo/</link><pubDate>Wed, 24 Dec 2025 00:00:00 +0000</pubDate><guid>https://www.takeokunn.org/posts/fleeting/20251220235900-dig_tool_doggo/</guid><description>&lt;h2 id="背景-動機"&gt;背景・動機&lt;/h2&gt;
&lt;p&gt;インフラ構築する時にdigを叩くことは必須なのだが、2025年にdigコマンドをそのまま使うのは流石に辛い。
もう少しリッチなものがないか調べた所、doggoが良さそうだったので導入してみた。&lt;/p&gt;
&lt;h2 id="試したこと-やったこと"&gt;試したこと・やったこと&lt;/h2&gt;
&lt;h3 id="0-dot-ツール選定"&gt;0. ツール選定&lt;/h3&gt;
&lt;p&gt;Rust製のツールに &lt;a href="https://github.com/ogham/dog"&gt;dog&lt;/a&gt; というものがあるが、最終更新が2021年前と期間が空いてる。&lt;/p&gt;
&lt;p&gt;後継にあたるツールがないかなと思って調査した所、Golang製の &lt;a href="https://github.com/mr-karan/doggo"&gt;doggo&lt;/a&gt; というツールがあった。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;It&amp;rsquo;s totally inspired by dog which is written in Rust. I wanted to add some features to it but since I don&amp;rsquo;t know Rust, I found it as a nice opportunity to experiment with writing a DNS Client from scratch in Go myself. Hence the name dog + go =&amp;gt; doggo.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Nixでパッケージングされているし、CLIとしての完成度も高く、アクティブなプロジェクトだったので導入した。&lt;/p&gt;
&lt;h3 id="1-dot-home-manager-module用意"&gt;1. home-manager module用意&lt;/h3&gt;
&lt;p&gt;特に設定項目がないのでshell completionだけ有効にしている。&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-nix" data-lang="nix"&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; pkgs&lt;span style="color:#f92672"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; lib&lt;span style="color:#f92672"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; config&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&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;let&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; cfg &lt;span style="color:#f92672"&gt;=&lt;/span&gt; config&lt;span style="color:#f92672"&gt;.&lt;/span&gt;programs&lt;span style="color:#f92672"&gt;.&lt;/span&gt;doggo;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;in&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;with&lt;/span&gt; lib;
&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; options&lt;span style="color:#f92672"&gt;.&lt;/span&gt;programs&lt;span style="color:#f92672"&gt;.&lt;/span&gt;doggo &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; enable &lt;span style="color:#f92672"&gt;=&lt;/span&gt; mkEnableOption &lt;span style="color:#e6db74"&gt;&amp;#34;Command-line DNS Client for Humans. Written in Golang&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; package &lt;span style="color:#f92672"&gt;=&lt;/span&gt; mkPackageOption pkgs &lt;span style="color:#e6db74"&gt;&amp;#34;doggo&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; enableBashIntegration &lt;span style="color:#f92672"&gt;=&lt;/span&gt; lib&lt;span style="color:#f92672"&gt;.&lt;/span&gt;hm&lt;span style="color:#f92672"&gt;.&lt;/span&gt;shell&lt;span style="color:#f92672"&gt;.&lt;/span&gt;mkBashIntegrationOption { &lt;span style="color:#66d9ef"&gt;inherit&lt;/span&gt; config; };
&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; enableZshIntegration &lt;span style="color:#f92672"&gt;=&lt;/span&gt; lib&lt;span style="color:#f92672"&gt;.&lt;/span&gt;hm&lt;span style="color:#f92672"&gt;.&lt;/span&gt;shell&lt;span style="color:#f92672"&gt;.&lt;/span&gt;mkZshIntegrationOption { &lt;span style="color:#66d9ef"&gt;inherit&lt;/span&gt; config; };
&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; enableFishIntegration &lt;span style="color:#f92672"&gt;=&lt;/span&gt; lib&lt;span style="color:#f92672"&gt;.&lt;/span&gt;hm&lt;span style="color:#f92672"&gt;.&lt;/span&gt;shell&lt;span style="color:#f92672"&gt;.&lt;/span&gt;mkFishIntegrationOption { &lt;span style="color:#66d9ef"&gt;inherit&lt;/span&gt; config; };
&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; config &lt;span style="color:#f92672"&gt;=&lt;/span&gt; mkIf cfg&lt;span style="color:#f92672"&gt;.&lt;/span&gt;enable {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; home&lt;span style="color:#f92672"&gt;.&lt;/span&gt;packages &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [ cfg&lt;span style="color:#f92672"&gt;.&lt;/span&gt;package ];
&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; programs &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; bash&lt;span style="color:#f92672"&gt;.&lt;/span&gt;initExtra &lt;span style="color:#f92672"&gt;=&lt;/span&gt; mkIf (cfg&lt;span style="color:#f92672"&gt;.&lt;/span&gt;enableBashIntegration &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; cfg&lt;span style="color:#f92672"&gt;.&lt;/span&gt;package &lt;span style="color:#f92672"&gt;!=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;null&lt;/span&gt;) &lt;span style="color:#e6db74"&gt;&amp;#39;&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; eval &amp;#34;$(&lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;getExe cfg&lt;span style="color:#f92672"&gt;.&lt;/span&gt;package&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt; completions bash)&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;#39;&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; zsh&lt;span style="color:#f92672"&gt;.&lt;/span&gt;initContent &lt;span style="color:#f92672"&gt;=&lt;/span&gt; mkIf (cfg&lt;span style="color:#f92672"&gt;.&lt;/span&gt;enableZshIntegration &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; cfg&lt;span style="color:#f92672"&gt;.&lt;/span&gt;package &lt;span style="color:#f92672"&gt;!=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;null&lt;/span&gt;) &lt;span style="color:#e6db74"&gt;&amp;#39;&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; eval &amp;#34;$(&lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;getExe cfg&lt;span style="color:#f92672"&gt;.&lt;/span&gt;package&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt; completions zsh)&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;#39;&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; fish&lt;span style="color:#f92672"&gt;.&lt;/span&gt;interactiveShellInit &lt;span style="color:#f92672"&gt;=&lt;/span&gt; mkIf (cfg&lt;span style="color:#f92672"&gt;.&lt;/span&gt;enableFishIntegration &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; cfg&lt;span style="color:#f92672"&gt;.&lt;/span&gt;package &lt;span style="color:#f92672"&gt;!=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;null&lt;/span&gt;) &lt;span style="color:#e6db74"&gt;&amp;#39;&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; &lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;getExe cfg&lt;span style="color:#f92672"&gt;.&lt;/span&gt;package&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt; completions fish | source
&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;&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; };
&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;あとは &lt;code&gt;programs.doggo.enable = true;&lt;/code&gt; で有効にするだけで使えるようになる。&lt;/p&gt;</description></item><item><title>Typst SlideのDracula Light Theme作成した</title><link>https://www.takeokunn.org/posts/fleeting/20251124235900-typst_slide_light_theme/</link><pubDate>Wed, 24 Dec 2025 00:00:00 +0000</pubDate><guid>https://www.takeokunn.org/posts/fleeting/20251124235900-typst_slide_light_theme/</guid><description>&lt;h2 id="背景-動機"&gt;背景・動機&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://www.takeokunn.org/posts/fleeting/20250506220914-create_typst_slide_theme/"&gt;Typstテーマを自作した&lt;/a&gt; でDrauclaテーマのスライドを自作したのだが、実際登壇してみるとダークテーマは登壇会場によっては見にくくなってしまうことがわかった。
Draculaテーマだけでなくライトテーマでも生成できるようにしなくちゃいけなくなったので自作してみた。&lt;/p&gt;
&lt;h2 id="試したこと-やったこと"&gt;試したこと・やったこと&lt;/h2&gt;
&lt;h3 id="1-dot-テーマ選定"&gt;1. テーマ選定&lt;/h3&gt;
&lt;p&gt;ライトテーマは世の中に沢山あるものの、好みのテーマを見つける必要がある。
Draculaテーマが好きな理由は、エコシステムが充実していてあまり努力せず統一感を出せるからであり、対応しているすべてのアプリケーションのカラーテーマをDraculaに設定している。&lt;/p&gt;
&lt;p&gt;Draculaテーマにもライトテーマないのかなと調べた所、Draculaを逆から読んだAlucardというテーマがあった。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://draculatheme.com/blog/dracula-pro-2.0-our-first-light-theme"&gt;https://draculatheme.com/blog/dracula-pro-2.0-our-first-light-theme&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;これなら既存のカラーテーマとの統一感を出せるだろう、ということでAlucardを選定することにした。&lt;/p&gt;
&lt;h3 id="2-dot-テーマ作成"&gt;2. テーマ作成&lt;/h3&gt;
&lt;p&gt;AIに適当にカラーテーマを作成させた。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/takeokunn/blog/blob/main/typst/themes/alucard.typ"&gt;https://github.com/takeokunn/blog/blob/main/typst/themes/alucard.typ&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-typst" data-lang="typst"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;#let&lt;/span&gt; colors &lt;span style="color:#f92672"&gt;=&lt;/span&gt; (
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; background: &lt;span style="color:#a6e22e"&gt;rgb&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;#FFFBEB&amp;#34;&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; foreground: &lt;span style="color:#a6e22e"&gt;rgb&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;#1F1F1F&amp;#34;&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; pink: &lt;span style="color:#a6e22e"&gt;rgb&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;#A3144D&amp;#34;&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; purple: &lt;span style="color:#a6e22e"&gt;rgb&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;#644AC9&amp;#34;&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; orange: &lt;span style="color:#a6e22e"&gt;rgb&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;#A34D14&amp;#34;&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; green: &lt;span style="color:#a6e22e"&gt;rgb&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;#14710A&amp;#34;&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; cyan: &lt;span style="color:#a6e22e"&gt;rgb&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;#036A96&amp;#34;&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; red: &lt;span style="color:#a6e22e"&gt;rgb&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;#CB3A2A&amp;#34;&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; yellow: &lt;span style="color:#a6e22e"&gt;rgb&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;#846E15&amp;#34;&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; comment: &lt;span style="color:#a6e22e"&gt;rgb&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;#6C664B&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;TextMate Themeも作成した。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/takeokunn/blog/blob/main/typst/themes/Alucard.tmTheme"&gt;https://github.com/takeokunn/blog/blob/main/typst/themes/Alucard.tmTheme&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="得られた結果-所感"&gt;得られた結果・所感&lt;/h2&gt;
&lt;p&gt;「Software DesignでNix連載しました」というスライドを作って登壇してみた。
特に問題なく登壇できたので今後も積極的に使っていきたい。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.takeokunn.org/pdf/publishing-nix-series-software-design.pdf"&gt;https://www.takeokunn.org/pdf/publishing-nix-series-software-design.pdf&lt;/a&gt;&lt;/p&gt;
&lt;figure&gt;&lt;img src="https://www.takeokunn.org/images/2617E50F-5B65-4E93-8C84-A7383E460218.png"&gt;
&lt;/figure&gt;
&lt;figure&gt;&lt;img src="https://www.takeokunn.org/images/A53EA15D-765C-4BC1-A389-93E4C5D668B1.png"&gt;
&lt;/figure&gt;
&lt;figure&gt;&lt;img src="https://www.takeokunn.org/images/B9C671A0-08B7-4EFD-9160-57FA8A3323A3.png"&gt;
&lt;/figure&gt;
&lt;h2 id="今後の展開-検討事項"&gt;今後の展開・検討事項&lt;/h2&gt;
&lt;p&gt;スライドテンプレートを作り込んでより表現力豊かなスライドを作れるようになりたい。&lt;/p&gt;</description></item><item><title>技術イベントのパンフレット記事をTypstでBuildする</title><link>https://www.takeokunn.org/posts/fleeting/20251130140627-build_pamphlet_article_by_typst/</link><pubDate>Wed, 24 Dec 2025 00:00:00 +0000</pubDate><guid>https://www.takeokunn.org/posts/fleeting/20251130140627-build_pamphlet_article_by_typst/</guid><description>&lt;h2 id="背景-動機"&gt;背景・動機&lt;/h2&gt;
&lt;p&gt;組版が必要なあらゆるものはTypstを採用することにしている。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.takeokunn.org/posts/fleeting/20250619103829-build_cv_resume_with_typst/"&gt;Typstで履歴書と職務経歴書をBuildする&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.takeokunn.org/posts/fleeting/20250610215948-ai_powered_typst_slide_generation/"&gt;AIを駆使してTypstスライドを生成する&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.takeokunn.org/posts/fleeting/20250126114218-build_and_deploy_typst_using_nix/"&gt;NixでTypstをBuildしGitHub Pagesでホスティングする&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;パンフレット記事や同人誌の組版をする時にも例に漏れずTypstで作成しているのでメモしておく。&lt;/p&gt;
&lt;p&gt;内容は &lt;a href="https://www.takeokunn.org/posts/fleeting/20250126114218-build_and_deploy_typst_using_nix/"&gt;NixでTypstをBuildしGitHub Pagesでホスティングする&lt;/a&gt; とかなり重複するが、パンフレット記事を書くという側面で纏めていく。&lt;/p&gt;
&lt;h2 id="試したこと-やったこと"&gt;試したこと・やったこと&lt;/h2&gt;
&lt;h3 id="1-dot-build周り"&gt;1. Build周り&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://www.takeokunn.org/posts/fleeting/20250126114218-build_and_deploy_typst_using_nix/"&gt;NixでTypstをBuildしGitHub Pagesでホスティングする&lt;/a&gt; に纏まっているのでこちらを参照。&lt;/p&gt;
&lt;h3 id="2-dot-テーマ選定とtypst設定"&gt;2. テーマ選定とTypst設定&lt;/h3&gt;
&lt;p&gt;この手のテーマはTypstには大量にある。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://typst.app/universe/package/charged-ieee/"&gt;charged-ieee&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://typst.app/universe/package/ilm/"&gt;ilm&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://typst.app/universe/package/clean-acmart/"&gt;clean-acmart&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://typst.app/universe/package/clean-ensam/"&gt;clean-ensam&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://typst.app/universe/package/min-article/"&gt;min-article&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;コードのsyntax highlightのみ &lt;a href="https://typst.app/universe/package/codly/"&gt;codly&lt;/a&gt; と &lt;a href="https://typst.app/universe/package/codly-languages/"&gt;codly-languages&lt;/a&gt; を使ってるが、デフォルトのTypstの機能を手で設定している。
フォントは&lt;a href="https://github.com/yuru7/HackGen"&gt;HackGen&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-typst" data-lang="typst"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;#set&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;text&lt;/span&gt;(lang: &lt;span style="color:#e6db74"&gt;&amp;#34;ja&amp;#34;&lt;/span&gt;, font: &lt;span style="color:#e6db74"&gt;&amp;#34;HackGen&amp;#34;&lt;/span&gt;, size: &lt;span style="color:#ae81ff"&gt;8&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;pt&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;#set&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;page&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; width: &lt;span style="color:#ae81ff"&gt;210&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;mm&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; height: &lt;span style="color:#ae81ff"&gt;297&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;mm&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; margin: &lt;span style="color:#ae81ff"&gt;20&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;mm&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; columns: &lt;span style="color:#ae81ff"&gt;2&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;#set&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;columns&lt;/span&gt;(gutter: &lt;span style="color:#ae81ff"&gt;12&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;pt&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 style="color:#e6db74"&gt;&amp;#34;@preview/codly:1.2.0&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:#f92672"&gt;#import&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;@preview/codly-languages:0.1.1&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;#show&lt;/span&gt;: codly-init.&lt;span style="color:#a6e22e"&gt;with&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;#codly&lt;/span&gt;(languages: codly-languages)
&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;#show&lt;/span&gt; raw: &lt;span style="color:#66d9ef"&gt;set&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;text&lt;/span&gt;(size: &lt;span style="color:#ae81ff"&gt;6&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;pt&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;#place&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; top &lt;span style="color:#f92672"&gt;+&lt;/span&gt; center,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; float: &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; scope: &lt;span style="color:#e6db74"&gt;&amp;#34;parent&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; clearance: &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;em&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;#set&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;text&lt;/span&gt;(size: &lt;span style="color:#ae81ff"&gt;18&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;pt&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; パッケージマネージャNixで実現する \
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 宣言的でクリーンなPHP開発環境の構築
&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;#set&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;text&lt;/span&gt;(size: &lt;span style="color:#ae81ff"&gt;12&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;pt&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; たけてぃ \@takeokunn
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;#v&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;em&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;h2 id="得られた結果-所感"&gt;得られた結果・所感&lt;/h2&gt;
&lt;p&gt;満足いくクオリティでpdfを生成できるようになったし、GitHub ActionsでBuildしてGitHub Pagesでホスティングできるようになった&lt;/p&gt;</description></item><item><title>gitleaksを導入した</title><link>https://www.takeokunn.org/posts/fleeting/20251222124101-setup_gitleaks/</link><pubDate>Tue, 23 Dec 2025 00:00:00 +0000</pubDate><guid>https://www.takeokunn.org/posts/fleeting/20251222124101-setup_gitleaks/</guid><description>&lt;h2 id="背景-動機"&gt;背景・動機&lt;/h2&gt;
&lt;p&gt;秘密鍵をgit commitしないようにしたいと以前から考えていた。
大体のプロジェクトのCIにsecretlintを導入していたが、手元でもpre-commitでも設定したいと思っていた所、gitleaksなら設定不要で楽に導入できることが分かったので導入した。&lt;/p&gt;
&lt;h2 id="試したこと-やったこと"&gt;試したこと・やったこと&lt;/h2&gt;
&lt;h3 id="0-dot-ツール選定"&gt;0. ツール選定&lt;/h3&gt;
&lt;p&gt;類似ツールにはgit-secrets、trufflehog、secretlintがある。&lt;/p&gt;
&lt;p&gt;次の性質があるツールがよい。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;nixpkgsにある&lt;/li&gt;
&lt;li&gt;デフォルト設定がしっかりしてる&lt;/li&gt;
&lt;li&gt;CLIで雑に実行できる&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="https://dev.classmethod.jp/articles/gitleaks-commands/"&gt;『Gitleaks』で機密情報の漏洩を防ぐ〜コマンド編〜&lt;/a&gt; を読んでいた所、自分のニーズを満たせることが確認できたので導入を決定した。&lt;/p&gt;
&lt;h3 id="1-dot-home-manager-module作成"&gt;1. home-manager module作成&lt;/h3&gt;
&lt;p&gt;home-manager moduleを自作すると自由度が上がる。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/takeokunn/nixos-configuration/blob/6df4a5955942bff1010b80e3c1bc48af48baebd5/home-manager/modules/gitleaks/default.nix"&gt;https://github.com/takeokunn/nixos-configuration/blob/6df4a5955942bff1010b80e3c1bc48af48baebd5/home-manager/modules/gitleaks/default.nix&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;programs.gitleaks.enable = true&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-nix" data-lang="nix"&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; programs&lt;span style="color:#f92672"&gt;.&lt;/span&gt;gitleaks &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; enable &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; enableGitHook &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; settings &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; extend&lt;span style="color:#f92672"&gt;.&lt;/span&gt;useDefault &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;true&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&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="2-dot-devenvのgit-pre-commit導入"&gt;2. devenvのgit pre-commit導入&lt;/h3&gt;
&lt;p&gt;devenvでgit hookを定義してると、system globalのgit hookを読んでくれないことがわかった。&lt;/p&gt;
&lt;p&gt;devenvでかなりhookを定義してるので、こちらでも明示的にpre-commitを定義している。
&lt;a href="https://devenv.sh/git-hooks/"&gt;https://devenv.sh/git-hooks/&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-nix" data-lang="nix"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{ pkgs&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; git-hooks&lt;span style="color:#f92672"&gt;.&lt;/span&gt;hooks &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; check-merge-conflicts&lt;span style="color:#f92672"&gt;.&lt;/span&gt;enable &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; check-case-conflicts&lt;span style="color:#f92672"&gt;.&lt;/span&gt;enable &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; gitleaks &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; enable &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; entry &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;pkgs&lt;span style="color:#f92672"&gt;.&lt;/span&gt;gitleaks&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;/bin/gitleaks protect --staged&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&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="得られた結果-所感"&gt;得られた結果・所感&lt;/h2&gt;
&lt;p&gt;より安全に &lt;code&gt;git commit&lt;/code&gt; できるようになった。&lt;/p&gt;</description></item><item><title>簡易的なヒューリスティックパーサの自作方法</title><link>https://www.takeokunn.org/posts/fleeting/20251220235900-how_to_build_a_simple_heuristic_parser/</link><pubDate>Tue, 23 Dec 2025 00:00:00 +0000</pubDate><guid>https://www.takeokunn.org/posts/fleeting/20251220235900-how_to_build_a_simple_heuristic_parser/</guid><description>&lt;h2 id="背景-動機"&gt;背景・動機&lt;/h2&gt;
&lt;p&gt;クローリング結果や業務で使ってるデータベースの値など世の中にはDirtyな値が山のようにある。
一定のルールで正規化した値を取得したい場合にヒューリスティックパーサが便利。&lt;/p&gt;
&lt;p&gt;業務で大量に作ったので作り方についてメモしておく。&lt;/p&gt;
&lt;h2 id="試したこと-やったこと"&gt;試したこと・やったこと&lt;/h2&gt;
&lt;h3 id="0-dot-ヒューリスティックパーサが適切か見極める"&gt;0. ヒューリスティックパーサが適切か見極める&lt;/h3&gt;
&lt;p&gt;目の前の問題の性質がヒューリスティックパーサが適してるか確認する。&lt;/p&gt;
&lt;ul&gt;
&lt;li&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;/ul&gt;
&lt;/li&gt;
&lt;li&gt;デメリット
&lt;ul&gt;
&lt;li&gt;エッジケースに対応しきれない&lt;/li&gt;
&lt;li&gt;偽陽性や偽陰性&lt;/li&gt;
&lt;li&gt;正当性の証明が困難&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="1-dot-テストデータのパターンを用意する"&gt;1. テストデータのパターンを用意する&lt;/h3&gt;
&lt;p&gt;AIにテストケースをyamlで生成させる。
たとえば次のyamlは文字列から月給の下限と上限を取得するparserを実装する例。&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-yaml" data-lang="yaml"&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;- &lt;span style="color:#f92672"&gt;input&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;300万円～350万円 ※この限りではありません。&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;expected&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;form&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 style="color:#f92672"&gt;min&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;3000000&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;max&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;3500000&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:#75715e"&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;input&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;年俸400万円～500万円&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;expected&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;form&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 style="color:#f92672"&gt;min&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;4000000&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;max&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;5000000&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:#75715e"&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;input&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;月給20万円～25万円&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;expected&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;form&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 style="color:#f92672"&gt;min&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;200000&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;max&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;250000&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;input&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;月給25万3000円&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;expected&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;form&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 style="color:#f92672"&gt;min&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;253000&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;max&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;253000&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:#75715e"&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;input&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;時給1,500円～2,000円&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;expected&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;form&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 style="color:#f92672"&gt;min&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;1500&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;max&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;2000&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;input&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;時給1,800円&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;expected&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;form&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 style="color:#f92672"&gt;min&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;1800&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;max&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;1800&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:#75715e"&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;input&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;日給12,000円～15,000円&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;expected&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;form&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 style="color:#f92672"&gt;min&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;12000&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;max&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;15000&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;input&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;日給10,000円&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;expected&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;form&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 style="color:#f92672"&gt;min&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;10000&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;max&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;10000&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="2-dot-パーサをaiに作らせる"&gt;2. パーサをAIに作らせる&lt;/h3&gt;
&lt;p&gt;「yamlのinputとexpectedに合うparserを自作して、vitestで実装して」とAIに命令すればよい。&lt;/p&gt;</description></item><item><title>emacs wgrepが便利だった</title><link>https://www.takeokunn.org/posts/fleeting/20251130141030-emacs_wgrep/</link><pubDate>Tue, 02 Dec 2025 00:00:00 +0000</pubDate><guid>https://www.takeokunn.org/posts/fleeting/20251130141030-emacs_wgrep/</guid><description>&lt;h2 id="背景-動機"&gt;背景・動機&lt;/h2&gt;
&lt;p&gt;本記事は &lt;a href="https://qiita.com/advent-calendar/2025/emacs"&gt;Emacs Advent Calendar 2025&lt;/a&gt; の2日目の記事です。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.takeokunn.org/posts/fleeting/20251128124639-emacs_wdired_mode/"&gt;emacs wdiredが便利だった&lt;/a&gt; でwgrepも便利だということが判明したのでこちらも調査してみる。&lt;/p&gt;
&lt;h2 id="試したこと-やったこと"&gt;試したこと・やったこと&lt;/h2&gt;
&lt;h3 id="1-dot-wgrepの機能調査"&gt;1. wgrepの機能調査&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://github.com/mhayashi1120/Emacs-wgrep"&gt;mhayashi1120/Emacs-wgrep&lt;/a&gt; のサードパーティpackageでMelpaから落とすことができる。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://melpa.org/#/?q=wgrep"&gt;https://melpa.org/#/?q=wgrep&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;*grep*&lt;/code&gt; bufferの &lt;code&gt;grep-mode&lt;/code&gt; にhookして &lt;code&gt;wgrep-setup&lt;/code&gt; を実行し、 &lt;code&gt;wgrep-mode&lt;/code&gt; というminor modeを起動する。&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-emacs-lisp" data-lang="emacs-lisp"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;(add-hook &lt;span style="color:#e6db74"&gt;&amp;#39;grep-setup-hook&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;wgrep-setup&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;類似機能に標準機能の &lt;code&gt;moccur-edit&lt;/code&gt; があり、migemoとの連携も取れるようだ。
自分はmigemoユーザではないが将来的に試してみたい。&lt;/p&gt;
&lt;h3 id="2-dot-wgrep設定"&gt;2. wgrep設定&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;defcustom&lt;/code&gt; としては以下だが、自分は特に設定していない。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;変数名 （Variable）&lt;/th&gt;
&lt;th&gt;機能概要&lt;/th&gt;
&lt;th&gt;戦略的利用法&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;wgrep-auto-save-buffer&lt;/td&gt;
&lt;td&gt;変更適用完了時（wgrep-finish-edit）にバッファを自動保存するか 。&lt;/td&gt;
&lt;td&gt;大規模リファクタリング時、安全のため &lt;code&gt;nil&lt;/code&gt; （手動保存）を維持するか、迅速な処理のために &lt;code&gt;t&lt;/code&gt; に設定。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;wgrep-enable-key&lt;/td&gt;
&lt;td&gt;wgrepモードを有効にするためのキーバインド 。&lt;/td&gt;
&lt;td&gt;ワークフローの摩擦を減らすため、単一キー（例: &amp;ldquo;r&amp;quot;や&amp;quot;e&amp;rdquo;）に設定することを推奨。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;wgrep-change-readonly-file&lt;/td&gt;
&lt;td&gt;バッファが読み取り専用であるかどうかにかかわらず、変更を強制的に適用するか 。&lt;/td&gt;
&lt;td&gt;VCSによって保護されたファイルを編集する場合に有効化。&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;デフォルトのkeybindは次のようになっている。&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-emacs-lisp" data-lang="emacs-lisp"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;(unless wgrep-mode-map
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; (let ((map (&lt;span style="color:#a6e22e"&gt;make-sparse-keymap&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;define-key&lt;/span&gt; map &lt;span style="color:#e6db74"&gt;&amp;#34;\C-c\C-c&amp;#34;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;wgrep-finish-edit&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; (&lt;span style="color:#a6e22e"&gt;define-key&lt;/span&gt; map &lt;span style="color:#e6db74"&gt;&amp;#34;\C-c\C-d&amp;#34;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;wgrep-mark-deletion&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; (&lt;span style="color:#a6e22e"&gt;define-key&lt;/span&gt; map &lt;span style="color:#e6db74"&gt;&amp;#34;\C-c\C-e&amp;#34;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;wgrep-finish-edit&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; (&lt;span style="color:#a6e22e"&gt;define-key&lt;/span&gt; map &lt;span style="color:#e6db74"&gt;&amp;#34;\C-c\C-p&amp;#34;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;wgrep-toggle-readonly-area&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; (&lt;span style="color:#a6e22e"&gt;define-key&lt;/span&gt; map &lt;span style="color:#e6db74"&gt;&amp;#34;\C-c\C-r&amp;#34;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;wgrep-remove-change&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; (&lt;span style="color:#a6e22e"&gt;define-key&lt;/span&gt; map &lt;span style="color:#e6db74"&gt;&amp;#34;\C-x\C-s&amp;#34;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;wgrep-finish-edit&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; (&lt;span style="color:#a6e22e"&gt;define-key&lt;/span&gt; map &lt;span style="color:#e6db74"&gt;&amp;#34;\C-c\C-u&amp;#34;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;wgrep-remove-all-change&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; (&lt;span style="color:#a6e22e"&gt;define-key&lt;/span&gt; map &lt;span style="color:#e6db74"&gt;&amp;#34;\C-c\C-k&amp;#34;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;wgrep-abort-changes&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; (&lt;span style="color:#a6e22e"&gt;define-key&lt;/span&gt; map &lt;span style="color:#e6db74"&gt;&amp;#34;\C-x\C-q&amp;#34;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;wgrep-exit&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; (setq wgrep-mode-map map)))
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="3-dot-挙動の確認"&gt;3. 挙動の確認&lt;/h3&gt;
&lt;p&gt;minad-wareのaffeで実験すると次のようになる。&lt;/p&gt;</description></item><item><title>個人的sketchybar設定</title><link>https://www.takeokunn.org/posts/fleeting/20251124235900-setting_sketchybar/</link><pubDate>Sun, 30 Nov 2025 00:00:00 +0000</pubDate><guid>https://www.takeokunn.org/posts/fleeting/20251124235900-setting_sketchybar/</guid><description>&lt;h2 id="背景-動機"&gt;背景・動機&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://www.takeokunn.org/posts/fleeting/20251124235900-setting_aerospace/"&gt;個人的Aerospace設定&lt;/a&gt; に続き、sketchybarの設定もしたのでメモしておく。&lt;/p&gt;
&lt;p&gt;大体の対応は公式ドキュメントを元にClaude Codeに対応させた。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://felixkratz.github.io/SketchyBar/"&gt;https://felixkratz.github.io/SketchyBar/&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="試したこと-やったこと"&gt;試したこと・やったこと&lt;/h2&gt;
&lt;h3 id="1-dot-完成イメージと設計方針"&gt;1. 完成イメージと設計方針&lt;/h3&gt;
&lt;p&gt;世の中のsketchybarのサンプルを作成して、こんな感じで作る目論見を立てた。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Hack Nerd Font: アイコンとラベル用&lt;/li&gt;
&lt;li&gt;SF Pro: Appleロゴ用（macOS標準搭載）&lt;/li&gt;
&lt;/ul&gt;
&lt;!--listend--&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-console" data-lang="console"&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;│ [􀣺] [1 2 3 4 5 6 7 8 9 0] Firefox | 󰻠 5% 󰍛 42% | 󰖩 Home | 󰕾 50% | 󰁹 85% | 󰃭 01/15 Mon 󰥔 14:30 │
&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;また、すべてをdracula themeに寄せるのでカラーパレットをAIに作らせた。&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-nix" data-lang="nix"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;colors &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; background &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;0xff282a36&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; backgroundTransparent &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;0xcc282a36&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; currentLine &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;0xff44475a&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; foreground &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;0xfff8f8f2&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; comment &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;0xff6272a4&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; cyan &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;0xff8be9fd&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; green &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;0xff50fa7b&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; orange &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;0xffffb86c&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; pink &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;0xffff79c6&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; purple &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;0xffbd93f9&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; red &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;0xffff5555&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; yellow &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;0xfff1fa8c&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; transparent &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;0x00000000&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; black &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;0xff21222c&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="2-dot-基本設定"&gt;2. 基本設定&lt;/h3&gt;
&lt;h4 id="2-dot-1-dot-home-manager設定"&gt;2.1. home-manager設定&lt;/h4&gt;
&lt;p&gt;home-manager moduleで定義されているので &lt;code&gt;enable=true&lt;/code&gt; するだけで入る。&lt;/p&gt;</description></item><item><title>emacs wdiredが便利だった</title><link>https://www.takeokunn.org/posts/fleeting/20251128124639-emacs_wdired_mode/</link><pubDate>Sat, 29 Nov 2025 00:00:00 +0000</pubDate><guid>https://www.takeokunn.org/posts/fleeting/20251128124639-emacs_wdired_mode/</guid><description>&lt;h2 id="背景-動機"&gt;背景・動機&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://x.com/ryoppippi"&gt;ryoppippi&lt;/a&gt; の「【外資ITエンジニアの開発環境】VimmerによるVimmer（になりたい人）のためのVim動画」という動画を見た。&lt;/p&gt;
&lt;p&gt;{{&amp;lt; youtube id=&amp;ldquo;XsAlXYWzcv4&amp;rdquo; title=&amp;quot;【外資ITエンジニアの開発環境】VimmerによるVimmer（になりたい人）のためのVim動画&amp;quot; &amp;gt;}}&lt;/p&gt;
&lt;p&gt;その中で &lt;a href="https://github.com/stevearc/oil.nvim"&gt;oil.nvim&lt;/a&gt; 紹介があり、vimの通常操作でファイル操作が可能になる機能がある。
EmacsのDiredでも同様のことがないか調査した所、標準機能に &lt;code&gt;wdired.el&lt;/code&gt; というものがあったので使ってみた。&lt;/p&gt;
&lt;h2 id="試したこと-やったこと"&gt;試したこと・やったこと&lt;/h2&gt;
&lt;h3 id="1-dot-wdiredの機能調査"&gt;1. wdiredの機能調査&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;wdired&lt;/code&gt; は &lt;code&gt;Writable Dired&lt;/code&gt; の略でDired拡張。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/emacs-mirror/emacs/blob/master/lisp/wdired.el"&gt;https://github.com/emacs-mirror/emacs/blob/master/lisp/wdired.el&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;大きな特徴は3点。
Emacs上で完結しているが故のkmacroなどの他の機能を使えるのが便利。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;テキスト処理の延長でファイル操作ができる（ディレクトリ名も変更可能）&lt;/li&gt;
&lt;li&gt;安全性とトランザクション&lt;/li&gt;
&lt;li&gt;Emacs Lispによる拡張可能&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="2-dot-wdired設定"&gt;2. wdired設定&lt;/h3&gt;
&lt;p&gt;Dired上で起動するの方法は &lt;code&gt;wdired-change-to-wdired-mode&lt;/code&gt; を有効にすればよく、 &lt;code&gt;r&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-emacs-lisp" data-lang="emacs-lisp"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;(&lt;span style="color:#a6e22e"&gt;define-key&lt;/span&gt; dired-mode-map &lt;span style="color:#e6db74"&gt;&amp;#34;r&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;#&amp;#39;&lt;/span&gt;wdired-change-to-wdired-mode)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;defcustom&lt;/code&gt; はそこそあるが、file permissionを変更できるように &lt;code&gt;wdired-allow-to-change-permissions&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-emacs-lisp" data-lang="emacs-lisp"&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;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;(defcustom wdired-allow-to-change-permissions &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:#e6db74"&gt;&amp;#34;If non-nil, the permissions bits of the files are editable.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&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:#e6db74"&gt;If t, to change a single bit, put the cursor over it and press the
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;space bar, or left click over it. You can also hit the letter you want
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;to set: if this value is allowed, the character in the buffer will be
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;changed. Anyway, the point is advanced one position, so, for example,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;you can keep the &amp;lt;x&amp;gt; key pressed to give execution permissions to
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;everybody to that file.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&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:#e6db74"&gt;If &lt;/span&gt;&lt;span style="color:#e6db74"&gt;`advanced&amp;#39;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;, the bits are freely editable. You can use
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;`string-rectangle&amp;#39;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;, &lt;/span&gt;&lt;span style="color:#e6db74"&gt;`query-replace&amp;#39;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;, etc. You can put any value (even
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;newlines), but if you want your changes to be useful, you better put a
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;intelligible value.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&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:#e6db74"&gt;The real change of the permissions is done by the external
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;program \&amp;#34;chmod\&amp;#34;, which must exist.&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; :type &lt;span style="color:#f92672"&gt;&amp;#39;&lt;/span&gt;(choice (const :tag &lt;span style="color:#e6db74"&gt;&amp;#34;Not allowed&amp;#34;&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; (const :tag &lt;span style="color:#e6db74"&gt;&amp;#34;Toggle/set bits&amp;#34;&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;t&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; (other :tag &lt;span style="color:#e6db74"&gt;&amp;#34;Bits freely editable&amp;#34;&lt;/span&gt; advanced)))
&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:#75715e"&gt;;;; 自分の設定&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;(setotp wdired-allow-to-change-permissions &lt;span style="color:#e6db74"&gt;&amp;#39;advanced&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="3-dot-挙動の確認"&gt;3. 挙動の確認&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;適当なディレクトリでdiredを開いて &lt;code&gt;r&lt;/code&gt; を押す&lt;/li&gt;
&lt;li&gt;ファイル名やpermissionを変更する&lt;/li&gt;
&lt;li&gt;&lt;code&gt;C-c C-c&lt;/code&gt; で保存する or &lt;code&gt;C-c C-k&lt;/code&gt; でロールバックする&lt;/li&gt;
&lt;/ol&gt;
&lt;figure&gt;&lt;img src="https://www.takeokunn.org/images/E62300C4-243B-413C-9C25-32897789BDF6.png"&gt;
&lt;/figure&gt;
&lt;h2 id="得られた結果-所感"&gt;得られた結果・所感&lt;/h2&gt;
&lt;p&gt;diredでのファイル操作が本当に楽になった。
普段がんばってshell script書いたりしてたので無駄なことをしてしまったと反省している。&lt;/p&gt;</description></item><item><title>k9sをDracula Theme対応した</title><link>https://www.takeokunn.org/posts/fleeting/20251124235900-k9s_dracula_theme/</link><pubDate>Sat, 29 Nov 2025 00:00:00 +0000</pubDate><guid>https://www.takeokunn.org/posts/fleeting/20251124235900-k9s_dracula_theme/</guid><description>&lt;h2 id="背景-動機"&gt;背景・動機&lt;/h2&gt;
&lt;p&gt;最近仕事でkubernetesを使う機会に恵まれた。
kubernetesを使うにあたって、モニタリングツールは&lt;a href="https://k9scli.io/"&gt;k9s&lt;/a&gt;がデファクトのようなのでhome-managerを使って導入した。
「すべてのツールのカラーテーマはdracula themeに寄せる」という方針なので漏れなく対応した。&lt;/p&gt;
&lt;h2 id="試したこと-やったこと"&gt;試したこと・やったこと&lt;/h2&gt;
&lt;h3 id="1-dot-home-managerで導入"&gt;1. home-managerで導入&lt;/h3&gt;
&lt;p&gt;home-manager moduleはすでに用意されているのでenableするだけでよい。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;C-c&lt;/code&gt; で閉じるよりも &lt;code&gt;:q&lt;/code&gt; で閉じる方が直感的なので &lt;code&gt;noExitOnCtrlC&lt;/code&gt; を有効化した。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/nix-community/home-manager/blob/master/modules/programs/k9s.nix"&gt;https://github.com/nix-community/home-manager/blob/master/modules/programs/k9s.nix&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-nix" data-lang="nix"&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; programs&lt;span style="color:#f92672"&gt;.&lt;/span&gt;k9s &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; enable &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; settings&lt;span style="color:#f92672"&gt;.&lt;/span&gt;k9s &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; noExitOnCtrlC &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;true&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&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="2-dot-dracula-theme対応"&gt;2. dracula theme対応&lt;/h3&gt;
&lt;p&gt;k9sはskinという機能を用意しており、自前で用意したものを適用できる。
Claude Codeに必要なものを用意させた。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://k9scli.io/topics/skins/"&gt;https://k9scli.io/topics/skins/&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-nix" data-lang="nix"&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; programs&lt;span style="color:#f92672"&gt;.&lt;/span&gt;k9s &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; settings&lt;span style="color:#f92672"&gt;.&lt;/span&gt;k9s &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ui&lt;span style="color:#f92672"&gt;.&lt;/span&gt;skin &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;dracula&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; skins &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; dracula &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;let&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; foreground &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;#f8f8f2&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; background &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;#282a36&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; current_line &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;#44475a&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; selection &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;#44475a&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; comment &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;#6272a4&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; cyan &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;#8be9fd&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; green &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;#50fa7b&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; orange &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;#ffb86c&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; pink &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;#ff79c6&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; purple &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;#bd93f9&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; red &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;#ff5555&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; yellow &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;#f1fa8c&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;in&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; k9s &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; body &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; fgColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; foreground;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; bgColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; background;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; logoColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; purple;
&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; prompt &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; fgColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; foreground;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; bgColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; background;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; suggestColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; purple;
&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; info &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; fgColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; pink;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; sectionColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; foreground;
&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; dialog &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; fgColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; foreground;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; bgColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; background;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; buttonFgColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; foreground;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; buttonBgColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; purple;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; buttonFocusFgColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; yellow;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; buttonFocusBgColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; pink;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; labelFgColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; orange;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; fieldFgColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; foreground;
&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; frame &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; border &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; fgColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; selection;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; focusColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; current_line;
&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; menu &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; fgColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; foreground;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; keyColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; pink;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; numKeyColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; pink;
&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; crumbs &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; fgColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; foreground;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; bgColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; current_line;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; activeColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; current_line;
&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; status &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; newColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; cyan;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; modifyColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; purple;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; addColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; green;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; errorColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; red;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; highlightColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; orange;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; killColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; comment;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; completedColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; comment;
&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 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; fgColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; foreground;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; bgColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; current_line;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; highlightColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; orange;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; counterColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; purple;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; filterColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; pink;
&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; views &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; charts &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; bgColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;default&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; defaultDialColors &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; purple
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; red
&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; defaultChartColors &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; purple
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; red
&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; table &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; fgColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; foreground;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; bgColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; background;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; header &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; fgColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; foreground;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; bgColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; background;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; sorterColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; cyan;
&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; xray &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; fgColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; foreground;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; bgColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; background;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; cursorColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; current_line;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; graphicColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; purple;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; showIcons &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;false&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; yaml &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; keyColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; pink;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; colonColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; purple;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; valueColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; foreground;
&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; logs &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; fgColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; foreground;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; bgColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; background;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; indicator &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; fgColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; foreground;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; bgColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; purple;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; toggleOnColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; green;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; toggleOffColor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; cyan;
&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&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&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="3-dot-k9s起動する"&gt;3. k9s起動する&lt;/h3&gt;
&lt;p&gt;無事反映されてることが確認できた。&lt;/p&gt;</description></item><item><title>個人的Aerospace設定</title><link>https://www.takeokunn.org/posts/fleeting/20251124235900-setting_aerospace/</link><pubDate>Sat, 29 Nov 2025 00:00:00 +0000</pubDate><guid>https://www.takeokunn.org/posts/fleeting/20251124235900-setting_aerospace/</guid><description>&lt;h2 id="背景-動機"&gt;背景・動機&lt;/h2&gt;
&lt;p&gt;タイル型Window Managerは割と好きで、Linux Desktopではswayを使っているのだが、macOSでも使いたいと思っていた。
macOSでは昔ながらの&lt;a href="https://github.com/koekeishiya/yabai"&gt;yabai&lt;/a&gt;と後発の&lt;a href="https://github.com/nikitabobko/AeroSpace"&gt;AeroSpace&lt;/a&gt;があるが、AeroSpaceで自分のユースケースをすべて満たせていたので採用した。&lt;/p&gt;
&lt;p&gt;1年使ってほぼ運用が固まったので後学の為にブログに書いておく。&lt;/p&gt;
&lt;p&gt;設定の全文はこちら。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/takeokunn/nixos-configuration/blob/main/nix-darwin/config/services/aerospace/default.nix"&gt;https://github.com/takeokunn/nixos-configuration/blob/main/nix-darwin/config/services/aerospace/default.nix&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="試したこと-やったこと"&gt;試したこと・やったこと&lt;/h2&gt;
&lt;h3 id="1-dot-nix-darwinでaerospaceを有効にする"&gt;1. nix-darwinでAeroSpaceを有効にする&lt;/h3&gt;
&lt;p&gt;nix-darwinでservices moduleが提供されている。
enableにするだけでlaunchd agentの設定が有効になり、 &lt;code&gt;Quit AeroSpace&lt;/code&gt; しても再起動されるようになる。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/nix-darwin/nix-darwin/blob/master/modules/services/aerospace/default.nix"&gt;https://github.com/nix-darwin/nix-darwin/blob/master/modules/services/aerospace/default.nix&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-nix" data-lang="nix"&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;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; services&lt;span style="color:#f92672"&gt;.&lt;/span&gt;aerospace &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; enable &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;true&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;/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-nix" data-lang="nix"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# nix-darwin記述抜粋&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; launchd&lt;span style="color:#f92672"&gt;.&lt;/span&gt;user&lt;span style="color:#f92672"&gt;.&lt;/span&gt;agents&lt;span style="color:#f92672"&gt;.&lt;/span&gt;aerospace &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; command &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;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;cfg&lt;span style="color:#f92672"&gt;.&lt;/span&gt;package&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;/Applications/AeroSpace.app/Contents/MacOS/AeroSpace&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; (lib&lt;span style="color:#f92672"&gt;.&lt;/span&gt;optionalString (cfg&lt;span style="color:#f92672"&gt;.&lt;/span&gt;settings &lt;span style="color:#f92672"&gt;!=&lt;/span&gt; { }) &lt;span style="color:#e6db74"&gt;&amp;#34; --config-path &lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;configFile&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; serviceConfig &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; KeepAlive &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; RunAtLoad &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;true&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; managedBy &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;services.aerospace.enable&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="2-dot-基本設定"&gt;2. 基本設定&lt;/h3&gt;
&lt;p&gt;適当に便利そうな設定を入れている。
&lt;a href="https://github.com/FelixKratz/SketchyBar"&gt;sketchybar&lt;/a&gt; の関係で &lt;code&gt;gaps.outer.top=10&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-nix" data-lang="nix"&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; settings &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; enable-normalization-flatten-containers &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; enable-normalization-opposite-orientation-for-nested-containers &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; accordion-padding &lt;span style="color:#f92672"&gt;=&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; on-focused-monitor-changed &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [ &lt;span style="color:#e6db74"&gt;&amp;#34;move-mouse monitor-lazy-center&amp;#34;&lt;/span&gt; ];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; exec-on-workspace-change &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;/bin/bash&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;-c&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;sketchybar --trigger aerospace_workspace_change FOCUSED_WORKSPACE=$(/run/current-system/sw/bin/aerospace list-workspaces --focused)&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; gaps &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; inner &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; horizontal &lt;span style="color:#f92672"&gt;=&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; vertical &lt;span style="color:#f92672"&gt;=&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&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; outer &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; left &lt;span style="color:#f92672"&gt;=&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; bottom &lt;span style="color:#f92672"&gt;=&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; top &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;10&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; right &lt;span style="color:#f92672"&gt;=&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&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&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="3-dot-keybind周りの設定"&gt;3. keybind周りの設定&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;alt&lt;/code&gt; で操作する割と一般的な設定をしている。&lt;/p&gt;</description></item><item><title>Geminiで専門家カスタムGemを作る</title><link>https://www.takeokunn.org/posts/fleeting/20250727134126-build_your_gemini_expert/</link><pubDate>Sun, 27 Jul 2025 00:00:00 +0000</pubDate><guid>https://www.takeokunn.org/posts/fleeting/20250727134126-build_your_gemini_expert/</guid><description>&lt;h2 id="背景-動機"&gt;背景・動機&lt;/h2&gt;
&lt;p&gt;普段使いのチャットベースのAIサービスを完全にGeminiに寄せる決断ができた。
元々ChatGPTやClaudeを使っていたが、次の理由でGeminiがいいだろうという結論に落ち着いた。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Gemini 2.5 Proが賢すぎる&lt;/li&gt;
&lt;li&gt;仕事関連のGoogle WorkspaceだとPro版が使える&lt;/li&gt;
&lt;li&gt;電車の中でAndroidスマホでアイディア出しに使いやすい&lt;/li&gt;
&lt;li&gt;オフィスツールとの親和性がよい&lt;/li&gt;
&lt;li&gt;カスタムGemが作りやすい&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;メールサービスもそうだが、基本的に拘りのないものはGoogleに寄せていこう個人的な方針もあり、他サービスをアンインストールした。
今回はGeminiのカスタムGemについての紹介と、Gemの作り方について纏める。&lt;/p&gt;
&lt;p&gt;なお、自分の肌感覚の話が多いので注意が必要。&lt;/p&gt;
&lt;h2 id="試したこと-やったこと"&gt;試したこと・やったこと&lt;/h2&gt;
&lt;h3 id="0-dot-基本的な方針"&gt;0. 基本的な方針&lt;/h3&gt;
&lt;p&gt;カスタムGemはデフォルトプロンプトが設定できるのだが、デフォルトのプロンプトを設定することは次のような利点がある。&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;/ul&gt;
&lt;p&gt;最近のLLMのモデルは賢いので、「あなたはAWSソリューションアーキテクトです」のようなことを伝えなくてもよしなに理解してくれるのですが、自分の肌感覚だと役割を伝えた方が明瞭な回答が返ってくる印象。
自分がAIに質問を投げる時の大半は、明確に「これについて聞きたい」ということがある時なので余計作った方がいいなという結論になっている。&lt;/p&gt;
&lt;h3 id="1-dot-gemを作るカスタムgemを作る"&gt;1. Gemを作るカスタムGemを作る&lt;/h3&gt;
&lt;p&gt;世の中にはさまざまなプロンプトエンジニアリングテクニックがあるが、プロンプト生成をするプロンプトをAIに生成させる方がコストが低いのでGeminiに作ってもらった。&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-markdown" data-lang="markdown"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;# 1. YOUR PERSONA: Master Prompt Engineer &amp;amp; AI Behavior Architect
&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;あなたは、AIの能力を最大限に引き出すための「システムプロンプト」を設計する、世界最高峰のプロンプトアーキテクトです。
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;あなたの使命は、ユーザーから要求された役割（例: AWSアーキテクト、マーケター、コピーライター）の本質を深く理解し、その役割をAIに憑依させるための、精巧でパワフルなシステムプロンプトを設計・生成することです。
&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;# 2. GUIDING PRINCIPLES: The Blueprint of High-Quality Prompts
&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;あなたが設計する全てのシステムプロンプトは、以下の5つの基本原則を必ず満たしていなければなりません。
&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;1.&lt;/span&gt; &lt;span style="font-weight:bold"&gt;**Deep Persona (深みのあるペルソナ)**&lt;/span&gt;: 単なる役割名だけでなく、その役割が持つべき「哲学」「価値観」「使命」「思考の軸」までを定義し、一貫性のある深い人格をAIに与えること。
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;2.&lt;/span&gt; &lt;span style="font-weight:bold"&gt;**Structured Principles (構造化された原則)**&lt;/span&gt;: AIが従うべき行動や思考の指針を、明確で解釈の余地がない箇条書きの「原則」として定義すること。
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;3.&lt;/span&gt; &lt;span style="font-weight:bold"&gt;**Actionable Workflow (実行可能なワークフロー)**&lt;/span&gt;: ユーザーからの入力に対し、AIが「どのような手順で思考し、どのような構造で応答を生成すべきか」という具体的な実行プロセス（プロトコル）を定義すること。
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;4.&lt;/span&gt; &lt;span style="font-weight:bold"&gt;**Value-Adding Behavior (付加価値のある振る舞い)**&lt;/span&gt;: AIが単に指示されたタスクをこなすだけでなく、専門家として「より良くするための提案」や「潜在的なリスクの指摘」など、能動的で気の利いたアクションを取るように設計すること。
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;5.&lt;/span&gt; &lt;span style="font-weight:bold"&gt;**Clear Constraints (明確な制約)**&lt;/span&gt;: AIが「やってはいけないこと」を禁止事項として明確に定義し、暴走や質の低い応答を防ぐこと。
&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;# 3. EXECUTION PROTOCOL: Your Prompt Engineering Workflow
&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&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;## STEP 1: Deconstruct the User&amp;#39;s Request (要求の分解と役割定義)
&lt;/span&gt;&lt;/span&gt;&lt;/span&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;&lt;span style="color:#66d9ef"&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;-&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:#75715e"&gt;## STEP 2: Architect and Generate the System Prompt (プロンプトの設計と生成)
&lt;/span&gt;&lt;/span&gt;&lt;/span&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;&lt;span style="color:#66d9ef"&gt;-&lt;/span&gt; 上記の分析と5つの基本原則に基づき、要求された役割のための**完全なシステムプロンプト**をMarkdown形式で生成します。
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&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&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="font-style:italic"&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;`
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; `&lt;/span&gt;# CORE DIRECTIVE: SYSTEM PROMPT&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:#e6db74"&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; `&lt;/span&gt;# 1. PERSONA: [役割名]&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:#e6db74"&gt; `&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:#e6db74"&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; `&lt;/span&gt;# 2. GUIDING PRINCIPLES: [その役割の行動原則]&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:#e6db74"&gt; `&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:#e6db74"&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; `&lt;/span&gt;# 3. EXECUTION PROTOCOL: [具体的な実行手順]&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:#e6db74"&gt; `&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:#e6db74"&gt; `&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:#e6db74"&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; `&lt;/span&gt;# 4. ABSOLUTE CONSTRAINTS: [禁止事項]&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:#e6db74"&gt; `&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:#e6db74"&gt; `&lt;/span&gt;``
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="font-style:italic"&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&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;## STEP 3: Provide a Rationale and Usage Guide (設計意図の解説)
&lt;/span&gt;&lt;/span&gt;&lt;/span&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;&lt;span style="color:#66d9ef"&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;-&lt;/span&gt; **【設計意図】**: なぜこのペルソナ、原則、ワークフローを設定したのか、その設計思想を簡潔に説明します。
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;-&lt;/span&gt; **【使い方】**: 生成したプロンプトをAIのシステムプロンプトとして設定し、どのように対話を開始すればよいかをユーザーに案内します。
&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:#75715e"&gt;## STEP 4: Iterate and Refine (改善サイクル)
&lt;/span&gt;&lt;/span&gt;&lt;/span&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;&lt;span style="color:#66d9ef"&gt;-&lt;/span&gt; ユーザーから「もっとこうしてほしい」というフィードバックがあれば、それに応じて生成したプロンプトを即座に改善し、再提案します。
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;a href="https://support.google.com/gemini/answer/15235603?hl=ja"&gt;カスタム Gem 作成のヒント - Google&lt;/a&gt; を参考にカスタムGemを作成する。&lt;/p&gt;</description></item><item><title>プロポーザルの出し方・心構え</title><link>https://www.takeokunn.org/posts/fleeting/20250722020425-proposal_guide/</link><pubDate>Tue, 22 Jul 2025 00:00:00 +0000</pubDate><guid>https://www.takeokunn.org/posts/fleeting/20250722020425-proposal_guide/</guid><description>&lt;h2 id="1-dot-introduction"&gt;1. Introduction&lt;/h2&gt;
&lt;p&gt;最近プロポーザルの出し方について話す機会が身近で増えました。
私自身、過去にPHPカンファレンスなどの技術イベントで何度も登壇した経験があります。
本記事ではそうした経験から得られたプロポーザルを書く上での心構えや具体的なTipsについて解説します。&lt;/p&gt;
&lt;p&gt;また、多くの人が悩む「プロポーザルを出すネタがない」という課題に対する私なりの解決策も提示したいと考えています。&lt;/p&gt;
&lt;p&gt;あくまで私個人の経験に基づく独断と偏見が多分に含まれている点、また、自分はこうありたいという理想を書いている点をご了承ください。&lt;/p&gt;
&lt;h2 id="2-dot-今北産業"&gt;2. 今北産業&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;日々学んだことや取り組んだことをアウトプットしよう&lt;/li&gt;
&lt;li&gt;アウトプットしたものを元に魅力的なプロポーザルを作ろう&lt;/li&gt;
&lt;li&gt;カンファレンスに限らず積極的に打席に立とう&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="3-dot-今回のスコープ"&gt;3. 今回のスコープ&lt;/h2&gt;
&lt;p&gt;本記事で対象とするカンファレンスは、主にPHPカンファレンスのような技術カンファレンスを想定しています。&lt;/p&gt;
&lt;p&gt;一口にカンファレンスと言ってもその規模や目的はさまざまです。
たとえば国際カンファレンスであれば一定の権威性がありますし、地方のカンファレンスであれば一般的な勉強会の延長線上にあります。
本記事では特にカンファレンスの規模を区別せずに書いています。&lt;/p&gt;
&lt;p&gt;また、トークの長さとしては15分〜30分程度のものをイメージしています。
5分程度のLTはゲーム性が異なると考えているため本記事のスコープ外とします。&lt;/p&gt;
&lt;h2 id="4-dot-直近出したプロポーザル"&gt;4. 直近出したプロポーザル&lt;/h2&gt;
&lt;h3 id="4-dot-1-dot-実例"&gt;4.1. 実例&lt;/h3&gt;
&lt;p&gt;直近の2025年前半に提出したプロポーザルを実例として紹介します。&lt;/p&gt;
&lt;p&gt;PHPConで採択されたプロポーザルは次のとおりです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://fortee.jp/phpcon-nagoya-2025/proposal/8c520c5c-d564-4f6e-b5d9-10821b35d98c"&gt;PHPUnitを低速化する技術 - PHPカンファレンス名古屋2025&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://fortee.jp/phperkaigi-2025/proposal/9484cc8e-4002-4d1e-8b30-f11f6a91f853"&gt;Phpactorから学ぶLanguage Server Protocolの仕組み - PHPerKaigi 2025&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;pdf: &lt;a href="https://www.takeokunn.org/pdf/phperkaigi-2025-pamphlet.pdf"&gt;https://www.takeokunn.org/pdf/phperkaigi-2025-pamphlet.pdf&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://fortee.jp/phpconodawara-2025/proposal/6d853d31-19ed-4e75-b7fb-841b9490d9a8"&gt;定義ジャンプ入門 - PHPカンファレンス小田原2025&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://fortee.jp/phpconniigata-2025/proposal/ab0380b4-95fd-4dad-8788-c0795bb15815"&gt;AWS SQSとLaravelで大規模トラフィックを捌く - PHPカンファレンス新潟2025&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://fortee.jp/phpcon-2025/proposal/fcae051f-5b13-4e08-989b-721edadb7134"&gt;yieldが変えるLaravelの世界：LazyCollection徹底入門 - PHP Conference Japan 2025&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;PHPCon関西で不採択となったプロポーザルは次のとおりです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://fortee.jp/phpcon-kansai2025/proposal/rejected?q=takeokunn"&gt;https://fortee.jp/phpcon-kansai2025/proposal/rejected?q=takeokunn&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;VimConfではEmacsに関するテーマで応募しましたが、残念ながら不採択となりました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://gist.github.com/takeokunn/141f85d437390607772135f6f98a3882"&gt;Org My Life with Vim&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gist.github.com/takeokunn/2db3fec85d4c374e9ffaacfe4ad1d221"&gt;Beyond One Thing: A Vim &amp;amp; Emacs Strategy for Role Separation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="4-dot-2-dot-ポリシー"&gt;4.2. ポリシー&lt;/h3&gt;
&lt;p&gt;これはあくまで私個人のルールなので参考にされてもされなくても構いません。&lt;/p&gt;</description></item><item><title>Hugoで生成したブログにllms.txtとllms-full.txtを導入した</title><link>https://www.takeokunn.org/posts/fleeting/20250718160938-add_llms_txt/</link><pubDate>Fri, 18 Jul 2025 00:00:00 +0000</pubDate><guid>https://www.takeokunn.org/posts/fleeting/20250718160938-add_llms_txt/</guid><description>&lt;h2 id="背景-動機"&gt;背景・動機&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://tech.basemachina.jp/entry/llms-full-txt-ai-support-chat"&gt;llms-full.txtで始めるAIサポートチャット - basemachina&lt;/a&gt; を読んだ。&lt;/p&gt;
&lt;p&gt;最近gemini-cliで文章を書かせることが増えたので、自分の文章スタイルを学習させればブログを半自動生成できるんだろうなと思ったので試してみた。&lt;/p&gt;
&lt;h2 id="試したこと-やったこと"&gt;試したこと・やったこと&lt;/h2&gt;
&lt;h3 id="1-dot-llms-dot-txtの規格について簡単に調査する"&gt;1. llms.txtの規格について簡単に調査する&lt;/h3&gt;
&lt;p&gt;以下が仕様。
&lt;a href="https://llmstxt.org/"&gt;https://llmstxt.org/&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;llms.txt: サイトの概要や、サイトに含まれるページへのリンク一覧&lt;/li&gt;
&lt;li&gt;llms-full.txt: サイト全体の情報を1つに収めた文書ファイル&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;各サービスのlls-full.txtは以下。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Cursor （約500KB）
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.cursor.com/llms-full.txt"&gt;https://docs.cursor.com/llms-full.txt&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Anthropic （約2.5MB）
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.anthropic.com/llms-full.txt"&gt;https://docs.anthropic.com/llms-full.txt&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Mastra （約4MB）
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://mastra.ai/llms-full.txt"&gt;https://mastra.ai/llms-full.txt&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Cloudflare （約17MB）
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://developers.cloudflare.com/llms-full.txt"&gt;https://developers.cloudflare.com/llms-full.txt&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="2-dot-hugoに導入する"&gt;2. hugoに導入する&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://masutaka.net/2025-05-18-1/"&gt;Hugo で作ったサイトに llms.txt と llms-full.txt を設置した&lt;/a&gt; を参考にした。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/takeokunn/hugo-take-theme"&gt;takeokunn/hugo-take-theme&lt;/a&gt; で次のlayoutを作成した。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/takeokunn/hugo-take-theme/blob/main/layouts/index.llms.txt"&gt;index.llms.txt&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-markdown" data-lang="markdown"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;# takeokunn&amp;#39;s blog
&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;たけてぃ(@takeokunn)の個人的なメモです。
&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:#75715e"&gt;## URL Structure
&lt;/span&gt;&lt;/span&gt;&lt;/span&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;Zettelkasten
&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;-&lt;/span&gt; fleeting
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&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;-&lt;/span&gt; permanent
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&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;-&lt;/span&gt; poem
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&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;-&lt;/span&gt; diary
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&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:#75715e"&gt;## Content
&lt;/span&gt;&lt;/span&gt;&lt;/span&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;{{ range .Site.RegularPages }}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;-&lt;/span&gt; [&lt;span style="color:#f92672"&gt;{{ .Title }}&lt;/span&gt;](&lt;span style="color:#a6e22e"&gt;{{ .Permalink }}&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{{ end }}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;a href="https://github.com/takeokunn/hugo-take-theme/blob/main/layouts/index.llmsfull.txt"&gt;index.llmsfull.txt&lt;/a&gt;:&lt;/p&gt;</description></item><item><title>Makefileを便利コマンドメモとして使うことに対する違和感</title><link>https://www.takeokunn.org/posts/permanent/20250711132607-why_not_command_memo_makefile/</link><pubDate>Fri, 11 Jul 2025 00:00:00 +0000</pubDate><guid>https://www.takeokunn.org/posts/permanent/20250711132607-why_not_command_memo_makefile/</guid><description>&lt;h2 id="追記"&gt;追記&lt;/h2&gt;
&lt;p&gt;この記事に対するyasunoriの補足記事はこちら。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://blog.yasunori0418.dev/p/appendix-makefile/"&gt;https://blog.yasunori0418.dev/p/appendix-makefile/&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;yasunoriがZennに書いた「&lt;a href="https://zenn.dev/loglass/articles/0016-make-makefile"&gt;職場のプロジェクトに必ず配置しちゃうMakefileの話&lt;/a&gt;」というのがバズっています。
「コマンドが覚え辛い」という、どのプロジェクトにもあるような問題を「Makefileをコマンドメモとして整える」ことによって解決するという記事でした。
SNSやvim-jp slackを見ていると賛同の声が多い印象を受けています。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://b.hatena.ne.jp/entry/s/zenn.dev/loglass/articles/0016-make-makefile"&gt;https://b.hatena.ne.jp/entry/s/zenn.dev/loglass/articles/0016-make-makefile&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;私個人も過去に同様のMakefileを作ったことがあるし、現職でもMakefileが入っているプロジェクトがあるくらいにはよくある手法です。&lt;/p&gt;
&lt;p&gt;しかし、この記事を読んだ時に自分としてはこの手法がイマイチだと感じました。
モヤモヤをちゃんと言語化した方がいいだろうということでこの記事を書いています。&lt;/p&gt;
&lt;p&gt;決して元記事を批判するつもりはなく、こういう視点もあるよというくらいの温度感で捉えてほしいです。&lt;/p&gt;
&lt;blockquote class="twitter-tweet"&gt;&lt;p lang="ja" dir="ltr"&gt;Makefileをコマンドメモに使うな&lt;/p&gt;&amp;mdash; たけてぃ𓁈𓈷 (@takeokunn) &lt;a href="https://twitter.com/takeokunn/status/1247911308646699019?ref_src=twsrc%5Etfw"&gt;April 8, 2020&lt;/a&gt;&lt;/blockquote&gt; &lt;script async src="https://platform.twitter.com/widgets.js" charset="utf-8"&gt;&lt;/script&gt;
&lt;h2 id="makefileをプロジェクトに入れたい時の前提整理"&gt;Makefileをプロジェクトに入れたい時の前提整理&lt;/h2&gt;
&lt;p&gt;そもそも「誰のために」「どのプロジェクト規模で」「どういう問題を解決したくて」Makefileをプロジェクトに追加するものなのか整理する必要があります。&lt;/p&gt;
&lt;p&gt;今回のユースケースでは、古き良きC言語をBuildする時の &lt;code&gt;make &amp;amp;&amp;amp; make install&lt;/code&gt; のようなタスクランナー的な使い方ではなく、元記事と同様プロジェクトのコマンドメモとしての使い方について言及しています。&lt;/p&gt;
&lt;h3 id="makefileの想定利用者"&gt;Makefileの想定利用者&lt;/h3&gt;
&lt;p&gt;想定利用者のペルソナ像は主に4種類います。&lt;/p&gt;
&lt;p&gt;1つめは、デザインや文言を修正したい非エンジニア寄りのデザイナーです。&lt;/p&gt;
&lt;p&gt;役割はUI/UXデザイナー、またはマークアップ担当者で、技術スキルは低〜中程度を想定しています。
主な目的は、文言・デザインの軽微な修正を手元で確認し、FigmaやXDのようなデザインツール上ではなく「実際の画面」で表示を見ることです。
行動特性としては、GUIでの操作が望ましく、ターミナル操作も最低限であれば対応可能ですが、何度も環境構築の手順を覚えるのは非効率だと感じています。
主な課題として、環境構築に時間がかかること、依存関係が多すぎて途中で躓いてしまうこと、Node.js, Ruby, Pythonといった技術スタックの違いが分からない、といった点が挙げられます。&lt;/p&gt;
&lt;p&gt;2つめは、そのプロジェクトに精通していないプログラマです。&lt;/p&gt;
&lt;p&gt;役割は外部の協力会社のメンバー、派遣や業務委託のエンジニア、またはプロジェクトに参加したばかりの新人エンジニアを想定しています。技術スキルは中〜高程度です。
主な目的は、限られた期間や担当範囲の中で、与えられたチケットの実装や修正を効率的に行うことであり、プロジェクト全体の詳細な把握は必要最低限で済ませたいと考えています。
行動特性としては、ローカル環境の立ち上げに時間をかけたくないと感じており、覚えるべき新規のコマンドが多すぎると混乱してしまいます。
主な課題として、「.envファイルはどこにあるのか？」「どの順番で起動すればいいのか？」「フロントエンドだけでなくバックエンドも動かす必要があるのか？」といった疑問が次々と湧いてくる点が挙げられます。&lt;/p&gt;
&lt;p&gt;3つめは、そのプロジェクトに精通しているプログラマです。&lt;/p&gt;
&lt;p&gt;役割はリードエンジニア、メンテナー、あるいは主要な開発者であり、技術スキルは高いレベルにあります。
主な目的は、長期的な保守や機能の拡張や新機能の実装や大規模な構成変更など、プロジェクトの根幹に関わる作業することです。
行動特性としては、再利用性や抽象化といった概念に関心があり、開発フローの自動化や最適化にも積極的です。
主な課題として、コマンドが乱立して管理が煩雑になること、特定の担当者にしか分からない作業（属人化）が増えること、そしてドキュメントが古くなって陳腐化しがちである点が挙げられます。&lt;/p&gt;
&lt;p&gt;4つめは、AI Coding Agentです。&lt;/p&gt;
&lt;p&gt;役割はVibe Coding、その技術スキルは正確かつ高速な処理能力にあります。
主な目的は、指定された手順を正確に実行し、ソースコードのビルド、テスト、静的チェックといった成果物の検証作業を滞りなく行うことです。
行動特性としては、曖昧な指示に弱く、処理の中間ステップが明示的に定義されていないと失敗する傾向があります。また、コマンドの標準出力（STDOUT）が構造化されていることを期待する場合もあります。
主な課題として、コマンドの実行に失敗した場合でも、その背景にある詳細な文脈を読み解いてリトライしたり、原因を推測ができない点が挙げられます。&lt;/p&gt;
&lt;h3 id="想定しているプロジェクト規模"&gt;想定しているプロジェクト規模&lt;/h3&gt;
&lt;p&gt;当記事で想定しているプロジェクトは主に3種類あります。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;プロジェクト規模&lt;/th&gt;
&lt;th&gt;コード行数&lt;/th&gt;
&lt;th&gt;特徴&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;小規模プロジェクト&lt;/td&gt;
&lt;td&gt;1万行程度&lt;/td&gt;
&lt;td&gt;数ページ程度のちょっとしたWebアプリケーション、単一言語、依存ツールチェインが少ない&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;中規模プロジェクト&lt;/td&gt;
&lt;td&gt;10万行程度&lt;/td&gt;
&lt;td&gt;複数機能があるWebアプリケーション、複数言語、依存ツールチェインや開発用コマンドがそれなりに多い&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;大規模プロジェクト&lt;/td&gt;
&lt;td&gt;100万程度&lt;/td&gt;
&lt;td&gt;大規模なWebアプリケーション、複数言語、依存ツールチェインや開発用コマンドが多い&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="makefileで実行するコマンド"&gt;Makefileで実行するコマンド&lt;/h3&gt;
&lt;p&gt;今まで見てきたコマンドは主に3種類です。&lt;/p&gt;</description></item><item><title>はてなブックマークコメント非表示にした</title><link>https://www.takeokunn.org/posts/fleeting/20250709113618-disable_hatena_bookmark_comment/</link><pubDate>Wed, 09 Jul 2025 00:00:00 +0000</pubDate><guid>https://www.takeokunn.org/posts/fleeting/20250709113618-disable_hatena_bookmark_comment/</guid><description>&lt;h2 id="背景-動機"&gt;背景・動機&lt;/h2&gt;
&lt;p&gt;バズった記事のはてなブックマークのコメントを見る度に、嫉妬や見苦しいコメントが際立つなという感想を長年持っていた。&lt;/p&gt;
&lt;p&gt;自分のブログがはてなブックマークで書かれたことはないが、変な火種を生んでもしょうがないので非表示にすることにした。&lt;/p&gt;
&lt;h2 id="試したこと-やったこと"&gt;試したこと・やったこと&lt;/h2&gt;
&lt;h3 id="1-dot-方針決め"&gt;1. 方針決め&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://www.takeokunn.org/posts/permanent/20231219122351-how_to_manage_blog_by_org_roam/"&gt;org-roamで記事を管理しGitHub Actionsで適切に公開する&lt;/a&gt; にも書いたとおり、2025年7月現在、私は次の2つのブログを運用している。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;URL&lt;/th&gt;
&lt;th&gt;想定読者&lt;/th&gt;
&lt;th&gt;用途&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;自作ブログ&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.takeokunn.org/"&gt;www.takeokunn.org&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;特定少数（2hop以内）&lt;/td&gt;
&lt;td&gt;個人的な調査メモや作業ログ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Zenn&lt;/td&gt;
&lt;td&gt;&lt;a href="https://zenn.dev/takeokunn/"&gt;zenn.dev/takeokunn&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;不特定多数&lt;/td&gt;
&lt;td&gt;対外的な活動報告 + 広報目的&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Zennに関して、仕事に紐付く活動なので基本的しっかり腰を据えて書いている。
所属企業のAdventCalendarもZennに書くことにしている。&lt;/p&gt;
&lt;p&gt;一方自作ブログの方は、この記事もそうだが自分の作業メモとして書いている。
なので、校正も甘かったり誤字脱字もあったり検証が甘かったり、基本的にツメが甘いことが多い。
そもそも不特定多数を意識したブログではないので不特定多数からのフィードバックを期待していない。&lt;/p&gt;
&lt;p&gt;ブックマーク自体はされてもよいので、今回は自作ブログの方のみ、はてなブックマークコメント非表示にすることにした。&lt;/p&gt;
&lt;h3 id="2-dot-コメント非表示対応"&gt;2. コメント非表示対応&lt;/h3&gt;
&lt;p&gt;はてなブックマークヘルプに「コメント一覧非表示機能について」の記述がある。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://b.hatena.ne.jp/help/entry/nocomment"&gt;https://b.hatena.ne.jp/help/entry/nocomment&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;今回は自作ブログなのでmetaタグを追加すれば解決するようだ。&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-html" data-lang="html"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;meta&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;name&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;Hatena::Bookmark&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;content&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;nocomment&amp;#34;&lt;/span&gt; /&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;テーマは &lt;a href="https://github.com/takeokunn/hugo-take-theme"&gt;takeokunn/hugo-take-theme&lt;/a&gt; で管理しているのでタグ追加する対応をした。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/takeokunn/hugo-take-theme/commit/618ddf7990affdbf0b72c705fc4e945d9d9224ec"&gt;https://github.com/takeokunn/hugo-take-theme/commit/618ddf7990affdbf0b72c705fc4e945d9d9224ec&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;あとはcurlを叩いて反映されてることを確認した。&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-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ curl -s https://www.takeokunn.org/ | grep &lt;span style="color:#e6db74"&gt;&amp;#39;Hatena::Bookmark&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;!doctype html&amp;gt;&amp;lt;html lang&lt;span style="color:#f92672"&gt;=&lt;/span&gt;ja-jp dir&lt;span style="color:#f92672"&gt;=&lt;/span&gt;ltr prefix&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;og: https://ogp.me/ns#&amp;#34;&lt;/span&gt;&amp;gt;&amp;lt;head&amp;gt;&amp;lt;meta name&lt;span style="color:#f92672"&gt;=&lt;/span&gt;generator content&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;Hugo 0.146.4&amp;#34;&lt;/span&gt;&amp;gt;&amp;lt;meta charset&lt;span style="color:#f92672"&gt;=&lt;/span&gt;utf-8&amp;gt;&amp;lt;meta http-equiv&lt;span style="color:#f92672"&gt;=&lt;/span&gt;content-type content&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;text/html&amp;#34;&lt;/span&gt;&amp;gt;&amp;lt;meta name&lt;span style="color:#f92672"&gt;=&lt;/span&gt;viewport content&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;width=device-width,initial-scale=1&amp;#34;&lt;/span&gt;&amp;gt;&amp;lt;meta name&lt;span style="color:#f92672"&gt;=&lt;/span&gt;Hatena::Bookmark content&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;nocomment&amp;#34;&lt;/span&gt;&amp;gt;&amp;lt;title itemprop&lt;span style="color:#f92672"&gt;=&lt;/span&gt;name&amp;gt;takeokunn&lt;span style="color:#960050;background-color:#1e0010"&gt;&amp;#39;&lt;/span&gt;s blog&amp;lt;/title&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="3-dot-動作検証"&gt;3. 動作検証&lt;/h3&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;/ol&gt;
&lt;figure&gt;&lt;img src="https://www.takeokunn.org/images/09E03652-CE70-484B-86B0-BC64CBD5D956.png"&gt;
&lt;/figure&gt;
&lt;h2 id="得られた結果-所感"&gt;得られた結果・所感&lt;/h2&gt;
&lt;p&gt;無用な争いを避けられそうなので良かった。&lt;/p&gt;</description></item><item><title>GitHub Actions上でtblsを使ってスキーマ情報を取得してAIでSQLを生成する</title><link>https://www.takeokunn.org/posts/fleeting/20250628165348-github_actions_tbls_ai_sql_generation/</link><pubDate>Sat, 28 Jun 2025 00:00:00 +0000</pubDate><guid>https://www.takeokunn.org/posts/fleeting/20250628165348-github_actions_tbls_ai_sql_generation/</guid><description>&lt;h2 id="背景-動機"&gt;背景・動機&lt;/h2&gt;
&lt;p&gt;日頃から &lt;a href="https://github.com/k1LoW/tbls"&gt;k1LoW/tbls&lt;/a&gt; を 利用しているが、個人的に気に入ってる運用をメモしておく。&lt;/p&gt;
&lt;h2 id="試したこと-やったこと"&gt;試したこと・やったこと&lt;/h2&gt;
&lt;h3 id="1-dot-github-actionsでdbに入れつつtblsを実行する"&gt;1. GitHub ActionsでDBに入れつつtblsを実行する&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://k1low.hatenablog.com/entry/2023/02/16/093315"&gt;tblsをセットアップするGitHub Actionとしてsetup-tbls（を作るツールとしてgh-setup）を作った&lt;/a&gt; にもあるとおり、&lt;a href="https://github.com/k1low/setup-tbls"&gt;k1low/setup-tbls&lt;/a&gt; を利用すればGitHub Actions上でtblsを簡単に利用できる。&lt;/p&gt;
&lt;p&gt;以下はISUCONで使っているGitHub Actionsだが、Laravelでも同じように &lt;code&gt;php artisan migrate&lt;/code&gt; すればよい。
&lt;code&gt;main&lt;/code&gt; branchにpushされたら更新される。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;MySQLのセットアップ&lt;/li&gt;
&lt;li&gt;tblsをインストール&lt;/li&gt;
&lt;li&gt;DBにスキーマ情報を反映&lt;/li&gt;
&lt;li&gt;tbls docを実行する&lt;/li&gt;
&lt;li&gt;dbdoc branchに &lt;code&gt;./dbdoc&lt;/code&gt; を反映してpushする&lt;/li&gt;
&lt;/ol&gt;
&lt;!--listend--&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-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;Run db_tbls&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;on&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;workflow_dispatch&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;push&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;branches&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&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;permissions&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;contents&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;write&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;jobs&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;db-tbls&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;runs-on&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;ubuntu-latest&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;timeout-minutes&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;300&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;services&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;mysql&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;image&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;mysql:8&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;options&lt;/span&gt;: --&lt;span style="color:#ae81ff"&gt;health-cmd &amp;#34;mysqladmin ping -h localhost&amp;#34; --health-interval 20s --health-timeout 10s --health-retries 10&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;ports&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;3306&lt;/span&gt;:&lt;span style="color:#ae81ff"&gt;3306&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;env&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;MYSQL_DATABASE&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;isuride&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;MYSQL_ROOT_PASSWORD&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;isucon&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;MYSQL_ROOT_HOST&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#39;%&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;steps&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;uses&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;actions/checkout@v4&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;uses&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;k1low/setup-tbls@v1&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;name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;Run schema.sql&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;run&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;mysql --host=&amp;#34;127.0.0.1&amp;#34; --port=3306 --user=&amp;#34;root&amp;#34; --password=&amp;#34;isucon&amp;#34; isuride &amp;lt; webapp/sql/1-schema.sql&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;name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;Run tbls for generate database document&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;run&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;tbls doc --dsn &amp;#34;mysql://root:isucon@127.0.0.1:3306/isuride&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:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;Deploy dbdob&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;uses&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;peaceiris/actions-gh-pages@v4&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;with&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;github_token&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;${{ secrets.GITHUB_TOKEN }}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;publish_dir&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;./dbdoc&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;publish_branch&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;dbdoc&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="2-dot-dbdoc-repoを用意する"&gt;2. dbdoc repoを用意する&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;&amp;lt;repo-name&amp;gt;-dbdoc&amp;gt;&lt;/code&gt; を用意する。&lt;/p&gt;</description></item><item><title>php-srcとyieldについて調査メモ</title><link>https://www.takeokunn.org/posts/fleeting/20250625115611-yield_in_php_src/</link><pubDate>Wed, 25 Jun 2025 00:00:00 +0000</pubDate><guid>https://www.takeokunn.org/posts/fleeting/20250625115611-yield_in_php_src/</guid><description>&lt;h2 id="背景-動機"&gt;背景・動機&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://github.com/php/php-src"&gt;php/php-src&lt;/a&gt; でyieldはどう扱われているのか調査したのでメモしておく。&lt;/p&gt;
&lt;h2 id="試したこと-やったこと"&gt;試したこと・やったこと&lt;/h2&gt;
&lt;h3 id="rfcを読む"&gt;RFCを読む&lt;/h3&gt;
&lt;p&gt;2012/06/05にNikita Popov氏が「Request for Comments: Generators」というRFCを出している。
yield構文はPHP 5.5で導入されたようだ。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://wiki.php.net/rfc/generators"&gt;https://wiki.php.net/rfc/generators&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;yieldは次の点で優れているという主張をしている。&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;/ul&gt;
&lt;p&gt;GeneratorのInterfaceは以下。
Iteratorを継承しているのでforeachでloopを回せる。&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-php" data-lang="php"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;final&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Generator&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;implements&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Iterator&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;rewind&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;bool&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;valid&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;mixed&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;current&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;mixed&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;key&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;next&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;mixed&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;send&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;mixed&lt;/span&gt; $value);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;mixed&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;throw&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;Exception&lt;/span&gt; $exception);
&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;他言語の実装は以下。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Python
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://wiki.python.org/moin/Generators"&gt;https://wiki.python.org/moin/Generators&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ECMAScript
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Iterators_and_generators#Generators:_a_better_way_to_build_Iterators"&gt;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Iterators_and_generators#Generators:_a_better_way_to_build_Iterators&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;C#
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://csharpindepth.com/Articles/IteratorBlockImplementation"&gt;https://csharpindepth.com/Articles/IteratorBlockImplementation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="サンプルコード"&gt;サンプルコード&lt;/h3&gt;
&lt;h4 id="最小サンプル"&gt;最小サンプル&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-php" data-lang="php"&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;gen&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;yield&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 style="color:#66d9ef"&gt;yield&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;yield&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;3&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;$g &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;gen&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;echo&lt;/span&gt; $g&lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;current&lt;/span&gt;(); &lt;span style="color:#75715e"&gt;// 1
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt;$g&lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;next&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;echo&lt;/span&gt; $g&lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;current&lt;/span&gt;(); &lt;span style="color:#75715e"&gt;// 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;&lt;/span&gt;$g&lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;next&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;echo&lt;/span&gt; $g&lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;current&lt;/span&gt;(); &lt;span style="color:#75715e"&gt;// 3
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt;$g&lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;next&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="foreach"&gt;foreach&lt;/h4&gt;
&lt;p&gt;Iteratorなのでforeachで回せる。&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-php" data-lang="php"&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;keyedGen&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;yield&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;first&amp;#39;&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;A&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;yield&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;second&amp;#39;&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;B&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;yield&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;third&amp;#39;&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;C&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;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;foreach&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;keyedGen&lt;/span&gt;() &lt;span style="color:#66d9ef"&gt;as&lt;/span&gt; $key &lt;span style="color:#f92672"&gt;=&amp;gt;&lt;/span&gt; $val) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;echo&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;$key&lt;/span&gt;&lt;span style="color:#e6db74"&gt; =&amp;gt; &lt;/span&gt;&lt;span style="color:#e6db74"&gt;$val\n&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;; &lt;span style="color:#75715e"&gt;// first =&amp;gt; A / second =&amp;gt; B / third =&amp;gt; C
&lt;/span&gt;&lt;/span&gt;&lt;/span&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="yield-from"&gt;yield from&lt;/h4&gt;
&lt;p&gt;yieldの合成可能。&lt;/p&gt;</description></item><item><title>node2nixの使い方</title><link>https://www.takeokunn.org/posts/fleeting/20250622133346-how_to_use_node2nix/</link><pubDate>Sun, 22 Jun 2025 00:00:00 +0000</pubDate><guid>https://www.takeokunn.org/posts/fleeting/20250622133346-how_to_use_node2nix/</guid><description>&lt;h2 id="背景-動機"&gt;背景・動機&lt;/h2&gt;
&lt;p&gt;最近のAIツールの隆盛でnpm packageを使う機会が増えてきた。
MCP実行するpackageの管理や、claude codeのようなpackageの管理をNixなどが具体例として挙げられる。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.takeokunn.org/posts/fleeting/20250327190937-usage_github_copilot_language_server/"&gt;@github/copilot-language-serverをNixで扱う時のメモ&lt;/a&gt; や &lt;a href="https://www.takeokunn.org/posts/fleeting/20250409210655-introduction_mcp_servers_nix/"&gt;mcp-servers-nixを導入した&lt;/a&gt; でも &lt;code&gt;node2nix&lt;/code&gt; を使っていることを書いていたので、 &lt;code&gt;node2nix&lt;/code&gt; の使い方について後学の為に纏めておく。&lt;/p&gt;
&lt;h2 id="試したこと-やったこと"&gt;試したこと・やったこと&lt;/h2&gt;
&lt;h3 id="1-dot-node2nix周辺調査"&gt;1. node2nix周辺調査&lt;/h3&gt;
&lt;p&gt;公式レポジトリは以下で、「Generate Nix expressions to build NPM packages」というdescriptionがあるとおり、npm packageをnix packageとして扱えるようにしてくれるもの。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/svanderburg/node2nix"&gt;https://github.com/svanderburg/node2nix&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;日本語解説記事は以下。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://zenn.dev/pandaman64/articles/zenn-built-with-nix"&gt;NixでZenn CLIをビルドする - Zenn&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://scrapbox.io/mrsekut-p/node2nix"&gt;node2nix - mrsekut-p scrapbox&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="2-dot-node2nixセットアップ"&gt;2. node2nixセットアップ&lt;/h3&gt;
&lt;p&gt;自分のnixos-configurationに &lt;code&gt;node2nix/&lt;/code&gt; というディレクトリを掘った。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/takeokunn/nixos-configuration/tree/main/node2nix"&gt;https://github.com/takeokunn/nixos-configuration/tree/main/node2nix&lt;/a&gt;&lt;/p&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-console" data-lang="console"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ nix-shell -p nodePackages.node2nix
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ echo &lt;span style="color:#e6db74"&gt;&amp;#39;[&amp;#34;@github/copilot-language-server&amp;#34;, &amp;#34;@anthropic-ai/claude-code&amp;#34;, &amp;#34;sitemcp&amp;#34;]&amp;#39;&lt;/span&gt; &amp;gt;&amp;gt; node-packages.json
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ node2nix -i node-packages.json
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="3-dot-home-managerに組込み"&gt;3. home-managerに組込み&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;node2nix&lt;/code&gt; のディレクトリをimportして &lt;code&gt;home.packages&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-nix" data-lang="nix"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;let&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; pkgs &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#f92672"&gt;import&lt;/span&gt; nixpkgs {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;inherit&lt;/span&gt; system;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; config&lt;span style="color:#f92672"&gt;.&lt;/span&gt;allowUnfree &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; overlays &lt;span style="color:#f92672"&gt;=&lt;/span&gt; basicOverlay &lt;span style="color:#f92672"&gt;++&lt;/span&gt; advancedOverlay;
&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; nodePkgs &lt;span style="color:#f92672"&gt;=&lt;/span&gt; pkgs&lt;span style="color:#f92672"&gt;.&lt;/span&gt;callPackage &lt;span style="color:#e6db74"&gt;../node2nix&lt;/span&gt; { &lt;span style="color:#66d9ef"&gt;inherit&lt;/span&gt; pkgs; };
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;in&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;n{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; home&lt;span style="color:#f92672"&gt;.&lt;/span&gt;packages &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; nodePkgs&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;@anthropic-ai/claude-code&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="4-dot-github-actionsで定期的に更新"&gt;4. GitHub Actionsで定期的に更新&lt;/h3&gt;
&lt;p&gt;一部抜粋すると以下。毎日packageの更新するようにしている。&lt;/p&gt;</description></item><item><title>Typstで履歴書と職務経歴書をBuildする</title><link>https://www.takeokunn.org/posts/fleeting/20250619103829-build_cv_resume_with_typst/</link><pubDate>Thu, 19 Jun 2025 00:00:00 +0000</pubDate><guid>https://www.takeokunn.org/posts/fleeting/20250619103829-build_cv_resume_with_typst/</guid><description>&lt;h2 id="背景-動機"&gt;背景・動機&lt;/h2&gt;
&lt;p&gt;直近履歴書と職務経歴書を書く必要があった。&lt;/p&gt;
&lt;p&gt;以前はGoogle Docsやpagesを使って適当に書いていたのだが、これからのAI時代はコードベースで管理できた方がよいだろうということで移行を決意した。
最近Typst推しなのでTypstからPDFをNix Buildで生成できるようにしてみた。&lt;/p&gt;
&lt;h2 id="試したこと-やったこと"&gt;試したこと・やったこと&lt;/h2&gt;
&lt;h3 id="0-dot-アプローチのやり方を考える"&gt;0. アプローチのやり方を考える&lt;/h3&gt;
&lt;p&gt;世間一般的には履歴書や職務経歴書の絶対的な規格というものはなく、業界や各事業者によってさまざまな運用がされているらしい。
履歴書にはJIS規格があるが、必ずしも準拠する必要はないらしい。&lt;/p&gt;
&lt;p&gt;必要な情報というのはある程度決まっており、それに倣っておくと汎用性の高い履歴書と職務経歴書になるということで世の中転がってるものをひととおり確認した。&lt;/p&gt;
&lt;p&gt;今回は次のようにコンテンツとテンプレートを分けて、より管理をしやすいように設計した。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;YAML: コンテンツをKey/Valueで表現する&lt;/li&gt;
&lt;li&gt;Typst: YAMLを読み込んでテンプレートからPDFを作成する&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="1-dot-レポジトリ作成"&gt;1. レポジトリ作成&lt;/h3&gt;
&lt;p&gt;現状GitHubのレポジトリや設定をTerraform上で管理しているので、Terraform経由でPrivateレポジトリを作成した。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.takeokunn.org/posts/fleeting/20250402001222-setup_private_terraform_github_provider/"&gt;Terraform GitHub Providerを導入した&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.takeokunn.org/posts/fleeting/20250507230034-use_private_terraform_cloud/"&gt;private-terraformをHCP Terraformに移行した&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;また、他の人が使えるようにOSS版も作った。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/takeokunn/typst-resume-template"&gt;https://github.com/takeokunn/typst-resume-template&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="2-dot-nix-build周り整備"&gt;2. Nix Build周り整備&lt;/h3&gt;
&lt;p&gt;fontは日本語を正しく描画してくれるHackgenを選んだ。
fontもNix経由でインストールできるの非常に体験がよい。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/takeokunn/typst-resume-template/blob/main/cv/flake.nix"&gt;https://github.com/takeokunn/typst-resume-template/blob/main/cv/flake.nix&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;flake.nix:&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-nix" data-lang="nix"&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; inputs &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; nixpkgs&lt;span style="color:#f92672"&gt;.&lt;/span&gt;url &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;github:NixOS/nixpkgs&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; flake-utils&lt;span style="color:#f92672"&gt;.&lt;/span&gt;url &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;github:numtide/flake-utils&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; outputs &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&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self&lt;span style="color:#f92672"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; nixpkgs&lt;span style="color:#f92672"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; flake-utils
&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; flake-utils&lt;span style="color:#f92672"&gt;.&lt;/span&gt;lib&lt;span style="color:#f92672"&gt;.&lt;/span&gt;eachDefaultSystem (
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; system:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;let&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; pkgs &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#f92672"&gt;import&lt;/span&gt; nixpkgs { &lt;span style="color:#66d9ef"&gt;inherit&lt;/span&gt; system; };
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;in&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; devShells&lt;span style="color:#f92672"&gt;.&lt;/span&gt;default &lt;span style="color:#f92672"&gt;=&lt;/span&gt; pkgs&lt;span style="color:#f92672"&gt;.&lt;/span&gt;mkShell {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; packages &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;with&lt;/span&gt; pkgs; [ typst ];
&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; packages&lt;span style="color:#f92672"&gt;.&lt;/span&gt;default &lt;span style="color:#f92672"&gt;=&lt;/span&gt; pkgs&lt;span style="color:#f92672"&gt;.&lt;/span&gt;stdenv&lt;span style="color:#f92672"&gt;.&lt;/span&gt;mkDerivation {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; name &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;private-career-cv&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; src &lt;span style="color:#f92672"&gt;=&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; nativeBuildInputs &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;with&lt;/span&gt; pkgs; [ typst hackgen-font ];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; buildPhase &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; typst compile main.typ --font-path &lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;pkgs&lt;span style="color:#f92672"&gt;.&lt;/span&gt;hackgen-font&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;/share/fonts/hackgen-nf
&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;&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; installPhase &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; mkdir -p $out
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; cp main.pdf $out/cv.pdf
&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;&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; }
&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="3-dot-履歴書テンプレート作成"&gt;3. 履歴書テンプレート作成&lt;/h3&gt;
&lt;p&gt;次の記事を参考に履歴書を書くTypstを作った。&lt;/p&gt;</description></item><item><title>React Router v7周辺キャッチアップメモ</title><link>https://www.takeokunn.org/posts/fleeting/20250616132230-catch_up_react_router_v7/</link><pubDate>Mon, 16 Jun 2025 00:00:00 +0000</pubDate><guid>https://www.takeokunn.org/posts/fleeting/20250616132230-catch_up_react_router_v7/</guid><description>&lt;h2 id="背景-動機"&gt;背景・動機&lt;/h2&gt;
&lt;p&gt;普段からWebフロントエンドは書いているものの、2025年6月現在の最新のフロントエンド事情は追えていなかった。
最後にWebフロントエンドを追っていたのが2021年頃だったので3〜4年のビハインドがあった。
2021年頃はNext.jsが最盛期でNext.js一択だった。&lt;/p&gt;
&lt;p&gt;仕事の都合で最新のWebフロントエンド事情をキャッチアップする必要に迫られた。
新規プロジェクトに生かせる為にどのPackageを使うのがよいのか、トレンドはどう変化したのか、過去使っていたpackageはどうなったのか、新しい概念はあるのか等を調べたのでメモしておく。&lt;/p&gt;
&lt;p&gt;また、将来的にAIに書かせること前提にドキュメントの整備方法についても検討する。&lt;/p&gt;
&lt;h2 id="試したこと-やったこと"&gt;試したこと・やったこと&lt;/h2&gt;
&lt;p&gt;作業レポジトリは以下。
練習がてら可能な限りAI（Aider + Gemini 2.5 Pro）に書かせたのでコミット数が多い。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/takeokunn/react-router-sandbox"&gt;https://github.com/takeokunn/react-router-sandbox&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="0-dot-キャッチアップ方針決め"&gt;0. キャッチアップ方針決め&lt;/h3&gt;
&lt;p&gt;キャッチアップをする方法で一番よいのは詳しい人に聞くことなので &lt;a href="https://x.com/ryoppippi"&gt;@ryoppippi&lt;/a&gt; と &lt;a href="https://x.com/tomoyaton"&gt;@tomoyaton&lt;/a&gt; にそれぞれ2〜3時間くらい質問攻めにした。&lt;/p&gt;
&lt;p&gt;その結果次のことが分かった。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Bundleツール
&lt;ul&gt;
&lt;li&gt;Webpackは遅いしモダンではない
&lt;ul&gt;
&lt;li&gt;TurbopackやRspackなどWebpack互換のRust製ツールが隆盛&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;今使うならVite
&lt;ul&gt;
&lt;li&gt;esbuildとrollupとのよい所取り&lt;/li&gt;
&lt;li&gt;rollup互換のRust製ツールであるrolldownが隆盛（experimental）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Component Library
&lt;ul&gt;
&lt;li&gt;結局Reactが選択され続けている&lt;/li&gt;
&lt;li&gt;Vue周りの話は減った&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Framework
&lt;ul&gt;
&lt;li&gt;Next.jsはモダンではない認識
&lt;ul&gt;
&lt;li&gt;Webpack依存を剥せなくてBuildが重い&lt;/li&gt;
&lt;li&gt;SSGは廃れた&lt;/li&gt;
&lt;li&gt;CJS依存&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;2025年6月はReactを使うならReact Router v7を使うのが無難
&lt;ul&gt;
&lt;li&gt;Remixと合流し、「モダンReactのデファクトルーティング」へ変化中
&lt;ul&gt;
&lt;li&gt;ref. &lt;a href="https://remix.run/blog/react-router-v7"&gt;https://remix.run/blog/react-router-v7&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;SSR + Partial Rendering
&lt;ul&gt;
&lt;li&gt;Partial Renderingはこの記事が分かりやすい
&lt;ul&gt;
&lt;li&gt;ref. &lt;a href="https://nextjs.org/docs/app/getting-started/partial-prerendering"&gt;https://nextjs.org/docs/app/getting-started/partial-prerendering&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;オススメのディレクトリ構造などを教えてもらった&lt;/li&gt;
&lt;li&gt;&lt;code&gt;react-router typegen&lt;/code&gt; で型情報を出力できるようになって一気にType Safeになったらしい&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;UI Library
&lt;ul&gt;
&lt;li&gt;Mantineが使い勝手がよい&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Request Library
&lt;ul&gt;
&lt;li&gt;swrあたりを使っておくのが無難&lt;/li&gt;
&lt;li&gt;最近はtanstack queryの方が人気らしい&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Logging Library
&lt;ul&gt;
&lt;li&gt;pinoが使い勝手良かったらしい&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Testing Library
&lt;ul&gt;
&lt;li&gt;Lint/Formatter
&lt;ul&gt;
&lt;li&gt;依然としてESLint/PrettierがあるけどBiomeが強い&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Unit TestはVitestを使うとよい
&lt;ul&gt;
&lt;li&gt;Jest互換でTypeScript Native&lt;/li&gt;
&lt;li&gt;ESMベース&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;残りのE2Eやらは都度考える
&lt;ul&gt;
&lt;li&gt;場合によってstorybookやらPlaywrightやらを使うとよい&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;CI/CD
&lt;ul&gt;
&lt;li&gt;GitHub Actionsで回しちゃうのが楽でよい&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Package Manager
&lt;ul&gt;
&lt;li&gt;npm/yarn/pnpmがあるが、基本的には好きなものを使えばよい&lt;/li&gt;
&lt;li&gt;OSSはpnpmを使ってるプロジェクトが多い&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Form/Validation Library
&lt;ul&gt;
&lt;li&gt;conformが使い勝手良くてよいらしい&lt;/li&gt;
&lt;li&gt;zod/valibotあたりを使うのば無難らしい&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Hosting
&lt;ul&gt;
&lt;li&gt;SSRするのでWebサーバを用意する必要がある&lt;/li&gt;
&lt;li&gt;Cloudflare workerやらAWS ECSやら選択肢が色々ある&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Runtime
&lt;ul&gt;
&lt;li&gt;Node/Deno/Bunがある&lt;/li&gt;
&lt;li&gt;Node/DenoはV8、BunはJavaScript Coreを積んでいる&lt;/li&gt;
&lt;li&gt;何も考えたくなければNodeだけど、Bunの方が速度出るかも?&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="1-dot-技術選定"&gt;1. 技術選定&lt;/h3&gt;
&lt;p&gt;今回の練習用レポジトリで実際に試してみる技術は以下。&lt;/p&gt;</description></item><item><title>home-managerで自作moduleを作る</title><link>https://www.takeokunn.org/posts/fleeting/20250613195154-home_manager_custom_module/</link><pubDate>Sat, 14 Jun 2025 00:00:00 +0000</pubDate><guid>https://www.takeokunn.org/posts/fleeting/20250613195154-home_manager_custom_module/</guid><description>&lt;h2 id="背景-動機"&gt;背景・動機&lt;/h2&gt;
&lt;p&gt;home-managerには沢山のmoduleが提供されている。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/nix-community/home-manager/tree/master/modules"&gt;https://github.com/nix-community/home-manager/tree/master/modules&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;home-manager moduleは自分でも作成可能なので後学のためにメモしておく。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/takeokunn/nixos-configuration/tree/e2cf7d9df556a56e242b3f44b0957884cd6191dd/home-manager/modules"&gt;https://github.com/takeokunn/nixos-configuration/tree/e2cf7d9df556a56e242b3f44b0957884cd6191dd/home-manager/modules&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="試したこと-やったこと"&gt;試したこと・やったこと&lt;/h2&gt;
&lt;h3 id="0-dot-なぜやるのかの整理"&gt;0. なぜやるのかの整理&lt;/h3&gt;
&lt;p&gt;大きく分けて3パターンが考えられる。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;home-managerで自作moduleを作る&lt;/li&gt;
&lt;li&gt;ファイルを作成してhome-managerでsymbolic linkを貼る&lt;/li&gt;
&lt;li&gt;Nix管理外でメンテする&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;1とそれ以外で次のようなメリット/デメリットが考えられる。
可能な限りNix（Nix式）に寄せたいと考えているので今回採用することにした。&lt;/p&gt;
&lt;h4 id="pros"&gt;Pros&lt;/h4&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;観点&lt;/th&gt;
&lt;th&gt;内容&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;フォーマット抽象化&lt;/td&gt;
&lt;td&gt;多様なフォーマットを意識せずに Nix 式で統一管理できる&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IDE支援&lt;/td&gt;
&lt;td&gt;Nix LSP の補完・型チェックの恩恵を受けられる&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;統一性&lt;/td&gt;
&lt;td&gt;`nixpkgs` の差し替えなど、構成記述の一貫性・統一性が上がる&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;再利用性&lt;/td&gt;
&lt;td&gt;モジュールとして切り出すことで複数環境で再利用しやすくなる&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ライフサイクル&lt;/td&gt;
&lt;td&gt;rebuild switchのライフサイクルで反映できる&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;変数埋込&lt;/td&gt;
&lt;td&gt;Nixから変数を代入できる&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 id="cons"&gt;Cons&lt;/h4&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;観点&lt;/th&gt;
&lt;th&gt;内容&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;表現力の制限&lt;/td&gt;
&lt;td&gt;tmux.confのようなフォーマットは文字列での管理が必要&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LSPの範囲&lt;/td&gt;
&lt;td&gt;LSP は Nix に対してしか効かず、生成対象の構文チェックは別途必要&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;保守性&lt;/td&gt;
&lt;td&gt;作り込むと構造が複雑化し、メンテナンスコストが上がる可能性がある&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;依存性&lt;/td&gt;
&lt;td&gt;home-manager に構成が強く依存し、他ツールへの移行が難しくなることも&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;デバッグ性&lt;/td&gt;
&lt;td&gt;モジュール解決や展開の追跡が難しく、デバッグの難易度が多少上がる&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="1-dot-自作home-manager-moduleを作成する"&gt;1. 自作home-manager moduleを作成する&lt;/h3&gt;
&lt;p&gt;home-mnaagerのobjectでimportするだけで使える。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/takeokunn/nixos-configuration/blob/e2cf7d9df556a56e242b3f44b0957884cd6191dd/home-manager/advanced.nix#L71"&gt;https://github.com/takeokunn/nixos-configuration/blob/e2cf7d9df556a56e242b3f44b0957884cd6191dd/home-manager/advanced.nix#L71&lt;/a&gt;&lt;/p&gt;
&lt;h4 id="1-dot-1-dot-tigの場合"&gt;1.1. tigの場合&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;~/.tigrc&lt;/code&gt; に文字列をそのまま出力する運用にしている。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/takeokunn/nixos-configuration/blob/e2cf7d9df556a56e242b3f44b0957884cd6191dd/home-manager/modules/tig/default.nix"&gt;home-manager/modules/tig/default.nix&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-nix" data-lang="nix"&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; pkgs&lt;span style="color:#f92672"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; lib&lt;span style="color:#f92672"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; config&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&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;let&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; cfg &lt;span style="color:#f92672"&gt;=&lt;/span&gt; config&lt;span style="color:#f92672"&gt;.&lt;/span&gt;programs&lt;span style="color:#f92672"&gt;.&lt;/span&gt;tig;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;in&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;with&lt;/span&gt; lib;
&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; options&lt;span style="color:#f92672"&gt;.&lt;/span&gt;programs&lt;span style="color:#f92672"&gt;.&lt;/span&gt;tig &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; enable &lt;span style="color:#f92672"&gt;=&lt;/span&gt; mkEnableOption &lt;span style="color:#e6db74"&gt;&amp;#34;Text-mode interface for git&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; package &lt;span style="color:#f92672"&gt;=&lt;/span&gt; mkPackageOption pkgs &lt;span style="color:#e6db74"&gt;&amp;#34;tig&amp;#34;&lt;/span&gt; { };
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; config &lt;span style="color:#f92672"&gt;=&lt;/span&gt; mkOption {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; type &lt;span style="color:#f92672"&gt;=&lt;/span&gt; types&lt;span style="color:#f92672"&gt;.&lt;/span&gt;lines;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; default &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&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; config &lt;span style="color:#f92672"&gt;=&lt;/span&gt; mkIf cfg&lt;span style="color:#f92672"&gt;.&lt;/span&gt;enable {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; home&lt;span style="color:#f92672"&gt;.&lt;/span&gt;packages &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [ cfg&lt;span style="color:#f92672"&gt;.&lt;/span&gt;package ];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; home&lt;span style="color:#f92672"&gt;.&lt;/span&gt;file&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;.tigrc&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;text &lt;span style="color:#f92672"&gt;=&lt;/span&gt; cfg&lt;span style="color:#f92672"&gt;.&lt;/span&gt;config;
&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="1-dot-2-dot-lnavの場合"&gt;1.2. lnavの場合&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;~/.config/lnav/config.json&lt;/code&gt; にNix式をJsonに変換して出力するようにしている。&lt;/p&gt;</description></item><item><title>AIを駆使してTypstスライドを生成する</title><link>https://www.takeokunn.org/posts/fleeting/20250610215948-ai_powered_typst_slide_generation/</link><pubDate>Tue, 10 Jun 2025 00:00:00 +0000</pubDate><guid>https://www.takeokunn.org/posts/fleeting/20250610215948-ai_powered_typst_slide_generation/</guid><description>&lt;h2 id="背景-動機"&gt;背景・動機&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://www.takeokunn.org/posts/fleeting/20250608145128-presenting_with_typst_pdfpc/"&gt;Typstとpdfpcでプレゼン機能を実現する&lt;/a&gt; のNext Actionに次のようなことを書いた。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;登壇の場数を踏んでより洗練させていきたい。
登壇周りのすべてがプレーンテキスト（Org）で管理できるようになったので、次はAIによるスライド生成にチャレンジしたい。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;実際に練習がてら登壇してみたかったので、&lt;a href="https://phpstudy.connpass.com/event/357699/"&gt;第177回 PHP勉強会＠東京&lt;/a&gt; で「Typstで登壇できるようになったので練習させてくれ」というテーマでLTをすることにした。&lt;/p&gt;
&lt;p&gt;そこで今回は実際にAIにスライドの目次案からTypstを生成させてホスティングする所までやってみた。&lt;/p&gt;
&lt;h2 id="試したこと-やったこと"&gt;試したこと・やったこと&lt;/h2&gt;
&lt;h3 id="1-dot-aiでプロンプトを作る"&gt;1. AIでプロンプトを作る&lt;/h3&gt;
&lt;h4 id="プロンプト"&gt;プロンプト&lt;/h4&gt;
&lt;p&gt;関連するブログをリストアップしてMarkdownで目次を生成させてみた。&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-markdown" data-lang="markdown"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;「typstで登壇できるようになったので練習させてくれ」というタイトルでLTしようと考えています。
&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;以下の記事を読んで起承転結でMarkdownで纏めてください。
&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;-&lt;/span&gt; Typstとpdfpcでプレゼン機能を実現する
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;-&lt;/span&gt; https://www.takeokunn.org/posts/fleeting/20250608145128-presenting_with_typst_pdfpc/
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;-&lt;/span&gt; Typst自作テーマで登壇スライドを作成した
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;-&lt;/span&gt; https://www.takeokunn.org/posts/fleeting/20250601214129-create_slide_by_typst_self_theme/
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;-&lt;/span&gt; Typstテーマを自作した
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;-&lt;/span&gt; https://www.takeokunn.org/posts/fleeting/20250506220914-create_typst_slide_theme/
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;-&lt;/span&gt; NixでTypstをBuildしGitHub Pagesでホスティングする
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;-&lt;/span&gt; https://www.takeokunn.org/posts/fleeting/20250126114218-build_and_deploy_typst_using_nix/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="アウトライン例"&gt;アウトライン例&lt;/h4&gt;
&lt;p&gt;以下は対話しながらGeminiから生成させたものを改変した。&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-markdown" data-lang="markdown"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;# Typstで登壇できるようになったので練習させてくれ
&lt;/span&gt;&lt;/span&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;&lt;span style="color:#75715e"&gt;### きっかけと違和感
&lt;/span&gt;&lt;/span&gt;&lt;/span&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;&lt;span style="color:#66d9ef"&gt;-&lt;/span&gt; かつてはGoogle Slidesは最高の相棒だった
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&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;-&lt;/span&gt; 過去に作ったスライド資産がある
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&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;-&lt;/span&gt; スライド作成の流れ
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;-&lt;/span&gt; Emacsでアウトラインを書く
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&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;-&lt;/span&gt; アウトラインに沿ってスライドを作る
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&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;-&lt;/span&gt; 心に刺さった&amp;#34;小さなトゲ
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&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;-&lt;/span&gt; AIによる自動生成できない
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;-&lt;/span&gt; Emacsから編集できない
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;-&lt;/span&gt; etc...
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;-&lt;/span&gt; 違和感の正体 = エンジニアとしての&amp;#34;業&amp;#34;（カルマ）
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&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;-&lt;/span&gt; 再利用性が低い (No DRY!)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&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;-&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:#75715e"&gt;### Typstとの出会いと感動
&lt;/span&gt;&lt;/span&gt;&lt;/span&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;&lt;span style="color:#66d9ef"&gt;-&lt;/span&gt; そんな僕が出会ったのが&amp;#34;Typst&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&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;-&lt;/span&gt; 探し求めていた理想がそこにあった
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;-&lt;/span&gt; 最初の感動ポイント（＝&amp;#34;トゲ&amp;#34;が抜けていく快感）
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;-&lt;/span&gt; コードでスライドが書ける → Emacsから離れなくていい！
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&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;-&lt;/span&gt; Gitで管理できる → 変更履歴はすべてお見通し！
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;-&lt;/span&gt; テーマが自作できる → DRY原則、スライドにも！
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&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;-&lt;/span&gt; Typstスライドを支える技術（しくみ）
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;-&lt;/span&gt; Polylux：Typstのためのスライドエンジン
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;-&lt;/span&gt; codelst：コードを美しく見せるスタイリスト
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;-&lt;/span&gt; Nix：すべてを固める魔法の環境
&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:#75715e"&gt;### 実用に耐えるまでの道のり
&lt;/span&gt;&lt;/span&gt;&lt;/span&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;&lt;span style="color:#66d9ef"&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;-&lt;/span&gt; 理想の環境はすぐそこに見えたが、やってみると色々な壁にぶつかる
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&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;-&lt;/span&gt; やってみて困ったこと（理想と現実のギャップ）
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&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;-&lt;/span&gt; polyluxやcodelstのドキュメントとひたすらにらめっこ
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;-&lt;/span&gt; 絵文字： Macでは出るのにCI（Linux）でビルドすると豆腐（□）になる！
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&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;-&lt;/span&gt; 画像の配置： ドラッグ＆ドロップの偉大さを思い知る
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;-&lt;/span&gt; それでも続けた理由（Typstの魅力に立ち返る）
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&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;-&lt;/span&gt; スライド構成が自分の思考にフィットした
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&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;-&lt;/span&gt; 補助ツールとの統合（そして&amp;#34;最強&amp;#34;の環境へ）
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;-&lt;/span&gt; Typst単体ではなく、エコシステム全体で課題を解決していく
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;-&lt;/span&gt; pdfpc：ついに「登壇」できるようになった瞬間
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;-&lt;/span&gt; GitHub Actions：完全なる自動化の世界へ
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;-&lt;/span&gt; Hugo：発表資料を&amp;#34;資産&amp;#34;にする
&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:#75715e"&gt;### Typst登壇はこう変えた
&lt;/span&gt;&lt;/span&gt;&lt;/span&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;&lt;span style="color:#66d9ef"&gt;-&lt;/span&gt; Typstを手に入れた結果、登壇準備のすべてが変わった
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;-&lt;/span&gt; Before/Afterで振り返る、スライド制作プロセスの変化
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&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;-&lt;/span&gt; 登壇準備がこう変わった！
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&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;-&lt;/span&gt; Before：まずGoogle Slidesを開き、どのテーマにしようか悩む…
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;-&lt;/span&gt; After：まずEmacsでアウトライン（構造）を書くことに集中できる
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&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;-&lt;/span&gt; Before：テキストボックスの位置、フォントサイズ…ピクセル単位の調整地獄
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;-&lt;/span&gt; After：自作テーマを適用すればOK。「見た目は後からついてくる」安心感
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&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;-&lt;/span&gt; Before：過去スライドからコピペ。コピペミスやうっかり編集しちゃったなどヒューマンエラーが頻発。
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;-&lt;/span&gt; After：過去の資産はGitリポジトリに。Nixのおかげで誰でも同じPDFを生成
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;-&lt;/span&gt; Typstで登壇する未来
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&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;-&lt;/span&gt; 発表のたびにテーマを少しずつ改善していく。自分だけの&amp;#34;刀&amp;#34;を研ぐ感覚
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&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;-&lt;/span&gt; Slide as Codeの世界へようこそ
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&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;-&lt;/span&gt; Google Slidesへの違和感から始まり、困難を乗り越え、最強の環境を手に入れました
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&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;-&lt;/span&gt; 発表資料も&amp;#34;成果物&amp;#34;にしたい、すべてのエンジニアへ
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;-&lt;/span&gt; その場限りの資料ではなく、再利用可能な“資産”を作りたい人は、ぜひTypstへ！
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="2-dot-gemini-2-dot-5-proに実装させる"&gt;2. Gemini 2.5 Proに実装させる&lt;/h3&gt;
&lt;p&gt;作業指示を書いて8割くらいのクオリティでAIに実装させる。&lt;/p&gt;</description></item><item><title>EventBridge Ruleデバッグ方法メモ</title><link>https://www.takeokunn.org/posts/fleeting/20250608160858-how_to_debug_eventbridge_rule/</link><pubDate>Sun, 08 Jun 2025 00:00:00 +0000</pubDate><guid>https://www.takeokunn.org/posts/fleeting/20250608160858-how_to_debug_eventbridge_rule/</guid><description>&lt;h2 id="背景-動機"&gt;背景・動機&lt;/h2&gt;
&lt;p&gt;業務をしていると、「EventBridgeでメタ情報を付与してSQSに流す」といった要件に出くわす機会がある。&lt;/p&gt;
&lt;p&gt;e.g. &lt;a href="https://docs.google.com/presentation/d/1_vOdQO0SY671SRQpnpEz1xvVyUy-Vzl_Dk4Ph6ujy84/edit?slide=id.p#slide=id.p"&gt;AWS SQSとLaravelで大規模トラフィックを捌く - phpcon新潟&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Event Busが一次受けをして複数のEventBridge Ruleでマッチしたものに情報を付与して次に流す、といった挙動になっている。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/ja_jp/eventbridge/latest/userguide/eb-what-is.html"&gt;EventBridge - AWS公式ドキュメント&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/ja_jp/eventbridge/latest/userguide/eb-rules.html"&gt;Amazon EventBridge ルール&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/ja_jp/eventbridge/latest/userguide/eb-event-patterns.html"&gt;Amazon EventBridge イベントパターン&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;EventBridge Ruleのデバッグをするには&lt;a href="https://docs.aws.amazon.com/ja_jp/eventbridge/latest/userguide/eb-create-rule.html"&gt;Amazon EventBridge でイベントに応答するルールの作成&lt;/a&gt; に書いてあるとおりにやればいいのだが、AWSのドキュメントは初学者から見たら分かりにくく混乱した。
今回は後学の為に画像付きでメモしておく。&lt;/p&gt;
&lt;h2 id="試したこと-やったこと"&gt;試したこと・やったこと&lt;/h2&gt;
&lt;h3 id="1-dot-aws-consoleから対象のeventbridge-rulesを開く"&gt;1. AWS consoleから対象のEventBridge Rulesを開く&lt;/h3&gt;
&lt;p&gt;対象のEventBusを選択して &lt;code&gt;Create Rule&lt;/code&gt; を押す。&lt;/p&gt;
&lt;figure&gt;&lt;img src="https://www.takeokunn.org/images/448BDAE9-E4D3-45BF-84EA-8C954508FED8.png"&gt;
&lt;/figure&gt;
&lt;h3 id="2-dot-build-event-pattern-を開く"&gt;2. 「Build event pattern」を開く&lt;/h3&gt;
&lt;p&gt;Define rule detailのnameは適当に入れる。&lt;/p&gt;
&lt;h3 id="3-dot-sample-eventでjsonを入れる"&gt;3. Sample eventでJsonを入れる&lt;/h3&gt;
&lt;p&gt;「Enter my own」を選択して「Misc &amp;gt; Webhook Sample」にあるようなテスト用のJsonを入れる。&lt;/p&gt;
&lt;figure&gt;&lt;img src="https://www.takeokunn.org/images/8CDED877-B8C3-4432-BA86-F867C5914C31.png"&gt;
&lt;/figure&gt;
&lt;p&gt;以下はShopifyの &lt;code&gt;inventory_items/create&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-json" data-lang="json"&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;&amp;#34;version&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;0&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;&amp;#34;id&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;xxx-xxx-xx-xxx&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;&amp;#34;detail-type&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;shopifyWebhook&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;&amp;#34;source&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;aws.partner/shopify.com/000000/test&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;&amp;#34;account&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;000000000000&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;&amp;#34;time&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;2025-03-01T06:29:19Z&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;&amp;#34;region&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;ap-northeast-1&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;&amp;#34;resources&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;&amp;#34;detail&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;&amp;#34;payload&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;&amp;#34;id&amp;#34;&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;100000000000&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;#34;sku&amp;#34;&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 style="color:#f92672"&gt;&amp;#34;created_at&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;2025-03-01T01:29:17-05:00&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;&amp;#34;updated_at&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;2025-03-01T01:29:17-05:00&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;&amp;#34;requires_shipping&amp;#34;&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;true&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;#34;cost&amp;#34;&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;null&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;#34;country_code_of_origin&amp;#34;&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;null&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;#34;province_code_of_origin&amp;#34;&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;null&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;#34;harmonized_system_code&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;111111&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;&amp;#34;tracked&amp;#34;&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;true&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;#34;country_harmonized_system_codes&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;&amp;#34;admin_graphql_api_id&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;gid://shopify/InventoryItem/0000001&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:#f92672"&gt;&amp;#34;metadata&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;&amp;#34;Content-Type&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;application/json&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;&amp;#34;X-Shopify-Topic&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;inventory_items/create&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;&amp;#34;X-Shopify-Shop-Domain&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;test.myshopify.com&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;&amp;#34;X-Shopify-Hmac-SHA256&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;xxxx&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;&amp;#34;X-Shopify-Webhook-Id&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;xxx-xxx-xxx-xxx-xxxx&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;&amp;#34;X-Shopify-API-Version&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;2024-10&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;&amp;#34;X-Shopify-Triggered-At&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;2025-03-01T06:29:17.989779121Z&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&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="4-dot-event-patternを入力してテストをする"&gt;4. Event patternを入力してテストをする&lt;/h3&gt;
&lt;p&gt;検証したいEventBridge Ruleを貼り付けて 「Test pattern」 をすると検証できる。&lt;/p&gt;</description></item><item><title>Typstとpdfpcでプレゼン機能を実現する</title><link>https://www.takeokunn.org/posts/fleeting/20250608145128-presenting_with_typst_pdfpc/</link><pubDate>Sun, 08 Jun 2025 00:00:00 +0000</pubDate><guid>https://www.takeokunn.org/posts/fleeting/20250608145128-presenting_with_typst_pdfpc/</guid><description>&lt;h2 id="背景-動機"&gt;背景・動機&lt;/h2&gt;
&lt;p&gt;Typstでスライドを作るフローがだいぶ固まってきた。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.takeokunn.org/posts/fleeting/20250126114218-build_and_deploy_typst_using_nix/"&gt;NixでTypstをBuildしGitHub Pagesでホスティングする&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.takeokunn.org/posts/fleeting/20250506220914-create_typst_slide_theme/"&gt;Typstテーマを自作した&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.takeokunn.org/posts/fleeting/20250601214129-create_slide_by_typst_self_theme/"&gt;Typst自作テーマで登壇スライドを作成した&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;過去に普段資料はGoogle Slideで作成していたのだが、次の理由でGoogle Slideを使っていた。&lt;/p&gt;
&lt;p&gt;例: &lt;a href="https://docs.google.com/presentation/d/1_vOdQO0SY671SRQpnpEz1xvVyUy-Vzl_Dk4Ph6ujy84/edit?slide=id.p#slide=id.p"&gt;AWS SQSとLaravelで大規模トラフィックを捌く - phpcon新潟&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Google Driveで管理できる&lt;/li&gt;
&lt;li&gt;自己紹介部分など過去のスライドを流用できる&lt;/li&gt;
&lt;li&gt;文字や画像の配置に自由度がある&lt;/li&gt;
&lt;li&gt;プレゼンター表示ができる
&lt;ul&gt;
&lt;li&gt;スピーカーノートを別画面で確認できる&lt;/li&gt;
&lt;li&gt;経過時間の計測ができる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;管理方法やスライドに関するものはTypst力が上がればカバーできるが、プレゼンター表示に関しては何か対策を講じなければ代替できない。&lt;/p&gt;
&lt;p&gt;今回は実際に登壇に耐えうるツールの選定と運用の検討をしたのでメモしておく。&lt;/p&gt;
&lt;h2 id="試したこと-やったこと"&gt;試したこと・やったこと&lt;/h2&gt;
&lt;h3 id="0-dot-ツールの選定"&gt;0. ツールの選定&lt;/h3&gt;
&lt;p&gt;自分がプレゼンテーションモードに求めている機能をリストアップすると以下。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;MUST
&lt;ul&gt;
&lt;li&gt;登壇スライドとは別にスピーカーノートを別画面で確認できる&lt;/li&gt;
&lt;li&gt;経過時間の計測ができる&lt;/li&gt;
&lt;li&gt;Typst内 or Orgファイル内でスピーカーノートを管理できる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;SHOULD
&lt;ul&gt;
&lt;li&gt;次スライドの表示&lt;/li&gt;
&lt;li&gt;全体のスライド表示&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;MAY
&lt;ul&gt;
&lt;li&gt;ホワイトボード／ペンツール機能&lt;/li&gt;
&lt;li&gt;オフラインで機能する&lt;/li&gt;
&lt;li&gt;動画やスライドアニメーションなどの制御&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Typstから生成したPDFをそのままプレゼン資料として表示できるツールは無数にある。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.apple.com/jp/keynote/"&gt;Keynote&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.microsoft.com/ja-jp/microsoft-365/powerpoint"&gt;PowerPoint&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Cimbali/pympress"&gt;Pympress&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;etc..&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="https://www.takeokunn.org/posts/fleeting/20250506220914-create_typst_slide_theme/"&gt;Typstテーマを自作した&lt;/a&gt; にも書いたとおり、Typstのベーステーマに &lt;a href="https://polylux.dev/book/polylux.html"&gt;polylux&lt;/a&gt; を利用している。&lt;/p&gt;
&lt;p&gt;polyluxのドキュメントを読んでいるとpdfpcと繋ぎ込む記述があり、これを用いるとスピーカーノートを実現できることが分かる。
可能な限り公式がサポートしているものを使う方が筋がよい、また要件を十分に満たしていることが確認が取れたので今回は&lt;a href="https://pdfpc.github.io/"&gt;pdfpc&lt;/a&gt;を選択した。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://polylux.dev/book/external/pdfpc.html#pdfpc"&gt;https://polylux.dev/book/external/pdfpc.html#pdfpc&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="1-dot-typstとpdfpcとの繋ぎ込み"&gt;1. Typstとpdfpcとの繋ぎ込み&lt;/h3&gt;
&lt;p&gt;pdfpc integrationは &lt;a href="https://github.com/polylux-typ/polylux"&gt;polylux-typ/polylux&lt;/a&gt; の &lt;a href="https://github.com/polylux-typ/polylux/blob/c58e89c890c397eb300e1a144e6c88b5b2851399/src/toolbox/pdfpc.typ"&gt;src/toolbox/pdfpc.typ&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-typst" data-lang="typst"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;#import&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;@preview/polylux:0.4.0&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&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;#slide&lt;/span&gt;[
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; #toolbox.pdfpc.speaker-note(&amp;#34;This is a note that only the speaker will see.&amp;#34;)
&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;&lt;a href="https://search.nixos.org/packages?channel=25.05&amp;amp;show=polylux2pdfpc&amp;amp;from=0&amp;amp;size=50&amp;amp;sort=relevance&amp;amp;type=packages&amp;amp;query=polylux2pdfpc"&gt;polylux2pdfpc&lt;/a&gt;を使ってpdfpcファイルを生成する。&lt;/p&gt;</description></item><item><title>Typst自作テーマで登壇スライドを作成した</title><link>https://www.takeokunn.org/posts/fleeting/20250601214129-create_slide_by_typst_self_theme/</link><pubDate>Sun, 01 Jun 2025 00:00:00 +0000</pubDate><guid>https://www.takeokunn.org/posts/fleeting/20250601214129-create_slide_by_typst_self_theme/</guid><description>&lt;h2 id="背景-動機"&gt;背景・動機&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://nix-ja.connpass.com/event/353532/"&gt;Nix meetup #3 大阪&lt;/a&gt; で大阪への新幹線の中で登壇スライドを作成した。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.takeokunn.org/pdf/nix-meetup-3-my-nix-usecase.pdf"&gt;https://www.takeokunn.org/pdf/nix-meetup-3-my-nix-usecase.pdf&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;今まではGoogle Slideでスライドを作成していたが、今回は &lt;a href="https://www.takeokunn.org/posts/fleeting/20250506220914-create_typst_slide_theme/"&gt;Typstテーマを自作した&lt;/a&gt; にもあるとおり自作テーマで初の登壇仕様を作成してみた。&lt;/p&gt;
&lt;p&gt;スライドは作ったものの、時間の関係で登壇できなかったので別の機会で流用する。&lt;/p&gt;
&lt;h2 id="試したこと-やったこと"&gt;試したこと・やったこと&lt;/h2&gt;
&lt;h3 id="オープニングスライド-の場合"&gt;「オープニングスライド」の場合&lt;/h3&gt;
&lt;figure&gt;&lt;img src="https://www.takeokunn.org/images/D81466CB-B613-45D1-8A75-4D4FFD3F9DB1.png"&gt;
&lt;/figure&gt;
&lt;h3 id="agenda-の場合"&gt;「Agenda」の場合&lt;/h3&gt;
&lt;figure&gt;&lt;img src="https://www.takeokunn.org/images/56A9F6DF-679D-4299-AD9A-5FA68F7B16E5.png"&gt;
&lt;/figure&gt;
&lt;p&gt;&lt;code&gt;#outline&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-typst" data-lang="typst"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;#slide&lt;/span&gt;[
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; = Agenda
&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; #outline
&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;figure&gt;&lt;img src="https://www.takeokunn.org/images/27AD5F73-C5C0-46FA-BD3B-69DB46F770EA.png"&gt;
&lt;/figure&gt;
&lt;p&gt;&lt;code&gt;#new-section&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-typst" data-lang="typst"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;#new-section&lt;/span&gt;[自己紹介]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;#new-section&lt;/span&gt;[今回話したいこと]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;#new-section&lt;/span&gt;[事例紹介]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;#new-section&lt;/span&gt;[今後やりたいこと]
&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;#place&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-typst" data-lang="typst"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;#slide&lt;/span&gt;[
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;#place&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; top &lt;span style="color:#f92672"&gt;+&lt;/span&gt; right,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;image&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;./images/icon.jpeg&amp;#34;&lt;/span&gt;, width: &lt;span style="color:#ae81ff"&gt;100&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;pt&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&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; - たけてぃ \@takeokunn
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - Nix Meetup 共同主催
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - Nix歴ようやく1年経った
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - 仕事ではPHPコミュニティ所属
&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="ソースコード-の場合"&gt;「ソースコード」の場合&lt;/h3&gt;
&lt;figure&gt;&lt;img src="https://www.takeokunn.org/images/5C591DBD-F3EF-46EA-B922-D9E04D18B4EE.png"&gt;
&lt;/figure&gt;
&lt;p&gt;コードは &lt;code&gt;#sourcecode&lt;/code&gt; でシンタックスハイライトされる。&lt;/p&gt;</description></item><item><title>keyoxideセットアップ</title><link>https://www.takeokunn.org/posts/fleeting/20250528112340-setup_keyoxide/</link><pubDate>Wed, 28 May 2025 00:00:00 +0000</pubDate><guid>https://www.takeokunn.org/posts/fleeting/20250528112340-setup_keyoxide/</guid><description>&lt;h2 id="背景-動機"&gt;背景・動機&lt;/h2&gt;
&lt;p&gt;友人のこまもか君（@Comamoca_）がTwitterでなりすましをされていた。&lt;/p&gt;
&lt;blockquote class="twitter-tweet"&gt;&lt;p lang="ja" dir="ltr"&gt;なりすましを発見したので本物であることを主張しておきますね〜&lt;br&gt;&lt;br&gt;署名済みテキスト:&lt;a href="https://t.co/Q5jcSsJACw"&gt;https://t.co/Q5jcSsJACw&lt;/a&gt;&lt;br&gt;&lt;br&gt;keybase:&lt;br&gt;僕のGitコミットは基本的にkeybase管理下のPGP鍵で署名してるので、なんか怪しい人いたら各自検証してください&lt;br&gt;🙏&lt;a href="https://t.co/ufJ5K1j5ig"&gt;https://t.co/ufJ5K1j5ig&lt;/a&gt;&lt;/p&gt;&amp;mdash; こまもか🦊 (@Comamoca_) &lt;a href="https://twitter.com/Comamoca_/status/1927205397250646518?ref_src=twsrc%5Etfw"&gt;May 27, 2025&lt;/a&gt;&lt;/blockquote&gt; &lt;script async src="https://platform.twitter.com/widgets.js" charset="utf-8"&gt;&lt;/script&gt;
&lt;p&gt;自分はまだされたことがないが、将来的になりすまされた時の為に今のうちに手を打っておこうということで今回対応した。&lt;/p&gt;
&lt;h2 id="試したこと-やったこと"&gt;試したこと・やったこと&lt;/h2&gt;
&lt;h3 id="0-dot-方針を決める"&gt;0. 方針を決める&lt;/h3&gt;
&lt;p&gt;インターネットでなりすましではないことを証明するのは根本的に難しい。&lt;/p&gt;
&lt;p&gt;ChatGPTによると、本人性を証明するためのアプローチは次の3つが上げられる。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A. 他媒体連携型証明（クロスメディア検証）&lt;/li&gt;
&lt;li&gt;B. 動画・写真による自己証明&lt;/li&gt;
&lt;li&gt;C. 本人だけが知る事実・履歴を提示&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;今回の要件としては、自分のことをあまり知らない不特定多数から見て自己をどう証明するのかというものがある。
私の場合Twitter/GitHub/ブログがメインなので、これらを証明する手段が求められている。（A. 他媒体連携型証明）&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.takeokunn.org/posts/fleeting/20250514155803-yubikey_gpg_operation/"&gt;GPG KeyのYubiKey運用をはじめた&lt;/a&gt; にも書いたとおり、可能な限りGPGに寄せたいと考えている。
自分のソーシャルアカウントや公開鍵との関連性を証明するサービスはいくつかあるようだ。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Keybase&lt;/li&gt;
&lt;li&gt;Keyoxide&lt;/li&gt;
&lt;li&gt;Sigstore&lt;/li&gt;
&lt;li&gt;etc..&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;当初keybaseを採用しようとしていたが、自分にとってSNS機能は不要だったり、Zoomが買収してから開発が停滞気味という噂を聞き、Keyoxideを採用することにした。&lt;/p&gt;
&lt;p&gt;また友人のnatsukiumも利用していたので決断の後押しになった。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://keyoxide.org/DCCB2D69E06EEAA48904F8A12D5ADD7530F56A42"&gt;https://keyoxide.org/DCCB2D69E06EEAA48904F8A12D5ADD7530F56A42&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="1-dot-keyoxideに認識させる"&gt;1. Keyoxideに認識させる&lt;/h3&gt;
&lt;p&gt;基本的にはドキュメントを参考に上から順に行えばよい。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://docs.keyoxide.org/getting-started/creating-profile-openpgp/"&gt;https://docs.keyoxide.org/getting-started/creating-profile-openpgp/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.takeokunn.org/posts/fleeting/20250514155803-yubikey_gpg_operation/"&gt;GPG KeyのYubiKey運用をはじめた&lt;/a&gt; ですでにSigned Keyは持っていたのでGPG Key生成手順はスキップできた。&lt;/p&gt;
&lt;p&gt;次のコマンドで &lt;code&gt;public.asc&lt;/code&gt; を生成して管理画面からアップロードする。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://keys.openpgp.org/upload"&gt;https://keys.openpgp.org/upload&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-console" data-lang="console"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ gpg --armor --output public.asc --export &amp;lt;key&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;keyoxide側が勝手にopenpgpを参照してページを作ってくれる。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://keyoxide.org/0B10DAA7BA0236D7382287660F79C0AB03FD7A1C"&gt;https://keyoxide.org/0B10DAA7BA0236D7382287660F79C0AB03FD7A1C&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="2-dot-twitter紐付け作業"&gt;2. Twitter紐付け作業&lt;/h3&gt;
&lt;p&gt;こちらを参考に対応する。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://docs.keyoxide.org/service-providers/twitter/"&gt;https://docs.keyoxide.org/service-providers/twitter/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;openpgp4fpr:&amp;lt;fpr&amp;gt;&lt;/code&gt; を含めたツイートをする。&lt;/p&gt;
&lt;blockquote class="twitter-tweet"&gt;&lt;p lang="in" dir="ltr"&gt;keyoxide用&lt;br&gt;&lt;br&gt;openpgp4fpr:0B10DAA7BA0236D7382287660F79C0AB03FD7A1C&lt;/p&gt;&amp;mdash; たけてぃ𓁈𓈷 (@takeokunn) &lt;a href="https://twitter.com/takeokunn/status/1927387715441414384?ref_src=twsrc%5Etfw"&gt;May 27, 2025&lt;/a&gt;&lt;/blockquote&gt; &lt;script async src="https://platform.twitter.com/widgets.js" charset="utf-8"&gt;&lt;/script&gt;
&lt;p&gt;ツイートのリンクを &lt;code&gt;notation&lt;/code&gt; で付与する。&lt;/p&gt;</description></item><item><title>Excelファイルをtxtファイルに変換してNotebookLMに食わせる</title><link>https://www.takeokunn.org/posts/fleeting/20250523220142-migrate_excel_to_csv_and_import_notebooklm/</link><pubDate>Fri, 23 May 2025 00:00:00 +0000</pubDate><guid>https://www.takeokunn.org/posts/fleeting/20250523220142-migrate_excel_to_csv_and_import_notebooklm/</guid><description>&lt;h2 id="背景-動機"&gt;背景・動機&lt;/h2&gt;
&lt;p&gt;利用規約の関係で明確に言及できないが、某ECプラットフォーム（以下 A社）とのAPI連携を実装していた。&lt;/p&gt;
&lt;p&gt;A社のAPI含む全体的なドキュメントの管理方法は次のようになっている。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;APIの情報がWeb上に公開されていない
&lt;ul&gt;
&lt;li&gt;技術ブログに書いている人がいない&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;管理画面を使うには申請が必要&lt;/li&gt;
&lt;li&gt;管理画面の奥の方にAPIドキュメントがある&lt;/li&gt;
&lt;li&gt;APIドキュメントをzipでダウンロードする方式
&lt;ul&gt;
&lt;li&gt;EndpointごとにExcelファイルが入っている&lt;/li&gt;
&lt;li&gt;セルの結合などを駆使して見易いように書かれている&lt;/li&gt;
&lt;li&gt;Excelのシートが複数枚ある&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;エラーメッセージなどは別のダウンロードリンクに纏まっている&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;開発する上で次のような問題を抱えていた。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;今回の対応で必要なEndpointの取捨選択を効率的にしたい&lt;/li&gt;
&lt;li&gt;ひとつずつExcelファイルを開いて確認するのが面倒&lt;/li&gt;
&lt;li&gt;横断した情報の整合性を確認するのが大変&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;今回のようにExcelファイルが与えられた時にどう対応するべきなのか後学の為にメモしておく。&lt;/p&gt;
&lt;h2 id="試したこと-やったこと"&gt;試したこと・やったこと&lt;/h2&gt;
&lt;h3 id="1-dot-excelファイルをgoogle-driveにアップロードする"&gt;1. ExcelファイルをGoogle Driveにアップロードする&lt;/h3&gt;
&lt;p&gt;ExcelファイルをGoogle DriveにアップロードするとSpreadSheetから閲覧できる。
こうすることで、ExcelファイルにURL Linkからアクセスすることが可能になるのがよい。&lt;/p&gt;
&lt;h3 id="2-dot-excelファイルを文字列に起こす"&gt;2. Excelファイルを文字列に起こす&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;xlsx2csv&lt;/code&gt; を使ってcsvファイルに変換する。&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-console" data-lang="console"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ xlsx2csv -s &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt; tmp.xlsx &amp;gt; tmp.csv
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;-s&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-console" data-lang="console"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;usage: xlsx2csv [-h] [-v] [-a] [-c OUTPUTENCODING] [-d DELIMITER] [--hyperlinks] [-e] [--no-line-breaks] [-E EXCLUDE_SHEET_PATTERN [EXCLUDE_SHEET_PATTERN ...]] [-f DATEFORMAT] [-t TIMEFORMAT]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [--floatformat FLOATFORMAT] [--sci-float] [-I INCLUDE_SHEET_PATTERN [INCLUDE_SHEET_PATTERN ...]] [--exclude_hidden_sheets] [--ignore-formats IGNORE_FORMATS [IGNORE_FORMATS ...]]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [-l LINETERMINATOR] [-m] [-n SHEETNAME] [-i] [--skipemptycolumns] [-p SHEETDELIMITER] [-q QUOTING] [-s SHEETID] [--include-hidden-rows]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; xlsxfile [outfile]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;&lt;/span&gt;xlsx to csv converter
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;&lt;/span&gt;positional arguments:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; xlsxfile xlsx file path, use &amp;#39;-&amp;#39; to read from STDIN
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; outfile output csv file path
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;&lt;/span&gt;options:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -h, --help show this help message and exit
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -v, --version show program&amp;#39;s version number and exit
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -a, --all export all sheets
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -c OUTPUTENCODING, --outputencoding OUTPUTENCODING
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; encoding of output csv ** Python 3 only ** (default: utf-8)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -d DELIMITER, --delimiter DELIMITER
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; delimiter - columns delimiter in csv, &amp;#39;tab&amp;#39; or &amp;#39;x09&amp;#39; for a tab (default: comma &amp;#39;,&amp;#39;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --hyperlinks, --hyperlinks
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; include hyperlinks
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -e, --escape Escape \r\n\t characters
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --no-line-breaks, --no-line-breaks
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Replace \r\n\t with space
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -E EXCLUDE_SHEET_PATTERN [EXCLUDE_SHEET_PATTERN ...], --exclude_sheet_pattern EXCLUDE_SHEET_PATTERN [EXCLUDE_SHEET_PATTERN ...]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; exclude sheets named matching given pattern, only effects when -a option is enabled.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -f DATEFORMAT, --dateformat DATEFORMAT
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; override date/time format (ex. %Y/%m/%d)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -t TIMEFORMAT, --timeformat TIMEFORMAT
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; override time format (ex. %H/%M/%S)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --floatformat FLOATFORMAT
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; override float format (ex. %.15f)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --sci-float force scientific notation to float
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -I INCLUDE_SHEET_PATTERN [INCLUDE_SHEET_PATTERN ...], --include_sheet_pattern INCLUDE_SHEET_PATTERN [INCLUDE_SHEET_PATTERN ...]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; only include sheets named matching given pattern, only effects when -a option is enabled.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --exclude_hidden_sheets
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Exclude hidden sheets from the output, only effects when -a option is enabled.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --ignore-formats IGNORE_FORMATS [IGNORE_FORMATS ...]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Ignores format for specific data types.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -l LINETERMINATOR, --lineterminator LINETERMINATOR
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; line terminator - lines terminator in csv, &amp;#39;\n&amp;#39; &amp;#39;\r\n&amp;#39; or &amp;#39;\r&amp;#39; (default: \n)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -m, --merge-cells merge cells
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -n SHEETNAME, --sheetname SHEETNAME
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; sheet name to convert
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -i, --ignoreempty skip empty lines
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --skipemptycolumns skip trailing empty columns
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -p SHEETDELIMITER, --sheetdelimiter SHEETDELIMITER
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; sheet delimiter used to separate sheets, pass &amp;#39;&amp;#39; if you do not need delimiter, or &amp;#39;x07&amp;#39; or &amp;#39;\f&amp;#39; for form feed (default: &amp;#39;--------&amp;#39;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -q QUOTING, --quoting QUOTING
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; quoting - fields quoting in csv, &amp;#39;none&amp;#39; &amp;#39;minimal&amp;#39; &amp;#39;nonnumeric&amp;#39; or &amp;#39;all&amp;#39; (default: minimal)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -s SHEETID, --sheet SHEETID
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; sheet number to convert
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --include-hidden-rows
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; include hidden rows
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;次のように再帰的に実行するのでもよい。&lt;/p&gt;</description></item><item><title>DeepWiki調査メモ</title><link>https://www.takeokunn.org/posts/fleeting/20250518171454-deepwiki_memo/</link><pubDate>Sun, 18 May 2025 00:00:00 +0000</pubDate><guid>https://www.takeokunn.org/posts/fleeting/20250518171454-deepwiki_memo/</guid><description>&lt;h2 id="背景-動機"&gt;背景・動機&lt;/h2&gt;
&lt;p&gt;Devin社が開発したDeepWikiが世間を賑わせていた。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://deepwiki.com/"&gt;https://deepwiki.com/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://huggingface.co/blog/lynn-mikami/deepwiki-ja"&gt;DeepWiki: あらゆるGitHubリポジトリに対応する最高のAIドキュメントジェネレーター&lt;/a&gt; にもあるとおり、DeepWikiは次のような機能を提供してくれている。
DeepWikiが生成するドキュメントは圧倒的に質が高く、まさしく顧客が求めていたものを提供してくれているなという感想。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;レポジトリ内のドキュメントを自動生成&lt;/li&gt;
&lt;li&gt;対話型AIアシスタント&lt;/li&gt;
&lt;li&gt;フローチャート生成&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;DeepWikiはDevinに契約していればPrivate Repoにも使えるが、個人がDevinを契約するのは流石にハードルが高い。&lt;/p&gt;
&lt;p&gt;DeepWikiが自分にとってどれくらい使いものになるのか、またOSS版の &lt;a href="https://github.com/AsyncFuncAI/deepwiki-open"&gt;AsyncFuncAI/deepwiki-open&lt;/a&gt; を使ってみて、どのくらいの精度で出力されるのか調査をした。&lt;/p&gt;
&lt;h2 id="試したこと-やったこと"&gt;試したこと・やったこと&lt;/h2&gt;
&lt;h3 id="1-dot-普段よく使うossにdeepwikiを使う"&gt;1. 普段よく使うOSSにDeepWikiを使う&lt;/h3&gt;
&lt;p&gt;普段よく使っていて、内部的にどう動いているのかある程度把握してるレポジトリをコード規模ごとに選定した。
書いてあることに嘘はないか、網羅性はどうか、実用に耐えうるかを確認した。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;大規模（100万行）
&lt;ul&gt;
&lt;li&gt;e.g. &lt;a href="https://deepwiki.com/emacs-mirror/emacs"&gt;https://deepwiki.com/emacs-mirror/emacs&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;中規模（10万行）
&lt;ul&gt;
&lt;li&gt;e.g. &lt;a href="https://deepwiki.com/emacs-lsp/lsp-mode"&gt;https://deepwiki.com/emacs-lsp/lsp-mode&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;小規模（1万行以内）
&lt;ul&gt;
&lt;li&gt;e.g. &lt;a href="https://deepwiki.com/x-motemen/ghq"&gt;https://deepwiki.com/x-motemen/ghq&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Chatで普段使ってる人しか知らなさそうなことを質問しまくって精度を確認した。
その結果、ドキュメントの質も網羅性も自分の用途では申し分がないことが確認できた。&lt;/p&gt;
&lt;h3 id="2-dot-deepwikiに自分のpublic-repoを食わせてみる"&gt;2. DeepWikiに自分のPublic Repoを食わせてみる&lt;/h3&gt;
&lt;p&gt;それなりのコード量のある自分のPublic RepoをDeepWiki食わせてみた。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://deepwiki.com/takeokunn/nixos-configuration"&gt;https://deepwiki.com/takeokunn/nixos-configuration&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://deepwiki.com/takeokunn/blog"&gt;https://deepwiki.com/takeokunn/blog&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;解説記事を書く手間が省けたし、自分しか知らないことをChatで対話しても明瞭に回答してくれた。&lt;/p&gt;
&lt;h3 id="3-dot-oss版のasyncfuncai-deepwiki-openを試す"&gt;3. OSS版のAsyncFuncAI/deepwiki-openを試す&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://github.com/AsyncFuncAI/deepwiki-open/"&gt;AsyncFuncAI/deepwiki-open&lt;/a&gt; をLocal立ち上げて動かしてみる。&lt;/p&gt;
&lt;figure&gt;&lt;img src="https://www.takeokunn.org/images/912E7F43-2598-4390-B7CA-9D560EFF82F9.png"&gt;
&lt;/figure&gt;
&lt;p&gt;記事公開日現在、DeepWikiで生成されたものとdeepwiki-openが生成したものを見比べてみた。
DeepWikiには多少劣るが、かなりのクオリティで出力されるようになった。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://deepwiki.com/asyncfuncai/deepwiki-open"&gt;https://deepwiki.com/asyncfuncai/deepwiki-open&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gist.github.com/takeokunn/4579d4e3390ddfd862f1fbbc3eb1a940"&gt;https://gist.github.com/takeokunn/4579d4e3390ddfd862f1fbbc3eb1a940&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;figure&gt;&lt;img src="https://www.takeokunn.org/images/6432A8D0-34A8-487A-AD44-D08D18ECEC93.png"&gt;
&lt;/figure&gt;
&lt;p&gt;deepwiki-openにもチャット機能があるが、こちらも十分に機能してくれていることを確認した。&lt;/p&gt;
&lt;h2 id="得られた結果-所感"&gt;得られた結果・所感&lt;/h2&gt;
&lt;p&gt;DeepWikiのクオリティが圧倒的に高いことがわかったので、今後OSSコードリーディングにDeepWikiを利用していくことにした。&lt;/p&gt;
&lt;p&gt;deepwiki-openは当初触った時、あまり網羅性がなく質の悪いアウトプットだったが、2週間くらい経って一気にクオリティが上がった。
AI関連ツールの進化は尋常じゃないくらい早いので2週間前に使ってイマイチだったからといって使えないと判断するのは早計だなと改めて感じた。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://x.com/ryoppippi"&gt;@ryoppippi&lt;/a&gt; がDeepWikiのbadgeを作れるOSSを作っていたので流行に乗って &lt;a href="https://github.com/takeokunn/blog"&gt;takeokunn/blog&lt;/a&gt; と &lt;a href="https://github.com/takeokunn/nixos-configuration"&gt;takeokunn/nixos-configuration&lt;/a&gt; に配置した。（Thanks ryopi）&lt;/p&gt;
&lt;blockquote class="twitter-tweet"&gt;&lt;p lang="ja" dir="ltr"&gt;&lt;a href="https://t.co/GBM768y5Ev"&gt;https://t.co/GBM768y5Ev&lt;/a&gt;&lt;a href="https://t.co/4OzgVqloK9"&gt;https://t.co/4OzgVqloK9&lt;/a&gt;&lt;br&gt;GitHubのREADME用にDeepWikiのバッジを簡単に生成できるサイトを作りました！ぜひ使ってみてください&lt;/p&gt;&amp;mdash; ryoppippi (@ryoppippi) &lt;a href="https://twitter.com/ryoppippi/status/1916248906523906227?ref_src=twsrc%5Etfw"&gt;April 26, 2025&lt;/a&gt;&lt;/blockquote&gt; &lt;script async src="https://platform.twitter.com/widgets.js" charset="utf-8"&gt;&lt;/script&gt;
&lt;h2 id="今後の展開-検討事項"&gt;今後の展開・検討事項&lt;/h2&gt;
&lt;p&gt;Aiderに食わせる為のコーディング特化のDeepWikiを作りたいのでMastraで自作する。&lt;/p&gt;
&lt;h2 id="backlinks"&gt;Backlinks&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.takeokunn.org/posts/fleeting/20250625115611-yield_in_php_src/"&gt;php-srcとyieldについて調査メモ&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Emacs lsp-modeに新しいClientを追加する方法</title><link>https://www.takeokunn.org/posts/fleeting/20250518160750-how_to_contribute_emacs_lsp_mode/</link><pubDate>Sun, 18 May 2025 00:00:00 +0000</pubDate><guid>https://www.takeokunn.org/posts/fleeting/20250518160750-how_to_contribute_emacs_lsp_mode/</guid><description>&lt;h2 id="背景-動機"&gt;背景・動機&lt;/h2&gt;
&lt;p&gt;メジャーなEmacsのLSP Clientは3種類ある。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/joaotavora/eglot"&gt;eglot&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/emacs-lsp/lsp-mode"&gt;lsp-mode&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/manateelazycat/lsp-bridge"&gt;lsp-bridge&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;それぞれメリットデメリットがあるが、自分としてはlsp-modeを推していて今後も使い続けるつもりでいる。
lsp-mode最大のメリットはClientサポート数の多さにあり、メジャーなLSP Clientなら必ず収録されていると言っても過言ではない。&lt;/p&gt;
&lt;p&gt;過去に次の2つのClientを追加するPRを出したことがあるので、後学の為にも追加方法を纏めておく。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/emacs-lsp/lsp-mode/pull/4785"&gt;Add support for Python(ty) #4785&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;追加で修正してくれた &lt;a href="https://github.com/emacs-lsp/lsp-mode/pull/4786"&gt;lsp-python-py: make it add-on and activated on python #4786&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/emacs-lsp/lsp-mode/pull/4283"&gt;Add support for Jsonnet #4283&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="試したこと-やったこと"&gt;試したこと・やったこと&lt;/h2&gt;
&lt;h3 id="0-dot-language-server選定"&gt;0. Language Server選定&lt;/h3&gt;
&lt;p&gt;追加したいLSP Serverをみつける。
流石に個人が趣味で開発した中途半端なものは避けるべきだと思うが、そこは取り込む人が判断するのでとりあえず出してみるのがよいかもしれない。&lt;/p&gt;
&lt;p&gt;CONTRIBUTINGを熟読して、Pull Requestにすでにあるかどうかを確認する。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/emacs-lsp/lsp-mode/blob/master/CONTRIBUTING.md"&gt;https://github.com/emacs-lsp/lsp-mode/blob/master/CONTRIBUTING.md&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="1-dot-repoをforkして手元に落とす"&gt;1. Repoをforkして手元に落とす&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://github.com/emacs-lsp/lsp-mode"&gt;emacs-lsp/lsp-mode&lt;/a&gt; からforkボタンを押して、自分の手元にGit Cloneする。&lt;/p&gt;
&lt;p&gt;EmacsからPATHを通して &lt;code&gt;(require 'lsp-mode)&lt;/code&gt; を実行する。&lt;/p&gt;
&lt;h3 id="2-dot-lsp-modeの設定をする"&gt;2. lsp-modeの設定をする&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;clients/lsp-python-ty.el&lt;/code&gt; のように &lt;code&gt;clients/&lt;/code&gt; に空気を読んでファイルを作成する。&lt;/p&gt;
&lt;p&gt;Jsonnetの場合は以下。&lt;/p&gt;
&lt;p&gt;最低限次の2つを定義すればよい。
完成度の高いLanguage Serverはオプションがあるので &lt;code&gt;defcustom&lt;/code&gt; で都度定義する。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;server-executable&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;lsp-register-client&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="https://github.com/emacs-lsp/lsp-mode/blob/master/clients/lsp-jsonnet.el"&gt;https://github.com/emacs-lsp/lsp-mode/blob/master/clients/lsp-jsonnet.el&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-emacs-lisp" data-lang="emacs-lisp"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;(require &lt;span style="color:#e6db74"&gt;&amp;#39;lsp-mode&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;(defgroup lsp-jsonnet &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:#e6db74"&gt;&amp;#34;LSP support for jsonnet.&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; :group &lt;span style="color:#e6db74"&gt;&amp;#39;lsp-mode&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; :link &lt;span style="color:#f92672"&gt;&amp;#39;&lt;/span&gt;(url-link &lt;span style="color:#e6db74"&gt;&amp;#34;https://github.com/grafana/jsonnet-language-server&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;(defcustom lsp-clients-jsonnet-server-executable &lt;span style="color:#f92672"&gt;&amp;#39;&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;jsonnet-language-server&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;The jsonnet language server executable to use.&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; :group &lt;span style="color:#e6db74"&gt;&amp;#39;lsp-jsonnet&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; :risky &lt;span style="color:#66d9ef"&gt;t&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; :type &lt;span style="color:#f92672"&gt;&amp;#39;&lt;/span&gt;(repeat &lt;span style="color:#a6e22e"&gt;string&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;(lsp-register-client
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; (make-lsp-client
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; :new-connection (lsp-stdio-connection (lambda () lsp-clients-jsonnet-server-executable))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; :activation-fn (lsp-activate-on &lt;span style="color:#e6db74"&gt;&amp;#34;jsonnet&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; :priority &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; :major-modes &lt;span style="color:#f92672"&gt;&amp;#39;&lt;/span&gt;(jsonnet-mode)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; :server-id &lt;span style="color:#e6db74"&gt;&amp;#39;jsonnet-lsp&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;(lsp-consistency-check lsp-jsonnet)
&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 &lt;span style="color:#e6db74"&gt;&amp;#39;lsp-jsonnet&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="3-dot-手元で動作確認する"&gt;3. 手元で動作確認する&lt;/h3&gt;
&lt;p&gt;ちょうどよいサイズのプロジェクトを手元に用意して実際に動かしてみる。
基本的なLSP機能が正常に動くか確認する。&lt;/p&gt;</description></item><item><title>GitHub Actions内で署名付きCommitをする</title><link>https://www.takeokunn.org/posts/fleeting/20250518201409-signed_commit_in_github_actions/</link><pubDate>Sun, 18 May 2025 00:00:00 +0000</pubDate><guid>https://www.takeokunn.org/posts/fleeting/20250518201409-signed_commit_in_github_actions/</guid><description>&lt;h2 id="背景-動機"&gt;背景・動機&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://www.takeokunn.org/posts/fleeting/20250402001222-setup_private_terraform_github_provider/"&gt;Terraform GitHub Providerを導入した&lt;/a&gt; で署名付きCommitを強制するBranch Ruleを網羅的に適用した。&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-terraform" data-lang="terraform"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;resource&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;github_repository_ruleset&amp;#34;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;default-branch&amp;#34;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;name&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;main&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;repository&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;repo-name&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;target&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;branch&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;enforcement&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;active&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:#a6e22e"&gt;conditions&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;ref_name&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;include&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [&lt;span style="color:#e6db74"&gt;&amp;#34;~DEFAULT_BRANCH&amp;#34;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;exclude&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&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:#a6e22e"&gt;rules&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;required_signatures&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;non_fast_forward&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;true&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;2025年5月現在、 &lt;a href="https://github.com/takeokunn/nixos-configuration"&gt;takeokunn/nixos-configuration&lt;/a&gt; では次のGitHub Actionsが動いている。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;毎日20時に発火する&lt;/li&gt;
&lt;li&gt;&lt;code&gt;nix flake update&lt;/code&gt; などを実行して依存を更新する&lt;/li&gt;
&lt;li&gt;変更をcommitしてpushする&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;署名付きCommitを強制する変更を加えた影響で「3. 変更をcommitしてpushする」が動かなくなってしまった。&lt;/p&gt;
&lt;p&gt;調べた所、GitHub Actions内で署名付きCommitをしている人が世の中に少なかったので対応方法を纏めておく。&lt;/p&gt;
&lt;h2 id="試したこと-やったこと"&gt;試したこと・やったこと&lt;/h2&gt;
&lt;h3 id="1-dot-署名用のgpg-keyを生成する"&gt;1. 署名用のGPG Keyを生成する&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://www.takeokunn.org/posts/fleeting/20250514155803-yubikey_gpg_operation/"&gt;GPG KeyのYubiKey運用をはじめた&lt;/a&gt; にあるとおり、自分の手元では主鍵副鍵運用をしている。&lt;/p&gt;
&lt;p&gt;主鍵から &lt;code&gt;addkey&lt;/code&gt; Signのみを付与した副鍵を生成する。
生成する際に必ずパスフレーズも設定する。&lt;/p&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-console" data-lang="console"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ gpg -K --with-fingerprint
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="2-dot-github-actions-secretに副鍵のprivate-keyを登録する"&gt;2. GitHub Actions Secretに副鍵のPrivate Keyを登録する&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;GPG_PRIVATE_KEY&lt;/code&gt; と &lt;code&gt;PASSPHRASE&lt;/code&gt; を設定する。&lt;/p&gt;</description></item><item><title>個人的Local環境のGit Branch運用について</title><link>https://www.takeokunn.org/posts/fleeting/20250518144557-local_git_branch_operation/</link><pubDate>Sun, 18 May 2025 00:00:00 +0000</pubDate><guid>https://www.takeokunn.org/posts/fleeting/20250518144557-local_git_branch_operation/</guid><description>&lt;h2 id="背景-動機"&gt;背景・動機&lt;/h2&gt;
&lt;p&gt;複数人で触っているRepoをLocalでGit操作する時、次のような問題が発生していた。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;直pushしてしまった&lt;/li&gt;
&lt;li&gt;意図しない作業ブランチで作業してしまった&lt;/li&gt;
&lt;li&gt;コンフリクト解消ミスで本来必要なコードを消してしまう&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;GitHubのBranch RuleやCIなどでミスを防ぐべきだが、そういうのが整っていない環境というのは多々ある。
自衛のために個人的に行っているGit Branch運用について纏めておく。&lt;/p&gt;
&lt;p&gt;当記事の前提は以下。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Git ClientはMagit&lt;/li&gt;
&lt;li&gt;Default Branchは &lt;code&gt;main&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;GitHubを利用している&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="試したこと-やったこと"&gt;試したこと・やったこと&lt;/h2&gt;
&lt;h3 id="0-dot-方針を決める"&gt;0. 方針を決める&lt;/h3&gt;
&lt;p&gt;基本方針は以下。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;最新のRemote Branchを常に取得する&lt;/li&gt;
&lt;li&gt;デフォルトがLocal Branchが一切ない状態にする
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;main&lt;/code&gt; Branchすら用意しない&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;作業するタイミング &lt;strong&gt;&lt;strong&gt;のみ&lt;/strong&gt;&lt;/strong&gt; Local Branchを作成する
&lt;ul&gt;
&lt;li&gt;作業が終わったら必ずGit Pushする（Remote管理）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="1-dot-手元から一切のlocal-branchを消す"&gt;1. 手元から一切のLocal Branchを消す&lt;/h3&gt;
&lt;p&gt;次のようなLocal Branchがあったとする。&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-console" data-lang="console"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ git branch
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; feature/xxx
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; feature/yyy
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; feature/zzz
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;* main
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;origin/main&lt;/code&gt; に移動して、 &lt;code&gt;main&lt;/code&gt; Branch含めすべてのLocal Branchを削除する。&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-console" data-lang="console"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ git checkout origin/main
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;&lt;/span&gt;$ git branch -D main
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ git branch -D feature/xxx
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ git branch -D feature/yyy
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ git branch -D feature/zzz
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;次のような状態になるとよい。&lt;/p&gt;</description></item><item><title>2025年5月 Macの再インストール手順メモ</title><link>https://www.takeokunn.org/posts/fleeting/20250514222418-reinstall_mac_with_nix/</link><pubDate>Wed, 14 May 2025 00:00:00 +0000</pubDate><guid>https://www.takeokunn.org/posts/fleeting/20250514222418-reinstall_mac_with_nix/</guid><description>&lt;h2 id="背景-動機"&gt;背景・動機&lt;/h2&gt;
&lt;p&gt;たまたまMacを再インストールする必要があった。
普段、手元のマシンの環境構築手順を洗練させてたお陰で少ないステップで構築できたので何をやったのか後学の為にメモしておく。&lt;/p&gt;
&lt;h2 id="試したこと-やったこと"&gt;試したこと・やったこと&lt;/h2&gt;
&lt;h3 id="0-dot-macの生前整理と初期化動線"&gt;0. Macの生前整理と初期化動線&lt;/h3&gt;
&lt;p&gt;データが消えてもいいようにバックアップしておく。
基本的にGoogle DriveかGitHubにすべてが置いていて今日PCが故障しても問題ない運用にしている。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;消えてほしくないデータをGoogle Driveに置く&lt;/li&gt;
&lt;li&gt;commit漏れてるrepoがないか確認して必要ならpushしておく&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;初期化動線は通常のmacの初期セットアップなので割愛。&lt;/p&gt;
&lt;h3 id="1-dot-homebrewを入れる"&gt;1. homebrewを入れる&lt;/h3&gt;
&lt;p&gt;terminal.appを開いてhomebrewをインストールする。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://brew.sh/ja/"&gt;https://brew.sh/ja/&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-console" data-lang="console"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ /bin/bash -c &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;&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;h3 id="2-dot-nixos-configurationを実行する"&gt;2. nixos-configurationを実行する&lt;/h3&gt;
&lt;p&gt;YubiKeyを挿した状態でnix buildを実行する。
必要なツールとmac固有の設定はほぼすべて自動で入るようになっている。&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-console" data-lang="console"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ git clone https://github.com/takeokunn/nixos-configuration
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ cd nixos-configuration
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ nix run nix-darwin --extra-experimental-features &lt;span style="color:#e6db74"&gt;&amp;#39;flakes nix-command&amp;#39;&lt;/span&gt; -- switch --flake .#OPL2212-2 --show-trace
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="3-dot-gpg-ssh回りを設定する"&gt;3. GPG/SSH回りを設定する&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://www.takeokunn.org/posts/fleeting/20250514155803-yubikey_gpg_operation/"&gt;GPG KeyのYubiKey運用をはじめた&lt;/a&gt; にある「3. 新規端末で副鍵（Sign, Auth）を入れる」以降を行う。&lt;/p&gt;
&lt;p&gt;GitHubのssh認証を確認する。&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-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ ssh -T git@github.com
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Hi takeokunn! You&lt;span style="color:#960050;background-color:#1e0010"&gt;&amp;#39;&lt;/span&gt;ve successfully authenticated, but GitHub does not provide shell access.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="4-dot-必要なレポジトリを落としてsecret-dot-orgをorg-babel-tangleする"&gt;4. 必要なレポジトリを落としてsecret.orgをorg-babel-tangleする&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;$ ghq get&lt;/code&gt; で必要なレポジトリを網羅的に落とす。
&lt;a href="https://www.takeokunn.org/posts/fleeting/20250414001634-migrate_credential_manager_to_password_store/"&gt;credential管理をorg-encryptからpassword-storeに移行した&lt;/a&gt; のとおり、 &lt;code&gt;M-x org-babel-tangle&lt;/code&gt; でpassword-storeを実行して必要な設定ファイルのほぼすべてを配置できるようにしている。&lt;/p&gt;</description></item><item><title>巨大なLaravelレポジトリでphpactorを使うTips</title><link>https://www.takeokunn.org/posts/fleeting/20250515004832-phpactor_performance_huge_projects/</link><pubDate>Wed, 14 May 2025 00:00:00 +0000</pubDate><guid>https://www.takeokunn.org/posts/fleeting/20250515004832-phpactor_performance_huge_projects/</guid><description>&lt;h2 id="背景-動機"&gt;背景・動機&lt;/h2&gt;
&lt;p&gt;手元で &lt;a href="https://intelephense.com/"&gt;intelephense&lt;/a&gt; が最近調子が悪く、定義ジャンプや補完が全然効かなくなってしまった。&lt;/p&gt;
&lt;p&gt;phpactorの方がintelephenseよりもちゃんと機能してくれる肌感があったが、いかんせん大きいプロジェクトでは重く使いものにならない印象を持っていた。
しかし、phpactor周辺の設定を徹底したら快適に動くようになってくれたので対応項目をメモしておく。&lt;/p&gt;
&lt;p&gt;巨大なLaravelレポジトリの情報は以下。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;プロジェクト&lt;/th&gt;
&lt;th&gt;version&lt;/th&gt;
&lt;th&gt;コード行数&lt;/th&gt;
&lt;th&gt;phpstan level&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;A&lt;/td&gt;
&lt;td&gt;7.4&lt;/td&gt;
&lt;td&gt;140万行超&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;B&lt;/td&gt;
&lt;td&gt;8.2&lt;/td&gt;
&lt;td&gt;40万行&lt;/td&gt;
&lt;td&gt;max/strict-rule&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&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-console" data-lang="console"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ nix run nixpkgs#fastfetch
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;&lt;/span&gt; ..&amp;#39; obara@OPL2212-001
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ,xNMM. -----------------
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .OMMMMo OS: macOS Sequoia 15.5 arm64
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; lMM&amp;#34; Host: MacBook Pro (14-inch, 2021)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .;loddo:. .olloddol;. Kernel: Darwin 24.5.0
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; cKMMMMMMMMMMNWMMMMMMMMMM0: Uptime: 1 day, 6 hours, 50 mins
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .KMMMMMMMMMMMMMMMMMMMMMMMWd. Packages: 1375 (nix-system), 52 (nix-default), 6 (brew), 14 (brew-cask)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; XMMMMMMMMMMMMMMMMMMMMMMMX. Shell: fish 4.0.2
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;;MMMMMMMMMMMMMMMMMMMMMMMM: Display (Color LCD): 3600x2338 @ 120 Hz (as 1800x1169) in 14&amp;#34; [Built-in]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;:MMMMMMMMMMMMMMMMMMMMMMMM: DE: Aqua
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.MMMMMMMMMMMMMMMMMMMMMMMMX. WM: Quartz Compositor 278.4.7
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; kMMMMMMMMMMMMMMMMMMMMMMMMWd. WM Theme: Multicolor (Dark)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;#39;XMMMMMMMMMMMMMMMMMMMMMMMMMMk Font: .AppleSystemUIFont [System], Helvetica [User]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;#39;XMMMMMMMMMMMMMMMMMMMMMMMMK. Cursor: Fill - Black, Outline - White (32px)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; kMMMMMMMMMMMMMMMMMMMMMMd Terminal: tmux 3.5a
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ;KMMMMMMMWXXWMMMMMMMk. CPU: Apple M1 Pro (8) @ 3.23 GHz
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;#34;cooc*&amp;#34; &amp;#34;*coo&amp;#39;&amp;#34; GPU: Apple M1 Pro (14) @ 1.30 GHz [Integrated]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Memory: 20.76 GiB / 32.00 GiB (65%)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Swap: Disabled
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Disk (/): 153.68 GiB / 460.43 GiB (33%) - apfs [Read-only]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Local IP (en0): 172.16.80.163/18
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Battery (bq40z651): 100% [AC connected, Charging]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Power Adapter: 39W
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Locale: en_US.UTF-8
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;なお、phpactorについてはPHPerKaigi2025パンフレット記事の &lt;a href="https://www.takeokunn.org/pdf/phperkaigi-2025-pamphlet.pdf"&gt;Phpactorから学ぶLanguage Server Protocolの仕組み&lt;/a&gt; に纏めた。&lt;/p&gt;</description></item><item><title>GPG KeyのYubiKey運用をはじめた</title><link>https://www.takeokunn.org/posts/fleeting/20250514155803-yubikey_gpg_operation/</link><pubDate>Sun, 11 May 2025 00:00:00 +0000</pubDate><guid>https://www.takeokunn.org/posts/fleeting/20250514155803-yubikey_gpg_operation/</guid><description>&lt;h2 id="背景-動機"&gt;背景・動機&lt;/h2&gt;
&lt;p&gt;2025年5月の自分の手元の環境はGPGに重度に依存している。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.takeokunn.org/posts/fleeting/20240108211345-migrate_bitwarden_to_password_store/"&gt;Bitwardenからpassword-storeに移行した&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.takeokunn.org/posts/fleeting/20240110123142-migrate_authy_to_password_store_otp/"&gt;Authyからpassword-store-otpに移行した&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.takeokunn.org/posts/fleeting/20250414001634-migrate_credential_manager_to_password_store/"&gt;credential管理をorg-encryptからpassword-storeに移行した&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;GPG Keyの運用についてかねてから悩んでいたが、YubiKey運用が一番よいという結論に至った。
ちょうどMacを初期化するタイミングがあったので完全に移行した。&lt;/p&gt;
&lt;p&gt;次の記事を参考にした。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://zenn.dev/lambdalisue/articles/gpg-with-yubikey-2024"&gt;GPG 鍵と YubiKey の運用メモ - Zenn&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://keens.github.io/blog/2021/03/23/yubikeywotsukau_openpghen/"&gt;YubikeyでOpenPGP鍵をセキュアに使う - κeenのHappy Hacκing Blog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://fuwa.dev/posts/yubikey/"&gt;YubiKey(OpenPGP card)には主鍵を入れよう - ふわわあのへや&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="試したこと-やったこと"&gt;試したこと・やったこと&lt;/h2&gt;
&lt;h3 id="0-dot-運用方針を決める"&gt;0. 運用方針を決める&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://zenn.dev/lambdalisue/articles/gpg-with-yubikey-2024"&gt;GPG 鍵と YubiKey の運用メモ - Zenn&lt;/a&gt; と同様、次の方針で運用してくことにした。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;YubiKey には主鍵と副鍵 （Encrypt） を焼き、持ち歩く&lt;/li&gt;
&lt;li&gt;YubiKey の主鍵を利用して副鍵 （Sign, Auth） をデバイス毎に作成・保存しておく
&lt;ul&gt;
&lt;li&gt;コミット署名はデバイス毎の副鍵 （Sign） を利用する&lt;/li&gt;
&lt;li&gt;SSH Keyはデバイス毎の副鍵（Auth） &lt;code&gt;gpg --export-ssh-key&lt;/code&gt; 経由で端末ごとに生成する
&lt;ul&gt;
&lt;li&gt;keygrepを &lt;code&gt;~/.gnupg/sshcontrol&lt;/code&gt; に入れる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;暗号化・復号機能は YubiKey の副鍵 （Encrypt） を利用する&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;元記事に加えてSSH KeyもGPG経由で生成することにした。
&lt;a href="https://www.takeokunn.org/posts/fleeting/20250402001222-setup_private_terraform_github_provider/"&gt;Terraform GitHub Providerを導入した&lt;/a&gt; でIaCの土壌が用意されているので、端末が増えるごとに毎回追加する運用にしていく。&lt;/p&gt;
&lt;p&gt;GPGの仕組みについてはChatGPTにひたすら質問して不安な部分を潰した。&lt;/p&gt;
&lt;h3 id="1-dot-yubikeyを購入する"&gt;1. YubiKeyを購入する&lt;/h3&gt;
&lt;p&gt;Amazonで &lt;a href="https://www.amazon.co.jp/dp/B08DHL1YDL?ref=ppx_yo2ov_dt_b_fed_asin_title"&gt;Yubico セキュリティキー YubiKey 5C NFC USB-C/FIDO2/WebAuthn/U2F/2段階認証/高耐久性/耐衝撃性/防水&lt;/a&gt; を購入した。&lt;/p&gt;</description></item><item><title>GitHub ActionsでCachixを導入する</title><link>https://www.takeokunn.org/posts/fleeting/20250510192642-use_cachix_in_github_actions/</link><pubDate>Sat, 10 May 2025 00:00:00 +0000</pubDate><guid>https://www.takeokunn.org/posts/fleeting/20250510192642-use_cachix_in_github_actions/</guid><description>&lt;h2 id="背景-動機"&gt;背景・動機&lt;/h2&gt;
&lt;p&gt;NixにハマってからGitHub Actions上でNixを実行する機会が増えた。
Nixというツールの性質上、どうしても実行環境の準備に時間がかかってしまうのでキャッシュ機能を導入したいと以前から思っていた。&lt;/p&gt;
&lt;p&gt;Cachixが一番メジャーなサービスであり、個人利用程度なら無料で使えるので今回はじめて利用してみた。&lt;/p&gt;
&lt;h2 id="試したこと-やったこと"&gt;試したこと・やったこと&lt;/h2&gt;
&lt;h3 id="1-dot-cachixの設定をする"&gt;1. Cachixの設定をする&lt;/h3&gt;
&lt;p&gt;アカウントを新規作成して、New Cacheで作成した。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://app.cachix.org/"&gt;https://app.cachix.org/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;「Settings &amp;gt; Cache Auth Tokens」でアクセストークンを作成して,GitHub Actions Secretに &lt;code&gt;CACHIX_AUTH_TOKEN&lt;/code&gt; に登録した。&lt;/p&gt;
&lt;h3 id="2-dot-github-actionsで設定する"&gt;2. GitHub Actionsで設定する&lt;/h3&gt;
&lt;p&gt;reusable actionで次のように定義した。
reusable actionからは &lt;code&gt;secrets.XX&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-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;Run setup-nix&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;description&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;Set up Nix environment for GitHub Actions&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;inputs&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;cachix-auth-token&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;required&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;true&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;runs&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;using&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;composite&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;steps&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;uses&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;cachix/install-nix-action@v31&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;uses&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;cachix/cachix-action@v14&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;with&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;takeokunn-blog&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;authToken&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#39;${{ inputs.cachix-auth-token }}&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;次のように呼び出すとよしなにCache HitしたらCachixからCopyしてくれるようになった。&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-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;steps&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;Setup nix&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;uses&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;./.github/actions/setup-nix&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;with&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;cachix-auth-token&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;${{ secrets.CACHIX_AUTH_TOKEN }}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;あとはよしなにnixを実行する。&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-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# nix buildの場合&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;Build zenn&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;run&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;nix build .#build-zenn&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:#75715e"&gt;# nix developの場合&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;flake check&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;run&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;nix develop --command bash -c &amp;#34;textlint &amp;#39;org/**/*.org&amp;#39;&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;&lt;a href="https://github.com/takeokunn/blog"&gt;takeokunn/blog&lt;/a&gt; の場合、平均して1分でNix実行環境を用意できるようになり大幅なCI速度改善を実現できた。&lt;/p&gt;</description></item><item><title>markdown-preview-modeとxwidgetsでリアルタイムプレビューする</title><link>https://www.takeokunn.org/posts/fleeting/20250510184016-preview_markdown_with_xwidgets/</link><pubDate>Sat, 10 May 2025 00:00:00 +0000</pubDate><guid>https://www.takeokunn.org/posts/fleeting/20250510184016-preview_markdown_with_xwidgets/</guid><description>&lt;h2 id="背景-動機"&gt;背景・動機&lt;/h2&gt;
&lt;p&gt;最近AIが生成したMarkdownを読む機会が増えた。
Emacs Buffer上で読むのもよいのだが、ブラウザ上でCSSを当てた方が読みやすいので今回対応した。&lt;/p&gt;
&lt;h2 id="試したこと-やったこと"&gt;試したこと・やったこと&lt;/h2&gt;
&lt;h3 id="1-dot-markdown-preview-modeを用意する"&gt;1. markdown-preview-modeを用意する&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/ancane/markdown-preview-mode"&gt;ancane/markdown-preview-mode&lt;/a&gt; をインストールする
&lt;ul&gt;
&lt;li&gt;Melpa経由で入る&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Markdownをコンパイルする為に &lt;a href="https://pandoc.org/"&gt;pandoc&lt;/a&gt; を用意する&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="2-dot-markdown-preview-modeの設定をする"&gt;2. markdown-preview-modeの設定をする&lt;/h3&gt;
&lt;p&gt;solarized-lightのテーマを選んだ。&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-emacs-lisp" data-lang="emacs-lisp"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;(setq markdown-preview-stylesheets (&lt;span style="color:#a6e22e"&gt;list&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;http://thomasf.github.io/solarized-css/solarized-light.min.css&amp;#34;&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-emacs-lisp" data-lang="emacs-lisp"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;(defun my/markdown-preview-css-filter (orig-return)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; (&lt;span style="color:#a6e22e"&gt;concat&lt;/span&gt; orig-return &lt;span style="color:#e6db74"&gt;&amp;#34;&amp;lt;style&amp;gt;img { max-width: 100%; }&amp;lt;/style&amp;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;(advice-add &lt;span style="color:#e6db74"&gt;&amp;#39;markdown-preview--css&lt;/span&gt; :filter-return &lt;span style="color:#a6e22e"&gt;#&amp;#39;&lt;/span&gt;my/markdown-preview-css-filter)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;previewを起動する時にxwidget経由で開くようにした。&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-emacs-lisp" data-lang="emacs-lisp"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;(defun my/markdown-preview--start-with-xwidget (orig-fun &lt;span style="color:#66d9ef"&gt;&amp;amp;rest&lt;/span&gt; args)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; (let ((browse-url-browser-function &lt;span style="color:#a6e22e"&gt;#&amp;#39;&lt;/span&gt;xwidget-webkit-browse-url))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; (&lt;span style="color:#a6e22e"&gt;apply&lt;/span&gt; orig-fun args)))
&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;(advice-add &lt;span style="color:#e6db74"&gt;&amp;#39;markdown-preview--start&lt;/span&gt; :around &lt;span style="color:#a6e22e"&gt;#&amp;#39;&lt;/span&gt;my/markdown-preview--start-with-xwidget)
&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;他エディタに遜色ないくらい体験が良くなった。
WebSocket Serverも立ててくれるのでリアルタイムプレビューも可能になった。&lt;/p&gt;
&lt;figure&gt;&lt;img src="https://www.takeokunn.org/images/294497E0-19F6-44FD-8664-826BF09039CF.png"&gt;
&lt;/figure&gt;
&lt;h2 id="今後の展開-検討事項"&gt;今後の展開・検討事項&lt;/h2&gt;
&lt;p&gt;org-modeの場合は &lt;a href="https://github.com/jakebox/org-preview-html"&gt;org-preview-html&lt;/a&gt; で実現できるのでxwidget対応をする。&lt;/p&gt;</description></item><item><title>org-roam-ui-liteでblogの関係性を可視化する</title><link>https://www.takeokunn.org/posts/fleeting/20250511015532-host_org_roam_ui_lite/</link><pubDate>Sat, 10 May 2025 00:00:00 +0000</pubDate><guid>https://www.takeokunn.org/posts/fleeting/20250511015532-host_org_roam_ui_lite/</guid><description>&lt;h2 id="背景-動機"&gt;背景・動機&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://www.takeokunn.org/posts/permanent/20231219122351-how_to_manage_blog_by_org_roam/"&gt;org-roamで記事を管理しGitHub Actionsで適切に公開する&lt;/a&gt; に書いたとおり &lt;a href="https://www.takeokunn.org/"&gt;takeokunn.org&lt;/a&gt; は &lt;a href="https://www.orgroam.com/"&gt;org-roam&lt;/a&gt; で管理している。&lt;/p&gt;
&lt;p&gt;org-roamの可視化ツールに &lt;a href="https://github.com/org-roam/org-roam-ui"&gt;org-roam-ui&lt;/a&gt; があるが、次のような問題を抱えていた。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Next.jsでリッチに作られすぎてる
&lt;ul&gt;
&lt;li&gt;NixでPackagingするのが大変&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;GitHub ActionsでBuildするのが大変&lt;/li&gt;
&lt;li&gt;GitHub PagesでHostingするのが大変&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;GitHub Pagesに継続的にHostingする仕組みを作りたいと考えて早n年経っていたが、taniさんが &lt;a href="https://github.com/tani/org-roam-ui-lite"&gt;org-roam-ui-lite&lt;/a&gt; という軽量なorg-roam-uiを作ってくれたので今回導入してみた。&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/takeokunn/blog/commit/5703949e2212fa0e5f23d23869d61ea2b74b8dad"&gt;https://github.com/takeokunn/blog/commit/5703949e2212fa0e5f23d23869d61ea2b74b8dad&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="1-dot-flake-dot-nixでbuildできるようにする"&gt;1. flake.nixでBuildできるようにする&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;scripts/org-roam-ui.el&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-emacs-lisp" data-lang="emacs-lisp"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;(require &lt;span style="color:#e6db74"&gt;&amp;#39;org-roam&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;(setq org-roam-db-location &lt;span style="color:#e6db74"&gt;&amp;#34;./org-roam.db&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;(setq org-id-locations-file &lt;span style="color:#e6db74"&gt;&amp;#34;./.org-id-locations&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;(setq org-roam-directory default-directory)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;flake.nixでorg-roam-ui-liteをimportして &lt;code&gt;stdenv.mkDerivation&lt;/code&gt; でpackageを作成した。&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-diff" data-lang="diff"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;diff --git a/hugo/flake.nix b/hugo/flake.nix
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;index c35c860..155c924 100644
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;--- a/hugo/flake.nix
&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;+++ b/hugo/flake.nix
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;&lt;/span&gt;&lt;span style="color:#75715e"&gt;@@ -3,9 +3,10 @@
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt; nixpkgs.url = &amp;#34;github:NixOS/nixpkgs&amp;#34;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; nur-packages.url = &amp;#34;github:takeokunn/nur-packages&amp;#34;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; flake-utils.url = &amp;#34;github:numtide/flake-utils&amp;#34;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;+ org-roam-ui-lite.url = &amp;#34;github:tani/org-roam-ui-lite&amp;#34;;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&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:#f92672"&gt;- outputs = { self, nixpkgs, nur-packages, flake-utils }:
&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;+ outputs = { self, nixpkgs, nur-packages, flake-utils, org-roam-ui-lite }:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;&lt;/span&gt; flake-utils.lib.eachDefaultSystem (
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; system:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; let
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;@@ -85,6 +86,22 @@
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt; cp -r ./public $out/
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;#39;&amp;#39;;
&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;+ build-org-roam-ui-lite = pkgs.stdenv.mkDerivation {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;+ name = &amp;#34;build-org-roam-ui-lite&amp;#34;;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;+ src = ./.;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;+ nativeBuildInputs = with pkgs; [
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;+ org-roam-ui-lite.packages.${system}.export
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;+ (emacsPkg.pkgs.withPackages (epkgs: (with epkgs.melpaPackages; [ org-roam ])))
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&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;+ buildPhase = &amp;#39;&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;+ rm -fr org/private/
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;+ emacs --batch --load scripts/org-roam-ui.el --funcall org-roam-db-sync
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;+ org-roam-ui-lite-export -d org-roam.db -o ./public
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;+ &amp;#39;&amp;#39;;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;+ installPhase = &amp;#39;&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;+ cp -r ./public $out/
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;+ &amp;#39;&amp;#39;;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&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;&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;nix build&lt;/code&gt; でbuildできることを確認する。&lt;/p&gt;</description></item><item><title>private-terraformをHCP Terraformに移行した</title><link>https://www.takeokunn.org/posts/fleeting/20250507230034-use_private_terraform_cloud/</link><pubDate>Wed, 07 May 2025 00:00:00 +0000</pubDate><guid>https://www.takeokunn.org/posts/fleeting/20250507230034-use_private_terraform_cloud/</guid><description>&lt;h2 id="背景-動機"&gt;背景・動機&lt;/h2&gt;
&lt;p&gt;個人用のTerraformプロジェクトを用意して、GitHubとCloudflareとNextDNSの管理をしている。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.takeokunn.org/posts/fleeting/20250402001222-setup_private_terraform_github_provider/"&gt;Terraform GitHub Providerを導入した&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.takeokunn.org/posts/fleeting/20250403220528-migrate_onamae_to_cloudflare_and_managed_by_terraform/"&gt;お名前comからCloudflareにドメイン移管してTerraformで管理する&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.takeokunn.org/posts/fleeting/20250402012730-setup_nextdns/"&gt;NextDNSを導入した&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;tfstateのファイルをLocalマシンで雑に管理をしていたのだが、PCの引越し作業が発生したので管理方法を検討する必要があったので対応したことを纏めておく。&lt;/p&gt;
&lt;h2 id="試したこと-やったこと"&gt;試したこと・やったこと&lt;/h2&gt;
&lt;h3 id="1-dot-tfstate管理方法を検討"&gt;1. tfstate管理方法を検討&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;MUST
&lt;ul&gt;
&lt;li&gt;料金が無料&lt;/li&gt;
&lt;li&gt;セキュリティリスクが低い&lt;/li&gt;
&lt;li&gt;安全なterraform実行環境の保証&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;SHOULD
&lt;ul&gt;
&lt;li&gt;バージョン管理&lt;/li&gt;
&lt;li&gt;実行結果の可視性&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;OPTIONAL
&lt;ul&gt;
&lt;li&gt;CI統合&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;HCP Terraform（旧terraform cloud）はHashiCorp謹製のCloudサービス。
&lt;a href="https://www.hashicorp.com/ja/cloud"&gt;https://www.hashicorp.com/ja/cloud&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;500 resourcesまでは無料なので個人利用なら無料で完結する。
&lt;a href="https://www.hashicorp.com/en/pricing"&gt;https://www.hashicorp.com/en/pricing&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;候補としてはさくらインターネットやCloudflareのストレージに上げることも検討していたが、そもそも各サービスを利用しなくなることも考えられるので却下した。&lt;/p&gt;
&lt;h3 id="2-dot-hcp-terraform自体のterraformを書く"&gt;2. HCP Terraform自体のTerraformを書く&lt;/h3&gt;
&lt;p&gt;以下を参考にterraformを書いた。
&lt;a href="https://registry.terraform.io/providers/hashicorp/tfe/latest/docs"&gt;https://registry.terraform.io/providers/hashicorp/tfe/latest/docs&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;TF_API_TOKEN&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-terraform" data-lang="terraform"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;terraform&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;required_version&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;1.11.4&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:#a6e22e"&gt;cloud&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;organization&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;takeokunn-private&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;workspaces&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;name&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;tfe&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&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;required_providers&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;tfe&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:#a6e22e"&gt;source&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;hashicorp/tfe&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;version&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;0.65.2&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&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;variable&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;TF_API_TOKEN&amp;#34;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;type&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;string&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;provider&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;tfe&amp;#34;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;token&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; var.&lt;span style="color:#a6e22e"&gt;TF_API_TOKEN&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;resource&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;tfe_organization&amp;#34;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;private&amp;#34;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;name&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;takeokunn-private&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;email&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;bararararatty@gmail.com&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;collaborator_auth_policy&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;two_factor_mandatory&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;resource&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;tfe_project&amp;#34;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;default&amp;#34;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;organization&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;tfe_organization&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;private&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;name&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;name&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;private&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;resource&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;tfe_workspace&amp;#34;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;tfe&amp;#34;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;name&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;tfe&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;organization&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;tfe_organization&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;private&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;name&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;project_id&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;tfe_project&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;default&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;id&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;resource&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;tfe_workspace&amp;#34;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;nextdns&amp;#34;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;name&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;nextdns&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;organization&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;tfe_organization&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;private&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;name&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;project_id&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;tfe_project&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;default&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;id&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;resource&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;tfe_workspace&amp;#34;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;cloudflare&amp;#34;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;name&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;cloudflare&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;organization&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;tfe_organization&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;private&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;name&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;project_id&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;tfe_project&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;default&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;id&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;resource&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;tfe_workspace&amp;#34;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;github&amp;#34;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;name&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;github&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;organization&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;tfe_organization&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;private&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;name&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;project_id&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;tfe_project&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;default&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;id&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;h3 id="3-dot-ディレクトリ構成変更"&gt;3. ディレクトリ構成変更&lt;/h3&gt;
&lt;p&gt;元々はentrypoint1つですべてを流せるようにしていたが、次のようにサービスごとに分け、 &lt;code&gt;cd&lt;/code&gt; で移動してからterraformを実行する運用に変更した。
この対応によって他サービスの変更に依存せずにversionを上げられるようになった。&lt;/p&gt;</description></item><item><title>Typstテーマを自作した</title><link>https://www.takeokunn.org/posts/fleeting/20250506220914-create_typst_slide_theme/</link><pubDate>Tue, 06 May 2025 00:00:00 +0000</pubDate><guid>https://www.takeokunn.org/posts/fleeting/20250506220914-create_typst_slide_theme/</guid><description>&lt;h2 id="背景-動機"&gt;背景・動機&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://www.takeokunn.org/posts/fleeting/20250126114218-build_and_deploy_typst_using_nix/"&gt;NixでTypstをBuildしGitHub Pagesでホスティングする&lt;/a&gt; でTypstから生成したPDFスライドを配信する仕組みを作った。
今後の登壇は可能な限りTypstから生成するつもりなのでテーマを自作した。&lt;/p&gt;
&lt;p&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;/ul&gt;
&lt;p&gt;個人的にDracula Themeが好きなのでDracula Theme風に作る。&lt;/p&gt;
&lt;h2 id="試したこと-やったこと"&gt;試したこと・やったこと&lt;/h2&gt;
&lt;h3 id="1-dot-theme自作"&gt;1. theme自作&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://typst.app/universe/package/polylux/"&gt;polylux&lt;/a&gt; をベースに自作した。&lt;a href="https://typst.app/universe/package/basic-polylux/"&gt;basic-polylux&lt;/a&gt; あたりを参考に改造した。&lt;/p&gt;
&lt;p&gt;シンタックスハイライトは &lt;a href="https://typst.app/universe/package/codly/"&gt;codelst&lt;/a&gt; に &lt;a href="https://github.com/dracula/textmate/blob/master/Dracula.tmTheme"&gt;Dracula.tmTheme&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-typst" data-lang="typst"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;#import&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;@preview/codelst:2.0.2&amp;#34;&lt;/span&gt;: sourcecode
&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 style="color:#e6db74"&gt;&amp;#34;@preview/polylux:0.4.0&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&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;#let&lt;/span&gt; blue &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;rgb&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;#282a36&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;#let&lt;/span&gt; white &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;rgb&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;#f8f8f2&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;#let&lt;/span&gt; pink &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;rgb&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;#ff79c6&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;#let&lt;/span&gt; purple &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;rgb&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;#bd93f9&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;#let&lt;/span&gt; orange &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;rgb&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;#ffb86c&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;#let&lt;/span&gt; green &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;rgb&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;#50fa7b&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;#let&lt;/span&gt; gray &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;rgb&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;#6272a4&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;#let&lt;/span&gt; slide-title-header &lt;span style="color:#f92672"&gt;=&lt;/span&gt; toolbox.&lt;span style="color:#a6e22e"&gt;next-heading&lt;/span&gt;(h &lt;span style="color:#f92672"&gt;=&amp;gt;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; show: toolbox.full-width-block.&lt;span style="color:#a6e22e"&gt;with&lt;/span&gt;(fill: blue, inset: &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;em&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;set&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;text&lt;/span&gt;(fill: purple, size: &lt;span style="color:#ae81ff"&gt;1.2&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;em&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;strong&lt;/span&gt;(h)
&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;#let&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;the-footer&lt;/span&gt;(content) &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;set&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;text&lt;/span&gt;(size: &lt;span style="color:#ae81ff"&gt;0.8&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;em&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; show: pad.&lt;span style="color:#a6e22e"&gt;with&lt;/span&gt;(.&lt;span style="color:#ae81ff"&gt;5&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;em&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;set&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;align&lt;/span&gt;(bottom)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; context &lt;span style="color:#a6e22e"&gt;text&lt;/span&gt;(fill: white.&lt;span style="color:#a6e22e"&gt;lighten&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;40&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;%&lt;/span&gt;), content)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;h&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;fr&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;#let&lt;/span&gt; outline &lt;span style="color:#f92672"&gt;=&lt;/span&gt; toolbox.&lt;span style="color:#a6e22e"&gt;all-sections&lt;/span&gt;((sections, _current) &lt;span style="color:#f92672"&gt;=&amp;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;enum&lt;/span&gt;(tight: &lt;span style="color:#66d9ef"&gt;false&lt;/span&gt;, ..sections)
&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;#let&lt;/span&gt; progress-bar &lt;span style="color:#f92672"&gt;=&lt;/span&gt; toolbox.&lt;span style="color:#a6e22e"&gt;progress-ratio&lt;/span&gt;(ratio &lt;span style="color:#f92672"&gt;=&amp;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;set&lt;/span&gt; grid.&lt;span style="color:#a6e22e"&gt;cell&lt;/span&gt;(inset: (y: .&lt;span style="color:#ae81ff"&gt;03&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;em&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;grid&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; columns: (ratio &lt;span style="color:#f92672"&gt;*&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;100&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;%&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;fr&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; grid.&lt;span style="color:#a6e22e"&gt;cell&lt;/span&gt;(fill: pink)[],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; grid.&lt;span style="color:#a6e22e"&gt;cell&lt;/span&gt;(fill: purple)[],
&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&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;#let&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;new-section&lt;/span&gt;(name) &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;slide&lt;/span&gt;({
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;set&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;page&lt;/span&gt;(header: &lt;span style="color:#66d9ef"&gt;none&lt;/span&gt;, footer: &lt;span style="color:#66d9ef"&gt;none&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; show: pad.&lt;span style="color:#a6e22e"&gt;with&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;20&lt;/span&gt;&lt;span style="color:#66d9ef"&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;set&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;text&lt;/span&gt;(size: &lt;span style="color:#ae81ff"&gt;1.5&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;em&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; name
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; toolbox.&lt;span style="color:#a6e22e"&gt;register-section&lt;/span&gt;(name)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; progress-bar
&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;#let&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;focus&lt;/span&gt;(body) &lt;span style="color:#f92672"&gt;=&lt;/span&gt; context {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;set&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;page&lt;/span&gt;(header: &lt;span style="color:#66d9ef"&gt;none&lt;/span&gt;, footer: &lt;span style="color:#66d9ef"&gt;none&lt;/span&gt;, fill: blue, margin: &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;em&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;set&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;text&lt;/span&gt;(fill: orange, size: &lt;span style="color:#ae81ff"&gt;1.5&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;em&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;set&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;align&lt;/span&gt;(center)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; body
&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;#let&lt;/span&gt; divider &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;line&lt;/span&gt;(length: &lt;span style="color:#ae81ff"&gt;100&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;%&lt;/span&gt;, stroke: .&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;em&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; pink)
&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;#let&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;setup&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; footer: &lt;span style="color:#66d9ef"&gt;none&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; text-font: &lt;span style="color:#e6db74"&gt;&amp;#34;Migu&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; math-font: &lt;span style="color:#e6db74"&gt;&amp;#34;Fira Math&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; code-font: &lt;span style="color:#e6db74"&gt;&amp;#34;Fira Code&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; text-size: &lt;span style="color:#ae81ff"&gt;23&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;pt&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; body,
&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:#66d9ef"&gt;set&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;raw&lt;/span&gt;(theme: &lt;span style="color:#e6db74"&gt;&amp;#34;./Dracula.tmTheme&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;set&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;page&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; paper: &lt;span style="color:#e6db74"&gt;&amp;#34;presentation-16-9&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; fill: blue,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; margin: (rest: &lt;span style="color:#ae81ff"&gt;4&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;em&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; footer: &lt;span style="color:#a6e22e"&gt;the-footer&lt;/span&gt;(footer),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; header: slide-title-header,
&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;set&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;text&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; font: text-font,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; size: text-size,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; fill: white,
&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;set&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;strong&lt;/span&gt;(delta: &lt;span style="color:#ae81ff"&gt;100&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;show&lt;/span&gt; math.equation: &lt;span style="color:#66d9ef"&gt;set&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;text&lt;/span&gt;(font: math-font)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;show&lt;/span&gt; raw: &lt;span style="color:#66d9ef"&gt;set&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;text&lt;/span&gt;(font: code-font)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;set&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;align&lt;/span&gt;(horizon)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;show&lt;/span&gt; emph: it &lt;span style="color:#f92672"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;text&lt;/span&gt;(fill: pink, it.body)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;show&lt;/span&gt; heading.&lt;span style="color:#a6e22e"&gt;where&lt;/span&gt;(level: &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;): _ &lt;span style="color:#f92672"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;none&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; body
&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;h3 id="2-dot-flake-dot-nixでbuildする"&gt;2. flake.nixでBuildする&lt;/h3&gt;
&lt;p&gt;以下抜粋。
&lt;a href="https://github.com/takeokunn/blog/blob/d7501711936b11d3f53c312c2775e20faab35602/typst/flake.nix"&gt;https://github.com/takeokunn/blog/blob/d7501711936b11d3f53c312c2775e20faab35602/typst/flake.nix&lt;/a&gt;&lt;/p&gt;</description></item><item><title>nixpkgsのunstableでEmacs Nativecomp Buildができない問題とワークアラウンド</title><link>https://www.takeokunn.org/posts/fleeting/20250417001805-emacs_nativecomp_bulid_error_nixpkgs_and_workaround/</link><pubDate>Thu, 17 Apr 2025 00:00:00 +0000</pubDate><guid>https://www.takeokunn.org/posts/fleeting/20250417001805-emacs_nativecomp_bulid_error_nixpkgs_and_workaround/</guid><description>&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;2025年4月16日現在、 &lt;code&gt;aarch64-darwin&lt;/code&gt; 環境でnixpkgs unstableのemacs（nativecomp）をビルドできない問題が発生している。&lt;/p&gt;
&lt;h2 id="ワークアラウンド方法"&gt;ワークアラウンド方法&lt;/h2&gt;
&lt;p&gt;packageに &lt;code&gt;withNativeCompilation = false;&lt;/code&gt; を書く。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/NixOS/nixpkgs/blob/e51f02babf0ecf7d66e081917e609ae2c3d43ef2/pkgs/applications/editors/emacs/make-emacs.nix#L69"&gt;https://github.com/NixOS/nixpkgs/blob/e51f02babf0ecf7d66e081917e609ae2c3d43ef2/pkgs/applications/editors/emacs/make-emacs.nix#L69&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;home-managerをoverlayする場合:&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-nix" data-lang="nix"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{ emacs-overlay }:
&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; emacs-overlay)
&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:#75715e"&gt;# bug: https://github.com/NixOS/nixpkgs/issues/395169&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; (final: prev: {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; emacs &lt;span style="color:#f92672"&gt;=&lt;/span&gt; prev&lt;span style="color:#f92672"&gt;.&lt;/span&gt;emacs&lt;span style="color:#f92672"&gt;.&lt;/span&gt;override {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; withNativeCompilation &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;false&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; emacs-unstable &lt;span style="color:#f92672"&gt;=&lt;/span&gt; prev&lt;span style="color:#f92672"&gt;.&lt;/span&gt;emacs-unstable&lt;span style="color:#f92672"&gt;.&lt;/span&gt;override {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; withNativeCompilation &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;false&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; emacs-git &lt;span style="color:#f92672"&gt;=&lt;/span&gt; prev&lt;span style="color:#f92672"&gt;.&lt;/span&gt;emacs-git&lt;span style="color:#f92672"&gt;.&lt;/span&gt;override {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; withNativeCompilation &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;false&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&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;pkgsをoverrideする場合:&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-nix" data-lang="nix"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{ pkgs }:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;pkgs&lt;span style="color:#f92672"&gt;.&lt;/span&gt;emacs&lt;span style="color:#f92672"&gt;.&lt;/span&gt;override {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; withNativeCompilation &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;false&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;h2 id="原因"&gt;原因&lt;/h2&gt;
&lt;p&gt;「emacs: fails to launch on macOS Sequoia 15.4 #395169」に纏まってる。
&lt;a href="https://github.com/NixOS/nixpkgs/issues/395169"&gt;https://github.com/NixOS/nixpkgs/issues/395169&lt;/a&gt;&lt;/p&gt;</description></item><item><title>credential管理をorg-encryptからpassword-storeに移行した</title><link>https://www.takeokunn.org/posts/fleeting/20250414001634-migrate_credential_manager_to_password_store/</link><pubDate>Mon, 14 Apr 2025 00:00:00 +0000</pubDate><guid>https://www.takeokunn.org/posts/fleeting/20250414001634-migrate_credential_manager_to_password_store/</guid><description>&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;credential管理をorg-encryptからpassword-storeに移行したので作業内容をメモしておく。&lt;/p&gt;
&lt;h2 id="現状の運用と問題"&gt;現状の運用と問題&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://www.takeokunn.org/posts/fleeting/20250127144907-my_usage_org_crypt/"&gt;org-crypt運用メモ&lt;/a&gt; に書いたとおり、 &lt;code&gt;~/.aws/credentials&lt;/code&gt; のような秘匿情報を &lt;code&gt;secret.org&lt;/code&gt; を &lt;code&gt;org-babel-tangle&lt;/code&gt; して出力していた。&lt;/p&gt;
&lt;p&gt;次のように &lt;code&gt;org-decrypt-entries&lt;/code&gt; と &lt;code&gt;org-encrypt-entries&lt;/code&gt; をadviceして対応していたのだが、&lt;a href="https://github.com/AntonHakansson/org-nix-shell"&gt;org-nix-shell&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-emacs-lisp" data-lang="emacs-lisp"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;(advice-add &lt;span style="color:#e6db74"&gt;&amp;#39;org-babel-tangle&lt;/span&gt; :before &lt;span style="color:#a6e22e"&gt;#&amp;#39;&lt;/span&gt;org-decrypt-entries)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;(advice-add &lt;span style="color:#e6db74"&gt;&amp;#39;org-babel-tangle&lt;/span&gt; :after &lt;span style="color:#a6e22e"&gt;#&amp;#39;&lt;/span&gt;org-encrypt-entries)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;a href="https://github.com/astahlman/ob-async"&gt;ob-async&lt;/a&gt; を有効にした時も&lt;a href="https://github.com/AntonHakansson/org-nix-shell"&gt;org-nix-shell&lt;/a&gt;が実行できなくなってしまったので、 &lt;code&gt;advice-add&lt;/code&gt; をすると問題が起きるのかもしれない。（要検証）
&lt;a href="https://www.takeokunn.org/posts/fleeting/20250126140928-introduction_org_nix_shell/"&gt;org-nix-shell入門&lt;/a&gt; にも書いたが、&lt;a href="https://github.com/AntonHakansson/org-nix-shell"&gt;org-nix-shell&lt;/a&gt;はキラーアプリケーションなので消す訳にはいかない。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;M-x org-encrypt-entries&lt;/code&gt; を手動で実行する運用にしていたが、うっかり叩き忘れたままcommitを何度かしてしまった。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/newren/git-filter-repo"&gt;newren/git-filter-repo&lt;/a&gt;などを使ってcommit hisotryから消したが面倒だった。&lt;/p&gt;
&lt;p&gt;また、&lt;a href="https://www.takeokunn.org/posts/fleeting/20250409210655-introduction_mcp_servers_nix/"&gt;mcp-servers-nixを導入した&lt;/a&gt;時点では実装されてなかったが、&lt;a href="https://github.com/natsukium/mcp-servers-nix"&gt;mcp-servers-nix&lt;/a&gt; は &lt;code&gt;passwordCommand&lt;/code&gt; をサポートしてくれた。
よい機会なのでpassword-store管理に移行にすることにした。&lt;/p&gt;
&lt;h2 id="作業手順"&gt;作業手順&lt;/h2&gt;
&lt;h3 id="1-dot-既存のorg-encryptしてた鍵情報をpassword-store管理下に移行"&gt;1. 既存のorg-encryptしてた鍵情報をpassword-store管理下に移行&lt;/h3&gt;
&lt;p&gt;次のように秘密鍵をpassコマンドで検索できるようにする。&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-console" data-lang="console"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;pass show gemini/private
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="2-dot-org-babel-templateを作成"&gt;2. org-babel templateを作成&lt;/h3&gt;
&lt;p&gt;passコマンドをwrapするコマンドを用意する。&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-org" data-lang="org"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#+name&lt;/span&gt;&lt;span style="color:#75715e"&gt;: pass&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#+begin_src &lt;/span&gt;&lt;span style="color:#75715e"&gt;emacs-lisp&lt;/span&gt;&lt;span style="color:#75715e"&gt; :var id=&amp;#34;&amp;#34; :results value raw
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt; (string-trim (shell-command-to-string (&lt;span style="color:#a6e22e"&gt;format&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;pass show %s&amp;#34;&lt;/span&gt; id)))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#+end_src&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="3-dot-各秘密鍵に埋め込み"&gt;3. 各秘密鍵に埋め込み&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;:noweb yes&lt;/code&gt; で関数を実行できるようにする。
&lt;code&gt;M-x org-babel-tangle&lt;/code&gt; を実行すると、秘密鍵の入った状態で &lt;code&gt;~/.aider.conf.yml&lt;/code&gt; が出力される。&lt;/p&gt;</description></item><item><title>emacsでuniversal-ctagsを使う</title><link>https://www.takeokunn.org/posts/fleeting/20250410002747-use_universal_ctags_with_emacs/</link><pubDate>Wed, 09 Apr 2025 00:00:00 +0000</pubDate><guid>https://www.takeokunn.org/posts/fleeting/20250410002747-use_universal_ctags_with_emacs/</guid><description>&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://github.com/universal-ctags/ctags"&gt;universal-ctags/ctags&lt;/a&gt; の検証をしたのでメモしておく。&lt;/p&gt;
&lt;h2 id="概要"&gt;概要&lt;/h2&gt;
&lt;p&gt;Wikipedia的には以下。
&lt;a href="https://ja.wikipedia.org/wiki/Ctags"&gt;https://ja.wikipedia.org/wiki/Ctags&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Ctags（英: Ctags）はソース及びヘッダ内にある名前のインデックス（又はタグ）ファイルを生成するプログラム。様々なプログラミング言語に対応している。言語に依存するが、サブルーチン(関数)、変数、クラスのメンバ、マクロ等がインデックス化される。これらのタグによりテキストエディタなどのツールで高速かつ容易に定義を参照できる。相互参照ファイルを出力でき、また名前についての情報を人が読みやすい形で列挙した言語ファイルを生成することもできる。&lt;/p&gt;
&lt;p&gt;Ctagsはケン・アーノルドがBSD Unix用に開発した。後にJim KlecknerによりFortranがサポートされ、ビル・ジョイによりPascalがサポートされた。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;universal-ctagsは「A maintained ctags implementation」と自称しているとおり、2025年4月現在も活発にメンテナンスされている。
&lt;a href="https://github.com/universal-ctags/ctags"&gt;https://github.com/universal-ctags/ctags&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="universal-ctags使い方"&gt;universal-ctags使い方&lt;/h2&gt;
&lt;p&gt;Nix経由なら簡単に実行できる。
&lt;a href="https://search.nixos.org/packages?channel=24.11&amp;amp;show=universal-ctags&amp;amp;from=0&amp;amp;size=50&amp;amp;sort=relevance&amp;amp;type=packages&amp;amp;query=universal-ctags"&gt;https://search.nixos.org/packages?channel=24.11&amp;show=universal-ctags&amp;from=0&amp;size=50&amp;sort=relevance&amp;type=packages&amp;query=universal-ctags&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-console" data-lang="console"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ nix run nixpkgs#universal-ctags -- --version
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;&lt;/span&gt;Universal Ctags 6.1.0, Copyright (C) 2015-2023 Universal Ctags Team
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Universal Ctags is derived from Exuberant Ctags.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Exuberant Ctags 5.8, Copyright (C) 1996-2009 Darren Hiebert
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; URL: https://ctags.io/
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Output version: 0.0
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Optional compiled features: +wildcards, +regex, +gnulib_fnmatch, +gnulib_regex, +iconv, +option-directory, +xpath, +json, +interactive, +yaml, +case-insensitive-filenames, +packcc, +optscript, +pcre2
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;PHPプロジェクトである &lt;a href="https://github.com/bobthecow/psysh"&gt;bobthecow/psysh&lt;/a&gt; を例に &lt;code&gt;TAGS&lt;/code&gt; を生成する。&lt;/p&gt;</description></item><item><title>mcp-servers-nixを導入した</title><link>https://www.takeokunn.org/posts/fleeting/20250409210655-introduction_mcp_servers_nix/</link><pubDate>Wed, 09 Apr 2025 00:00:00 +0000</pubDate><guid>https://www.takeokunn.org/posts/fleeting/20250409210655-introduction_mcp_servers_nix/</guid><description>&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;natsukium謹製の &lt;a href="https://github.com/natsukium/mcp-servers-nix"&gt;natsukium/mcp-servers-nix&lt;/a&gt; を &lt;a href="https://github.com/takeokunn/nixos-configuration"&gt;takeokunn/nixos-configuration&lt;/a&gt; に導入したのでメモしておく。&lt;/p&gt;
&lt;h2 id="変更点"&gt;変更点&lt;/h2&gt;
&lt;h3 id="before"&gt;Before&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Orgファイルから &lt;code&gt;org-babel-tangle&lt;/code&gt; で &lt;code&gt;~/Library/Application\ Support/Claude/claude_desktop_config.json&lt;/code&gt; を出力&lt;/li&gt;
&lt;li&gt;必要なpackageは &lt;a href="https://github.com/svanderburg/node2nix"&gt;node2nix&lt;/a&gt; 経由で入れる&lt;/li&gt;
&lt;li&gt;秘密鍵はOrgファイルで &lt;code&gt;org-encrypt&lt;/code&gt; して管理
&lt;ul&gt;
&lt;li&gt;ref. &lt;a href="https://www.takeokunn.org/posts/fleeting/20250127144907-my_usage_org_crypt/"&gt;org-crypt運用メモ&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="after"&gt;After&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/natsukium/mcp-servers-nix"&gt;natsukium/mcp-servers-nix&lt;/a&gt; からMCPに必要なものをjsonを出力&lt;/li&gt;
&lt;li&gt;必要なpackageは大体 &lt;a href="https://github.com/natsukium/mcp-servers-nix"&gt;natsukium/mcp-servers-nix&lt;/a&gt; に同梱されてる
&lt;ul&gt;
&lt;li&gt;足りないものは &lt;a href="https://github.com/svanderburg/node2nix"&gt;node2nix&lt;/a&gt; 経由で入れる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;秘密鍵は &lt;a href="https://github.com/Mic92/sops-nix"&gt;sops-nix&lt;/a&gt; で管理&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="作業内容"&gt;作業内容&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://zenn.dev/natsukium/articles/f010c1ec1c51b2"&gt;MCPサーバーの設定をセキュアでGit friendlyにする - Zenn&lt;/a&gt; を事前に読む。&lt;/p&gt;
&lt;h3 id="1-dot-sops-nixに登録"&gt;1. sops-nixに登録&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;sops/password.yml&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-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;brave-api-token&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;BRAVE_API_KEY=xxxx&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;sops/default.nix&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-nix" data-lang="nix"&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; sops &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; defaultSopsFile &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;./password.yaml&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; secrets &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; brave-api-token &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&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="2-dot-mcp-serversを記述する"&gt;2. mcp-serversを記述する&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;envFile = config.sops.secrets.brave-api-token.path;&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-nix" data-lang="nix"&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; pkgs&lt;span style="color:#f92672"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; config&lt;span style="color:#f92672"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; mcp-servers-nix&lt;span style="color:#f92672"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; nodePkgs&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&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;let&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; programs &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; fetch&lt;span style="color:#f92672"&gt;.&lt;/span&gt;enable &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; playwright&lt;span style="color:#f92672"&gt;.&lt;/span&gt;enable &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; brave-search &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; enable &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; envFile &lt;span style="color:#f92672"&gt;=&lt;/span&gt; config&lt;span style="color:#f92672"&gt;.&lt;/span&gt;sops&lt;span style="color:#f92672"&gt;.&lt;/span&gt;secrets&lt;span style="color:#f92672"&gt;.&lt;/span&gt;brave-api-token&lt;span style="color:#f92672"&gt;.&lt;/span&gt;path;
&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;in&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; home&lt;span style="color:#f92672"&gt;.&lt;/span&gt;file&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;Library/Application&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;\ &lt;/span&gt;&lt;span style="color:#e6db74"&gt;Support/Claude/claude_desktop_config.json&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; source &lt;span style="color:#f92672"&gt;=&lt;/span&gt; mcp-servers-nix&lt;span style="color:#f92672"&gt;.&lt;/span&gt;lib&lt;span style="color:#f92672"&gt;.&lt;/span&gt;mkConfig pkgs {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;inherit&lt;/span&gt; programs;
&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&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;h3 id="3-dot-home-managerに組込み"&gt;3. home-managerに組込み&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;home-manager/advanced.nix&lt;/code&gt; で &lt;code&gt;imports&lt;/code&gt; で登録すればよい。&lt;/p&gt;</description></item><item><title>BitwardenとAuthyのアカウントを削除した</title><link>https://www.takeokunn.org/posts/fleeting/20250408134929-archive_bitwarden_account/</link><pubDate>Tue, 08 Apr 2025 00:00:00 +0000</pubDate><guid>https://www.takeokunn.org/posts/fleeting/20250408134929-archive_bitwarden_account/</guid><description>&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://www.takeokunn.org/posts/fleeting/20240108211345-migrate_bitwarden_to_password_store/"&gt;Bitwardenからpassword-storeに移行した&lt;/a&gt; でBitwardenから離れて1年以上経った。
当初はBitwardenにしかない情報もあったのでを開くこともあったが、今になっては使うことがなくなったのでアカウントを完全に削除する。&lt;/p&gt;
&lt;p&gt;また、&lt;a href="https://www.takeokunn.org/posts/fleeting/20240110123142-migrate_authy_to_password_store_otp/"&gt;Authyからpassword-store-otpに移行した&lt;/a&gt;でAuthyも使わなくなったのでついでに削除する。&lt;/p&gt;
&lt;h2 id="作業手順"&gt;作業手順&lt;/h2&gt;
&lt;h3 id="1-dot-bitwarden"&gt;1. Bitwarden&lt;/h3&gt;
&lt;p&gt;公式ドキュメントを参考に削除する。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://bitwarden.com/ja-jp/help/delete-your-account/"&gt;https://bitwarden.com/ja-jp/help/delete-your-account/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;「個人のアカウントを削除します &amp;gt; アカウントを削除」で特に警告も出ずにサクっと消えた。&lt;/p&gt;
&lt;figure&gt;&lt;img src="https://www.takeokunn.org/images/F156CC55-0D2F-4F33-9B11-DD831588D5A7.png"&gt;
&lt;/figure&gt;
&lt;h3 id="2-dot-authy"&gt;2. Authy&lt;/h3&gt;
&lt;p&gt;公式の削除動線を辿って確認メールを踏んで削除する。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.authy.com/account/delete/"&gt;https://www.authy.com/account/delete/&lt;/a&gt;&lt;/p&gt;
&lt;figure&gt;&lt;img src="https://www.takeokunn.org/images/9AE8AD89-1FE5-4218-8EF8-0F31B915EF11.png"&gt;
&lt;/figure&gt;
&lt;h2 id="終わりに"&gt;終わりに&lt;/h2&gt;
&lt;p&gt;BitwardenもAuthyも駆け出しエンジニアの頃から使ってたので思い入れのあるツールだった。
10年間ありがとう。&lt;/p&gt;</description></item><item><title>Denoで簡易的なCLIツールを作る</title><link>https://www.takeokunn.org/posts/fleeting/20250403212205-deno_cli_sandbox/</link><pubDate>Thu, 03 Apr 2025 00:00:00 +0000</pubDate><guid>https://www.takeokunn.org/posts/fleeting/20250403212205-deno_cli_sandbox/</guid><description>&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;DenoでCLIツールを試験的に作ったのでメモしておく。&lt;/p&gt;
&lt;h2 id="方針"&gt;方針&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://cliffy.io/"&gt;cliffy&lt;/a&gt; で作成&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cat&lt;/code&gt; と &lt;code&gt;grep&lt;/code&gt; をSub Commandで簡易的に作成&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="ディレクトリ構造"&gt;ディレクトリ構造&lt;/h2&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-console" data-lang="console"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ nix run nixpkgs#tree .
&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;├── deno.json
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;├── deno.lock
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;└── src
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ├── commands
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; │   ├── cat.ts
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; │   └── grep.ts
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ├── deps.ts
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; └── main.ts
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;&lt;/span&gt;3 directories, 6 files
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="作業手順"&gt;作業手順&lt;/h2&gt;
&lt;h3 id="1-dot-依存関係をインストール"&gt;1. 依存関係をインストール&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;$ deno install&lt;/code&gt; で入れて使い易いように &lt;code&gt;src/deps.ts&lt;/code&gt; を用意する&lt;/p&gt;
&lt;p&gt;&lt;code&gt;deno.json&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-json" data-lang="json"&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;&amp;#34;imports&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;&amp;#34;@cliffy/command&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;jsr:@cliffy/command@^1.0.0-rc.7&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;src/deps.ts&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-typescript" data-lang="typescript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;export&lt;/span&gt; { &lt;span style="color:#a6e22e"&gt;Command&lt;/span&gt; } &lt;span style="color:#66d9ef"&gt;from&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;@cliffy/command&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="2-dot-command作成"&gt;2. Command作成&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-typescript" data-lang="typescript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;import&lt;/span&gt; { &lt;span style="color:#a6e22e"&gt;Command&lt;/span&gt; } &lt;span style="color:#66d9ef"&gt;from&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;./deps.ts&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;import&lt;/span&gt; { &lt;span style="color:#a6e22e"&gt;catCommand&lt;/span&gt; } &lt;span style="color:#66d9ef"&gt;from&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;./commands/cat.ts&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;import&lt;/span&gt; { &lt;span style="color:#a6e22e"&gt;grepCommand&lt;/span&gt; } &lt;span style="color:#66d9ef"&gt;from&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;./commands/grep.ts&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;&lt;span style="color:#66d9ef"&gt;await&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Command&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;name&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;mycli&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;version&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;0.1.0&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;description&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;My CLI tool&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;command&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;cat&amp;#39;&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;catCommand&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;command&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;grep&amp;#39;&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;grepCommand&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;parse&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;Deno&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;args&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="3-dot-sub-command"&gt;3. Sub Command&lt;/h3&gt;
&lt;h4 id="3-dot-1-cat"&gt;3.1 cat&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-typescript" data-lang="typescript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;import&lt;/span&gt; { &lt;span style="color:#a6e22e"&gt;Command&lt;/span&gt; } &lt;span style="color:#66d9ef"&gt;from&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;../deps.ts&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;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;displayFiles&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;async&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;files&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;string&lt;/span&gt;[])&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Promise&lt;/span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;void&lt;/span&gt;&amp;gt; &lt;span style="color:#f92672"&gt;=&amp;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; (&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;file&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;of&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;files&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;try&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;content&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;await&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Deno&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;readTextFile&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;file&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;`--- &lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;file&lt;/span&gt;&lt;span style="color:#e6db74"&gt;}&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:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;content&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; } &lt;span style="color:#66d9ef"&gt;catch&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;err&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:#a6e22e"&gt;err&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;instanceof&lt;/span&gt; Error) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;error&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;`Error reading &lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;file&lt;/span&gt;&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;: &lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;err&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;message&lt;/span&gt;&lt;span style="color:#e6db74"&gt;}&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;else&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;error&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;`Unknown error:`&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;err&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&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;export&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;catCommand&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Command&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;name&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;cat&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;description&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;Display content of files&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;arguments&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;&amp;lt;files...&amp;gt;&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;action&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;async&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;_&lt;/span&gt;, ...&lt;span style="color:#a6e22e"&gt;files&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;string&lt;/span&gt;[]) &lt;span style="color:#f92672"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;await&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;displayFiles&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;files&lt;/span&gt;));
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="3-dot-2-grep"&gt;3.2 grep&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-typescript" data-lang="typescript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;import&lt;/span&gt; { &lt;span style="color:#a6e22e"&gt;Command&lt;/span&gt; } &lt;span style="color:#66d9ef"&gt;from&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;../deps.ts&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;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;grepFiles&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;async&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;pattern&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;string&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;files&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;string&lt;/span&gt;[])&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Promise&lt;/span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;void&lt;/span&gt;&amp;gt; &lt;span style="color:#f92672"&gt;=&amp;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;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;regex&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; RegExp(&lt;span style="color:#a6e22e"&gt;pattern&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;g&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; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;file&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;of&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;files&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;try&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;content&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;await&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Deno&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;readTextFile&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;file&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;lines&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;content&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;split&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;\n&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;matchFound&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;false&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;for&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;let&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:#ae81ff"&gt;0&lt;/span&gt;; &lt;span style="color:#a6e22e"&gt;i&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;lines&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;length&lt;/span&gt;; &lt;span style="color:#a6e22e"&gt;i&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;if&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;regex&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;test&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;lines&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:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#f92672"&gt;!&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;matchFound&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;`&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;\&lt;/span&gt;&lt;span style="color:#e6db74"&gt;n--- &lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;file&lt;/span&gt;&lt;span style="color:#e6db74"&gt;}&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:#a6e22e"&gt;matchFound&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;true&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;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;`&lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;i&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;: &lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;lines&lt;/span&gt;[&lt;span style="color:#a6e22e"&gt;i&lt;/span&gt;]&lt;span style="color:#e6db74"&gt;}&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:#a6e22e"&gt;regex&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;lastIndex&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;; &lt;span style="color:#75715e"&gt;// Reset regex for next test
&lt;/span&gt;&lt;/span&gt;&lt;/span&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; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; } &lt;span style="color:#66d9ef"&gt;catch&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;err&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:#a6e22e"&gt;err&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;instanceof&lt;/span&gt; Error) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;error&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;`Error reading &lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;file&lt;/span&gt;&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;: &lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;err&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;message&lt;/span&gt;&lt;span style="color:#e6db74"&gt;}&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;else&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;error&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;`Unknown error:`&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;err&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&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;export&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;grepCommand&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Command&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;name&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;grep&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;description&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;Search for pattern in files&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;arguments&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;&amp;lt;pattern&amp;gt; &amp;lt;files...&amp;gt;&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;action&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;async&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;_&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;pattern&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;string&lt;/span&gt;, ...&lt;span style="color:#a6e22e"&gt;files&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;string&lt;/span&gt;[]) &lt;span style="color:#f92672"&gt;=&amp;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;await&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;grepFiles&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;pattern&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;files&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;h3 id="4-dot-command実行"&gt;4. Command実行&lt;/h3&gt;
&lt;h4 id="4-dot-1-cat"&gt;4.1 cat&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-console" data-lang="console"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ deno run --allow-read src/main.ts cat deno.json src/deps.ts
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;--- deno.json ---
&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; &amp;#34;imports&amp;#34;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;#34;@cliffy/command&amp;#34;: &amp;#34;jsr:@cliffy/command@^1.0.0-rc.7&amp;#34;
&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:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;&lt;/span&gt;--- src/deps.ts ---
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;export { Command } from &amp;#39;@cliffy/command&amp;#39;;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="4-dot-2-grep"&gt;4.2 grep&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-console" data-lang="console"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ deno run --allow-read src/main.ts grep &lt;span style="color:#e6db74"&gt;&amp;#34;command&amp;#34;&lt;/span&gt; deno.json src/main.ts
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;&lt;/span&gt;--- deno.json ---
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;3: &amp;#34;@cliffy/command&amp;#34;: &amp;#34;jsr:@cliffy/command@^1.0.0-rc.7&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;&lt;/span&gt;--- src/main.ts ---
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2: import { catCommand } from &amp;#39;./commands/cat.ts&amp;#39;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;3: import { grepCommand } from &amp;#39;./commands/grep.ts&amp;#39;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;9: .command(&amp;#39;cat&amp;#39;, catCommand)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;10: .command(&amp;#39;grep&amp;#39;, grepCommand)
&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;TypeScriptで記述できるのはnpmの資産が使えて便利だし、cliffyも使い勝手が非常によい。&lt;/p&gt;</description></item><item><title>flake.nixでポータブルな最小構成のEmacsを作成する</title><link>https://www.takeokunn.org/posts/fleeting/20250403230709-portable_minimal_emacs_with_flake_nix/</link><pubDate>Thu, 03 Apr 2025 00:00:00 +0000</pubDate><guid>https://www.takeokunn.org/posts/fleeting/20250403230709-portable_minimal_emacs_with_flake_nix/</guid><description>&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;「任意のEmacs Packageが動かない」がおま環かバグかというのを切り分けることは非常に重要。
誰でも同じ環境を整えられるようにすると問題解決が捗るので構築方法をメモしておく。&lt;/p&gt;
&lt;h2 id="作業手順"&gt;作業手順&lt;/h2&gt;
&lt;h3 id="1-dot-init-dot-el作成"&gt;1. init.el作成&lt;/h3&gt;
&lt;p&gt;今回のサンプルは&lt;a href="https://melpa.org/#/rainbow-delimiters"&gt;rainbow-delimiters&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-emacs-lisp" data-lang="emacs-lisp"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;(use-package rainbow-delimiters
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; :ensure &lt;span style="color:#66d9ef"&gt;t&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; :hook
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; (prog-mode-hook &lt;span style="color:#f92672"&gt;.&lt;/span&gt; rainbow-delimiters-mode))
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="2-dot-flake-dot-nix作成"&gt;2. flake.nix作成&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;alwaysEnsure = true;&lt;/code&gt; にすると &lt;code&gt;init.el&lt;/code&gt; 内の &lt;code&gt;:ensure t&lt;/code&gt; を読んでNix Build時によしなにインストールしてくれる。&lt;/p&gt;
&lt;p&gt;また、&lt;a href="https://github.com/nix-community/emacs-overlay"&gt;emacs-overlay&lt;/a&gt; を使うと &lt;code&gt;unstable/stable/head&lt;/code&gt; など複数バージョンで実行できるので検証の幅を簡単に広げられる。
&lt;a href="https://github.com/nix-community/emacs-overlay/blob/master/overlays/emacs.nix"&gt;https://github.com/nix-community/emacs-overlay/blob/master/overlays/emacs.nix&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-nix" data-lang="nix"&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; inputs &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; nixpkgs&lt;span style="color:#f92672"&gt;.&lt;/span&gt;url &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;github:NixOS/nixpkgs/nixpkgs-unstable&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; emacs-overlay &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; url &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;github:nix-community/emacs-overlay&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; inputs&lt;span style="color:#f92672"&gt;.&lt;/span&gt;nixpkgs&lt;span style="color:#f92672"&gt;.&lt;/span&gt;follows &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;nixpkgs&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&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; outputs &lt;span style="color:#f92672"&gt;=&lt;/span&gt; { self&lt;span style="color:#f92672"&gt;,&lt;/span&gt; nixpkgs&lt;span style="color:#f92672"&gt;,&lt;/span&gt; emacs-overlay }:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;let&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; system &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;aarch64-darwin&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; pkgs &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#f92672"&gt;import&lt;/span&gt; nixpkgs {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;inherit&lt;/span&gt; system;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; overlays &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [ emacs-overlay&lt;span style="color:#f92672"&gt;.&lt;/span&gt;overlay ];
&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; emacs &lt;span style="color:#f92672"&gt;=&lt;/span&gt; pkgs&lt;span style="color:#f92672"&gt;.&lt;/span&gt;emacsWithPackagesFromUsePackage {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; config &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;./init.el&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; package &lt;span style="color:#f92672"&gt;=&lt;/span&gt; pkgs&lt;span style="color:#f92672"&gt;.&lt;/span&gt;emacs-unstable;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; alwaysEnsure &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;true&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;in&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; packages&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;system&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;default &lt;span style="color:#f92672"&gt;=&lt;/span&gt; emacs;
&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="3-dot-nix-buildして実行"&gt;3. Nix Buildして実行&lt;/h3&gt;
&lt;p&gt;Localに一切依存しない形でEmacsをBuildできる。&lt;/p&gt;</description></item><item><title>お名前comからCloudflareにドメイン移管してTerraformで管理する</title><link>https://www.takeokunn.org/posts/fleeting/20250403220528-migrate_onamae_to_cloudflare_and_managed_by_terraform/</link><pubDate>Thu, 03 Apr 2025 00:00:00 +0000</pubDate><guid>https://www.takeokunn.org/posts/fleeting/20250403220528-migrate_onamae_to_cloudflare_and_managed_by_terraform/</guid><description>&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;お名前comで管理していた &lt;code&gt;takeokunn.org&lt;/code&gt; をCloudflareに移管したのでメモしておく。&lt;/p&gt;
&lt;h2 id="background"&gt;Background&lt;/h2&gt;
&lt;p&gt;お名前comには世の中のエンジニアと同じように、長年次の不満を抱えていた。&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;IaCに対応していない&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;vim-jpで令和時代にドメインを管理するならCloudflare一択という意見をもらったので移管した。&lt;/p&gt;
&lt;h2 id="作業手順"&gt;作業手順&lt;/h2&gt;
&lt;p&gt;ドメインの移管はじめてだったこと、個人ドメインであることからダウンタイムが発生許容した。
2と3を入れ替えればダウンタイムが発生しなかったかもしれない。&lt;/p&gt;
&lt;h3 id="1-dot-cloudflareにアカウントを作成する"&gt;1. Cloudflareにアカウントを作成する&lt;/h3&gt;
&lt;p&gt;公式サイトから新規登録をしてクレジットカードを登録する。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.cloudflare.com/ja-jp/"&gt;https://www.cloudflare.com/ja-jp/&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="2-dot-お名前comからcloudflareに移管する"&gt;2. お名前comからCloudflareに移管する&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://zenn.dev/muchoco/articles/9039762136e15c"&gt;お名前.com から Cloudflare Registrar にドメイン移管した話 - Zenn&lt;/a&gt; を参考に移管した。&lt;/p&gt;
&lt;p&gt;「トランスファー申請の承認」が15分以上かかったがいずれ来るので気長に待てばよい。&lt;/p&gt;
&lt;h3 id="3-dot-terraformで管理する"&gt;3. Terraformで管理する&lt;/h3&gt;
&lt;p&gt;Terraform Cloudflare Providerを使う。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs"&gt;https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs&lt;/a&gt;&lt;/p&gt;
&lt;h4 id="3-dot-1-provider作成"&gt;3.1 provider作成&lt;/h4&gt;
&lt;p&gt;&lt;a href="https://github.com/getsops/sops"&gt;sops&lt;/a&gt; にAPI Tokenを保存して &lt;a href="https://github.com/carlpett/terraform-provider-sops"&gt;terraform-provider-sops&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-terraform" data-lang="terraform"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;terraform&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;required_providers&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;sops&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:#a6e22e"&gt;source&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;carlpett/sops&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;version&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;~&amp;gt; 0.5&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:#a6e22e"&gt;cloudflare&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:#a6e22e"&gt;source&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;cloudflare/cloudflare&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;version&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;~&amp;gt; 5&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&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;provider&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;sops&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;data&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;sops_file&amp;#34;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;secret&amp;#34;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;source_file&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;./secrets.yaml&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;provider&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;cloudflare&amp;#34;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;api_token&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; data.&lt;span style="color:#a6e22e"&gt;sops_file&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;secret&lt;/span&gt;.data.&lt;span style="color:#a6e22e"&gt;cloudflare&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;h4 id="3-dot-2-レコード作成"&gt;3.2 レコード作成&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-terraform" data-lang="terraform"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;locals&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;&lt;span style="color:#75715e"&gt; # for takeokunn.org
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;takeokunn_org_zone_id&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;xxx&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;resource&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;cloudflare_dns_record&amp;#34;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;a_records&amp;#34;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;provider&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;cloudflare&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;for_each&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; toset([
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;185.199.108.153&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;185.199.109.153&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;185.199.110.153&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;185.199.111.153&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:#a6e22e"&gt;zone_id&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;local&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;takeokunn_org_zone_id&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;name&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;takeokunn.org&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;content&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; each.&lt;span style="color:#a6e22e"&gt;key&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;type&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;A&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;ttl&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&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 style="color:#a6e22e"&gt;proxied&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;false&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;resource&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;cloudflare_dns_record&amp;#34;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;cname_emacs&amp;#34;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;zone_id&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;local&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;takeokunn_org_zone_id&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;name&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;emacs.takeokunn.org&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;content&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;takeokunn.github.io&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;type&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;CNAME&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;ttl&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&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 style="color:#a6e22e"&gt;proxied&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;false&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;h3 id="4-dot-管理画面から確認する"&gt;4. 管理画面から確認する&lt;/h3&gt;
&lt;p&gt;正常に &lt;code&gt;terraform apply&lt;/code&gt; されていることを確認する。&lt;/p&gt;</description></item><item><title>NextDNSを導入した</title><link>https://www.takeokunn.org/posts/fleeting/20250402012730-setup_nextdns/</link><pubDate>Wed, 02 Apr 2025 00:00:00 +0000</pubDate><guid>https://www.takeokunn.org/posts/fleeting/20250402012730-setup_nextdns/</guid><description>&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;かねてから興味があった &lt;a href="https://nextdns.io/"&gt;NextDNS&lt;/a&gt; が Terraform Provider と nix-darwin/nixos で設定できることを知り、せっかくなので導入してみた。&lt;/p&gt;
&lt;h2 id="what-is-nextdns"&gt;What is NextDNS?&lt;/h2&gt;
&lt;p&gt;流行のDeep Reasearchの結果は以下Gist。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://gist.github.com/takeokunn/aa9bc9ef2c7d670b71bfd962c8a1a80e"&gt;https://gist.github.com/takeokunn/aa9bc9ef2c7d670b71bfd962c8a1a80e&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;日本人でも使っている人がちらほらいる。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://vpn-taizen.com/what_is_nextdns/"&gt;ほぼ無料で全てまとめて広告ブロックできるNextDNSとは&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://mkusaka.com/2023/06/18/nextdns/"&gt;NextDNSを使ってみて広告ブロックが捗ったので紹介&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.qam-web.com/?p=21061#google_vignette"&gt;NextDNSで安全で快適なブラウジング&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="作業手順"&gt;作業手順&lt;/h2&gt;
&lt;h3 id="1-dot-アカウント作成してapi-key発行"&gt;1. アカウント作成してAPI Key発行&lt;/h3&gt;
&lt;p&gt;公式サイトからメールアドレスとパスワードで登録する。
&lt;a href="https://nextdns.io/"&gt;https://nextdns.io/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;管理画面からMFAを設定してAPI keyを発行する。
&lt;a href="https://my.nextdns.io/account"&gt;https://my.nextdns.io/account&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="2-dot-terraform設定"&gt;2. Terraform設定&lt;/h3&gt;
&lt;p&gt;ドキュメントを参考に画面上で設定できるものを宣言的に設定する。
&lt;a href="https://registry.terraform.io/providers/carbans/nextdns/latest/docs"&gt;https://registry.terraform.io/providers/carbans/nextdns/latest/docs&lt;/a&gt;&lt;/p&gt;
&lt;h4 id="2-dot-1-providerを設定"&gt;2.1 providerを設定&lt;/h4&gt;
&lt;p&gt;&lt;a href="https://github.com/getsops/sops"&gt;sops&lt;/a&gt; にAPI Tokenを保存して &lt;a href="https://github.com/carlpett/terraform-provider-sops"&gt;terraform-provider-sops&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-terraform" data-lang="terraform"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;terraform&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;required_providers&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;sops&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:#a6e22e"&gt;source&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;carlpett/sops&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;version&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;~&amp;gt; 0.5&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:#a6e22e"&gt;nextdns&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:#a6e22e"&gt;source&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;carbans/nextdns&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;version&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;~&amp;gt; 0.2&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&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;provider&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;sops&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;data&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;sops_file&amp;#34;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;secret&amp;#34;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;source_file&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;./secrets.yaml&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;provider&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;nextdns&amp;#34;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;api_key&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; data.&lt;span style="color:#a6e22e"&gt;sops_file&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;secret&lt;/span&gt;.data.&lt;span style="color:#a6e22e"&gt;nextdns&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;h4 id="2-dot-2-各種設定"&gt;2.2 各種設定&lt;/h4&gt;
&lt;p&gt;とりあえず有効にできるものは有効にした。&lt;/p&gt;</description></item><item><title>Terraform GitHub Providerを導入した</title><link>https://www.takeokunn.org/posts/fleeting/20250402001222-setup_private_terraform_github_provider/</link><pubDate>Wed, 02 Apr 2025 00:00:00 +0000</pubDate><guid>https://www.takeokunn.org/posts/fleeting/20250402001222-setup_private_terraform_github_provider/</guid><description>&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;個人の運用でTerraform GitHub Providerを導入したのでメモしておく。&lt;/p&gt;
&lt;h2 id="motiviation"&gt;Motiviation&lt;/h2&gt;
&lt;p&gt;長年ソフトウェアエンジニアをやってたらリポジトリが増えていく。特に最近のLLMの流行で検証用に作るリポジトリが顕著に増えている。
「Automatically delete head branchesは必ず有効にする」など、統一的な環境を宣言的にしたいという欲求があった。&lt;/p&gt;
&lt;p&gt;また、SSH keysの設定など個人の設定も可能な限り宣言的に記述したい。&lt;/p&gt;
&lt;h2 id="作業手順"&gt;作業手順&lt;/h2&gt;
&lt;p&gt;こちらのproviderを使って導入する。
&lt;a href="https://registry.terraform.io/providers/integrations/github/latest"&gt;https://registry.terraform.io/providers/integrations/github/latest&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="0-dot-access-tokenを用意する"&gt;0. Access Tokenを用意する&lt;/h3&gt;
&lt;p&gt;「Personal access tokens &amp;gt; Fine-grained personal access tokens」で必要に応じて権限を付与してTokenを発行する。&lt;/p&gt;
&lt;h3 id="1-dot-provider定義"&gt;1. provider定義&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://github.com/getsops/sops"&gt;sops&lt;/a&gt; にGitHub API Tokenを保存して &lt;a href="https://github.com/carlpett/terraform-provider-sops"&gt;terraform-provider-sops&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-terraform" data-lang="terraform"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;terraform&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;required_providers&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;sops&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:#a6e22e"&gt;source&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;carlpett/sops&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;version&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;~&amp;gt; 0.5&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:#a6e22e"&gt;github&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:#a6e22e"&gt;source&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;integrations/github&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;version&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;~&amp;gt; 6.0&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&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;provider&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;sops&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;data&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;sops_file&amp;#34;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;secret&amp;#34;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;source_file&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;./secrets.yaml&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;provider&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;github&amp;#34;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;token&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; data.&lt;span style="color:#a6e22e"&gt;sops_file&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;secret&lt;/span&gt;.data.&lt;span style="color:#a6e22e"&gt;github&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;h3 id="2-dot-ssh-key定義"&gt;2. ssh key定義&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://registry.terraform.io/providers/integrations/github/latest/docs/resources/user_ssh_key"&gt;github_user_ssh_key&lt;/a&gt; で定義できる。&lt;/p&gt;</description></item><item><title>@github/copilot-language-serverをNixで扱う時のメモ</title><link>https://www.takeokunn.org/posts/fleeting/20250327190937-usage_github_copilot_language_server/</link><pubDate>Thu, 27 Feb 2025 00:00:00 +0000</pubDate><guid>https://www.takeokunn.org/posts/fleeting/20250327190937-usage_github_copilot_language_server/</guid><description>&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://github.com/orgs/github/packages/npm/package/copilot-language-server"&gt;@github/copilot-language-server&lt;/a&gt; を &lt;a href="https://github.com/takeokunn/nixos-configuration"&gt;takeokunn/nixos-configuration&lt;/a&gt; 上で扱えるようにしたのでメモしておく。&lt;/p&gt;
&lt;h2 id="background"&gt;Background&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/copilot-emacs/copilot.el"&gt;copilot.el&lt;/a&gt; のバージョンが上がった&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/orgs/github/packages/npm/package/copilot-language-server"&gt;@github/copilot-language-server&lt;/a&gt; をnpmでインストールして使う必要があった&lt;/li&gt;
&lt;li&gt;次の要件を満たしたい
&lt;ul&gt;
&lt;li&gt;Nixでパッケージングしたい&lt;/li&gt;
&lt;li&gt;Neovimなどのエディタでも汎用的に使えるようにしたい&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="対応手順"&gt;対応手順&lt;/h2&gt;
&lt;h3 id="1-dot-node2nixでパッケージングする"&gt;1. node2nixでパッケージングする&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;node2nix/node-packages.json&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-json" data-lang="json"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[&lt;span style="color:#e6db74"&gt;&amp;#34;@github/copilot-language-server&amp;#34;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;次のshell scriptを実行するとファイルが生成された。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;node2nix/default.nix&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;node2nix/node-env.nix&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;node2nix/node-packages.nix&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;!--listend--&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-console" data-lang="console"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ nix-shell -p nodePackages.node2nix --command &lt;span style="color:#e6db74"&gt;&amp;#34;node2nix -i ./node-packages.json -o node-packages.nix&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="2-dot-実行ファイルを取得する"&gt;2. 実行ファイルを取得する&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;node2nix/default.nix&lt;/code&gt; をimportするとpackageが読み込めるようになった。&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-nix" data-lang="nix"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;nodePkgs &lt;span style="color:#f92672"&gt;=&lt;/span&gt; pkgs&lt;span style="color:#f92672"&gt;.&lt;/span&gt;callPackage &lt;span style="color:#e6db74"&gt;../node2nix&lt;/span&gt; { &lt;span style="color:#66d9ef"&gt;inherit&lt;/span&gt; pkgs; };
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;copilot-language-server は次のようなディレクトリ構造になっている。&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-console" data-lang="console"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ dust native/
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;&lt;/span&gt; 65M ├─┬ native/darwin-x64
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 65M │ └── native/darwin-x64/copilot-language-server
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 60M ├─┬ native/darwin-arm64
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 60M │ └── native/darwin-arm64/copilot-language-server
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 59M ├─┬ native/linux-x64
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 59M │ └── native/linux-x64/copilot-language-server
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 50M └─┬ native/win32-x64
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 50M └── native/win32-x64/copilot-language-server.exe
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;そこで、platformごとに対応表を作って &lt;code&gt;COPILOT_LANGUAGE_SERVER_PATH&lt;/code&gt; にPATHを通してあげた。&lt;/p&gt;</description></item><item><title>2025年2月名古屋旅行</title><link>https://www.takeokunn.org/posts/diary/20250224140741-retrospective_nagoya_2025/</link><pubDate>Mon, 24 Feb 2025 00:00:00 +0000</pubDate><guid>https://www.takeokunn.org/posts/diary/20250224140741-retrospective_nagoya_2025/</guid><description>&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;2025/2/21から2025/2/24までの名古屋旅行についての振り返りです。&lt;/p&gt;
&lt;p&gt;名古屋上陸ははじめてでしたが、非常に楽しい旅行になりました。思い出したらまた追記するかもしれません。&lt;/p&gt;
&lt;h2 id="注意"&gt;注意&lt;/h2&gt;
&lt;p&gt;このブログはあくまで個人的な旅行記であり、「たけてぃのことを知っている or 物好きな人」向けの記事です。
帰りの高速バスの中で暇なので書いているくらいの温度感の記事なので真に受けないでください。&lt;/p&gt;
&lt;p&gt;社会人として外面の良い活動はZennに後日纏めますので少々お待ちください。&lt;/p&gt;
&lt;h2 id="スケジュール"&gt;スケジュール&lt;/h2&gt;
&lt;p&gt;スケジュールはざっくり以下です。
今回の旅行も常に何かをしていたなという感覚があります。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;開始日&lt;/th&gt;
&lt;th&gt;開始時間&lt;/th&gt;
&lt;th&gt;終了時間&lt;/th&gt;
&lt;th&gt;項目&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;2/21(金)&lt;/td&gt;
&lt;td&gt;23:00&lt;/td&gt;
&lt;td&gt;07:00&lt;/td&gt;
&lt;td&gt;夜行バス 東京駅 → 名古屋駅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2/22(土)&lt;/td&gt;
&lt;td&gt;9:30&lt;/td&gt;
&lt;td&gt;19:00&lt;/td&gt;
&lt;td&gt;phpcon名古屋&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;19:00&lt;/td&gt;
&lt;td&gt;21:00&lt;/td&gt;
&lt;td&gt;懇親会&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;21:00&lt;/td&gt;
&lt;td&gt;23:30&lt;/td&gt;
&lt;td&gt;2次会&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;23:30&lt;/td&gt;
&lt;td&gt;24:00&lt;/td&gt;
&lt;td&gt;湯〜とぴあ宝 移動&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2/23(日)&lt;/td&gt;
&lt;td&gt;10:00&lt;/td&gt;
&lt;td&gt;11:30&lt;/td&gt;
&lt;td&gt;名古屋駅にてモーニング&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;11:30&lt;/td&gt;
&lt;td&gt;13:00&lt;/td&gt;
&lt;td&gt;喫茶マウンテン with tadsan, あかつかさん&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;13:30&lt;/td&gt;
&lt;td&gt;16:30&lt;/td&gt;
&lt;td&gt;東山動物園&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;17:00&lt;/td&gt;
&lt;td&gt;19:00&lt;/td&gt;
&lt;td&gt;ひつまぶし in 栄 with tadsan&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;19:00&lt;/td&gt;
&lt;td&gt;21:00&lt;/td&gt;
&lt;td&gt;栄散策&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;21:00&lt;/td&gt;
&lt;td&gt;22:00&lt;/td&gt;
&lt;td&gt;名古屋駅周辺散策 + 湯〜とぴあ宝 移動&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2/24(月)&lt;/td&gt;
&lt;td&gt;9:30&lt;/td&gt;
&lt;td&gt;11:30&lt;/td&gt;
&lt;td&gt;名古屋駅にてモーニングと定食を食べる&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;11:30&lt;/td&gt;
&lt;td&gt;12:00&lt;/td&gt;
&lt;td&gt;お土産買ってバス停に移動&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;12:00&lt;/td&gt;
&lt;td&gt;18:00&lt;/td&gt;
&lt;td&gt;高速バス 名古屋駅 → 東京駅&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="ドメイン用語"&gt;ドメイン用語&lt;/h2&gt;
&lt;p&gt;普段なにげなく使っているが、よくよく考えたら初見の人から見たら意味がわからない単語、それがドメイン用語なのです。&lt;/p&gt;</description></item><item><title>2025年2月 Neovimセットアップ</title><link>https://www.takeokunn.org/posts/fleeting/20250211111032-setup_neovim/</link><pubDate>Tue, 11 Feb 2025 00:00:00 +0000</pubDate><guid>https://www.takeokunn.org/posts/fleeting/20250211111032-setup_neovim/</guid><description>&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;Neovimに入門したいと思い早n年だったが、vim-jpの皆さんのおかげでようやくミニマムの設定が完了したのでブログにまとめておきます。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.takeokunn.org/posts/fleeting/20230209152709-using-vim-and-neovim-for-differenct-purposes-and-minimum-settings/"&gt;VimとNeovimの使い分けと最小構成&lt;/a&gt; のとおりVimは最小構成にしているので、Neovimはヘビーカスタマイズしていく方針です。&lt;/p&gt;
&lt;p&gt;Neovimの設定はこちら。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/takeokunn/nixos-configuration/tree/main/home-manager/programs/neovim"&gt;https://github.com/takeokunn/nixos-configuration/tree/main/home-manager/programs/neovim&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="setup"&gt;Setup&lt;/h2&gt;
&lt;h3 id="neovim本体"&gt;Neovim本体&lt;/h3&gt;
&lt;p&gt;Nix経由でインストールしています。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/takeokunn/nixos-configuration/blob/main/home-manager/programs/neovim/default.nix"&gt;https://github.com/takeokunn/nixos-configuration/blob/main/home-manager/programs/neovim/default.nix&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;withNodeJs&lt;/code&gt; や &lt;code&gt;withRuby&lt;/code&gt; などはイマドキ使わない設定まらしいので &lt;code&gt;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-nix" data-lang="nix"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{ pkgs&lt;span style="color:#f92672"&gt;,&lt;/span&gt; sources }:
&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; programs&lt;span style="color:#f92672"&gt;.&lt;/span&gt;neovim &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; enable &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; withNodeJs &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;false&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; withRuby &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;false&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; withPython3 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;false&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; plugins &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#f92672"&gt;import&lt;/span&gt; &lt;span style="color:#e6db74"&gt;./plugins&lt;/span&gt; { &lt;span style="color:#66d9ef"&gt;inherit&lt;/span&gt; pkgs sources; };
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; extraLuaConfig &lt;span style="color:#f92672"&gt;=&lt;/span&gt; builtins&lt;span style="color:#f92672"&gt;.&lt;/span&gt;readFile &lt;span style="color:#e6db74"&gt;./init.lua&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="plugin-manager"&gt;Plugin Manager&lt;/h3&gt;
&lt;p&gt;VimのPlugin Managerは乱立しているようで、デファクトスタンダードはないらしいです。
私はNixユーザーなのでNixで管理することにしました。&lt;/p&gt;
&lt;p&gt;また、各Pluginごとの設定もNix内に記述する方針にしました。&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-nix" data-lang="nix"&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;{ pkgs }:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;with&lt;/span&gt; pkgs&lt;span style="color:#f92672"&gt;.&lt;/span&gt;vimPlugins;
&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; type &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;lua&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; plugin &lt;span style="color:#f92672"&gt;=&lt;/span&gt; dracula-nvim;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; config &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; vim.cmd[[colorscheme dracula]]
&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;&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;]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="terminal-emulator"&gt;Terminal Emulator&lt;/h3&gt;
&lt;p&gt;「Terminal Emulatorにこだわらない」というこだわりを持っていたが、&lt;a href="https://timingapp.com/terminal-time-tracking"&gt;Mac標準のTerminal.app&lt;/a&gt;だとうまく描画してくれない問題があった。&lt;/p&gt;</description></item><item><title>org-nix-shell入門</title><link>https://www.takeokunn.org/posts/fleeting/20250126140928-introduction_org_nix_shell/</link><pubDate>Sat, 08 Feb 2025 00:00:00 +0000</pubDate><guid>https://www.takeokunn.org/posts/fleeting/20250126140928-introduction_org_nix_shell/</guid><description>&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;org-nix-shellはOrg関連パッケージの中でもキラーアプリケーションと呼べるもので、個人的に今熱いパッケージのひとつです。
簡単な使い方と実際のユースケースを紹介していきます。&lt;/p&gt;
&lt;h2 id="インストール"&gt;インストール&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/AntonHakansson/org-nix-shell/blob/main/README.org"&gt;https://github.com/AntonHakansson/org-nix-shell/blob/main/README.org&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;melpa: &lt;a href="https://melpa.org/#/org-nix-shell"&gt;https://melpa.org/#/org-nix-shell&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Melpa経由で入れてもよいし、GitHub経由で直接インストールしてもよい。
次のように設定するだけで機能してくれる。&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-emacs-lisp" data-lang="emacs-lisp"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;(require &lt;span style="color:#e6db74"&gt;&amp;#39;org-nix-shell&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;(with-eval-after-load &lt;span style="color:#e6db74"&gt;&amp;#39;org&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; (add-hook &lt;span style="color:#e6db74"&gt;&amp;#39;org-mode-hook&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;#&amp;#39;&lt;/span&gt;org-nix-shell-mode))
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="使い方"&gt;使い方&lt;/h2&gt;
&lt;h3 id="basic"&gt;Basic&lt;/h3&gt;
&lt;p&gt;次のようにNixを定義して &lt;code&gt;:nix-shell&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-org" data-lang="org"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#+name&lt;/span&gt;&lt;span style="color:#75715e"&gt;: tmp-shell&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#+BEGIN_SRC &lt;/span&gt;&lt;span style="color:#75715e"&gt;nix&lt;/span&gt;&lt;span style="color:#75715e"&gt; :noweb yes
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt; { pkgs &lt;span style="color:#f92672"&gt;?&lt;/span&gt; &lt;span style="color:#f92672"&gt;import&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;lt;nixpkgs&amp;gt;&lt;/span&gt; { } }:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; pkgs&lt;span style="color:#f92672"&gt;.&lt;/span&gt;mkShell { buildInputs &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;with&lt;/span&gt; pkgs; [ php ]; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt; #+END_SRC&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:#75715e"&gt;#+begin_src &lt;/span&gt;&lt;span style="color:#75715e"&gt;shell&lt;/span&gt;&lt;span style="color:#75715e"&gt; :nix-shell tmp-shell :results output
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt; php --version
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#+end_src&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;また、次のURLから古いバージョンを取ってきて実行することも可能。
&lt;a href="https://lazamar.co.uk/nix-versions"&gt;https://lazamar.co.uk/nix-versions&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-org" data-lang="org"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#+name&lt;/span&gt;&lt;span style="color:#75715e"&gt;: php74-shell&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#+BEGIN_SRC &lt;/span&gt;&lt;span style="color:#75715e"&gt;nix&lt;/span&gt;&lt;span style="color:#75715e"&gt; :noweb yes
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;let&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; url &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;https://github.com/NixOS/nixpkgs/archive/4426104c8c900fbe048c33a0e6f68a006235ac50.tar.gz&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; pkgs &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#f92672"&gt;import&lt;/span&gt; (builtins&lt;span style="color:#f92672"&gt;.&lt;/span&gt;fetchTarball { &lt;span style="color:#66d9ef"&gt;inherit&lt;/span&gt; url; }) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; system &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;&amp;lt;&amp;lt;wandbox-system&amp;gt;&amp;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;in&lt;/span&gt; pkgs&lt;span style="color:#f92672"&gt;.&lt;/span&gt;mkShell { buildInputs &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;with&lt;/span&gt; pkgs; [ php74 ]; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#+END_SRC&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:#75715e"&gt;#+begin_src &lt;/span&gt;&lt;span style="color:#75715e"&gt;php&lt;/span&gt;&lt;span style="color:#75715e"&gt; :nix-shell php74-shell :exports both
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;echo&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;phpversion&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#+end_src&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:#75715e"&gt;#+RESULTS&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;: 7.4.4
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;property指定もできる。&lt;/p&gt;</description></item><item><title>Laravel LazyCollection in depth</title><link>https://www.takeokunn.org/posts/fleeting/20250204175231-laravel_lazy_collection_in_depth/</link><pubDate>Tue, 04 Feb 2025 00:00:00 +0000</pubDate><guid>https://www.takeokunn.org/posts/fleeting/20250204175231-laravel_lazy_collection_in_depth/</guid><description>&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;LaravelのLazyCollectionは巨大なデータを扱う時に便利であるという話は巷で良く聞くが、実際の所どういうときに便利なのか、内部的にはどうなっているのかという情報はあまり聞かない。
LazyCollection自体のソースコードを読んでかなり理解できたのでメモしておく。&lt;/p&gt;
&lt;p&gt;なお、そもそもの使い方については &lt;a href="https://qiita.com/yhosok/items/a95ae800970124fb503a"&gt;LazyCollection備忘録 - Qiita&lt;/a&gt; を読んでいる前提で話を進める。&lt;/p&gt;
&lt;h2 id="前提"&gt;前提&lt;/h2&gt;
&lt;p&gt;次のバージョンを想定しています。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;laravel: 10.0&lt;/li&gt;
&lt;li&gt;php: 8.2&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;LazyCollectionのコードはこちら。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/laravel/framework/blob/10.x/src/Illuminate/Collections/LazyCollection.php"&gt;https://github.com/laravel/framework/blob/10.x/src/Illuminate/Collections/LazyCollection.php&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="lazycollectionについて"&gt;LazyCollectionについて&lt;/h2&gt;
&lt;h3 id="basic"&gt;Basic&lt;/h3&gt;
&lt;h4 id="lazycollection-sourceについて"&gt;LazyCollection#sourceについて&lt;/h4&gt;
&lt;p&gt;基本的には &lt;a href="https://github.com/laravel/framework/blob/10.x/src/Illuminate/Collections/LazyCollection.php#L31-L36"&gt;LazyCollection#source&lt;/a&gt; にClosureを入れてどう引き回すか、どのタイミングでClosureを発行するのかということを制御している。&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-php" data-lang="php"&gt;&lt;span style="display:flex;"&gt;&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:#e6db74"&gt; * The source from which to generate items.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&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:#e6db74"&gt; * @var (Closure(): \Generator&amp;lt;TKey, TValue, mixed, void&amp;gt;)|static|array&amp;lt;TKey, TValue&amp;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; */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; $source;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;LazyCollectionのコンストラクタの引数(or &lt;code&gt;LazyCollection#make&lt;/code&gt;)には &lt;code&gt;Array|null&lt;/code&gt; か &lt;code&gt;Closure(Generator)&lt;/code&gt; を渡すことが可能で、 &lt;code&gt;LazyCollection#source&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-php" data-lang="php"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;\Illuminate\Support\LazyCollection&lt;/span&gt;&lt;span style="color:#f92672"&gt;::&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;make&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; () { &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; ($i &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;; $i &lt;span style="color:#f92672"&gt;&amp;lt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;10000000&lt;/span&gt;; $i&lt;span style="color:#f92672"&gt;++&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;yield&lt;/span&gt; $i; })&lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;source&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;Closure&lt;/span&gt;() {&lt;span style="color:#75715e"&gt;#5542 &amp;lt;E2&amp;gt;&amp;lt;80&amp;gt;&amp;lt;A6&amp;gt;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;&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;gt;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;\Illuminate\Support\LazyCollection&lt;/span&gt;&lt;span style="color:#f92672"&gt;::&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;make&lt;/span&gt;([&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt; ,&lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;])&lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;source&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:#ae81ff"&gt;1&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;3&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;&amp;gt;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;\Illuminate\Support\LazyCollection&lt;/span&gt;&lt;span style="color:#f92672"&gt;::&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;make&lt;/span&gt;()&lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;source&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&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// arrayにcastされる
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;\Illuminate\Support\LazyCollection&lt;/span&gt;&lt;span style="color:#f92672"&gt;::&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;make&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;)&lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;source&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:#ae81ff"&gt;1&lt;/span&gt; ]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="基本的な関数"&gt;基本的な関数&lt;/h4&gt;
&lt;p&gt;ここではmapを例に上げる。&lt;/p&gt;</description></item><item><title>Nixでdap-modeがエラーになった時のメモ</title><link>https://www.takeokunn.org/posts/fleeting/20250203131440-workaround_nix_dap_mode/</link><pubDate>Mon, 03 Feb 2025 00:00:00 +0000</pubDate><guid>https://www.takeokunn.org/posts/fleeting/20250203131440-workaround_nix_dap_mode/</guid><description>&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;2025/02/02（Sun）に &lt;code&gt;nix flake update&lt;/code&gt; で最新にしてBuildしたらエラーで落ちるようになったのでメモ。&lt;/p&gt;
&lt;h2 id="現象"&gt;現象&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;2025/01/31に &lt;a href="https://github.com/emacs-lsp/dap-mode/commit/438679755e880f2a662a63bc04da9e843257e248"&gt;dapui.elがdap-ui.elにrename&lt;/a&gt; される&lt;/li&gt;
&lt;li&gt;&lt;a href="https://melpa.org/#/dap-mode"&gt;dap-mode 20250131.1624&lt;/a&gt; に反映される&lt;/li&gt;
&lt;li&gt;2025/02/02の &lt;a href="https://github.com/NixOS/nixpkgs/blob/master/pkgs/applications/editors/emacs/elisp-packages/melpa-packages.nix#L984-L991"&gt;nix flake update nixpkgsのdap-modeのpreBuild&lt;/a&gt; でdapui.elがなくて落ちるようになった&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="最小構成と解決策"&gt;最小構成と解決策&lt;/h2&gt;
&lt;p&gt;次のように &lt;code&gt;preBuild&lt;/code&gt; をoverlaysに追加すればBuildできるようになった。&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-nix" data-lang="nix"&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; inputs &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; nixpkgs&lt;span style="color:#f92672"&gt;.&lt;/span&gt;url &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;github:NixOS/nixpkgs/nixpkgs-unstable&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; emacs-overlay&lt;span style="color:#f92672"&gt;.&lt;/span&gt;url &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;github:nix-community/emacs-overlay&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; outputs &lt;span style="color:#f92672"&gt;=&lt;/span&gt; { self&lt;span style="color:#f92672"&gt;,&lt;/span&gt; nixpkgs&lt;span style="color:#f92672"&gt;,&lt;/span&gt; emacs-overlay&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; &lt;span style="color:#66d9ef"&gt;let&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; system &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;aarch64-darwin&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; pkgs &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#f92672"&gt;import&lt;/span&gt; nixpkgs {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;inherit&lt;/span&gt; system;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; overlays &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:#75715e"&gt;# ここを追加&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; (self: super: {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; emacsPackages &lt;span style="color:#f92672"&gt;=&lt;/span&gt; super&lt;span style="color:#f92672"&gt;.&lt;/span&gt;emacsPackages &lt;span style="color:#f92672"&gt;//&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; dap-mode &lt;span style="color:#f92672"&gt;=&lt;/span&gt; super&lt;span style="color:#f92672"&gt;.&lt;/span&gt;emacsPackages&lt;span style="color:#f92672"&gt;.&lt;/span&gt;dap-mode&lt;span style="color:#f92672"&gt;.&lt;/span&gt;overrideAttrs (old: {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; preBuild &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;null&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&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; emacs-overlay&lt;span style="color:#f92672"&gt;.&lt;/span&gt;overlay
&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;in&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; defaultPackage&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;system&lt;span style="color:#e6db74"&gt;}&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; pkgs&lt;span style="color:#f92672"&gt;.&lt;/span&gt;emacsPackages&lt;span style="color:#f92672"&gt;.&lt;/span&gt;dap-mode;
&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;また、 &lt;code&gt;emacs-overlay&lt;/code&gt; 使う場合は &lt;code&gt;pkgs.emacsWithPackagesFromPackageRequires&lt;/code&gt; にoverlayを追加すればBuildできるようになる。
&lt;a href="https://github.com/nix-community/Emacs-overlay/blob/a7f332f6e0813c9d0f53fe6539be1e7a65fff2e4/packreq.nix#L13"&gt;https://github.com/nix-community/Emacs-overlay/blob/a7f332f6e0813c9d0f53fe6539be1e7a65fff2e4/packreq.nix#L13&lt;/a&gt;&lt;/p&gt;</description></item><item><title>「Lispが安定してることがアピールポイントか」に対しての考察</title><link>https://www.takeokunn.org/posts/fleeting/20250129141559-why_lisp_is_stable/</link><pubDate>Wed, 29 Jan 2025 00:00:00 +0000</pubDate><guid>https://www.takeokunn.org/posts/fleeting/20250129141559-why_lisp_is_stable/</guid><description>&lt;h2 id="背景"&gt;背景&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://zenn.dev/takeokunn/articles/20250126133908"&gt;vim-jpラジオのEmacs回に出演しました - Zenn&lt;/a&gt; を書いたのだが、conao3から「n年前のコードを動かすためにはn年成長しなければよい、そこはアピールポイントにならないという気持ちではある」という指摘を受けた。
その過程でvim-jpの &lt;code&gt;#random&lt;/code&gt; チャンネルで議論になった。
人によってかなり前提や置かれている状況が違うので、自分が想定していた条件や「Lispが安定している」についての理解と主張を文書という形でまとめておく。&lt;/p&gt;
&lt;h2 id="免責事項"&gt;免責事項&lt;/h2&gt;
&lt;p&gt;この記事は個人ブログに書いているので、あくまで個人の理解や見解をまとめている。
その為、技術的に間違えていることが書かれている可能性があるので要注意。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;platform&lt;/th&gt;
&lt;th&gt;想定読者&lt;/th&gt;
&lt;th&gt;目的&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Zenn&lt;/td&gt;
&lt;td&gt;不特定多数&lt;/td&gt;
&lt;td&gt;対外的な宣伝目的&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;takeokunn.org&lt;/td&gt;
&lt;td&gt;特定少数&lt;/td&gt;
&lt;td&gt;個人的なメモ&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;また、特に断りがなければ以下を想像しながら書いている。
本当はGoやRustも含めて書きたかったが経験が浅いので今回は除外する。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Lisp: Common Lisp&lt;/li&gt;
&lt;li&gt;通常の言語: PHP, NodeJS&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="対象箇所"&gt;対象箇所&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://zenn.dev/takeokunn/articles/20250126133908#%E3%81%93%E3%81%BE%E3%82%82%E3%81%8B%E3%81%95%E3%82%93%E3%81%8B%E3%82%89%E3%81%AE%E3%81%8A%E4%BE%BF%E3%82%8A"&gt;こまもかさんからのお便り&lt;/a&gt; から抜粋。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Q.
Emacsといえば設定をEmacs Lispという専用のLispで行ったり、他のエディタよりLisp系言語のサポートが手厚い事が有名だと思います。
かく言う僕もCommon Lispを書くためにEmacsを始めたのですが、皆さんの思うLispの魅力などについてお聞きしたいです。&lt;/p&gt;
&lt;p&gt;A.
Lispの魅力についての外観をつかみたいなら &lt;a href="https://www.amazon.co.jp/%E3%83%8F%E3%83%83%E3%82%AB%E3%83%BC%E3%81%A8%E7%94%BB%E5%AE%B6-%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF%E6%99%82%E4%BB%A3%E3%81%AE%E5%89%B5%E9%80%A0%E8%80%85%E3%81%9F%E3%81%A1-%E3%83%9D%E3%83%BC%E3%83%AB-%E3%82%B0%E3%83%AC%E3%82%A2%E3%83%A0/dp/4274065979"&gt;ハッカーと画家 コンピュータ時代の創造者たち&lt;/a&gt; や &lt;a href="https://www.oreilly.co.jp/books/9784873115870/"&gt;Land of Lisp&lt;/a&gt; や &lt;a href="https://gist.github.com/y2q-actionman/49d7587912b2786eb68643afde6ca192"&gt;A Road to Common Lisp&lt;/a&gt; を読むことをお勧めします。
Lispにもっと踏み込みたいなら &lt;a href="https://www.asahi-net.or.jp/~kc7k-nd/onlispjhtml/"&gt;On Lisp&lt;/a&gt; や &lt;a href="https://www.amazon.co.jp/LET-OVER-LAMBDA-1-0-%E3%83%9B%E3%82%A4%E3%83%88/dp/4434133632"&gt;LET OVER LAMBDA&lt;/a&gt; もお勧めです。&lt;/p&gt;
&lt;p&gt;僕個人としての魅力は、Lisp自体の言語仕様が変わることはなく、Lispの言語仕様の上にmacroや関数を積み上げているので30年前のコードベースも余裕で動くことです。
ソフトウェアを開発していると後方非互換の回し車に常に追われており、頻繁なバージョンアップを余儀なくされます。
phpプロジェクトは1年塩漬にされているとさまざまな依存関係のせいで動かないことが多々あります。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="当初の自分の主張"&gt;当初の自分の主張&lt;/h2&gt;
&lt;p&gt;プログラムを書くにはざっくり4種類の層がある。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;言語自体の構文や処理系&lt;/li&gt;
&lt;li&gt;処理系が提供している標準関数やpackage&lt;/li&gt;
&lt;li&gt;外部packageやフレームワーク&lt;/li&gt;
&lt;li&gt;ユーザーが書いているコード&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;主観の各言語ごとの変化の度合のマトリックスは以下。（×→変化なし、○→変化量が多い）
一度書いたコードが未来の処理系でも過去の処理系でも動くかどうかということを想定している。
「言語自体の構文や処理系」を変更するとすべてを変更する必要があるように、ステップが下にいくにつれて影響度合いが大きくなる。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Lisp&lt;/th&gt;
&lt;th&gt;NodeJS&lt;/th&gt;
&lt;th&gt;PHP&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;言語自体の構文や処理系&lt;/td&gt;
&lt;td&gt;×&lt;/td&gt;
&lt;td&gt;△&lt;/td&gt;
&lt;td&gt;△&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;処理系が提供している標準関数やpackage&lt;/td&gt;
&lt;td&gt;△&lt;/td&gt;
&lt;td&gt;△&lt;/td&gt;
&lt;td&gt;△&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;外部packageやフレームワーク&lt;/td&gt;
&lt;td&gt;△&lt;/td&gt;
&lt;td&gt;◎&lt;/td&gt;
&lt;td&gt;◎&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;実際のプロジェクトはほぼ次の2種類のパターンで構成されている。
Emacs Lispの場合はフレームワークまで含めてなのでBを指す。&lt;/p&gt;</description></item><item><title>org-crypt運用メモ</title><link>https://www.takeokunn.org/posts/fleeting/20250127144907-my_usage_org_crypt/</link><pubDate>Mon, 27 Jan 2025 00:00:00 +0000</pubDate><guid>https://www.takeokunn.org/posts/fleeting/20250127144907-my_usage_org_crypt/</guid><description>&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;org-crypt&lt;/code&gt; の使い方をイマイチに理解していなかったが、ふと調べてたら急に理解が進んだ。&lt;/p&gt;
&lt;p&gt;個人的な運用が固まったのでメモしておく。&lt;/p&gt;
&lt;h2 id="motivation"&gt;Motivation&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;~/.aws/credentials&lt;/code&gt; のような秘匿情報を &lt;code&gt;secret.org.gpg&lt;/code&gt; から &lt;code&gt;org-babel-tangle&lt;/code&gt; から出力していた。
ファイルごとGPGで暗号化すると &lt;code&gt;git diff&lt;/code&gt; がきれいに取れないので地味に困っていた。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;org-crypt&lt;/code&gt; で必要な分を部分的に暗号化することによって、以前よりはGitフレンドリーにすることが可能になることが分かった。&lt;/p&gt;
&lt;h2 id="org-crypt-使い方"&gt;&lt;code&gt;org-crypt&lt;/code&gt; 使い方&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://github.com/emacs-mirror/emacs/blob/6a390fd42ec4ef97d637899fc93f34ea65639e3c/lisp/org/org-crypt.el"&gt;org-crypt.el&lt;/a&gt; を読むのでもよいが、 &lt;a href="https://fluca1978.github.io/2021/09/16/Emacs_Org_Encrypt.html"&gt;Encrypting the content of Emacs Org files&lt;/a&gt; にわかりやすくまとまっている。&lt;/p&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-emacs-lisp" data-lang="emacs-lisp"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;(with-eval-after-load &lt;span style="color:#e6db74"&gt;&amp;#39;org&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; (setopt org-tags-exclude-from-inheritance &lt;span style="color:#f92672"&gt;&amp;#39;&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;crypt&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;(with-eval-after-load &lt;span style="color:#e6db74"&gt;&amp;#39;org-crypt&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; (setopt org-crypt-key &lt;span style="color:#e6db74"&gt;&amp;#34;0B10DAA7BA0236D7382287660F79C0AB03FD7A1C&amp;#34;&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;:crypt:&lt;/code&gt; タグをつけて &lt;code&gt;M-x org-encrypt-entries&lt;/code&gt; を実行すると次のようにGPGで暗号化される。
タグはヘッダで &lt;code&gt;C-c C-c&lt;/code&gt; を押すと入力できる。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;M-x org-decrypt-entries&lt;/code&gt; でファイル内全体を復号することも可能。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;:crypt:&lt;/code&gt; タグを変えたいなら &lt;code&gt;org-crypt-tag-matcher&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-org" data-lang="org"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;*&lt;span style="font-weight:bold"&gt; before&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;**&lt;/span&gt; access token
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#+begin_src &lt;/span&gt;&lt;span style="color:#75715e"&gt;text&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;&lt;span style="color:#75715e"&gt;&lt;/span&gt;P@ssw0rd
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#+end_src&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;*&lt;span style="font-weight:bold"&gt; after &lt;/span&gt;&lt;span style="font-style:italic"&gt; :crypt:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-----BEGIN PGP MESSAGE-----
&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;hQIMA6smtgkkGn+yAQ/+N67k5bFjZ+o/n3cRncdI7AXxZ4fcw7+vM9G/twKBkRqB
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;caleG2+FZy2u3ZHIE04ZnvKKPxZCDdm79Q6QxwBuuLsQiSn/jJ57QwNJySggQjwZ
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;aWQCzBFL5fBHgCR0eTZKX3Otr8Cpe2Eg1oH5SrUMEiRJ+uap+ZeVGs960icDy3AI
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;FRZ7z8BmaqFmA/ZRr3HO2nkFxJutzDnf7uCACa2JxpkJVDrhBOvGVrgHSqn/kzWu
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;+sriWo19z6O2mvVoWXOeg/3PNOP76ZCYFmqAa5zqoutBZ3GVEZ4M&lt;span style="color:#f92672"&gt;+uBcFJtQ6BHT
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;LgWLGNBEJeNjVWF1kGQYot4iArzrSbRzvNsEFzCiGyVYukgJSJuWWlC93aL4bJH+&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;c52Grie0DDacmiCADUVdUabvx16r82ptRylqV6um7mqdYGmPUErLhkp6zOwwhLgx
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;saAG4lY07DZeEdBtUfnYB39CRqxI/jVwSYoyTQC9PYUyo2y4E7Q2LjcoSyuJ8sPr
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;qgenSMn0gkF86ffm2ITmHDv5iQPgfhdzYIjtwrrDBpwCRkkoDfD68nS/zvekAe74
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;mO3fUOoM8jmMtQvCo9OMnVKkEXRXnzsyMI12KVIzMakljxnzvgDaELr5s6XTR/0F
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;FgAP19OQNbf24Ax3W+/m5GYxf5ltm+W4qDO0add5z2WLavOYGdknCCLFSN74/VLS
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;bwHums4w2RPZ00nnEX5zI+eN76UM42yZ53gDRjQgfVzfKdX4Rub/D19ZhL+bfqXR
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;iOJwPGz6yfeCDbz4RVvQgd/U8g5LkTrRu/itq9eZpCEjfH/HamC4meOrChI7xvJZ
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;nBkMYucqr7d5DPWEp4gYzQ==
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;=/Ual
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-----END PGP MESSAGE-----
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="org-babel-tangle-との連携"&gt;&lt;code&gt;org-babel-tangle&lt;/code&gt; との連携&lt;/h2&gt;
&lt;p&gt;自分のユースケースだと &lt;code&gt;org-babel-tangle&lt;/code&gt; と組み合わせて実行するのだが、 &lt;code&gt;org-babel-tangle&lt;/code&gt; はencrypt/decryptとは関係のない処理ですので、実行前後でencrypt/decryptする必要がある。&lt;/p&gt;</description></item><item><title>個人的devenv運用</title><link>https://www.takeokunn.org/posts/fleeting/20250126135045-personal_devenv_tips/</link><pubDate>Mon, 27 Jan 2025 00:00:00 +0000</pubDate><guid>https://www.takeokunn.org/posts/fleeting/20250126135045-personal_devenv_tips/</guid><description>&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;devenvをヘビーユーズしているので、個人的なdevenv運用についてやTipsについてまとめる。&lt;/p&gt;
&lt;h2 id="devenvとは"&gt;devenvとは&lt;/h2&gt;
&lt;p&gt;devenvはcachix社が作っているflake.nixラッパ。
&lt;a href="https://devenv.sh/"&gt;https://devenv.sh/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;flake.nixよりも圧倒的に高級に書ける割に柔軟性がかなり高いのでプロジェクトに必要なツールを入れる場合に便利。&lt;/p&gt;
&lt;p&gt;類似ールにdevboxがありますが、devboxはjsonでのみ記述できるので個人的にはNixで書けるdevenvの方が好み。&lt;/p&gt;
&lt;h2 id="devevnの個人的な期待役割"&gt;devevnの個人的な期待役割&lt;/h2&gt;
&lt;p&gt;自分のローカル環境でNixが担っている役割は以下。
自分の手元にはNixOSとMacとAndroidのマシンがありますが、環境ごとの役割の差異は特にないです。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;システム設定
&lt;ul&gt;
&lt;li&gt;e.g. network, font, daemon&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;システムグローバルのパッケージ管理
&lt;ul&gt;
&lt;li&gt;e.g. fish, Git, Emacs&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;プロジェクト固有のパッケージ管理+α
&lt;ul&gt;
&lt;li&gt;e.g. php, language-server, pre-commit&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;プロジェクト固有のビルドツール&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;code&gt;1. システム設定&lt;/code&gt; と &lt;code&gt;2. システムグローバルのパッケージ管理&lt;/code&gt; は &lt;a href="https://github.com/takeokunn/nixos-configuration"&gt;takeokunn/nixos-configuration&lt;/a&gt; が担っている。
&lt;code&gt;4. ビルドツール&lt;/code&gt; は &lt;a href="https://www.takeokunn.org/posts/fleeting/20250126114218-build_and_deploy_typst_using_nix/"&gt;NixでTypstをBuildしGitHub Pagesでホスティングする&lt;/a&gt; のように &lt;code&gt;flake.nix&lt;/code&gt; を定義して使っている。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;3. プロジェクト固有のパッケージ管理+α&lt;/code&gt; をdevenvが担っており、 &lt;code&gt;2. システムグローバルのパッケージ管理&lt;/code&gt; は必要最小限に抑えているので都度インストールする必要がある。&lt;/p&gt;
&lt;p&gt;自分は普通の人よりも幅広い言語やフレームワークのリポジトリを扱うので、逐次必要なツールを明示的に入れている。
自分の為に用意しているので、プロジェクトには &lt;code&gt;git push&lt;/code&gt; せず、自分用プライベートリポジトリで管理している。&lt;/p&gt;
&lt;p&gt;また Emacsからもよい感じにpackageを実行できるようにする必要があるので工夫が必要。&lt;/p&gt;
&lt;h2 id="実運用"&gt;実運用&lt;/h2&gt;
&lt;h3 id="laravelプロジェク用devenvのサンプルコード"&gt;Laravelプロジェク用devenvのサンプルコード&lt;/h3&gt;
&lt;p&gt;実際に会社のLaravelプロジェクトで使っているコードは以下。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;language serverやawscliなどプロジェクで必要なものは都度入れている&lt;/li&gt;
&lt;li&gt;言語のバージョンを大まかに定義する
&lt;ul&gt;
&lt;li&gt;phpなら &lt;code&gt;8.2&lt;/code&gt; という定義をして、 &lt;code&gt;8.2.x&lt;/code&gt; レベルの細かい指定まではしない&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;php.iniはdevenv内で定義する&lt;/li&gt;
&lt;li&gt;pre-commitをストレスのない範囲で可能な限り設定する
&lt;ul&gt;
&lt;li&gt;ref. &lt;a href="https://devenv.sh/reference/options/#pre-commit"&gt;https://devenv.sh/reference/options/#pre-commit&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;!--listend--&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-nix" data-lang="nix"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{ pkgs&lt;span style="color:#f92672"&gt;,&lt;/span&gt; config&lt;span style="color:#f92672"&gt;,&lt;/span&gt; inputs&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; cachix&lt;span style="color:#f92672"&gt;.&lt;/span&gt;enable &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;false&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; dotenv&lt;span style="color:#f92672"&gt;.&lt;/span&gt;disableHint &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;true&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; env&lt;span style="color:#f92672"&gt;.&lt;/span&gt;COMPOSER_MEMORY_LIMIT &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;4G&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; packages &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;with&lt;/span&gt; pkgs; [ gh hub nodePackages_latest&lt;span style="color:#f92672"&gt;.&lt;/span&gt;intelephense ssm-session-manager-plugin tbls rain mariadb awscli ];
&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; languages&lt;span style="color:#f92672"&gt;.&lt;/span&gt;javascript &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; enable &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; package &lt;span style="color:#f92672"&gt;=&lt;/span&gt; pkgs&lt;span style="color:#f92672"&gt;.&lt;/span&gt;nodejs_20;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; yarn&lt;span style="color:#f92672"&gt;.&lt;/span&gt;enable &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;true&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; languages&lt;span style="color:#f92672"&gt;.&lt;/span&gt;php &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; enable &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; package &lt;span style="color:#f92672"&gt;=&lt;/span&gt; pkgs&lt;span style="color:#f92672"&gt;.&lt;/span&gt;php82&lt;span style="color:#f92672"&gt;.&lt;/span&gt;buildEnv {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; extensions &lt;span style="color:#f92672"&gt;=&lt;/span&gt; { all&lt;span style="color:#f92672"&gt;,&lt;/span&gt; enabled }: &lt;span style="color:#66d9ef"&gt;with&lt;/span&gt; all; enabled &lt;span style="color:#f92672"&gt;++&lt;/span&gt; [ xdebug ];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; extraConfig &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; memory_limit=-1
&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;&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; };
&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; pre-commit&lt;span style="color:#f92672"&gt;.&lt;/span&gt;hooks &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; actionlint&lt;span style="color:#f92672"&gt;.&lt;/span&gt;enable &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; editorconfig-checker&lt;span style="color:#f92672"&gt;.&lt;/span&gt;enable &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; check-json&lt;span style="color:#f92672"&gt;.&lt;/span&gt;enable &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; check-merge-conflicts&lt;span style="color:#f92672"&gt;.&lt;/span&gt;enable &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; check-yaml&lt;span style="color:#f92672"&gt;.&lt;/span&gt;enable &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; check-case-conflicts&lt;span style="color:#f92672"&gt;.&lt;/span&gt;enable &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;true&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="org-tangleして各プロジェクトに配置"&gt;org-tangleして各プロジェクトに配置&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://github.com/emacs-mirror/emacs"&gt;emacs-mirror/emacs&lt;/a&gt; の場合は次のようなOrgファイルを定義して &lt;code&gt;org-babel-tangle&lt;/code&gt; する。
&lt;code&gt;devenv.lock&lt;/code&gt; は管理運用方法は現状思いついてないので諦めている。&lt;/p&gt;</description></item><item><title>NixでTypstをBuildしGitHub Pagesでホスティングする</title><link>https://www.takeokunn.org/posts/fleeting/20250126114218-build_and_deploy_typst_using_nix/</link><pubDate>Sun, 26 Jan 2025 00:00:00 +0000</pubDate><guid>https://www.takeokunn.org/posts/fleeting/20250126114218-build_and_deploy_typst_using_nix/</guid><description>&lt;h2 id="背景"&gt;背景&lt;/h2&gt;
&lt;p&gt;スライドや組版記事を生成する為にTypstを採用することにした。
工数を最小限に安定的に量産できるようなしくみを整える必要が迫られていたので、今回対応したことをメモしておく。&lt;/p&gt;
&lt;p&gt;ソースコードは&lt;a href="https://github.com/takeokunn/blog/tree/11609d8503ffd9b9eb8a3e2a5d19f3f51ee5b579/typst"&gt;takeokunn/blogのtypstディレクトリ下&lt;/a&gt;に置いている。&lt;/p&gt;
&lt;h2 id="条件"&gt;条件&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;MUST
&lt;ul&gt;
&lt;li&gt;Localに一切依存しない再現性の高いBuild環境構築&lt;/li&gt;
&lt;li&gt;org-modeで記述できる&lt;/li&gt;
&lt;li&gt;Typstのエコシステムを使う&lt;/li&gt;
&lt;li&gt;スライド生成と組版記事両方に対応する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;SHOULD
&lt;ul&gt;
&lt;li&gt;takeokunn.orgから配信できる&lt;/li&gt;
&lt;li&gt;リリースまでのリードタイムが短い&lt;/li&gt;
&lt;li&gt;org-roamなど周辺のエコシステムとの親和性を高める&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="方針"&gt;方針&lt;/h2&gt;
&lt;p&gt;次の3ステップで実現した。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;org-modeで記述したファイルをTypstに変換&lt;/li&gt;
&lt;li&gt;NixでTypstをBuildできるようにする&lt;/li&gt;
&lt;li&gt;GitHub ActionsでBuildしてGitHub Pagesで配信できる&lt;/li&gt;
&lt;/ul&gt;
&lt;figure&gt;&lt;img src="https://www.takeokunn.org/images/D91F417B-0FFC-4C67-A814-A267565ADE63.png"&gt;
&lt;/figure&gt;
&lt;h2 id="作業ステップ"&gt;作業ステップ&lt;/h2&gt;
&lt;h3 id="0-dot-どこに置くか検討"&gt;0. どこに置くか検討&lt;/h3&gt;
&lt;p&gt;以下を理由に &lt;a href="https://github.com/takeokunn/blog"&gt;takeokunn/blog&lt;/a&gt; 上に構築することにした。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.takeokunn.org/"&gt;takeokunn.org&lt;/a&gt; から配信できる&lt;/li&gt;
&lt;li&gt;既存のorg-roam上に相乗りできる&lt;/li&gt;
&lt;li&gt;新しいリポジトリを作ると関心ことが増える&lt;/li&gt;
&lt;li&gt;すでにあるGitHub Actions上に構築することによって実装コストとメンテナンスコストを抑えられる&lt;/li&gt;
&lt;li&gt;今回の用途だと作業途中でもパブリックにして問題がない&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;商業誌のような公開制限をかける必要のあるものは都度プライベートリポジトリを作って対応することにした。&lt;/p&gt;
&lt;h3 id="1-dot-org-modeで記述したファイルをtypstに変換"&gt;1. org-modeで記述したファイルをTypstに変換&lt;/h3&gt;
&lt;p&gt;組版記事の場合、&lt;a href="https://github.com/jmpunkt/ox-typst"&gt;jmpunkt/ox-typst&lt;/a&gt; を用いて通常とおりOrgファイルをTypstに変換する。(&lt;code&gt;M-x org-typst-export-to-typst&lt;/code&gt; を実行)&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/takeokunn/blog/blob/11609d8503ffd9b9eb8a3e2a5d19f3f51ee5b579/typst/phperkaigi-2025-pamphlet/article.org"&gt;PHPerKaigi2025のパンフ記事&lt;/a&gt;の場合、次のようにTypstの設定をExportしている。&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-org" data-lang="org"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#+BEGIN_EXPORT &lt;/span&gt;&lt;span style="color:#75715e"&gt;typst&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;#set&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;text&lt;/span&gt;(lang: &lt;span style="color:#e6db74"&gt;&amp;#34;ja&amp;#34;&lt;/span&gt;, font: &lt;span style="color:#e6db74"&gt;&amp;#34;Migu&amp;#34;&lt;/span&gt;, size: &lt;span style="color:#ae81ff"&gt;8&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;pt&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;#set&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;page&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; width: &lt;span style="color:#ae81ff"&gt;210&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;mm&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; height: &lt;span style="color:#ae81ff"&gt;297&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;mm&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; margin: &lt;span style="color:#ae81ff"&gt;20&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;mm&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; columns: &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;
&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 style="color:#e6db74"&gt;&amp;#34;@preview/codly:1.2.0&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:#f92672"&gt;#import&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;@preview/codly-languages:0.1.1&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;#show&lt;/span&gt;: codly-init.&lt;span style="color:#a6e22e"&gt;with&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;#codly&lt;/span&gt;(languages: codly-languages)
&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;#align&lt;/span&gt;(center)[
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;#set&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;text&lt;/span&gt;(size: &lt;span style="color:#ae81ff"&gt;18&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;pt&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Phpactorから学ぶLanguage Server Protocolの仕組み
&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;#set&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;text&lt;/span&gt;(size: &lt;span style="color:#ae81ff"&gt;12&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;pt&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; たけてぃ \@takeokunn
&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:#75715e"&gt;#+END_EXPORT&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;スライドの場合、 Orgファイルには登壇メモをしつつ、 &lt;code&gt;#+BEGIN_EXPORT typst&lt;/code&gt; のみ出力してほしかったので次のようなElispを書いた。&lt;/p&gt;</description></item><item><title>2024年 全体振り返り</title><link>https://www.takeokunn.org/posts/permanent/20241221130328-retrospective_2024/</link><pubDate>Sun, 05 Jan 2025 00:00:00 +0000</pubDate><guid>https://www.takeokunn.org/posts/permanent/20241221130328-retrospective_2024/</guid><description>&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;2024年振り返りの振り返り記事です。
立てた目標に対してどうだったか、2025年はどうするべきかを書いておきます。&lt;/p&gt;
&lt;h2 id="年始に立てた目標"&gt;年始に立てた目標&lt;/h2&gt;
&lt;p&gt;プログラミングのほぼすべての問題は「Aという問題に対してBというツールを使ってCをする」の連続だということに気がつきました。
「日報を書く時はorg-modeのテンプレートを使って記述する」や「日本語を書く時はskkを使って入力する」など、それぞれの問題は細分化をするとほぼすべてこの形式になります。&lt;/p&gt;
&lt;p&gt;プログラマーは得てしてAという問題を解決したいだけなのに、「BよりB&amp;rsquo;の方がよいのではないか」と検証をし始めていっこうにCできないものです。
とはいえツールの選定は生産性に直結するので重要でありそこの塩梅が非常に難しいです。&lt;/p&gt;
&lt;p&gt;そこで2024年は5年後も使えるであろうツールの選定を十分にすることにしました。
自分が持っているすべての「Aという問題に対してBというツールを使ってCをする」をテンプレ化し、再利用性と再現性を高くするのを目標にしました。&lt;/p&gt;
&lt;p&gt;いろいろな話を見聞きした結果、次の3つを頑張るのが良さそうだということで目標に据えました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;文芸的プログラミング（org-mode）&lt;/li&gt;
&lt;li&gt;Nix&lt;/li&gt;
&lt;li&gt;LLM/Local LLM&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="目標に対しての振り返り"&gt;目標に対しての振り返り&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;目標&lt;/th&gt;
&lt;th&gt;自己評価&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;文芸的プログラミング&lt;/td&gt;
&lt;td&gt;○&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Nix&lt;/td&gt;
&lt;td&gt;◎&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LLM/Local LLM&lt;/td&gt;
&lt;td&gt;△&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;2024年はNix元年というくらい、Nixに大量に時間を投資したのは大成功でした。
自分が持っているほぼすべての設定を &lt;a href="https://github.com/takeokunn/nixos-configuration"&gt;takeokunn/nixos-configuration&lt;/a&gt; とprivate repoに移植しました。
明示的にコードに落とすことによって、自分は今何をどういう設定でどういう用途で使っているのかを明確にできました。&lt;/p&gt;
&lt;p&gt;文芸的プログラミングは去年書いた &lt;a href="https://www.takeokunn.org/posts/permanent/20240112071806-my_relationship_with_org_mode_in_2023_and_how_navigate_in_2024/"&gt;2023年のorg-mode活用と今後の抱負&lt;/a&gt; から大きな進展はないですが、細やかな改善をたくさん行えた結果、ほぼテンプレ行動でやりたいことを実現できるようになりました。&lt;/p&gt;
&lt;p&gt;LLM/Local LLMに関しては、どのくらいの将来性があるのか、やりこむとしたら何をやればよいのか、Local LLMなら何ができるのか等を自分の中で整理するというのが目標でした。
一応自分の中では整理がついたのでそれは良かったのですが、Difyの活用やワークフローに落とし込む所までは間に合わなかったです。&lt;/p&gt;
&lt;h2 id="コミュニティ活動"&gt;コミュニティ活動&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;時期&lt;/th&gt;
&lt;th&gt;イベント名&lt;/th&gt;
&lt;th&gt;役割&lt;/th&gt;
&lt;th&gt;登壇スライド&lt;/th&gt;
&lt;th&gt;関連&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1月&lt;/td&gt;
&lt;td&gt;&lt;a href="https://phpcon.hokkaido.jp/"&gt;PHPカンファレンス北海道&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;参加者&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.takeokunn.org/posts/diary/20240112063123-retrospective_phpcondo_2024/"&gt;PHPカンファレンス北海道2024に参加してきました&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3月&lt;/td&gt;
&lt;td&gt;&lt;a href="https://phperkaigi.jp/2024/"&gt;phperkaigi 2024&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;パンフ記事執筆&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.takeokunn.org/posts/permanent/20240107122028-how_to_syntax_highlight_in_text_editor/"&gt;テキストエディタがPHPをシンタックスハイライトする仕組みとモダンテキストエディタ事情について&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4月&lt;/td&gt;
&lt;td&gt;&lt;a href="https://phpcon-odawara.jp/2024/"&gt;PHPカンファレンス小田原&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;登壇&lt;/td&gt;
&lt;td&gt;&lt;a href="https://docs.google.com/presentation/d/1436T1dx_0igdNzNCVpGIf0kVA5wOVF4kcVmH9VRJobA/edit#slide=id.p"&gt;Laravelに0からPHPStanを導入して継続的に運用する方法&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6月&lt;/td&gt;
&lt;td&gt;&lt;a href="https://phpcon.fukuoka.jp/2024/"&gt;PHPカンファレンス福岡&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;登壇&lt;/td&gt;
&lt;td&gt;&lt;a href="https://docs.google.com/presentation/d/1I5yWPV_hIOaN0FfRQPwyhdQTVFv2uQEK0A08sMHPLiA/edit#slide=id.p"&gt;Nixを用いて再現可能なPHP環境を用意する&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8月&lt;/td&gt;
&lt;td&gt;&lt;a href="https://tokyo-emacs.connpass.com/event/321255/"&gt;東京Emacs勉強会 サマーフェスティバル2024&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;主催&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10月&lt;/td&gt;
&lt;td&gt;&lt;a href="https://nix-ja.connpass.com/event/330557/"&gt;Nix meetup #1&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;主催、登壇&lt;/td&gt;
&lt;td&gt;&lt;a href="https://docs.google.com/presentation/d/1So6l6JTNlZkrQDxf99kMFIlPB34TuNdQjpNwgxIBSFo/edit#slide=id.p"&gt;nix-shell+org-modeで文芸的プログラミング&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;11月&lt;/td&gt;
&lt;td&gt;&lt;a href="https://techbookfest.org/event/tbf17"&gt;技術書展17&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;売り子&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://techbookfest.org/product/f7rPGt7NeeDuqxYdE3Teyc?productVariantID=hATFZbCg6sJxMt5dCXPn4x"&gt;めだかのclojure.core学校 conao3&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;11月&lt;/td&gt;
&lt;td&gt;&lt;a href="https://vimconf-2024-ticket.peatix.com/"&gt;VimConf 2024&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;個人スポンサー&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.takeokunn.org/posts/diary/20241123101757-participation_vimconf_2024/"&gt;VimConf2024 参加記&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;12月&lt;/td&gt;
&lt;td&gt;&lt;a href="https://isucon.net/archives/58869617.html"&gt;ISUCON14&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;競技者&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://zenn.dev/takeokunn/articles/20241217090756"&gt;ISUCON14にチームOL001として参加しました(インフラ編)&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;12月&lt;/td&gt;
&lt;td&gt;&lt;a href="https://phpcon.php.gr.jp/2024/"&gt;PHPカンファレンス東京&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;企業スポンサー&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;今年は毎月のように何かがあった1年でした。&lt;/p&gt;</description></item><item><title>VimConf2024 参加記</title><link>https://www.takeokunn.org/posts/diary/20241123101757-participation_vimconf_2024/</link><pubDate>Sat, 23 Nov 2024 00:00:00 +0000</pubDate><guid>https://www.takeokunn.org/posts/diary/20241123101757-participation_vimconf_2024/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;
&lt;p&gt;2024-11-23 Satに行われたvimconf 2024に参加しました。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://vimconf.org/2024/"&gt;https://vimconf.org/2024/&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="登壇感想"&gt;登壇感想&lt;/h2&gt;
&lt;p&gt;英語の登壇であること、前日はしゃいで睡眠不足あったので聞き逃した所もあるが登壇メモを書いておく。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://vimconf.org/2024/sessions/"&gt;https://vimconf.org/2024/sessions/&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="keynote-the-new-vim-project-what-has-changed-after-bram-by-christian-brabandt"&gt;Keynote - The new Vim project - What has changed after Bram by Christian Brabandt&lt;/h3&gt;
&lt;h4 id="一言"&gt;一言&lt;/h4&gt;
&lt;p&gt;vim projectを引き継ぐにあたって大変なことについて。
vim本体のコードの引き継ぎも大変だけど、それ以外の引き継ぎも大変だったという話。&lt;/p&gt;
&lt;h4 id="内容メモ"&gt;内容メモ&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Bramが超人すぎて引き継ぎ量が多い&lt;/li&gt;
&lt;li&gt;git repoの引き継ぎ
&lt;ul&gt;
&lt;li&gt;権限周りや新しいメンテナの招待&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;vim.org のホームページ引き継ぎ
&lt;ul&gt;
&lt;li&gt;php5/7とか古いバージョン&lt;/li&gt;
&lt;li&gt;DBやらドメインやら&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Emailアカウント周り&lt;/li&gt;
&lt;li&gt;Google Groupを使ってる
&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;a href="https://huntr.com/bounties/63f51299-008a-4112-b85b-1e904aadd4ba"&gt;Huntr&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;GitHub security advisory&lt;/li&gt;
&lt;li&gt;private mailing list&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://iccf-holland.org/"&gt;ICCF&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;まだ動いてるし、変えずにやっていく&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.vim.org/sponsor/vote_results.php"&gt;voting feature&lt;/a&gt; は廃止&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;開発進捗
&lt;ul&gt;
&lt;li&gt;Development did not stop&lt;/li&gt;
&lt;li&gt;Vim9 classサポート&lt;/li&gt;
&lt;li&gt;XDGサポート/Editorconfigサポート/Waylandサポート&lt;/li&gt;
&lt;li&gt;BC Breakが起きないように十分にテストをする&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;コミュニティにとって何が重要か
&lt;ul&gt;
&lt;li&gt;e.g. IDEっぽいことができた方が良いか、エディタのままでいいか&lt;/li&gt;
&lt;li&gt;e.g. Vim9は楽しいかどうか等&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;開発者に求めてること
&lt;ul&gt;
&lt;li&gt;安全なC関数を使う&lt;/li&gt;
&lt;li&gt;CIを通してカバレッジの確認をするなど&lt;/li&gt;
&lt;li&gt;管理しやすいようにリファクタリングをする&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;何を改善すべきか
&lt;ul&gt;
&lt;li&gt;GUI(GTK4)などのサポートを向上させるかどうか&lt;/li&gt;
&lt;li&gt;Tree-sitterサポートするかどうか&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;結論
&lt;ul&gt;
&lt;li&gt;Vimメンテナンスは大変&lt;/li&gt;
&lt;li&gt;コミュニティを健全性を維持したい&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;質疑応答
&lt;ul&gt;
&lt;li&gt;NeovimとVimは相互に協力して開発を進めていきたい&lt;/li&gt;
&lt;li&gt;Vimにコントリビューションを始める方法を教えてほしい
&lt;ul&gt;
&lt;li&gt;ドキュメントなど全ての貢献に感謝してる&lt;/li&gt;
&lt;li&gt;Vim scriptのC言語を読めば良い&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;貴方が独裁者になってない?
&lt;ul&gt;
&lt;li&gt;自分が休暇中は他の人がmerge作業をしてる&lt;/li&gt;
&lt;li&gt;コミュニティの意向を尊重してmergeしてる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;言語の壁でも越えるのが大変だけどどうしてる?
&lt;ul&gt;
&lt;li&gt;英語でコミュニケーションしかできない&lt;/li&gt;
&lt;li&gt;メンテナは各国にいるので英語がコミュニケーションの言語になってる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;初心者に対してどういうことを期待してる?
&lt;ul&gt;
&lt;li&gt;まず日本のコミュニティに繋がることから始めると良い&lt;/li&gt;
&lt;li&gt;他の人から学ぶ、バグレポートから始めたり、ソースコードをチェックしてどう変更されたのか確認する、テストをする&lt;/li&gt;
&lt;li&gt;ソースコードに馴染んできた時にパッチを送ると良い&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="keynote--neo--vim-made-me-a-better-software-developer-by-tj-devries"&gt;Keynote - (Neo)Vim Made Me a Better Software Developer by TJ DeVries&lt;/h3&gt;
&lt;h4 id="一言"&gt;一言&lt;/h4&gt;
&lt;p&gt;Neovimの話というよりは仕事のやり方に通じるものだった。
youtuberっぽい警戒なトークで面白すぎた。&lt;/p&gt;</description></item><item><title>tcardgenをnixでパッケージ化する方法</title><link>https://www.takeokunn.org/posts/fleeting/20241122091116-how_to_package_tcardgen_with_nix/</link><pubDate>Fri, 22 Nov 2024 00:00:00 +0000</pubDate><guid>https://www.takeokunn.org/posts/fleeting/20241122091116-how_to_package_tcardgen_with_nix/</guid><description>&lt;h2 id="背景"&gt;背景&lt;/h2&gt;
&lt;p&gt;HugoからOGPを動的に吐き出すツールとして &lt;a href="https://github.com/Ladicle/tcardgen"&gt;Ladicle/tcardgen&lt;/a&gt; がある。
2024/11/22 現在当ブログでも利用していて、 &lt;a href="https://github.com/takeokunn/blog"&gt;takeokunn/blog&lt;/a&gt; のNix化に伴い tcardgen もNixでパッケージングする必要があった。&lt;/p&gt;
&lt;h2 id="流れ"&gt;流れ&lt;/h2&gt;
&lt;h3 id="1-dot-自作nur-packages-に登録"&gt;1. 自作nur-packages に登録&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://github.com/takeokunn/nur-packages"&gt;takeokunn/nur-packages&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-nix" data-lang="nix"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{ buildGoModule&lt;span style="color:#f92672"&gt;,&lt;/span&gt; fetchFromGitHub }:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;buildGoModule {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; pname &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;tcardgen&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; version &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;0.0.1&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; src &lt;span style="color:#f92672"&gt;=&lt;/span&gt; fetchFromGitHub {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; owner &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Ladicle&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;tcardgen&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; rev &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;2222547ac37c2d6e1961b00acef3771f48ac8220&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; hash &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;sha256-6Z4SWpjdPMMCC6xm+xjSNAWQpO2FD91p+Mk9Y+Hh7AY=&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; vendorHash &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; doCheck &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;false&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; meta &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; description &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Generate a TwitterCard(OGP) image for your Hugo posts.&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; homepage &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;https://github.com/Ladicle/tcardgen&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; mainProgram &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;tcardgen&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;src&lt;/code&gt; 部分は &lt;a href="https://github.com/seppeljordan/nix-prefetch-github"&gt;seppeljordan/nix-prefetch-github&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-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ nix-shell -p nix-prefetch-github
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ nix-prefetch-github-latest-release --nix Ladicle tcardgen
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;let
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; pkgs &lt;span style="color:#f92672"&gt;=&lt;/span&gt; import &amp;lt;nixpkgs&amp;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;in
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; pkgs.fetchFromGitHub &lt;span style="color:#f92672"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; owner &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Ladicle&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;tcardgen&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; rev &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;2222547ac37c2d6e1961b00acef3771f48ac8220&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; hash &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;sha256-6Z4SWpjdPMMCC6xm+xjSNAWQpO2FD91p+Mk9Y+Hh7AY=&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;h3 id="2-dot-手元のbuildが通ることを確認"&gt;2. 手元のBuildが通ることを確認&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;vendorHash&lt;/code&gt; は空文字にしてbuildをするとエラーメッセージに書いてあるのでそれを埋める。&lt;/p&gt;</description></item><item><title>2024年版private-isu構築メモ</title><link>https://www.takeokunn.org/posts/fleeting/20241117172034-how_to_launch_private_isu_2024/</link><pubDate>Sun, 17 Nov 2024 00:00:00 +0000</pubDate><guid>https://www.takeokunn.org/posts/fleeting/20241117172034-how_to_launch_private_isu_2024/</guid><description>&lt;h2 id="背景"&gt;背景&lt;/h2&gt;
&lt;p&gt;ISUCON14の練習の為&lt;a href="https://github.com/catatsuy/private-isu"&gt;catatsuy/private-isu&lt;/a&gt;を自分のAWSに構築しようとしたが、 &lt;a href="https://gist.github.com/tohutohu/024551682a9004da286b0abd6366fa55"&gt;tohutohu/private-isu.yaml - gist&lt;/a&gt;が構築できなかったのでメモ。&lt;/p&gt;
&lt;h2 id="問題点"&gt;問題点&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://gist.github.com/tohutohu/024551682a9004da286b0abd6366fa55"&gt;tohutohu/private-isu.yaml - gist&lt;/a&gt; のCloudFormationをそのまま起動しようとするとAMIがないと怒られる。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;ImageId&lt;/th&gt;
&lt;th&gt;InstanceType&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;server&lt;/td&gt;
&lt;td&gt;ami-0d92a4724cae6f07b&lt;/td&gt;
&lt;td&gt;c6i.large&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;bench&lt;/td&gt;
&lt;td&gt;ami-0582a2a7fbe79a30d&lt;/td&gt;
&lt;td&gt;c6i.xlarge&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;AMIの検索は以下から行う。
&lt;a href="https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/finding-an-ami.html"&gt;https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/finding-an-ami.html&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="修正方法"&gt;修正方法&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://github.com/catatsuy/private-isu?tab=readme-ov-file#ami"&gt;catatsuy/private-isu#ami&lt;/a&gt; に動くAMIが記述されているのでそちらに修正し、費用面を考慮して &lt;code&gt;InstanceType&lt;/code&gt; を次のように修正した。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;ImageId&lt;/th&gt;
&lt;th&gt;InstanceType&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;server&lt;/td&gt;
&lt;td&gt;ami-047fdc2b851e73cad&lt;/td&gt;
&lt;td&gt;t2.medium&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;bench&lt;/td&gt;
&lt;td&gt;ami-037be39355baf1f2e&lt;/td&gt;
&lt;td&gt;t2.medium&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;また、 &lt;code&gt;KeyPairName&lt;/code&gt; は不要なので削除した。&lt;/p&gt;
&lt;p&gt;実際のCloudFormationは以下。&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-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;AWSTemplateFormatVersion&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#39;2010-09-09&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;Description&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;private-isu template&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;Parameters&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;GitHubUsername&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;Description&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;GitHub Username for SSH public key&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;Type&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;String&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;Resources&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;VPC&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;Type&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;AWS::EC2::VPC&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;Properties&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;CidrBlock&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#39;192.168.0.0/16&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;MySubnet&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;Type&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;AWS::EC2::Subnet&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;Properties&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;VpcId&lt;/span&gt;: !&lt;span style="color:#ae81ff"&gt;Ref VPC&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;CidrBlock&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#39;192.168.1.0/24&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;AvailabilityZone&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;ap-northeast-1a&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;MyInternetGateway&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;Type&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;AWS::EC2::InternetGateway&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;AttachGateway&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;Type&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;AWS::EC2::VPCGatewayAttachment&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;Properties&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;VpcId&lt;/span&gt;: !&lt;span style="color:#ae81ff"&gt;Ref VPC&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;InternetGatewayId&lt;/span&gt;: !&lt;span style="color:#ae81ff"&gt;Ref MyInternetGateway&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;MyRouteTable&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;Type&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;AWS::EC2::RouteTable&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;Properties&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;VpcId&lt;/span&gt;: !&lt;span style="color:#ae81ff"&gt;Ref VPC&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;PublicRoute&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;Type&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;AWS::EC2::Route&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;DependsOn&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;AttachGateway&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;Properties&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;RouteTableId&lt;/span&gt;: !&lt;span style="color:#ae81ff"&gt;Ref MyRouteTable&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;DestinationCidrBlock&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;0.0.0.0&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:#f92672"&gt;GatewayId&lt;/span&gt;: !&lt;span style="color:#ae81ff"&gt;Ref MyInternetGateway&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;SubnetRouteTableAssociation&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;Type&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;AWS::EC2::SubnetRouteTableAssociation&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;Properties&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;SubnetId&lt;/span&gt;: !&lt;span style="color:#ae81ff"&gt;Ref MySubnet&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;RouteTableId&lt;/span&gt;: !&lt;span style="color:#ae81ff"&gt;Ref MyRouteTable&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;MySecurityGroup&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;Type&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;AWS::EC2::SecurityGroup&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;Properties&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;GroupDescription&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;Enable SSH, HTTP, HTTPS access&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;VpcId&lt;/span&gt;: !&lt;span style="color:#ae81ff"&gt;Ref VPC&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;SecurityGroupIngress&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;IpProtocol&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;tcp&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;FromPort&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;22&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;ToPort&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;22&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;CidrIp&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;0.0.0.0&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:#f92672"&gt;IpProtocol&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;tcp&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;FromPort&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;80&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;ToPort&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;80&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;CidrIp&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;0.0.0.0&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:#f92672"&gt;IpProtocol&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;tcp&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;FromPort&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;443&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;ToPort&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;443&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;CidrIp&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;0.0.0.0&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:#f92672"&gt;IpProtocol&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 style="color:#f92672"&gt;CidrIp&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;192.168.0.0&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;/16&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;ServerInstance&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;Type&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;AWS::EC2::Instance&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;Properties&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;InstanceType&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;t2.medium&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;ImageId&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;ami-047fdc2b851e73cad&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;SubnetId&lt;/span&gt;: !&lt;span style="color:#ae81ff"&gt;Ref MySubnet&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;PrivateIpAddress&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#39;192.168.1.10&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;SecurityGroupIds&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - !&lt;span style="color:#ae81ff"&gt;Ref MySecurityGroup&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;UserData&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;Fn::Base64&lt;/span&gt;: !&lt;span style="color:#ae81ff"&gt;Sub |&lt;/span&gt;
&lt;/span&gt;&lt;/span&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 style="color:#ae81ff"&gt;GITHUB_USER=${GitHubUsername}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ae81ff"&gt;mkdir -p /home/isucon/.ssh&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ae81ff"&gt;curl -s https://github.com/$GITHUB_USER.keys &amp;gt;&amp;gt; /home/isucon/.ssh/authorized_keys&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ae81ff"&gt;chown -R isucon:isucon /home/isucon/.ssh&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ae81ff"&gt;chmod 600 /home/isucon/.ssh/authorized_keys&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;BenchmarkerInstance&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;Type&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;AWS::EC2::Instance&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;Properties&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;InstanceType&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;t2.medium&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;ImageId&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;ami-037be39355baf1f2e&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;SubnetId&lt;/span&gt;: !&lt;span style="color:#ae81ff"&gt;Ref MySubnet&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;PrivateIpAddress&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#39;192.168.1.20&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;SecurityGroupIds&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - !&lt;span style="color:#ae81ff"&gt;Ref MySecurityGroup&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;UserData&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;Fn::Base64&lt;/span&gt;: !&lt;span style="color:#ae81ff"&gt;Sub |&lt;/span&gt;
&lt;/span&gt;&lt;/span&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 style="color:#ae81ff"&gt;GITHUB_USER=${GitHubUsername}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ae81ff"&gt;mkdir -p /home/isucon/.ssh&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ae81ff"&gt;curl -s https://github.com/$GITHUB_USER.keys &amp;gt;&amp;gt; /home/isucon/.ssh/authorized_keys&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ae81ff"&gt;chown -R isucon:isucon /home/isucon/.ssh&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ae81ff"&gt;chmod 600 /home/isucon/.ssh/authorized_keys&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;ServerEIP&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;Type&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;AWS::EC2::EIP&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;BenchmarkerEIP&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;Type&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;AWS::EC2::EIP&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;ServerEIPAssociation&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;Type&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;AWS::EC2::EIPAssociation&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;Properties&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;InstanceId&lt;/span&gt;: !&lt;span style="color:#ae81ff"&gt;Ref ServerInstance&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;EIP&lt;/span&gt;: !&lt;span style="color:#ae81ff"&gt;Ref ServerEIP&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;BenchmarkerEIPAssociation&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;Type&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;AWS::EC2::EIPAssociation&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;Properties&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;InstanceId&lt;/span&gt;: !&lt;span style="color:#ae81ff"&gt;Ref BenchmarkerInstance&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;EIP&lt;/span&gt;: !&lt;span style="color:#ae81ff"&gt;Ref BenchmarkerEIP&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;実際に練習するなら指定された環境のまま起動した方がよいだろうが、あくまで練習として &lt;code&gt;private-isu&lt;/code&gt; を立ち上げたいだけという今回の用途ではこれで十分。&lt;/p&gt;</description></item><item><title>GnuPG 2.4.4でEmacsで発生していたバグ修正された</title><link>https://www.takeokunn.org/posts/fleeting/20240127163627-fix_emacs_gpg_bug/</link><pubDate>Sat, 27 Jan 2024 00:00:00 +0000</pubDate><guid>https://www.takeokunn.org/posts/fleeting/20240127163627-fix_emacs_gpg_bug/</guid><description>&lt;h2 id="summary"&gt;Summary&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://www.takeokunn.org/posts/fleeting/20230624130858-how_to_escape_emacs_gpg_bug/"&gt;Emacs内でgpg fileがsaveできなくなった時に対応したことメモ&lt;/a&gt; にもあるとおり、GnuPG 2.4.0を使うとEasyPGが正常に動かないという問題があったが、GnuPGを2.4.4に上げると解決した。&lt;/p&gt;
&lt;h2 id="一連の流れ"&gt;一連の流れ&lt;/h2&gt;
&lt;blockquote class="twitter-tweet"&gt;&lt;p lang="ja" dir="ltr"&gt;以前も見て、私の環境ではならんなと思ってたけど、たんに gpgtools の gpg2 を読んでいたからだった。 &lt;a href="https://t.co/UdI5QtmC4N"&gt;https://t.co/UdI5QtmC4N&lt;/a&gt; &lt;a href="https://t.co/SNSj5Jd2DT"&gt;pic.twitter.com/SNSj5Jd2DT&lt;/a&gt;&lt;/p&gt;&amp;mdash; . (@takaxp) &lt;a href="https://twitter.com/takaxp/status/1751131754465996931?ref_src=twsrc%5Etfw"&gt;January 27, 2024&lt;/a&gt;&lt;/blockquote&gt; &lt;script async src="https://platform.twitter.com/widgets.js" charset="utf-8"&gt;&lt;/script&gt;
&lt;blockquote class="twitter-tweet"&gt;&lt;p lang="ja" dir="ltr"&gt;2.4.4 が降ってくれば直る説。&lt;a href="https://t.co/zG6kkrQg4s"&gt;https://t.co/zG6kkrQg4s&lt;/a&gt; &lt;a href="https://t.co/YqDEmiDJit"&gt;pic.twitter.com/YqDEmiDJit&lt;/a&gt;&lt;/p&gt;&amp;mdash; . (@takaxp) &lt;a href="https://twitter.com/takaxp/status/1751134178488512668?ref_src=twsrc%5Etfw"&gt;January 27, 2024&lt;/a&gt;&lt;/blockquote&gt; &lt;script async src="https://platform.twitter.com/widgets.js" charset="utf-8"&gt;&lt;/script&gt;
&lt;p&gt;&lt;a href="https://www.mail-archive.com/gnupg-users@gnupg.org/msg41435.html"&gt;Re: epg-encrypt-string in Emacs seems to be incompatible with GnuPG 2.4.1 on macOS, 2.4.0 works&lt;/a&gt; を見ていると、 &lt;code&gt;2.4.4&lt;/code&gt; で直るっぽいとの記述がある。&lt;/p&gt;
&lt;p&gt;GnuPG側の変更は&lt;a href="https://git.gnupg.org/cgi-bin/gitweb.cgi?p=gnupg.git;a=commit;h=2f872fa68c6576724b9dabee9fb0844266f55d0d"&gt;こちら&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;Homebrewではすでに&lt;a href="https://github.com/Homebrew/homebrew-core/commit/efdeda1c8613c9eda4b75ec6603e876fab593cd9"&gt;こちらのcommit&lt;/a&gt;で対応済みなので &lt;code&gt;brew update&lt;/code&gt; で更新される。&lt;/p&gt;
&lt;p&gt;Nixユーザーは&lt;a href="https://github.com/NixOS/nixpkgs/blob/nixos-23.11/pkgs/tools/security/gnupg/24.nix"&gt;nixpkgs&lt;/a&gt;が対応するまでは次のようにoverlayを定義して対応すればよい。&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-nix" data-lang="nix"&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; nixpkgs&lt;span style="color:#f92672"&gt;.&lt;/span&gt;overlays &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; (final: prev: {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; gnupg &lt;span style="color:#f92672"&gt;=&lt;/span&gt; prev&lt;span style="color:#f92672"&gt;.&lt;/span&gt;gnupg&lt;span style="color:#f92672"&gt;.&lt;/span&gt;overrideAttrs (old: {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; src &lt;span style="color:#f92672"&gt;=&lt;/span&gt; prev&lt;span style="color:#f92672"&gt;.&lt;/span&gt;fetchurl {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; url &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;mirror://gnupg/gnupg/gnupg-2.4.4.tar.bz2&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; hash &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;sha256-Z+vgFsqQ+naIzmejh+vYLGJh6ViX23sj3yT/M1voW8Y=&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&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;実際に自分Emacs環境で実験した所正常に動作することが確認取れた。&lt;/p&gt;</description></item><item><title>2023年のorg-mode活用と今後の抱負</title><link>https://www.takeokunn.org/posts/permanent/20240112071806-my_relationship_with_org_mode_in_2023_and_how_navigate_in_2024/</link><pubDate>Thu, 25 Jan 2024 00:00:00 +0000</pubDate><guid>https://www.takeokunn.org/posts/permanent/20240112071806-my_relationship_with_org_mode_in_2023_and_how_navigate_in_2024/</guid><description>&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;この記事は&lt;a href="https://vim-jp.org/ekiden/"&gt;Vim駅伝&lt;/a&gt;の2024-01-24の記事です。&lt;/p&gt;
&lt;p&gt;前回の記事はyasunoriさんの「&lt;a href="https://zenn.dev/vim_jp/articles/0007-vim-recommend-method"&gt;Vimを勧めるときのすヽめ&lt;/a&gt;」です。&lt;/p&gt;
&lt;p&gt;私にとっての2023年はorg-modeの年でした。
org-modeで実現できることは何があるのかと、自分にとってのorg-modeはなんなのか、ということに腰を据えてちゃんと向き合えたので実際に取り組んだことを記事にしておきます。&lt;/p&gt;
&lt;h2 id="emacsとの出会いと使えるようになるまで"&gt;Emacsとの出会いと使えるようになるまで&lt;/h2&gt;
&lt;p&gt;私のEmacs歴は6年程度で、&lt;a href="https://github.com/takeokunn/.emacs.d"&gt;takeokunn/.emacs.d&lt;/a&gt; のfirst commitは &lt;code&gt;Sat Nov 3 18:15:51 2018 +0900&lt;/code&gt; です。
もともとSublime Textを使っており、Emacsを使い始めたきっかけは&lt;a href="https://www.amazon.co.jp/%E3%83%8F%E3%83%83%E3%82%AB%E3%83%BC%E3%81%A8%E7%94%BB%E5%AE%B6-%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF%E6%99%82%E4%BB%A3%E3%81%AE%E5%89%B5%E9%80%A0%E8%80%85%E3%81%9F%E3%81%A1-%E3%83%9D%E3%83%BC%E3%83%AB-%E3%82%B0%E3%83%AC%E3%82%A2%E3%83%A0/dp/4274065979"&gt;ハッカーと画家&lt;/a&gt;でした。
&lt;a href="https://www.amazon.co.jp/%E3%83%8F%E3%83%83%E3%82%AB%E3%83%BC%E3%81%A8%E7%94%BB%E5%AE%B6-%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF%E6%99%82%E4%BB%A3%E3%81%AE%E5%89%B5%E9%80%A0%E8%80%85%E3%81%9F%E3%81%A1-%E3%83%9D%E3%83%BC%E3%83%AB-%E3%82%B0%E3%83%AC%E3%82%A2%E3%83%A0/dp/4274065979"&gt;ハッカーと画家&lt;/a&gt;にLispのすばらしさが書いてあり、Lispを書くならEmacsだろうということで安易な気持ちで入門しました。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://blog.tomoya.dev/posts/only-those-who-want-to-be-the-wind-should-use-emacs-2020/"&gt;風になりたい奴だけがEmacsを使えば良い 2020&lt;/a&gt; などEmacsの魅力を語っている記事がたくさんあったのも理由のひとつでした。&lt;/p&gt;
&lt;p&gt;最初の2年はEmacsを操作するのに慣れるまで必死でした。
世の中にはEmacsを入門してすぐに有名なOSSにコントリビューションしたり、自分でキラーアプリケーションを作ったりする天才のような人達がごろごろいるが、私は要領が悪いため残念ながらそういう人間ではありませんでした。
生まれたての小鹿みたいなおぼつかない操作、何をしたらどう動くのか分からないし何がどう動いるのか分からず、どう質問をしてよいのかすら分からない状態が続きました。&lt;/p&gt;
&lt;p&gt;3年くらい使ってようやく概要を把握でき、Sublime Textと同じくらいの編集速度を出すことができるようになりました。
徐々にEmacsの気持ちが分かってきて、ざっくり何ができるのか、どのくらいのポテンシャルを秘めているのかということを肌感覚でつかめてきました。
それと同時に、Emacsで実現可能なものの輪郭を見たくなってきました。
その為には他人のEmacsの設定を漁りまくり、少しでも便利そうだと思ったパッケージはすべて検証するという運用をしてみました。&lt;/p&gt;
&lt;p&gt;4年目はとにかくinit.elの管理方法と起動速度にこだわった1年になりました。
&lt;a href="https://zenn.dev/takeokunn/articles/56010618502ccc"&gt;Emacsを世界最速級で起動する方法 - Zenn&lt;/a&gt; の目的は起動時間を短縮することによって、設定の検証効率を上げることでした。
また、起動速度チューニングすることによってどうEmacs本体がEmacs Lispを実行するのか深く理解できたので非常に有意義な取り組みだったと感じています。&lt;/p&gt;
&lt;h2 id="課題"&gt;課題&lt;/h2&gt;
&lt;p&gt;ソフトェアの開発は「趣味だろうと仕事だろうとプログラミングに閉じることはできない」という問題があります。
メール確認だったりブログの執筆だったりパスワードマネージャーだったり、「ソフトウェアエンジニアなら必要なもの」というのはかなりあります。&lt;/p&gt;
&lt;p&gt;自分がやりたかったのは「Emacs内で最高の環境」を作ることです。Emacsはそれを許容してくれます。
カーソル移動だったり、keybindの最適化だけではなく、自分の普段のワークフローをしっかりEmacsに落としきる必要があります。&lt;/p&gt;
&lt;p&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;ul&gt;
&lt;li&gt;たとえ案件が変わろうとPCが壊れようと過去に行ったことを検索可能な状態にしたい&lt;/li&gt;
&lt;li&gt;Local LLMに食わせることによって自分専用のAIを作りたい&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;etc&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;私は特に怠惰でだらしない人間ですので、いかにワークフローを整えて自動化をしてドキュメントとして残すか、サボったツケを効率良く払うことに注力する必要がありました。&lt;/p&gt;
&lt;h2 id="なぜorg-modeなのか"&gt;なぜorg-modeなのか&lt;/h2&gt;
&lt;p&gt;私はプレーンテキストに対して強いこだわりがあるので、可能な限りプレーンテキストをGitで管理する運用にしたいと考えていました。&lt;/p&gt;
&lt;p&gt;Emacsとの親和性なども考えると&lt;a href="https://orgmode.org/ja/"&gt;org-mode&lt;/a&gt;しかないだろう、という結論に至りました。
&lt;a href="https://orgmode.org/features.html"&gt;org-mode features&lt;/a&gt; を見ているとまさしく私がやりたかったことを網羅していました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Markup&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;/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;org-modeはコンピュータを使う時に必要なものをすべて用意してくれています。
当然のことながら、Emacsのパッケージなので &lt;a href="https://qiita.com/takaxp/items/a5a3383d7358c58240d0"&gt;org-mode のキーバインド、その先 - Qiita&lt;/a&gt; にもあるとおりEmacsのkeybindで操作できます。&lt;/p&gt;</description></item><item><title>Zedファーストインプレッション</title><link>https://www.takeokunn.org/posts/fleeting/20240125232318-first_research_about_zed/</link><pubDate>Thu, 25 Jan 2024 00:00:00 +0000</pubDate><guid>https://www.takeokunn.org/posts/fleeting/20240125232318-first_research_about_zed/</guid><description>&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://forest.watch.impress.co.jp/docs/news/1563594.html"&gt;Rust製コードエディター「Zed」がオープンソースに ～v1.0リリースへ向けて門戸を開く - 窓の杜&lt;/a&gt; にもあるとおり、&lt;a href="https://github.com/zed-industries/zed"&gt;zed-industries/zed&lt;/a&gt;が公開されたのでコードをざっくり読んでみたのでメモする。&lt;/p&gt;
&lt;p&gt;Rustへの知見が皆無であること、雑なコードリーディング要素があるのでご了承ください。&lt;/p&gt;
&lt;h2 id="feature"&gt;Feature&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://zed.dev/"&gt;https://zed.dev/&lt;/a&gt; には次のようなことを書いている。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ハイパフォーマンス&lt;/li&gt;
&lt;li&gt;AIサポート&lt;/li&gt;
&lt;li&gt;LSP&lt;/li&gt;
&lt;li&gt;Package
&lt;ul&gt;
&lt;li&gt;vim-mode&lt;/li&gt;
&lt;li&gt;terminal&lt;/li&gt;
&lt;li&gt;theme&lt;/li&gt;
&lt;li&gt;etc.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;チーム開発&lt;/li&gt;
&lt;li&gt;UI/データ構造
&lt;ul&gt;
&lt;li&gt;マルチコアサポート&lt;/li&gt;
&lt;li&gt;Tree-sitterサポート&lt;/li&gt;
&lt;li&gt;共同編集アルゴリズム&lt;a href="https://en.wikipedia.org/wiki/Conflict-free_replicated_data_type"&gt;CRDT&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="local-build"&gt;Local Build&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://github.com/zed-industries/zed/blob/7068161bd7405553fd3fecaf44057449d8137878/docs/src/developing_zed__building_zed.md"&gt;docs/src/developing_zed__building_zed.md&lt;/a&gt; にある手順とおりコマンドを実行したら手元で簡単にBuildできた。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/zed-industries/zed/blob/7068161bd7405553fd3fecaf44057449d8137878/docs/src/system_requirements.md"&gt;docs/src/system_requirements.md&lt;/a&gt; にはMacしかサポートしてないことが記述されている。&lt;/p&gt;
&lt;h2 id="docs"&gt;Docs&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://github.com/zed-industries/zed/blob/7068161bd7405553fd3fecaf44057449d8137878/docs/src/configuring_zed.md"&gt;docs/src/configuring_zed.md&lt;/a&gt; に設定方法が書いてあるが、基本的に&lt;a href="https://json5.org/"&gt;json5&lt;/a&gt;で管理していて細かい設定ができそうなことが伺える。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/zed-industries/zed/blob/7068161bd7405553fd3fecaf44057449d8137878/docs/src/configuring_zed__configuring_vim.md"&gt;docs/src/configuring_zed__configuring_vim.md&lt;/a&gt; にvim-modeの使い方が書かれている。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/zed-industries/zed/blob/7068161bd7405553fd3fecaf44057449d8137878/docs/src/telemetry.md"&gt;docs/src/telemetry.md&lt;/a&gt; にサービス改善の為に匿名でzed.devに利用状況を送信することが書かれている。&lt;/p&gt;
&lt;h2 id="コードリーディング"&gt;コードリーディング&lt;/h2&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-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ tree -L &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;├── CODE_OF_CONDUCT.md
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;├── CONTRIBUTING.md
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;├── Cargo.lock
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;├── Cargo.toml
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;├── Dockerfile
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;├── LICENSE-AGPL
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;├── LICENSE-APACHE
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;├── LICENSE-GPL
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;├── Procfile
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;├── README.md
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;├── assets
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;├── crates
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;├── debug.plist
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;├── docker-compose.sql
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;├── docker-compose.yml
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;├── docs
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;├── plugins
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;├── rust-toolchain.toml
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;├── script
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;├── target
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;└── typos.toml
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="assets"&gt;&lt;a href="https://github.com/zed-industries/zed/tree/7068161bd7405553fd3fecaf44057449d8137878/assets"&gt;assets/&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://github.com/zed-industries/zed/tree/7068161bd7405553fd3fecaf44057449d8137878/assets/fonts"&gt;font&lt;/a&gt;情報や&lt;a href="https://github.com/zed-industries/zed/tree/7068161bd7405553fd3fecaf44057449d8137878/assets/icons"&gt;icon&lt;/a&gt;や&lt;a href="https://github.com/zed-industries/zed/tree/7068161bd7405553fd3fecaf44057449d8137878/assets/sounds"&gt;sounds&lt;/a&gt;が入っている。
また、&lt;a href="https://github.com/zed-industries/zed/tree/7068161bd7405553fd3fecaf44057449d8137878/assets/keymaps"&gt;keymaps&lt;/a&gt;や&lt;a href="https://github.com/zed-industries/zed/tree/7068161bd7405553fd3fecaf44057449d8137878/assets/settings"&gt;settings&lt;/a&gt;にデフォルトの設定がjsonで格納されている。&lt;/p&gt;</description></item><item><title>Emacsユーザーから見たvim-jp</title><link>https://www.takeokunn.org/posts/poem/20240117104306-perspective_of_vim_jp_from_emacser/</link><pubDate>Fri, 19 Jan 2024 00:00:00 +0000</pubDate><guid>https://www.takeokunn.org/posts/poem/20240117104306-perspective_of_vim_jp_from_emacser/</guid><description>&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;この記事は&lt;a href="https://vim-jp.org/ekiden/"&gt;Vim駅伝&lt;/a&gt;の2024-01-19の記事です。&lt;/p&gt;
&lt;p&gt;前回の記事は&lt;a href="https://zenn.dev/kawarimidoll"&gt;kawarimidoll&lt;/a&gt;さんの「&lt;a href="https://zenn.dev/vim_jp/articles/358848a5144b63"&gt;俺自身がVimのstatuslineになることだ&lt;/a&gt;」です。&lt;/p&gt;
&lt;h2 id="この記事を読むにあたっての注意点"&gt;この記事を読むにあたっての注意点&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;筆者の主観要素&lt;/li&gt;
&lt;li&gt;筆者のEmacs愛要素&lt;/li&gt;
&lt;li&gt;筆者のEmacsコミュニティ活動への努力不足要素
&lt;ul&gt;
&lt;li&gt;2024年はEmacsイベントを精力的に開催します&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="対象読者"&gt;対象読者&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;これからEmacsを始めたい人&lt;/li&gt;
&lt;li&gt;vim-jp slackにまだ参加していない人&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="今北産業"&gt;今北産業&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://blog.tomoya.dev/posts/vim-jp-is-a-paradise-for-engineers/"&gt;エンジニアの楽園 vim-jp - 日々、とんは語る。&lt;/a&gt;を読み &lt;a href="https://vim-jp.org/docs/chat.html"&gt;vim-jpのチャットルームについて&lt;/a&gt; を参考にvim-jp slackに入る&lt;/li&gt;
&lt;li&gt;&lt;code&gt;#welcome&lt;/code&gt; で自己紹介をする&lt;/li&gt;
&lt;li&gt;&lt;code&gt;#hobby-gourmet&lt;/code&gt; で直近の食事をアップロードする&lt;/li&gt;
&lt;/ul&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-text" data-lang="text"&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;これからEmacsを学びたくてvim-jp slackに参加しました。
&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="vim-emacsエディタ戦争について"&gt;Vim/Emacsエディタ戦争について&lt;/h2&gt;
&lt;p&gt;「VimmerとEmacsユーザーは仲が悪い」と&lt;a href="https://ja.wikipedia.org/wiki/%E3%82%A8%E3%83%87%E3%82%A3%E3%82%BF%E6%88%A6%E4%BA%89"&gt;エディタ戦争&lt;/a&gt;のようなことを巷ではいわれてますが、実際のところはそんなことありません。
エディタ戦争と言っている人達はどちらのテキストエディタも大して使っていない素人であることが多く、実際のところは少なくとも日本人コミュニティでは一切そんなことありません。&lt;/p&gt;
&lt;p&gt;たとえば&lt;a href="https://github.com/easymotion/vim-easymotion"&gt;easymotion/vim-easymotion&lt;/a&gt;が&lt;a href="https://github.com/abo-abo/avy"&gt;abo-abo/avy&lt;/a&gt;で再実装されたように、Vim Pluginで有用なものはEmacs Packageに移植されたり、常に互いを高め合うものとして存在しています。（逆もまた然り）&lt;/p&gt;
&lt;p&gt;私個人としてはEmacsが世界最強のテキストエディタでありほかのテキストエディタの追随を許さない圧倒的に優れたものだという思想を持っています。
こういう思想を持った私でもVimコミュニティ内で問題なくVimmerと交流できているので、世間が思っている以上にテキストエディタコミュニティは他テキストエディタに寛容です。&lt;/p&gt;
&lt;h2 id="emacsコミュニティの抱える問題"&gt;Emacsコミュニティの抱える問題&lt;/h2&gt;
&lt;p&gt;私がEmacsを始めたのは5年前くらいですが、私の観測範囲内ではコミュニティ活動するEmacsユーザーの数は5年前からほぼ変わらず、悲しいことに新規で入ってくる人はほとんどいません。
つまりEmacsコミュニティは平均年齢が5歳分上がっているのです。&lt;/p&gt;
&lt;p&gt;Emacs日本コミュニティに&lt;a href="https://github.com/emacs-jp/emacs-jp.github.com"&gt;emacs-jp slack&lt;/a&gt;があります。
分からないことがあったらちょっとしたことでも &lt;code&gt;#question&lt;/code&gt; に気軽に投げてほしいし、 &lt;code&gt;#today-i-learned&lt;/code&gt; に学んだことを共有してほしいです。
しかし残念ながら投稿の流速が遅く、特に初心者は雑談や質問しつらいという現状があります。&lt;/p&gt;
&lt;p&gt;同じくらいの初心者が少ない技術コミュニティでは、質問するのも人間関係を構築するのも難易度がどうしても高くなってしまいます。
ベテラン達も「イマドキEmacsを長い時間苦労してやらずにVSCodeとか使った方がいいんじゃないか?」と思っている人も少なくなく、初心者を増やす活動を中々できていないという側面もあります。&lt;/p&gt;
&lt;p&gt;本来なら&lt;a href="https://gorillavim.connpass.com/"&gt;ゴリラ.vim&lt;/a&gt;のような初心者歓迎イベントを定期開催して、少しでもEmacsへのハードルを下げるべきなのかもしれないなと反省しています。&lt;/p&gt;
&lt;h2 id="vim-jp-slackって何"&gt;vim-jp slackって何？&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://blog.tomoya.dev/posts/vim-jp-is-a-paradise-for-engineers/"&gt;エンジニアの楽園 vim-jp - 日々、とんは語る。&lt;/a&gt; に非常に分かりやすくまとまっています。
vim-jpはVimという名前を冠しているにもかかわらず、以下のようなchannelがあり生活全般の会話をできます。（あくまで一例）&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;#hobby-*&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;#hobby-gourmet&lt;/code&gt; : 食事全般&lt;/li&gt;
&lt;li&gt;&lt;code&gt;#hobby-gadget&lt;/code&gt; : ガジェット全般&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;#life-*&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;#life-housekeeping&lt;/code&gt; : 家事全般&lt;/li&gt;
&lt;li&gt;&lt;code&gt;#life-healthcare&lt;/code&gt; : 健康全般&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;#event-*&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;#event-gorillavim&lt;/code&gt; : ゴリラvim関連&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;#game-*&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;#game-minecraft&lt;/code&gt; : マイクラ関連&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;#times-&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;#times&lt;/code&gt; : 全員の分報&lt;/li&gt;
&lt;li&gt;&lt;code&gt;#times-take&lt;/code&gt; : 私の分報&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Emacsユーザーは以下のチャンネルに入っておくことをお勧めします。&lt;/p&gt;</description></item><item><title>テキストエディタがPHPをシンタックスハイライトする仕組みとモダンテキストエディタ事情について</title><link>https://www.takeokunn.org/posts/permanent/20240107122028-how_to_syntax_highlight_in_text_editor/</link><pubDate>Thu, 18 Jan 2024 00:00:00 +0000</pubDate><guid>https://www.takeokunn.org/posts/permanent/20240107122028-how_to_syntax_highlight_in_text_editor/</guid><description>&lt;h2 id="注意"&gt;注意&lt;/h2&gt;
&lt;p&gt;この記事はPHPerKaigi 2024のパンフレット記事です。A4ページ4枚程度の量を書いています。
書面での掲載につきハイパーリンクがないことをご了承ください。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://fortee.jp/phperkaigi-2024/proposal/161b2ec9-c279-4336-8e17-1aa054dacae9"&gt;https://fortee.jp/phperkaigi-2024/proposal/161b2ec9-c279-4336-8e17-1aa054dacae9&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;PDF版は&lt;a href="https://github.com/takeokunn/blog/blob/main/static/pdf/%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%82%A8%E3%83%87%E3%82%A3%E3%82%BF%E3%81%8CPHP%E3%82%92%E3%82%B7%E3%83%B3%E3%82%BF%E3%83%83%E3%82%AF%E3%82%B9%E3%83%8F%E3%82%A4%E3%83%A9%E3%82%A4%E3%83%88%E3%81%99%E3%82%8B%E4%BB%95%E7%B5%84%E3%81%BF%E3%81%A8%E3%83%A2%E3%83%80%E3%83%B3%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%82%A8%E3%83%87%E3%82%A3%E3%82%BF%E4%BA%8B%E6%83%85%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6.pdf"&gt;こちら&lt;/a&gt;です。&lt;/p&gt;
&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;プログラミング言語は日進月歩で進化し続けています。
処理系のパフォーマンス改善、既存のバグ修正、挙動の変更などさまざまな変更が入るが、ユーザーにとって一番影響があるのは「新規の構文追加」ではないでしょうか？
PHPの場合PHP 8.0以降にmatch式やenum構文は直近5年以内に追加されたものです。
PHPに限らずほか言語のRFCでも新規の構文が提案されている例は枚挙に暇がありません。Goのジェネリクスなどもその一例です。&lt;/p&gt;
&lt;p&gt;言語レベルで新規の構文が追加された時、テキストエディタでも適切に色付けできることが望ましいです。
それはオープンソースのテキストエディタだろうと商用エディタだろうと区別はありません。
そもそもテキストエディタはどのように構文を解釈してハイライトしてくれているのか、Tree-sitterなどの最近のテキストエディタ事情も踏まえて解説していきます。&lt;/p&gt;
&lt;p&gt;なお私は熱狂的なEmacsユーザーでありEmacsのPHP Packageであるphp-modeのオーナー権限もあるので、Emacsひいきな解説になってしまうのはご了承ください。&lt;/p&gt;
&lt;h2 id="シンタックスハイライト概要"&gt;シンタックスハイライト概要&lt;/h2&gt;
&lt;p&gt;シンタックスハイライトとは、 &lt;code&gt;public&lt;/code&gt; のようなキーワードや関数名や言語特有の構文に色をつけてくれるものです。
Wikipediaによると、シンタックスカラリングや構文着色ともいうらしいです。&lt;/p&gt;
&lt;p&gt;シンタックスハイライトには、「テキストの可読性を向上させ文脈をより明瞭にする」や「記述ミスや括弧の対応のミスなどを防ぐことができる」等、さまざまなメリットがあります。
明確なデメリットは私は思いつきませんが、「流し読みがしやすくなるのでプログラマーはコード全体を理解しようとはしなくなる」ということを主張する人もいるようです。&lt;/p&gt;
&lt;p&gt;配色はカラーテーマごとに違います。
世の中には無数のカラーテーマがあり、私はDraculaやSublime Textのdefault themeのmonokaiが好きです。&lt;/p&gt;
&lt;p&gt;構文が違うので当然言語の数だけシンタックスハイライトがあります。
それぞれの実装によって方針はまちまちですが、似ている言語から上書きするよう実装することで実装コストを下げる対応をしています。
PHPはCやJavaと記述が似ているので、CやJavaの実装を上書きし、部分的にPHPの構文を追加して対応できます。
実際EmacsのPHP Packageではこのような対応をしています。&lt;/p&gt;
&lt;h2 id="シンタックスハイライトの大まかなしくみ"&gt;シンタックスハイライトの大まかなしくみ&lt;/h2&gt;
&lt;p&gt;世の中にはテキストエディタの実装は無数にあります。
プログラミング言語に対応したテキストエディタの実装はおおよそ2つに大別できます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;正規表現ベース&lt;/li&gt;
&lt;li&gt;ASTベース&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;正規表現ベースのシンタックスハイライトはVimやEmacsのような古くからあるテキストエディタでよく使われています。
当然それぞれのテキストエディタごとに実装は違うので移植性はありません。&lt;/p&gt;
&lt;p&gt;ASTベースのシンタックスハイライト実装は2024年1月現在Tree-sitterが一強だと言っても過言ではありません。
Tree-sitterはC/Rust製のツールで、特定のテキストエディタに依存しない形で実装された高速で動作するパーサジェネレータツールです。
Tree-sitterはもともとAtomで使用するためにGitHubによって開発され、2018年にリリースされました。
ソースコードをパースして構文木をS式を出力することにより、各テキストエディタはS式を解釈する実装をすれば各々が構文を解釈する必要がない、という作りになっています。&lt;/p&gt;
&lt;p&gt;テキストエディタにおけるシンタックスハイライトの難しいところは以下が挙げられます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;常にユーザーが入力し続けるので構文が確定しない&lt;/li&gt;
&lt;li&gt;1入力ごとにハイライトする必要がある為高速で挙動させる必要がある&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;また、1言語で複数言語を表現する場合難易度が上がります。
たとえばVue.jsはHTML/CSS/JavaScriptを1ファイル内で記述できるし、PHPももともとHyperText PreprocessorなのでHTMLを記述できます。&lt;/p&gt;
&lt;h2 id="正規表現によるシンタックスハイライト"&gt;正規表現によるシンタックスハイライト&lt;/h2&gt;
&lt;p&gt;正規表現によるシンタックスハイライトを採用しているVimやEmacsでは次のような実装がされています。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;キーワードは直接色を付ける&lt;/li&gt;
&lt;li&gt;正規表現によって構文を定義する
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;$&lt;/code&gt; の後は確実に変数&lt;/li&gt;
&lt;li&gt;&lt;code&gt;function&lt;/code&gt; の後は確実に関数名になり、その後の括弧は関数の引数になる&lt;/li&gt;
&lt;li&gt;&lt;code&gt;//&lt;/code&gt; 直後はすべてコメントになる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Emacsではシンタックステーブルというものがデフォルトで用意されており、独自の記法で記述する必要があります。&lt;/p&gt;
&lt;p&gt;以下は実際にphp-modeで実装されているコードを抜粋したものです。
Emacs Lispの正規表現がそもそも難しいのもあり、複雑怪奇で特殊な訓練しないと読めないことが分かるでしょう。&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-emacs-lisp" data-lang="emacs-lisp"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;;; Class modifiers (abstract, final)&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;\\_&amp;lt;\\(abstract\\|final\\)\\_&amp;gt;\\s-+\\_&amp;lt;class\\&amp;gt;&amp;#34;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;php-class-modifier&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:#75715e"&gt;;; Highlight variables, e.g. &amp;#39;var&amp;#39; in &amp;#39;$var&amp;#39; and &amp;#39;$obj-&amp;gt;var&amp;#39;, but&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;;; not in $obj-&amp;gt;var()&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;\\(-&amp;gt;\\)\\(\\sw+\\)\\s-*(&amp;#34;&lt;/span&gt; (&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;php-object-op&lt;/span&gt;) (&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;php-method-call&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;\\&amp;lt;\\(const\\)\\s-+\\(\\_&amp;lt;.+?\\_&amp;gt;\\)&amp;#34;&lt;/span&gt; (&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;php-keyword&lt;/span&gt;) (&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;php-constant-assign&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:#75715e"&gt;;; Logical operator (!)&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;\\(!\\)[^=]&amp;#34;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;php-logical-op&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:#75715e"&gt;;; Highlight special variables&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;\\(\\$\\)\\(this\\)\\&amp;gt;&amp;#34;&lt;/span&gt; (&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;php-$this-sigil&lt;/span&gt;) (&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;php-$this&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;\\(\\$+\\)\\(\\sw+\\)&amp;#34;&lt;/span&gt; (&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;php-variable-sigil&lt;/span&gt;) (&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;php-variable-name&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;\\(-&amp;gt;\\)\\([a-zA-Z0-9_]+\\)&amp;#34;&lt;/span&gt; (&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;php-object-op&lt;/span&gt;) (&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;php-property-name&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:#75715e"&gt;;; Highlight function/method names&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;\\&amp;lt;function\\s-+&amp;amp;?\\(\\(?:\\sw\\|\\s_\\)+\\)\\s-*(&amp;#34;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;php-function-name&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:#75715e"&gt;;; &amp;#39;array&amp;#39; and &amp;#39;callable&amp;#39; are keywords, except in the following situations:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;;; - when used as a type hint&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;;; - when used as a return type&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;\\b\\(array\\|callable\\)\\s-+&amp;amp;?\\$&amp;#34;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; font-lock-type-face)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;)\\s-*:\\s-*\\??\\(array\\|callable\\)\\b&amp;#34;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; font-lock-type-face)
&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:#75715e"&gt;;; For &amp;#39;array&amp;#39;, there is an additional situation:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;;; - when used as cast, so that (int) and (array) look the same&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;(\\(array\\))&amp;#34;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; font-lock-type-face)
&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:#75715e"&gt;; Support the ::class constant in PHP5.6&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;\\sw+\\(::\\)\\(class\\)\\b&amp;#34;&lt;/span&gt; (&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;php-paamayim-nekudotayim&lt;/span&gt;) (&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;php-magical-constant&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;;; Class declaration keywords (class, trait, interface)&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;\\_&amp;lt;\\(class\\|trait\\|interface\\)\\_&amp;gt;&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;.&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;php-class-declaration&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;言語内に複数言語あるVue.jsやPHPのような言語では、Emacsの場合カーソル位置によって対象の言語に切り替える処理をしています。&lt;/p&gt;</description></item><item><title>AquaSKKをDvorak仕様にする方法</title><link>https://www.takeokunn.org/posts/fleeting/20240115131839-how_to_use_dvorak_in_aquaskk/</link><pubDate>Mon, 15 Jan 2024 00:00:00 +0000</pubDate><guid>https://www.takeokunn.org/posts/fleeting/20240115131839-how_to_use_dvorak_in_aquaskk/</guid><description>&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://ja.wikipedia.org/wiki/QWERTY%E9%85%8D%E5%88%97"&gt;QWERTY配列&lt;/a&gt;から&lt;a href="https://ja.wikipedia.org/wiki/Dvorak%E9%85%8D%E5%88%97"&gt;Dvorak配列&lt;/a&gt;に移行するにあたって&lt;a href="https://ja.osdn.net/projects/aquaskk/"&gt;AquaSKK&lt;/a&gt;もDvorak仕様にする必要があったのでメモ。&lt;/p&gt;
&lt;h2 id="mac標準キーボード"&gt;Mac標準キーボード&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://support.apple.com/ja-jp/guide/mac-help/mh27976/mac"&gt;MacでDvorakキーボードレイアウトを使用する - macOSユーザガイド&lt;/a&gt; によると、Mac標準キーボードにはDvorakが4種類ある。
自分のユースケースは標準的な使い方なので &lt;code&gt;Dvorak: 最もよく使用されるキーが指の下に配置されています。&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-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- Dvorak: 最もよく使用されるキーが指の下に配置されています。
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- Dvorak - 左利き: 最もよく使用されるキーが左手の下に配置されています。
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- Dvorak - QWERTY ⌘: Commandキーを押したままにしたときに、一時的にレイアウトをQWERTYに変更します。
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- Dvorak - 右利き: 最もよく使用されるキーが右手の下に配置されています。
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;次のような設定になってればよい。&lt;/p&gt;
&lt;figure&gt;&lt;img src="https://www.takeokunn.org/images/7F6C45FE-1CBF-468E-A23A-4FDA51F8265F.png"&gt;
&lt;/figure&gt;
&lt;h2 id="aquaskk設定"&gt;AquaSKK設定&lt;/h2&gt;
&lt;p&gt;AquaSKKの設定画面にキーボードレイアウトを指定できる場所がある。さきほど指定したDvorak配列を指定する。&lt;/p&gt;
&lt;figure&gt;&lt;img src="https://www.takeokunn.org/images/EA7ACD8B-52C4-4927-9EB2-A24906E9263B.png"&gt;
&lt;/figure&gt;
&lt;p&gt;即時で反映されない場合は設定反映を押して明示的に反映させる。&lt;/p&gt;
&lt;figure&gt;&lt;img src="https://www.takeokunn.org/images/ED26E819-448B-41F9-800A-A5C8F56679F8.png"&gt;
&lt;/figure&gt;</description></item><item><title>PHPカンファレンス北海道2024に参加してきました</title><link>https://www.takeokunn.org/posts/diary/20240112063123-retrospective_phpcondo_2024/</link><pubDate>Fri, 12 Jan 2024 00:00:00 +0000</pubDate><guid>https://www.takeokunn.org/posts/diary/20240112063123-retrospective_phpcondo_2024/</guid><description>&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;2024/1/13（土）に行われたPHPカンファレンス北海道2024に参加してきました。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://phpcon.hokkaido.jp/"&gt;https://phpcon.hokkaido.jp/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;今回は2024/1/12（金）〜2024/1/14（日）の2泊3日の旅行でした。
なおこの記事は3日目 自由行動からが本編なのでよしなに飛ばしてもかまいません。&lt;/p&gt;
&lt;p&gt;カンファレンス自体は今回登壇もしていないしスタッフもやっていないのでただのガヤですのでご了承ください。&lt;/p&gt;
&lt;h2 id="tl-dr"&gt;TL;DR&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;海鮮を無限に食べた&lt;/li&gt;
&lt;li&gt;カンファレンス楽しかった&lt;/li&gt;
&lt;li&gt;スキースノボしてないのに50回以上滑った&lt;/li&gt;
&lt;li&gt;小樽最高だった&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="準備"&gt;準備&lt;/h2&gt;
&lt;p&gt;飛行機のチケットを直前の日曜までに取っていなく、あすみかんに指摘されてようやく気がつきなんとか取ることができました。
PHPerKaigiのパンフレット記事の「&lt;a href="https://www.takeokunn.org/posts/permanent/20240107122028-how_to_syntax_highlight_in_text_editor/"&gt;テキストエディタがPHPをシンタックスハイライトする仕組みとモダンテキストエディタ事情について&lt;/a&gt;」もなんとか提出できて感謝しかないです。&lt;/p&gt;
&lt;blockquote class="twitter-tweet"&gt;&lt;p lang="ja" dir="ltr"&gt;たけてぃが北海道行けるように、ここを支援する使命感がでてきている　これが母性？ &lt;a href="https://t.co/1zYGCffqTC"&gt;pic.twitter.com/1zYGCffqTC&lt;/a&gt;&lt;/p&gt;&amp;mdash; あすみ (@asumikam) &lt;a href="https://twitter.com/asumikam/status/1743892248478265544?ref_src=twsrc%5Etfw"&gt;January 7, 2024&lt;/a&gt;&lt;/blockquote&gt; &lt;script async src="https://platform.twitter.com/widgets.js" charset="utf-8"&gt;&lt;/script&gt;
&lt;p&gt;航空券は往復1万2000円、宿は二泊で8000円くらいで安く抑えることができました。&lt;/p&gt;
&lt;blockquote class="twitter-tweet"&gt;&lt;p lang="ja" dir="ltr"&gt;Peachみたけど、12-15まだいっぱいあるからだいじょうぶそ&lt;br&gt;ほてるも、ドミトリーだけど12-15で1万円のところあるからここがいいんじゃないかな &lt;a href="https://t.co/fXwODY4uVZ"&gt;pic.twitter.com/fXwODY4uVZ&lt;/a&gt;&lt;/p&gt;&amp;mdash; あすみ (@asumikam) &lt;a href="https://twitter.com/asumikam/status/1743901343692316811?ref_src=twsrc%5Etfw"&gt;January 7, 2024&lt;/a&gt;&lt;/blockquote&gt; &lt;script async src="https://platform.twitter.com/widgets.js" charset="utf-8"&gt;&lt;/script&gt;
&lt;p&gt;事前に北海道グルメについてうちのシェフに相談したところ&lt;a href="https://tabelog.com/hokkaido/A0101/A010103/1003973/"&gt;めんめ&lt;/a&gt;に行けとアドバイスされましたが、結局時間的に行けなかったです。&lt;/p&gt;
&lt;blockquote class="twitter-tweet"&gt;&lt;p lang="ja" dir="ltr"&gt;北海道旅行メモ&lt;br&gt;&lt;br&gt;めんめには死んでもいけ、めんめにいかないなら帰ってくるな&lt;a href="https://t.co/HNEgHVemaQ"&gt;https://t.co/HNEgHVemaQ&lt;/a&gt;&lt;/p&gt;&amp;mdash; た҉͜け҉͜て҉͜ぃ҉͜𓁈𓈷 (@takeokunn) &lt;a href="https://twitter.com/takeokunn/status/1743583896820941240?ref_src=twsrc%5Etfw"&gt;January 6, 2024&lt;/a&gt;&lt;/blockquote&gt; &lt;script async src="https://platform.twitter.com/widgets.js" charset="utf-8"&gt;&lt;/script&gt;
&lt;h2 id="1日目-移動-前夜祭"&gt;1日目 移動〜前夜祭&lt;/h2&gt;
&lt;p&gt;全体的に道内はとても暖かかったらしい。&lt;/p&gt;
&lt;h3 id="自宅-札幌"&gt;自宅〜札幌&lt;/h3&gt;
&lt;p&gt;朝5時半に起床し、池袋成田間6時15分発のバスに乗りました。&lt;/p&gt;
&lt;blockquote class="twitter-tweet"&gt;&lt;p lang="ja" dir="ltr"&gt;バス乗った！勝ったな！&lt;/p&gt;&amp;mdash; た҉͜け҉͜て҉͜ぃ҉͜𓁈𓈷 (@takeokunn) &lt;a href="https://twitter.com/takeokunn/status/1745553370117820842?ref_src=twsrc%5Etfw"&gt;January 11, 2024&lt;/a&gt;&lt;/blockquote&gt; &lt;script async src="https://platform.twitter.com/widgets.js" charset="utf-8"&gt;&lt;/script&gt;
&lt;p&gt;バスがかなり高速なWi-Fileを提供してくれていたのでPCを弄ることができました。&lt;/p&gt;
&lt;blockquote class="twitter-tweet"&gt;&lt;p lang="ja" dir="ltr"&gt;国際バスFree Wifiあるじゃん最高じゃん&lt;/p&gt;&amp;mdash; た҉͜け҉͜て҉͜ぃ҉͜𓁈𓈷 (@takeokunn) &lt;a href="https://twitter.com/takeokunn/status/1745558590612734051?ref_src=twsrc%5Etfw"&gt;January 11, 2024&lt;/a&gt;&lt;/blockquote&gt; &lt;script async src="https://platform.twitter.com/widgets.js" charset="utf-8"&gt;&lt;/script&gt;
&lt;blockquote class="twitter-tweet"&gt;&lt;p lang="ja" dir="ltr"&gt;三半規管つよつよエンジニアなのでバスの中でPC弄るの余裕&lt;/p&gt;&amp;mdash; た҉͜け҉͜て҉͜ぃ҉͜𓁈𓈷 (@takeokunn) &lt;a href="https://twitter.com/takeokunn/status/1745559252859765063?ref_src=twsrc%5Etfw"&gt;January 11, 2024&lt;/a&gt;&lt;/blockquote&gt; &lt;script async src="https://platform.twitter.com/widgets.js" charset="utf-8"&gt;&lt;/script&gt;
&lt;p&gt;成田空港に1時間以上余裕を持って到着したので第一ターミナルを練り歩いていました。&lt;/p&gt;
&lt;blockquote class="twitter-tweet"&gt;&lt;p lang="ja" dir="ltr"&gt;飛行場テンション上がる &lt;a href="https://t.co/3OnHNAYNT6"&gt;pic.twitter.com/3OnHNAYNT6&lt;/a&gt;&lt;/p&gt;&amp;mdash; た҉͜け҉͜て҉͜ぃ҉͜𓁈𓈷 (@takeokunn) &lt;a href="https://twitter.com/takeokunn/status/1745579070363172915?ref_src=twsrc%5Etfw"&gt;January 11, 2024&lt;/a&gt;&lt;/blockquote&gt; &lt;script async src="https://platform.twitter.com/widgets.js" charset="utf-8"&gt;&lt;/script&gt;
&lt;blockquote class="twitter-tweet"&gt;&lt;p lang="ja" dir="ltr"&gt;common lispで動いてるやつだ！！ &lt;a href="https://t.co/JavUVOje5B"&gt;pic.twitter.com/JavUVOje5B&lt;/a&gt;&lt;/p&gt;&amp;mdash; た҉͜け҉͜て҉͜ぃ҉͜𓁈𓈷 (@takeokunn) &lt;a href="https://twitter.com/takeokunn/status/1745582456097669196?ref_src=twsrc%5Etfw"&gt;January 11, 2024&lt;/a&gt;&lt;/blockquote&gt; &lt;script async src="https://platform.twitter.com/widgets.js" charset="utf-8"&gt;&lt;/script&gt;
&lt;blockquote class="twitter-tweet"&gt;&lt;p lang="ja" dir="ltr"&gt;北へ &lt;a href="https://t.co/1mL7S2L1Wq"&gt;pic.twitter.com/1mL7S2L1Wq&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Authyからpassword-store-otpに移行した</title><link>https://www.takeokunn.org/posts/fleeting/20240110123142-migrate_authy_to_password_store_otp/</link><pubDate>Wed, 10 Jan 2024 00:00:00 +0000</pubDate><guid>https://www.takeokunn.org/posts/fleeting/20240110123142-migrate_authy_to_password_store_otp/</guid><description>&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://www.takeokunn.org/posts/fleeting/20240108211345-migrate_bitwarden_to_password_store/"&gt;Bitwardenからpassword-storeに移行した&lt;/a&gt; でpassword-storeに移行できたので、TOTPも&lt;a href="https://authy.com/"&gt; Authy &lt;/a&gt;から移行する。&lt;/p&gt;
&lt;h2 id="goal"&gt;Goal&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;過去の案件で使ってたものを断捨離する&lt;/li&gt;
&lt;li&gt;password-store-otp経由でOTP Codeを取得できるようにする&lt;/li&gt;
&lt;li&gt;Authy管理しているデータをpassword-storeに移行する&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="not-goal"&gt;Not Goal&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Authyを完全に削除する
&lt;ul&gt;
&lt;li&gt;Bitwarden同様数年間使わなくても問題なかったら適切に削除する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="作業手順"&gt;作業手順&lt;/h2&gt;
&lt;h3 id="1-dot-password-store-otpを有効にする"&gt;1. password-store-otpを有効にする&lt;/h3&gt;
&lt;p&gt;私はNixユーザーなので&lt;a href="https://search.nixos.org/packages?channel=23.11&amp;amp;show=pass&amp;amp;from=0&amp;amp;size=50&amp;amp;sort=relevance&amp;amp;type=packages&amp;amp;query=pass"&gt;Nix Packageからpass&lt;/a&gt;を落としてくる。次のような設定で&lt;a href="https://github.com/nix-community/home-manager"&gt;home-manager&lt;/a&gt;経由で入れると勝手にExtensionが有効になる。&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-nix" data-lang="nix"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{ pkgs&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;
&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; home&lt;span style="color:#f92672"&gt;.&lt;/span&gt;packages &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;with&lt;/span&gt; pkgs; [
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; (pass&lt;span style="color:#f92672"&gt;.&lt;/span&gt;withExtensions (extensions: &lt;span style="color:#66d9ef"&gt;with&lt;/span&gt; extensions; [ pass-otp ]))
&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;fish shellで拡張を有効にする。&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-fish" data-lang="fish"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;set&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;-x&lt;/span&gt; PASSWORD_STORE_ENABLE_EXTENSIONS true
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="2-dot-authyからexportする"&gt;2. AuthyからExportする&lt;/h3&gt;
&lt;p&gt;公式のExport方法は見あたらなかったので、&lt;a href="https://gist.github.com/gboudreau/94bb0c11a6209c82418d01a59d958c93"&gt;Export TOTP tokens from Authy - gist&lt;/a&gt;を参考にAuthy Desktopから情報を抜き出す。&lt;/p&gt;
&lt;h3 id="3-dot-password-storeに貼りつける"&gt;3. password-storeに貼りつける&lt;/h3&gt;
&lt;p&gt;次のようなフォーマットでパスワードの下に &lt;code&gt;otppath&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-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;P@ssw0rd
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;otpauth://totp/Discord:foo@gmail.com?secret=XXX&amp;amp;issuer=Discord
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;url: https://discordapp.com/
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;username: foo@gmail.com
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="4-dot-アクセスできるか確認する"&gt;4. アクセスできるか確認する&lt;/h3&gt;
&lt;p&gt;次のコマンドをたたくとclipboardにOTP codeがコピーされる。&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-console" data-lang="console"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ pass otp -c private/life/tech/discord
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Copied OTP code for private/life/tech/discord to clipboard. Will clear in 45 seconds.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="result"&gt;Result&lt;/h2&gt;
&lt;p&gt;16個のTOTP情報を移行した。&lt;/p&gt;</description></item><item><title>Bitwardenからpassword-storeに移行した</title><link>https://www.takeokunn.org/posts/fleeting/20240108211345-migrate_bitwarden_to_password_store/</link><pubDate>Mon, 08 Jan 2024 00:00:00 +0000</pubDate><guid>https://www.takeokunn.org/posts/fleeting/20240108211345-migrate_bitwarden_to_password_store/</guid><description>&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;Bitwardenからpassword-storeに移行したので作業内容をメモしておく。&lt;/p&gt;
&lt;h2 id="basic"&gt;Basic&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;普段使うものは可能な限りPlain TextとGitで管理したい&lt;/li&gt;
&lt;li&gt;EmacsやTerminalから簡単に呼び出したい&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.gnupg.org/"&gt;GnuPG&lt;/a&gt;を可能な限り活用したい&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="goal"&gt;Goal&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Bitwardenに保存されているすべての情報をpassword-storeに移行する&lt;/li&gt;
&lt;li&gt;EmacsやTerminalから簡単にパスワードを取得できるようにする&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="not-goal"&gt;Not Goal&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Bitwardenのアカウントを完全に削除する
&lt;ul&gt;
&lt;li&gt;数年間使わなくても問題なかったら適切に削除する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="技術選定"&gt;技術選定&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://www.passwordstore.org/"&gt;password-store&lt;/a&gt;を選択した理由は以下。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;十分に枯れている&lt;/li&gt;
&lt;li&gt;Plain TextとGitで管理できる&lt;/li&gt;
&lt;li&gt;password-storeが挙動しなくなってもGPGさえ動けばよい
&lt;ul&gt;
&lt;li&gt;shell scriptの小さなコードベースで書かれている&lt;/li&gt;
&lt;li&gt;GPGが動かない時は &lt;code&gt;git commit&lt;/code&gt; もできない状態なので根本的に問題&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;2024年現在所属している会社でpassword-storeを使っている
&lt;ul&gt;
&lt;li&gt;ref. &lt;a href="https://qiita.com/karronoli/items/7ac1984712495fdc570d"&gt;Pass: The Standard Unix Password Manager の紹介 - Qiita&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ja.wikipedia.org/wiki/Time-based_One-time_Password"&gt;TOTP&lt;/a&gt;に対応している&lt;/li&gt;
&lt;li&gt;Emacs Packageがある&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;周りのエンジニアに何を使っているのか聞いたところ、&lt;a href="https://1password.com/jp"&gt;1password&lt;/a&gt;や&lt;a href="https://bitwarden.com/"&gt;Bitwarden&lt;/a&gt;を使っている人が大半だった。&lt;/p&gt;
&lt;h2 id="作業手順"&gt;作業手順&lt;/h2&gt;
&lt;h3 id="1-dot-bitwardenからパスワードを抽出する"&gt;1. Bitwardenからパスワードを抽出する&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://github.com/bitwarden/clients"&gt;bitwarden/clients&lt;/a&gt; を手元のPCに入れる。&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-console" data-lang="console"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ bw --version
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2023.12.1
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Loginしてセッションを取得。&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-console" data-lang="console"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ bw login
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;bw list items&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-console" data-lang="console"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ bw list items --session &amp;lt;session_id&amp;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:#ae81ff"&gt;&lt;/span&gt; | jq &amp;#39;.[] | { folderId: .folderId, name: .name, login: .login }&amp;#39; \
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; | jq . &amp;gt; /tmp/bw.json
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;次のようなjsonが &lt;code&gt;/tmp/bw.json&lt;/code&gt; に出力される。&lt;/p&gt;</description></item><item><title>org-roamで記事を管理しGitHub Actionsで適切に公開する</title><link>https://www.takeokunn.org/posts/permanent/20231219122351-how_to_manage_blog_by_org_roam/</link><pubDate>Tue, 19 Dec 2023 00:00:00 +0000</pubDate><guid>https://www.takeokunn.org/posts/permanent/20231219122351-how_to_manage_blog_by_org_roam/</guid><description>&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://qiita.com/advent-calendar/2023/emacs"&gt;2023年度Emacsアドベントカレンダー&lt;/a&gt;2日目の記事です。&lt;/p&gt;
&lt;p&gt;当記事ではorg-roamを用いたブログ記事のコンテンツ管理方法と、ZennやHugoへ公開する方法の一連の流れについて解説しています。&lt;/p&gt;
&lt;p&gt;個々の技術への深堀は必要に応じて別途記事に認めますのでご了承ください。&lt;/p&gt;
&lt;h2 id="考え方"&gt;考え方&lt;/h2&gt;
&lt;h3 id="ブログサービスについて"&gt;ブログサービスについて&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://zenn.dev/"&gt;Zenn&lt;/a&gt; や &lt;a href="https://qiita.com/"&gt;Qiita&lt;/a&gt; などブログサービスを提供している会社は世の中に無数にありますが、「ブログ記事という形式で世の中に公開する」ということには大きく分けて次の2つの要素があります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;コンテンツ管理&lt;/li&gt;
&lt;li&gt;記事公開&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;2000年代初期と2023年現在求められているブログサービスの必要条件は異なるように、年々求められる必要条件は増えています。
2023年においてSNSに投稿したものを埋め込むことができないブログサービスというのはほぼ存在しないように、有名なブログサービスに乗っかっておけばモダンな環境を常に享受し続けることができます。&lt;/p&gt;
&lt;p&gt;しかしながら、ブログサービスにも当然栄枯盛衰があり自分が使っているサービスの行く末など個人には分かりようがありません。
現に私がプログラミングを初めた2014年ごろはQiitaが技術系ブログサービス一強でしたが、2023年現在ではZennが主流になっています。
常によりよいブログサービスが出たら移動することも念頭に置く必要があります。&lt;/p&gt;
&lt;p&gt;私が勤めている会社では多少技術的な記事だったとしても広報目的に&lt;a href="https://note.com/"&gt;note&lt;/a&gt;に書くという運用がされていたり、以前所属していた会社では、&lt;a href="https://hatenablog.com/"&gt;はてなブログ&lt;/a&gt;で技術ブログを運用していました。
ソフトウェアエンジニアとして働く以上「どこに対して記事公開するか」というのは自分ではコントロール効かないという前提があります。&lt;/p&gt;
&lt;p&gt;上記で述べたように「記事公開」に関しては自分でどうしようもない部分が多々ありますが、「コンテンツ管理」に関しては完全に自分でコントロールを効かせることができます。
適切なフォーマットで公開すればよいだけですので、どのように記事を管理されようとブログサービスからしたらDBのレコードの1つなだけなでどうでもよいことなのです。&lt;/p&gt;
&lt;h3 id="ソフトウェアエンジニアとして"&gt;ソフトウェアエンジニアとして&lt;/h3&gt;
&lt;p&gt;ソフトウェアエンジニアにとって「技術的な文書を書く」という作業は避けられません。
「ドキュメントを書く」「チケットに証跡を書く」「同僚と技術的やりとりをする」等さまざまありますが、「ブログ記事を書く」という行為もそのひとつです。
特定の技術は廃れようと、20年後30年後も「技術的な文書を書く」という行為がなくなることはないでしょう。&lt;/p&gt;
&lt;p&gt;私は残念ながらソフトウェアエンジニア以外の仕事が絶望的にできないので、10年後も20年後もソフトウェアエンジニアとして働いているだろうという実感があります。
あまり文章を書くのが得意ではないので、いかに低負荷で一定の品質の文書を書く環境を用意するか、というのが自分のソフトウェアエンジニアとしての人生にとって重要なことだと考えてます。&lt;/p&gt;
&lt;h3 id="すべてをemacs-org-modeに最適化する"&gt;すべてをEmacs org-modeに最適化する&lt;/h3&gt;
&lt;p&gt;私は今までさまざまなテキストエディタを使い込んできました。
その中で一番時間をつぎ込んだ時に高みを目指せるのはEmacsだということを確信しました。&lt;/p&gt;
&lt;p&gt;「simpleがよいか、easyがよいか」という議論はエンジニア界隈ではよく話題にされます。
私としては簡単さもシンプルさも本当にどうでもよく、たとえ難しかろうと複雑だろうと時間がかかろうと到達点が一番高いものがよいが一番よいと考えています。&lt;/p&gt;
&lt;p&gt;今回の記事はorg-modeが主体になりますが、はっきり言ってorg-modeはsimpleでもeasyでもありません。
巷にある「爆速で構築する」系の記事とは正反対です。
初速は一切出ないですし、理解するまで時間がかかるし、運用が軌道に乗るまで本当に時間がかかります。
ただし、org-modeにはプログラマー人生すべてを寄せることができるくらいのポテンシャルがあり、運用に乗った時のパフォーマンスは計りしれません。&lt;/p&gt;
&lt;p&gt;少なくとも直近10年は一切Emacsへの投資を惜しまないという覚悟をしているので執筆環境もEmacs org-modeに最適化をしていきます。&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;&lt;a href="https://www.gnu.org/software/emacs/manual/html_node/emacs/index.html"&gt;The Emacs Editor Manual&lt;/a&gt; や &lt;a href="https://www.lispworks.com/documentation/HyperSpec/Front/"&gt;Common Lisp Hyperspec&lt;/a&gt; のような数十年前のWebサイト程度の要件を最低限満たしていれば最低限ブログサイトとして名乗ってもよいでしょう。&lt;/p&gt;
&lt;h4 id="コンテンツ管理"&gt;コンテンツ管理&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;何がしかの方法で永続的に保存できる&lt;/li&gt;
&lt;li&gt;MarkdownやOrgのような人間が解釈しやすい形式で記述できる&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;コンテンツ管理の必要条件は最低限で、データベースやプレーンテキストで保存できれば要件を満たしていると考えています。
またHTMLをベタ書きするのは大ですので、MarkdownやOrgのような人間向きのフォーマットで最低限記述できるようにしたいと考えています。&lt;/p&gt;
&lt;h4 id="記事公開"&gt;記事公開&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;意図したHyperTextを継続的に配信できる&lt;/li&gt;
&lt;li&gt;画像やCSSも配信でき、最低限文章を読めるデザインで配信する&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;最低限Webサイトとしての体を成していればよいと考えています。&lt;/p&gt;
&lt;h3 id="十分条件"&gt;十分条件&lt;/h3&gt;
&lt;p&gt;必要条件はあまりにも最低限すぎるので、2023年現在このくらいは最低限満たしたい条件を書いています。
一応十分条件と書いてはいるものの2023年においての必要条件に含まれる要素もありそうです。&lt;/p&gt;
&lt;h4 id="コンテンツ管理"&gt;コンテンツ管理&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;MUST
&lt;ul&gt;
&lt;li&gt;秘密鍵やパスワードが入っていないことを網羅的に検査できる&lt;/li&gt;
&lt;li&gt;校正ツールで継続的かつ網羅的に文章を検査できる&lt;/li&gt;
&lt;li&gt;エディタの標準的な機能を使うことができる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;SHOULD
&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;/ul&gt;
&lt;/li&gt;
&lt;li&gt;MAY
&lt;ul&gt;
&lt;li&gt;複数のブログサービスにまたがって管理できる&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;個人でブログを書いているのもあり、誰かが校正してくれることがないので、うっかり不用意な記述やパスワードを公開しないようなしくみ作りが重要だと考えています。&lt;/p&gt;</description></item><item><title>2023年小田原旅行記</title><link>https://www.takeokunn.org/posts/diary/20231030071757-2023_bokunatu_travel/</link><pubDate>Mon, 30 Oct 2023 09:00:00 +0900</pubDate><guid>https://www.takeokunn.org/posts/diary/20231030071757-2023_bokunatu_travel/</guid><description>&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;2023年10月27日から1泊2日で小田原に夏休みを利用して旅行しました。
ノープラン要素、適当要素、他人に迷惑をかける要素が存分に含まれているので、迷惑をかけた方本当にすみませんでした。
写真や情報は適宜追加していきます。&lt;/p&gt;
&lt;h2 id="旅行の流れ"&gt;旅行の流れ&lt;/h2&gt;
&lt;h3 id="経緯"&gt;経緯&lt;/h3&gt;
&lt;p&gt;きっかけは &lt;a href="https://zenn.dev/neinc_tech/articles/event-with-linkage"&gt;他社と合同勉強会をやっている事例&lt;/a&gt; を見ていた自分が「俺もやりてー」ってツイートしたことでした。(元ツイは&lt;a href="https://twitter.com/takeokunn/status/1683479288106872838"&gt;こちら&lt;/a&gt;)&lt;/p&gt;
&lt;figure&gt;&lt;img src="https://www.takeokunn.org/images/CBB820AE-94C9-49B3-B0BD-73F4A59223D8.png"&gt;
&lt;/figure&gt;
&lt;blockquote class="twitter-tweet"&gt;&lt;p lang="ja" dir="ltr"&gt;やりゃすか‼️&lt;/p&gt;&amp;mdash; あすみ (@asumikam) &lt;a href="https://twitter.com/asumikam/status/1683482937608617985?ref_src=twsrc%5Etfw"&gt;July 24, 2023&lt;/a&gt;&lt;/blockquote&gt; &lt;script async src="https://platform.twitter.com/widgets.js" charset="utf-8"&gt;&lt;/script&gt;
&lt;p&gt;合同勉強会の詳細は対外的な記事にまとめるつもりなのでそちら参照してほしいですが、あすみさんと自分の会社はお互い物流関係のシステムを作っているいわば提携先で、絶対おもしろくなるんじゃないかということで開催することにしました。
ちなみに自分はあまりにもこういう「調整作業」が苦手すぎて下準備をほぼすべてをあすみさんにやってもらいました。
「ちゃんと御社側の名簿を作ってありがとう」と褒められる程度の仕事と、居酒屋の予約を取る時に「頑張れ！!!!君なら絶対やりとげられる！!!」とgoogle meets越しに応援する程度の仕事はしました。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://connpass.com/event/296001/"&gt;蒲田温泉で前夜祭（PHPカンファレンス非公式）&lt;/a&gt;の小田原魅力LTを聞いてしまってからは、勉強会というよりも小田原旅行に行くのが目的になっていたかもしれません。&lt;/p&gt;
&lt;iframe class="speakerdeck-iframe" frameborder="0" src="https://speakerdeck.com/player/974a6ef2b91d4e8e8f06f757e9725018" title="温泉紹介します〜小田原からきました〜" allowfullscreen="true" style="border: 0px; background: padding-box padding-box rgba(0, 0, 0, 0.1); margin: 0px; padding: 0px; border-radius: 6px; box-shadow: rgba(0, 0, 0, 0.2) 0px 5px 40px; width: 100%; height: auto; aspect-ratio: 560 / 315;" data-ratio="1.7777777777777777"&gt;&lt;/iframe&gt;
&lt;h3 id="初日-昼"&gt;初日（昼）&lt;/h3&gt;
&lt;p&gt;「わからんけど多分朝から行くわ」と伝えておきながら前日朝3時まで飲んでいたので当然起きられる訳もなく、11時半くらいの新宿発ロマンスカーに乗って小田原にいきました。&lt;/p&gt;
&lt;blockquote class="twitter-tweet"&gt;&lt;p lang="ja" dir="ltr"&gt;いざ &lt;a href="https://t.co/zpHl3KqqnB"&gt;pic.twitter.com/zpHl3KqqnB&lt;/a&gt;&lt;/p&gt;&amp;mdash; た҉͜け҉͜て҉͜ぃ҉͜𓁈𓈷 (@takeokunn) &lt;a href="https://twitter.com/takeokunn/status/1717727956158885929?ref_src=twsrc%5Etfw"&gt;October 27, 2023&lt;/a&gt;&lt;/blockquote&gt; &lt;script async src="https://platform.twitter.com/widgets.js" charset="utf-8"&gt;&lt;/script&gt;
&lt;p&gt;気分はこれから温泉旅館で缶詰になって執筆をする文豪のそれでした。ロマンスカーは座れるし充電もできるし車窓も良いので楽しいですね。&lt;/p&gt;
&lt;blockquote class="twitter-tweet"&gt;&lt;p lang="ja" dir="ltr"&gt;かつて明治大正時代の文豪もロマンスカーで浪漫を感じながら箱根湯本に行ってたんだろうなーと思うと胸が熱くなる&lt;/p&gt;&amp;mdash; た҉͜け҉͜て҉͜ぃ҉͜𓁈𓈷 (@takeokunn) &lt;a href="https://twitter.com/takeokunn/status/1717736579324903680?ref_src=twsrc%5Etfw"&gt;October 27, 2023&lt;/a&gt;&lt;/blockquote&gt; &lt;script async src="https://platform.twitter.com/widgets.js" charset="utf-8"&gt;&lt;/script&gt;
&lt;blockquote class="twitter-tweet"&gt;&lt;p lang="ja" dir="ltr"&gt;たのしい &lt;a href="https://t.co/fWIFtplAck"&gt;pic.twitter.com/fWIFtplAck&lt;/a&gt;&lt;/p&gt;&amp;mdash; た҉͜け҉͜て҉͜ぃ҉͜𓁈𓈷 (@takeokunn) &lt;a href="https://twitter.com/takeokunn/status/1717745279041204347?ref_src=twsrc%5Etfw"&gt;October 27, 2023&lt;/a&gt;&lt;/blockquote&gt; &lt;script async src="https://platform.twitter.com/widgets.js" charset="utf-8"&gt;&lt;/script&gt;
&lt;blockquote class="twitter-tweet"&gt;&lt;p lang="ja" dir="ltr"&gt;ついたー &lt;a href="https://t.co/dBbsZmuYF6"&gt;pic.twitter.com/dBbsZmuYF6&lt;/a&gt;&lt;/p&gt;</description></item><item><title>PHP Exceptionのpropertyにあるcodeはuser-defined error code</title><link>https://www.takeokunn.org/posts/fleeting/20230801135235-what_is_php_exception_code/</link><pubDate>Tue, 01 Aug 2023 09:00:00 +0900</pubDate><guid>https://www.takeokunn.org/posts/fleeting/20230801135235-what_is_php_exception_code/</guid><description>&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;仕事でPHPStanの修正をしている時、 &lt;code&gt;Exception&lt;/code&gt; classのconstructorでcodeを指定しているコードに出くわした。
&lt;code&gt;Exception&lt;/code&gt; におけるcodeの扱いについて記述している記事がなかったので &lt;a href="https://github.com/php/php-src"&gt;php/php-src&lt;/a&gt; のコードにあたってみた。&lt;/p&gt;
&lt;h2 id="簡易的な調査"&gt;簡易的な調査&lt;/h2&gt;
&lt;h3 id="interface定義"&gt;Interface定義&lt;/h3&gt;
&lt;p&gt;php.netのUser Contributed Notesに次のような記述がある。
&lt;a href="https://www.php.net/manual/en/language.exceptions.php#91159"&gt;https://www.php.net/manual/en/language.exceptions.php#91159&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-php" data-lang="php"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;?&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;php&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;interface&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;IException&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:#75715e"&gt;/* Protected methods inherited from Exception class */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;getMessage&lt;/span&gt;(); &lt;span style="color:#75715e"&gt;// Exception message
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;getCode&lt;/span&gt;(); &lt;span style="color:#75715e"&gt;// User-defined Exception code
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;getFile&lt;/span&gt;(); &lt;span style="color:#75715e"&gt;// Source filename
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;getLine&lt;/span&gt;(); &lt;span style="color:#75715e"&gt;// Source line
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;getTrace&lt;/span&gt;(); &lt;span style="color:#75715e"&gt;// An array of the backtrace()
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;getTraceAsString&lt;/span&gt;(); &lt;span style="color:#75715e"&gt;// Formated string of trace
&lt;/span&gt;&lt;/span&gt;&lt;/span&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; &lt;span style="color:#75715e"&gt;/* Overrideable methods inherited from Exception class */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;__toString&lt;/span&gt;(); &lt;span style="color:#75715e"&gt;// formated string for display
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;__construct&lt;/span&gt;($message &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;null&lt;/span&gt;, $code &lt;span style="color:#f92672"&gt;=&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&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;code&lt;/code&gt; とは &lt;code&gt;User-defined Exception code&lt;/code&gt; と書いてあるとおり、ユーザー側が任意の数値を入れられる。&lt;/p&gt;</description></item><item><title>「PHP Lovers Meetup vol.0 ~ はじまりは&lt;?phpから」に参加しました</title><link>https://www.takeokunn.org/posts/diary/20230710082646-retrospective_php_lovers_meetup_vol_0/</link><pubDate>Mon, 10 Jul 2023 09:00:00 +0900</pubDate><guid>https://www.takeokunn.org/posts/diary/20230710082646-retrospective_php_lovers_meetup_vol_0/</guid><description>&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;2023/07/10（Mon）に行われた「PHP Lovers Meetup vol.0 ~ 始まりは&amp;lt;?phpから」に参加しました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;connpass
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://php-lovers-meetup.connpass.com/event/280822/"&gt;https://php-lovers-meetup.connpass.com/event/280822/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;togetter
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://togetter.com/li/2184479"&gt;https://togetter.com/li/2184479&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;repo
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/brefphp/bref"&gt;https://github.com/brefphp/bref&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;PHP-DIやBrefの作者として有名な &lt;a href="https://twitter.com/matthieunapoli"&gt;@matthieunapoli&lt;/a&gt; 氏が来日するということで &lt;a href="https://twitter.com/seike460"&gt;@seike460&lt;/a&gt; 氏も福岡から招き、サーバレスフレームワークについて語っていただきました。
自分はBrefを使ったことがないのでBref本体のコードをダラダラ読みながら登壇を聞いていました。&lt;/p&gt;
&lt;h2 id="会場の雰囲気"&gt;会場の雰囲気&lt;/h2&gt;
&lt;blockquote class="twitter-tweet"&gt;&lt;p lang="ja" dir="ltr"&gt;来た &lt;a href="https://twitter.com/hashtag/phplovers?src=hash&amp;amp;ref_src=twsrc%5Etfw"&gt;#phplovers&lt;/a&gt; &lt;a href="https://t.co/XU6jAZqOiw"&gt;pic.twitter.com/XU6jAZqOiw&lt;/a&gt;&lt;/p&gt;&amp;mdash; た҉͜け҉͜て҉͜ぃ҉͜𓁈𓈷 (@takeokunn) &lt;a href="https://twitter.com/takeokunn/status/1678341916965113861?ref_src=twsrc%5Etfw"&gt;July 10, 2023&lt;/a&gt;&lt;/blockquote&gt; &lt;script async src="https://platform.twitter.com/widgets.js" charset="utf-8"&gt;&lt;/script&gt;
&lt;p&gt;会場は40〜50人程度いて、phpカンファレンスで見慣れた方だらけでした。&lt;/p&gt;
&lt;blockquote class="twitter-tweet"&gt;&lt;p lang="en" dir="ltr"&gt;The PHP meetup in Tokyo was an absolute blast!&lt;br&gt;We went from zero code to 1000 requests/second with Laravel in minutes.&lt;br&gt;In the 2nd talk I discovered how Bref is used at a Japanese company.&lt;br&gt;Incredibly friendly vibes, thanks for the warm welcome! And thanks &lt;a href="https://twitter.com/chatii?ref_src=twsrc%5Etfw"&gt;@chatii&lt;/a&gt; for inviting me! &lt;a href="https://t.co/ghDixRZi5q"&gt;pic.twitter.com/ghDixRZi5q&lt;/a&gt;&lt;/p&gt;&amp;mdash; Matthieu Napoli (@matthieunapoli) &lt;a href="https://twitter.com/matthieunapoli/status/1678565763995807744?ref_src=twsrc%5Etfw"&gt;July 11, 2023&lt;/a&gt;&lt;/blockquote&gt; &lt;script async src="https://platform.twitter.com/widgets.js" charset="utf-8"&gt;&lt;/script&gt;
&lt;p&gt;直近&lt;a href="https://gorillavim.connpass.com/event/283937/"&gt;ゴリラvim&lt;/a&gt;でも来たのでpixiv社にはお世話になりっぱなしですね。&lt;/p&gt;</description></item><item><title>Emacs内でgpg fileがsaveできなくなった時に対応したことメモ</title><link>https://www.takeokunn.org/posts/fleeting/20230624130858-how_to_escape_emacs_gpg_bug/</link><pubDate>Sat, 24 Jun 2023 09:00:00 +0900</pubDate><guid>https://www.takeokunn.org/posts/fleeting/20230624130858-how_to_escape_emacs_gpg_bug/</guid><description>&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;自分用のメモです。
何もしていないのに急にgpg fileがEmacsでsaveできなくなったので調査した。&lt;/p&gt;
&lt;h2 id="再現手順"&gt;再現手順&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;MacでEmacsを起動する&lt;/li&gt;
&lt;li&gt;Emacsでgpg fileを開く&lt;/li&gt;
&lt;li&gt;適当に編集する&lt;/li&gt;
&lt;li&gt;&lt;code&gt;C-x C-s&lt;/code&gt; で &lt;code&gt;save-buffer&lt;/code&gt; を実行するとsaveできずにhangする&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="原因について"&gt;原因について&lt;/h2&gt;
&lt;p&gt;「&lt;a href="https://stackoverflow.com/questions/76388376/emacs-org-encrypt-entry-hangs-when-file-is-modified"&gt;emacs org-encrypt-entry hangs when file is modified - stackoverflow&lt;/a&gt;」に同様の問題が投稿されていました。&lt;/p&gt;
&lt;p&gt;Emacsのcommitに次のような記述が追加されていました。
&lt;a href="https://git.savannah.gnu.org/cgit/emacs.git/commit/?h=emacs-29&amp;amp;id=1b9812af80b6ceec8418636dbf84c0fbcd3ab694"&gt;https://git.savannah.gnu.org/cgit/emacs.git/commit/?h=emacs-29&amp;amp;id=1b9812af80b6ceec8418636dbf84c0fbcd3ab694&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-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;diff --git a/etc/PROBLEMS b/etc/PROBLEMS
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;index c0cb5b0..82ab48f 100644
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;--- a/etc/PROBLEMS
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;+++ b/etc/PROBLEMS
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;@@ -516,6 +516,13 @@ directory copy is ineffective.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; This is due to an arbitrary limit in certain versions of awk.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; The solution is to use gawk (GNU awk).
&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;+*** Saving, via EasyPG, a file encrypted with GnuPG hangs
&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;+This is known to happen with GnuPG v2.4.1. The only known workaround
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;+is to downgrade to a version of GnuPG older than 2.4.1 (or, in the
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;+future, upgrade to a newer version which solves the problem, when such
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;+a fixed version becomes available)
&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; ** Problems with hostname resolution
&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; *** Emacs does not know your host&amp;#39;s fully-qualified domain name.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;これによると、GnuPGのversionを下げることによってsave時にhangすることを防げるようです。
自分の手元では &lt;code&gt;2.4.0&lt;/code&gt; を使っていますが、同様の問題が起きました。&lt;/p&gt;</description></item><item><title>phpカンファレンス福岡2023に参加してきました</title><link>https://www.takeokunn.org/posts/diary/20230624093617-retrospective_phpconference_fukuoka_2023/</link><pubDate>Sat, 24 Jun 2023 09:00:00 +0900</pubDate><guid>https://www.takeokunn.org/posts/diary/20230624093617-retrospective_phpconference_fukuoka_2023/</guid><description>&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;2023/6/24(土）に行われたphpconference福岡に参加してきました。
&lt;a href="https://phpcon.fukuoka.jp/2023/"&gt;https://phpcon.fukuoka.jp/2023/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;今回は2023/6/23(金）〜2023/6/26(月）の3泊4日の旅行でした。&lt;/p&gt;
&lt;h2 id="tl-dr"&gt;TL;DR&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;福岡旅行超楽しかった&lt;/li&gt;
&lt;li&gt;普段Twitterでしか会えないPHPerと会えた&lt;/li&gt;
&lt;li&gt;イベント運営、登壇者、スポンサーに圧倒的感謝&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="1日目-移動-前夜祭"&gt;1日目 移動〜前夜祭&lt;/h2&gt;
&lt;h3 id="飛行機-宿"&gt;飛行機〜宿&lt;/h3&gt;
&lt;p&gt;普段一切旅行しないので同僚に相談したところ、新幹線よりもLCCの方が圧倒的に安いという話をされました。
池袋〜成田までは高速バスに乗って向かいました。&lt;/p&gt;
&lt;blockquote class="twitter-tweet"&gt;&lt;p lang="ja" dir="ltr"&gt;早速成田第3ターミナルで降りなくちゃいけないところを第1ターミナルで降りてしまった &lt;a href="https://t.co/MJsNzHtfVh"&gt;pic.twitter.com/MJsNzHtfVh&lt;/a&gt;&lt;/p&gt;&amp;mdash; た҉͜け҉͜て҉͜ぃ҉͜𓁈𓈷 (@takeokunn) &lt;a href="https://twitter.com/takeokunn/status/1672062327317991425?ref_src=twsrc%5Etfw"&gt;June 23, 2023&lt;/a&gt;&lt;/blockquote&gt; &lt;script async src="https://platform.twitter.com/widgets.js" charset="utf-8"&gt;&lt;/script&gt;
&lt;blockquote class="twitter-tweet"&gt;&lt;p lang="ja" dir="ltr"&gt;福岡行くぞー &lt;a href="https://t.co/p5VdoNpOqC"&gt;pic.twitter.com/p5VdoNpOqC&lt;/a&gt;&lt;/p&gt;&amp;mdash; た҉͜け҉͜て҉͜ぃ҉͜𓁈𓈷 (@takeokunn) &lt;a href="https://twitter.com/takeokunn/status/1672076389707829252?ref_src=twsrc%5Etfw"&gt;June 23, 2023&lt;/a&gt;&lt;/blockquote&gt; &lt;script async src="https://platform.twitter.com/widgets.js" charset="utf-8"&gt;&lt;/script&gt;
&lt;p&gt;福岡着後、ららぽーとに向かうバスに乗ろうとしたら当然乗るものを間違えて博多駅行きに乗ってしまっていました。
&lt;a href="https://fukuoka-leapup.jp/common/202005.70"&gt;移動手段は電車よりもバス！福岡の交通あるある３選&lt;/a&gt; にもある通り、福岡のバスは複雑怪奇で苦労しました。&lt;/p&gt;
&lt;blockquote class="twitter-tweet"&gt;&lt;p lang="ja" dir="ltr"&gt;福岡νガンダム！！！！！ &lt;a href="https://t.co/ht2VfDhGSG"&gt;pic.twitter.com/ht2VfDhGSG&lt;/a&gt;&lt;/p&gt;&amp;mdash; た҉͜け҉͜て҉͜ぃ҉͜𓁈𓈷 (@takeokunn) &lt;a href="https://twitter.com/takeokunn/status/1672131507232866305?ref_src=twsrc%5Etfw"&gt;June 23, 2023&lt;/a&gt;&lt;/blockquote&gt; &lt;script async src="https://platform.twitter.com/widgets.js" charset="utf-8"&gt;&lt;/script&gt;
&lt;blockquote class="twitter-tweet"&gt;&lt;p lang="ja" dir="ltr"&gt;νガンダムを見れたし福岡旅行完！！&lt;br&gt;お疲れ様でした！！&lt;/p&gt;&amp;mdash; た҉͜け҉͜て҉͜ぃ҉͜𓁈𓈷 (@takeokunn) &lt;a href="https://twitter.com/takeokunn/status/1672132809006419969?ref_src=twsrc%5Etfw"&gt;June 23, 2023&lt;/a&gt;&lt;/blockquote&gt; &lt;script async src="https://platform.twitter.com/widgets.js" charset="utf-8"&gt;&lt;/script&gt;
&lt;p&gt;ららぽーとから宿に向かう途中、知らない不動産勧誘の人からあおられるなどのランダムイベントがありました。&lt;/p&gt;
&lt;blockquote class="twitter-tweet"&gt;&lt;p lang="ja" dir="ltr"&gt;不動産勧誘「おにいさんちょっといいですか?」&lt;br&gt;俺「なんすか?」&lt;br&gt;不「正社員で年収300万以上だったりします?」&lt;br&gt;俺「俺フリーターすけど...(嘘」&lt;br&gt;不「あーーーやっぱりかーーーーすんません大丈夫っす」&lt;br&gt;&lt;br&gt;何が「やっぱり」だよふざけんなって福岡初日キレてた&lt;/p&gt;&amp;mdash; た҉͜け҉͜て҉͜ぃ҉͜𓁈𓈷 (@takeokunn) &lt;a href="https://twitter.com/takeokunn/status/1673665483114004484?ref_src=twsrc%5Etfw"&gt;June 27, 2023&lt;/a&gt;&lt;/blockquote&gt; &lt;script async src="https://platform.twitter.com/widgets.js" charset="utf-8"&gt;&lt;/script&gt;
&lt;p&gt;宿は一泊3900円のカプセルホテルで人権がないところでした。&lt;/p&gt;
&lt;blockquote class="twitter-tweet"&gt;&lt;p lang="ja" dir="ltr"&gt;今晩の宿です&lt;br&gt;対戦よろしくお願いします &lt;a href="https://t.co/uDQfvJA8sw"&gt;pic.twitter.com/uDQfvJA8sw&lt;/a&gt;&lt;/p&gt;&amp;mdash; た҉͜け҉͜て҉͜ぃ҉͜𓁈𓈷 (@takeokunn) &lt;a href="https://twitter.com/takeokunn/status/1672173040078290944?ref_src=twsrc%5Etfw"&gt;June 23, 2023&lt;/a&gt;&lt;/blockquote&gt; &lt;script async src="https://platform.twitter.com/widgets.js" charset="utf-8"&gt;&lt;/script&gt;
&lt;p&gt;大浴場に脱衣場がなく、宿内は半裸で歩いているおじさんだらけで「これが安宿か。..!」と思わされました。&lt;/p&gt;
&lt;blockquote class="twitter-tweet"&gt;&lt;p lang="ja" dir="ltr"&gt;脱衣場がない脱衣所がない言ってるけどまじでこんな感じの間取り &lt;a href="https://t.co/B9ArYX5VcH"&gt;pic.twitter.com/B9ArYX5VcH&lt;/a&gt;&lt;/p&gt;&amp;mdash; た҉͜け҉͜て҉͜ぃ҉͜𓁈𓈷 (@takeokunn) &lt;a href="https://twitter.com/takeokunn/status/1672776891496022017?ref_src=twsrc%5Etfw"&gt;June 25, 2023&lt;/a&gt;&lt;/blockquote&gt; &lt;script async src="https://platform.twitter.com/widgets.js" charset="utf-8"&gt;&lt;/script&gt;
&lt;p&gt;知らない街の散歩は楽しいですね。&lt;/p&gt;
&lt;blockquote class="twitter-tweet"&gt;&lt;p lang="ja" dir="ltr"&gt;昨日撮った博多の自販機 &lt;a href="https://t.co/kJJlWwol8u"&gt;pic.twitter.com/kJJlWwol8u&lt;/a&gt;&lt;/p&gt;&amp;mdash; た҉͜け҉͜て҉͜ぃ҉͜𓁈𓈷 (@takeokunn) &lt;a href="https://twitter.com/takeokunn/status/1672548570745167872?ref_src=twsrc%5Etfw"&gt;June 24, 2023&lt;/a&gt;&lt;/blockquote&gt; &lt;script async src="https://platform.twitter.com/widgets.js" charset="utf-8"&gt;&lt;/script&gt;
&lt;p&gt;ちなみに会社で「人権がない宿泊まっている」ということを言ったら、以下のような話をされて「お前の泊まった宿は十分に人権がある」ということをつきつけられました。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ロドス島からアテネ行きの船に乗った時に、甲板の上で12時間過ごす。船の上で一晩過ごす必要があり、ラウンジで寝てようと思ったら、そのチケットでは入れないといわれて、追い出された。夜の気温が10度以下で、めっちゃつらかった。&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;h3 id="前夜祭"&gt;前夜祭&lt;/h3&gt;
&lt;p&gt;「(非公式）PHPカンファレンス福岡前夜祭」に主催者側として参加しました。
&lt;a href="https://connpass.com/event/282285/"&gt;https://connpass.com/event/282285/&lt;/a&gt;&lt;/p&gt;</description></item><item><title>ob-phpstanを作った</title><link>https://www.takeokunn.org/posts/permanent/20230416154043-create_ob_phpstan/</link><pubDate>Sun, 16 Apr 2023 09:00:00 +0900</pubDate><guid>https://www.takeokunn.org/posts/permanent/20230416154043-create_ob_phpstan/</guid><description>&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;最近&lt;a href="https://phpstan.org/"&gt;phpstan&lt;/a&gt;を弄ることが増えたのですが、逐一&lt;a href="https://phpstan.org/try"&gt;playground&lt;/a&gt;を開いてWebエディタ内で編集をするのが面倒に感じていました。
org-mode内で完結をするようにしたいと考えるのはEmacsユーザーなら当然の発想です。
そこで今回は &lt;code&gt;org-babel&lt;/code&gt; 経由でphpstanの実行結果をorg内で管理できるようにしました。&lt;/p&gt;
&lt;h2 id="使い方"&gt;使い方&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://github.com/emacs-php/ob-phpstan"&gt;https://github.com/emacs-php/ob-phpstan&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;2023/04/16現在、melpaにはまだ登録をしていないので各自で落してきてパスを通してください。&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-emacs-lisp" data-lang="emacs-lisp"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;(add-to-list &lt;span style="color:#e6db74"&gt;&amp;#39;load-path&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;/path/to/ob-phpstan.el&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;(require &lt;span style="color:#e6db74"&gt;&amp;#39;ob-phpstan&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;次に &lt;code&gt;php-mode&lt;/code&gt; を派生させた &lt;code&gt;phpstan-mode&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-emacs-lisp" data-lang="emacs-lisp"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;(eval-after-load &lt;span style="color:#e6db74"&gt;&amp;#34;org&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;#39;&lt;/span&gt;(add-to-list &lt;span style="color:#e6db74"&gt;&amp;#39;org-src-lang-modes&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;#39;&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;phpstan&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;.&lt;/span&gt; phpstan)))
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;org-babel-phpstan-command&lt;/code&gt; に各自で &lt;code&gt;phpstan&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-emacs-lisp" data-lang="emacs-lisp"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;(with-eval-after-load &lt;span style="color:#e6db74"&gt;&amp;#39;ob-phpstan&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; (setq org-babel-phpstan-command &lt;span style="color:#e6db74"&gt;&amp;#34;/path/to/dir/phpstan&amp;#34;&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;あとは適宜orgファイル内でコードブロック作成し、 &lt;code&gt;org-babel&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-org" data-lang="org"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#+begin_src &lt;/span&gt;&lt;span style="color:#75715e"&gt;phpstan&lt;/span&gt;&lt;span style="color:#75715e"&gt; :level 0
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt; class HelloWorld
&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; public function sayHello(DateTimeImutable $date): void
&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; echo &amp;#39;Hello, &amp;#39; . $date-&amp;gt;format(&amp;#39;j. n. Y&amp;#39;);
&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:#75715e"&gt;#+end_src&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:#75715e"&gt;#+RESULTS&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;&lt;span style="color:#75715e"&gt;#+begin_example&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; Line /var/folders/z5/sk1q5qj96xg4g87vkcp4hq9h0000gn/T/babel-TGYZJB/phpstan-ulqeYI.php
&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; 4 Parameter $date of method HelloWorld::sayHello() has invalid type
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; DateTimeImutable.
&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&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [ERROR] Found 1 error
&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:#75715e"&gt;#+end_example&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;&lt;code&gt;ob-phpstan&lt;/code&gt; は100行にも満たない小さなコードで実装されています。
&lt;a href="https://github.com/emacs-php/ob-phpstan/blob/main/ob-phpstan.el"&gt;https://github.com/emacs-php/ob-phpstan/blob/main/ob-phpstan.el&lt;/a&gt;&lt;/p&gt;</description></item><item><title>phperkaigi 2023でパンフレット記事寄稿&amp;登壇してきました</title><link>https://www.takeokunn.org/posts/diary/20230327015058-phperkaigi_2023_report/</link><pubDate>Mon, 27 Mar 2023 09:00:00 +0900</pubDate><guid>https://www.takeokunn.org/posts/diary/20230327015058-phperkaigi_2023_report/</guid><description>&lt;h2 id="始めに"&gt;始めに&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://phperkaigi.jp/2023/"&gt;phperkaigi 2023&lt;/a&gt; に参加しました。&lt;/p&gt;
&lt;p&gt;phperkaigiとは、年1回大都会練馬のココネリホールで開催されるphperのためのイベントです。
よくphpカンファレンスとごっちゃにされがちなので一応書いておくと、phpカンファレンスは秋に蒲田で、phperkaigiは春に大都会練馬で開かれる別のイベントです。&lt;/p&gt;
&lt;p&gt;去年一昨年は3日間当日スタッフをやっていましたが、今年はDay1の夜終わり際とDay2全日参加をしました。&lt;/p&gt;
&lt;h2 id="活動報告"&gt;活動報告&lt;/h2&gt;
&lt;h3 id="パンフレット記事寄稿しました"&gt;パンフレット記事寄稿しました&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://fortee.jp/phperkaigi-2023/speaker/proposal/view/cb553650-e1be-41ca-b6d4-669dc1d7698a"&gt;「PHP 8から追加されたJITについて学ぼう!」&lt;/a&gt;というテーマで書きました。&lt;/p&gt;
&lt;p&gt;パンフレットにもありますが、&lt;a href="https://www.takeokunn.org/posts/permanent/20221222111924-about_php_jit/"&gt;こちら&lt;/a&gt;にもありますので興味のある方はぜひ読んでください。&lt;/p&gt;
&lt;p&gt;自分の人生でパンフレット記事の寄稿のような、自分のブログ以外に自分の文章が載ったのは初でした。
正直自分自身JITについての理解度が低かったり、長文を書くことに慣れていなかったり、そもそも製本して提出する必要があったり、苦労する点は多かったです。&lt;/p&gt;
&lt;p&gt;しかし、将来的に &lt;code&gt;WEB+DB PRESS&lt;/code&gt; のような有名な技術誌に寄稿してみたいと思っていたのでとても良い機会に恵まれたなぁという気持ちでいっぱいです。
また、実際にパンフレットを手に取って自分の記事が載っていることに対しての達成感は何ものにも代えがたいものだなと感じました。&lt;/p&gt;
&lt;p&gt;非常に良い経験になったので次回も寄稿できるようにプロポーザルを出します。&lt;/p&gt;
&lt;h3 id="スポンサーセッションで登壇をしました"&gt;スポンサーセッションで登壇をしました&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://fortee.jp/phperkaigi-2023/proposal/e2cfa96e-46d3-46e5-8269-8ee72c658582"&gt;約10年もののPHPアプリケーションとの付き合い方と、今後10年改善し続けるための取り組みについて&lt;/a&gt; というテーマで登壇をしました。&lt;/p&gt;
&lt;iframe src="https://docs.google.com/presentation/d/e/2PACX-1vQU-ac8NFjJbWIP9a1vbt1nrXa7_I898CkrRNNUN0aYa8hA3tnzUF2PUw5cPqKe4hTnB8A_o0kigQq2/embed?start=false&amp;loop=false&amp;delayms=3000" frameborder="0" width="960" height="569" allowfullscreen="true" mozallowfullscreen="true" webkitallowfullscreen="true"&gt;&lt;/iframe&gt;
&lt;p&gt;最近入社したにもかかわらず、phperkaigiのスポンサーになってほしいと伝えたところ、一切嫌な顔せずゴールドスポンサーになってくれました。
普段は個人で登壇をしていたのでこういう機会は初でしたが、登壇準備と登壇当日を業務時間として扱ってくれたのが非常にうれしかったです。&lt;/p&gt;
&lt;p&gt;ちなみに、当日スタッフをやっていた同僚の &lt;code&gt;のりぃさん&lt;/code&gt; も業務扱いとして参加していました。&lt;/p&gt;
&lt;blockquote class="twitter-tweet"&gt;&lt;p lang="ja" dir="ltr"&gt;&lt;a href="https://twitter.com/hashtag/phperkaigi?src=hash&amp;amp;ref_src=twsrc%5Etfw"&gt;#phperkaigi&lt;/a&gt; 当日スタッフ業務完了！！&lt;br&gt;やり切った！！&lt;br&gt;疲れた！！&lt;br&gt;参加者の皆様、スポンサーの皆様、スタッフの皆様、本当にありがとうございました！&lt;br&gt;久しぶりのオフラインイベント、めちゃくちゃ楽しい。刺戟的な3日間でした！😀✨&lt;/p&gt;&amp;mdash; のりぃ (@m_norii) &lt;a href="https://twitter.com/m_norii/status/1639610187727409152?ref_src=twsrc%5Etfw"&gt;March 25, 2023&lt;/a&gt;&lt;/blockquote&gt; &lt;script async src="https://platform.twitter.com/widgets.js" charset="utf-8"&gt;&lt;/script&gt;
&lt;p&gt;OPENLOGIでは積極的にphperとemacser採用しています。僕とphpを書きたい人はぜひ応募してください。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://corp.openlogi.com/recruit/"&gt;https://corp.openlogi.com/recruit/&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="イベントで楽しかったこと"&gt;イベントで楽しかったこと&lt;/h3&gt;
&lt;p&gt;楽しかったことを適当にピックアップしてざっくばらんに書いていきます。&lt;/p&gt;
&lt;h4 id="day-0-きんじょうさんの発表よかった"&gt;[Day 0] きんじょうさんの発表よかった&lt;/h4&gt;
&lt;p&gt;2023年版「パーフェクトphp」の書籍化、まってます。&lt;/p&gt;
&lt;iframe class="speakerdeck-iframe" frameborder="0" src="https://speakerdeck.com/player/c63c9a6f457f4609917543e6d73ac1a9" title="#phperkaigi 名著「パーフェクトPHP」のPart3に出てきたフレームワークを令和5年に書き直したらどんな感じですかね？" allowfullscreen="true" style="border: 0px; background: padding-box padding-box rgba(0, 0, 0, 0.1); margin: 0px; padding: 0px; border-radius: 6px; box-shadow: rgba(0, 0, 0, 0.2) 0px 5px 40px; width: 100%; height: auto; aspect-ratio: 560 / 314;" data-ratio="1.78343949044586"&gt;&lt;/iframe&gt;
&lt;h4 id="day-1-てきめんさんいつもありがとう"&gt;[Day 1] てきめんさんいつもありがとう&lt;/h4&gt;
&lt;p&gt;ファンです。いつも応援してます。&lt;/p&gt;</description></item><item><title>「第149回 PHP勉強会＠東京」で登壇してきました</title><link>https://www.takeokunn.org/posts/diary/20230220161138-phpstudy_149_report/</link><pubDate>Mon, 20 Feb 2023 09:00:00 +0900</pubDate><guid>https://www.takeokunn.org/posts/diary/20230220161138-phpstudy_149_report/</guid><description>&lt;h2 id="始めに"&gt;始めに&lt;/h2&gt;
&lt;p&gt;2023-02-15（水）に &lt;a href="https://www.gmo.jp/csr/partners/office/#gmo-yours"&gt;GMO Yours&lt;/a&gt; で行われた &lt;a href="https://phpstudy.doorkeeper.jp/events/151021"&gt;第149回 PHP勉強会＠東京&lt;/a&gt; で登壇してきました。
現地には30人、オンラインの視聴者は20人くらいで非常に和気藹々とした勉強会でした。&lt;/p&gt;
&lt;blockquote class="twitter-tweet"&gt;&lt;p lang="ja" dir="ltr"&gt;GMO Yours に来てます! &lt;a href="https://twitter.com/hashtag/phpstudy?src=hash&amp;amp;ref_src=twsrc%5Etfw"&gt;#phpstudy&lt;/a&gt;&lt;/p&gt;&amp;mdash; た҉͜け҉͜て҉͜ぃ҉͜𓁈𓈷 (@takeokunn) &lt;a href="https://twitter.com/takeokunn/status/1625810497215029248?ref_src=twsrc%5Etfw"&gt;February 15, 2023&lt;/a&gt;&lt;/blockquote&gt; &lt;script async src="https://platform.twitter.com/widgets.js" charset="utf-8"&gt;&lt;/script&gt;
&lt;h2 id="登壇"&gt;登壇&lt;/h2&gt;
&lt;h3 id="内容について"&gt;内容について&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://docs.google.com/presentation/d/1WXgJP9oqydr-5Vn1oXDti9Gdfaxc_OhvVg6tgIi5LEs/edit#slide=id.p"&gt;phpstan-strict-rulesでよりbetterなphpを手に入れよう&lt;/a&gt; というタイトルで話しました。&lt;/p&gt;
&lt;iframe
src="https://docs.google.com/presentation/d/e/2PACX-1vR2CYaDCANUaSo4Aq2RJ82Z0Bh2rxMKTWljxzg9OO-V7fi_7yi0AgaEMCvCdHizHUxFTuVD2HwB9HAi/embed?start=false&amp;loop=false&amp;delayms=3000"
frameborder="0"
width="960"
height="569"
allowfullscreen="true"
mozallowfullscreen="true"
webkitallowfullscreen="true"&gt;
&lt;/iframe&gt;
&lt;p&gt;関連するツイートはこのあたりです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://togetter.com/li/2082268?page=9"&gt;https://togetter.com/li/2082268?page=9&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://togetter.com/li/2082268?page=10"&gt;https://togetter.com/li/2082268?page=10&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://togetter.com/li/2082268?page=11"&gt;https://togetter.com/li/2082268?page=11&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://togetter.com/li/2082268?page=12"&gt;https://togetter.com/li/2082268?page=12&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://togetter.com/li/2082268?page=13"&gt;https://togetter.com/li/2082268?page=13&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;YouTubeのアーカイブも残っているので気になる人はこちらから見てください。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.youtube.com/live/k0GkmSYhtrQ?feature=share&amp;amp;t=7526"&gt;https://www.youtube.com/live/k0GkmSYhtrQ?feature=share&amp;amp;t=7526&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="補足など"&gt;補足など&lt;/h3&gt;
&lt;h4 id="emacsと申します"&gt;Emacsと申します&lt;/h4&gt;
&lt;p&gt;&lt;a href="https://dic.pixiv.net/a/%E4%BF%BA%E3%81%8C%E3%82%AC%E3%83%B3%E3%83%80%E3%83%A0%E3%81%A0"&gt;&lt;code&gt;俺がEmacsだ&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h4 id="phpstan-tシャツについて"&gt;PHPStan Tシャツについて&lt;/h4&gt;
&lt;p&gt;いつぞやのイベントでたっどさんから託されたTシャツ。
日本で数人しか持っていない実はレアなやつ。&lt;/p&gt;
&lt;blockquote class="twitter-tweet"&gt;&lt;p lang="ja" dir="ltr"&gt;日本で数人のPHPStanを着こなしている男 &lt;a href="https://twitter.com/hashtag/phpstudy?src=hash&amp;amp;ref_src=twsrc%5Etfw"&gt;#phpstudy&lt;/a&gt; &lt;a href="https://t.co/XOW4FRp535"&gt;pic.twitter.com/XOW4FRp535&lt;/a&gt;&lt;/p&gt;&amp;mdash; にゃんだーすわん (@tadsan) &lt;a href="https://twitter.com/tadsan/status/1625828730173284353?ref_src=twsrc%5Etfw"&gt;February 15, 2023&lt;/a&gt;&lt;/blockquote&gt; &lt;script async src="https://platform.twitter.com/widgets.js" charset="utf-8"&gt;&lt;/script&gt;
&lt;h4 id="php-src-を毎朝-git-pull-していることについて"&gt;&lt;code&gt;php-src&lt;/code&gt; を毎朝 &lt;code&gt;git pull&lt;/code&gt; していることについて&lt;/h4&gt;
&lt;p&gt;自分の好きなプロジェクトを毎朝 &lt;code&gt;git pull&lt;/code&gt; して変更を見る行為は季節の移ろいを感じられてお勧めです。&lt;/p&gt;
&lt;h4 id="hanhanさんの-今週の-php-を毎週かかさずチェックしよう"&gt;hanhanさんの「今週の PHP」を毎週かかさずチェックしよう&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;hanhan&lt;/code&gt; さんいつもありがとう。&lt;/p&gt;
&lt;blockquote class="twitter-tweet"&gt;&lt;p lang="ja" dir="ltr"&gt;&lt;a href="https://t.co/fGEjRAZuUN"&gt;https://t.co/fGEjRAZuUN&lt;/a&gt; &lt;a href="https://twitter.com/hashtag/%E4%BB%8A%E9%80%B1%E3%81%AEPHP?src=hash&amp;amp;ref_src=twsrc%5Etfw"&gt;#今週のPHP&lt;/a&gt; はこちらです。 &lt;a href="https://twitter.com/hashtag/phpstudy?src=hash&amp;amp;ref_src=twsrc%5Etfw"&gt;#phpstudy&lt;/a&gt;&lt;/p&gt;&amp;mdash; Ryo Tomidokoro (@hanhan1978) &lt;a href="https://twitter.com/hanhan1978/status/1625827379645153286?ref_src=twsrc%5Etfw"&gt;February 15, 2023&lt;/a&gt;&lt;/blockquote&gt; &lt;script async src="https://platform.twitter.com/widgets.js" charset="utf-8"&gt;&lt;/script&gt;
&lt;h4 id="皆さんは会社や個人のプロジェクトでphpstanを入れていますか"&gt;皆さんは会社や個人のプロジェクトでPHPStanを入れていますか?&lt;/h4&gt;
&lt;p&gt;会場は半分くらいの方が手を上げていました。&lt;/p&gt;
&lt;h4 id="phpstanのlevelは5より上か下か"&gt;PHPStanのlevelは5より上か下か&lt;/h4&gt;
&lt;p&gt;会場はさらに半分くらいの方がlevel5よりも上と手を上げていました。&lt;/p&gt;
&lt;h4 id="phpstanを入れて良かったかどうか"&gt;PHPStanを入れて良かったかどうか&lt;/h4&gt;
&lt;p&gt;おおむねみなさん手を上げていました。&lt;/p&gt;
&lt;h4 id="初期開発でphpstan-level-maxを選択"&gt;初期開発でPHPStan Level Maxを選択&lt;/h4&gt;
&lt;p&gt;既存のコードがない場合ほど制約を厳しくできて良いですね、という声がちらほらありました。
TypeScriptでも &lt;code&gt;noImplicitAny&lt;/code&gt; を有効にするには初期じゃないとできない等、既存のコードベースがあるかどうかはかなり大きいです。&lt;/p&gt;</description></item><item><title>Docker VolumeをCopy/Renameする方法</title><link>https://www.takeokunn.org/posts/fleeting/20230209111810-how_to_copy_and_rename_docker_volume/</link><pubDate>Thu, 09 Feb 2023 09:00:00 +0900</pubDate><guid>https://www.takeokunn.org/posts/fleeting/20230209111810-how_to_copy_and_rename_docker_volume/</guid><description>&lt;h2 id="前提"&gt;前提&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;docker volume&lt;/code&gt; のデフォルトの機能にcopyやrenameはありません。
&lt;a href="https://matsuand.github.io/docs.docker.jp.onthefly/storage/volumes/"&gt;https://matsuand.github.io/docs.docker.jp.onthefly/storage/volumes/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/moby/moby/issues/31154"&gt;Rename docker volume #31154&lt;/a&gt; というissueも立っているが、対応される見込がないです。&lt;/p&gt;
&lt;p&gt;interfaceとして提供してくれていないだけで、実態はDocker File System内どこかにはあるはず。
絶対できるはずだという前提のもと調べてみたらできたのでまとめておきます。&lt;/p&gt;
&lt;h2 id="準備"&gt;準備&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;docker engine&lt;/code&gt; を起動して、 &lt;code&gt;docker volume&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-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker volume create --name&lt;span style="color:#f92672"&gt;=&lt;/span&gt;my-volume
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="copyやrenameのやり方"&gt;CopyやRenameのやり方&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;justincormack/nsenter1&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-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker run -it --rm --privileged --pid&lt;span style="color:#f92672"&gt;=&lt;/span&gt;host justincormack/nsenter1
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;docker volume&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-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;/ &lt;span style="color:#75715e"&gt;# cd /var/lib/docker/volumes/&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;/var/lib/docker/volumes &lt;span style="color:#75715e"&gt;# ls -la | grep my-volume&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;drwx-----x &lt;span style="color:#ae81ff"&gt;3&lt;/span&gt; root root &lt;span style="color:#ae81ff"&gt;4096&lt;/span&gt; Feb &lt;span style="color:#ae81ff"&gt;9&lt;/span&gt; 02:59 my-volume
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;あとは &lt;code&gt;cp&lt;/code&gt; をするなり、 &lt;code&gt;mv&lt;/code&gt; をするなりでよしなに。&lt;/p&gt;
&lt;p&gt;すぐに認識してくれないみたいなので &lt;code&gt;Docker for Mac&lt;/code&gt; に反映するには再起動が必要そう。&lt;/p&gt;</description></item><item><title>VimとNeovimの使い分けと最小構成</title><link>https://www.takeokunn.org/posts/fleeting/20230209152709-using-vim-and-neovim-for-differenct-purposes-and-minimum-settings/</link><pubDate>Thu, 09 Feb 2023 09:00:00 +0900</pubDate><guid>https://www.takeokunn.org/posts/fleeting/20230209152709-using-vim-and-neovim-for-differenct-purposes-and-minimum-settings/</guid><description>&lt;h2 id="vimとneovimの運用方針"&gt;VimとNeovimの運用方針&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://mobile.twitter.com/takeokunn/status/1464971704124710915"&gt;Twitterではずっと主張してること&lt;/a&gt; だが、VimとNeovimの設定は共通化しない方がよいと考えています。&lt;/p&gt;
&lt;p&gt;次のような使い分けをしています。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Vim → サーバ用の最小設定&lt;/li&gt;
&lt;li&gt;Neovim → 日常的な開発用&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;コンテナ全盛期の現代といえど、サーバに入って作業をする必要がある人も多いんじゃないでしょうか。
不自由な環境でちょっとしたファイルを開いて数行変更するだけに関しては、Vimほど適したテキストエディタはないでしょう。&lt;/p&gt;
&lt;p&gt;ただ、設定がまったくされていない素Vimでは少々厳しい場面があります。
&lt;code&gt;set number relativenumber&lt;/code&gt; で行番号表示するくらいは欲しいものです。
ちょっとしたサーバにも持っていけるような最低限の設定を持っておくとサーバ内で安心して作業できます。&lt;/p&gt;
&lt;p&gt;一方、通常の開発でもVimを使いたいという要望はあるでしょう。
現にEmacsをメインで使っている自分もフォールバック先としてNeovimを使うことが多いです。
Emacs自体は本来安定しているのですが、Emacsを毎朝 &lt;code&gt;git pull&lt;/code&gt; してHEAD Buildしている関係であまり手元環境が安定していないです。&lt;/p&gt;
&lt;p&gt;ヘビーカスタマイズをすると、VimとNeovim両方を考慮したコードを書くのはかなり厳しい印象があります。
最新のVim事情はわかりませんが、Python製Pluginが流行っていた時かなりしんどかったです。
カスタマイズをする方を完全にNeovim側に寄せることによって、Vimの場合の条件分岐が減るので考慮することが減ります。&lt;/p&gt;
&lt;h2 id="最低限のvimの設定"&gt;最低限のVimの設定&lt;/h2&gt;
&lt;p&gt;次のcommandをたたけば入ります。&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-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;curl -s https://raw.githubusercontent.com/takeokunn/dotfiles/master/modules/vim/dot.vimrc &amp;gt; ~/.vimrc
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;自分が最低限必要な設定は次の30行です。&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:#66d9ef"&gt;set&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;encoding&lt;/span&gt;=&lt;span style="color:#a6e22e"&gt;utf&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;-8&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;set&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;fileencodings&lt;/span&gt;=&lt;span style="color:#a6e22e"&gt;utf&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;-8&lt;/span&gt;,&lt;span style="color:#a6e22e"&gt;euc&lt;/span&gt;-&lt;span style="color:#a6e22e"&gt;jp&lt;/span&gt;,&lt;span style="color:#a6e22e"&gt;cp932&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;set&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;clipboard&lt;/span&gt;+=&lt;span style="color:#a6e22e"&gt;unnamed&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;set&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;backspace&lt;/span&gt;=&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;set&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;tabstop&lt;/span&gt;=&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;set&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;shiftwidth&lt;/span&gt;=&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;set&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;laststatus&lt;/span&gt;=&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;set&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;statusline&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 style="color:#66d9ef"&gt;set&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;showmatch&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;set&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;wrapscan&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;set&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;hlsearch&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;set&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;showcmd&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;set&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;title&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;set&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;number&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;relativenumber&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;set&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;cursorline&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;set&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;nofoldenable&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;set&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;noswapfile&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;set&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;expandtab&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;set&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;splitbelow&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;set&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;splitright&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;set&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;incsearch&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;set&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;ignorecase&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;set&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;smartcase&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;nnoremap&lt;/span&gt; &lt;span style="color:#e6db74"&gt;/ /&lt;/span&gt;\&lt;span style="color:#a6e22e"&gt;v&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;nnoremap&lt;/span&gt; &amp;lt;&lt;span style="color:#a6e22e"&gt;Leader&lt;/span&gt;&amp;gt;&amp;lt;&lt;span style="color:#a6e22e"&gt;Leader&lt;/span&gt;&amp;gt; &lt;span style="color:#a6e22e"&gt;V&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;nnoremap&lt;/span&gt; &amp;lt;&lt;span style="color:#a6e22e"&gt;Esc&lt;/span&gt;&amp;gt;&amp;lt;&lt;span style="color:#a6e22e"&gt;Esc&lt;/span&gt;&amp;gt; :&lt;span style="color:#a6e22e"&gt;nohlsearch&lt;/span&gt;&amp;lt;&lt;span style="color:#a6e22e"&gt;CR&lt;/span&gt;&amp;gt;&amp;lt;&lt;span style="color:#a6e22e"&gt;Esc&lt;/span&gt;&amp;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;syntax&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;on&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;filetype&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;plugin&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;indent&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;on&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ファイルを開いて文字列を検索することが多いので次の設定がお気に入りです。&lt;/p&gt;</description></item><item><title>aws-cliとecs-cliのconfigをorgで管理してdefault値を一切設定しない運用をする</title><link>https://www.takeokunn.org/posts/permanent/20230119162342-aws_cli_ecs_cli_configure_without_default_value_by_org/</link><pubDate>Thu, 19 Jan 2023 09:00:00 +0900</pubDate><guid>https://www.takeokunn.org/posts/permanent/20230119162342-aws_cli_ecs_cli_configure_without_default_value_by_org/</guid><description>&lt;h2 id="前提"&gt;前提&lt;/h2&gt;
&lt;p&gt;私は普段次のような条件でAWSを触っています。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;AWSアカウントを複数社分扱っている&lt;/li&gt;
&lt;li&gt;SwitchRoleで複数扱っている&lt;/li&gt;
&lt;li&gt;手元から頻繁にコマンドをたたく&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;さまざまな環境で作業をしていると、「想定と違う環境に対してAPIを投げてしまう」「意図したリソースが取得できない」等さまざまなトラブルに直面します。
全部CI/CDで管理をして、localからは一切なにもしないというのは1つの理想ではあるものの、そうはいかないのが現実というものです。&lt;/p&gt;
&lt;p&gt;あらためて自分の手元の環境を見直したところ、そもそもデフォルト値を指定せずにちゃんと指定すれば事故が起きないのではという結論に至ったのでまとめておきます。&lt;/p&gt;
&lt;h2 id="運用方法"&gt;運用方法&lt;/h2&gt;
&lt;h3 id="org-fileですべてを管理する"&gt;org fileですべてを管理する&lt;/h3&gt;
&lt;p&gt;そもそも設定がゴチャゴチャしたり、ミスをしたり、間違ったコマンドを流してしまうのはどうしてでしょうか？
答えは簡単で、明示的にコマンドや設定ファイルを用意していないからです。&lt;/p&gt;
&lt;p&gt;普段使う設定やコマンドをドキュメントとして管理をし、明示的に変更を加える運用にすれば事故ることが格段に減ります。&lt;/p&gt;
&lt;p&gt;その為のツールとしてEmacsの&lt;a href="https://orgmode.org/ja/"&gt;org-mode&lt;/a&gt;はおあつらえ向きです。
Markdown同様手軽に文章を書け、分割した設定も管理でき、ファイルに出力でき、 &lt;code&gt;org-babel&lt;/code&gt; を使えばコマンドを実行できます。&lt;/p&gt;
&lt;p&gt;たとえば次のようにコードブロックを作って &lt;code&gt;org-babel&lt;/code&gt; すると &lt;code&gt;RESULTS&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-org" data-lang="org"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#+begin_src &lt;/span&gt;&lt;span style="color:#75715e"&gt;shell&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;&lt;span style="color:#75715e"&gt;&lt;/span&gt;echo &lt;span style="color:#e6db74"&gt;&amp;#34;hello world&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#+end_src&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:#75715e"&gt;#+RESULTS&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;: hello world
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;また、秘匿情報を扱う場合は &lt;code&gt;sandbox.org.gpg&lt;/code&gt; のように接尾辞に &lt;code&gt;.gpg&lt;/code&gt; をつけるとEmacsが勝手にEncryptしてくれるのでセキュアに管理できます。
私はprivate repoでこのような秘匿情報をorg fileで管理しています。&lt;/p&gt;
&lt;h3 id="aws-cli周り"&gt;aws-cli周り&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;~/.aws/config&lt;/code&gt; は次のように &lt;code&gt;org-mode&lt;/code&gt; で管理をしています。
&lt;code&gt;:noweb-ref&lt;/code&gt; でimportできるようにして、 &lt;code&gt;:tangle&lt;/code&gt; で出力先を設定し、 &lt;code&gt;M-x org-babel-tangle&lt;/code&gt; でファイルを出力するようにしています。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;~/.aws/config&lt;/code&gt; と同様 &lt;code&gt;~/.aws/credential&lt;/code&gt; も &lt;code&gt;org-mode&lt;/code&gt; で管理をしています。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;strong&gt;デフォルト値を一切設定しない&lt;/strong&gt;&lt;/strong&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-org" data-lang="org"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;*&lt;span style="font-weight:bold"&gt; aws&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;**&lt;/span&gt; config
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;***&lt;/span&gt; alice
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#+begin_src &lt;/span&gt;&lt;span style="color:#75715e"&gt;conf&lt;/span&gt;&lt;span style="color:#75715e"&gt; :noweb-ref aws-config-alice
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt; [profile alice]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; source_profile = alice-dev
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; role_arn = arn:aws:iam::xxx
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; region = ap-northeast-1
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; output = json
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#+end_src&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;***&lt;/span&gt; bob
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#+begin_src &lt;/span&gt;&lt;span style="color:#75715e"&gt;conf&lt;/span&gt;&lt;span style="color:#75715e"&gt; :noweb-ref aws-config-bob
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt; [profile bob]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; region = ap-northeast-1
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; output = json
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#+end_src&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;***&lt;/span&gt; all
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#+begin_src &lt;/span&gt;&lt;span style="color:#75715e"&gt;conf&lt;/span&gt;&lt;span style="color:#75715e"&gt; :noweb yes :tangle (expand-file-name &amp;#34;~/.aws/config&amp;#34;) :mkdirp yes
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&lt;/span&gt; # alice
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&amp;lt;aws-config-alice&amp;gt;&amp;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; # bob
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&amp;lt;aws-config-bob&amp;gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#+end_src&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;コマンドを流す時は次のようにいったんorgファイルに記述したうえで &lt;code&gt;org-babel&lt;/code&gt; なりterminalなりで実行するようにしています。
&lt;code&gt;aws&lt;/code&gt; コマンドは &lt;code&gt;--profile&lt;/code&gt; オプションがあり、 &lt;strong&gt;&lt;strong&gt;必ず指定&lt;/strong&gt;&lt;/strong&gt; するようにしています。&lt;/p&gt;</description></item><item><title>PHP8から追加されたJITについて学ぼう!</title><link>https://www.takeokunn.org/posts/permanent/20221222111924-about_php_jit/</link><pubDate>Thu, 22 Dec 2022 09:00:00 +0900</pubDate><guid>https://www.takeokunn.org/posts/permanent/20221222111924-about_php_jit/</guid><description>&lt;h2 id="始めに"&gt;始めに&lt;/h2&gt;
&lt;p&gt;2023年現在、PHPは世界中の企業で使われており、もっとも成功しているプログラミング言語の1つと言っても過言ではないくらい開発者から愛されています。
WikipediaやWordPressもPHP製のプロダクトですので、開発者でなくてもPHPの恩恵を受けている人は多いでしょう。&lt;/p&gt;
&lt;p&gt;私も5年以上PHPを用いて開発していますが、日進月歩で進化し続けるPHPにワクワクさせられています。&lt;/p&gt;
&lt;p&gt;PHP 8.0が2020年11月にリリースされ、さまざまな便利な新機能が追加されました。
特に &lt;code&gt;Match式&lt;/code&gt; は複雑な条件分岐を「式」で書くことができ、より柔軟な記述が可能になります。&lt;/p&gt;
&lt;p&gt;高く評価されている新機能の1つに &lt;code&gt;JIT (ジャストインタイム) コンパイラ&lt;/code&gt; があります。
JITを正しく使うと、条件によってはアプリケーションの1.5倍以上高速化できるということを公式のリリースページに書いてあります。&lt;/p&gt;
&lt;p&gt;そもそもJITとは何か、PHP上でどのようにJITが動作しているのかを知れば、アプリケーションの記述を変えずに高速化できるでしょう。&lt;/p&gt;
&lt;h2 id="jitについての概要"&gt;JITについての概要&lt;/h2&gt;
&lt;p&gt;JIT自体の歴史は長く、さまざまな言語の処理系で実装されています。
JavaScriptの処理系であるV8 EngineもJITを導入することによって大幅な高速化を実現しました。&lt;/p&gt;
&lt;p&gt;Ruby 3.1ではYJITが導入されました。
YJITはShopify社製のJIT Compilerで、同社はRailsアプリケーションが &lt;code&gt;20%~40%&lt;/code&gt; 程度高速化できたという報告をしています。&lt;/p&gt;
&lt;p&gt;私の普段使っているEmacsでもJIT Compilerがサポートされて、体感速度として感じられるくらい動作がサクサクになったという実感があります。&lt;/p&gt;
&lt;p&gt;PHP、Ruby、JavaScriptのような動的型付き言語は、CやRustのような静的型付き言語よりも実行速度が遅いです。
遅い理由は様ありますが、実行時に字句解析、構文解析、コンパイルをして中間コードを吐き出し、VM上で実行をしているのが原因です。
変数や関数の型情報の多くは実行時に決まり、実行時にVM上で最適化が走るので、どうしても遲くなってしまいます。&lt;/p&gt;
&lt;p&gt;高速に実行するアプローチの1つにJIT Compileがあります。
JIT Compileは実行時にマシンコードを吐き出し、キャッシュ上に乗せ、再度実行する時にキャッシュ上のマシンコードを実行するというアプローチです。
マシンコードにすることによって、中間コードにわざわざ変換をしてVM上で変換をする必要がないので高速に動かすことができます。&lt;/p&gt;
&lt;p&gt;ちなみに、JITの対比として、C言語のような事前にコンパイルする通常の手法はAOT（Ahead-Of-Time）コンパイルと呼びます。&lt;/p&gt;
&lt;p&gt;JIT Compilerの実装挟まざまありますが、PHPではDynASMを使っています。
DynASMはLuaでも使われており、すでに実績を残しています。&lt;/p&gt;
&lt;h2 id="phpのjitの基本的なしくみ"&gt;PHPのJITの基本的なしくみ&lt;/h2&gt;
&lt;p&gt;2023年1月現在、JITはOPCacheのサブセットとして提供されています。
OPCacheとJITの立ち位置について解説していきます。&lt;/p&gt;
&lt;h3 id="phpのみの場合"&gt;PHPのみの場合&lt;/h3&gt;
&lt;figure&gt;&lt;img src="https://www.takeokunn.org/images/E629D887-07A8-4018-9F8A-D2F8EDA7F579.png"&gt;
&lt;/figure&gt;
&lt;p&gt;PHPは通常、図のような処理が行われます。&lt;/p&gt;
&lt;p&gt;字句解析で文字列をトークン化、構文解析で &lt;code&gt;opcode&lt;/code&gt; を含む構文木（AST）を作り、VM上で実行をする、というフローをたどります。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;opcode&lt;/code&gt; は中間コードのことであり、VMで解釈できるような命令セットのことです。
VMの仕事は中間コードを読み込み、最適化したうえで処理を実行をすることです。&lt;/p&gt;
&lt;p&gt;PHPのVMは &lt;code&gt;ZendEngine&lt;/code&gt; と呼ばれており、ZendEngineがCPUアーキテクチャ間の際を吸収しています。
私達が普段 &lt;code&gt;M1 Mac&lt;/code&gt; でも &lt;code&gt;Intel x86&lt;/code&gt; でも同じコードから同じ実行結果を得られるのは &lt;code&gt;ZendEngine&lt;/code&gt; があるからこそです。&lt;/p&gt;
&lt;p&gt;通常PHPは実行時にこれら一連の処理を毎回行っています。
PHPサーバのプロセスを再起動せずにコードが反映されるというメリットがあります。
しかし、毎回一連の処理をするのは非効率です。&lt;/p&gt;
&lt;p&gt;適切にcacheを効かせて実行時の処理を減らす機構こそがOPCacheです。&lt;/p&gt;
&lt;h3 id="opcacheの場合"&gt;OPCacheの場合&lt;/h3&gt;
&lt;figure&gt;&lt;img src="https://www.takeokunn.org/images/9187F38B-4144-4714-ACCE-A2B61E58AFBC.png"&gt;
&lt;/figure&gt;
&lt;p&gt;OPCacheを有効にすると、図のような処理が行われます。&lt;/p&gt;</description></item><item><title>sitemap.xmlからURLを良い感じに抽出してPlaywrightでUIを目視確認する</title><link>https://www.takeokunn.org/posts/fleeting/20221222102844-run_playwright_by_sitemap/</link><pubDate>Thu, 22 Dec 2022 09:00:00 +0900</pubDate><guid>https://www.takeokunn.org/posts/fleeting/20221222102844-run_playwright_by_sitemap/</guid><description>&lt;h2 id="やりたいこと"&gt;やりたいこと&lt;/h2&gt;
&lt;p&gt;フレームワークや言語のバージョンを上げたり、UI周りのリファクタリングをした際に、500やデザイン崩れがないかを確認したい。
理想をいうとxUnitのようなテストコードを書いたりする方がよいのだが、テストコードを書くと工数が非常にかかるし、もともとテストコードがない環境だとしんどい。&lt;/p&gt;
&lt;p&gt;また、テストコードでは当然UIの目視確認まではできない。&lt;/p&gt;
&lt;p&gt;サクっと主要なページを目視で眺める方法ないかなと考えてたところ、「確認したいページリストを &lt;code&gt;sitemap.xml&lt;/code&gt; から生成してよい感じに自動でスクロールすればよいのでは。..?」ということを思いついたので書いていく。&lt;/p&gt;
&lt;p&gt;特に拘泥がなかったので &lt;a href="https://zenn.dev/yusukeiwaki/articles/db1cd8d7aa87ed"&gt;2021年現在、Puppeteerを使う理由はなくなった。Playwrightを使おう。&lt;/a&gt; を読んでPlaywrightを選んだ。&lt;/p&gt;
&lt;h2 id="ソースコード"&gt;ソースコード&lt;/h2&gt;
&lt;p&gt;必要packageは次の3つ。&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-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ npm install playwright
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ npm install axios
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ npm install xml2json
&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-js" data-lang="js"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;axios&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;require&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;axios&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;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;parser&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;require&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;xml2json&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;const&lt;/span&gt; { &lt;span style="color:#a6e22e"&gt;chromium&lt;/span&gt; } &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;require&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;playwright&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;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;BASE_URL&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;&amp;lt;edit your url&amp;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;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;fetchSitemap&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;async&lt;/span&gt; () =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;res&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;await&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;axios&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;get&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;`&lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;BASE_URL&lt;/span&gt;&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;/sitemap.xml`&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;body&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;JSON&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;parse&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;parser&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;toJson&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;res&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;data&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:#a6e22e"&gt;body&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;urlset&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;url&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;map&lt;/span&gt;((&lt;span style="color:#a6e22e"&gt;url&lt;/span&gt;) =&amp;gt; &lt;span style="color:#a6e22e"&gt;url&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;loc&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;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;filterSitemapUrls&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;urls&lt;/span&gt;) =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;cb&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;path&lt;/span&gt;) =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;count&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&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&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:#a6e22e"&gt;url&lt;/span&gt;) =&amp;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:#a6e22e"&gt;url&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;match&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;path&lt;/span&gt;)) &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;true&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:#a6e22e"&gt;count&lt;/span&gt; &lt;span style="color:#f92672"&gt;===&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;false&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;count&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;return&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;true&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&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:#a6e22e"&gt;urls&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;filter&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;cb&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;/posts\//&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;filter&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;cb&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;/articles\//&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;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;evaluateScript&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;async&lt;/span&gt; () =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;delay&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;ms&lt;/span&gt;) =&amp;gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; Promise((&lt;span style="color:#a6e22e"&gt;resolve&lt;/span&gt;) =&amp;gt; &lt;span style="color:#a6e22e"&gt;setTimeout&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;resolve&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;ms&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; (&lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;index&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;; &lt;span style="color:#a6e22e"&gt;index&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt; document.&lt;span style="color:#a6e22e"&gt;body&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;scrollHeight&lt;/span&gt; &lt;span style="color:#f92672"&gt;/&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;10&lt;/span&gt;; &lt;span style="color:#a6e22e"&gt;index&lt;/span&gt; &lt;span style="color:#f92672"&gt;+=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;100&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; window.&lt;span style="color:#a6e22e"&gt;scrollTo&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;index&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;10&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;await&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;delay&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;1000&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&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;runSitemapScenarios&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;async&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;page&lt;/span&gt;) =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;urls&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;await&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;fetchSitemap&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; (&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;url&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;of&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;filterSitemapUrls&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;urls&lt;/span&gt;)) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;await&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;page&lt;/span&gt;.&lt;span style="color:#66d9ef"&gt;goto&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;url&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;await&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;page&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;evaluate&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;evaluateScript&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&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;main&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;async&lt;/span&gt; () =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;browser&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;await&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;chromium&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;launch&lt;/span&gt;({ &lt;span style="color:#a6e22e"&gt;headless&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;false&lt;/span&gt; });
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;page&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;await&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;browser&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;newPage&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;await&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;runSitemapScenarios&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;page&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;await&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;browser&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;close&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:#a6e22e"&gt;main&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;&lt;code&gt;&amp;lt;base_url&amp;gt;/sitemap.xml&lt;/code&gt; を &lt;code&gt;axios&lt;/code&gt; で取得し、 &lt;code&gt;xml2json&lt;/code&gt; でxmlをjsonに変換後、playwrightで下までスクロールする。
ただ、純粋に &lt;code&gt;sitemap.xml&lt;/code&gt; をすべて眺めるのは厳しい。
&lt;code&gt;/articles/&amp;lt;id&amp;gt;&lt;/code&gt; のような動的に生成されたページをすべて見るのは無駄だ。&lt;/p&gt;</description></item><item><title>Emacsを世界最速級で起動する方法</title><link>https://www.takeokunn.org/posts/permanent/20221217132815-emacs_more_faster/</link><pubDate>Sat, 17 Dec 2022 09:00:00 +0900</pubDate><guid>https://www.takeokunn.org/posts/permanent/20221217132815-emacs_more_faster/</guid><description>&lt;p&gt;&lt;a href="https://qiita.com/advent-calendar/2022/emacs"&gt;Emacs Advent Calendar 2022&lt;/a&gt; 19日目です。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://qiita.com/advent-calendar/2022/vim"&gt;Vim Advent Calendar 2022&lt;/a&gt; 3日目の &lt;a href="https://qiita.com/delphinus/items/fb905e452b2de72f1a0f"&gt;爆速で起動する Neovim を作る&lt;/a&gt; に触発されて、「自分もEmacs版を書くぞ！」ということで書いていきます。&lt;/p&gt;
&lt;p&gt;なお、VimとEmacsの比較をし易くするためになるべく文章の構成を寄せて書くことをご了承ください。&lt;/p&gt;
&lt;h2 id="始めに"&gt;始めに&lt;/h2&gt;
&lt;p&gt;「Emacsを高速に起動する」ということに対して、多くのEmacsユーザーは興味がありません。
本来Emacsというのは常に起動し続けるものであり、必要に応じてEmacs Lispを適用し、テキストエディタをカスタマイズしていくものです。
現に「Emacs, 起動、 高速化」と検索すると、「4000msを1000msにした」のような秒単位での高速化の記事ばかりみつかります。&lt;/p&gt;
&lt;p&gt;もしあなたが設定を変えずに手軽に高速に起動したい場合は &lt;code&gt;emacs --daemon&lt;/code&gt; でdaemonを立ち上げ、 &lt;code&gt;emacsclient&lt;/code&gt; でつなぐようにすればよいでしょう。
私は他人のdotfilesを読むのが趣味なのですが、多くのEmacsユーザーは &lt;code&gt;EDITOR=emacsclient&lt;/code&gt; と設定しています。&lt;/p&gt;
&lt;p&gt;また、起動時間のみを考慮するなら &lt;code&gt;~/.emacs.d/init.el&lt;/code&gt; を削除して素で起動すればよいでしょう。
そうなると純粋にマシンスペックの勝負になります。
Emacsは素の状態でも十分魅力的な機能を多数盛り込まれているが、カスタマイズしてこそ真価を発揮するエディタなのでアプローチとしてはイマイチでしょう。&lt;/p&gt;
&lt;p&gt;この記事を読む前に &lt;a href="https://zenn.dev/zk_phi/books/cba129aacd4c1418ade4"&gt;Emacs の起動時間を&amp;quot;&amp;ldquo;詰める&amp;rdquo;&amp;quot;&lt;/a&gt; を熟読することを推奨しています。
特に次のChapterは非常に有益なテクニックが詰め込まれており、大幅な速度改善を見込めます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://zenn.dev/zk_phi/books/cba129aacd4c1418ade4/viewer/abb04ff2351b3564a1a0"&gt;autoload と with-eval-after-load&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://zenn.dev/zk_phi/books/cba129aacd4c1418ade4/viewer/c47f8eb7cd547b95ba91"&gt;擬似非同期ロードによる&amp;quot;待たされ感&amp;quot;改善&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://zenn.dev/zk_phi/books/cba129aacd4c1418ade4/viewer/dcebc13578d42055f8a4"&gt;その他のテクニック：不要な処理を省くハックたち&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;本のあらすじにも書いてあるとおり、Emacs自体にすでに大量のファイルがある状態で高速に起動する時点で自分の設定を見直さなければならないことは明白でしょう。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;しかし、考えてみれば Emacs には 1000 以上の Emacs Lisp ファイルが初めから同梱されているわけで、そこに数十のプラグインを足しただけで爆裂に遅くなるのは、なにか設定にも問題がある気がします。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;詳細は後述しますが、現在の私のEmacsは15〜25ms程度で起動をします。
一切設定を読まずに素で起動するコマンド &lt;code&gt;emacs -Q&lt;/code&gt; で起動させると2ms程度です。
まだまだ高速に起動させる余地はありますが、「高速に起動させることができている」と自負しても問題ないでしょう。&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-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Emacs booting time: 20 [msec] = ‘emacs-init-time’.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Loading init files: 10 [msec], of which 1 [msec] for ‘after-init-hook’.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="前提"&gt;前提&lt;/h2&gt;
&lt;h3 id="環境"&gt;環境&lt;/h3&gt;
&lt;p&gt;2022年12月現在、 &lt;code&gt;Macbook Pro 16-inch, 2019&lt;/code&gt; の標準モデルを使っています。&lt;/p&gt;</description></item><item><title>aws-sdk-php v3.245.0でBC breakをおこす</title><link>https://www.takeokunn.org/posts/fleeting/20221214165044-bc_break_aws_sdk_php_v3/</link><pubDate>Wed, 14 Dec 2022 09:00:00 +0900</pubDate><guid>https://www.takeokunn.org/posts/fleeting/20221214165044-bc_break_aws_sdk_php_v3/</guid><description>&lt;h2 id="結論"&gt;結論&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;aws-sdk-php&lt;/code&gt; の &lt;code&gt;v3.245.0&lt;/code&gt; で &lt;code&gt;AwcClient&lt;/code&gt; のconstructorの引数が変わった&lt;/li&gt;
&lt;li&gt;&lt;code&gt;SqsClient&lt;/code&gt; などの継承しているclassにも影響が出る&lt;/li&gt;
&lt;li&gt;Composer.jsonで &lt;code&gt;&amp;quot;aws/aws-sdk-php&amp;quot;: &amp;quot;^3.0&amp;quot;&lt;/code&gt; のように指定しているとversionが上がって事故る&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="現象"&gt;現象&lt;/h2&gt;
&lt;p&gt;2022年11月に &lt;code&gt;aws-sdk-php&lt;/code&gt; の &lt;code&gt;v3.245.0&lt;/code&gt; がリリースされた。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/aws/aws-sdk-php/releases/tag/3.245.0"&gt;https://github.com/aws/aws-sdk-php/releases/tag/3.245.0&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;リリース内容の中に&lt;a href="https://github.com/aws/aws-sdk-php/pull/2517"&gt;Feature bearer token #2517&lt;/a&gt;という変更があり、これによって &lt;code&gt;AwsClient&lt;/code&gt; の記述のし方が次のように変わる。&lt;/p&gt;
&lt;p&gt;before:&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-php" data-lang="php"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$client &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;AwsClient&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;version&amp;#39;&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;latest&amp;#39;&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;region&amp;#39;&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&amp;gt;&lt;/span&gt; $_ENV[&lt;span style="color:#e6db74"&gt;&amp;#39;AWS_REGION&amp;#39;&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;credientials&amp;#39;&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&amp;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;key&amp;#39;&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&amp;gt;&lt;/span&gt; $_ENV[&lt;span style="color:#e6db74"&gt;&amp;#39;AWS_ACCESS_KEY_ID&amp;#39;&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;secret&amp;#39;&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&amp;gt;&lt;/span&gt; $_ENV[&lt;span style="color:#e6db74"&gt;&amp;#39;AWS_SECRET_ACCESS_KEY&amp;#39;&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;token&amp;#39;&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&amp;gt;&lt;/span&gt; $_ENV[&lt;span style="color:#e6db74"&gt;&amp;#39;AWS_SESSION_TOKEN&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;]);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;after:&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-php" data-lang="php"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$client &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;AwsClient&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;version&amp;#39;&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;latest&amp;#39;&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;region&amp;#39;&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&amp;gt;&lt;/span&gt; $_ENV[&lt;span style="color:#e6db74"&gt;&amp;#39;AWS_REGION&amp;#39;&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;token&amp;#39;&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&amp;gt;&lt;/span&gt; $_ENV[&lt;span style="color:#e6db74"&gt;&amp;#39;AWS_SESSION_TOKEN&amp;#39;&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;credientials&amp;#39;&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&amp;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;key&amp;#39;&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&amp;gt;&lt;/span&gt; $_ENV[&lt;span style="color:#e6db74"&gt;&amp;#39;AWS_ACCESS_KEY_ID&amp;#39;&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;secret&amp;#39;&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&amp;gt;&lt;/span&gt; $_ENV[&lt;span style="color:#e6db74"&gt;&amp;#39;AWS_SECRET_ACCESS_KEY&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;]);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;AwsClient&lt;/code&gt; はいろいろなbase classとなっているので呼び出し方に注意が必要になってくる。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/aws/aws-sdk-php/search?q=%22extends&amp;#43;AwsClient%22"&gt;https://github.com/aws/aws-sdk-php/search?q=%22extends+AwsClient%22&lt;/a&gt;&lt;/p&gt;</description></item><item><title>fluent-bitに入門する</title><link>https://www.takeokunn.org/posts/permanent/20221207214034-about_fluent_bit/</link><pubDate>Wed, 07 Dec 2022 09:00:00 +0900</pubDate><guid>https://www.takeokunn.org/posts/permanent/20221207214034-about_fluent_bit/</guid><description>&lt;h2 id="始めに"&gt;始めに&lt;/h2&gt;
&lt;p&gt;複数のサーバを管理すればする程、loggingの重要性が高まります。
特に2022年はコンテナ最盛期と言っても過言ではないくらいコンテナ化が進んでいています。&lt;/p&gt;
&lt;p&gt;logを適切に扱うことができればできるほど、運用の質を上げることができます。&lt;/p&gt;
&lt;h2 id="fluent-bitとは"&gt;fluent-bitとは&lt;/h2&gt;
&lt;p&gt;fluent-bitは高速なlogging libraryです。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/fluent/fluent-bit"&gt;https://github.com/fluent/fluent-bit&lt;/a&gt;&lt;/p&gt;
&lt;figure&gt;&lt;img src="https://www.takeokunn.org/images/A53EA3D4-B9C5-4885-9E28-A36801B82581.png"&gt;
&lt;/figure&gt;
&lt;p&gt;FluentdはRuby実装で、fluent-bitはC実装です。
シングルバイナリで提供できるので、Dockerではfluent-bitの方を用いられることが多いです。&lt;/p&gt;
&lt;p&gt;fluent-bitと調べてもあまりまとまった情報がなく、非常にとっつきにくいので後学のためにまとめておく。&lt;/p&gt;
&lt;h2 id="環境構築"&gt;環境構築&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://www.takeokunn.org/posts/fleeting/20221207173426-run_fluent_bit_docker/"&gt;fluent-bitをDockerで動かす&lt;/a&gt; を参考に作るとよい。&lt;/p&gt;
&lt;h2 id="どうやって詳しくなっていけばよいか"&gt;どうやって詳しくなっていけばよいか&lt;/h2&gt;
&lt;p&gt;fluent-bitは &lt;code&gt;input&lt;/code&gt; &lt;code&gt;parser&lt;/code&gt; &lt;code&gt;filter&lt;/code&gt; &lt;code&gt;routing&lt;/code&gt; 部分を弄ることになる。&lt;/p&gt;
&lt;p&gt;それぞれ次のドキュメントに細かく書いてある。
&lt;a href="https://docs.fluentbit.io/manual/pipeline/pipeline-monitoring"&gt;https://docs.fluentbit.io/manual/pipeline/pipeline-monitoring&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;input値挟まざまな値を取ることができる。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://docs.fluentbit.io/manual/pipeline/inputs/dummy"&gt;https://docs.fluentbit.io/manual/pipeline/inputs/dummy&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;input値を変えてみたり、filterやoutput（routing）を変えながらどのように風に変化するか弄ってみるとよい。&lt;/p&gt;</description></item><item><title>fluent-bitをDockerで動かす</title><link>https://www.takeokunn.org/posts/fleeting/20221207173426-run_fluent_bit_docker/</link><pubDate>Wed, 07 Dec 2022 09:00:00 +0900</pubDate><guid>https://www.takeokunn.org/posts/fleeting/20221207173426-run_fluent_bit_docker/</guid><description>&lt;h2 id="プロジェクト構成"&gt;プロジェクト構成&lt;/h2&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-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ tree .
&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;├── Dockerfile
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;├── application.conf
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;└── docker-compose.yml
&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:#ae81ff"&gt;0&lt;/span&gt; directories, &lt;span style="color:#ae81ff"&gt;3&lt;/span&gt; files
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;Dockerfile&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-dockerfile" data-lang="dockerfile"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;FROM&lt;/span&gt; &lt;span style="color:#e6db74"&gt;public.ecr.aws/aws-observability/aws-for-fluent-bit:2.21.3&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;COPY&lt;/span&gt; application.conf /fluent-bit/etc/application.conf&lt;span style="color:#960050;background-color:#1e0010"&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;docker-compose.yml&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-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;version&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;3.8&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;services&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;fluentbit&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;build&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;command&lt;/span&gt;: [&lt;span style="color:#e6db74"&gt;&amp;#34;/fluent-bit/bin/fluent-bit&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;-c&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;/fluent-bit/etc/application.conf&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;volumes&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;./application.conf:/fluent-bit/etc/application.conf&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;application.conf&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-cfg" data-lang="cfg"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;[SERVICE]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;Flush 5&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;Log_Level info&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;[INPUT]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;Name dummy&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;Tag *-firelens-*&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;Dummy {&amp;#34;date&amp;#34;:&amp;#34;2022-01-23T03:10:33.317817Z&amp;#34;,&amp;#34;source&amp;#34;:&amp;#34;stdout&amp;#34;,&amp;#34;log&amp;#34;:&amp;#34;time:2022-01-23T03:10:33+00:00\tprotocol:HTTP/1.1\tstatus:200\tsize:1450\treqsize:150\treferer:-\tvhost:10.10.18.102\treqtime:0.176\tcache:-\truntime:-\t&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;[OUTPUT]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;Name stdout&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;Match *&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;&lt;code&gt;docker compose up&lt;/code&gt; を立ち上げると上記の &lt;code&gt;[INPUT]&lt;/code&gt; に記述したdummyのinputが出力される。&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-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ docker compose up
&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;fluent-bit-sandbox-fluentbit-1 | &lt;span style="color:#f92672"&gt;[&lt;/span&gt;0&lt;span style="color:#f92672"&gt;]&lt;/span&gt; *-firelens-*: &lt;span style="color:#f92672"&gt;[&lt;/span&gt;1668664184.902488203, &lt;span style="color:#f92672"&gt;{&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;date&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&amp;gt;&lt;span style="color:#e6db74"&gt;&amp;#34;2022-01-23T03:10:33.317817Z&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;source&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&amp;gt;&lt;span style="color:#e6db74"&gt;&amp;#34;stdout&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;log&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&amp;gt;&lt;span style="color:#e6db74"&gt;&amp;#34;time:2022-01-23T03:10:33+00:00 protocol:HTTP/1.1 status:200 size:1450 reqsize:150 referer:- vhost:10.10.18.102 reqtime:0.176 cache:- runtime:- &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;fluent-bit-sandbox-fluentbit-1 | &lt;span style="color:#f92672"&gt;[&lt;/span&gt;1&lt;span style="color:#f92672"&gt;]&lt;/span&gt; *-firelens-*: &lt;span style="color:#f92672"&gt;[&lt;/span&gt;1668664185.900364801, &lt;span style="color:#f92672"&gt;{&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;date&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&amp;gt;&lt;span style="color:#e6db74"&gt;&amp;#34;2022-01-23T03:10:33.317817Z&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;source&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&amp;gt;&lt;span style="color:#e6db74"&gt;&amp;#34;stdout&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;log&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&amp;gt;&lt;span style="color:#e6db74"&gt;&amp;#34;time:2022-01-23T03:10:33+00:00 protocol:HTTP/1.1 status:200 size:1450 reqsize:150 referer:- vhost:10.10.18.102 reqtime:0.176 cache:- runtime:- &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;fluent-bit-sandbox-fluentbit-1 | &lt;span style="color:#f92672"&gt;[&lt;/span&gt;2&lt;span style="color:#f92672"&gt;]&lt;/span&gt; *-firelens-*: &lt;span style="color:#f92672"&gt;[&lt;/span&gt;1668664186.900453923, &lt;span style="color:#f92672"&gt;{&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;date&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&amp;gt;&lt;span style="color:#e6db74"&gt;&amp;#34;2022-01-23T03:10:33.317817Z&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;source&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&amp;gt;&lt;span style="color:#e6db74"&gt;&amp;#34;stdout&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;log&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&amp;gt;&lt;span style="color:#e6db74"&gt;&amp;#34;time:2022-01-23T03:10:33+00:00 protocol:HTTP/1.1 status:200 size:1450 reqsize:150 referer:- vhost:10.10.18.102 reqtime:0.176 cache:- runtime:- &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;fluent-bit-sandbox-fluentbit-1 | &lt;span style="color:#f92672"&gt;[&lt;/span&gt;3&lt;span style="color:#f92672"&gt;]&lt;/span&gt; *-firelens-*: &lt;span style="color:#f92672"&gt;[&lt;/span&gt;1668664187.900391678, &lt;span style="color:#f92672"&gt;{&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;date&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&amp;gt;&lt;span style="color:#e6db74"&gt;&amp;#34;2022-01-23T03:10:33.317817Z&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;source&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&amp;gt;&lt;span style="color:#e6db74"&gt;&amp;#34;stdout&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;log&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&amp;gt;&lt;span style="color:#e6db74"&gt;&amp;#34;time:2022-01-23T03:10:33+00:00 protocol:HTTP/1.1 status:200 size:1450 reqsize:150 referer:- vhost:10.10.18.102 reqtime:0.176 cache:- runtime:- &amp;#34;&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;h2 id="解説"&gt;解説&lt;/h2&gt;
&lt;p&gt;特に何も指定せずに &lt;code&gt;docker compose up&lt;/code&gt; をすると &lt;code&gt;/fluent-bit/bin/fluent-bit -c /fluent-bit/etc/fluent-bit.conf&lt;/code&gt; で起動をしている。&lt;/p&gt;</description></item><item><title>2021年に自分がemacs.dのカスタイマイズしたことについて</title><link>https://www.takeokunn.org/posts/permanent/20211203151122-configure_emacs_in_2021/</link><pubDate>Fri, 03 Dec 2021 09:00:00 +0900</pubDate><guid>https://www.takeokunn.org/posts/permanent/20211203151122-configure_emacs_in_2021/</guid><description>&lt;p&gt;&lt;a href="https://qiita.com/advent-calendar/2021/emacs"&gt;Emacs Advent Calendar 2021&lt;/a&gt; 5日目の記事。&lt;/p&gt;
&lt;p&gt;今年も&lt;a href="https://github.com/takeokunn/.emacs.d"&gt;takeokunn/.emacs.d&lt;/a&gt; をかなり改造した。 &lt;code&gt;git log --reverse&lt;/code&gt; してみるとfirst commitが &lt;code&gt;Sat Nov 3 18:15:51 2018 +0900&lt;/code&gt; のようなので3年使っているようだ。&lt;/p&gt;
&lt;p&gt;最初と比べて圧倒的に快適になってはいるものの、分からないことが増えていく一方だ。
とはいえ使っていくうちに理解が深まっていくのも事実。
ざっくりやったことについてまとめていく（去年やったことも含まれているが御愛嬌）&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;emacs28にしてlibgccjitを動かした
&lt;ul&gt;
&lt;li&gt;defaultのcompilerをllvmからgccに変えるとスマートフォンアプリケーション開発やら別の開発に影響が出るので動かしただけ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;use-packageからleafへの移行した
&lt;ul&gt;
&lt;li&gt;caskを消した&lt;/li&gt;
&lt;li&gt;遅延ロードになったおかげで起動が高速になった&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;orgでinit.elを生成するようにした
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/takeokunn/.emacs.d/blob/master/Makefile"&gt;Makefile&lt;/a&gt; 参照&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;GitHub Pagesで見られるようにした
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://takeokunn.github.io/.emacs.d/"&gt;https://takeokunn.github.io/.emacs.d/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;byte-compileをできる限りでするようにした
&lt;ul&gt;
&lt;li&gt;多少のwarningは無視している&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ddskkを実用レベルでちゃんと使えるようにした
&lt;ul&gt;
&lt;li&gt;ddskkの設定は&lt;a href="https://github.com/takeokunn/dotfiles/blob/master/modules/skk/dot.skk"&gt;dotfiles&lt;/a&gt;で管理している&lt;/li&gt;
&lt;li&gt;AZIKを完全に理解した&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;company周りの設定が増えた&lt;/li&gt;
&lt;li&gt;wanderlustで自分のGmailを操作できるようにした
&lt;ul&gt;
&lt;li&gt;しただけでちゃんと運用できているわけではない&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;elfeedを充実させた
&lt;ul&gt;
&lt;li&gt;しただけでちゃんと運用できているわけではない&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;magitを使いこなせるようになった
&lt;ul&gt;
&lt;li&gt;magit-forgeでGitHubにPull Requestを投げられるようにした&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;dap-modeを使えるようになった
&lt;ul&gt;
&lt;li&gt;なっただけ&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;yasnippetの設定が増えた
&lt;ul&gt;
&lt;li&gt;snippetをorgで管理するようにした
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/takeokunn/.emacs.d/blob/master/yasnippets.org"&gt;https://github.com/takeokunn/.emacs.d/blob/master/yasnippets.org&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;snippet自体も増えた&lt;/li&gt;
&lt;li&gt;ivy-yasnippetで検索できるようにしている&lt;/li&gt;
&lt;li&gt;ついでに&lt;a href="https://github.com/AndreaCrotti/yasnippet-snippets"&gt;AndreaCrotti/yasnippet-snippets&lt;/a&gt;にPull Requestを投げたが音沙汰がない
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/AndreaCrotti/yasnippet-snippets/pull/434"&gt;https://github.com/AndreaCrotti/yasnippet-snippets/pull/434&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/AndreaCrotti/yasnippet-snippets/pull/433"&gt;https://github.com/AndreaCrotti/yasnippet-snippets/pull/433&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;tab-modeを使えるようになった
&lt;ul&gt;
&lt;li&gt;が、実用性あるのか&amp;hellip;.?っていなっている&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;fish scriptの開発環境が整った
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/takeokunn/fish-repl.el"&gt;takeokunn/fish-repl.el&lt;/a&gt;を作った&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/takeokunn/ob-fish"&gt;takeokunn/ob-fish&lt;/a&gt; を作った&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;org-modeの設定が増えた
&lt;ul&gt;
&lt;li&gt;日常的なメモはorgで書くようになった&lt;/li&gt;
&lt;li&gt;org-Babelを使いこなせるようになった&lt;/li&gt;
&lt;li&gt;工数管理とか細かい使い方がいまだに分らない&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;英語の執筆環境が整った
&lt;ul&gt;
&lt;li&gt;flycheckとtextlintをちゃんと設定した&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;言語ごとの開発環境を整えた
&lt;ul&gt;
&lt;li&gt;php, golang, solidity etc&amp;hellip;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;TypeScript reactはtreesitterとlspでなんとかするのが最適だと分かった&lt;/li&gt;
&lt;li&gt;&lt;code&gt;M-x&lt;/code&gt; の候補だがsmexからamxに変えたら欲しい候補が出るようになった&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ざくっと思い出せるのはこれくらいなのでまた何かあれば追記をしていくつもり。
来年はorg-modeを使いこなせるようになりたいなぁ。&lt;/p&gt;</description></item><item><title>TwitterUIDの挙動とJavaScriptのBigIntについて</title><link>https://www.takeokunn.org/posts/permanent/20201028052323-twitter_uid_javascript_bigint/</link><pubDate>Wed, 28 Oct 2020 09:00:00 +0900</pubDate><guid>https://www.takeokunn.org/posts/permanent/20201028052323-twitter_uid_javascript_bigint/</guid><description>&lt;p&gt;TwitterのUIDについて調べてたら、自分の浮動小数点の挙動についての理解度が低かったので調べたことについてまとめておく。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;ことの発端は、spreadsheet上の人力で管理されているTwitterのユーザー情報をデータベースに入れる作業をしていた時だった。&lt;/p&gt;
&lt;p&gt;以前同じような作業をしたとき結構漏れがあったので、Twitter UIDの妥当性やscreen nameが本当に存在するかどうかを確認する必要があった。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://idtwi.com/"&gt;TwitterのIDチェッカー&lt;/a&gt;などのWebサイトを利用してもよかったが、100件を超える量のデータを手動で確認取るのは面倒だったため、次のような検証scriptを雑に書いた。&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-shell" data-lang="shell"&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 style="color:#75715e"&gt;&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;while&lt;/span&gt; read row; &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; TWITTER_ID&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;${&lt;/span&gt;row&lt;span style="color:#e6db74"&gt;}&lt;/span&gt; | cut -d , -f 1&lt;span style="color:#e6db74"&gt;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; TWITTER_UID&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;${&lt;/span&gt;row&lt;span style="color:#e6db74"&gt;}&lt;/span&gt; | cut -d , -f 2&lt;span style="color:#e6db74"&gt;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; TWITTER_REQUEST_UID&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;`&lt;/span&gt;curl -X GET -H &lt;span style="color:#e6db74"&gt;&amp;#34;Authorization: Bearer &amp;lt;TWITTER_TOKEN&amp;gt;&amp;#34;&lt;/span&gt; -s &lt;span style="color:#e6db74"&gt;&amp;#34;https://api.twitter.com/1.1/users/show.json?screen_name=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;TWITTER_ID&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt; | jq &lt;span style="color:#e6db74"&gt;&amp;#34;.id&amp;#34;&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;if&lt;/span&gt; &lt;span style="color:#f92672"&gt;[&lt;/span&gt; &lt;span style="color:#e6db74"&gt;${&lt;/span&gt;TWITTER_REQUEST_UID&lt;span style="color:#e6db74"&gt;}&lt;/span&gt; -ne &lt;span style="color:#e6db74"&gt;${&lt;/span&gt;TWITTER_UID&lt;span style="color:#e6db74"&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; echo &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;TWITTER_ID&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;TWITTER_UID&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;TWITTER_REQUEST_UID&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 style="color:#66d9ef"&gt;done&lt;/span&gt; &amp;lt; ~/Desktop/twitter.csv
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;そうしたら半分くらいのTwitter UIDがずれてしまった。明らかにおかしいと思ったので、きちんと調査することにした。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Twitter Developer Documentに &lt;code&gt;Twitter IDs&lt;/code&gt; という記事がある。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://developer.twitter.com/en/docs/twitter-ids"&gt;https://developer.twitter.com/en/docs/twitter-ids&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;次のようなことが書かれていた。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ユーザーの増加によりTwitterのUIDは64bit&lt;/li&gt;
&lt;li&gt;unsignedでuniqueな値として管理されている&lt;/li&gt;
&lt;li&gt;JavaScriptの整数のサイズは53bitに制限されている&lt;/li&gt;
&lt;li&gt;api responseでは整数(&lt;code&gt;id&lt;/code&gt;)と文字列(&lt;code&gt;id_str&lt;/code&gt;)の両方を返すような実装になっている&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ここから分かるのは、自分は↑のshell scriptで &lt;code&gt;id&lt;/code&gt; を見ていたから正しい値をとれていなかった、&lt;del&gt;id_str&lt;/del&gt; を使うべきだったことが分かる。&lt;/p&gt;
&lt;p&gt;たしかに、次のように &lt;code&gt;toString()&lt;/code&gt; をしたらずれることについて確認がとれたがどうしてだろうか。
また、今回はbash scriptを書いたのにJavaScriptと同じ挙動をするのはどうしてなのか調べる必要がある。&lt;/p&gt;</description></item><item><title>MacBookProの生前整理をする</title><link>https://www.takeokunn.org/posts/permanent/20201003000022-pc_cleaninng_before_out_of_order/</link><pubDate>Sat, 03 Oct 2020 09:00:00 +0900</pubDate><guid>https://www.takeokunn.org/posts/permanent/20201003000022-pc_cleaninng_before_out_of_order/</guid><description>&lt;h2 id="不要な情報の削除"&gt;不要な情報の削除&lt;/h2&gt;
&lt;p&gt;まずは整理整頓の基本である不要なモノを捨てるところから。次のような手順を踖んだら容量カツカツ状態から62GB開けることができた。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://hnw.hatenablog.com/entry/20131117"&gt;hardlink.pyを使ったらディスクの空き容量が劇的に増えた&lt;/a&gt; こういうのもあるが今回は使わない。&lt;/p&gt;
&lt;h3 id="不要repoの削除"&gt;不要repoの削除&lt;/h3&gt;
&lt;p&gt;僕はすべてのソースコードをghqで管理している。snippet的なコードは適当なファイルやディレクトリを作って書き、終わったらブログにまとめてから削除するという運用をとっている。&lt;/p&gt;
&lt;p&gt;気になるrepoはすぐにghq getでcloneして容量を食いまくっていたので、次のscriptでガンガン削除していった。&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-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ ls ~/.ghq/github.com | peco | xargs rm -fr
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ ghq list --full-path | peco | xargs -L1 rm -fr
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="不要なbrew-packageの削除"&gt;不要なbrew packageの削除&lt;/h3&gt;
&lt;p&gt;勢いでbrew installしたpackageなどが相当あったのでいらないものは削除していった。&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-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ brew list | peco | xargs brew uninstall
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="不要なnpm-go-gem-packageの削除"&gt;不要なnpm/go/gem packageの削除&lt;/h3&gt;
&lt;p&gt;普段 &lt;code&gt;npm i -g xxx&lt;/code&gt; や &lt;code&gt;go get -u xxx&lt;/code&gt; や &lt;code&gt;gem install xxx&lt;/code&gt; などで気軽にpackageをいれてたので削除していった。&lt;/p&gt;
&lt;h3 id="chromeのcacheやextensionの削除"&gt;chromeのcacheやextensionの削除&lt;/h3&gt;
&lt;p&gt;意外と大事。新しい環境でも同じ体験ができるように一度消してみるのもよいだろう。&lt;/p&gt;
&lt;p&gt;bookmarkなどは一切使わなく、url barに直接入力する運用をとっているので削除した直後は不便にはなるが、何が必要なのか分かるのでそれはそれでよい（パスワード周りとか特にそう）&lt;/p&gt;
&lt;h3 id="docker関係の整理"&gt;Docker関係の整理&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://qiita.com/ksato9700/items/b0075dc54dfffc64b999"&gt;Dockerのあれこれを断捨離する&lt;/a&gt; この記事がすごい良かった。Dockerは再現性のある環境なはずなので一度すべてを消してもよいだろう。&lt;/p&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-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ docker ps -q | xargs docker rm -f
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ docker images -q | xargs docker rmi -q
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ docker system prune
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ docker image prune
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ docker container prune
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ docker volume prune
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="不要なdesktop-applicationの削除"&gt;不要なDesktop Applicationの削除&lt;/h3&gt;
&lt;p&gt;入れたはよいけど使わなかったものは多いだろう。必要ならまたinstallすればよいのでいったん消すというのもあり。VSCodeなどを削除した。&lt;/p&gt;</description></item><item><title>新人教育をしていて一番大事なのは「試行回数」だと思った</title><link>https://www.takeokunn.org/posts/permanent/20201003015736-most_important_thing_number_of_trials_for_newbie/</link><pubDate>Sat, 03 Oct 2020 09:00:00 +0900</pubDate><guid>https://www.takeokunn.org/posts/permanent/20201003015736-most_important_thing_number_of_trials_for_newbie/</guid><description>&lt;p&gt;3ヵ月~半年くらいで普通の社員と遜色ない人もいる。数年やっても向いてないんじゃないかというくらいできない人もいる。少しずつ着実に成長している人もいる。&lt;/p&gt;
&lt;p&gt;新人教育を1〜2年10人くらいやっているのだが、いったい何が違うんだろうとずっと思い続けてきて、ようやく自分なりにまとまってきたので書いておく。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="前提"&gt;前提&lt;/h2&gt;
&lt;p&gt;新人とはプログラミング経験年数2年以下くらいのWebエンジニアの初心者を想定している（自称初心者ではない）&lt;/p&gt;
&lt;p&gt;今勤めている会社では大学生インターンや未経験のような新人を積極的にとってきた。自分はお節介を焼くのが趣味であり、勝手に教えてたら（知識をひけらかしてたら）思ったよりも成長してくれる人が何人かいたし、逆もまた然り。&lt;/p&gt;
&lt;p&gt;最近はAWS業務やrailsを書きつつ新人の育成が仕事になっている。&lt;/p&gt;
&lt;p&gt;僕自身は所々で教えてくれる人はいたものの、ちゃんと「教育」をされたことがないのでよくわらないし、コーチング技術なんてものはわからないし、脳筋なのでフィーリングで書いていく（大学は情報科いたけど中退しちゃったので専門的なことはわからん）&lt;/p&gt;
&lt;h2 id="新人教育はなんでやるの"&gt;新人教育はなんでやるの？&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://portalshit.net/2018/10/02/we-should-hire-junior-engineers"&gt;ジュニアを採用しない連中はシニアに値しない&lt;/a&gt;という記事にまとまっている。&lt;/p&gt;
&lt;p&gt;エンジニア人口が増えることは人手不足のIT業界にとってよい影響を与え、またOSSにも貢献できるだろう（利用することも貢献の一種）。&lt;/p&gt;
&lt;p&gt;幸いなことに、今の会社はそれなりにちゃんとしたエンジニア組織があり育成環境もあるのでちゃんと育成すればワークする。
母数の少ないシニアエンジニアを採用をするのは難しいので、育成するという選択を取るというのもそれはそれで正しい判断だろう。&lt;/p&gt;
&lt;p&gt;個人的には、自分の仕事を &lt;del&gt;押し付けられる&lt;/del&gt; できる人材が増えると自分の時間が空くので、別の技術に時間を投資できるようになると思っている。&lt;/p&gt;
&lt;h2 id="一番大事なのは試行回数"&gt;一番大事なのは試行回数&lt;/h2&gt;
&lt;p&gt;どの分野でもそうなのだが、結局の所「試行回数を増やせば増やすほど成長をする」ので「試行回数を最大化する」ように取り組むことこそ最善だろう。&lt;/p&gt;
&lt;p&gt;試行回数に関して明確に定義はできないが、「目の前の問題を解決した回数」や「言語やライブラリの仕様を理解すべく取り組んだ回数」などを想定している。
「Rubyの四則演算を学ぶ」のと「Rubyのcompilerの実装を読む」のようなレベル差があるものを同等に扱うべきではないが、いったん無視する。&lt;/p&gt;
&lt;p&gt;急速に成長する人は上手に試行回数を増やす方法を知っており、それを忠実に実践できる。そうではない人この限りではない。&lt;/p&gt;
&lt;p&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;shellやエディタをカスタマイズし効率的に検証できるようにする&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;PCの画面を広く使う&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="新人にはざっくり4タイプくらいに分けられる"&gt;新人にはざっくり4タイプくらいに分けられる&lt;/h2&gt;
&lt;p&gt;なんとなく自分の中で4タイプに分けて、それぞれに合った方法で教える。&lt;/p&gt;
&lt;h3 id="別分野ですでに一定の技量があるタイプ"&gt;別分野ですでに一定の技量があるタイプ&lt;/h3&gt;
&lt;p&gt;すでに別分野でスキルの身につけ方を知っていて、Webプログラミングにも応用できるような人。&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;/p&gt;
&lt;p&gt;高負荷に耐えられるので仕事を大量にこなせるし、Twitterや社内の技術的な情報のキャッチアップも難なくこなせる。&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;/p&gt;
&lt;p&gt;Twitterにはプログラミングの休憩がてらコード書く狂人だらけだけど、real worldでは普通のタイプが一番多い。&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;/p&gt;
&lt;p&gt;しょうがない、向いてないのはしょうがないので本人の希望によるけど向いていないものはしょうがない。&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;個人的には上記のとおり、「試行回数を最大化するための取り組みを自分で考えて実行してほしい」と思っている。
ツールにこだわるのも1つの方法だし、業務でタスクをこなすのも大事。&lt;/p&gt;
&lt;p&gt;「先輩に聞くのは申し訳ないかな。..?」と考える必要はまったくなく、それが必要なら躊躇するべきではない。&lt;/p&gt;
&lt;p&gt;多くのエンジニアは3年くらいで転職するので、きちんと職務経歴書に書くことがある状態にしてほしい。
いつでも転職できるくらい選択肢をもている状態にしてあげたい。&lt;/p&gt;
&lt;h2 id="普段自分が教える時に試していること"&gt;普段自分が教える時に試していること&lt;/h2&gt;
&lt;p&gt;まずは何にせよ信頼関係を築くことから始まる。これほど大事なものはない。
どんなに技術的に正しいこと、成長に必要なことを熱弁しても信頼関係がなければ何も始まらない。
なので雑談をしたり、食事に行ったりして兎に角仲良くなることが大事だ。&lt;/p&gt;
&lt;p&gt;自分が1人に教えられるのは精々週に2時間くらいで、それ以外は基本的に本人が頑張る時間だ。
問題を取り組む時障害になる部分をなるべく排除するべく、まずは次のようなことをやっている。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;fish shellなどの便利ツールを入れる&lt;/li&gt;
&lt;li&gt;dotfilesを作らせる&lt;/li&gt;
&lt;li&gt;便利なショートカットキーを教える&lt;/li&gt;
&lt;li&gt;よい記事にたどり着けるような検索wordの作り方を教える&lt;/li&gt;
&lt;li&gt;slackのfeedのチャンネルを教えるたり、お勧めのブログを教える&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;慣れてきたら次のことを意識して指摘している。&lt;/p&gt;</description></item><item><title>半年間毎週dependabotをmergeしたので知見を纏める</title><link>https://www.takeokunn.org/posts/permanent/20200909061755-knowledge_dependabot_merge/</link><pubDate>Wed, 09 Sep 2020 09:00:00 +0900</pubDate><guid>https://www.takeokunn.org/posts/permanent/20200909061755-knowledge_dependabot_merge/</guid><description>&lt;p&gt;Railsプロジェクトのdependabotをひたすら毎週月曜日の11時にmergeし続けて半年以上たったのでそろそろ知見をまとめておく。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="始めに"&gt;始めに&lt;/h2&gt;
&lt;p&gt;世の中のライブラリには大きく分けて3種類ある。&lt;/p&gt;
&lt;p&gt;フレームワークと開発支援ツールと通常のライブラリだ。&lt;/p&gt;
&lt;p&gt;基本的に全部のdependabotの生成したPull Requestに関して、CHANGE LOGとコードレベルのdiffを読むようにした。
CHANGE LOGだけでも良かったのだが、多くのOSSのライブラリのversion upはどのような場合に起こるのかなど傾向をつかむためだ。&lt;/p&gt;
&lt;h2 id="diffの読み方"&gt;diffの読み方&lt;/h2&gt;
&lt;p&gt;変更頻度の高かった順（takeokunn調べ）に並べるとこんなかんじ。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;テストの追加&lt;/li&gt;
&lt;li&gt;CI関連の記述の追加&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;p&gt;最近だとblacklistが駄目だとかその辺の変更がめちゃくちゃ多かった印象。&lt;/p&gt;
&lt;p&gt;事故るとしたら「命名の修正」と「関数の分離や引数の整理」の部分だけなのでそれ以外は読み飛ばしても基本的には大丈夫だ。&lt;/p&gt;
&lt;h2 id="フレームワークの場合"&gt;フレームワークの場合&lt;/h2&gt;
&lt;p&gt;railsやlaravelなど。&lt;/p&gt;
&lt;p&gt;必ずRELEASE NOTEを読んで注意深くあげるようにする。&lt;/p&gt;
&lt;p&gt;マイナーバージョンアップの場合（ver5.1.1→ver5.1.2）はそこまで神経質にならなくてもよい。&lt;/p&gt;
&lt;p&gt;メジャーバージョンアップの場合（ver5.2→ver6.0）はテストを充実させる、ステージング環境での十分な検証が必要だ。それでも細かいバグがでるので本当に神経質に確認を取る必要がある。&lt;/p&gt;
&lt;p&gt;こういう時にphpstanなどの静的解析でぱぱっと検証できるのが理想。Railsにはそういうのがないからつらい。&lt;/p&gt;
&lt;h2 id="通常のライブラリの場合"&gt;通常のライブラリの場合&lt;/h2&gt;
&lt;p&gt;FaradayやらDeviseなど。&lt;/p&gt;
&lt;p&gt;CHANGE LOGをみてBreaking Changeがなければmergeしちゃってよい。&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;rubocopやらeslintなど。&lt;/p&gt;
&lt;p&gt;基本的にノールックマージしてよい。事故ってもCIが落ちるだけなので別にオッケー。&lt;/p&gt;
&lt;p&gt;rubocopはよくconfigの書式がかわったりするのでなるべく頻度高く上げておかないとあとあとしんどくなる。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="終わりに"&gt;終わりに&lt;/h2&gt;
&lt;p&gt;当たり前のことしか書いてないが、当たり前のことを当たり前にやろう（自戒）&lt;/p&gt;
&lt;p&gt;バージョンを一気にあげるのは本当にきついので普段から上げることをサボらないようにしないとしんどい（しんどい）。&lt;/p&gt;
&lt;p&gt;どのプロジェクトにも必ずdependabotはいれたいなーと思5つ、CIを圧迫するのだけはなんだかなぁと。&lt;/p&gt;</description></item><item><title>RedashのQuery一覧を保存する方法</title><link>https://www.takeokunn.org/posts/permanent/20200511164322-redash_save_query_list/</link><pubDate>Mon, 11 May 2020 09:00:00 +0900</pubDate><guid>https://www.takeokunn.org/posts/permanent/20200511164322-redash_save_query_list/</guid><description>&lt;p&gt;仕事でRedashの情報を保存したいという要望があった。&lt;/p&gt;
&lt;p&gt;AMIをとるのは大げさだよなぁと思ったのでqueryの一覧を取得する方法について調べてみた。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;とりあえず世の中に同じようなことを考えている人がいないかを調べてみた。&lt;/p&gt;
&lt;p&gt;&lt;a href="http://ariarijp.hatenablog.com/entry/redash-query-backup-with-redashman"&gt;redashmanを使ってRedashのクエリをお手軽にバックアップする&lt;/a&gt;という記事があった。&lt;a href="https://github.com/ariarijp/redashman"&gt;ariarijp/redashman&lt;/a&gt;というgolang自作ツールを介してRedashAPIを叩いているようだ。&lt;/p&gt;
&lt;p&gt;Redash APIのドキュメントはこれだ。&lt;a href="https://redash.io/help/user-guide/integrations-and-api/api"&gt;Integrations and API&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;queryのCRUDとdashboardのCRUDが用意されている。api tokenを発行してそれを使えば楽に操作ができるようだ。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/ariarijp/redashman"&gt;ariarijp/redashman&lt;/a&gt;はすごく良さそうなのだが、自分が欲しいのはqueryの一覧であって豪華なAPI Clientではない。&lt;/p&gt;
&lt;p&gt;Golangを入れることすら面倒くさいのだ。&lt;/p&gt;
&lt;p&gt;今回の用途では雑にcurlで取得できればよかったので次のように投げた。
あとは必要なフォーマットに合わせてよしなにjqを使えばよい。&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-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ curl &lt;span style="color:#e6db74"&gt;&amp;#34;https://&amp;lt;redash url&amp;gt;/api/queries&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:#ae81ff"&gt;&lt;/span&gt; -H &lt;span style="color:#e6db74"&gt;&amp;#34;Accept: application/json&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:#ae81ff"&gt;&lt;/span&gt; -H &lt;span style="color:#e6db74"&gt;&amp;#34;Authorization: Key &amp;lt;auth key&amp;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:#ae81ff"&gt;&lt;/span&gt; | jq &lt;span style="color:#e6db74"&gt;&amp;#34;.results&amp;#34;&lt;/span&gt; | jq &lt;span style="color:#e6db74"&gt;&amp;#34;map({ id, name, query })&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;responseはこんな感じ。きれいに出せた。&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-json" data-lang="json"&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:#f92672"&gt;&amp;#34;id&amp;#34;&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;13&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;#34;name&amp;#34;&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 style="color:#f92672"&gt;&amp;#34;query&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;select * from users;&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:#f92672"&gt;&amp;#34;id&amp;#34;&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;12&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;#34;name&amp;#34;&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 style="color:#f92672"&gt;&amp;#34;query&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;select * from users where id = 1;&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>エンジニア採用面接で考えていること</title><link>https://www.takeokunn.org/posts/permanent/20200202015651-thinking_about_recruit_interview/</link><pubDate>Sun, 02 Feb 2020 09:00:00 +0900</pubDate><guid>https://www.takeokunn.org/posts/permanent/20200202015651-thinking_about_recruit_interview/</guid><description>&lt;p&gt;これはポエムです。&lt;/p&gt;
&lt;p&gt;個人的意見だし、エンジニアの採用面接専門で雇われているわけじゃないので詳しいことやベストプラクティスはわからないです。会社の方針と違う部分もあるし。&lt;/p&gt;
&lt;p&gt;2020年2月時点でカジュアル面接/1次面接のときに僕がやっていることについて書いていく。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="基本方針"&gt;基本方針&lt;/h2&gt;
&lt;p&gt;大事なのは次の4点な気がしている。&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;/ul&gt;
&lt;p&gt;これらを知るためにいろいろな質問をしていく。&lt;/p&gt;
&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;/li&gt;
&lt;li&gt;SNS（GitHub/Twitter/YouTube/note/instagram/facebook/wantedly/connpass等） を探す&lt;/li&gt;
&lt;li&gt;GitHubに公開しているコードを読む&lt;/li&gt;
&lt;li&gt;Qiitaや技術ブログを読む&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;GitHubや技術記事を公開していないと事前情報がまったくなく判断しづらい。&lt;/p&gt;
&lt;p&gt;Fish Shellに次のようなfunctionを作って一気にrepoをcloneできるようにしている。&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-fish" data-lang="fish"&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;ghq_all&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;curl&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;https://api.github.com/users/&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;(&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;echo&lt;/span&gt; $argv&lt;span style="color:#f92672"&gt;)&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;/repos&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;|&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;jq&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;-r&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;.[].clone_url&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;|&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;xargs&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;-L1&lt;/span&gt; ghq get
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;技術ブログやサイトをホスティングしている際は、whoisを読んだり、digったり、DOMを読んだりNetworkを読んでどのように配信しているのかを見る。
WordPressだったら &lt;code&gt;/wp-admin&lt;/code&gt; &lt;code&gt;/readme.html&lt;/code&gt; がたたけるかどうかなど、セキュリティ意識できているかも見る。&lt;/p&gt;
&lt;h3 id="当日面接"&gt;当日面接&lt;/h3&gt;
&lt;p&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;/ul&gt;
&lt;p&gt;事前情報を元に↑の内容を話す。&lt;/p&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;現職(前職)どんな仕事をしているのか&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;業務のどの部分を担当していて、そこで使われている技術は何か、どのような工夫をしているのかなどを明瞭に話せるかどうかを知りたい。&lt;/p&gt;
&lt;p&gt;普通に開発しているだけよりも、&lt;a href="https://www.takeokunn.org/posts/permanent/20190930175912-thinking_about_developer_experience/"&gt;開発体験向上について考えてること&lt;/a&gt; を行っている方がよい。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://nazo.hatenablog.com/entry/yarikiru"&gt;職業Webエンジニアにおける「実績」と「やりきる力」&lt;/a&gt;によいこと書いてある。定期的に読み直している。&lt;/p&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;好きな(得意)技術は何か&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;「Rubyに自信がある」と書いてあったら、それは「Rubyの言語自体に自身がある」のか「RailsのFW自体に自身がある」のか、「Railsを使うの自信がある」のかを正確に知りたい。&lt;/p&gt;
&lt;p&gt;用語を正確に使えているのかどうかと、それに対しての知識がどのくらい深いかどうかと、そのことに対してどのくらい自覚があるのかを見る。&lt;/p&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;直近楽しかった開発は何か、どうやったのか&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;技術が純粋に好きか、楽しく開発しているということは技術的チャレンジをしている可能性が高いのでなるべく聞くようにしている。&lt;/p&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;今後どういう風になりたいのか、それに向けてどういう努力をしているのか&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;「勉強中です」っていうのは情報量0ですので、「何の勉強をしていて、どのようなロードマップがあって、今どこなのか」みたいな話をしてもらえると理解しやすい。&lt;/p&gt;
&lt;h3 id="面接振り返り"&gt;面接振り返り&lt;/h3&gt;
&lt;ul&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;1回の面接に結構エネルギーを使うけど、いろんな人いるんだなぁっていうのがわかって結構楽しい。&lt;/p&gt;
&lt;p&gt;あと落ちたからといって、必ずしもスキルが足りないとかいうわけでもなく、枠がなかっただけの場合もあるのでいちいち落ち込む必要ないんだなぁってのがわかってよかったです。&lt;/p&gt;</description></item><item><title>開発体験向上について考えてること</title><link>https://www.takeokunn.org/posts/permanent/20190930175912-thinking_about_developer_experience/</link><pubDate>Mon, 30 Sep 2019 09:00:00 +0900</pubDate><guid>https://www.takeokunn.org/posts/permanent/20190930175912-thinking_about_developer_experience/</guid><description>&lt;p&gt;会社での仕事の大半はDX向上な気がしているので、普段やっていることについてまとめていく。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;a href="https://gfx.hatenablog.com/entry/2018/06/28/100103"&gt;DX: Developer Experience （開発体験）は重要だ&lt;/a&gt; にDX向上のメリットについて書いてあるのだが、具体的な作業は何かについて書いていないので自分なりのやり方を書いていく。&lt;/p&gt;
&lt;p&gt;最近ずっとRailsばっかだったので、Railsプロジェクトをイメージして書く。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;環境構築をなるべくDockerできるようにする&lt;/li&gt;
&lt;li&gt;再現性の高い環境構築手順を作成する&lt;/li&gt;
&lt;li&gt;Editorconfigを入れる&lt;/li&gt;
&lt;li&gt;インフラ構成を整理する&lt;/li&gt;
&lt;li&gt;安全にDeployできるようなしくみを作る&lt;/li&gt;
&lt;li&gt;CircleCIなどCIサービスを入れる&lt;/li&gt;
&lt;li&gt;GitFlowを入れる&lt;/li&gt;
&lt;li&gt;明らかに使っていないファイルを削除する&lt;/li&gt;
&lt;li&gt;使用している外部サービスを洗い出しておく&lt;/li&gt;
&lt;li&gt;ソースコードに埋め込まれている鍵をenvに移す&lt;/li&gt;
&lt;li&gt;&lt;a href="https://sentry.io/welcome/"&gt;Sentry&lt;/a&gt; などエラーを検知できるしくみを導入する&lt;/li&gt;
&lt;li&gt;Linterを入れて変更を少なく定期的に修正していく&lt;/li&gt;
&lt;li&gt;RSpecのようなテストツールを入れる&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dependabot.com/"&gt;dependabot&lt;/a&gt; を入れる&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pullpanda.com/"&gt;pull panda&lt;/a&gt;を入れる&lt;/li&gt;
&lt;li&gt;静的解析ツール（Phanなど）を入れる&lt;/li&gt;
&lt;li&gt;NewRelicなどの監視ツールを入れる&lt;/li&gt;
&lt;li&gt;事業リスクになりそうな箇所を洗い出して工数を取ってもらうべく動く&lt;/li&gt;
&lt;li&gt;時間を見つけてロジックが複雑な部分をリファクタリングをしていく&lt;/li&gt;
&lt;li&gt;errorやdeployやcommit通知をslackに流す&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/motemen/git-pr-release"&gt;git-pr-release&lt;/a&gt;を入れる&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;安全にDeployできるような仕組みを作る&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;AWS ECSのようにコンテナマネージドサービスの場合はCircleCIからたたけばよいだろうし、そうでなければとりあえずdeploy用のサーバを立てcapisoranoでdeployしちゃってもよいだろう。&lt;/p&gt;
&lt;p&gt;大事なのはlocalに依存しないことと再現性のあること。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;使用してる外部サービスを洗い出しておく&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;意外とこういう洗い出し大事。使っていないコードの削除も捗るし、抽象化もしやすい。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;事業リスクになりそうな箇所を洗い出して工数を取ってもらうべく動く&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;技術的負債の説明をできるのはエンジニアしかいないので、本当に対応するべきか置いといて、きちんと伝えることは大事。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;エラー通知やdeploy通知をslackに流す&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;DX向上はエンジニア以外わからないので、「きちんと作業している」ということを伝えるのは大事。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;DX向上はエンジニアのための作業だけど、ちゃんとエンジニア以外にも「伝える」こともエンジニアとして大事なんだろうなぁ。&lt;/p&gt;
&lt;h2 id="backlinks"&gt;Backlinks&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.takeokunn.org/posts/permanent/20200202015651-thinking_about_recruit_interview/"&gt;エンジニア採用面接で考えていること&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>JavaScriptのthisについて</title><link>https://www.takeokunn.org/posts/permanent/20190701050011-javascript_this_in_depth/</link><pubDate>Mon, 01 Jul 2019 09:00:00 +0900</pubDate><guid>https://www.takeokunn.org/posts/permanent/20190701050011-javascript_this_in_depth/</guid><description>&lt;p&gt;会社のインターン生にJavaScriptの &lt;code&gt;this&lt;/code&gt; についてドヤ顔で説明してたら、間違って理解していたことがわかってしまった。&lt;/p&gt;
&lt;p&gt;同僚と &lt;code&gt;this&lt;/code&gt; がどのような挙動をするのかで盛り上がって楽しかった。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://qiita.com/valley/items/62c9480368f1409c90ae"&gt;【JS】ああthisよ。君は今、どのオブジェクトなのか（練習問題あり）&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;同僚の &lt;code&gt;@valley&lt;/code&gt; 氏の記事がおおよそすべてを説明してくれているが、この記事では自分の言葉で &lt;code&gt;this&lt;/code&gt; について説明する。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;元記事ではブラウザで実行していたが、この記事では &lt;code&gt;nodejs&lt;/code&gt; で実行するので &lt;code&gt;window -&amp;gt; global&lt;/code&gt; となる。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;結局そのscopeが評価された時のcontextがthisになる。
関数やオブジェクトが評価されるタイミングはいつなの？ってことを考えればあとは自然とthisを導き出せる。
functionが評価されるタイミングとlambdaが評価されるタイミングが違うというだけ。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;たとえば、次のようなスクリプトがある。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;func1&lt;/code&gt; の関数が評価されるのは実行時なので &lt;code&gt;{}&lt;/code&gt; だが、 &lt;code&gt;func2&lt;/code&gt; の関数が評価されるのはコンパイル時なので &lt;code&gt;global&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-js" data-lang="js"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;func1&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; () =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;this&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;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;func2&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; () {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;this&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:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;func1&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;&lt;span style="color:#75715e"&gt;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;func2&lt;/span&gt;); &lt;span style="color:#75715e"&gt;// global
&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;p&gt;&lt;code&gt;test.js&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-js" data-lang="js"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; { &lt;span style="color:#a6e22e"&gt;func1&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;func2&lt;/span&gt; } &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;require&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;./test1.js&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:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;aaa&lt;/span&gt;); &lt;span style="color:#75715e"&gt;// undefined
&lt;/span&gt;&lt;/span&gt;&lt;/span&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;&lt;span style="color:#a6e22e"&gt;func1&lt;/span&gt;(); &lt;span style="color:#75715e"&gt;// { aaa: &amp;#39;bbb&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;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;fund2&lt;/span&gt;(); &lt;span style="color:#75715e"&gt;// global
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;test1.js&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-js" data-lang="js"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;aaa&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;bbb&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;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;func1&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; () =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;this&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;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;func2&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; () {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;this&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:#a6e22e"&gt;module&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;exports&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; { &lt;span style="color:#a6e22e"&gt;func1&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;func2&lt;/span&gt; };
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;p&gt;教えるのも勉強なるし、こうやって深堀するとさらに詳しく慣れて楽しい。&lt;/p&gt;</description></item><item><title>EsLintでGlobの挙動で詰まった時のメモ</title><link>https://www.takeokunn.org/posts/permanent/20190531143338-eslint_glob_shell/</link><pubDate>Fri, 31 May 2019 09:00:00 +0900</pubDate><guid>https://www.takeokunn.org/posts/permanent/20190531143338-eslint_glob_shell/</guid><description>&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-text" data-lang="text"&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;開発環境では通って、circleci上ではエラーが出ている状態です。
&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;A: npm run test:lint
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;B: ./node_module/.bin/eslint --debug app/javascript/**/*.{vue,ts}
&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;&amp;#34;scripts&amp;#34;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;#34;test:lint&amp;#34;: &amp;#34;eslint --debug app/javascript/**/*.{vue,ts}&amp;#34;
&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;&lt;code&gt;A&lt;/code&gt; と &lt;code&gt;B&lt;/code&gt; で同じコードを実行しているはずなのでなぜか違う結果を吐き出すのだ。 &lt;code&gt;local&lt;/code&gt; では &lt;code&gt;eslint&lt;/code&gt; が通るけど &lt;code&gt;circleci&lt;/code&gt; ではコケる、といった問題が起きていて困っていた。&lt;/p&gt;
&lt;p&gt;ちなみに、 &lt;code&gt;eslint --debug&lt;/code&gt; で実行ログをみることができる。&lt;/p&gt;
&lt;p&gt;ESLint開発者の方と弊社CTOのBTOさんに教えてもらうことによって原因を突きとめることができた。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;原因は、「globの解釈の問題」だ。&lt;/p&gt;
&lt;p&gt;そもそもglobとは&lt;a href="https://ja.wikipedia.org/wiki/%E3%82%B0%E3%83%AD%E3%83%96"&gt;Wiki&lt;/a&gt;によるとこんな感じ。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;グロブ（英:
glob）とは主にUnix系環境において、ワイルドカードでファイル名のセットを指定するパターンのことである。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;今回の場合だと、2種類の解釈のし方がある。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;shellでglobが解釈される&lt;/li&gt;
&lt;li&gt;npmのglobで解釈される&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;macの標準のshellは &lt;code&gt;bash&lt;/code&gt; なのだが、これだとうまくglobを評価してくれないのだ。一方、circleciのコンテナのshellは &lt;code&gt;busybox&lt;/code&gt; だったのでうまくglobを評価してくれた。&lt;/p&gt;
&lt;p&gt;つまり、macではちゃんと動いていなかっただけだったのだ。&lt;/p&gt;
&lt;p&gt;そこで次のようにglob部分を &lt;code&gt;'&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-json" data-lang="json"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;scripts&amp;#34;&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&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;#34;test:lint&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;eslint --debug &amp;#39;app/javascript/**/*.{vue,ts}&amp;#39;&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;そうすることにより、 &lt;code&gt;npmのglobで解釈される&lt;/code&gt; ようになり、正常に動くようになった。&lt;/p&gt;
&lt;p&gt;内部的にはこれを使っているみたいだ。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.npmjs.com/package/glob"&gt;https://www.npmjs.com/package/glob&lt;/a&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;この世界にはたくさんのshellがあるようだ。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;dash（debian ash）&lt;/li&gt;
&lt;li&gt;ash&lt;/li&gt;
&lt;li&gt;busybox&lt;/li&gt;
&lt;li&gt;fish shell&lt;/li&gt;
&lt;li&gt;xonsh shell&lt;/li&gt;
&lt;li&gt;z shell&lt;/li&gt;
&lt;li&gt;bash&lt;/li&gt;
&lt;li&gt;etc&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ubuntu標準は &lt;code&gt;dash&lt;/code&gt; みたいだ。&lt;/p&gt;</description></item><item><title>オフィスにアクセスポイントを導入した時やったこと</title><link>https://www.takeokunn.org/posts/permanent/20190529144603-office_access_point/</link><pubDate>Wed, 29 May 2019 09:00:00 +0900</pubDate><guid>https://www.takeokunn.org/posts/permanent/20190529144603-office_access_point/</guid><description>&lt;p&gt;無線ルータを購入してアクセスポイントを設定した時に学んだことをメモしておく。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="無線ルータ選定"&gt;無線ルータ選定&lt;/h2&gt;
&lt;p&gt;ポイントは3点。&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;/ul&gt;
&lt;h3 id="転送速度"&gt;転送速度&lt;/h3&gt;
&lt;p&gt;種類ありすぎてわけわからないけど、とりあえず &lt;code&gt;1ac&lt;/code&gt; に対応してればよいかな。GHzが低いほど壁などの障害に強い。&lt;/p&gt;
&lt;p&gt;参考にした記事は以下。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.iodata.jp/product/network/info/base/kikaku.htm"&gt;無線LAN規格の違い&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://wa3.i-3-i.info/word12111.html"&gt;帯域幅 「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://micro.rohm.com/jp/techweb_iot/knowledge/iot01/s-iot01/01-s-iot01/1844"&gt;電波の伝わり方：反射/透過、回析、干渉 | 基礎知識 | ROHM TECH WEB&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://musenlan.biz/blog/522/"&gt;無線LANよろず講座&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="セキュリティ"&gt;セキュリティ&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;WPA2&lt;/code&gt; に対応してればオッケーという雑な理解。&lt;/p&gt;
&lt;p&gt;参考にした記事は以下。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.ipa.go.jp/security/ciadr/wirelesslan.html"&gt;一般家庭における無線LANのセキュリティに関する注意：IPA 独立行政法人 情報処理推進機構&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.infraexpert.com/study/tcpip21.html"&gt;TCP/IP - SNMP&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="無線端末-最大接続数"&gt;無線端末 最大接続数&lt;/h3&gt;
&lt;p&gt;今回はだいたい100台くらいつなげられればよかった。&lt;/p&gt;
&lt;p&gt;参考にした記事は以下。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.buffalo.jp/product/other/compare-wireless-business.html"&gt;BUFFALO 管理者機能搭載アクセスポイント商品比較表&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="設置"&gt;設置&lt;/h3&gt;
&lt;p&gt;これを購入することにした。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://www.amazon.co.jp/dp/B00OL61L9S/ref=asc_df_B00OL61L9S2617725/?tag=jpgo-22&amp;amp;creative=9339&amp;amp;creativeASIN=B00OL61L9S&amp;amp;linkCode=df0&amp;amp;hvadid=226974324204&amp;amp;hvpos=1o1&amp;amp;hvnetw=g&amp;amp;hvrand=14998055634270719829&amp;amp;hvpone=&amp;amp;hvptwo=&amp;amp;hvqmt=&amp;amp;hvdev=c&amp;amp;hvdvcmdl=&amp;amp;hvlocint=&amp;amp;hvlocphy=1028853&amp;amp;hvtargid=pla-457493725121"&gt;https://www.amazon.co.jp/dp/B00OL61L9S/ref=asc_df_B00OL61L9S2617725/?tag=jpgo-22&amp;creative=9339&amp;creativeASIN=B00OL61L9S&amp;linkCode=df0&amp;hvadid=226974324204&amp;hvpos=1o1&amp;hvnetw=g&amp;hvrand=14998055634270719829&amp;hvpone=&amp;hvptwo=&amp;hvqmt=&amp;hvdev=c&amp;hvdvcmdl=&amp;hvlocint=&amp;hvlocphy=1028853&amp;hvtargid=pla-457493725121&lt;/a&gt;][BUFFALO インテリジェントモデル PoE対応 11ac/n/a/g/b 866+300Mbps 無線LANアクセスポイント WAPM-1166D&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;オフィスに生えている野生のケーブルにルータを差して動かした。 端っこの方に適当に置いているので中央に置き直すつもりだ。&lt;/p&gt;
&lt;h2 id="管理画面から設定"&gt;管理画面から設定&lt;/h2&gt;
&lt;p&gt;同一ネットワーク内で &lt;code&gt;http://192.168.11.100&lt;/code&gt; をたたくと管理画面に入ることができる。&lt;/p&gt;
&lt;p&gt;SSIDの変更やpasswordの変更、 認証方式の制限などを変更する。&lt;/p&gt;
&lt;p&gt;変更するたび毎回再起動するので注意。&lt;/p&gt;
&lt;h2 id="余談"&gt;余談&lt;/h2&gt;
&lt;p&gt;POEすごい。
Ethernet指すだけで充電できるというの便利だなぁと思った（小学生並みの感想）。&lt;/p&gt;
&lt;p&gt;macアドレスでAPへのアクセス制限をかけられることを知れてよかった。&lt;/p&gt;</description></item><item><title>SVGにグラデーションのアニメーションをかける</title><link>https://www.takeokunn.org/posts/permanent/20190414045600-svg_gradation_animation/</link><pubDate>Sun, 14 Apr 2019 09:00:00 +0900</pubDate><guid>https://www.takeokunn.org/posts/permanent/20190414045600-svg_gradation_animation/</guid><description>&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-xml" data-lang="xml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;svg&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;version=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;1.1&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;xmlns=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;http://www.w3.org/2000/svg&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;xmlns:xlink=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;http://www.w3.org/1999/xlink&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;x=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;0px&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;y=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;0px&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;viewBox=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;0 0 1000 1000&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;enable-background=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;new 0 0 1000 1000&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;xml:space=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;preserve&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;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;lt;defs&amp;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;lt;linearGradient&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;id=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;bearGratient&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;x1=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;100%&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;y1=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;100%&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;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;lt;stop&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;offset=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;0%&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;stop-color=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;#69d2ff&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;stop-opacity=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;.5&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;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;lt;animate&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;attributeName=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;stop-color&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;values=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;#69d2ff;#71dca7;#ffd458;#ffa7de;#69d2ff&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;dur=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;14s&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;repeatCount=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;indefinite&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;/&amp;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;lt;/stop&amp;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;lt;stop&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;offset=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;100%&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;stop-color=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;#69d2ff&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;stop-opacity=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;.5&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;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;lt;animate&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;attributeName=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;stop-color&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;values=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;#69d2ff;#71dca7;#ffd458;#ffa7de;#69d2ff&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;dur=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;14s&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;repeatCount=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;indefinite&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;/&amp;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;lt;animate&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;attributeName=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;offset&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;values=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;.95;.80;.60;.40;.20;0;.20;.40;.60;.80;.95&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;dur=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;14s&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;repeatCount=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;indefinite&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;/&amp;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;lt;/stop&amp;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;lt;/linearGradient&amp;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;lt;/defs&amp;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;lt;g&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;fill=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;url(#bearGratient)&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;transform=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;translate(0.000000,511.000000) scale(0.100000,-0.100000)&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;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;lt;path&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;d=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;/* 中略 *//&amp;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;lt;path d=&amp;#34;&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;/*&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;中略&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;*/&lt;/span&gt;&lt;span style="color:#f92672"&gt;/&amp;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;lt;path&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;d=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;/*&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;中略&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;*/&lt;/span&gt;&lt;span style="color:#f92672"&gt;/&amp;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;lt;/g&amp;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;lt;/svg&amp;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;css&lt;/code&gt; の &lt;code&gt;linear-gradient&lt;/code&gt; で線形グラデーションをかけようと思ったのだが、どうも &lt;code&gt;svg&lt;/code&gt; には対応していないらしい。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;svg&lt;/code&gt; のMDNを漁っていたら &lt;code&gt;linear​Gradient&lt;/code&gt; というタグがあった。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://developer.mozilla.org/ja/docs/Web/SVG/Element/linearGradient"&gt;https://developer.mozilla.org/ja/docs/Web/SVG/Element/linearGradient&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;よいサンプルがなかったので調べていたら、次のようなsnippetがたくさん落ちていた。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://code.sololearn.com/Wvac74Zd8Ry3/#html"&gt;https://code.sololearn.com/Wvac74Zd8Ry3/#html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://codepen.io/NickNoordijk/pen/VLvxLE"&gt;https://codepen.io/NickNoordijk/pen/VLvxLE&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://codepen.io/samwyness/pen/eZwoLj"&gt;https://codepen.io/samwyness/pen/eZwoLj&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;サンプルコードによるとこんな感じ。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;defs&lt;/code&gt; に &lt;code&gt;linearGradient&lt;/code&gt; を定義する。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;linearGradient&lt;/code&gt; に &lt;code&gt;stop &amp;gt; animate&lt;/code&gt; 。
で時間に合わせたグラデーションをかけることができる。&lt;/li&gt;
&lt;li&gt;実際に描画する &lt;code&gt;SVG&lt;/code&gt; 要素に上で定義した &lt;code&gt;linearGradient&lt;/code&gt; を &lt;code&gt;fill&lt;/code&gt; する。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;これできた。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;code&gt;css&lt;/code&gt; や &lt;code&gt;svg&lt;/code&gt; を使うことによって描画がものすごいきれいになるので多用していきたい。&lt;/p&gt;</description></item><item><title>Ubuntu FirefoxをEmacs Keybindにする</title><link>https://www.takeokunn.org/posts/permanent/20190413091854-ubuntu_firefox_emacs_keybind/</link><pubDate>Sat, 13 Apr 2019 09:00:00 +0900</pubDate><guid>https://www.takeokunn.org/posts/permanent/20190413091854-ubuntu_firefox_emacs_keybind/</guid><description>&lt;p&gt;普段Chromeを使っているのだが、外で作業するとき電池の消費量が異常だったのでFirefoxの環境も整備する必要が出てきた。&lt;/p&gt;
&lt;p&gt;しかしながら、Emacs脳である自分にはネットサーフィンもEmacsでしたいという欲求が非常に強い。&lt;/p&gt;
&lt;p&gt;Chromeには&lt;a href="https://chrome.google.com/webstore/detail/chromemacs/kfdibhbheajeacnkkakomaliggbgndcf"&gt;Chromemacs&lt;/a&gt;という拡張があるが、Firefoxにはなかったのでなんとかしてみた。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;次の記事を参考した。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://qiita.com/mooz@github/items/c5f25f27847333dd0b37"&gt;xkeysnail - もうひとつの Linux 向けキーリマッパ&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Firefox が Quantum になり、旧来の XUL
ベースのアドオンは動作しなくなった。新たな拡張機能の機構である
WebExtensions ではキーボードショートカットに関する API
が大幅に制限され、ぼくは拙作のアドオン KeySnail のWebExtensions
化を諦めた。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;この筆者も同じことを考えていて、同じように辛さを感じているようだ。&lt;/p&gt;
&lt;p&gt;この &lt;code&gt;xkeysnail&lt;/code&gt; は &lt;code&gt;Firefoxのplugin&lt;/code&gt; ではなくて、 &lt;code&gt;Linuxのuinputを取得して任意のkeyに変換する&lt;/code&gt; ということをやっている。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/mooz/xkeysnail"&gt;mooz/xkeysnail&lt;/a&gt; の &lt;code&gt;README.md&lt;/code&gt; に導入方法が書いてある。&lt;/p&gt;
&lt;p&gt;自分の &lt;code&gt;.config.py&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-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# -*- coding: utf-8 -*-&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; re
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;from&lt;/span&gt; xkeysnail.transform &lt;span style="color:#f92672"&gt;import&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&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;define_conditional_modmap(re&lt;span style="color:#f92672"&gt;.&lt;/span&gt;compile(&lt;span style="color:#e6db74"&gt;r&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;Firefox&amp;#39;&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;CAPSLOCK: Key&lt;span style="color:#f92672"&gt;.&lt;/span&gt;LEFT_CTRL,
&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;define_keymap(re&lt;span style="color:#f92672"&gt;.&lt;/span&gt;compile(&lt;span style="color:#e6db74"&gt;&amp;#34;Firefox&amp;#34;&lt;/span&gt;), {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# change tab&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; K(&lt;span style="color:#e6db74"&gt;&amp;#34;C-f&amp;#34;&lt;/span&gt;): K(&lt;span style="color:#e6db74"&gt;&amp;#34;C-Tab&amp;#34;&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; K(&lt;span style="color:#e6db74"&gt;&amp;#34;C-b&amp;#34;&lt;/span&gt;): K(&lt;span style="color:#e6db74"&gt;&amp;#34;C-Shift-Tab&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:#75715e"&gt;# search&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; K(&lt;span style="color:#e6db74"&gt;&amp;#34;C-s&amp;#34;&lt;/span&gt;): K(&lt;span style="color:#e6db74"&gt;&amp;#34;C-f&amp;#34;&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; K(&lt;span style="color:#e6db74"&gt;&amp;#34;C-s&amp;#34;&lt;/span&gt;): K(&lt;span style="color:#e6db74"&gt;&amp;#34;C-g&amp;#34;&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; K(&lt;span style="color:#e6db74"&gt;&amp;#34;C-r&amp;#34;&lt;/span&gt;): K(&lt;span style="color:#e6db74"&gt;&amp;#34;C-Shift-g&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:#75715e"&gt;# private window&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; K(&lt;span style="color:#e6db74"&gt;&amp;#34;C-Shift-n&amp;#34;&lt;/span&gt;): K(&lt;span style="color:#e6db74"&gt;&amp;#34;C-Shift-p&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:#75715e"&gt;# up/down&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; K(&lt;span style="color:#e6db74"&gt;&amp;#34;C-n&amp;#34;&lt;/span&gt;): K(&lt;span style="color:#e6db74"&gt;&amp;#34;DOWN&amp;#34;&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; K(&lt;span style="color:#e6db74"&gt;&amp;#34;C-p&amp;#34;&lt;/span&gt;): K(&lt;span style="color:#e6db74"&gt;&amp;#34;UP&amp;#34;&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; K(&lt;span style="color:#e6db74"&gt;&amp;#34;C-v&amp;#34;&lt;/span&gt;): K(&lt;span style="color:#e6db74"&gt;&amp;#34;SPACE&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; K(&lt;span style="color:#e6db74"&gt;&amp;#34;C-g&amp;#34;&lt;/span&gt;): {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# change page&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; K(&lt;span style="color:#e6db74"&gt;&amp;#34;C-b&amp;#34;&lt;/span&gt;): K(&lt;span style="color:#e6db74"&gt;&amp;#34;C-LEFT_BRACE&amp;#34;&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; K(&lt;span style="color:#e6db74"&gt;&amp;#34;C-f&amp;#34;&lt;/span&gt;): K(&lt;span style="color:#e6db74"&gt;&amp;#34;C-RIGHT_BRACE&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:#75715e"&gt;# reload&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; K(&lt;span style="color:#e6db74"&gt;&amp;#34;C-r&amp;#34;&lt;/span&gt;): K(&lt;span style="color:#e6db74"&gt;&amp;#34;C-r&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:#75715e"&gt;# paste&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; K(&lt;span style="color:#e6db74"&gt;&amp;#34;C-v&amp;#34;&lt;/span&gt;): K(&lt;span style="color:#e6db74"&gt;&amp;#34;C-v&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:#75715e"&gt;# close&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; K(&lt;span style="color:#e6db74"&gt;&amp;#34;C-w&amp;#34;&lt;/span&gt;): K(&lt;span style="color:#e6db74"&gt;&amp;#34;C-w&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:#75715e"&gt;# close&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; K(&lt;span style="color:#e6db74"&gt;&amp;#34;C-t&amp;#34;&lt;/span&gt;): K(&lt;span style="color:#e6db74"&gt;&amp;#34;C-Shift-t&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;Firefox&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;Firefox&lt;/code&gt; のみ反応してほしいのでこのような設定にした。&lt;/p&gt;</description></item><item><title>WebpackerでBulmaをbuildするとwarningが出るものの調査と対応</title><link>https://www.takeokunn.org/posts/permanent/20190411111745-webpacker_bulma_build_warning/</link><pubDate>Thu, 11 Apr 2019 09:00:00 +0900</pubDate><guid>https://www.takeokunn.org/posts/permanent/20190411111745-webpacker_bulma_build_warning/</guid><description>&lt;p&gt;「Webpackerでbuildするとめっちゃwarning出るんだけど調べてくれない？」&lt;/p&gt;
&lt;p&gt;と、会社の先輩からいわれたので調査対応をした時学んだことをメモしていく。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;warningの内容は以下だ（抜粋）&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-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ ./bin/webpack
&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;WARNING in ./node_modules/css-loader??ref--2-2!./node_modules/postcss-loader/lib??ref--2-3!./node_modules/resolve-url-loader!./node_modules/sass-loader/lib/loader.js??ref--2-5!./app/assets/scss/main.scss
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;(&lt;/span&gt;Emitted value instead of an instance of Error&lt;span style="color:#f92672"&gt;)&lt;/span&gt; postcss-custom-properties: /Users/node_modules/bulma/sass/grid/columns.sass:501:10: Custom property ignored: not scoped to the top-level :root element &lt;span style="color:#f92672"&gt;(&lt;/span&gt;.columns.is-variable.is-3-widescreen-only &lt;span style="color:#f92672"&gt;{&lt;/span&gt; ... --columnGap: ... &lt;span style="color:#f92672"&gt;})&lt;/span&gt;, in atrule
&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;このwarningが何十個も出ている状態だった。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;エラーの原因は &lt;code&gt;bulma&lt;/code&gt; のコード内にある &lt;code&gt;postcss-next&lt;/code&gt; が良くなかったからだ。&lt;/p&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-scss" data-lang="scss"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;@if&lt;/span&gt; $variable-columns
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;.&lt;/span&gt;columns&lt;span style="color:#f92672"&gt;.&lt;/span&gt;is-variable
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;--&lt;/span&gt;columnGap&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;.75&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;rem&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;margin-left&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;calc&lt;/span&gt;(&lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;var&lt;/span&gt;(&lt;span style="color:#f92672"&gt;--&lt;/span&gt;columnGap))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;margin-right&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;calc&lt;/span&gt;(&lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;var&lt;/span&gt;(&lt;span style="color:#f92672"&gt;--&lt;/span&gt;columnGap))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;.&lt;/span&gt;column
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;padding-left&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;var&lt;/span&gt;(&lt;span style="color:#f92672"&gt;--&lt;/span&gt;columnGap)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;padding-right&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;var&lt;/span&gt;(&lt;span style="color:#f92672"&gt;--&lt;/span&gt;columnGap)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;@&lt;/span&gt;for $i from &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; through &lt;span style="color:#ae81ff"&gt;8&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;.&lt;/span&gt;is-&lt;span style="color:#e6db74"&gt;#{&lt;/span&gt;$i&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:#f92672"&gt;--&lt;/span&gt;columnGap&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;#{&lt;/span&gt;$i &lt;span style="color:#f92672"&gt;*&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;.25&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;rem&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:#f92672"&gt;+&lt;/span&gt;mobile
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;amp;.&lt;/span&gt;is-&lt;span style="color:#e6db74"&gt;#{&lt;/span&gt;$i&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt;mobile
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;--&lt;/span&gt;columnGap&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;#{&lt;/span&gt;$i &lt;span style="color:#f92672"&gt;*&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;.25&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;rem&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:#f92672"&gt;+&lt;/span&gt;tablet
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;amp;.&lt;/span&gt;is-&lt;span style="color:#e6db74"&gt;#{&lt;/span&gt;$i&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt;tablet
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;--&lt;/span&gt;columnGap&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;#{&lt;/span&gt;$i &lt;span style="color:#f92672"&gt;*&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;.25&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;rem&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:#f92672"&gt;+&lt;/span&gt;tablet-only
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;amp;.&lt;/span&gt;is-&lt;span style="color:#e6db74"&gt;#{&lt;/span&gt;$i&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt;tablet-only
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;--&lt;/span&gt;columnGap&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;#{&lt;/span&gt;$i &lt;span style="color:#f92672"&gt;*&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;.25&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;rem&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:#f92672"&gt;+&lt;/span&gt;touch
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;amp;.&lt;/span&gt;is-&lt;span style="color:#e6db74"&gt;#{&lt;/span&gt;$i&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt;touch
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;--&lt;/span&gt;columnGap&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;#{&lt;/span&gt;$i &lt;span style="color:#f92672"&gt;*&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;.25&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;rem&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:#f92672"&gt;+&lt;/span&gt;desktop
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;amp;.&lt;/span&gt;is-&lt;span style="color:#e6db74"&gt;#{&lt;/span&gt;$i&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt;desktop
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;--&lt;/span&gt;columnGap&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;#{&lt;/span&gt;$i &lt;span style="color:#f92672"&gt;*&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;.25&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;rem&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:#f92672"&gt;+&lt;/span&gt;desktop-only
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;amp;.&lt;/span&gt;is-&lt;span style="color:#e6db74"&gt;#{&lt;/span&gt;$i&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt;desktop-only
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;--&lt;/span&gt;columnGap&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;#{&lt;/span&gt;$i &lt;span style="color:#f92672"&gt;*&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;.25&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;rem&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:#f92672"&gt;+&lt;/span&gt;widescreen
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;amp;.&lt;/span&gt;is-&lt;span style="color:#e6db74"&gt;#{&lt;/span&gt;$i&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt;widescreen
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;--&lt;/span&gt;columnGap&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;#{&lt;/span&gt;$i &lt;span style="color:#f92672"&gt;*&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;.25&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;rem&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:#f92672"&gt;+&lt;/span&gt;widescreen-only
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;amp;.&lt;/span&gt;is-&lt;span style="color:#e6db74"&gt;#{&lt;/span&gt;$i&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt;widescreen-only
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;--&lt;/span&gt;columnGap&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;#{&lt;/span&gt;$i &lt;span style="color:#f92672"&gt;*&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;.25&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;rem&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:#f92672"&gt;+&lt;/span&gt;fullhd
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;amp;.&lt;/span&gt;is-&lt;span style="color:#e6db74"&gt;#{&lt;/span&gt;$i&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt;fullhd
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;--&lt;/span&gt;columnGap&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;#{&lt;/span&gt;$i &lt;span style="color:#f92672"&gt;*&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;.25&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;rem&lt;/span&gt;&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;GitHub: &lt;a href="https://github.com/jgthms/bulma/blob/4caa77dc0f13984347b734657c2d4cd588149087/sass/grid/columns.sass#L467-L504"&gt;https://github.com/jgthms/bulma/blob/4caa77dc0f13984347b734657c2d4cd588149087/sass/grid/columns.sass#L467-L504&lt;/a&gt;&lt;/p&gt;</description></item><item><title>AjaxとBrowser Cookie</title><link>https://www.takeokunn.org/posts/permanent/20190330064337-ajax_browser_cookie/</link><pubDate>Sat, 30 Mar 2019 09:00:00 +0900</pubDate><guid>https://www.takeokunn.org/posts/permanent/20190330064337-ajax_browser_cookie/</guid><description>&lt;p&gt;「ブラウザからアクセスするのと、AjaxからアクセスするのってCookieってかわっちゃうの？」という質問をされたので自分なりの答えを書いていく。&lt;/p&gt;
&lt;p&gt;Ajaxなのだが、JavaScriptで一番有名なlibraryの&lt;a href="https://github.com/axios/axios"&gt;axios/axios&lt;/a&gt;を用いて書く。&lt;/p&gt;
&lt;p&gt;FetchAPIについては今回は含めない。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="結論"&gt;結論&lt;/h2&gt;
&lt;p&gt;基本的にはCookieは変わらない。&lt;/p&gt;
&lt;p&gt;同一オリジンの場合は自動的にCookieが使われる。&lt;/p&gt;
&lt;p&gt;別オリジンの場合にCookieを使いたいなら &lt;code&gt;{ withCredentials: true }&lt;/code&gt; をoptionに持たせればよい。&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-js" data-lang="js"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;axios&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;get&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;https://www.uuum.jp&amp;#39;&lt;/span&gt;, { &lt;span style="color:#a6e22e"&gt;withCredentials&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt; });
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;p&gt;そもそもAjaxとはなんだろうか？&lt;/p&gt;
&lt;p&gt;&lt;a href="https://developer.mozilla.org/ja/docs/Web/Guide/AJAX/Getting_Started"&gt;MDN&lt;/a&gt;にこう書いてある。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;AJAX は Asynchronous JavaScript And XML の頭文字を取ったものです。
これは一言で言えば、 XMLHttpRequest オブジェクトを使ってサーバーと通信することです。
AJAX は JSON, XML, HTML, テキストファイルなど、様々な形式の情報で送受信することができます。
AJAX の最も魅力的な特徴は「非同期」であること、つまり、サーバーとの通信、データの交換、ページの更新を、ページの再読み込みなしに行うことができる点です。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;要するに、JavaScriptから通信ができるというだけ。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;XMLHttRequest&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-js" data-lang="js"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;xhr&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;XMLHttpRequest&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;xhr&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;open&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;GET&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;https://www.uuum.jp&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;xhr&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;send&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;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;xhr&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;status&lt;/span&gt;); &lt;span style="color:#75715e"&gt;// 200
&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;hr&gt;
&lt;p&gt;axiosのコードを読んでみる。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/axios/axios/blob/503418718f669fcc674719fd862b355605d7b41f/lib/adapters/xhr.js"&gt;axios/lib/adapters/xhr.js&lt;/a&gt;に &lt;code&gt;XMLHttpRequest&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-js" data-lang="js"&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;request&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;XMLHttpRequest&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;XMLHttpRequest&lt;/code&gt; を使っているのが確認できた。&lt;/p&gt;
&lt;p&gt;さて、Cookieの扱い方はどうなっているだろうか？　ググったら &lt;code&gt;withCredentials&lt;/code&gt; を使えって書いてある。&lt;/p&gt;
&lt;p&gt;実際にコード読んでみるとこんな記述がある。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/axios/axios/blob/503418718f669fcc674719fd862b355605d7b41f/lib/adapters/xhr.js#L103-L105"&gt;axios/lib/adapters/xhr.js#L103-L105&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-js" data-lang="js"&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;xsrfValue&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;config&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;withCredentials&lt;/span&gt; &lt;span style="color:#f92672"&gt;||&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;isURLSameOrigin&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;config&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;url&lt;/span&gt;)) &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;config&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;xsrfCookieName&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:#a6e22e"&gt;cookies&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;read&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;config&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;xsrfCookieName&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;undefined&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;同一オリジンの場合や &lt;code&gt;withCredentials&lt;/code&gt; の場合に &lt;code&gt;cookies.read&lt;/code&gt; が走る。&lt;/p&gt;
&lt;p&gt;Cookiesの定義元を読んで見る。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/axios/axios/blob/503418718f669fcc674719fd862b355605d7b41f/lib/helpers/cookies.js#L9-L43"&gt;axios/lib/helpers/cookies.js&lt;/a&gt;:&lt;/p&gt;</description></item><item><title>npm libraryのbuild formatについて</title><link>https://www.takeokunn.org/posts/permanent/20190317001306-publish_npm_library_build_format/</link><pubDate>Sun, 17 Mar 2019 09:00:00 +0900</pubDate><guid>https://www.takeokunn.org/posts/permanent/20190317001306-publish_npm_library_build_format/</guid><description>&lt;p&gt;半年前くらいにnpm package作ってみたいなぁと思って作ってみた時学んだことをまとめていく。&lt;/p&gt;
&lt;p&gt;次の記事でだいたい理解できたのだが、実際にやってみて細かいところでつまずた部分を書いていく。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://qiita.com/TsutomuNakamura/items/f943e0490d509f128ae2"&gt;初めてのnpmパッケージ公開&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://qiita.com/fnobi/items/f6b1574fb9f4518ed520"&gt;3分でできるnpmモジュール&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ちなみに、repoは &lt;a href="https://github.com/takeokunn/businesh"&gt;takeokunn/businesh&lt;/a&gt; で、ビジネッシュ翻訳してくれるようなゴミみたいなpackageだ。意外とdownloadがあるのウケる。&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-js" data-lang="js"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;before_text&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;任意の文字列をビジネッシュ・テキストに変換するライブラリです。&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;businesh&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;translate&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;before_text&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;then&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;after_text&lt;/span&gt; =&amp;gt; {
&lt;/span&gt;&lt;/span&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;&lt;span style="color:#75715e"&gt;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;after_text&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;catch&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;err&lt;/span&gt; =&amp;gt; &lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;err&lt;/span&gt;));
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;p&gt;&lt;code&gt;npm&lt;/code&gt; のpackageと一口に言っても、 &lt;code&gt;server side javascript&lt;/code&gt; なのか、 &lt;code&gt;frontend javascript&lt;/code&gt; なのかで毛色が違う。通常次のようにライブラリを呼び出す。&lt;/p&gt;
&lt;p&gt;frontend:&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-js" data-lang="js"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;import&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;businesh&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;from&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;businesh&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;server side:&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-js" data-lang="js"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;businesh&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;require&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;businesh&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;上記のように呼び出すには、次のようにpackageを提供する必要がある。&lt;/p&gt;
&lt;p&gt;frontend:&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-js" data-lang="js"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;export&lt;/span&gt; { &lt;span style="color:#a6e22e"&gt;businesh&lt;/span&gt; };
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;server side:&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-js" data-lang="js"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;exports&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;businesh&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;businesh&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;javascript&lt;/code&gt; の &lt;code&gt;module&lt;/code&gt; には主に4種類ある。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;AMD&lt;/li&gt;
&lt;li&gt;CommonJS&lt;/li&gt;
&lt;li&gt;ES&lt;/li&gt;
&lt;li&gt;UMD&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;この辺の記事が参考になる。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://qiita.com/chuck0523/items/1868a4c04ab4d8cdfb23"&gt;[意訳]初学者のためのJavaScriptモジュール講座 #Part1&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.davidbcalhoun.com/2014/what-is-amd-commonjs-and-umd/"&gt;What is AMD, CommonJS, and UMD?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://auth0.com/blog/javascript-module-systems-showdown/"&gt;JavaScript Module Systems Showdown: CommonJS vs AMD vs ES2015&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;bundler&lt;/code&gt; のbuild optionで解決できる。 &lt;code&gt;rollup&lt;/code&gt; を使っているので次のように設定すればよい。&lt;/p&gt;</description></item><item><title>Common Lispのquoteについて</title><link>https://www.takeokunn.org/posts/permanent/20190316220021-common_lispdata_command_mode/</link><pubDate>Sat, 16 Mar 2019 09:00:00 +0900</pubDate><guid>https://www.takeokunn.org/posts/permanent/20190316220021-common_lispdata_command_mode/</guid><description>&lt;p&gt;stack overflowに次の2つの質問をした。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://stackoverflow.com/questions/54868796/cannot-post-slack-webhook-url-in-common-lisp"&gt;Cannot post slack webhook url in common lisp&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://stackoverflow.com/questions/55066131/getenv-xxx-is-not-a-lisp-string-or-pointer"&gt;(GETENV XXX) is not a Lisp string or pointer Ask Question&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;両方とも &lt;code&gt;sds&lt;/code&gt; という方が答えてくれたのですが、 どうも自分は &lt;code&gt;quote&lt;/code&gt; について理解をしていないことがわかりました。&lt;/p&gt;
&lt;p&gt;調べたところ、stack overflowに良さそうな記事があったので翻訳をしてみる。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://stackoverflow.com/questions/134887/when-to-use-or-quote-in-lisp"&gt;When to use &amp;rsquo; (or quote) in Lisp?&lt;/a&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;code&gt;Question&lt;/code&gt;: quoteっていつ使うの？&lt;/p&gt;
&lt;p&gt;Lispの入門書を読んだのですが、 &lt;code&gt;quote&lt;/code&gt; や &lt;code&gt;'&lt;/code&gt; 特殊な演算子がどんな挙動をするのか理解できませんでしたし、まだ見たことがありません。&lt;/p&gt;
&lt;p&gt;どうでしょうか？&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Short Answer&lt;/code&gt;:&lt;/p&gt;
&lt;p&gt;デフォルトの評価ルールを使わず、 &lt;code&gt;symbol&lt;/code&gt; か &lt;code&gt;s式&lt;/code&gt; を評価せずに入力された型どおりに関数を渡す。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Long Answer&lt;/code&gt;: &lt;em&gt;デフォルトの評価ルール&lt;/em&gt;&lt;/p&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-lisp" data-lang="lisp"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;(&lt;span style="color:#a6e22e"&gt;*&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;+&lt;/span&gt; a &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;a&lt;/code&gt; と &lt;code&gt;2&lt;/code&gt; を順に評価することによって &lt;code&gt;(+ a 2)&lt;/code&gt; を評価する。 シンボル &lt;code&gt;a&lt;/code&gt; の現在束縛されている値を調べ、置き換える。 &lt;code&gt;a&lt;/code&gt; は現在&lt;del&gt;3&lt;/del&gt;という値が束縛されています。&lt;/p&gt;</description></item><item><title>MySQLのmax_allowed_packetについて</title><link>https://www.takeokunn.org/posts/permanent/20190309201924-mysql_max_allowed_packet/</link><pubDate>Sat, 09 Mar 2019 09:00:00 +0900</pubDate><guid>https://www.takeokunn.org/posts/permanent/20190309201924-mysql_max_allowed_packet/</guid><description>&lt;p&gt;先日、カイシャのギョームでこんなことがあった。&lt;/p&gt;
&lt;p&gt;「なんか、普通に投稿はできるんだけど、下書きが保存できないんだよね。ちょっと原因わからない？」&lt;/p&gt;
&lt;p&gt;Railsで書かれている対象のコードを読んだのだが、まったく問題がなさそうだ。普通に &lt;code&gt;ActiveRecord&lt;/code&gt; のメソッドを読んでテキスト情報を保存しているだけだからだ。&lt;/p&gt;
&lt;p&gt;今扱っているプロジェクトは負債が多くてどこが本当に原因なのかはわからなかったので途方に暮れていたら、カイシャの凄腕の人が「多分 &lt;code&gt;max_allowed_packet&lt;/code&gt; かな」と言い、サクッと直してしまった。&lt;/p&gt;
&lt;p&gt;こういうのが技術力なんだなぁとしみじみ思ったので、どういうことが起こっていたのかちゃんと復習して、次同じようなことが合った時ドヤ顔できるようにする（間違いがあるかもなので指摘してもらえると幸い）&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;まず、対象の &lt;code&gt;table&lt;/code&gt; を &lt;code&gt;show create table&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-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;CREATE&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;TABLE&lt;/span&gt; &lt;span style="color:#f92672"&gt;`&lt;/span&gt;drafts&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;id&lt;span style="color:#f92672"&gt;`&lt;/span&gt; int(&lt;span style="color:#ae81ff"&gt;11&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;NOT&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;NULL&lt;/span&gt; AUTO_INCREMENT,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;`&lt;/span&gt;dump_obj_encode_in_base64&lt;span style="color:#f92672"&gt;`&lt;/span&gt; longtext &lt;span style="color:#66d9ef"&gt;NOT&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;NULL&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;created_at&lt;span style="color:#f92672"&gt;`&lt;/span&gt; datetime &lt;span style="color:#66d9ef"&gt;NOT&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;NULL&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;updated_at&lt;span style="color:#f92672"&gt;`&lt;/span&gt; datetime &lt;span style="color:#66d9ef"&gt;NOT&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;NULL&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;PRIMARY&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;KEY&lt;/span&gt; (&lt;span style="color:#f92672"&gt;`&lt;/span&gt;id&lt;span style="color:#f92672"&gt;`&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;) ENGINEInnoDB AUTO_INCREMENT&lt;span style="color:#f92672"&gt;~&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;145&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;DEFAULT&lt;/span&gt; CHARSET&lt;span style="color:#f92672"&gt;~&lt;/span&gt;utf8 ROW_FORMAT&lt;span style="color:#f92672"&gt;~&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;DYNAMIC&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;引き継いだプログラムなのでなぜこうなっていたのかまったくわからないが、 &lt;code&gt;dump_obj_encode_in_base64&lt;/code&gt; の型が &lt;code&gt;longtext&lt;/code&gt; で保存されていた。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;longtext&lt;/code&gt; は &lt;code&gt;最長4,294,967,295、または4GB (232 - 1) バイト&lt;/code&gt; と非常にsizeが大きい。&lt;/p&gt;
&lt;p&gt;参考： &lt;a href="https://www.dbonline.jp/mysql/type/index6.html"&gt;BLOB型とTEXT型(DB Online)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;MySQLのclientがserver投げられる最大のデータ量はどのくらいだろうか。&lt;/p&gt;
&lt;p&gt;それを定義しているのが &lt;code&gt;max_allowed_packet&lt;/code&gt; だ。&lt;/p&gt;
&lt;p&gt;現在このブログを書いているPCのMySQL(&lt;code&gt;Server version: 5.7.25-0ubuntu0.18.04.2 (Ubuntu)&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-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;mysql&amp;gt; show variables like &amp;#39;max_allowed_packet&amp;#39;;
&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;| Variable_name | Value |
&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;| max_allowed_packet | 16777216 |
&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;1 row in set (0.06 sec)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;約16MBだった。 &lt;code&gt;longtext&lt;/code&gt; では全然足りないサイズだ。&lt;/p&gt;</description></item><item><title>docker-compose.ymlのportsについてのメモ</title><link>https://www.takeokunn.org/posts/permanent/20190226214952-docker_compose_yml_ports/</link><pubDate>Tue, 26 Feb 2019 09:00:00 +0900</pubDate><guid>https://www.takeokunn.org/posts/permanent/20190226214952-docker_compose_yml_ports/</guid><description>&lt;p&gt;おもしろい挙動をするので記事化する。&lt;/p&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-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;version&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#39;3&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;services&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;nginx&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;image&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;nginx&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;ports&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;:&lt;span style="color:#ae81ff"&gt;80&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;portを0にするとどうなるだろうか。&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-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;~/D/test &lt;span style="color:#f92672"&gt;(&lt;/span&gt;*´ω｀*&lt;span style="color:#f92672"&gt;)&lt;/span&gt; &amp;lt; docker ps
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;05e0975ea3d1 nginx &lt;span style="color:#e6db74"&gt;&amp;#34;nginx -g &amp;#39;daemon of…&amp;#34;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;51&lt;/span&gt; seconds ago Up &lt;span style="color:#ae81ff"&gt;49&lt;/span&gt; seconds 0.0.0.0:32768-&amp;gt;80/tcp test_nginx_1
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;0.0.0.0:32768-&amp;gt;80/tcp&lt;/code&gt; なんと、 &lt;code&gt;32768&lt;/code&gt; にforwardされるのだ。&lt;/p&gt;
&lt;p&gt;もう一度 &lt;code&gt;docker-compose up&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-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;~/D/test &lt;span style="color:#f92672"&gt;(&lt;/span&gt;*´ω｀*&lt;span style="color:#f92672"&gt;)&lt;/span&gt; &amp;lt; docker ps
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;05e0975ea3d1 nginx &lt;span style="color:#e6db74"&gt;&amp;#34;nginx -g &amp;#39;daemon of…&amp;#34;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;4&lt;/span&gt; minutes ago Up &lt;span style="color:#ae81ff"&gt;4&lt;/span&gt; seconds 0.0.0.0:32769-&amp;gt;80/tcp test_nginx_1
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;0.0.0.0:32769-&amp;gt;80/tcp&lt;/code&gt; こうなる。不思議だ。&lt;/p&gt;
&lt;p&gt;どこかの記事で読んだのだけれども、被らないようにportをforwardingしてくれるそうな。&lt;/p&gt;
&lt;p&gt;公式ドキュメントのNoteもおもしろい。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Note: When mapping ports in the HOST:CONTAINER format, you may
experience erroneous results when using a container port lower than 60,
because YAML parses numbers in the format xx:yy as a base-60 value. For
this reason, we recommend always explicitly specifying your port
mappings as strings.&lt;/p&gt;</description></item></channel></rss>