<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
  <title>思い立ったが吉日</title>
  <atom:link href="https://miko.info/feed/" rel="self" type="application/rss+xml" />
  <link>https://miko.info</link>
  <description>AWS・n8n・Dockerなどの構築・運用記録</description>
  <lastBuildDate>Wed, 17 Jun 2026 12:41:03 GMT</lastBuildDate>
  <language>ja</language>
  <item>
    <title>技術ブログ用のWordPressブロックを自作してみた</title>
    <link>https://miko.info/2026/06/17/scyra-blocks-wordpress-plugin/</link>
    <guid isPermaLink="false">https://miko.info/?p=2787</guid>
    <pubDate>Wed, 17 Jun 2026 12:41:03 GMT</pubDate>
    <dc:creator>miko</dc:creator>
    <category><![CDATA[ツール]]></category><category><![CDATA[プログラミング]]></category><category><![CDATA[技術]]></category><category><![CDATA[Gutenberg]]></category><category><![CDATA[SANGO]]></category><category><![CDATA[Scyra Blocks]]></category><category><![CDATA[WordPress]]></category><category><![CDATA[技術ブログ]]></category>
    <description><![CDATA[WordPressブロックを自作し、構成図・検証環境・コード・コマンド・トラブルシュートをGutenbergで扱えるようにした記録です。Scyra Blocks…]]></description>
    <content:encoded><![CDATA[<p class="wp-block-paragraph">技術記事を書いていると、毎回同じような情報を整えていることに気づきます。構成図、検証環境、設定ファイル、実行コマンド、詰まったところ、最後のまとめ。この記事では、技術ブログ向けにWordPressブロックを自作した理由と、Scyra Blocksで用意した表現用ブロックの使いどころをまとめます。</p>

<p class="wp-block-paragraph">最近はn8nのQueue ModeやAWS Cost Explorer APIの記事を書きながら、こういう「技術記事の部品」をもう少し安定した見た目で置きたいと思う場面が増えていました。そこで、自分のブログ用にGutenbergブロックを追加するWordPressプラグインを作りました。</p>

	<section class="ktb-card ktb-callout ktb-callout-success" aria-label="この記事自体をScyra Blocksのショーケースにする">
		<div class="ktb-card__header">
			<span class="ktb-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><path d="M12 17h.01M12 7v6M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Z"></path></svg></span>
			<div><span class="ktb-eyebrow">GOOD</span><strong class="ktb-card__title">この記事自体をScyra Blocksのショーケースにする</strong></div>
		</div>
		<p class="ktb-callout__body">単にプラグインを紹介するだけではなく、この記事の中で全ブロックを実際に使いながら、どこで役立つのかを整理します。</p>	</section>
	

<h2 class="wp-block-heading" id="i-0">作ったもの: 技術ブログ用のWordPressブロック</h2>

<p class="wp-block-paragraph">作ったのは「Scyra Blocks」というWordPressプラグインです。WordPressブロックとして構成図、コード、コマンド、トラブルシュートなどを用意し、技術ブログでよく使う情報をSANGOの本文になじむカードとして扱えるようにしています。</p>

<p class="wp-block-paragraph">今のところ、次の8種類のブロックを用意しています。</p>

<ul class="wp-block-list">
<li>構成図: Mermaid記法でシステム構成や処理の流れを表示する</li>

<li>検証環境: OS、ランタイム、アプリケーションバージョンなどを整理する</li>

<li>コードブロック: JSON、YAML、PHP、設定ファイルなどを表示する</li>

<li>コマンド + 実行結果: コピー可能なコマンドと結果をまとめる</li>

<li>コールアウト: 補足、注意、リスク、良い判断を記事中で強調する</li>

<li>トラブルシュート: 症状、原因、確認事項、解決の方向を整理する</li>

<li>手順カード: 作業の流れや判断順を番号付きで表示する</li>

<li>まとめカード: 記事末尾の要点と結論を整理する</li>
</ul>

<p class="wp-block-paragraph">ベースにしているのはWordPress標準の<a href="https://developer.wordpress.org/block-editor/" target="_blank" rel="noreferrer noopener">Block Editor</a>です。構成図は<a href="https://mermaid.js.org/" target="_blank" rel="noreferrer noopener">Mermaid</a>、コードの色分けは<a href="https://highlightjs.org/" target="_blank" rel="noreferrer noopener">Highlight.js</a>を使い、記事ごとに必要な表現だけを読み込む方針にしています。</p>

<h2 class="wp-block-heading" id="i-1">全体像を見せる: 構成図ブロック</h2>

<p class="wp-block-paragraph">まず欲しかったのが、記事の前半で全体像を見せるための構成図ブロックです。Mermaid記法を本文中に置くと、公開画面ではSVGとして描画されます。</p>

	<figure class="ktb-card ktb-diagram ktb-tone-blue">
		<div class="ktb-card__header">
			<span class="ktb-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><rect x="3" y="3" width="6" height="5" rx="1"></rect><rect x="15" y="16" width="6" height="5" rx="1"></rect><path d="M9 5.5h4a4 4 0 0 1 4 4V16M7 8v4a4 4 0 0 0 4 4h4"></path></svg></span>
			<div><span class="ktb-eyebrow">ARCHITECTURE</span><strong class="ktb-card__title">Scyra Blocksのざっくり構成</strong></div>
		</div>
		<div class="ktb-mermaid" data-ktb-mermaid="" data-ktb-source="flowchart%20LR%0A%20%20Editor%40%7B%20icon%3A%20%22scyra%3Abrowser%22%2C%20form%3A%20%22rounded%22%2C%20label%3A%20%22WordPress%20Editor%22%2C%20pos%3A%20%22b%22%2C%20h%3A%2052%20%7D%0A%20%20Blocks%40%7B%20icon%3A%20%22scyra%3Aplugin%22%2C%20form%3A%20%22rounded%22%2C%20label%3A%20%22Scyra%20Blocks%22%2C%20pos%3A%20%22b%22%2C%20h%3A%2052%20%7D%0A%20%20PHP%40%7B%20icon%3A%20%22scyra%3Aserver%22%2C%20form%3A%20%22rounded%22%2C%20label%3A%20%22Dynamic%20Blocks%20%2F%20PHP%22%2C%20pos%3A%20%22b%22%2C%20h%3A%2052%20%7D%0A%20%20JS%40%7B%20icon%3A%20%22scyra%3Acode%22%2C%20form%3A%20%22rounded%22%2C%20label%3A%20%22Editor%20UI%20%2F%20JavaScript%22%2C%20pos%3A%20%22b%22%2C%20h%3A%2052%20%7D%0A%20%20Article%40%7B%20icon%3A%20%22scyra%3Abrowser%22%2C%20form%3A%20%22rounded%22%2C%20label%3A%20%22Article%20Frontend%22%2C%20pos%3A%20%22b%22%2C%20h%3A%2052%20%7D%0A%20%20Mermaid%40%7B%20icon%3A%20%22scyra%3Acloud%22%2C%20form%3A%20%22circle%22%2C%20label%3A%20%22Mermaid%20Diagram%22%2C%20pos%3A%20%22b%22%2C%20h%3A%2052%20%7D%0A%20%20Highlight%40%7B%20icon%3A%20%22scyra%3Acode%22%2C%20form%3A%20%22circle%22%2C%20label%3A%20%22Highlight.js%22%2C%20pos%3A%20%22b%22%2C%20h%3A%2052%20%7D%0A%20%20Cards%40%7B%20icon%3A%20%22scyra%3Aserver%22%2C%20form%3A%20%22rounded%22%2C%20label%3A%20%22Readable%20Tech%20Cards%22%2C%20pos%3A%20%22b%22%2C%20h%3A%2052%20%7D%0A%20%20Editor%20--%3E%20Blocks%0A%20%20Blocks%20--%3E%20PHP%0A%20%20Blocks%20--%3E%20JS%0A%20%20PHP%20--%3E%20Article%0A%20%20Article%20--%3E%20Mermaid%0A%20%20Article%20--%3E%20Highlight%0A%20%20Article%20--%3E%20Cards"><pre>flowchart LR
  Editor@{ icon: "scyra:browser", form: "rounded", label: "WordPress Editor", pos: "b", h: 52 }
  Blocks@{ icon: "scyra:plugin", form: "rounded", label: "Scyra Blocks", pos: "b", h: 52 }
  PHP@{ icon: "scyra:server", form: "rounded", label: "Dynamic Blocks / PHP", pos: "b", h: 52 }
  JS@{ icon: "scyra:code", form: "rounded", label: "Editor UI / JavaScript", pos: "b", h: 52 }
  Article@{ icon: "scyra:browser", form: "rounded", label: "Article Frontend", pos: "b", h: 52 }
  Mermaid@{ icon: "scyra:cloud", form: "circle", label: "Mermaid Diagram", pos: "b", h: 52 }
  Highlight@{ icon: "scyra:code", form: "circle", label: "Highlight.js", pos: "b", h: 52 }
  Cards@{ icon: "scyra:server", form: "rounded", label: "Readable Tech Cards", pos: "b", h: 52 }
  Editor --&gt; Blocks
  Blocks --&gt; PHP
  Blocks --&gt; JS
  PHP --&gt; Article
  Article --&gt; Mermaid
  Article --&gt; Highlight
  Article --&gt; Cards</pre></div>
		<figcaption>Scyra Blocks同梱のMermaidアイコンを使った構成図。</figcaption>	</figure>
	

<p class="wp-block-paragraph">構成図は、細かい説明を読む前に「何がどこにつながっているのか」を掴んでもらうために使います。公開済みの<a href="https://miko.info/2026/06/14/n8n-queue-mode-docker-compose/">n8n Queue Modeの記事</a>でも、Main、Worker、Redis、PostgreSQLの関係を説明するときにかなり役立ちました。</p>

<h2 class="wp-block-heading" id="i-2">再現条件を残す: 検証環境ブロック</h2>

<p class="wp-block-paragraph">技術記事では、どの環境で動かしたのかが後から効いてきます。バージョン違いで挙動が変わることもあるので、検証環境は本文とは別のカードとしてまとめるようにしました。</p>

	<section class="ktb-card ktb-environment ktb-status-verified" aria-label="この記事を書いたときの検証環境">
		<div class="ktb-card__header">
			<span class="ktb-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><path d="M9 3h6M10 3v6l-5 8.5A2.3 2.3 0 0 0 7 21h10a2.3 2.3 0 0 0 2-3.5L14 9V3"></path><path d="M7.5 16h9"></path></svg></span>
			<div><span class="ktb-eyebrow">VERIFICATION LAB</span><strong class="ktb-card__title">この記事を書いたときの検証環境</strong></div>
			<span class="ktb-status"><i></i>動作確認済み</span>
		</div>
		<div class="ktb-spec-grid">
							<div class="ktb-spec"><span>CMS</span><strong>WordPress</strong></div>
							<div class="ktb-spec"><span>Theme</span><strong>SANGO</strong></div>
							<div class="ktb-spec"><span>Plugin</span><strong>Scyra Blocks 1.5.0</strong></div>
							<div class="ktb-spec"><span>Diagram</span><strong>Mermaid 11.15.0</strong></div>
							<div class="ktb-spec"><span>Highlight</span><strong>Highlight.js 11.11.1</strong></div>
					</div>
		<p class="ktb-note">この記事内のブロック表示は、この環境で確認しています。</p>	</section>
	

<p class="wp-block-paragraph">このブロックは、OSやDockerのバージョンだけでなく、WordPressテーマやプラグインのバージョンを書く用途にも向いています。</p>

<h2 class="wp-block-heading" id="i-3">設定ファイルを見せる: コードブロック</h2>

<p class="wp-block-paragraph">コマンドと設定ファイルは、見た目を分けたいと思っていました。ターミナル風のUIはコマンドには合いますが、JSONやYAMLまで同じ見た目にすると少し違和感があります。そこで、設定ファイル用のコードブロックを追加しました。</p>

	<section class="ktb-card ktb-code" aria-label="ブロック登録のイメージ">
		<div class="ktb-code__bar">
			<span class="ktb-icon ktb-code__icon"><svg viewBox="0 0 24 24" aria-hidden="true"><path d="m8 8-4 4 4 4M16 8l4 4-4 4M14 4l-4 16"></path></svg></span>
			<div>
				<span class="ktb-eyebrow">PHP</span>
				<strong>ブロック登録のイメージ</strong>
			</div>
			<span class="ktb-code__filename">scyra-blocks.php</span>			<button type="button" class="ktb-copy" data-ktb-copy="scyra-code-15" aria-label="コードをコピー">COPY</button>
		</div>
		<pre class="ktb-code__body" id="scyra-code-15"><code class="language-php" data-hl="done"><span class="line"><span style="color:#DCBDFB">register_block_type</span><span style="color:#ADBAC7">(</span></span>
<span class="line"><span style="color:#96D0FF">    'scyra/code-block'</span><span style="color:#ADBAC7">,</span></span>
<span class="line"><span style="color:#6CB6FF">    array</span><span style="color:#ADBAC7">(</span></span>
<span class="line"><span style="color:#96D0FF">        'render_callback'</span><span style="color:#F47067"> =></span><span style="color:#96D0FF"> 'scyra_render_code_block'</span><span style="color:#ADBAC7">,</span></span>
<span class="line"><span style="color:#ADBAC7">    )</span></span>
<span class="line"><span style="color:#ADBAC7">);</span></span></code></pre>
		<span class="screen-reader-text" aria-live="polite" data-ktb-copy-status=""></span>
	</section>
	

<p class="wp-block-paragraph">コードブロックは、JSON、YAML、PHP、TypeScript、PowerShellなどを選べます。設定ファイル名も出せるので、記事中で「これはどのファイルに書くものなのか」が伝わりやすくなります。</p>

<h2 class="wp-block-heading" id="i-4">手元で実行するものを見せる: コマンド + 実行結果ブロック</h2>

<p class="wp-block-paragraph">一方で、実際にターミナルで実行するコマンドは、コピーしやすい形で置きたいです。そこで、コマンドと実行結果をセットで表示するブロックを用意しました。</p>

	<section class="ktb-card ktb-command" aria-label="プラグインの状態を確認する">
		<div class="ktb-terminal-bar">
			<span class="ktb-terminal-dots" aria-hidden="true"><i></i><i></i><i></i></span>
			<strong>プラグインの状態を確認する</strong>
			<span class="ktb-shell">bash</span>
			<button type="button" class="ktb-copy" data-ktb-copy="scyra-command-16" aria-label="コマンドをコピー">COPY</button>
		</div>
		<div class="ktb-terminal-body">
			<div class="ktb-command-line"><span aria-hidden="true">$</span><pre id="scyra-command-16"><code class="language-bash" data-hl="done"><span class="line"><span style="color:#F69D50">wp</span><span style="color:#96D0FF"> plugin</span><span style="color:#96D0FF"> list</span><span style="color:#6CB6FF"> --status=active</span><span style="color:#F47067"> |</span><span style="color:#F69D50"> grep</span><span style="color:#96D0FF"> scyranwp</span><span style="color:#96D0FF"> post</span><span style="color:#96D0FF"> get</span><span style="color:#6CB6FF"> 2787</span><span style="color:#6CB6FF"> --field=post_status</span></span></code></pre></div>
			<pre class="ktb-output" aria-label="実行結果"><code class="language-text" data-hl="done"><span class="line"><span>scyra-blocks activen draft</span></span></code></pre>		</div>
		<span class="screen-reader-text" aria-live="polite" data-ktb-copy-status=""></span>
	</section>
	

<p class="wp-block-paragraph">このブロックは、読者がそのままコピーして試すコマンドに向いています。実行結果もセットで置けるので、期待する状態を伝えやすいです。</p>

<h2 class="wp-block-heading" id="i-5">注意点を埋もれさせない: コールアウトブロック</h2>

<p class="wp-block-paragraph">記事を書いていると、本文の途中で「ここは大事」「ここは注意」「これは良い判断だった」と言いたい場面があります。そういう一言を普通の段落で書くと流れやすいので、コールアウトとして分けられるようにしました。</p>

	<section class="ktb-card ktb-callout ktb-callout-info" aria-label="自分のブログ用に絞ると作りやすい">
		<div class="ktb-card__header">
			<span class="ktb-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><path d="M12 17h.01M12 7v6M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Z"></path></svg></span>
			<div><span class="ktb-eyebrow">NOTE</span><strong class="ktb-card__title">自分のブログ用に絞ると作りやすい</strong></div>
		</div>
		<p class="ktb-callout__body">最初から汎用プラグインとして完成させようとすると大変ですが、自分の記事で繰り返し使う部品に絞ると、必要なデザインや入力項目を決めやすくなります。</p>	</section>
	

<p class="wp-block-paragraph">コールアウトは、補足、良い判断、注意、リスクの4種類を用意しています。使いすぎるとうるさくなるので、本文の流れを一度止めてでも伝えたいことにだけ使う想定です。</p>

<h2 class="wp-block-heading" id="i-6">詰まったところを残す: トラブルシュートブロック</h2>

<p class="wp-block-paragraph">技術記事で一番あとから効いてくるのは、実は成功した手順よりも詰まったポイントだったりします。自分がどこで迷ったのか、何を確認したのかを残しておくと、未来の自分にも読み手にも役立ちます。</p>

	<section class="ktb-card ktb-troubleshoot ktb-severity-warning" aria-label="ブロックの見た目が記事内で浮く">
		<div class="ktb-card__header">
			<span class="ktb-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><path d="M12 3 2.8 19h18.4L12 3Z"></path><path d="M12 9v4M12 17h.01"></path></svg></span>
			<div><span class="ktb-eyebrow">TROUBLESHOOTING</span><strong class="ktb-card__title">ブロックの見た目が記事内で浮く</strong></div>
		</div>
		<div class="ktb-diagnostic-grid">
			<div><span class="ktb-diagnostic-label">症状 <small>SYMPTOM</small></span><p>カード単体では良く見えても、記事本文の中に置くと主張が強すぎたり、通常のボックスと差がなくなったりする。</p></div>
			<div><span class="ktb-diagnostic-label">考えられる原因 <small>LIKELY CAUSE</small></span><p>ブロック単体の見た目だけを見ていて、前後の本文やスマホ幅での読みやすさを後回しにしていた。</p></div>
		</div>
		<div class="ktb-checks">
			<span class="ktb-diagnostic-label">確認すること <small>CHECKLIST</small></span>
			<ul>
									<li>スマホ幅でも崩れないかn通常の本文と並べたときに浮きすぎないかnコードや長いファイル名がはみ出さないかnコピー用ボタンが目立ちすぎないか</li>
							</ul>
		</div>
		<div class="ktb-resolution"><strong>解決の方向 <small>RESOLUTION</small></strong><p>色は控えめにしつつ、見出し、アイコン、余白で役割が分かるように調整しました。記事全体の読みやすさを優先しています。</p></div>	</section>
	

<p class="wp-block-paragraph">このブロックは、エラー対応だけでなく、設計上の迷いどころを整理する用途にも使えます。</p>

<h2 class="wp-block-heading" id="i-7">作業の順番を見せる: 手順カード</h2>

<p class="wp-block-paragraph">実装記事では、細かいコマンドの前に「どういう順番で進めるのか」を見せた方が読みやすいことがあります。そこで、作業の流れを番号付きで整理する手順カードを作りました。</p>

	<section class="ktb-card ktb-steps" aria-label="Scyra Blocksを育てる流れ">
		<div class="ktb-card__header">
			<span class="ktb-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><path d="M7 6h14M7 12h14M7 18h14M3 6h.01M3 12h.01M3 18h.01"></path></svg></span>
			<div><span class="ktb-eyebrow">PROCESS</span><strong class="ktb-card__title">Scyra Blocksを育てる流れ</strong></div>
		</div>
		<div class="ktb-steps__body">
			<p class="ktb-steps__intro">一度で完璧に作るのではなく、記事を書きながら足りない表現を増やしていく方針にしました。</p>			<ol class="ktb-steps__list">
									<li>
						<span aria-hidden="true">01</span>
						<div>
							<strong>まず記事で使う</strong>
							<p>実際の記事に置いて、読みづらいところを見つけます。nブロックに切り出す: 毎回手作業で整えている表現を専用ブロックにします。n見た目を調整する: PC幅とスマホ幅の両方で、本文から浮きすぎないようにします。nREADMEに残す: 何ができるプラグインなのか、リポジトリを見ても分かるようにします。</p>						</div>
					</li>
							</ol>
		</div>
	</section>
	

<p class="wp-block-paragraph">手順カードは、作業ログをそのまま貼るのではなく、読み手が迷わない順番に並べ直すためのブロックです。</p>

<h2 class="wp-block-heading" id="i-8">最後に要点を回収する: まとめカード</h2>

<p class="wp-block-paragraph">最後は、記事の要点をまとめるためのカードです。普通の箇条書きでも良いのですが、記事の締めとして少しだけ目立たせることで、読み終わりの印象を整理しやすくなります。</p>

	<section class="ktb-card ktb-summary ktb-tone-blue" aria-label="まとめ">
		<div class="ktb-card__header">
			<span class="ktb-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><path d="M5 5h14M5 12h10M5 19h7"></path><path d="m16 16 2 2 4-5"></path></svg></span>
			<div><span class="ktb-eyebrow">WRAP UP</span><strong class="ktb-card__title">まとめ</strong></div>
		</div>
		<div class="ktb-summary__body">
			<p class="ktb-summary__lead">Scyra Blocksは、技術記事を書くときに何度も使う情報を、ブログ内で扱いやすくするために作ったWordPressプラグインです。</p>			<ul class="ktb-summary__points">
									<li><span aria-hidden="true">✓</span><strong>構成図、検証環境、コード、コマンド、コールアウト、トラブルシュート、手順、まとめを専用ブロック化したnMermaidとHighlight.jsは必要な記事だけで読み込むようにしたn設定ファイルとターミナル表示を分けたことで、記事内の読みやすさが上がったn自分のブログ用に絞ると、改善点を具体的に決めやすい</strong></li>
							</ul>
			<p class="ktb-summary__takeaway"><span>TAKEAWAY</span>記事を書くたびに同じ部品を手作業で整えるより、ブログ側に表現の道具を持たせる方が、長く続けるうえで楽になりそうです。</p>		</div>
	</section>
	

<h2 class="wp-block-heading" id="i-9">今後やりたいこと</h2>

<p class="wp-block-paragraph">今後は、ブロック定義をblock.jsonに寄せたり、スクリーンショット付きのREADMEを整えたりしたいです。公開リポジトリとして見てもらうなら、インストール方法や更新手順ももう少し丁寧にした方が良さそうです。</p>

<p class="wp-block-paragraph">あとは、比較表やリポジトリカードのようなブロックも面白そうです。技術記事はどうしても文章とコードが中心になりがちなので、読み手が一瞬で判断できる見せ方を少しずつ増やしていきたいです。</p>
]]></content:encoded>
  </item>
  <item>
    <title>n8n Queue ModeをDocker Composeで構成する</title>
    <link>https://miko.info/2026/06/14/n8n-queue-mode-docker-compose/</link>
    <guid isPermaLink="false">https://miko.info/?p=2721</guid>
    <pubDate>Sun, 14 Jun 2026 05:46:03 GMT</pubDate>
    <dc:creator>miko</dc:creator>
    <category><![CDATA[技術]]></category><category><![CDATA[Docker]]></category><category><![CDATA[Docker Compose]]></category><category><![CDATA[n8n]]></category><category><![CDATA[Queue Mode]]></category><category><![CDATA[セルフホスト]]></category>
    <description><![CDATA[n8nをMain、Worker、Task Runner、Redis、PostgreSQLに分離し、Docker ComposeでQueue Modeを構成した記…]]></description>
    <content:encoded><![CDATA[<p class="wp-block-paragraph">n8nを長く使っていると、UIやWebhookを受ける処理と、実際にワークフローを実行する処理を分けたくなる場面があります。特にCode Nodeや定期実行が増えてくると、どのコンテナが何を担当しているのかを分けておいた方が、更新や障害調査を進めやすくなります。</p>

<p class="wp-block-paragraph">この記事では、Docker Composeでn8n Queue Modeを構成し、Main、Worker、Task Runner、Redis、PostgreSQLの役割を整理します。完全な無停止構成を作る話ではなく、受付・実行・キュー・データ保存の責務を分け、運用しやすい形にするのが狙いです。</p>

	<figure class="ktb-card ktb-diagram ktb-tone-blue">
		<div class="ktb-card__header">
			<span class="ktb-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><rect x="3" y="3" width="6" height="5" rx="1"></rect><rect x="15" y="16" width="6" height="5" rx="1"></rect><path d="M9 5.5h4a4 4 0 0 1 4 4V16M7 8v4a4 4 0 0 0 4 4h4"></path></svg></span>
			<div><span class="ktb-eyebrow">ARCHITECTURE</span><strong class="ktb-card__title">n8n Queue Modeの全体像</strong></div>
		</div>
		<div class="ktb-mermaid" data-ktb-mermaid="" data-ktb-source="flowchart%20LR%0A%20%20Internet%5BInternet%20%2F%20Webhook%5D%20--%3E%20Caddy%5BCaddy%5D%0A%20%20Caddy%20--%3E%20Main%5Bn8n-main%5D%0A%20%20Main%20--%3E%20Redis%5B%28Redis%20Queue%29%5D%0A%20%20Redis%20--%3E%20Worker1%5Bn8n-worker%5D%0A%20%20Redis%20--%3E%20Worker2%5Bn8n-worker-2%5D%0A%20%20Worker1%20--%3E%20Runner1%5BTask%20Runner%5D%0A%20%20Worker2%20--%3E%20Runner2%5BTask%20Runner%202%5D%0A%20%20Main%20-.%20read%2Fwrite%20.-%3E%20DB%5B%28PostgreSQL%29%5D%0A%20%20Worker1%20-.%20read%2Fwrite%20.-%3E%20DB%0A%20%20Worker2%20-.%20read%2Fwrite%20.-%3E%20DB"><pre>flowchart LR
  Internet[Internet / Webhook] --&gt; Caddy[Caddy]
  Caddy --&gt; Main[n8n-main]
  Main --&gt; Redis[(Redis Queue)]
  Redis --&gt; Worker1[n8n-worker]
  Redis --&gt; Worker2[n8n-worker-2]
  Worker1 --&gt; Runner1[Task Runner]
  Worker2 --&gt; Runner2[Task Runner 2]
  Main -. read/write .-&gt; DB[(PostgreSQL)]
  Worker1 -. read/write .-&gt; DB
  Worker2 -. read/write .-&gt; DB</pre></div>
		<figcaption>Mainは受付、Redisは実行IDの受け渡し、Workerは実行、PostgreSQLは永続データを担当します。</figcaption>	</figure>
	

<h2 class="wp-block-heading" id="i-0">Queue Modeで分かれる役割</h2>

<p class="wp-block-paragraph">n8nのQueue Modeでは、MainインスタンスがトリガーやWebhookを受け付け、実行そのものはWorkerへ渡します。公式ドキュメントでも、Mainが実行IDをRedisへ渡し、WorkerがRedisから実行IDを受け取り、データベースからワークフロー情報を取得して処理する流れとして説明されています。</p>

<div id="">
<figure class="wp-block-table"><table><tbody>
<tr><td>n8n-main</td><td>UI、Webhook、Trigger管理。実行ジョブをRedisへ登録する。</td></tr>
<tr><td>Redis</td><td>Pending executionのキュー。Workerへ実行IDを受け渡す。</td></tr>
<tr><td>n8n-worker</td><td>キューからジョブを取得し、ワークフローを実行する。</td></tr>
<tr><td>Task Runner</td><td>Code Nodeなどのタスク実行をn8n本体から分ける。</td></tr>
<tr><td>PostgreSQL</td><td>Workflow、Credential、実行履歴などの永続データを保存する。</td></tr>
</tbody></table></figure>
</div>

<p class="wp-block-paragraph">ここで大事なのは、Redisがワークフロー定義やCredentialを保存するわけではない点です。Redisはジョブの受け渡し、PostgreSQLは永続データという役割で見ると、トラブルシュート時に確認する場所を間違えにくくなります。</p>

	<section class="ktb-card ktb-environment ktb-status-verified" aria-label="この記事の検証環境">
		<div class="ktb-card__header">
			<span class="ktb-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><path d="M9 3h6M10 3v6l-5 8.5A2.3 2.3 0 0 0 7 21h10a2.3 2.3 0 0 0 2-3.5L14 9V3"></path><path d="M7.5 16h9"></path></svg></span>
			<div><span class="ktb-eyebrow">VERIFICATION LAB</span><strong class="ktb-card__title">この記事の検証環境</strong></div>
			<span class="ktb-status"><i></i>動作確認済み</span>
		</div>
		<div class="ktb-spec-grid">
							<div class="ktb-spec"><span>Host</span><strong>AWS Lightsail</strong></div>
							<div class="ktb-spec"><span>OS</span><strong>Ubuntu 24.04 LTS</strong></div>
							<div class="ktb-spec"><span>Runtime</span><strong>Docker Compose</strong></div>
							<div class="ktb-spec"><span>Application</span><strong>n8n Queue Mode</strong></div>
							<div class="ktb-spec"><span>Broker</span><strong>Redis</strong></div>
							<div class="ktb-spec"><span>Database</span><strong>PostgreSQL</strong></div>
					</div>
		<p class="ktb-note">バージョンは環境に合わせて固定してください。Task Runnerを外部モードで使う場合、n8n本体とrunner imageのバージョンを揃えます。</p>	</section>
	

<h2 class="wp-block-heading" id="i-1">Queue Modeは高可用性そのものではない</h2>

<p class="wp-block-paragraph">Queue Modeは、実行処理をWorkerへ分けるための構成です。Workerを増やせば同時に処理できる量を広げられますが、それだけでMain、Redis、PostgreSQLまで冗長化されるわけではありません。Mainを1台で動かすなら、Main更新中はUIやWebhook受付が短時間止まります。</p>

<ul class="wp-block-list">
<li><strong>できること:</strong> MainとWorkerの責務を分け、Workerを追加・削除しやすくする</li>
<li><strong>できないこと:</strong> Queue Modeだけで全体を無停止化する</li>
<li><strong>運用上の見方:</strong> まず役割分離、次にバックアップや監視、必要なら冗長化を考える</li>
</ul>

<h2 class="wp-block-heading" id="i-2">.envを用意する</h2>

<p class="wp-block-paragraph">Main、Worker、Runnerで共有する値を .env にまとめます。特に N8N_ENCRYPTION_KEY は全n8nプロセスで同じ値にします。これが違うと、データベースに保存されたCredentialをWorkerが扱えません。</p>

	<section class="ktb-card ktb-command" aria-label="シークレットを生成する">
		<div class="ktb-terminal-bar">
			<span class="ktb-terminal-dots" aria-hidden="true"><i></i><i></i><i></i></span>
			<strong>シークレットを生成する</strong>
			<span class="ktb-shell">BASH</span>
			<button type="button" class="ktb-copy" data-ktb-copy="scyra-command-1" aria-label="コマンドをコピー">COPY</button>
		</div>
		<div class="ktb-terminal-body">
			<div class="ktb-command-line"><span aria-hidden="true">$</span><pre id="scyra-command-1"><code class="language-bash" data-hl="done"><span class="line"><span style="color:#F69D50">openssl</span><span style="color:#96D0FF"> rand</span><span style="color:#6CB6FF"> -hex</span><span style="color:#6CB6FF"> 32</span></span>
<span class="line"><span style="color:#F69D50">openssl</span><span style="color:#96D0FF"> rand</span><span style="color:#6CB6FF"> -hex</span><span style="color:#6CB6FF"> 32</span></span></code></pre></div>
					</div>
		<span class="screen-reader-text" aria-live="polite" data-ktb-copy-status=""></span>
	</section>
	

	<section class="ktb-card ktb-command" aria-label=".envの主要項目">
		<div class="ktb-terminal-bar">
			<span class="ktb-terminal-dots" aria-hidden="true"><i></i><i></i><i></i></span>
			<strong>.envの主要項目</strong>
			<span class="ktb-shell">PLAINTEXT</span>
			<button type="button" class="ktb-copy" data-ktb-copy="scyra-command-2" aria-label="コマンドをコピー">COPY</button>
		</div>
		<div class="ktb-terminal-body">
			<div class="ktb-command-line"><span aria-hidden="true">$</span><pre id="scyra-command-2"><code class="language-text" data-hl="done"><span class="line"><span>N8N_VERSION=2.25.7</span></span>
<span class="line"><span>N8N_ENCRYPTION_KEY=CHANGE_ME</span></span>
<span class="line"><span>N8N_RUNNERS_AUTH_TOKEN=CHANGE_ME</span></span>
<span class="line"><span>POSTGRES_PASSWORD=CHANGE_ME</span></span>
<span class="line"><span>REDIS_PASSWORD=CHANGE_ME</span></span>
<span class="line"><span>N8N_DEFAULT_BINARY_DATA_MODE=database</span></span>
<span class="line"><span>N8N_BLOCK_ENV_ACCESS_IN_NODE=true</span></span>
<span class="line"><span>N8N_COMMUNITY_PACKAGES_ENABLED=false</span></span></code></pre></div>
					</div>
		<span class="screen-reader-text" aria-live="polite" data-ktb-copy-status=""></span>
	</section>
	

<p class="wp-block-paragraph">Queue ModeではMainとWorkerが同じバイナリデータへアクセスできる必要があります。n8n公式ドキュメントでは、Queue Modeで filesystem モードはサポートされず、database を使うよう案内されています。</p>

<h2 class="wp-block-heading" id="i-3">docker-compose.ymlの要点</h2>

<h3 class="wp-block-heading" id="i-4">共通設定</h3>

<p class="wp-block-paragraph">MainとWorkerで共通するDB、Redis、暗号化キーなどはYAML anchorでまとめます。値を分散させないことで、更新時の見落としを減らします。</p>

	<section class="ktb-card ktb-command" aria-label="n8n共通設定">
		<div class="ktb-terminal-bar">
			<span class="ktb-terminal-dots" aria-hidden="true"><i></i><i></i><i></i></span>
			<strong>n8n共通設定</strong>
			<span class="ktb-shell">YAML</span>
			<button type="button" class="ktb-copy" data-ktb-copy="scyra-command-3" aria-label="コマンドをコピー">COPY</button>
		</div>
		<div class="ktb-terminal-body">
			<div class="ktb-command-line"><span aria-hidden="true">$</span><pre id="scyra-command-3"><code class="language-yaml" data-hl="done"><span class="line"><span style="color:#8DDB8C">x-n8n-shared</span><span style="color:#ADBAC7">: </span><span style="color:#F47067">&#x26;</span><span style="color:#F69D50">n8n-shared</span></span>
<span class="line"><span style="color:#8DDB8C">  image</span><span style="color:#ADBAC7">: </span><span style="color:#96D0FF">docker.n8n.io/n8nio/n8n:${N8N_VERSION:-2.25.7}</span></span>
<span class="line"><span style="color:#8DDB8C">  restart</span><span style="color:#ADBAC7">: </span><span style="color:#96D0FF">unless-stopped</span></span>
<span class="line"><span style="color:#8DDB8C">  environment</span><span style="color:#ADBAC7">: </span><span style="color:#F47067">&#x26;</span><span style="color:#F69D50">n8n-env</span></span>
<span class="line"><span style="color:#8DDB8C">    EXECUTIONS_MODE</span><span style="color:#ADBAC7">: </span><span style="color:#96D0FF">queue</span></span>
<span class="line"><span style="color:#8DDB8C">    DB_TYPE</span><span style="color:#ADBAC7">: </span><span style="color:#96D0FF">postgresdb</span></span>
<span class="line"><span style="color:#8DDB8C">    DB_POSTGRESDB_HOST</span><span style="color:#ADBAC7">: </span><span style="color:#96D0FF">postgres</span></span>
<span class="line"><span style="color:#8DDB8C">    DB_POSTGRESDB_DATABASE</span><span style="color:#ADBAC7">: </span><span style="color:#96D0FF">n8n_cluster</span></span>
<span class="line"><span style="color:#8DDB8C">    DB_POSTGRESDB_USER</span><span style="color:#ADBAC7">: </span><span style="color:#96D0FF">n8n</span></span>
<span class="line"><span style="color:#8DDB8C">    DB_POSTGRESDB_PASSWORD</span><span style="color:#ADBAC7">: </span><span style="color:#96D0FF">${POSTGRES_PASSWORD:?POSTGRES_PASSWORD is required}</span></span>
<span class="line"><span style="color:#8DDB8C">    QUEUE_BULL_REDIS_HOST</span><span style="color:#ADBAC7">: </span><span style="color:#96D0FF">redis</span></span>
<span class="line"><span style="color:#8DDB8C">    QUEUE_BULL_REDIS_PORT</span><span style="color:#ADBAC7">: </span><span style="color:#6CB6FF">6379</span></span>
<span class="line"><span style="color:#8DDB8C">    QUEUE_BULL_REDIS_PASSWORD</span><span style="color:#ADBAC7">: </span><span style="color:#96D0FF">${REDIS_PASSWORD:?REDIS_PASSWORD is required}</span></span>
<span class="line"><span style="color:#8DDB8C">    N8N_ENCRYPTION_KEY</span><span style="color:#ADBAC7">: </span><span style="color:#96D0FF">${N8N_ENCRYPTION_KEY:?N8N_ENCRYPTION_KEY is required}</span></span>
<span class="line"><span style="color:#8DDB8C">    N8N_DEFAULT_BINARY_DATA_MODE</span><span style="color:#ADBAC7">: </span><span style="color:#96D0FF">database</span></span>
<span class="line"><span style="color:#8DDB8C">    N8N_BLOCK_ENV_ACCESS_IN_NODE</span><span style="color:#ADBAC7">: </span><span style="color:#96D0FF">"true"</span></span></code></pre></div>
					</div>
		<span class="screen-reader-text" aria-live="polite" data-ktb-copy-status=""></span>
	</section>
	

<h3 class="wp-block-heading" id="i-5">n8n-main</h3>

<p class="wp-block-paragraph">n8n-mainはUIとWebhookを受ける入口です。手動実行もWorkerへ逃がしたい場合は OFFLOAD_MANUAL_EXECUTIONS_TO_WORKERS を有効にします。</p>

	<section class="ktb-card ktb-command" aria-label="n8n-main">
		<div class="ktb-terminal-bar">
			<span class="ktb-terminal-dots" aria-hidden="true"><i></i><i></i><i></i></span>
			<strong>n8n-main</strong>
			<span class="ktb-shell">YAML</span>
			<button type="button" class="ktb-copy" data-ktb-copy="scyra-command-4" aria-label="コマンドをコピー">COPY</button>
		</div>
		<div class="ktb-terminal-body">
			<div class="ktb-command-line"><span aria-hidden="true">$</span><pre id="scyra-command-4"><code class="language-yaml" data-hl="done"><span class="line"><span style="color:#8DDB8C">n8n-main</span><span style="color:#ADBAC7">:</span></span>
<span class="line"><span style="color:#6CB6FF">  &#x3C;&#x3C;</span><span style="color:#ADBAC7">: </span><span style="color:#F47067">*</span><span style="color:#ADBAC7">n8n-shared</span></span>
<span class="line"><span style="color:#8DDB8C">  ports</span><span style="color:#ADBAC7">:</span></span>
<span class="line"><span style="color:#ADBAC7">    - </span><span style="color:#96D0FF">"${N8N_PORT:-5678}:5678"</span></span>
<span class="line"><span style="color:#8DDB8C">  environment</span><span style="color:#ADBAC7">:</span></span>
<span class="line"><span style="color:#6CB6FF">    &#x3C;&#x3C;</span><span style="color:#ADBAC7">: </span><span style="color:#F47067">*</span><span style="color:#ADBAC7">n8n-env</span></span>
<span class="line"><span style="color:#8DDB8C">    WEBHOOK_URL</span><span style="color:#ADBAC7">: </span><span style="color:#96D0FF">${WEBHOOK_URL:-http://localhost:5678/}</span></span>
<span class="line"><span style="color:#8DDB8C">    OFFLOAD_MANUAL_EXECUTIONS_TO_WORKERS</span><span style="color:#ADBAC7">: </span><span style="color:#96D0FF">"true"</span></span>
<span class="line"><span style="color:#8DDB8C">  depends_on</span><span style="color:#ADBAC7">:</span></span>
<span class="line"><span style="color:#ADBAC7">    - </span><span style="color:#96D0FF">redis</span></span></code></pre></div>
					</div>
		<span class="screen-reader-text" aria-live="polite" data-ktb-copy-status=""></span>
	</section>
	

<h3 class="wp-block-heading" id="i-6">WorkerとTask Runner</h3>

<p class="wp-block-paragraph">WorkerはRedisからジョブを取得して実行します。Task Runnerを外部モードで使う場合、公式ドキュメントではQueue Modeの各Workerに専用sidecarを持たせる構成が案内されています。n8n本体と n8nio/runners のバージョンも揃えます。</p>

	<section class="ktb-card ktb-command" aria-label="WorkerとRunnerを1対1で持たせる">
		<div class="ktb-terminal-bar">
			<span class="ktb-terminal-dots" aria-hidden="true"><i></i><i></i><i></i></span>
			<strong>WorkerとRunnerを1対1で持たせる</strong>
			<span class="ktb-shell">YAML</span>
			<button type="button" class="ktb-copy" data-ktb-copy="scyra-command-5" aria-label="コマンドをコピー">COPY</button>
		</div>
		<div class="ktb-terminal-body">
			<div class="ktb-command-line"><span aria-hidden="true">$</span><pre id="scyra-command-5"><code class="language-yaml" data-hl="done"><span class="line"><span style="color:#8DDB8C">x-n8n-worker-env</span><span style="color:#ADBAC7">: </span><span style="color:#F47067">&#x26;</span><span style="color:#F69D50">n8n-worker-env</span></span>
<span class="line"><span style="color:#6CB6FF">  &#x3C;&#x3C;</span><span style="color:#ADBAC7">: </span><span style="color:#F47067">*</span><span style="color:#ADBAC7">n8n-env</span></span>
<span class="line"><span style="color:#8DDB8C">  N8N_RUNNERS_ENABLED</span><span style="color:#ADBAC7">: </span><span style="color:#96D0FF">"true"</span></span>
<span class="line"><span style="color:#8DDB8C">  N8N_RUNNERS_MODE</span><span style="color:#ADBAC7">: </span><span style="color:#96D0FF">external</span></span>
<span class="line"><span style="color:#8DDB8C">  N8N_RUNNERS_BROKER_LISTEN_ADDRESS</span><span style="color:#ADBAC7">: </span><span style="color:#6CB6FF">0.0.0.0</span></span>
<span class="line"><span style="color:#8DDB8C">  N8N_RUNNERS_AUTH_TOKEN</span><span style="color:#ADBAC7">: </span><span style="color:#96D0FF">${N8N_RUNNERS_AUTH_TOKEN:?N8N_RUNNERS_AUTH_TOKEN is required}</span></span>
<span class="line"></span>
<span class="line"><span style="color:#8DDB8C">n8n-worker</span><span style="color:#ADBAC7">:</span></span>
<span class="line"><span style="color:#6CB6FF">  &#x3C;&#x3C;</span><span style="color:#ADBAC7">: </span><span style="color:#F47067">*</span><span style="color:#ADBAC7">n8n-shared</span></span>
<span class="line"><span style="color:#8DDB8C">  command</span><span style="color:#ADBAC7">: </span><span style="color:#96D0FF">worker</span></span>
<span class="line"><span style="color:#8DDB8C">  environment</span><span style="color:#ADBAC7">:</span></span>
<span class="line"><span style="color:#6CB6FF">    &#x3C;&#x3C;</span><span style="color:#ADBAC7">: </span><span style="color:#F47067">*</span><span style="color:#ADBAC7">n8n-worker-env</span></span>
<span class="line"><span style="color:#8DDB8C">  depends_on</span><span style="color:#ADBAC7">:</span></span>
<span class="line"><span style="color:#ADBAC7">    - </span><span style="color:#96D0FF">redis</span></span>
<span class="line"><span style="color:#ADBAC7">    - </span><span style="color:#96D0FF">n8n-worker-runner</span></span>
<span class="line"></span>
<span class="line"><span style="color:#8DDB8C">n8n-worker-runner</span><span style="color:#ADBAC7">:</span></span>
<span class="line"><span style="color:#8DDB8C">  image</span><span style="color:#ADBAC7">: </span><span style="color:#96D0FF">n8nio/runners:${N8N_VERSION:-2.25.7}</span></span>
<span class="line"><span style="color:#8DDB8C">  restart</span><span style="color:#ADBAC7">: </span><span style="color:#96D0FF">unless-stopped</span></span>
<span class="line"><span style="color:#8DDB8C">  environment</span><span style="color:#ADBAC7">:</span></span>
<span class="line"><span style="color:#8DDB8C">    N8N_RUNNERS_AUTH_TOKEN</span><span style="color:#ADBAC7">: </span><span style="color:#96D0FF">${N8N_RUNNERS_AUTH_TOKEN:?N8N_RUNNERS_AUTH_TOKEN is required}</span></span>
<span class="line"><span style="color:#8DDB8C">    N8N_RUNNERS_TASK_BROKER_URI</span><span style="color:#ADBAC7">: </span><span style="color:#96D0FF">http://n8n-worker:5679</span></span></code></pre></div>
					</div>
		<span class="screen-reader-text" aria-live="polite" data-ktb-copy-status=""></span>
	</section>
	

<p class="wp-block-paragraph">Workerを2台にする場合は、n8n-worker-2 と n8n-worker-runner-2 を同じ考え方で追加します。docker compose –scale で増やす方法も考えられますが、Runnerとの対応を明示したいなら個別定義の方が読みやすくなります。</p>

<h2 class="wp-block-heading" id="i-7">RedisとPostgreSQL</h2>

<p class="wp-block-paragraph">Redisはコンテナ間通信だけで使うため、基本的には外部へポート公開しません。PostgreSQLはローカル検証ではCompose内で起動し、長期運用ではバックアップや可用性を考えて外部DBやマネージドDBへ移す選択肢があります。</p>

	<section class="ktb-card ktb-command" aria-label="RedisとPostgreSQL">
		<div class="ktb-terminal-bar">
			<span class="ktb-terminal-dots" aria-hidden="true"><i></i><i></i><i></i></span>
			<strong>RedisとPostgreSQL</strong>
			<span class="ktb-shell">YAML</span>
			<button type="button" class="ktb-copy" data-ktb-copy="scyra-command-6" aria-label="コマンドをコピー">COPY</button>
		</div>
		<div class="ktb-terminal-body">
			<div class="ktb-command-line"><span aria-hidden="true">$</span><pre id="scyra-command-6"><code class="language-yaml" data-hl="done"><span class="line"><span style="color:#8DDB8C">redis</span><span style="color:#ADBAC7">:</span></span>
<span class="line"><span style="color:#8DDB8C">  image</span><span style="color:#ADBAC7">: </span><span style="color:#96D0FF">redis:8-alpine</span></span>
<span class="line"><span style="color:#8DDB8C">  restart</span><span style="color:#ADBAC7">: </span><span style="color:#96D0FF">unless-stopped</span></span>
<span class="line"><span style="color:#8DDB8C">  command</span><span style="color:#ADBAC7">: </span><span style="color:#F47067">></span></span>
<span class="line"><span style="color:#96D0FF">    redis-server --requirepass ${REDIS_PASSWORD:?REDIS_PASSWORD is required}</span></span>
<span class="line"></span>
<span class="line"><span style="color:#8DDB8C">postgres</span><span style="color:#ADBAC7">:</span></span>
<span class="line"><span style="color:#8DDB8C">  image</span><span style="color:#ADBAC7">: </span><span style="color:#96D0FF">postgres:17-alpine</span></span>
<span class="line"><span style="color:#8DDB8C">  restart</span><span style="color:#ADBAC7">: </span><span style="color:#96D0FF">unless-stopped</span></span>
<span class="line"><span style="color:#8DDB8C">  profiles</span><span style="color:#ADBAC7">:</span></span>
<span class="line"><span style="color:#ADBAC7">    - </span><span style="color:#96D0FF">local-db</span></span>
<span class="line"><span style="color:#8DDB8C">  environment</span><span style="color:#ADBAC7">:</span></span>
<span class="line"><span style="color:#8DDB8C">    POSTGRES_DB</span><span style="color:#ADBAC7">: </span><span style="color:#96D0FF">n8n_cluster</span></span>
<span class="line"><span style="color:#8DDB8C">    POSTGRES_USER</span><span style="color:#ADBAC7">: </span><span style="color:#96D0FF">n8n</span></span>
<span class="line"><span style="color:#8DDB8C">    POSTGRES_PASSWORD</span><span style="color:#ADBAC7">: </span><span style="color:#96D0FF">${POSTGRES_PASSWORD:?POSTGRES_PASSWORD is required}</span></span>
<span class="line"><span style="color:#8DDB8C">  volumes</span><span style="color:#ADBAC7">:</span></span>
<span class="line"><span style="color:#ADBAC7">    - </span><span style="color:#96D0FF">postgres-data:/var/lib/postgresql/data</span></span></code></pre></div>
					</div>
		<span class="screen-reader-text" aria-live="polite" data-ktb-copy-status=""></span>
	</section>
	

<h2 class="wp-block-heading" id="i-8">起動と確認</h2>

	<section class="ktb-card ktb-command" aria-label="ローカルDB込みで起動する">
		<div class="ktb-terminal-bar">
			<span class="ktb-terminal-dots" aria-hidden="true"><i></i><i></i><i></i></span>
			<strong>ローカルDB込みで起動する</strong>
			<span class="ktb-shell">BASH</span>
			<button type="button" class="ktb-copy" data-ktb-copy="scyra-command-7" aria-label="コマンドをコピー">COPY</button>
		</div>
		<div class="ktb-terminal-body">
			<div class="ktb-command-line"><span aria-hidden="true">$</span><pre id="scyra-command-7"><code class="language-bash" data-hl="done"><span class="line"><span style="color:#F69D50">docker</span><span style="color:#96D0FF"> compose</span><span style="color:#6CB6FF"> --profile</span><span style="color:#96D0FF"> local-db</span><span style="color:#96D0FF"> up</span><span style="color:#6CB6FF"> -d</span></span>
<span class="line"><span style="color:#F69D50">docker</span><span style="color:#96D0FF"> compose</span><span style="color:#96D0FF"> ps</span></span>
<span class="line"><span style="color:#F69D50">curl</span><span style="color:#6CB6FF"> -s</span><span style="color:#96D0FF"> http://localhost:5678/healthz</span></span></code></pre></div>
			<pre class="ktb-output" aria-label="実行結果"><code class="language-text" data-hl="done"><span class="line"><span>{"status":"ok"}</span></span></code></pre>		</div>
		<span class="screen-reader-text" aria-live="polite" data-ktb-copy-status=""></span>
	</section>
	

<p class="wp-block-paragraph">問題が起きたら、まず docker compose ps で全体を見てから、Main、Worker、Redis、PostgreSQLのログへ分けて追います。役割が分かれているぶん、どこを見るかを決めやすいのがQueue Modeの良いところです。</p>

	<section class="ktb-card ktb-command" aria-label="ログを確認する">
		<div class="ktb-terminal-bar">
			<span class="ktb-terminal-dots" aria-hidden="true"><i></i><i></i><i></i></span>
			<strong>ログを確認する</strong>
			<span class="ktb-shell">BASH</span>
			<button type="button" class="ktb-copy" data-ktb-copy="scyra-command-8" aria-label="コマンドをコピー">COPY</button>
		</div>
		<div class="ktb-terminal-body">
			<div class="ktb-command-line"><span aria-hidden="true">$</span><pre id="scyra-command-8"><code class="language-bash" data-hl="done"><span class="line"><span style="color:#F69D50">docker</span><span style="color:#96D0FF"> compose</span><span style="color:#96D0FF"> logs</span><span style="color:#6CB6FF"> -f</span><span style="color:#96D0FF"> n8n-main</span></span>
<span class="line"><span style="color:#F69D50">docker</span><span style="color:#96D0FF"> compose</span><span style="color:#96D0FF"> logs</span><span style="color:#6CB6FF"> -f</span><span style="color:#96D0FF"> n8n-worker</span></span>
<span class="line"><span style="color:#F69D50">docker</span><span style="color:#96D0FF"> compose</span><span style="color:#96D0FF"> logs</span><span style="color:#6CB6FF"> -f</span><span style="color:#96D0FF"> redis</span></span>
<span class="line"><span style="color:#F69D50">docker</span><span style="color:#96D0FF"> compose</span><span style="color:#96D0FF"> logs</span><span style="color:#6CB6FF"> -f</span><span style="color:#96D0FF"> postgres</span></span></code></pre></div>
					</div>
		<span class="screen-reader-text" aria-live="polite" data-ktb-copy-status=""></span>
	</section>
	

<h2 class="wp-block-heading" id="i-9">Workerを片方ずつ更新する</h2>

<p class="wp-block-paragraph">Workerを複数にしていると、片方ずつ止めて更新する運用を試せます。ただし、長時間実行中のジョブを必ず無停止で守れるという意味ではありません。N8N_GRACEFUL_SHUTDOWN_TIMEOUT などで停止待ち時間を取りつつ、更新後にRedisとDBへ再接続できていることを確認します。</p>

	<section class="ktb-card ktb-command" aria-label="Worker 2から更新する例">
		<div class="ktb-terminal-bar">
			<span class="ktb-terminal-dots" aria-hidden="true"><i></i><i></i><i></i></span>
			<strong>Worker 2から更新する例</strong>
			<span class="ktb-shell">BASH</span>
			<button type="button" class="ktb-copy" data-ktb-copy="scyra-command-9" aria-label="コマンドをコピー">COPY</button>
		</div>
		<div class="ktb-terminal-body">
			<div class="ktb-command-line"><span aria-hidden="true">$</span><pre id="scyra-command-9"><code class="language-bash" data-hl="done"><span class="line"><span style="color:#F69D50">docker</span><span style="color:#96D0FF"> compose</span><span style="color:#96D0FF"> stop</span><span style="color:#6CB6FF"> -t</span><span style="color:#6CB6FF"> 300</span><span style="color:#96D0FF"> n8n-worker-2</span></span>
<span class="line"><span style="color:#F69D50">docker</span><span style="color:#96D0FF"> compose</span><span style="color:#96D0FF"> stop</span><span style="color:#96D0FF"> n8n-worker-runner-2</span></span>
<span class="line"><span style="color:#F69D50">docker</span><span style="color:#96D0FF"> compose</span><span style="color:#96D0FF"> pull</span><span style="color:#96D0FF"> n8n-worker-2</span><span style="color:#96D0FF"> n8n-worker-runner-2</span></span>
<span class="line"><span style="color:#F69D50">docker</span><span style="color:#96D0FF"> compose</span><span style="color:#96D0FF"> up</span><span style="color:#6CB6FF"> -d</span><span style="color:#96D0FF"> n8n-worker-runner-2</span><span style="color:#96D0FF"> n8n-worker-2</span></span>
<span class="line"><span style="color:#F69D50">docker</span><span style="color:#96D0FF"> compose</span><span style="color:#96D0FF"> ps</span></span></code></pre></div>
					</div>
		<span class="screen-reader-text" aria-live="polite" data-ktb-copy-status=""></span>
	</section>
	

<h2 class="wp-block-heading" id="i-10">バックアップで忘れてはいけないもの</h2>

<p class="wp-block-paragraph">PostgreSQLにはWorkflow、Credential、実行履歴などが入ります。さらにCredentialの復号には N8N_ENCRYPTION_KEY が必要です。DBだけバックアップしても、暗号化キーを失うとCredentialを復号できません。</p>

	<section class="ktb-card ktb-command" aria-label="PostgreSQLをバックアップする">
		<div class="ktb-terminal-bar">
			<span class="ktb-terminal-dots" aria-hidden="true"><i></i><i></i><i></i></span>
			<strong>PostgreSQLをバックアップする</strong>
			<span class="ktb-shell">BASH</span>
			<button type="button" class="ktb-copy" data-ktb-copy="scyra-command-10" aria-label="コマンドをコピー">COPY</button>
		</div>
		<div class="ktb-terminal-body">
			<div class="ktb-command-line"><span aria-hidden="true">$</span><pre id="scyra-command-10"><code class="language-bash" data-hl="done"><span class="line"><span style="color:#F69D50">docker</span><span style="color:#96D0FF"> compose</span><span style="color:#96D0FF"> exec</span><span style="color:#96D0FF"> postgres</span><span style="color:#96D0FF"> pg_dump</span><span style="color:#6CB6FF"> -U</span><span style="color:#96D0FF"> n8n</span><span style="color:#96D0FF"> n8n_cluster</span><span style="color:#F47067"> ></span><span style="color:#96D0FF"> backup.sql</span></span>
<span class="line"><span style="color:#768390"># restore</span></span>
<span class="line"><span style="color:#F69D50">docker</span><span style="color:#96D0FF"> compose</span><span style="color:#96D0FF"> exec</span><span style="color:#6CB6FF"> -T</span><span style="color:#96D0FF"> postgres</span><span style="color:#96D0FF"> psql</span><span style="color:#6CB6FF"> -U</span><span style="color:#96D0FF"> n8n</span><span style="color:#96D0FF"> n8n_cluster</span><span style="color:#F47067"> &#x3C;</span><span style="color:#96D0FF"> backup.sql</span></span></code></pre></div>
					</div>
		<span class="screen-reader-text" aria-live="polite" data-ktb-copy-status=""></span>
	</section>
	

<h2 class="wp-block-heading" id="i-11">ハマりやすいところ</h2>

	<section class="ktb-card ktb-troubleshoot ktb-severity-warning" aria-label="Workerがジョブを処理しない">
		<div class="ktb-card__header">
			<span class="ktb-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><path d="M12 3 2.8 19h18.4L12 3Z"></path><path d="M12 9v4M12 17h.01"></path></svg></span>
			<div><span class="ktb-eyebrow">TROUBLESHOOTING</span><strong class="ktb-card__title">Workerがジョブを処理しない</strong></div>
		</div>
		<div class="ktb-diagnostic-grid">
			<div><span class="ktb-diagnostic-label">症状 <small>SYMPTOM</small></span><p>Workflowが実行待ちのまま進まない、またはWorkerのログにRedisやDB接続エラーが出る。</p></div>
			<div><span class="ktb-diagnostic-label">考えられる原因 <small>LIKELY CAUSE</small></span><p>Redis接続情報、PostgreSQL接続情報、N8N_ENCRYPTION_KEY、Runner認証トークンの不一致が考えられます。</p></div>
		</div>
		<div class="ktb-checks">
			<span class="ktb-diagnostic-label">確認すること <small>CHECKLIST</small></span>
			<ul>
									<li>MainとWorkerでN8N_ENCRYPTION_KEYが一致しているか</li>
									<li>WorkerがRedisとPostgreSQLへ接続できているか</li>
									<li>n8n本体とRunnerのバージョンが揃っているか</li>
									<li>Queue ModeでN8N_DEFAULT_BINARY_DATA_MODE=databaseになっているか</li>
									<li>Runnerごとに正しいN8N_RUNNERS_AUTH_TOKENを共有しているか</li>
							</ul>
		</div>
		<div class="ktb-resolution"><strong>解決の方向 <small>RESOLUTION</small></strong><p>まずdocker compose psと各コンテナのログを確認し、Redis、DB、暗号化キー、Runner接続の順に切り分けます。</p></div>	</section>
	

<h2 class="wp-block-heading" id="i-12">参考にした公式ドキュメント</h2>

<ul class="wp-block-list">
<li><a href="https://docs.n8n.io/hosting/scaling/queue-mode/" target="_blank" rel="noreferrer noopener">Configuring queue mode | n8n Docs</a></li>
<li><a href="https://docs.n8n.io/hosting/configuration/task-runners/" target="_blank" rel="noreferrer noopener">Task runners | n8n Docs</a></li>
<li><a href="https://docs.n8n.io/hosting/scaling/binary-data/" target="_blank" rel="noreferrer noopener">Binary data | n8n Docs</a></li>
</ul>

<h2 class="wp-block-heading" id="i-13">使ってみた感想</h2>

<p class="wp-block-paragraph">Queue Modeは、単にWorkerを増やすためだけの機能ではなく、n8nの処理を役割ごとに見えるようにする構成だと感じました。Main、Worker、Runner、Redis、PostgreSQLの境界がはっきりすると、ログを見る場所や更新時に気をつける場所も決めやすくなります。</p>

<p class="wp-block-paragraph">一方で、構成要素は増えます。最初から大きな負荷があるかどうかより、ワークフローを継続的に育てるつもりがあるか、Code Nodeをどの程度使うか、更新やバックアップをどう考えるかで採用を判断するのが良さそうです。</p>

	<section class="ktb-card ktb-summary ktb-tone-blue" aria-label="まとめ">
		<div class="ktb-card__header">
			<span class="ktb-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><path d="M5 5h14M5 12h10M5 19h7"></path><path d="m16 16 2 2 4-5"></path></svg></span>
			<div><span class="ktb-eyebrow">WRAP UP</span><strong class="ktb-card__title">まとめ</strong></div>
		</div>
		<div class="ktb-summary__body">
			<p class="ktb-summary__lead">n8n Queue Modeは、受付と実行を分けて運用しやすくするための構成です。</p>			<ul class="ktb-summary__points">
									<li><span aria-hidden="true">✓</span><strong>MainはUI、Webhook、Trigger管理を担当する</strong></li>
									<li><span aria-hidden="true">✓</span><strong>WorkerはRedisからジョブを取得して実行する</strong></li>
									<li><span aria-hidden="true">✓</span><strong>Task RunnerはCode Nodeの実行をn8n本体から分ける</strong></li>
									<li><span aria-hidden="true">✓</span><strong>Redisはキュー、PostgreSQLは永続データとして役割を分けて見る</strong></li>
									<li><span aria-hidden="true">✓</span><strong>Queue Modeだけで全体が無停止になるわけではない</strong></li>
							</ul>
			<p class="ktb-summary__takeaway"><span>TAKEAWAY</span>個人環境でも、n8nを長く育てるなら、役割分離された構成にしておくと更新・調査・拡張の見通しが良くなります。</p>		</div>
	</section>
]]></content:encoded>
  </item>
  <item>
    <title>自作PC始めました（準備編）</title>
    <link>https://miko.info/2024/03/07/my-pc-start/</link>
    <guid isPermaLink="false">https://miko.info/?p=2680</guid>
    <pubDate>Thu, 07 Mar 2024 14:48:04 GMT</pubDate>
    <dc:creator>miko</dc:creator>
    <category><![CDATA[趣味]]></category>
    <description><![CDATA[思い立ったが吉日。自作PC初めて見ました。 コンセプトはコンパクトで持ち運べるオシャレなPCです。見た目重視でスペックは気にしないことにしました😑 少しずつパー…]]></description>
    <content:encoded><![CDATA[<p class="wp-block-paragraph">思い立ったが吉日。自作PC初めて見ました。</p>

<p class="wp-block-paragraph">コンセプトはコンパクトで持ち運べるオシャレなPCです。見た目重視でスペックは気にしないことにしました😑</p>

<p class="wp-block-paragraph">少しずつパーツを購入していき、組み立て行こうと思います。</p>

<h2 class="wp-block-heading" id="i-0">ケース(Fractal Design Terra)</h2>

<p class="wp-block-paragraph">オシャレケース言えば、Fractal Design！</p>

<p class="wp-block-paragraph">Fractal Design Terraを購入しました。</p>

<p class="wp-block-paragraph">箱から取り出してみると、何やらしっかりとした布で覆われていました・・・。</p>

<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="768" src="https://miko.info/wp-content/uploads/2024/03/IMG_1756-1024x768.webp" alt=""></figure>

<p class="wp-block-paragraph">早速ケースを確認してみましょう！</p>

<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="768" src="https://miko.info/wp-content/uploads/2024/03/IMG_1757-1024x768.webp" alt=""></figure>

<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="1920" height="2560" src="https://miko.info/wp-content/uploads/2024/03/IMG_1759-scaled.webp" alt=""></figure>

<p class="wp-block-paragraph">めっちゃカッコいいですね。<br>MiniITXケースなので色々と制限がありますが、制限がある中での作業も楽しいものです。</p>

<h2 class="wp-block-heading" id="i-1">CPUクーラー</h2>

<p class="wp-block-paragraph">推しメーカー「NOCTUA」のCPUクーラー「NH-L9i-17xx chroma.black」を購入しました。</p>

<p class="wp-block-paragraph">NOCTUAといえば、独特なカラーリングのファンで有名ですが、<br>今回は黒一色の製品を選んでみました。</p>

<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="768" src="https://miko.info/wp-content/uploads/2024/03/IMG_1761-1024x768.webp" alt=""></figure>

<p class="wp-block-paragraph">各パーツは黒一色にしてみたいなーとか考えているので、ボーッと気に入ったパーツを探して購入していきます。</p>

<p class="wp-block-paragraph">まだまだ、CPUとかグラボ、GPU、電源とか決まっていないので、<br>作業を開始するのがいつかもわかっていません。</p>

<p class="wp-block-paragraph">まぁ、いつか完成するでしょ！</p>
]]></content:encoded>
  </item>
  <item>
    <title>【Svelte】SvelteKitを使ってサンプルコードを書いてみる</title>
    <link>https://miko.info/sveltekit-start/</link>
    <guid isPermaLink="false">https://miko.info/?p=2604</guid>
    <pubDate>Mon, 09 Jan 2023 11:42:47 GMT</pubDate>
    <dc:creator>miko</dc:creator>
    <category><![CDATA[Svelte]]></category>
    <description><![CDATA[Svelteを触ったからには「SvelteKit」を触らないといけない気がしたので、DEMOプロジェクトにあるカウンターアプリだけを写経してみました。 プロジェ…]]></description>
    <content:encoded><![CDATA[Svelteを触ったからには「<a href="https://kit.svelte.jp/" target="_blank" rel="noopener" title="">SvelteKit</a>」を触らないといけない気がしたので、<br>DEMOプロジェクトにあるカウンターアプリだけを写経してみました。

<h2 class="wp-block-heading" id="i-0">プロジェクトを作成する</h2>

<pre class="code" data-lang="text" data-title="プロジェクト作成"><code class="language-text" data-hl="done"><span class="line"><span>npm create svelte@latest sveltekit-counter</span></span>
<span class="line"><span></span></span>
<span class="line"><span>? Which Svelte app template? </span></span>
<span class="line"><span>> Skeleton project</span></span>
<span class="line"><span></span></span>
<span class="line"><span>? Add type checking with TypeScript?</span></span>
<span class="line"><span>> Yes, using TypeScript syntax</span></span>
<span class="line"><span></span></span>
<span class="line"><span># それ以降の質問はお好きにどうぞ。</span></span></code></pre>

<pre class="code" data-lang="text" data-title="モジュールインストール"><code class="language-text" data-hl="done"><span class="line"><span>cd sveltekit-counter</span></span>
<span class="line"><span>npm install</span></span></code></pre>

<pre class="code" data-lang="text" data-title="実行してみる"><code class="language-text" data-hl="done"><span class="line"><span>npm run dev</span></span></code></pre>

ターミナルにURLが出力されているので、そこにアクセスし、<br>以下の画面が表示されればOKです。

<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="420" height="130" src="https://miko.info/wp-content/uploads/2023/01/image-9.png" alt=""></figure>

<h3 class="wp-block-heading" id="i-1">プロジェクト構成を確認してみる</h3>

コマンドで作成されたプロジェクトファイルは以下の通りです。

<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="221" height="692" src="https://miko.info/wp-content/uploads/2023/01/image-7.png" alt=""></figure>

今回触るのは<span class="keiko_blue">src</span>ディレクトリ内だけですが、<br>プロジェクト構成の詳細が気になる方は<a href="https://kit.svelte.jp/docs/project-structure" target="_blank" rel="noopener" title="">こちらのページ</a>を参照してください。

<h2 class="wp-block-heading" id="i-2">カウンターアプリを作ってみる</h2>

今回追加・修正するファイルは以下の通りです。

<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="205" height="167" src="https://miko.info/wp-content/uploads/2023/01/image-8.png" alt=""></figure>

ファイル名の先頭に「＋」があり、ん？？と思うかもしれませんが、<br>間違いではありません。

<div class="wp-block-sgb-box sng-box box6">
「＋」の接頭辞が付いているファイルはルートファイルと呼ばれ、<br>route内のディレクトリには１つ以上のルートファイルを格納します。

ルートファイルについて詳しく知りたい方は、<a href="https://kit.svelte.jp/docs/routing" target="_blank" rel="noopener" title="">こちらのページ</a>を参照してください。
</div>

<h3 class="wp-block-heading" id="i-3">初期表示される画面の内容をいじってみる</h3>

まずは、初期表示されている画面の内容を修正してみましょう。

<pre class="code" data-lang="text" data-title="+page.svelte"><code class="language-text" data-hl="done"><span class="line"><span>&#x3C;h1>Hello, world.&#x3C;/h1></span></span></code></pre>

保存後に画面を確認すると、「Hello, world.」と表示されているはずです。

<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="241" height="76" src="https://miko.info/wp-content/uploads/2023/01/image-10.png" alt=""></figure>

<h3 class="wp-block-heading" id="i-4">カウンター用のコードを書く</h3>

routesディレクトリの中にファイル「<span class="keiko_green">Counter.svelte</span>」を作成します。

<pre class="code" data-lang="text" data-title="Counter.svelt"><code class="language-text" data-hl="done"><span class="line"><span>&#x3C;script lang="ts"></span></span>
<span class="line"><span>    let count = 0;</span></span>
<span class="line"><span>&#x3C;/script></span></span>
<span class="line"><span></span></span>
<span class="line"><span>&#x3C;div class="counter"></span></span>
<span class="line"><span>    &#x3C;strong>{count}&#x3C;/strong></span></span>
<span class="line"><span>&#x3C;/div></span></span></code></pre>

作成したConterコンポーネントを呼び出してみましょう。

<pre class="code" data-lang="text" data-title="+page.svelte"><code class="language-text" data-hl="done"><span class="line"><span>&#x3C;script></span></span>
<span class="line"><span>    import Counter from './Counter.svelte';</span></span>
<span class="line"><span>&#x3C;/script></span></span>
<span class="line"><span></span></span>
<span class="line"><span>&#x3C;Counter /></span></span></code></pre>

画面に「０」と表示されていればOKです。

<h3 class="wp-block-heading" id="i-5">カウントアップ・ダウン用のボタンを追加する</h3>

「＋」「ー」ボタンを追加し、「count」の値を変更させましょう。

<pre class="code" data-lang="text" data-title="Counter.svelte"><code class="language-text" data-hl="done"><span class="line"><span>&#x3C;button on:click={() => (count -= 1)}></span></span>
<span class="line"><span>    &#x3C;svg aria-hidden="true" viewBox="0 0 1 1"></span></span>
<span class="line"><span>        &#x3C;path d="M0,0.5 L1,0.5" /></span></span>
<span class="line"><span>    &#x3C;/svg></span></span>
<span class="line"><span>&#x3C;/button></span></span>
<span class="line"><span>&#x3C;strong>{count}&#x3C;/strong></span></span>
<span class="line"><span>&#x3C;button on:click={() => (count += 1)}></span></span>
<span class="line"><span>    &#x3C;svg aria-hidden="true" viewBox="0 0 1 1"></span></span>
<span class="line"><span>        &#x3C;path d="M0,0.5 L1,0.5 M0.5,0 L0.5,1" /></span></span>
<span class="line"><span>    &#x3C;/svg></span></span>
<span class="line"><span>&#x3C;/button></span></span>
<span class="line"><span></span></span>
<span class="line"><span>&#x3C;style></span></span>
<span class="line"><span>    .counter {</span></span>
<span class="line"><span>        display: flex;</span></span>
<span class="line"><span>        margin: 1rem 0;</span></span>
<span class="line"><span>    }</span></span>
<span class="line"><span></span></span>
<span class="line"><span>    .counter button {</span></span>
<span class="line"><span>        width: 2em;</span></span>
<span class="line"><span>        padding: 0;</span></span>
<span class="line"><span>        display: flex;</span></span>
<span class="line"><span>        align-items: center;</span></span>
<span class="line"><span>        justify-content: center;</span></span>
<span class="line"><span>        border: 0;</span></span>
<span class="line"><span>        background-color: transparent;</span></span>
<span class="line"><span>        touch-action: manipulation;</span></span>
<span class="line"><span>        font-size: 2rem;</span></span>
<span class="line"><span>    }</span></span>
<span class="line"><span></span></span>
<span class="line"><span>    svg {</span></span>
<span class="line"><span>        width: 25%;</span></span>
<span class="line"><span>        height: 25%;</span></span>
<span class="line"><span>    }</span></span>
<span class="line"><span></span></span>
<span class="line"><span>    path {</span></span>
<span class="line"><span>        vector-effect: non-scaling-stroke;</span></span>
<span class="line"><span>        stroke-width: 2px;</span></span>
<span class="line"><span>        stroke: #444;</span></span>
<span class="line"><span>    }</span></span>
<span class="line"><span>&#x3C;/style></span></span></code></pre>

「ー」「＋」ボタンをクリックして、カウントが変わればOKです。

<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="126" height="49" src="https://miko.info/wp-content/uploads/2023/01/image-11.png" alt=""></figure>

<h3 class="wp-block-heading" id="i-6">アニメーションをつける</h3>

springを利用してカウンターのように数字がスクロールして表示させてみます。

<figure class="wp-block-image size-full is-resized"><img loading="lazy" decoding="async" src="https://miko.info/wp-content/uploads/2023/01/image-12.png" alt="" width="129" height="129">

<figcaption class="wp-element-caption">カウンターのイメージ</figcaption>

</figure>

コードは以下の通りです。

<pre class="code" data-lang="text" data-title="Counter.svelte"><code class="language-text" data-hl="done"><span class="line"><span>&#x3C;script lang="ts"></span></span>
<span class="line"><span>    import { spring } from 'svelte/motion';</span></span>
<span class="line"><span></span></span>
<span class="line"><span>    let count = 0;</span></span>
<span class="line"><span>    const displayed_count = spring();</span></span>
<span class="line"><span></span></span>
<span class="line"><span>    $: displayed_count.set(count);</span></span>
<span class="line"><span>    $: offset = modulo($displayed_count, 1);</span></span>
<span class="line"><span></span></span>
<span class="line"><span>    function modulo(n: number, m: number) {</span></span>
<span class="line"><span>        return ((n % m) + m) % m;</span></span>
<span class="line"><span>    }</span></span>
<span class="line"><span>&#x3C;/script></span></span>
<span class="line"><span></span></span>
<span class="line"><span>&#x3C;div class="counter"></span></span>
<span class="line"><span>    &#x3C;button on:click={() => (count -= 1)}></span></span>
<span class="line"><span>        &#x3C;svg aria-hidden="true" viewBox="0 0 1 1"></span></span>
<span class="line"><span>            &#x3C;path d="M0,0.5 L1,0.5" /></span></span>
<span class="line"><span>        &#x3C;/svg></span></span>
<span class="line"><span>    &#x3C;/button></span></span>
<span class="line"><span>    &#x3C;div class="counter-viewport"></span></span>
<span class="line"><span>        &#x3C;div class="counter-digits" style="transform: translate(0, {100 * offset}%)"></span></span>
<span class="line"><span>            &#x3C;strong class="hidden" aria-hidden="true">{Math.floor($displayed_count + 1)}&#x3C;/strong></span></span>
<span class="line"><span>            &#x3C;strong>{Math.floor($displayed_count)}&#x3C;/strong></span></span>
<span class="line"><span>        &#x3C;/div></span></span>
<span class="line"><span>    &#x3C;/div></span></span>
<span class="line"><span>    &#x3C;button on:click={() => (count += 1)}></span></span>
<span class="line"><span>        &#x3C;svg aria-hidden="true" viewBox="0 0 1 1"></span></span>
<span class="line"><span>            &#x3C;path d="M0,0.5 L1,0.5 M0.5,0 L0.5,1" /></span></span>
<span class="line"><span>        &#x3C;/svg></span></span>
<span class="line"><span>    &#x3C;/button></span></span>
<span class="line"><span>&#x3C;/div></span></span>
<span class="line"><span></span></span>
<span class="line"><span>&#x3C;style></span></span>
<span class="line"><span>    .counter {</span></span>
<span class="line"><span>        display: flex;</span></span>
<span class="line"><span>        margin: 1rem 0;</span></span>
<span class="line"><span>    }</span></span>
<span class="line"><span></span></span>
<span class="line"><span>    .counter button {</span></span>
<span class="line"><span>        width: 2em;</span></span>
<span class="line"><span>        padding: 0;</span></span>
<span class="line"><span>        display: flex;</span></span>
<span class="line"><span>        align-items: center;</span></span>
<span class="line"><span>        justify-content: center;</span></span>
<span class="line"><span>        border: 0;</span></span>
<span class="line"><span>        background-color: transparent;</span></span>
<span class="line"><span>        touch-action: manipulation;</span></span>
<span class="line"><span>        font-size: 2rem;</span></span>
<span class="line"><span>    }</span></span>
<span class="line"><span></span></span>
<span class="line"><span>    .counter button:hover {</span></span>
<span class="line"><span>        background-color: var(--color-bg-1);</span></span>
<span class="line"><span>    }</span></span>
<span class="line"><span></span></span>
<span class="line"><span>    svg {</span></span>
<span class="line"><span>        width: 25%;</span></span>
<span class="line"><span>        height: 25%;</span></span>
<span class="line"><span>    }</span></span>
<span class="line"><span></span></span>
<span class="line"><span>    path {</span></span>
<span class="line"><span>        vector-effect: non-scaling-stroke;</span></span>
<span class="line"><span>        stroke-width: 2px;</span></span>
<span class="line"><span>        stroke: #444;</span></span>
<span class="line"><span>    }</span></span>
<span class="line"><span></span></span>
<span class="line"><span>    .counter-viewport {</span></span>
<span class="line"><span>        width: 8em;</span></span>
<span class="line"><span>        height: 4em;</span></span>
<span class="line"><span>        overflow: hidden;</span></span>
<span class="line"><span>        text-align: center;</span></span>
<span class="line"><span>        position: relative;</span></span>
<span class="line"><span>    }</span></span>
<span class="line"><span></span></span>
<span class="line"><span>    .counter-viewport strong {</span></span>
<span class="line"><span>        position: absolute;</span></span>
<span class="line"><span>        display: flex;</span></span>
<span class="line"><span>        width: 100%;</span></span>
<span class="line"><span>        height: 100%;</span></span>
<span class="line"><span>        font-weight: 400;</span></span>
<span class="line"><span>        color: var(--color-theme-1);</span></span>
<span class="line"><span>        font-size: 4rem;</span></span>
<span class="line"><span>        align-items: center;</span></span>
<span class="line"><span>        justify-content: center;</span></span>
<span class="line"><span>    }</span></span>
<span class="line"><span></span></span>
<span class="line"><span>    .counter-digits {</span></span>
<span class="line"><span>        position: absolute;</span></span>
<span class="line"><span>        width: 100%;</span></span>
<span class="line"><span>        height: 100%;</span></span>
<span class="line"><span>    }</span></span>
<span class="line"><span></span></span>
<span class="line"><span>    .hidden {</span></span>
<span class="line"><span>        top: -100%;</span></span>
<span class="line"><span>        user-select: none;</span></span>
<span class="line"><span>    }</span></span>
<span class="line"><span>&#x3C;/style></span></span></code></pre>

動作確認してみましょう。

<figure class="wp-block-video aligncenter"><video height="94" style="aspect-ratio: 262 / 94;" width="262" controls="" loop="" muted="" src="https://miko.info/wp-content/uploads/2023/01/counter-1.mov"></video></figure>

<h4 class="wp-block-heading" id="i-7">「$:」について</h4>

コード内に「$:」とありすが、簡単に説明すると「count」の値が変わった時にしか動作しない処理です。

<pre class="code" data-lang="text" data-title="reactive"><code class="language-text" data-hl="done"><span class="line"><span>$: displayed_count.set(count);</span></span></code></pre>

最初なんやこれ？？って思ったけど、しばらく使っていると慣れました。<br>慣れって怖い。

<h3 class="wp-block-heading" id="i-8">レイアウト用のファイルを作成してみる</h3>

routesディレクトリ内に「<span class="keiko_blue">+layout.svelte</span>」を追加してみましょう。<br>追加後に画面を確認してみると何も表示されなくなっているはずです。

<span class="keiko_blue">+layout.svelte</span>が存在しない場合は、デフォルトとして以下のコードになっているようです。

<pre class="code" data-lang="text" data-title="+layout.svelte"><code class="language-text" data-hl="done"><span class="line"><span>&#x3C;slot /></span></span></code></pre>

今回使うことはないですが、ナビゲーションを追加してみましょう。

slotの部分に<span class="keiko_blue">+page.svelte</span>の内容が表示されると思ってもらえればOKです。

<pre class="code" data-lang="text" data-title="+layout.svelte"><code class="language-text" data-hl="done"><span class="line"><span>&#x3C;nav></span></span>
<span class="line"><span>    &#x3C;a href="https://miko.info/">Home&#x3C;/a></span></span>
<span class="line"><span>    &#x3C;a href="#">About&#x3C;/a></span></span>
<span class="line"><span>    &#x3C;a href="#">Settings&#x3C;/a></span></span>
<span class="line"><span>&#x3C;/nav></span></span>
<span class="line"><span></span></span>
<span class="line"><span>&#x3C;div class="app"></span></span>
<span class="line"><span>    &#x3C;slot /></span></span>
<span class="line"><span>&#x3C;/div></span></span></code></pre>

<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="277" height="122" src="https://miko.info/wp-content/uploads/2023/01/image-13.png" alt=""></figure>

以下のように+layout.svelteにて、全画面で使うCSSファイルをインポートしてもOKです。

<pre class="code" data-lang="text" data-title="+layout.svelte"><code class="language-text" data-hl="done"><span class="line"><span>&#x3C;script></span></span>
<span class="line"><span>    import './styles.css';</span></span>
<span class="line"><span>&#x3C;/script></span></span></code></pre>

<h2 class="wp-block-heading" id="i-9">ルーティングについて</h2>

ナビゲーションの「about」をクリックすると、ページ遷移するようにしてみます。

「http://localhost:[port]<span class="keiko_yellow">/about</span>」でアクセスするイメージです。

<h3 class="wp-block-heading" id="i-10">フォルダとファイルを作成する</h3>

以下のように、routesディレクトリ内にaboutフォルダ、+page.svelteファイルを作成します。

<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="203" height="85" src="https://miko.info/wp-content/uploads/2023/01/image-14.png" alt=""></figure>

<pre class="code" data-lang="text" data-title="+layout.svelte"><code class="language-text" data-hl="done"><span class="line"><span>&#x3C;nav></span></span>
<span class="line"><span>    &#x3C;a href="https://miko.info/">Home&#x3C;/a></span></span>
<span class="line"><span>    &#x3C;a href="https://miko.info/about">About&#x3C;/a></span></span>
<span class="line"><span>    &#x3C;a href="#">Settings&#x3C;/a></span></span>
<span class="line"><span>&#x3C;/nav></span></span>
<span class="line"><span></span></span>
<span class="line"><span>&#x3C;div class="app"></span></span>
<span class="line"><span>    &#x3C;slot /></span></span>
<span class="line"><span>&#x3C;/div></span></span></code></pre>

<pre class="code" data-lang="text" data-title="about/+page.svelte"><code class="language-text" data-hl="done"><span class="line"><span>&#x3C;h1>About&#x3C;/h1></span></span></code></pre>

ナビゲーションのAboutをクリックし、画面が遷移すればOKです。

<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="205" height="101" src="https://miko.info/wp-content/uploads/2023/01/image-15.png" alt=""></figure>

<h2 class="wp-block-heading" id="i-11">まとめ</h2>

ReactやVueと比べると読みやすい気がしているので、<br>しばらく触ってみる予定です。
]]></content:encoded>
  </item>
  <item>
    <title>はじめてのSvelte</title>
    <link>https://miko.info/svelte-start/</link>
    <guid isPermaLink="false">https://miko.info/?p=2575</guid>
    <pubDate>Sat, 07 Jan 2023 09:54:35 GMT</pubDate>
    <dc:creator>miko</dc:creator>
    <category><![CDATA[Svelte]]></category>
    <description><![CDATA[今流行っていると噂のSvelte（スベルト）を触っていきたいと思います。 Svelteとは？ JavaScriptフレームワークです。ReactやVueとは異な…]]></description>
    <content:encoded><![CDATA[今流行っていると噂の<a href="https://svelte.jp/" target="_blank" rel="noopener" title="">Svelte</a>（スベルト）を触っていきたいと思います。

<h2 class="wp-block-heading" id="i-0">Svelteとは？</h2>

JavaScriptフレームワークです。<br>ReactやVueとは異なっているのは、<a href="https://ja.reactjs.org/docs/faq-internals.html" target="_blank" rel="noopener" title="">仮想DOM</a>を利用しないという点らしいです。

<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
Svelteはユーザーインタフェースを構築する先鋭的で新しいアプローチです。ReactやVueのような 従来のフレームワークがその作業の大部分を&nbsp;<em>ブラウザ</em>&nbsp;で行うのに対し、 Svelteはその作業を アプリをビルドする際の&nbsp;<em>コンパイル時</em>&nbsp;に行います。

Svelteは、仮想DOMによる差分検出のようなテクニックを使用する代わりに、 アプリケーションの状態が変化したときにDOMを外科的に更新するコードを生成します。
<cite>https://svelte.jp/</cite></blockquote>

ははーん、感覚では理解したけども自分なりに言語化できねぇぞ。<br>説明できる人教えてください❤️

<h2 class="wp-block-heading" id="i-1">まず使ってみよう、話はそれからだ</h2>

<h3 class="wp-block-heading" id="i-2">プロジェクト作成</h3>

<pre class="code" data-lang="text" data-title="プロジェクト作成"><code class="language-text" data-hl="done"><span class="line"><span>npx degit sveltejs/template svelte-sample</span></span>
<span class="line"><span>cd svelte-sample</span></span></code></pre>

<pre class="code" data-lang="text" data-title="実行"><code class="language-text" data-hl="done"><span class="line"><span>npm install</span></span>
<span class="line"><span>npm run dev</span></span></code></pre>

<h3 class="wp-block-heading" id="i-3">動作確認</h3>

「<span class="keiko_blue">http://localhost:8080/</span>」にアクセスしてみましょう。

以下の画面が表示されます。

<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="525" height="227" src="https://miko.info/wp-content/uploads/2023/01/image-3.png" alt=""></figure>

<h2 class="wp-block-heading" id="i-4">プロジェクトの中身を見てみよう</h2>

VSCodeとかでフォルダの中身を見てみましょう。

何となくsrcフォルダ内のファイルをいじればええんやな・・・ってわかるのいいですね。

<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="230" height="539" src="https://miko.info/wp-content/uploads/2023/01/image-4.png" alt=""></figure>

<h2 class="wp-block-heading" id="i-5">サンプルコードを写経する</h2>

Reactとの違いってどないな感じなん？って調べていたら「<a href="https://www.twilio.com/blog/react-svelte-comparing-basics-jp" target="_blank" rel="noopener" title="">SvelteとReactの基本を比較</a>」って記事が見つかり、<br>そこのサンプルコードわかりやすかったので写経してみました。

<h3 class="wp-block-heading" id="i-6">必要なファイルを追加する</h3>

srcフォルダ内に以下のファイルを作成します。

<ul class="wp-block-list">
<li>Button.svelte</li>

<li>Heading.svelte</li>
</ul>

<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="236" height="145" src="https://miko.info/wp-content/uploads/2023/01/image-5.png" alt=""></figure>

<h3 class="wp-block-heading" id="i-7">レッツコーディング</h3>

以下のコードをそれぞれのファイルに書き写しちゃいましょう。

<pre class="code" data-lang="text" data-title="App.svelte"><code class="language-text" data-hl="done"><span class="line"><span>&#x3C;script></span></span>
<span class="line"><span>    import Button from "./Button.svelte";</span></span>
<span class="line"><span>    import Heading from "./Heading.svelte";</span></span>
<span class="line"><span>    let count = 0;</span></span>
<span class="line"><span>    let color = "#000000";</span></span>
<span class="line"><span></span></span>
<span class="line"><span>    const colors = ["#00ff00", "#ff0000", "#0000ff"];</span></span>
<span class="line"><span></span></span>
<span class="line"><span>    let handleClick = () => {</span></span>
<span class="line"><span>        count++;</span></span>
<span class="line"><span>        color = colors[Math.floor(Math.random() * 3)];</span></span>
<span class="line"><span>    };</span></span>
<span class="line"><span>&#x3C;/script></span></span>
<span class="line"><span></span></span>
<span class="line"><span>&#x3C;main></span></span>
<span class="line"><span>    &#x3C;Heading {count} /></span></span>
<span class="line"><span>    &#x3C;Button {color} {handleClick} /></span></span>
<span class="line"><span>&#x3C;/main></span></span></code></pre>

<pre class="code" data-lang="text" data-title="Heading.svelte"><code class="language-text" data-hl="done"><span class="line"><span>&#x3C;script></span></span>
<span class="line"><span>    export let count;</span></span>
<span class="line"><span>&#x3C;/script></span></span>
<span class="line"><span></span></span>
<span class="line"><span>&#x3C;h1>Hello, I am a Svelte App!&#x3C;/h1></span></span>
<span class="line"><span>&#x3C;h2>The following button has been clicked {count} times.&#x3C;/h2></span></span></code></pre>

<pre class="code" data-lang="text" data-title="Button.svelte"><code class="language-text" data-hl="done"><span class="line"><span>&#x3C;script></span></span>
<span class="line"><span>    export let handleClick;</span></span>
<span class="line"><span>    export let color;</span></span>
<span class="line"><span>&#x3C;/script></span></span>
<span class="line"><span></span></span>
<span class="line"><span>&#x3C;button style="--color: {color}" on:click={handleClick}> Click me! &#x3C;/button></span></span>
<span class="line"><span></span></span>
<span class="line"><span>&#x3C;style></span></span>
<span class="line"><span>    button {</span></span>
<span class="line"><span>        color: white;</span></span>
<span class="line"><span>        background-color: var(--color);</span></span>
<span class="line"><span>    }</span></span>
<span class="line"><span>&#x3C;/style></span></span></code></pre>

<h3 class="wp-block-heading" id="i-8">動作確認</h3>

以下の画面が表示されていればOKです。

クリックするごとにカウントアップされていき、<br>ボタンの色が変わるやつです。

<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="552" height="173" src="https://miko.info/wp-content/uploads/2023/01/image-6.png" alt=""></figure>

<h2 class="wp-block-heading" id="i-9">感想</h2>

Reactって<span class="keiko_yellow">useState</span>って何やねんとか、<br>何で↓のコードみたいに、HTMLをreturnせなあかんねん。

などと不満に思っていた私にはSvelteはときめく予感がするフレームワークですね！

<pre class="code" data-lang="text" data-title="Heading.js"><code class="language-text" data-hl="done"><span class="line"><span>function Heading({ count }) {</span></span>
<span class="line"><span>  return (</span></span>
<span class="line"><span>    &#x3C;div></span></span>
<span class="line"><span>      &#x3C;h1>Hello, I am a React App!&#x3C;/h1></span></span>
<span class="line"><span>      &#x3C;h2>The following button has been clicked {count} times.&#x3C;/h2></span></span>
<span class="line"><span>    &#x3C;/div></span></span>
<span class="line"><span>  )</span></span>
<span class="line"><span>}</span></span>
<span class="line"><span></span></span>
<span class="line"><span>export default Heading;</span></span></code></pre>

Reactもまだ全然触れていないので、そちらも触りつつ、<br>自分なりにSvelteとReactの比較を記事にしてみたいと思います。
]]></content:encoded>
  </item>
  <item>
    <title>【AWS CDK】Rustを使ってLambdaを実装してみる</title>
    <link>https://miko.info/awscdk-lambda-rust/</link>
    <guid isPermaLink="false">https://miko.info/?p=2553</guid>
    <pubDate>Tue, 03 Jan 2023 17:41:32 GMT</pubDate>
    <dc:creator>miko</dc:creator>
    <category><![CDATA[Rust]]></category>
    <description><![CDATA[AWS CDK信者になりつつあるので、Rustを使ってLambdaをデプロイしちゃいましょう。 実行環境とか利用するツールとか OS Windows 11 ツー…]]></description>
    <content:encoded><![CDATA[AWS CDK信者になりつつあるので、Rustを使ってLambdaをデプロイしちゃいましょう。

<h2 class="wp-block-heading" id="i-0">実行環境とか利用するツールとか</h2>

<h3 class="wp-block-heading" id="i-1">OS</h3>

<ul class="wp-block-list">
<li>Windows 11</li>
</ul>

<h3 class="wp-block-heading" id="i-2">ツール</h3>

<ul class="wp-block-list">
<li>PowerShell</li>

<li>Visual Studio Code</li>

<li>Scoop</li>

<li>AWS関連のあれこれ</li>
</ul>

<h2 class="wp-block-heading" id="i-3">事前準備</h2>

今回は「<a href="https://github.com/cargo-lambda/cargo-lambda" target="_blank" rel="noopener" title="">cargo-lambda</a>」を利用したサンプルを紹介します。<br>※「<a href="https://github.com/rnag/rust.aws-cdk-lambda" target="_blank" rel="noopener" title="">rust-aws-cdk-lambda</a>」なんかデプロイできなかったので塩漬け中

<h3 class="wp-block-heading" id="i-4">Scoopをインストールする</h3>

<a href="https://github.com/ScoopInstaller/Install#scoop-uninstaller" target="_blank" rel="noopener" title="ScoopInstaller"></a>Windowsで操作するにはScoopがあったほうが楽とのことなので、<br><a href="https://github.com/ScoopInstaller">ScoopInstaller</a>を利用してインストールしてください。

手順はREADMEを参照してください。

<h3 class="wp-block-heading" id="i-5">cargo-lambdaをインストールする</h3>

<pre class="code" data-lang="text" data-title="コマンド"><code class="language-text" data-hl="done"><span class="line"><span>scoop bucket add cargo-lambda https://github.com/cargo-lambda/scoop-cargo-lambda</span></span>
<span class="line"><span>scoop install cargo-lambda/cargo-lambda</span></span></code></pre>

<h3 class="wp-block-heading" id="i-6">CDKのアレコレを準備する</h3>

<pre class="code" data-lang="text" data-title="コマンド"><code class="language-text" data-hl="done"><span class="line"><span>npm i -g aws-cdk</span></span>
<span class="line"><span>cdk bootstrap aws://xxxxxxxxxxxx/ap-northeast-1</span></span></code></pre>

<h2 class="wp-block-heading" id="i-7">プロジェクトを作成する</h2>

以下のコマンドを実行してRust Lambdaプロジェクトを作成します。

<pre class="code" data-lang="text" data-title="コマンド"><code class="language-text" data-hl="done"><span class="line"><span>cargo lambda new rust-lambda-test</span></span>
<span class="line"><span></span></span>
<span class="line"><span>> Is this function an HTTP function? Yes</span></span>
<span class="line"><span>> Which service is this function receiving events from? AWS Lambda function URLs</span></span>
<span class="line"><span></span></span>
<span class="line"><span>cd .\rust-lambda-test\</span></span></code></pre>

<h3 class="wp-block-heading" id="i-8">クロスコンパイルのターゲットをインストールする</h3>

<pre class="code" data-lang="text" data-title="コマンド"><code class="language-text" data-hl="done"><span class="line"><span>rustup target add aarch64-unknown-linux-gnu</span></span></code></pre>

<h2 class="wp-block-heading" id="i-9">ローカル環境でテストしてみる</h2>

<h3 class="wp-block-heading" id="i-10">ローカル環境起動</h3>

以下のコマンドを実行して、ローカル環境で動作確認してみましょう。

<pre class="code" data-lang="text" data-title="コマンド"><code class="language-text" data-hl="done"><span class="line"><span>cargo lambda start</span></span></code></pre>

<h3 class="wp-block-heading" id="i-11">アクセスしてみる</h3>

以下のURLにアクセスし、画像と同じレスポンスが返ってきていたらＯＫです。

<pre class="code" data-lang="text" data-title="URL"><code class="language-text" data-hl="done"><span class="line"><span>http://localhost:9000/lambda-url/rust-based-aws-lambda-example/</span></span></code></pre>

<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="493" height="100" src="https://miko.info/wp-content/uploads/2023/01/image-1.png" alt=""></figure>

<h2 class="wp-block-heading" id="i-12">ビルドする</h2>

あとはビルド＆デプロイするだけです。<br>まずはビルドしちゃいましょう。

<pre class="code" data-lang="text" data-title="コマンド"><code class="language-text" data-hl="done"><span class="line"><span>cargo lambda build --release</span></span></code></pre>

<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="230" height="94" src="https://miko.info/wp-content/uploads/2023/01/image-2.png" alt=""></figure>

<h2 class="wp-block-heading" id="i-13">デプロイする</h2>

<h3 class="wp-block-heading" id="i-14">デプロイ用のファイルを準備する</h3>

<pre class="code" data-lang="text" data-title="コマンド"><code class="language-text" data-hl="done"><span class="line"><span>mkdir deploy &#x26;&#x26; cd deploy</span></span>
<span class="line"><span>cdk init app --language=typescript</span></span></code></pre>

<span class="keiko_yellow">deploy-stack.ts</span>の内容を書き換えます。

<pre class="code" data-lang="text" data-title="lib\deploy-stack.ts"><code class="language-text" data-hl="done"><span class="line"><span>import * as cdk from 'aws-cdk-lib';</span></span>
<span class="line"><span>import { Construct } from 'constructs';</span></span>
<span class="line"><span>import * as path from "path";</span></span>
<span class="line"><span>import { Code, Function, Runtime, FunctionUrlAuthType } from "aws-cdk-lib/aws-lambda";</span></span>
<span class="line"><span>import { CfnOutput } from "aws-cdk-lib";</span></span>
<span class="line"><span></span></span>
<span class="line"><span>export class DeployStack extends cdk.Stack {</span></span>
<span class="line"><span>  constructor(scope: Construct, id: string, props?: cdk.StackProps) {</span></span>
<span class="line"><span>    super(scope, id, props);</span></span>
<span class="line"><span></span></span>
<span class="line"><span>    const handler = new Function(this, "MyFunction", {</span></span>
<span class="line"><span>      code: Code.fromAsset(path.join(__dirname, "..", "..", "target/lambda/rust-lambda-test")),</span></span>
<span class="line"><span>      runtime: Runtime.PROVIDED_AL2,</span></span>
<span class="line"><span>      handler: "does_not_matter",</span></span>
<span class="line"><span>      functionName: "rust-lambda-function"</span></span>
<span class="line"><span>    });</span></span>
<span class="line"><span></span></span>
<span class="line"><span>    const fnUrl = handler.addFunctionUrl({</span></span>
<span class="line"><span>      authType: FunctionUrlAuthType.NONE,</span></span>
<span class="line"><span>    });</span></span>
<span class="line"><span></span></span>
<span class="line"><span>    new CfnOutput(this, 'TheUrl', {</span></span>
<span class="line"><span>      value: fnUrl.url,</span></span>
<span class="line"><span>    });</span></span>
<span class="line"><span>  }</span></span>
<span class="line"><span>}</span></span></code></pre>

<h3 class="wp-block-heading" id="i-15">デプロイコマンドを実行する</h3>

<pre class="code" data-lang="text" data-title="コマンド"><code class="language-text" data-hl="done"><span class="line"><span>cdk synth</span></span>
<span class="line"><span>cdk deploy</span></span></code></pre>

<h3 class="wp-block-heading" id="i-16">アクセスしてみる</h3>

実行結果の「<span class="keiko_yellow">DeployStack.TheUrl </span>」に表示されているURLにアクセスし、ローカル環境でのテスト結果と同じ結果が表示されていればOKです。

<h2 class="wp-block-heading" id="i-17">参考記事</h2>

<ul class="wp-block-list">
<li><a href="https://medium.com/techhappily/rust-based-aws-lambda-with-aws-cdk-deployment-14a9a8652d62" target="_blank" rel="noopener nofollow" title="">Rust-Based AWS Lambda With AWS CDK Deployment</a></li>
</ul>
]]></content:encoded>
  </item>
  <item>
    <title>Rustはじめ</title>
    <link>https://miko.info/rust-start/</link>
    <guid isPermaLink="false">https://miko.info/?p=2537</guid>
    <pubDate>Tue, 03 Jan 2023 03:20:09 GMT</pubDate>
    <dc:creator>miko</dc:creator>
    <category><![CDATA[Rust]]></category>
    <description><![CDATA[Rustを何となく初めてみたので、備忘録程度に・・・。 インストール・環境構築 MacだとHomebrewでインストールできるとのことだったので、それでインスト…]]></description>
    <content:encoded><![CDATA[<a href="https://www.rust-lang.org/learn" target="_blank" rel="noopener" title="">Rust</a>を何となく初めてみたので、備忘録程度に・・・。

<h2 class="wp-block-heading" id="i-0">インストール・環境構築</h2>

MacだとHomebrewでインストールできるとのことだったので、<br>それでインストールしてみました。

<pre class="code" data-lang="text" data-title="インストール"><code class="language-text" data-hl="done"><span class="line"><span>brew install rustup-init</span></span>
<span class="line"><span>rustup-init</span></span></code></pre>

<h2 class="wp-block-heading" id="i-1">Hello worldを出力してみる</h2>

いつものHello worldを表示するコードを作成します。

<pre class="code" data-lang="text" data-title="プロジェクトファイル作成"><code class="language-text" data-hl="done"><span class="line"><span>cargo new hello_world_rust</span></span></code></pre>

<pre class="code" data-lang="text" data-title="コンパイル＆実行"><code class="language-text" data-hl="done"><span class="line"><span>cargo run</span></span></code></pre>

「<span class="keiko_blue">Hello, world!</span>」と表示されればOKです。

<h2 class="wp-block-heading" id="i-2">コーディングしてみる</h2>

<span class="keiko_blue">src/main.rs</span>の中身を確認してみましょう。

<pre class="code" data-lang="text" data-title="main.rs"><code class="language-text" data-hl="done"><span class="line"><span>fn main() {</span></span>
<span class="line"><span>    println!("Hello, world!");</span></span>
<span class="line"><span>}</span></span></code></pre>

C、C++、C#とかを知っている人なら、なんか見たことあるはずです。

簡単な足し算用のプログラムです。

<pre class="code" data-lang="text" data-title="main.rs"><code class="language-text" data-hl="done"><span class="line"><span>fn main() {</span></span>
<span class="line"><span>    let number1: i32 = 1;</span></span>
<span class="line"><span>    let number2: i32 = 2;</span></span>
<span class="line"><span>    tashizan(number1, number2);</span></span>
<span class="line"><span>}</span></span>
<span class="line"><span></span></span>
<span class="line"><span>fn tashizan(number1: i32, number2: i32) {</span></span>
<span class="line"><span>    let result: i32 = number1 + number2;</span></span>
<span class="line"><span>    println!("{result}");</span></span>
<span class="line"><span>}</span></span></code></pre>

<h2 class="wp-block-heading" id="i-3">コード補完の有効化</h2>

コード補完を利用して、より楽にコーディングしちゃいましょう。<br>※VSCodeを利用する想定です。

<h3 class="wp-block-heading" id="i-4">cargo-editをインストールする</h3>

パッケージマネージャー「Cargo」をコマンドで簡単に追加・削除しちゃおうってのが「<span class="keiko_yellow">cargo-edit</span>」です。

<pre class="code" data-lang="text" data-title="cargo-edit インストール"><code class="language-text" data-hl="done"><span class="line"><span>cargo install cargo-edit</span></span></code></pre>

<h3 class="wp-block-heading" id="i-5">rust-analyzerを追加する</h3>

<pre class="code" data-lang="text" data-title="rust-analyzer"><code class="language-text" data-hl="done"><span class="line"><span>rustup component add rls rust-src rust-analysis</span></span></code></pre>

<h3 class="wp-block-heading" id="i-6">VSCodeの拡張機能をインストールする</h3>

<a href="https://marketplace.visualstudio.com/items?itemName=rust-lang.rust-analyzer">rust-analyzer</a>をインストールします。

明示的に型指定をしていない変数に、推測された型を表示してくれたり、<br>コード補完をしてくれます。

<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="624" height="177" src="https://miko.info/wp-content/uploads/2023/01/image.png" alt=""></figure>

<div style="height:59px" aria-hidden="true" class="wp-block-spacer"></div>

今年はガンガン記事を書いていきます。
]]></content:encoded>
  </item>
  <item>
    <title>KEEB_PDのおかげで写真撮影する楽しさを思い出せた話</title>
    <link>https://miko.info/keeb_pd_2021/</link>
    <guid isPermaLink="false">https://miko.info/?p=2442</guid>
    <pubDate>Mon, 20 Dec 2021 00:00:32 GMT</pubDate>
    <dc:creator>miko</dc:creator>
    <category><![CDATA[カスタムキーボード]]></category>
    <description><![CDATA[この記事はKEEB_PDアドベントカレンダー 20日目 の記事です。 19日目は、よういちろうさんの「普段Lunakey Miniをどう撮影していたか」でした。…]]></description>
    <content:encoded><![CDATA[<p>この記事は<a href="https://adventar.org/calendars/6470" target="_blank" rel="noopener">KEEB_PDアドベントカレンダー</a> 20日目 の記事です。</p>
<p>  <a class="reference table" href="https://adventar.org/calendars/6470" rel="noopener noreferrer"><br>
    <span class="tbcell refttl">参考</span><br>
    <span class="tbcell refcite">KEEB_PD Advent Calendar 2021<span>Adventar</span></span><br>
  </a></p>
<p>19日目は、よういちろうさんの「<a href="https://www.eisbahn.jp/yoichiro/2021/12/keeb_pd.html" target="_blank" rel="noopener">普段Lunakey Miniをどう撮影していたか</a>」でした。</p>
<p><span style="color: #808080">（´－`）.｡oO（<a href="https://remap-keys.app/" target="_blank" rel="noopener">Remap</a>いつも利用させていただいております！</span></p>
<p>&nbsp;</p>
<p>さて、今回はKEEB_PDのことや、<br>
キーボードについてのアレコレを語らさせていただきます。</p>
<h2 id="i-0">KEEB_PDとは？</h2>
<p><span style="font-size: 14pt"><a href="https://twitter.com/search?q=%23KEEB_PD%20filter%3Aimages&amp;src=typed_query" target="_blank" rel="noopener">KEEB_PD</a></span>とは毎週Twitterで開催されている<br>
<span style="font-size: 14pt;color: #ff0000"><strong>気軽に参加できるキーボードのフォトコンテスト</strong></span>的なイベントです。</p>
<p>日曜19~21時の間にキーボードのいい感じの写真をアップロードして、<br>
21時の時点で一番いいねを貰っていた人が優勝となります。</p>
<p>毎週、様々な写真が投稿されており「<strong>あのキーボードの形が良い…」</strong>とか<br>
<strong>「あのキーキャップカッコいい・カワイイ…」</strong>とか発見があります。</p>
<p>&nbsp;</p>
<h2 id="i-1">眠っていた写真撮影欲が刺激された</h2>
<p>私は元々、週末にプランも決めずに写真撮影のためだけに旅行へ行くほど写真撮影が好きでした。</p>
<div id="attachment_2469" style="width: 524px" class="wp-caption aligncenter"><a href="https://miko.info/wp-content/uploads/2021/12/photo.jpg"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-2469" src="https://miko.info/wp-content/uploads/2021/12/photo-1024x546.jpg" alt="" width="514" height="274"></a>
<p id="caption-attachment-2469" class="wp-caption-text">航空祭の写真</p>
</div>
<p>しかしCOVID‑19の影響で気軽に外を出歩くことができなくなり、<br>
更には謎の片頭痛に悩まされることによって、<br>
結果としてカメラを触ることも少なくなってしまいました…。</p>
<p>&nbsp;</p>
<p>しかし、カメラを放置して数年過ぎたあたりに<br>
Twitterで見かけたのが、<span style="font-size: 14pt"><a href="https://twitter.com/search?q=%23KEEB_PD%20filter%3Aimages&amp;src=typed_query" target="_blank" rel="noopener">KEEB_PD</a>でした。</span></p>
<p><strong>「<span style="font-size: 14pt">Twitterで気軽に参加できるキーボードのフォトコンテスト</span>」</strong></p>
<p>そんなの参加する決まってるじゃないですか！</p>
<div class="sng-box box26">
<div class="box-title">KEEB_PDの良いところ</div>
<div class="box-content">
<ul>
<li><span style="font-size: 14pt">家から出なくても撮影できる</span></li>
<li><span style="font-size: 14pt">毎週開催されているのでアイディアを思い付いたタイミングで参戦できる</span></li>
<li><span style="font-size: 14pt"><strong>めっちゃゆるい気持ちで参加できる</strong>　← <span style="color: #ff0000"><strong>重要</strong></span></span></li>
<li><span style="font-size: 14pt"><strong>自分のキーボードを自慢できる　</strong>← <span style="color: #ff0000"><strong>超</strong><strong>重要</strong></span></span></li>
</ul>
</div>
</div>
<p>イイことづくしです！</p>
<p>&nbsp;</p>
<h2 id="i-2">今年撮ったキーボードの写真</h2>
<p>今年は3回KEEB_PDに応募させていただきました。</p>
<h3 id="i-3">2021年2月 【R40】初参戦</h3>
<p>今年の2月に奇跡的に購入できたMeridianを<del>自慢</del>紹介したくて初参戦しました。<br>
<span style="color: #808080;font-size: 10pt">（´－`）.｡oO（当時は日本での購入報告を全く見かけなかったから、日本での保有者は自分だけだったのだろうか…？</span></p>
<blockquote class="twitter-tweet">
<p dir="ltr" lang="en">Keyboard:Meridian<br>
Switch:Drop + Invyr Holy Panda Mechanical Switches<br>
Keycap:DSA LightCycle Freedom For The Users<br>
Artisan:THINK_PULSE<a href="https://twitter.com/hashtag/KEEB_PD?src=hash&amp;ref_src=twsrc%5Etfw">#KEEB_PD</a> <a href="https://twitter.com/hashtag/KEEB_PD_R40?src=hash&amp;ref_src=twsrc%5Etfw">#KEEB_PD_R40</a> <a href="https://twitter.com/hashtag/%E4%BF%BA%E3%82%AD%E3%83%BC?src=hash&amp;ref_src=twsrc%5Etfw">#俺キー</a> <a href="https://t.co/bllxLaAN6D">pic.twitter.com/bllxLaAN6D</a></p>
<p>— Miko (@miko3s) <a href="https://twitter.com/miko3s/status/1383722220464320512?ref_src=twsrc%5Etfw">April 18, 2021</a></p></blockquote>
<p>Meridianのダークグレー色とキーキャップ「DSA LightCycle」、<br>
そしてﾎﾞｯｸｽ ｷｰｷｬｯﾌﾟさん(<a href="https://twitter.com/BOXXX_KEYCAP" target="_blank" rel="noopener">@BOXXX_KEYCAP</a>)作のTHINK_PULSE（カエルのキーキャップ）の組み合わせが最高に気に入っています！<br>
作成以来ずっとこの組み合わせのまま使っています。</p>
<p>個人的にこの写真で気に入っているのはキーボードの周囲に<br>
<strong>キーキャップがばら撒かれている</strong>ところです。</p>
<p>キーボード単体の写真でも良かったのですが、<br>
何か寂しさを感じ、もっと騒がしい感じにしたかったので<br>
キーキャップをばら撒いてみたのですが正解でした。</p>
<p>&nbsp;</p>
<h3 id="i-4">2021年11月 【R66】Prime Meridian</h3>
<p>そして2回目の参戦は11月でした。<br>
参戦のきっかけは、</p>
<p>「今年はキーボードを買うことはないだろう…」</p>
<p>と思っていたところ、<br>
<strong>もう１台Meridianを購入してしまった</strong>ためです。</p>
<p>まぁこの時にもやらかしてしまい、サポートの人にお世話になりました。<br>
ダメダメな英語でも対応してもらえて助かりました…。</p>
<p>&nbsp;</p>
<p>無事に税関を通り、手元には色だけが違う２台のMeridianが揃っていたので、<br>
これらを使ってイイ感じの構図で撮影できないか…<br>
と考えた結果が以下の写真です。</p>
<blockquote class="twitter-tweet">
<p dir="ltr" lang="en">Prime Meridian<br>
Keyboard: Meridian R1 Dark Gray, R2 E-White<br>
Switch: Holy Panda, Sakurio<br>
Keycap: DSA LightCycle Freedom For The Users, NP PBT Blank<br>
Artisan:THINK_PULSE<a href="https://twitter.com/hashtag/KEEB_PD?src=hash&amp;ref_src=twsrc%5Etfw">#KEEB_PD</a> <a href="https://twitter.com/hashtag/KEEB_PD_R66?src=hash&amp;ref_src=twsrc%5Etfw">#KEEB_PD_R66</a> <a href="https://t.co/CEHqmqvKEr">pic.twitter.com/CEHqmqvKEr</a></p>
<p>— Miko (@miko3s) <a href="https://twitter.com/miko3s/status/1449676566359855106?ref_src=twsrc%5Etfw">October 17, 2021</a></p></blockquote>
<p>タイトルの「Prime Meridian」の意味は本初子午線です。<br>
2台のMeridianの間を本初子午線として表現をしたかったのですが、<br>
結構難しかったです…。写真の表現力を鍛えたい…。</p>
<p>&nbsp;</p>
<h4 id="i-5">撮影風景</h4>
<p>撮影のために用意したスタジオはかなり雑です！</p>
<blockquote class="twitter-tweet">
<p dir="ltr" lang="ja">今回の構図を思いついてから数分で用意した雑な撮影スタジオ！<br>
全然風景写真を撮りに行けていないけど、 <a href="https://twitter.com/hashtag/KEEB_PD?src=hash&amp;ref_src=twsrc%5Etfw">#KEEB_PD</a> イベントのおかげで撮影する楽しさを思い出させてくれる。 <a href="https://t.co/IOi40q8oTt">pic.twitter.com/IOi40q8oTt</a></p>
<p>— Miko (@miko3s) <a href="https://twitter.com/miko3s/status/1449711730913792000?ref_src=twsrc%5Etfw">October 17, 2021</a></p></blockquote>
<p><strong>自分が思い浮かべたイメージをフレームに収められればそれでいいんです。</strong></p>
<p>&nbsp;</p>
<h4 id="i-6">自作キーボードカレンダー2022</h4>
<p>国内の自作キーボードコミュニティ「Self-Made Keyboards in Japan Discord」にて<br>
選ばれし12枚のキーボード写真がカレンダーになるという面白い企画が行われていました。</p>
<p>さすがに強者揃いだったので12枚には選ばれることはなかったですが、<br>
カレンダーの表紙のど真ん中に写真があって三度見ぐらいしました。</p>
<blockquote class="twitter-tweet">
<p dir="ltr" lang="ja">きたわね <a href="https://t.co/A4WFrOce2Q">pic.twitter.com/A4WFrOce2Q</a></p>
<p>— ぺかそ⌨C99金曜東テ-35b (@Pekaso) <a href="https://twitter.com/Pekaso/status/1472039476835020800?ref_src=twsrc%5Etfw">December 18, 2021</a></p></blockquote>
<p>&nbsp;</p>
<h3 id="i-7">2021年12月 【R73】コーヒーだばぁ…</h3>
<p>今年最後の参戦はつい最近（12月5日）でした。</p>
<p>&nbsp;</p>
<p>さて、変なことをお聞きしますが…</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><span style="color: #993300;font-size: 18pt"><strong>皆さんはコーヒーをキーボードにこぼしたことはありますか？</strong></span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>私はあります。</p>
<p>&nbsp;</p>
<p>そんな苦い思い出を表現した一枚がこれです。</p>
<p>&nbsp;</p>
<blockquote class="twitter-tweet">
<p dir="ltr" lang="ja">コーヒーだばぁ…<br>
Keyboard: Meridian E-White<br>
Switch: Sakurio<br>
Keycap: NP PBT Blank<a href="https://twitter.com/hashtag/KEEB_PD?src=hash&amp;ref_src=twsrc%5Etfw">#KEEB_PD</a> <a href="https://twitter.com/hashtag/KEEB_PD_R73?src=hash&amp;ref_src=twsrc%5Etfw">#KEEB_PD_R73</a> <a href="https://twitter.com/hashtag/%E4%BF%BA%E3%82%AD%E3%83%BC?src=hash&amp;ref_src=twsrc%5Etfw">#俺キー</a> <a href="https://twitter.com/hashtag/customkeyboard?src=hash&amp;ref_src=twsrc%5Etfw">#customkeyboard</a> <a href="https://t.co/JK3ZdSiw15">pic.twitter.com/JK3ZdSiw15</a></p>
<p>— Miko (@miko3s) <a href="https://twitter.com/miko3s/status/1467433565294141442?ref_src=twsrc%5Etfw">December 5, 2021</a></p></blockquote>
<p>これまでの2枚はカッコよさを追い求めていましたが、<br>
今回はネタ重視で挑んでみました。</p>
<p>純白なキーボードがコーヒーによって染められていく（体験談）を<br>
表現できたのではないでしょうか…。</p>
<p>&nbsp;</p>
<p>昨日の<a href="https://www.eisbahn.jp/yoichiro/2021/12/keeb_pd.html" target="_blank" rel="noopener">よういちろうさんの記事</a>に書かれていた</p>
<blockquote><p>「何を伝えたいか」が重要ですよね。それさえ表現できていれば、メッセージ性のある良い写真に仕上がるかな、と思っています。</p></blockquote>
<p>これを達成できていたのか、</p>
<p>&nbsp;</p>
<p><span style="font-size: 18pt"><strong style="font-size: 18pt">100いいね</strong></span>を超える反応をいただけました…。</p>
<p>&nbsp;</p>
<p>つまり、キーボードにコーヒーこぼした人は意外と多いってことでよろしいでしょうか？？？</p>
<p>&nbsp;</p>
<h2 id="i-8">KEEB_PDに参加して気づいたこと</h2>
<p>これまでは、</p>
<p>「部屋の中で物の写真を撮ってもなぁ…」</p>
<p>「外に行って綺麗な風景を撮りに行きたいな…」</p>
<p>といった感じに物撮りに対してあまり乗り気ではありませんでした。</p>
<p>&nbsp;</p>
<p>しかし、KEEB_PDに参加するためにキーボードを撮影していると…</p>
<div class="sng-box box26">
<div class="box-title">テンション↑</div>
<div class="box-content">
<ul>
<li><span style="font-size: 12pt">普段とは違った位置から撮る私のキーボードカッコいいやん…</span></li>
<li><span style="font-size: 12pt">他の小物と組み合わせるとイケてるやん…</span></li>
<li><span style="font-size: 12pt">テザー撮影ナニコレ、プロっぽいやん…<br>
etc…</span></li>
</ul>
</div>
</div>
<p>といった感じに<span style="font-size: 14pt"><span style="color: #ff0000"><strong>久々に写真撮影を楽しんでいました。</strong></span></span></p>
<p>気づいたら数時間溶けてしまったりと<br>
風景写真を撮ってた頃と何も変わっていません。</p>
<p><strong>写真撮影を楽しむのに場所なんて関係ない</strong>ってことを実感しました。</p>
<p>それに加えて、</p>
<div class="sng-box box26">
<div class="box-title">生活にも影響を及ぼすKEEB_PD</div>
<div class="box-content">
<ul>
<li>もっとおしゃれな部屋にしたい</li>
<li>撮影スペースを確保するにはあれ邪魔だな…捨てよ</li>
<li>自分の手、きたねぇな。ムダ毛処理にハンドクリームに…</li>
</ul>
</div>
</div>
<p>などと撮影以外のことにも影響が出ていました。</p>
<p>&nbsp;</p>
<p>写真撮影の楽しさを思い出させてくれただけでなく、<br>
生活も変えてしまった「KEEB_PD」を開催してくれている<br>
にるぽさん（<a href="https://twitter.com/nillpo">@nillpo</a>）には心より感謝です！！🙇</p>
<p>&nbsp;</p>
<h2 id="i-9">今年作ったキーボードの紹介</h2>
<p>今年はMeridianで始まり、Meridianで終わりました。</p>
<h3 id="i-10">Meridian Dark Gray</h3>
<p>気分によってキーボードを変えていますが、使用率が一番高いキーボードです！<br>
見た目、タイピング音の両方とも満足できている相棒です！</p>
<p>重量が1.5kgあるのですが、先日オフィスに持ち出してみたアホです。</p>
<p>ノートPCより重いってどういうことなの。</p>
<p><a href="https://miko.info/wp-content/uploads/2021/04/meridian1-min.jpg"><img loading="lazy" decoding="async" class="aligncenter" src="https://miko.info/wp-content/uploads/2021/04/meridian1-min-1024x768.jpg" alt="" width="625" height="469"></a></p>
<table>
<tbody>
<tr>
<th>Keyboard</th>
<td>Meridian R1 Dark Gray</td>
</tr>
<tr>
<th>Switch</th>
<td>Drop + Invyr Holy Panda Mechanical Switches<br>
THINK_PULSE</td>
</tr>
<tr>
<th>Keycap</th>
<td>DSA LightCycle Freedom For The Users</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<h3 id="i-11">Meridian E-White</h3>
<p>ノリと勢いで購入された２台目のMeridianです。<br>
最初は白黒のモノトーン調に仕上げていたのですが、紅白にしてみました！</p>
<p><a href="https://miko.info/wp-content/uploads/2021/12/PB200018-min-scaled.jpg"><img loading="lazy" decoding="async" class="aligncenter" src="https://miko.info/wp-content/uploads/2021/12/PB200018-min-1024x768.jpg" alt="" width="625" height="468"></a></p>
<table>
<tbody>
<tr>
<th>Keyboard</th>
<td>Meridian R2 E-White</td>
</tr>
<tr>
<th>Switch</th>
<td>Sakurio<br>
THINK_AMA</td>
</tr>
<tr>
<th>Keycap</th>
<td>NP PBT Blank</td>
</tr>
</tbody>
</table>
<p>こちらはホットスワップ対応させているので、<br>
キースイッチを替えたい放題です。</p>
<blockquote class="twitter-tweet">
<p dir="ltr" lang="ja">目覚めが良かったので朝からリングフィットとソケットの田植え <a href="https://t.co/r6NVIJ2qbt">pic.twitter.com/r6NVIJ2qbt</a></p>
<p>— Miko (@miko3s) <a href="https://twitter.com/miko3s/status/1448394021554909186?ref_src=twsrc%5Etfw">October 13, 2021</a></p></blockquote>
<p>&nbsp;</p>
<h2 id="i-12">撮影機材・風景</h2>
<p>無駄に凝り性なので機材にも力入れちゃって色々と買っちゃうんですよね……(　= =) ﾄｵｲﾒ</p>
<p>&nbsp;</p>
<p><a href="https://miko.info/wp-content/uploads/2021/12/cb00c47f66931fc13a929828ca4d9fea.jpg"><img loading="lazy" decoding="async" class="aligncenter" src="https://miko.info/wp-content/uploads/2021/12/cb00c47f66931fc13a929828ca4d9fea-1024x642.jpg" alt="自作キーボードを俯瞰撮影するためのカメラと照明の配置" width="645" height="404"></a></p>
<p>机の上で撮影することもありますが、<br>
大体は↑の画像のように窓際で撮影しています。</p>
<p>撮影機材は以下の通りです。</p>
<h3 id="i-13">【カメラ】Olympus E-M1 &amp; M.ZUIKO DIGITAL ED 12-40mm F2.8 PRO</h3>
<p><a href="https://miko.info/wp-content/uploads/2021/12/E-M1-min.jpg"><img loading="lazy" decoding="async" class="aligncenter" src="https://miko.info/wp-content/uploads/2021/12/E-M1-min-1024x768.jpg" alt="" width="626" height="469"></a></p>
<p>７年間連れ歩いている相棒です。<br>
週末に気が向くとコイツを鞄に詰め込んで撮影しに行っていたのでボロボロです。</p>
<p>iPad ProとWifi接続してテザー撮影しています。</p>
<h3 id="i-14">【三脚】Manfrotto MKBFRC4-BH &amp; SLIK SLARM2</h3>
<p><a href="https://www.amazon.co.jp/Manfrotto-%E3%82%B3%E3%83%B3%E3%83%91%E3%82%AF%E3%83%88%E4%B8%89%E8%84%9A-%E3%82%AB%E3%83%BC%E3%83%9C%E3%83%B3%E3%83%95%E3%82%A1%E3%82%A4%E3%83%90%E3%83%BC-%E3%83%9C%E3%83%BC%E3%83%AB%E9%9B%B2%E5%8F%B0%E3%82%AD%E3%83%83%E3%83%88-MKBFRC4-BH/dp/B00M8RQKS4?&amp;linkCode=li2&amp;tag=miko0a9-22&amp;linkId=fd4b18df8959d4b7830488dd13240921&amp;language=ja_JP&amp;ref_=as_li_ss_il" target="_blank" rel="noopener"><img decoding="async" src="https://m.media-amazon.com/images/P/B00M8RQKS4.09._SL250_.jpg" border="0" loading="lazy" class=""></a>&nbsp; &nbsp; &nbsp; &nbsp;<img loading="lazy" decoding="async" style="border: none !important;margin: 0px !important" src="https://ir-jp.amazon-adsystem.com/e/ir?t=miko0a9-22&amp;language=ja_JP&amp;l=li2&amp;o=9&amp;a=B00M8RQKS4" alt="" width="1" height="1" border="0" class=""><a href="https://www.amazon.co.jp/SLIK-%E9%9B%B2%E5%8F%B0%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B5%E3%83%AA%E3%83%BC-%E3%82%B9%E3%83%A9%E3%82%A4%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0%E3%82%A2%E3%83%BC%E3%83%A0-%E4%BF%AF%E7%9E%B0%E6%92%AE%E5%BD%B1%E3%83%BB%E6%8E%A5%E5%86%99%E3%81%AA%E3%81%A9%E3%81%AB%E4%BE%BF%E5%88%A9-SLARM2/dp/B00FFKJ3PS?th=1&amp;linkCode=li3&amp;tag=miko0a9-22&amp;linkId=b0affe37969a0266726af2553a6c8802&amp;language=ja_JP&amp;ref_=as_li_ss_il" target="_blank" rel="noopener"><img decoding="async" src="https://m.media-amazon.com/images/P/B00FFKJ3PS.09._SL250_.jpg" border="0" loading="lazy" class=""></a><img loading="lazy" decoding="async" style="border: none !important;margin: 0px !important" src="https://ir-jp.amazon-adsystem.com/e/ir?t=miko0a9-22&amp;language=ja_JP&amp;l=li3&amp;o=9&amp;a=B00FFKJ3PS" alt="" width="1" height="1" border="0" class=""></p>
<p>三脚はカーボン製なのでめっちゃ軽いし丈夫です。</p>
<p>それと三脚には俯瞰撮影用のスライディングアームをつけており、<br>
接写・動画撮影にも使えて便利なやつです。</p>
<h3 id="i-15">【フィルタ】PLフィルタ、NDフィルタ</h3>
<p><a href="https://miko.info/wp-content/uploads/2021/12/filter-min.jpg"><img loading="lazy" decoding="async" class="aligncenter" src="https://miko.info/wp-content/uploads/2021/12/filter-min-1024x766.jpg" alt="" width="466" height="349"></a></p>
<p>風景撮影のお供に使っているやつです。</p>
<h4 id="i-16">PLフィルタ</h4>
<p>Polarized Light（偏光）フィルタです。<br>
水面のテカリを抑えたり、青空をより濃く撮れたりする風景写真の必須フィルタです。</p>
<p>物撮りでも効果を発揮してくれて、<br>
にるぽさんがわかりやすい例を紹介してくれています！</p>
<blockquote class="twitter-tweet">
<p dir="ltr" lang="ja">1枚目PLフィルターなし、2枚目以降あり <a href="https://t.co/7Rv05YZDmZ">pic.twitter.com/7Rv05YZDmZ</a></p>
<p>— にるｺｯﾎﾟﾗ gangstre🐶 (@nillpo) <a href="https://twitter.com/nillpo/status/1467135698155499521?ref_src=twsrc%5Etfw">December 4, 2021</a></p></blockquote>
<h4 id="i-17">NDフィルタ</h4>
<p>Neutral Density（中性濃度）フィルタで、<br>
明るい場所でもスローシャッターで撮影できます。</p>
<p>被写体を意図的にぶらすことができ、<br>
滝の撮影で利用すると以下の写真のように水を滑らかに写せます。</p>
<p><a href="https://miko.info/wp-content/uploads/2021/12/taki-e1639305319345.jpg"><img loading="lazy" decoding="async" class="aligncenter" src="https://miko.info/wp-content/uploads/2021/12/taki-e1639305319345-770x1024.jpg" alt="" width="317" height="422"></a></p>
<p>↓の写真みたいなのを撮影できます。</p>
<p><a href="https://miko.info/wp-content/uploads/2021/12/ghost.jpg"><img loading="lazy" decoding="async" class="aligncenter" src="https://miko.info/wp-content/uploads/2021/12/ghost-1024x765.jpg" alt="" width="459" height="342"></a></p>
<p>撮影次第で映画「マトリックス」に出てくるエージェント「ジョーンズ」が高速で銃弾を避けているシーンみたいに、高速でタイピングしているような表現できたりするんだろうか…？</p>
<h3 id="i-18">【背景紙】エレコム DGA-BPBGMT・DGA-BPBGCL01</h3>
<p><a href="https://www.amazon.co.jp/%E3%82%A8%E3%83%AC%E3%82%B3%E3%83%A0-%E6%92%AE%E5%BD%B1%E8%83%8C%E6%99%AF%E3%82%B7%E3%83%BC%E3%83%88-MONOTONE-3%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3%C3%97%E5%90%841%E6%9E%9A-DGA-BPBGMT/dp/B09CD1X4CY?hvadid=529651425814&amp;hvpos=&amp;hvnetw=g&amp;hvrand=1681476312486206308&amp;hvpone=&amp;hvptwo=&amp;hvqmt=&amp;hvdev=c&amp;hvdvcmdl=&amp;hvlocint=&amp;hvlocphy=1009282&amp;hvtargid=pla-1414036128443&amp;psc=1&amp;th=1&amp;psc=1&amp;linkCode=li3&amp;tag=miko0a9-22&amp;linkId=639d8c39696c8236c9841c21f6c560eb&amp;language=ja_JP&amp;ref_=as_li_ss_il" target="_blank" rel="noopener"><img decoding="async" src="https://m.media-amazon.com/images/P/B09CD1X4CY.09._SL250_.jpg" border="0" loading="lazy" class=""></a><img loading="lazy" decoding="async" style="border: none !important;margin: 0px !important" src="https://ir-jp.amazon-adsystem.com/e/ir?t=miko0a9-22&amp;language=ja_JP&amp;l=li3&amp;o=9&amp;a=B09CD1X4CY" alt="" width="1" height="1" border="0" class=""> &nbsp;&nbsp;<a href="https://www.amazon.co.jp/%E3%82%A8%E3%83%AC%E3%82%B3%E3%83%A0-%E6%92%AE%E5%BD%B1%E8%83%8C%E6%99%AF%E3%82%B7%E3%83%BC%E3%83%88-%E3%83%90%E3%83%83%E3%82%AF%E3%83%9A%E3%83%BC%E3%83%91%E3%83%BC-3%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3%C3%97%E5%90%841%E6%9E%9A-DGA-BPBGCL01/dp/B09CCVGLVP?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&amp;keywords=DGA-BPBGCL01&amp;qid=1639189111&amp;s=electronics&amp;sr=1-1&amp;linkCode=li3&amp;tag=miko0a9-22&amp;linkId=65f2d7dd2ef18195847939909e97fef1&amp;language=ja_JP&amp;ref_=as_li_ss_il" target="_blank" rel="noopener"><img decoding="async" src="https://m.media-amazon.com/images/P/B09CCVGLVP.09._SL250_.jpg" border="0" loading="lazy" class=""></a><img loading="lazy" decoding="async" style="border: none !important;margin: 0px !important" src="https://ir-jp.amazon-adsystem.com/e/ir?t=miko0a9-22&amp;language=ja_JP&amp;l=li3&amp;o=9&amp;a=B09CCVGLVP" alt="" width="1" height="1" border="0" class=""><br>
物撮り用に購入してみた背景紙です。<br>
マットな質感になっており、通常の紙よりも<strong>光源の映り込み</strong>が抑えられます。</p>
<p><strong><span style="color: #800080">机の天板はボロボロ、部屋もごちゃごちゃしてて写せない…！<br>
だけどKEEB_PDに参加してみたい…！</span></strong></p>
<p>そんな私みたいな状況の方におススメします！</p>
<p><span style="color: #ff0000"><strong>背景紙を使うだけで写真の印象も大きく変わります。<br>
<del>それに部屋のカオスっぷりも誤魔化せます！！</del></strong></span></p>
<p><a href="https://miko.info/wp-content/uploads/2021/12/Penguin.jpg"><img loading="lazy" decoding="async" class="alignnone" src="https://miko.info/wp-content/uploads/2021/12/Penguin-1024x768.jpg" alt="" width="331" height="248"></a> <a href="https://miko.info/wp-content/uploads/2021/12/Penguin2.jpg"><img loading="lazy" decoding="async" class="alignnone" src="https://miko.info/wp-content/uploads/2021/12/Penguin2-766x1024.jpg" alt="" width="181" height="242"></a></p>
<h3 id="i-19">ライト</h3>
<p>光源は色々と使っています</p>
<h4 id="i-20">LAOFAS Rainbow Sophomore RGB LED</h4>
<p><a href="https://miko.info/wp-content/uploads/2021/12/PC120229-min.jpg"><img loading="lazy" decoding="async" class="aligncenter" src="https://miko.info/wp-content/uploads/2021/12/PC120229-min-1024x766.jpg" alt="" width="434" height="325"></a></p>
<p>小型撮影用ライトの<strong><a href="https://amzn.to/33gnf33" target="_blank" rel="noopener">LAOFAS Rainbow Sophomore RGB LED</a></strong>を使っています。</p>
<p>調光・色温度調整可能で、専用のディフューザーが付属しています。</p>
<p>手で楽々持てるサイズでありながら、かなり明るくなるので、<br>
様々な角度から光を当てつつ試行錯誤しています。</p>
<p>それにマグネットも内蔵されているので、<br>
暗所での作業時にも使ってたりします。</p>
<p>&nbsp;</p>
<p>ライトの上に乗せて、↓みたいな写真も撮れたりします。</p>
<p><a href="https://miko.info/wp-content/uploads/2021/12/PC120241-min.jpg"><img loading="lazy" decoding="async" class="aligncenter" src="https://miko.info/wp-content/uploads/2021/12/PC120241-min-1024x766.jpg" alt="" width="427" height="320"></a></p>
<p>ちなみにワイヤレス制御アプリは起動後に<br>
勝手にBluttooth接続され何か怪しいと思い、即削除しました。</p>
<p>&nbsp;</p>
<h4 id="i-21">モニター &amp; BenQ ScreenBar Plus</h4>
<p><a href="https://miko.info/wp-content/uploads/2021/12/PC050140-min-e1639279410913.jpg"><img loading="lazy" decoding="async" class="aligncenter" src="https://miko.info/wp-content/uploads/2021/12/PC050140-min-e1639279410913-733x1024.jpg" alt="" width="426" height="596"></a></p>
<p>他にもアドベントカレンダーでも何度か取り上げられている<br>
「モニターをライトとして利用する」方法を使っています。</p>
<p>それでも物足りなかった場合には<strong><a href="https://amzn.to/3rU99Pj" target="_blank" rel="noopener">BenQ ScreenBar Plus</a></strong>を使っています。</p>
<p><a class="post-card" href="https://miko.info/benq-screenbar-plus_lets-yofukashi/"><span class="post-card__img"><img src="https://miko.info/wp-content/uploads/2021/11/daa9459dbb5b23596a951aef051972b7.png" alt="" loading="lazy" decoding="async" class=""></span><span class="post-card__body"><span class="post-card__title">BenQ ScreenBar Plusレビュー ～みんなでよふかししよう～</span><span class="post-card__date">2021.11.21</span></span></a></p>
<p>この記事も夜な夜な書いていましたが、<br>
このライトのおかげで大分捗りました。</p>
<p>&nbsp;</p>
<h2 id="i-22">それでは最後にタイピング音を聴いてください</h2>
<p>さて、長々と記事を書いてきましたが、これで最後です。</p>
<p>ここまでは写真についてを取り上げてきましたが、<br>
最後は「<span style="font-size: 18pt"><strong>音</strong></span>」について紹介させてください。</p>
<p>&nbsp;</p>
<p>先日、以前書いた記事に対してmarksardさん(<a href="https://twitter.com/marksard" target="_blank" rel="noopener">@marksard</a>)から反応をいただけました！</p>
<blockquote class="twitter-tweet">
<p dir="ltr" lang="ja">キーボード沼へハマっていき、高級キーボードを買うまでのお話【Meridian】 | 思い立ったが吉日</p>
<p>「…好みの音が出るようになった結果……1秒でも多くキーボードを触りたいからプログラミングをするという謎の逆転現象が起きていました。…」</p>
<p>まさにコレofコレ <a href="https://t.co/TTCKFwDkoa">https://t.co/TTCKFwDkoa</a></p>
<p>— ᙢᗩᖇḰ (@marksard) <a href="https://twitter.com/marksard/status/1467473747372548096?ref_src=twsrc%5Etfw">December 5, 2021</a></p></blockquote>
<p>やはり、<strong>PCのキーボードも音を楽しむ物で間違いなかったんだな…</strong><br>
と勝手にガッツポーズしてしまいした。</p>
<p>今回紹介した2つのキーボードの形は一緒ですが、<br>
タイピング音は全く異なっています。</p>
<h3 id="i-23">最高のキースイッチを追い求めて…</h3>
<p>好みのタイピング感、タイピング音を追い求めるために<br>
国内外からあらゆるキースイッチを購入しました。</p>
<p>&nbsp;</p>
<blockquote class="twitter-tweet">
<p dir="ltr" lang="ja">キースイッチの探求はいつまでも続く<br>
（´-`）.｡oO（遊舎工房さんいつもお世話になっております… <a href="https://t.co/iru1mdDP1o">pic.twitter.com/iru1mdDP1o</a></p>
<p>— Miko (@miko3s) <a href="https://twitter.com/miko3s/status/1456923444126175234?ref_src=twsrc%5Etfw">November 6, 2021</a></p></blockquote>
<p>今年だけで何十種のキースイッチを購入したのか把握してません…。</p>
<p>すべての軸について紹介したいですが、<br>
これ以上書くと記事のボリュームがカオスなことになるので<br>
来年「KEEB_PD_TYPING」のアドベントカレンダーが公開されたら書きます…</p>
<h3 id="i-24">タイピング音</h3>
<p>数多くの中から選ばれたキースイッチによって奏でる音をそれぞれ聴いていただき、<br>
もし宜しければどちらのタイピング音が好みかアンケートに答えていただけると幸いです。</p>
<ul>
<li>①カチャカチャ音（黒い方のキーボード）</li>
<li>②コトコト音（白い方のキーボード）</li>
</ul>
<h4 id="i-25">①カチャカチャ音（黒いキーボード）</h4>
<p>カチャカチャと音が鳴り響いています。</p>
<p>キースイッチは「<a href="https://drop.com/buy/drop-invyr-holy-panda-mechanical-switches" target="_blank" rel="noopener">Drop + Invyr Holy Panda Mechanical Switches</a>」です。<br>
タクタイルスイッチ（茶軸）が好きならまず買っておけ！って<br>
どこかで聞いた気がするので、買ってみたら好きになりました。ﾁｮﾛｲ</p>
<p><audio class="wp-audio-shortcode" id="audio-2442-1" preload="none" style="width: 100%;" controls="controls"><source type="audio/mpeg" src="https://miko.info/wp-content/uploads/2021/12/214a2a2850ca820fbc4b2a6429bccb0d.mp3?_=1"><a href="https://miko.info/wp-content/uploads/2021/12/214a2a2850ca820fbc4b2a6429bccb0d.mp3">https://miko.info/wp-content/uploads/2021/12/214a2a2850ca820fbc4b2a6429bccb0d.mp3</a></audio></p>
<p>&nbsp;</p>
<h4 id="i-26">②コトコト音（白いキーボード）</h4>
<p>①と比べて静かすぎるタイピング音です。<br>
（イヤホンかヘッドホン付けないと聞こえないかも）</p>
<p>先ほどのキーボードと同じマイク距離で録音しても全然音を拾わなかったので<br>
ほぼ真上に持ってきました。そのため、ASMR？っぽくなってます。<br>
ヘッドホンとかで聞くと耳元でタイピングされている不思議な感覚に…。</p>
<p>キースイッチは「<a href="https://shop.yushakobo.jp/products/pink-roselios-sakurios-silent-linear-limited-edition" target="_blank" rel="noopener">Sakurio</a>」で、<br>
なんとも言えないタイピング感（誉め言葉）と驚きの静かさが気に入っているキースイッチです。</p>
<p>落ち着いて作業がしたいときに使っていたりします。</p>
<p><audio class="wp-audio-shortcode" id="audio-2442-2" preload="none" style="width: 100%;" controls="controls"><source type="audio/mpeg" src="https://miko.info/wp-content/uploads/2021/12/defe7910392611c150ceffc0ee616aef.mp3?_=2"><a href="https://miko.info/wp-content/uploads/2021/12/defe7910392611c150ceffc0ee616aef.mp3">https://miko.info/wp-content/uploads/2021/12/defe7910392611c150ceffc0ee616aef.mp3</a></audio></p>
<p>[socialpoll id=”2805722″]</p>
<h2 id="i-27">まとめ</h2>
<p>最後まで読んでいただきまして、ありがとうございました！<br>
今年を振り返りつつ、記事を書いていたら結構なボリュームになってしまいました…。</p>
<p>まだ、KEEB_PDで優勝はしたことはないですが、<br>
優勝よりも「<strong>こんな写真撮れたからちょっと見て！！！</strong>」って気持ちの方が強いです。</p>
<p>キーボードを作る楽しさ、写真を撮る楽しさを忘れずに<br>
来年もKEEB_PDに参加していこうと思います！！</p>
<p>&nbsp;</p>
<p>2021年12月26日(日)に年内最後のKEEB_PDが開催されるはずですので、（ｵｿﾗｸｷｯﾄ）<br>
お気に入りのキーボードがある方は参戦してみてはいかがでしょうか？！</p>
<p>&nbsp;</p>
<hr>
<p>&nbsp;</p>
<p>21日目はe3w2qさんの「私のKEEB_PD参加写真の撮り方を書きます」です！</p>
<p>（´－`）.｡oO（Pangaea Keyboardめっちゃ気になってたけど、気づいたらテスター募集終わっていた…</p>
<p>&nbsp;</p>
<p>[この記事はMeridianで書きました。]</p>
]]></content:encoded>
  </item>
  <item>
    <title>骨伝導イヤホンで耳に開放感を… AfterShokz OpenCommレビュー</title>
    <link>https://miko.info/aftershokz-opencomm-review/</link>
    <guid isPermaLink="false">https://miko.info/?p=2438</guid>
    <pubDate>Thu, 09 Dec 2021 22:46:38 GMT</pubDate>
    <dc:creator>miko</dc:creator>
    <category><![CDATA[ガジェット]]></category>
    <description><![CDATA[ブラックフライデーで買い物をするつもりはなかったのですが、 気になっていた商品がセールされていたのでIYHしてしまいました。 購入したのはAfterShokz …]]></description>
    <content:encoded><![CDATA[<p>ブラックフライデーで買い物をするつもりはなかったのですが、<br>
気になっていた商品がセールされていたので<a href="https://nlab.itmedia.co.jp/nl/articles/1208/03/news060.html" target="_blank" rel="noopener"><strong>IYH</strong></a>してしまいました。</p>
<p>購入したのは<span style="font-size: 24pt;"><a href="https://amzn.to/3EV1X9r">AfterShokz OpenComm Light Grey</a></span> です。</p>
<h2 id="i-0">AfterShokz OpenCommとは？</h2>
<p>AfterShokzから販売されている骨伝導ヘッドセットです。</p>
<p>みんなノイズキャンセリングイヤホン・ヘッドホン好きすぎやろ、<br>
もっと周りの音聞こうや。的なコンセプトのもと生まれたのだとか。</p>
<h3 id="i-1">価格</h3>
<p>通常価格は￥19,998ですが、</p>
<p>Amazonのブラックフライデー特価で<span style="font-size: 14pt;"><strong>20%OFF</strong></span>の<span style="font-size: 14pt; color: #ff0000;"><strong>￥15,998</strong></span>で購入できました。</p>
<p>【2021/12/10時点】ヨドバシカメラにて<strong>￥15,900</strong>かつ<strong>10%分のポイント</strong>がもらえるとのことです。</p>
<h2 id="i-2">商品画像</h2>
<h3 id="i-3">本体</h3>
<p>白黒のモノトーンが好きなので結構気に入っています。</p>
<p><a href="https://miko.info/wp-content/uploads/2021/12/PC050117-min.jpg"><img loading="lazy" decoding="async" class="alignnone" src="https://miko.info/wp-content/uploads/2021/12/PC050117-min-1024x768.jpg" alt="" width="627" height="470"></a></p>
<p>&nbsp;</p>
<p>マイクを前に出してみた状態です。</p>
<p><a href="https://miko.info/wp-content/uploads/2021/12/PC050118-min.jpg"><img loading="lazy" decoding="async" class="alignnone" src="https://miko.info/wp-content/uploads/2021/12/PC050118-min-1024x768.jpg" alt="" width="624" height="467"></a></p>
<h3 id="i-4">充電ケーブル</h3>
<p>充電ケーブルは独自仕様？みたいです。</p>
<p><a href="https://miko.info/wp-content/uploads/2021/12/PC050112-min.jpg"><img loading="lazy" decoding="async" class="alignnone" src="https://miko.info/wp-content/uploads/2021/12/PC050112-min-1024x768.jpg" alt="" width="620" height="465"></a></p>
<p>イヤホン側の充電端子にはカバーとかはないです。</p>
<p>夏場とか汗が怖い…。</p>
<p><a href="https://miko.info/wp-content/uploads/2021/12/PC050119-min.jpg"><img loading="lazy" decoding="async" class="alignnone" src="https://miko.info/wp-content/uploads/2021/12/PC050119-min-1024x768.jpg" alt="" width="616" height="462"></a></p>
<p>ケーブル側にマグネットが入っているのでしっかりと固定してくれます。</p>
<p>多少揺らしても外れません。</p>
<p><a href="https://miko.info/wp-content/uploads/2021/12/PC050121-min.jpg"><img loading="lazy" decoding="async" class="alignnone" src="https://miko.info/wp-content/uploads/2021/12/PC050121-min-1024x768.jpg" alt="" width="613" height="459"></a></p>
<h2 id="i-5">機能について</h2>
<p>ヘッドセットとして使えるのはもちろんのことですが、<br>
他に搭載されている機能について紹介します。</p>
<h3 id="i-6">マルチペアリング</h3>
<p>最大2台までペアリングが可能とのことでした。</p>
<p>手順が少し複雑なのと、<br>
同時には音を流せないっぽい？のであまり利用はしていません。</p>
<h3 id="i-7">NFCペアリング</h3>
<p>NFCペアリングに対応しており、対応機種であればイヤホンに近づけるだけでペアリングできます。</p>
<p>SONYのZX300がNFCペアリングに対応していたことを思い出したので、<br>
試してみましたがすぐにペアリングできて楽でした。</p>
<h2 id="i-8">２週間使ってみた感想</h2>
<h3 id="i-9">良かった点</h3>
<p><a href="https://miko.info/wp-content/uploads/2021/11/good.jpg"><img loading="lazy" decoding="async" class="alignnone" src="https://miko.info/wp-content/uploads/2021/11/good-1024x683.jpg" alt="" width="459" height="306"></a></p>
<h4 id="i-10">想像以上にハッキリと音が聞こえる</h4>
<p>骨伝導イヤホンは今まで使ったことがなかったので、<br>
<span style="color: #800080; font-size: 14pt;"><strong>音質は良くないんだろうなーとか偏見を持っていた</strong></span>のですが、<br>
そんなことはありませんでした。</p>
<p>通話の声や音楽が<span style="color: #ff0000; font-size: 14pt;"><strong>ハッキリと</strong></span>聞こえてきます。</p>
<p>本気で集中したいときはヘッドホンを使っていますが、<br>
ちょっと音楽聞きたいなーって時はOpenCommを利用しています。</p>
<h4 id="i-11">軽い！</h4>
<p>35gと<span style="color: #ff0000; font-size: 14pt;"><strong>非常に軽い</strong></span>です。</p>
<p>ワークスタイル上、ほぼ１日中ヘッドセットをつける必要があるのですが、<br>
<strong>着けっぱなしの状態でも気になりません</strong>。</p>
<p>ヘッドセットを着け、<br>
音楽を聴きながら昼食を作ったりしています。</p>
<h4 id="i-12">耳が塞がれないことによる開放感が素晴らしい！</h4>
<p>耳が完全に覆われるタイプのヘッドセットを使っていたので、<br>
圧迫感を感じていて、長時間利用するとなると耳の蒸れが気になっていました。</p>
<p>しかし、骨伝導イヤホンがこの悩みを解決してくれました！</p>
<h4 id="i-13">生活音が聞こえるようになった</h4>
<p>これはデメリット？として捉える人もいるでしょうが、<br>
周囲の音もちゃんと聞こえてきます。</p>
<p>私にとっては<span style="color: #ff0000;"><strong>キーボードのタイプ音</strong></span>が良く聞こえるようになったので、<br>
良かった点にあげました。</p>
<h4 id="i-14">マイクもそこそこ良い？</h4>
<p>最初は声がこもっていると言われていたのですが、<br>
前よりちゃんと聞こえると言われました。</p>
<p><strong>だた、何も設定いじってないんですよね…。</strong></p>
<p>馴染んだんでしょうか？</p>
<h3 id="i-15">気になった点</h3>
<p><a href="https://miko.info/wp-content/uploads/2021/11/20211121-00244.jpg"><img loading="lazy" decoding="async" class="alignnone" src="https://miko.info/wp-content/uploads/2021/11/20211121-00244.jpg" alt="" width="387" height="266"></a></p>
<h4 id="i-16">音漏れはする</h4>
<p>骨伝導イヤホンであっても出力する音量が大きければ<strong>音漏れ</strong>します。</p>
<p>私は自宅でしか利用する想定はないので問題ありませんが、<br>
外での利用も検討してる人は家電量販店にて一度試聴・試着してみることをおススメします。</p>
<h4 id="i-17">脳が震える・ゾクゾクする</h4>
<p>通話相手に以下のことをやられると脳が震えるか、ゾクゾクしてしまいます。</p>
<ul>
<li>大きな声を出す</li>
<li>マイクに息を吹きかける（風切り音）</li>
</ul>
<p>当たり前ですけど、めっちゃ骨伝導イヤホンが震えます。</p>
<p>大きな声を出されると<span style="color: #800080;"><strong>脳が震える</strong></span>気がしますし、<br>
風切り音を聞くと背筋が<span style="color: #800080;"><strong>ゾワっと</strong></span>します。</p>
<p><del><span style="color: #808080;">若干、楽しんできてる自分がいます。</span></del></p>
<h4 id="i-18">音量調整ボタンが不便・ミュートボタンがない</h4>
<p>音量調整ボタンを押しても、<strong>音楽再生中</strong>でないと「バッテリーの残量」を教えてくれるシステム音声が流れ、音量調整ができません。</p>
<p>私はSlackを利用して通話をしていますが、<br>
音量調整に対応はしていなかったので、別の方法でシステムの音量をいじってます。</p>
<p>今まで使っていたヘッドセットには、<br>
物理的なミュートボタンがあったのでクシャミが出そうでも安心だったのですが…<br>
ないとここまで不安になるとは思ってなかったです🤧</p>
<h2 id="i-19">まとめ</h2>
<p>このレビュー記事を書いている間に、意外と気になった点が出てきたなーとは思ったのですが、<br>
<span style="font-size: 14pt;"><a href="https://amzn.to/3EV1X9r">AfterShokz OpenComm</a></span>には<span style="color: #ff0000;"><strong>満足</strong></span>しています。</p>
<p>イヤホン側でのコントロール部分には色々と不満はありますが、<br>
パソコンやスマートフォン側で補えるので、<br>
私はこれからもリモートワークのお供として使っていこうと思っています。</p>
<p>ですが、人によっては慣れない可能性も十分にあり得るので、<br>
家電量販店にて視聴・試着してみることをおススメします！</p>
]]></content:encoded>
  </item>
  <item>
    <title>Re:VIEWを使ってあなたも著者になろう</title>
    <link>https://miko.info/review/</link>
    <guid isPermaLink="false">https://miko.info/?p=2368</guid>
    <pubDate>Sat, 27 Nov 2021 01:41:07 GMT</pubDate>
    <dc:creator>miko</dc:creator>
    <category><![CDATA[ツール]]></category><category><![CDATA[Re:VIEW]]></category>
    <description><![CDATA[先日、社内で勉強会を開催したのですが、その時に資料として「本」を作って配布しました。 「本」を作っていく作業の中で色々と得られるものがあったので、 それらについ…]]></description>
    <content:encoded><![CDATA[<p>先日、社内で勉強会を開催したのですが、その時に資料として「本」を作って配布しました。</p>
<p>「本」を作っていく作業の中で色々と得られるものがあったので、<br>
それらについてダラダラと紹介する自分語り記事です。</p>
<h2 id="i-0">なぜ「本」を作ることにしたの？</h2>
<p><a href="https://miko.info/wp-content/uploads/2021/11/idea.jpg"><img loading="lazy" decoding="async" class="alignnone" src="https://miko.info/wp-content/uploads/2021/11/idea.jpg" alt="" width="561" height="374"></a></p>
<p><span style="font-size: 12pt; color: #000000;">なぜ「本」を作ることにしたのか？</span>ですが、深い理由はありません。</p>
<p><span style="font-size: 14pt; color: #ff6600;"><strong>いつもと変わったこと</strong></span>をやりたかっただけです。</p>
<p>大体、勉強会の資料としてはスライドやWikiページを作っているのですが。</p>
<div class="say left">
<p class="faceicon"><img decoding="async" src="https://miko.info/wp-content/uploads/2021/04/RsL-_gwB_400x400.jpg" width="110" loading="lazy" class=""><span></span></p>
<div class="chatting">
<div class="sc">なんか変わったことしたいなー。</div>
</div></div>
<div class="say left">
<p class="faceicon"><img decoding="async" src="https://miko.info/wp-content/uploads/2021/04/RsL-_gwB_400x400.jpg" width="110" loading="lazy" class=""><span></span></p>
<div class="chatting">
<div class="sc">あっ「本」作るか！</div>
</div></div>
<p>ただ、それだけです。<span style="color: #ff6600; font-size: 14pt;"><strong>思い立ったら吉日</strong></span>がモットーです。</p>
<h2 id="i-1">どうやって「本」を作ったの？</h2>
<p><a href="https://miko.info/wp-content/uploads/2021/11/create.jpg"><img loading="lazy" decoding="async" class="alignnone" src="https://miko.info/wp-content/uploads/2021/11/create-1024x613.jpg" alt="" width="543" height="325"></a></p>
<p><a href="https://reviewml.org/ja/" target="_blank" rel="noopener">Re:VIEW</a>という電子・紙書籍制作ツールを使って「本」を作成しました。</p>
<blockquote><p>Re:VIEWは電子書籍と紙書籍のための、簡潔かつ強力なデジタル出版ツールです。<br>
コンピュータ書等の技術書籍（紙・電子）の商業出版や同人出版に利用されています。</p></blockquote>
<p>技術系の同人誌即売会である<span style="font-size: 14pt;"><a href="https://techbookfest.org/">技術書典</a></span>で頒布されている技術書の執筆にも使われているらしいです。</p>
<h3 class="hh hh19" id="i-2">Re:VIEWのセットアップ方法</h3>
<p>セットアップ方法についてLinux・Macは簡単ですが、Windowsだとちょっと手間がかかります。</p>
<h4 id="i-3"><strong>Linux・Mac</strong></h4>
<p>Linux、Macでは以下のコマンドを実行してもらうだけでOKです。</p>
<pre class="code" data-lang="powershell"><code class="language-powershell" data-hl="done"><span class="line"><span style="color:#ADBAC7">gem install review</span></span>
<span class="line"><span style="color:#ADBAC7">review</span><span style="color:#F47067">-</span><span style="color:#ADBAC7">init sample</span><span style="color:#F47067">-</span><span style="color:#ADBAC7">doc</span></span>
<span class="line"><span style="color:#ADBAC7">cd sample</span><span style="color:#F47067">-</span><span style="color:#ADBAC7">doc</span></span></code></pre>
<h4 id="i-4">Windows</h4>
<p>WSL2かDockerを利用する必要がありますが、<br>
今回は「<a href="https://github.com/vvakame/docker-review/blob/master/doc/windows-review.md">WindowsでDocker+Re:VIEWを使う</a>」を参考にし、構築手順を説明させていただきます。</p>
<h5 id="i-5">Docker作業</h5>
<p>作業ディレクトリを作成し、その中にdocker-compose.ymlを作成します。</p>
<pre class="code" data-lang="yaml"><code class="language-yaml" data-hl="done"><span class="line"><span style="color:#8DDB8C">version</span><span style="color:#ADBAC7">: </span><span style="color:#96D0FF">'3'</span></span>
<span class="line"><span style="color:#8DDB8C">services</span><span style="color:#ADBAC7">:</span></span>
<span class="line"><span style="color:#8DDB8C">  review</span><span style="color:#ADBAC7">:</span></span>
<span class="line"><span style="color:#8DDB8C">    image</span><span style="color:#ADBAC7">: </span><span style="color:#96D0FF">vvakame/review</span></span>
<span class="line"><span style="color:#8DDB8C">    volumes</span><span style="color:#ADBAC7">:</span></span>
<span class="line"><span style="color:#ADBAC7">      - </span><span style="color:#96D0FF">.:/work</span></span>
<span class="line"><span style="color:#8DDB8C">    build</span><span style="color:#ADBAC7">: </span><span style="color:#6CB6FF">.</span></span>
<span class="line"><span style="color:#8DDB8C">    working_dir</span><span style="color:#ADBAC7">: </span><span style="color:#96D0FF">/work</span></span>
<span class="line"><span style="color:#8DDB8C">    ports</span><span style="color:#ADBAC7">:</span></span>
<span class="line"><span style="color:#ADBAC7">      - </span><span style="color:#96D0FF">"127.0.0.1:18000:18000"</span></span></code></pre>
<p>&nbsp;</p>
<p>次にDockerコマンドを実行し、Re:VIEWのイメージをプルします。<br>
ダウンロードに結構時間がかかります。</p>
<pre class="code" data-lang="text"><code class="language-text" data-hl="done"><span class="line"><span>docker pull vvakame/review</span></span></code></pre>
<h5 id="i-6">Re:VIEWドキュメントの雛型作成</h5>
<p>以下のコマンドを実行してRe:VIEWドキュメントの雛型を作成します。<br>
ついでにdocker-compose.ymlファイルをsampledocフォルダにコピーしてください。</p>
<pre class="code" data-lang="text"><code class="language-text" data-hl="done"><span class="line"><span>docker-compose run --rm review review-init sampledoc</span></span>
<span class="line"><span>cp docker-compose.yml sampledoc</span></span></code></pre>
<h3 class="hh hh19" id="i-7">「本」の編集と出力</h3>
<p>sampledocというフォルダが作成されているので、移動してみましょう。</p>
<pre class="code" data-lang="text"><code class="language-text" data-hl="done"><span class="line"><span>cd sampledoc</span></span></code></pre>
<p>&nbsp;</p>
<h4 id="i-8">ファイルについて</h4>
<p>とりあえずそれっぽい「本」を作るために編集するファイルを紹介します。</p>
<table style="border-collapse: collapse; width: 100%; height: 169px;">
<tbody>
<tr style="height: 39px;">
<th style="width: 25.0629%; height: 39px;">フォルダ／ファイル名</th>
<th style="width: 74.9371%; height: 39px;">概要</th>
</tr>
<tr style="height: 39px;">
<td style="width: 25.0629%; height: 39px;">config.yml</td>
<td style="width: 74.9371%; height: 39px;">設定ファイル。署名や著者名、基準のフォントサイズなど色々と設定できる。</td>
</tr>
<tr style="height: 39px;">
<td style="width: 25.0629%; height: 39px;">sampledoc.re</td>
<td style="width: 74.9371%; height: 39px;">文章を書くためのファイル。ここにあれやこれやを書いていく。</td>
</tr>
<tr style="height: 39px;">
<td style="width: 25.0629%; height: 39px;">sty</td>
<td style="width: 74.9371%; height: 39px;">LaTeXのスタイルファイルが格納されたフォルダ</td>
</tr>
<tr style="height: 13px;">
<td style="width: 25.0629%; height: 13px;">sty/review-custom.sty</td>
<td style="width: 74.9371%; height: 13px;">スタイルカスタム用のファイル。スタイルファイルの中でも最後に読み込まれるので、独自にスタイルを修正したいときはこのファイルをいじる。</td>
</tr>
</tbody>
</table>
<p>他のファイル／フォルダについては「<a href="https://review-knowledge-ja.readthedocs.io/ja/latest/faq/faq-usage.html#04045f94fabcc2e1b70dd89e620a666c">FAQ – Re:VIEW の使い方について</a>」を参照してください。</p>
<h4 id="i-9">ファイルを編集してみる</h4>
<p><strong>sampledoc.re</strong>をテキストエディタで開いて以下の内容を入力してみてください。</p>
<pre class="code" data-lang="text"><code class="language-text" data-hl="done"><span class="line"><span>= Hello World</span></span>
<span class="line"><span>//lead{</span></span>
<span class="line"><span>リード文です。導入文です。</span></span>
<span class="line"><span>//}</span></span>
<span class="line"><span></span></span>
<span class="line"><span>== ほろびのじゅもん</span></span>
<span class="line"><span></span></span>
<span class="line"><span>これは滅びの呪文です。絶対に入力してはいけませんよ！！</span></span>
<span class="line"><span></span></span>
<span class="line"><span>//cmd{</span></span>
<span class="line"><span>sudo rm -rf</span></span>
<span class="line"><span>//}</span></span>
<span class="line"><span></span></span>
<span class="line"><span>= End World</span></span>
<span class="line"><span>//lead{</span></span>
<span class="line"><span>なぜ入力してしまったのですか…。</span></span>
<span class="line"><span>//}</span></span>
<span class="line"><span></span></span>
<span class="line"><span>== ふっかつのじゅもん</span></span>
<span class="line"><span></span></span>
<span class="line"><span>これで復活するのです…。</span></span>
<span class="line"><span></span></span>
<span class="line"><span>//source[ふっかつのじゅもん]{</span></span>
<span class="line"><span>ゆうて　いみや　おうきむ</span></span>
<span class="line"><span>こうほ　りいゆ　うじとり</span></span>
<span class="line"><span>やまあ　きらぺ　ぺぺぺぺ</span></span>
<span class="line"><span>ぺぺぺ　ぺぺぺ　ぺぺぺぺ</span></span>
<span class="line"><span>ぺぺぺ　ぺぺぺ　ぺぺぺぺ　ぺぺ</span></span>
<span class="line"><span>//}</span></span></code></pre>
<p>マークダウンでもなく見たことのない記法かもしれませんが、Re:VIEWを使うにはRe:VIEW記法？を使わないといけません！私もすべてを把握できていないので、詳しくは<a href="https://github.com/kmuto/review/blob/master/doc/format.ja.md">Re:VIEW フォーマットガイド</a>を参照してください。</p>
<p>ついでに<strong>config.yml</strong>を開いて表紙のタイトルや著者名を変えてしまいましょう。</p>
<pre class="code" data-lang="text"><code class="language-text" data-hl="done"><span class="line"><span># ブック名(ファイル名になるもの。ASCII範囲の文字を使用)</span></span>
<span class="line"><span>bookname: はじめての本</span></span>
<span class="line"><span></span></span>
<span class="line"><span># 記述言語。省略した場合はja</span></span>
<span class="line"><span>language: ja</span></span>
<span class="line"><span></span></span>
<span class="line"><span># 書名</span></span>
<span class="line"><span>booktitle: はじめての本</span></span>
<span class="line"><span></span></span>
<span class="line"><span># 著者名。「, 」で区切って複数指定できる</span></span>
<span class="line"><span>aut: ["たなかさん"]</span></span></code></pre>
<h4 id="i-10">PDFで「本」を出力する</h4>
<p>ファイルが編集し終わったら、後はコマンドを実行するだけで、「本」を作成することができます。</p>
<pre class="code" data-lang="text"><code class="language-text" data-hl="done"><span class="line"><span>docker-compose run --rm review rake pdf</span></span></code></pre>
<p>&nbsp;</p>
<p>出力されたPDFを開くと、技術書でよく見るレイアウトでPDFファイルに出力されます。</p>
<p><a href="https://miko.info/wp-content/uploads/2021/11/20211126-195256.jpg"><img loading="lazy" decoding="async" class="alignnone" src="https://miko.info/wp-content/uploads/2021/11/20211126-195256.jpg" alt="" width="511" height="725"></a></p>
<p>デフォルトのレイアウトのままでも読みやすく、問題なく使えます。</p>
<h4 id="i-11">レイアウトをちょっといじってみる</h4>
<p>初期のレイアウト設定でも問題ないのですが、他のページを見てみるとヘッダー部分の文字が重なっている部分があります。</p>
<p><a href="https://miko.info/wp-content/uploads/2021/11/20211126-195448.jpg"><img loading="lazy" decoding="async" class="alignnone" src="https://miko.info/wp-content/uploads/2021/11/20211126-195448.jpg" alt="" width="465" height="214"></a></p>
<p>これを解決するにはフォルダ「sty」内にあるファイル「review-custom.sty」を編集して対処しましょう。TeXの知識など全然ないので「<a href="https://acro-engineer.hatenablog.com/entry/2018/12/18/120000">Re:VIEW 3.0でレイアウトをカスタマイズしたい！</a>」を参考にさせていただきました！</p>
<p>以下のコードをコピペしてファイルを保存後に再度PDF出力してみましょう。すると偶数ページには章名、奇数ページには節名を表示されているはずです。</p>
<pre class="code" data-lang="text"><code class="language-text" data-hl="done"><span class="line"><span>% for user-defined macro</span></span>
<span class="line"><span>\lhead[\gtfamily\sffamily\bfseries\upshape \leftmark]{}</span></span>
<span class="line"><span>\rhead[]{\gtfamily\sffamily\bfseries\upshape \rightmark}</span></span></code></pre>
<h2 id="i-12">「本」を書いてみて良かったこと</h2>
<p><a href="https://miko.info/wp-content/uploads/2021/11/good.jpg"><img loading="lazy" decoding="async" class="alignnone" src="https://miko.info/wp-content/uploads/2021/11/good-1024x683.jpg" alt="" width="547" height="365"></a></p>
<p>「本」を書いてみて大変なこともありましたが、良かった点もいくつかあります。</p>
<h3 class="hh hh19" id="i-13">文章を書くことが楽しくなってきた</h3>
<p>これが一番自分にとって良かった点です。<br>
文章を書いてそれを「本」に変換して読んでみるだけで何故か楽しくなってきました。</p>
<p>形から入る人間なので、それっぽい物ができると調子に乗ってハマっていってしまいます。</p>
<p><span style="color: #ff6600;"><strong><span style="font-size: 18pt;">私も著者に…？！</span></strong></span></p>
<p>などと妄想しつつ、一人で著者、校正者をそれぞれ演じて自分にダメ出しをやってると<strong><span style="color: #800080;">虚しさ</span></strong>を感じつつも何か<strong><span style="color: #ff6600;">楽しかった</span></strong>です。</p>
<h3 class="hh hh19" id="i-14">感覚を言語化することを意識するようになった</h3>
<p>私はコーディングや設計などについて「●●な感じに～」とかふわっとした説明をしがちなのですが、「本」にするとなると曖昧な表現を<span style="color: #ff6600; font-size: 14pt;"><strong>言語化</strong></span>する必要がありました。</p>
<p>感覚的にやっている、何となくやれていることを言語化するのは大変でした。<br>
ですが、言語化できると頭の中がスッキリし、自分自身に対する理解度も上がった気がします。</p>
<p>結果的に曖昧な表現・感覚的な表現をしてしまった後は、言語化するように意識するようになりました。</p>
<h3 class="hh hh19" id="i-15">技術書典に参加できる気がしてきた</h3>
<p>技術書典には前々から興味はあったのですが、<br>
<span style="color: #993366; font-size: 18pt;">自分に技術書は書けない…</span><br>
と思い込んでいました。</p>
<p>ですが、Re:VIEWを使うだけでこんなに簡単に技術書を書けると知れたので、<br>
ネタさえ用意できれば<span style="font-size: 18pt; color: #ff6600;"><strong>自分も参加できる！</strong></span>と自信を持てました。</p>
<p><span style="color: #808080; font-size: 10pt;">まぁ、ネタを探すのが最大の難所ではあるのですが。</span></p>
<h2 id="i-16">まとめ</h2>
<p>まだ文章を書くことが苦手なのは変えることはできていませんが、引き続き文章を書く習慣を身に付けていこうと思いました。</p>
<p>自分みたいに思い立ったから「本」を書いてみるのも良いですし、<br>
<span style="font-size: 18pt; color: #ff6600;"><strong>何かアウトプットしたい</strong></span>けれどもする場所・機会がない…という方は<br>
是非<span style="font-size: 18pt; color: #ff6600;"><strong>「本」</strong></span>を書いてみてはいかがでしょうか？</p>
<p>私は来年に何かしらの技術系の同人誌を出せるように頑張っていきます…。</p>
]]></content:encoded>
  </item>
</channel>
</rss>
