<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Doa</title><description>気ままな備忘録</description><link>https://doany.io/</link><language>ja</language><item><title>小〜中規模のWebアプリをSvelteKit + Bun + SQLiteに寄せてみた</title><link>https://doany.io/posts/svelte-bun-sqlite/</link><guid isPermaLink="true">https://doany.io/posts/svelte-bun-sqlite/</guid><description>Django + Nuxtで作っていたアプリをSvelteKit一本に書き直してから、個人で作るものは全部同じ構成にしています。バックエンドを分けるのをやめた理由やReactではなくSvelteにした理由、SQLiteで足りると判断した根拠、Bunで踏んだ穴などを実際のリポジトリを引きながら書いていきます。</description><pubDate>Fri, 04 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;久しぶりにウェブ寄りのネタです。&lt;br&gt;
ここ1年ほど個人で作っているWebアプリは全部SvelteKit + Bun + SQLiteの構成にしているのですが、なぜそうなったのかを一度まとめておこうと思います。&lt;/p&gt;
&lt;section&gt;&lt;h2 id=&quot;概要&quot;&gt;概要&lt;a class=&quot;anchor&quot; href=&quot;#概要&quot;&gt;&lt;span class=&quot;anchor-icon&quot; data-pagefind-ignore=&quot;&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;現状動かしているものは下記の通りです。&lt;/p&gt;


































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;td&gt;&lt;/td&gt;&lt;th&gt;何をするもの&lt;/th&gt;&lt;th&gt;公開&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;th scope=&quot;row&quot;&gt;&lt;a href=&quot;https://w.doany.io/&quot;&gt;worklog&lt;/a&gt;&lt;/th&gt;&lt;td&gt;SlackやGitHubのログから稼働表を作るやつ&lt;/td&gt;&lt;td&gt;サービスのみ&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th scope=&quot;row&quot;&gt;&lt;a href=&quot;https://x.doany.io/&quot;&gt;𝕏ool&lt;/a&gt;&lt;/th&gt;&lt;td&gt;𝕏の1日分の成績を通信簿として自動ポストするやつ&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://github.com/DAnything/xool&quot;&gt;ソース&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th scope=&quot;row&quot;&gt;mogiri&lt;/th&gt;&lt;td&gt;QRを使った入場受付と、事前購入・セルフレジ&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://github.com/5ym/mogiri&quot;&gt;ソース&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th scope=&quot;row&quot;&gt;denpa&lt;/th&gt;&lt;td&gt;テレビの番組表、予約、録画、配信&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://github.com/DAnything/denpa&quot;&gt;ソース&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th scope=&quot;row&quot;&gt;&lt;a href=&quot;https://ts.doany.io/&quot;&gt;tamasagashi&lt;/a&gt;&lt;/th&gt;&lt;td&gt;公的データから作った車両マスター(型式 → 通称名・諸元)の閲覧&lt;/td&gt;&lt;td&gt;サービスのみ&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;5つともpackage.jsonの中身がほぼ同じで、SvelteKit 2 + Svelte 5、adapter-node、Blades(Pico CSSの後継)、bun:sqlite、TypeScript 7、起動は&lt;code&gt;bun build/index.js&lt;/code&gt;という構成になっています。&lt;br&gt;
別に最初から揃えようと思っていたわけではなく、1個書き直したら楽だったので以降全部そうなった、というのが正直なところです。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2 id=&quot;書き直しに至った経緯&quot;&gt;書き直しに至った経緯&lt;a class=&quot;anchor&quot; href=&quot;#書き直しに至った経緯&quot;&gt;&lt;span class=&quot;anchor-icon&quot; data-pagefind-ignore=&quot;&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;mogiri(旧 Smart QR Payment)は元々Django REST Frameworkのバックエンドと、Nuxt(Vuetify)のフロントエンドの2本立てで2024年頃に作ったものでした。&lt;br&gt;
その後しばらく触っていなかったのですが、触っていなくてもRenovateのPRだけは来続けます。2026年7月の履歴を見ると下記の様な感じで、依存を上げてはそれを動く状態に運ぶだけのコミットが挟まっています。&lt;/p&gt;&lt;div class=&quot;expressive-code&quot;&gt;&lt;figure class=&quot;frame&quot;&gt;&lt;figcaption class=&quot;header&quot;&gt;&lt;/figcaption&gt;&lt;pre data-language=&quot;text&quot; class=&quot;wrap&quot; style=&quot;--ecMaxLine:63ch&quot;&gt;&lt;code&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;2026-07-28  Update dependency Django to v3.2.25&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;2026-07-28  Update dependency @nuxt/eslint-config to ^0.7.0&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;2026-07-29  Carry the dependency bumps through to a working app&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;button class=&quot;copy-btn&quot; aria-label=&quot;コードをコピー&quot;&gt;&lt;div class=&quot;copy-btn-icon&quot;&gt;&lt;svg viewBox=&quot;0 0 24 24&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;copy-btn-icon copy-icon&quot;&gt;&lt;g fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-width=&quot;2&quot;&gt;&lt;rect width=&quot;14&quot; height=&quot;14&quot; x=&quot;8&quot; y=&quot;8&quot; rx=&quot;2&quot; ry=&quot;2&quot;&gt;&lt;/rect&gt;&lt;path d=&quot;M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;svg viewBox=&quot;0 0 24 24&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;copy-btn-icon success-icon&quot;&gt;&lt;path fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-width=&quot;2&quot; d=&quot;M20 6L9 17l-5-5&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;/button&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;言語が2つ、ランタイムが2つ、コンテナが2つ。この規模のアプリでそれぞれの更新に付き合うのは割に合わないと感じました。&lt;br&gt;
小規模なアプリケーションでバックエンドを分けるのは過剰で、単一コンテナにしたほうがいいだろうということで、2026年8月に丸ごと書き直しました。APIと画面は1つのSvelteKitアプリに統合、コンテナは1つ、k3s上ではPVC1つの単一Podです。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2 id=&quot;svelteにした理由&quot;&gt;Svelteにした理由&lt;a class=&quot;anchor&quot; href=&quot;#svelteにした理由&quot;&gt;&lt;span class=&quot;anchor-icon&quot; data-pagefind-ignore=&quot;&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;元々Vueだったので普通に考えればReactかそのままNuxtなのですが、Svelteに行きました。&lt;/p&gt;&lt;p&gt;理由は単純で書く量が少なく、生成されるコードも読みやすいからです。Svelte 5のrunesは状態の扱いが素直で、後述しますが実装の多くをAIに書かせているので、出てきたコードを自分が読んで直せるかどうかが結構効いてきます。&lt;br&gt;
ReactもtsxはReact Compilerのおかげで&lt;code&gt;useMemo&lt;/code&gt;の管理を意識しなくてよくなったとはいえ、Svelteほど記述が楽になったわけではないと思います。加えてReactの生態系の速さと重さについていく気が個人的にありません。Next.jsはVercel専用の機能が多く、自分のk3sに載せる場合その辺が邪魔になります。&lt;/p&gt;&lt;p&gt;Nuxtを辞めたのは破壊的変更が多い割に、上に挙げたメリットが薄かったからです。&lt;/p&gt;&lt;p&gt;SvelteKitにするとAPIと画面が1つになります。Nextでもできることではあるのですが、SvelteKitのほうが素直に組めて、adapter-nodeで普通のNodeサーバとして吐き出せるので置き場所を選びません。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2 id=&quot;sqliteに関して&quot;&gt;SQLiteに関して&lt;a class=&quot;anchor&quot; href=&quot;#sqliteに関して&quot;&gt;&lt;span class=&quot;anchor-icon&quot; data-pagefind-ignore=&quot;&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;bun:sqliteがBunに標準で入っていて速い、ドライバも別プロセスも要らない、DBはファイル1つ。k3sではPVCを1つ持たせれば完結し、バックアップはファイルのコピーで済みます。&lt;/p&gt;&lt;p&gt;限界は分かったうえで使っています。書き込みは単一ライターで水平スケールはできません。denpaは1本のSQLiteにスケジューラも番組表の取得も書きに行くので、レプリカは1つで&lt;code&gt;strategy: Recreate&lt;/code&gt;にしてあります。&lt;br&gt;
それでもSQLiteにしたのは小規模のアプリでPostgreSQLを立てると余計な管理コストのほうが大きいためです。最近は中規模のアプリでもSQLiteの採用が増えていますし、CloudflareのD1のように本番前提のサービスも出てきているので、プロダクションで使う分には十分耐えられると判断しました。規模が大きくなったらPostgreSQLにする、と決めたうえでの選択です。&lt;/p&gt;&lt;p&gt;起動時に入れているのは下記だけです。&lt;/p&gt;&lt;div class=&quot;expressive-code&quot;&gt;&lt;figure class=&quot;frame&quot;&gt;&lt;figcaption class=&quot;header&quot;&gt;&lt;/figcaption&gt;&lt;pre data-language=&quot;ts&quot; class=&quot;wrap&quot; style=&quot;--ecMaxLine:54ch&quot;&gt;&lt;code&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#F97583&quot;&gt;export&lt;/span&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt; &lt;/span&gt;&lt;span style=&quot;--0:#F97583&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt; &lt;/span&gt;&lt;span style=&quot;--0:#79B8FF&quot;&gt;db&lt;/span&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt; &lt;/span&gt;&lt;span style=&quot;--0:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt; &lt;/span&gt;&lt;span style=&quot;--0:#F97583&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt; &lt;/span&gt;&lt;span style=&quot;--0:#B392F0&quot;&gt;Database&lt;/span&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt;(url, { create: &lt;/span&gt;&lt;span style=&quot;--0:#79B8FF&quot;&gt;true&lt;/span&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt; });&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt;db.&lt;/span&gt;&lt;span style=&quot;--0:#B392F0&quot;&gt;exec&lt;/span&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--0:#9ECBFF&quot;&gt;&apos;PRAGMA journal_mode = WAL;&apos;&lt;/span&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt;db.&lt;/span&gt;&lt;span style=&quot;--0:#B392F0&quot;&gt;exec&lt;/span&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--0:#9ECBFF&quot;&gt;&apos;PRAGMA foreign_keys = ON;&apos;&lt;/span&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#B392F0&quot;&gt;ensureSchema&lt;/span&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt;(db);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;button class=&quot;copy-btn&quot; aria-label=&quot;コードをコピー&quot;&gt;&lt;div class=&quot;copy-btn-icon&quot;&gt;&lt;svg viewBox=&quot;0 0 24 24&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;copy-btn-icon copy-icon&quot;&gt;&lt;g fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-width=&quot;2&quot;&gt;&lt;rect width=&quot;14&quot; height=&quot;14&quot; x=&quot;8&quot; y=&quot;8&quot; rx=&quot;2&quot; ry=&quot;2&quot;&gt;&lt;/rect&gt;&lt;path d=&quot;M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;svg viewBox=&quot;0 0 24 24&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;copy-btn-icon success-icon&quot;&gt;&lt;path fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-width=&quot;2&quot; d=&quot;M20 6L9 17l-5-5&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;/button&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;section&gt;&lt;h3 id=&quot;索引に関して&quot;&gt;索引に関して&lt;a class=&quot;anchor&quot; href=&quot;#索引に関して&quot;&gt;&lt;span class=&quot;anchor-icon&quot; data-pagefind-ignore=&quot;&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;SQLiteでも索引をちゃんと張れば検索は十分速い、という例がtamasagashiです。国交省の燃費一覧や官報の型式指定、リコール届出といった公的データをJSONLにしたものを、ビルド時にSQLiteへ取り込んでイメージに焼き込み、実行時は読み取り専用で開いています。書き込みが無いので単一ライターの制約は最初から関係ありません。&lt;br&gt;
検索のキーになる型式と通称名はひらがな・カタカナ・全角半角・空白・ハイフンの違いを無視したいのですが、これをクエリ側で毎回やると索引が効かなくなるので、取り込み時に正規化した&lt;code&gt;code_norm&lt;/code&gt;・&lt;code&gt;name_norm&lt;/code&gt;という列を別に持たせ、そこに索引を張って&lt;code&gt;LIKE&lt;/code&gt;で引いています。取り込み時と検索時で同じ正規化関数を通すのが要点で、表記揺れの吸収は取り込みの段階で終わらせておく形です。&lt;br&gt;
その他にも複合主キーだけで引く表は&lt;code&gt;WITHOUT ROWID&lt;/code&gt;にする、取り込み中は&lt;code&gt;PRAGMA synchronous = OFF&lt;/code&gt;で流し込んで最後に&lt;code&gt;wal_checkpoint(TRUNCATE)&lt;/code&gt;と&lt;code&gt;VACUUM&lt;/code&gt;で固めてから配る、といった辺りは全部SQLiteの標準機能で済んでいます。この規模で「SQLiteだから遅い」と感じたことは今のところありません。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3 id=&quot;ormに関して&quot;&gt;ORMに関して&lt;a class=&quot;anchor&quot; href=&quot;#ormに関して&quot;&gt;&lt;span class=&quot;anchor-icon&quot; data-pagefind-ignore=&quot;&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;書き直しの初版ではDrizzle ORMを入れていたのですが、この規模だとORMが吸収してくれる差分が特になく、SQLを直接書いたほうが読めるし直せるのでその日のうちに外しました。いまは&lt;code&gt;ddl.ts&lt;/code&gt;にスキーマ、&lt;code&gt;repo.ts&lt;/code&gt;に生のSQLを書いた薄い層だけになっています。&lt;/p&gt;&lt;blockquote class=&quot;admonition bdm-note&quot;&gt;
&lt;span class=&quot;bdm-title&quot;&gt;NOTE&lt;/span&gt;
&lt;p&gt;SQLiteらしい使い方として、denpaでは録画の&lt;code&gt;state&lt;/code&gt;を生成列にしています。書き込もうとするとSQLite側が拒むので、事実と状態が食い違いようがありません。文字列で別に持っていた頃はここがずれてバグの温床になっていました。&lt;/p&gt;
&lt;/blockquote&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2 id=&quot;bunに関して&quot;&gt;Bunに関して&lt;a class=&quot;anchor&quot; href=&quot;#bunに関して&quot;&gt;&lt;span class=&quot;anchor-icon&quot; data-pagefind-ignore=&quot;&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;bun:sqliteとBun.password(argon2id)が同梱されていて、ネイティブ依存を入れずにDBとパスワードハッシュが済むこと。TypeScriptをそのまま実行できて起動も速いこと。この2つです。&lt;/p&gt;&lt;p&gt;副産物として本番のnode_modulesが消えました。adapter-nodeはdevDependenciesをサーバのビルドに束ねてdependenciesだけを外に残す仕様なので、実行時に本当に必要なものをdevDependenciesに寄せるとdependenciesが空になり、Bunとビルド出力だけで動きます。Dockerfileの最終ステージからinstallが消えました。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2 id=&quot;bunで引っかかった点&quot;&gt;Bunで引っかかった点&lt;a class=&quot;anchor&quot; href=&quot;#bunで引っかかった点&quot;&gt;&lt;span class=&quot;anchor-icon&quot; data-pagefind-ignore=&quot;&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;良いことばかり書いても仕方がないので、実際に引っかかったところも書いておきます。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Nodeでは起動できない&lt;br&gt;
bun:sqliteを使った時点でそのアプリはBunでしか動きません。READMEに「必ずBunで起動してください」と書く羽目になります。乗り換えの逃げ道は自分で塞いでいます。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ローカルのBunとコンテナのBunでバージョンが違うと事故る&lt;br&gt;
一度踏んでから開発は全部コンテナ内に寄せました。リポジトリ直下で&lt;code&gt;bun install&lt;/code&gt;すると下記のpreinstallが止めます。&lt;/p&gt;
&lt;div class=&quot;expressive-code&quot;&gt;&lt;figure class=&quot;frame&quot;&gt;&lt;figcaption class=&quot;header&quot;&gt;&lt;/figcaption&gt;&lt;pre data-language=&quot;json&quot; class=&quot;wrap&quot; style=&quot;--ecMaxLine:90ch&quot;&gt;&lt;code&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#9ECBFF&quot;&gt;&quot;preinstall&quot;&lt;/span&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--0:#9ECBFF&quot;&gt;&quot;test &lt;/span&gt;&lt;span style=&quot;--0:#79B8FF&quot;&gt;\&quot;&lt;/span&gt;&lt;span style=&quot;--0:#9ECBFF&quot;&gt;$PWD&lt;/span&gt;&lt;span style=&quot;--0:#79B8FF&quot;&gt;\&quot;&lt;/span&gt;&lt;span style=&quot;--0:#9ECBFF&quot;&gt; = /usr/src/app || { echo &apos;ローカルで install しないでください&apos;; exit 1; }&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;button class=&quot;copy-btn&quot; aria-label=&quot;コードをコピー&quot;&gt;&lt;div class=&quot;copy-btn-icon&quot;&gt;&lt;svg viewBox=&quot;0 0 24 24&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;copy-btn-icon copy-icon&quot;&gt;&lt;g fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-width=&quot;2&quot;&gt;&lt;rect width=&quot;14&quot; height=&quot;14&quot; x=&quot;8&quot; y=&quot;8&quot; rx=&quot;2&quot; ry=&quot;2&quot;&gt;&lt;/rect&gt;&lt;path d=&quot;M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;svg viewBox=&quot;0 0 24 24&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;copy-btn-icon success-icon&quot;&gt;&lt;path fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-width=&quot;2&quot; d=&quot;M20 6L9 17l-5-5&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;/button&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ViteをBunで走らせるには&lt;code&gt;bunx --bun vite&lt;/code&gt;と書く必要がある&lt;br&gt;
素の&lt;code&gt;vite&lt;/code&gt;だとNodeで立ち上がります。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;TypeScript 7とsvelte-checkの併存&lt;br&gt;
svelte-checkをTypeScript 7のネイティブ版(tsgo)で走らせるには、&lt;code&gt;typescript@~6&lt;/code&gt;と&lt;code&gt;@typescript/native&lt;/code&gt;のエイリアスを両方入れておく必要があります。速くはなりますが依存の並びは少し気持ち悪いです。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Biomeは&lt;code&gt;.svelte&lt;/code&gt;の&lt;code&gt;&amp;#x3C;script&gt;&lt;/code&gt;しか見ない&lt;br&gt;
テンプレート側で使っている変数を未使用と判定するので、&lt;code&gt;.svelte&lt;/code&gt;では未使用チェックを切っています。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;adapter-nodeはSIGTERMを受けた瞬間にlistenを閉じる&lt;br&gt;
これはBunというよりSvelteKitを長時間走るプロセスとしてk3sに置くときの話です。denpaは録画中にデプロイが来ても録り終わるまで居座る設計なのですが、adapter-nodeの既定の後始末が先に走って、プロセスは生きているのにポートだけ閉じている状態になりました。止まれの合図を自前で受け取って後始末を外す、しかも登録タイミングの都合で2回やる必要がありました。詳細はdenpaの&lt;a href=&quot;https://github.com/DAnything/denpa/blob/main/docs/architecture.md&quot;&gt;architecture.md&lt;/a&gt;に書いてあります。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2 id=&quot;biomeとcssに関して&quot;&gt;BiomeとCSSに関して&lt;a class=&quot;anchor&quot; href=&quot;#biomeとcssに関して&quot;&gt;&lt;span class=&quot;anchor-icon&quot; data-pagefind-ignore=&quot;&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Biomeを選んだのは、自分がきれい好きでライブラリが分散するのを嫌った面が大きいです。ライブラリは少ないにこしたことはないでしょう。mogiriの書き直し直後はESLint + Prettierだったのですが、lintとformatで別々のライブラリと設定ファイルを持って、しかもお互いの相性まで見るのが嫌だったので&lt;code&gt;biome.json&lt;/code&gt;1つと&lt;code&gt;biome check --write&lt;/code&gt;1コマンドに寄せました。Rust製で速いので&lt;code&gt;check&lt;/code&gt;のスクリプトに型チェックと並べて入れても気になりません。&lt;br&gt;
難点は先に書いた通り&lt;code&gt;.svelte&lt;/code&gt;の&lt;code&gt;&amp;#x3C;script&gt;&lt;/code&gt;しか見ないことで、テンプレート側で使っている変数を未使用と判定するので、そこだけルールを切って使っています。&lt;/p&gt;&lt;p&gt;CSSは長らくTailwind + daisyUIでした。立ち上げの段階では決め打ちでUIを作るのが楽で、カスタマイズしたくなったときはTailwindでそのまま手を入れやすい。最初は&lt;code&gt;class=&quot;btn btn-primary&quot;&lt;/code&gt;で済ませておいて、気に入らないところだけ&lt;code&gt;class=&quot;btn btn-primary rounded-full px-8&quot;&lt;/code&gt;とユーティリティを足す、という使い方をしていました。&lt;/p&gt;&lt;p&gt;ただ全アプリを一通り作り終えてから見直すと、実際に出てくる部品は表・フォーム・注意書き・札くらいしかありませんでした。その程度のものに3,000行のコンポーネントCSSを読み込んで、マークアップ側は&lt;code&gt;class=&quot;card bg-base-100 border-base-300 flex flex-col gap-3 p-4 shadow-sm&quot;&lt;/code&gt;のようにクラスを10個並べる形になっていて、半年後の自分が読んで何をしているのか分からない。utility classは書くのは速いのですが、&lt;strong&gt;読む&lt;/strong&gt;ときには全部のクラス名を頭の中でCSSに戻す作業が要ります。&lt;/p&gt;&lt;p&gt;なので一度&lt;a href=&quot;https://picocss.com/&quot;&gt;Pico CSS&lt;/a&gt;に全部移しました。素の&lt;code&gt;&amp;#x3C;button&gt;&lt;/code&gt;や&lt;code&gt;&amp;#x3C;table&gt;&lt;/code&gt;にそのまま見た目が付くクラスレスのCSSです。&lt;/p&gt;&lt;blockquote class=&quot;admonition bdm-note&quot;&gt;
&lt;span class=&quot;bdm-title&quot;&gt;NOTE&lt;/span&gt;
&lt;p&gt;2026年10月追記 その後Pico CSS本体はやめて、Picoを引き継いでメンテナンスされている&lt;a href=&quot;https://blades.ninja/&quot;&gt;Blades&lt;/a&gt;(&lt;code&gt;@anyblades/blades&lt;/code&gt;)に全アプリ切り替えました。素のCSSで配られているのでSassが要らなくなり、&lt;code&gt;sass-embedded&lt;/code&gt;とVite側の設定を外せました。以下はBladesに移ったあとの形で書いています。&lt;/p&gt;
&lt;/blockquote&gt;&lt;div class=&quot;expressive-code&quot;&gt;&lt;figure class=&quot;frame&quot;&gt;&lt;figcaption class=&quot;header&quot;&gt;&lt;/figcaption&gt;&lt;pre data-language=&quot;css&quot; class=&quot;wrap&quot; style=&quot;--ecMaxLine:45ch&quot;&gt;&lt;code&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#F97583&quot;&gt;@import&lt;/span&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt; &lt;/span&gt;&lt;span style=&quot;--0:#9ECBFF&quot;&gt;&quot;@anyblades/blades/pico&quot;&lt;/span&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt; &lt;/span&gt;&lt;span style=&quot;--0:#79B8FF&quot;&gt;layer&lt;/span&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--0:#FFAB70&quot;&gt;pico&lt;/span&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;button class=&quot;copy-btn&quot; aria-label=&quot;コードをコピー&quot;&gt;&lt;div class=&quot;copy-btn-icon&quot;&gt;&lt;svg viewBox=&quot;0 0 24 24&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;copy-btn-icon copy-icon&quot;&gt;&lt;g fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-width=&quot;2&quot;&gt;&lt;rect width=&quot;14&quot; height=&quot;14&quot; x=&quot;8&quot; y=&quot;8&quot; rx=&quot;2&quot; ry=&quot;2&quot;&gt;&lt;/rect&gt;&lt;path d=&quot;M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;svg viewBox=&quot;0 0 24 24&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;copy-btn-icon success-icon&quot;&gt;&lt;path fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-width=&quot;2&quot; d=&quot;M20 6L9 17l-5-5&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;/button&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;Bladesは&lt;code&gt;pico&lt;/code&gt;という名前の層(&lt;code&gt;@layer&lt;/code&gt;)に入れて読み込みます。層に入れていないこちらの規則は詳細度に関係なく必ず層の中の規則に勝つので、Picoの強いセレクタに合わせて同じ強さで書き直す、という張り合いが要りません。&lt;/p&gt;&lt;p&gt;そのうえで、アプリ共通で使うものだけ&lt;code&gt;app.css&lt;/code&gt;に&lt;code&gt;.panel&lt;/code&gt;(白い箱)・&lt;code&gt;.note&lt;/code&gt;(注意書き)・&lt;code&gt;.tag&lt;/code&gt;(札)・&lt;code&gt;.field&lt;/code&gt;(ラベル+入力欄)といった名前を10個ほど置いて、画面固有の調整はSvelteの&lt;code&gt;&amp;#x3C;style&gt;&lt;/code&gt;(scoped)に閉じ込める、という形にしました。結果として先ほどのマークアップは&lt;code&gt;class=&quot;panel body&quot;&lt;/code&gt;の2語になり、画面ごとの事情はその画面のファイルの中だけに書かれるようになります。&lt;/p&gt;&lt;p&gt;色も基本はBladesの既定のまま使っています。自前のトークンはPicoの&lt;code&gt;--pico-*&lt;/code&gt;変数から引くだけにしておくと、明暗の切り替えがBlades側に勝手に追従してくれるので、アプリ側でダークテーマの面倒を見る必要がなくなりました。&lt;/p&gt;&lt;p&gt;ドロップダウンやダイアログのようにキーボード操作とフォーカスの面倒を見ないといけない部品だけは&lt;a href=&quot;https://bits-ui.com/&quot;&gt;Bits UI&lt;/a&gt;を足しています。見た目を持たないヘッドレスなものなので、CSSはこちらで書く方針と喧嘩しません。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2 id=&quot;sveltekitで済ませないもの&quot;&gt;SvelteKitで済ませないもの&lt;a class=&quot;anchor&quot; href=&quot;#sveltekitで済ませないもの&quot;&gt;&lt;span class=&quot;anchor-icon&quot; data-pagefind-ignore=&quot;&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;全部これで済ませているわけではなく、大規模な計算や、キューを持って長時間回し続けるような処理が必要になった場合は.NETを使うようにしています。&lt;br&gt;
denpaのチューナーエージェントがそれで、電波を掴んで素のTSを流すだけの部品なのですが、最初bunで書いていたものを実機で測ったうえで.NETに書き直しました(Native AOTなので実行ファイル1個で依存もありません)。&lt;br&gt;
bunのままだと何が困ったかというと、まずチューナーを取り上げられた等で失敗したときは受け取る側に正常終了として届かないよう接続ごと壊さないといけないのですが、bun版はこれができず尻切れの録画が「録れた」ことになっていました。それとカーネル側のdvrのリングバッファが既定で1.8MB、地上波の18Mbit/秒だと0.9秒分しかないので、読む側がGC等で一瞬止まるだけで溢れます。この辺りは実機で溢れた回数を数えながら詰めていったのですが、結局ioctlを直に叩けるのも.NET版だけだったのでそちらに落ち着いた、という流れです。測った数字は&lt;a href=&quot;https://github.com/DAnything/denpa/blob/main/docs/agent.md&quot;&gt;agent.md&lt;/a&gt;にそのまま書いてあるので興味があれば見てみてください。&lt;br&gt;
画面とAPIはSvelteKit、機材に近いところやリアルタイム性が要るところ、重い計算は.NETで書く、という程度の分け方で今のところ困っていません。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2 id=&quot;aiに関して&quot;&gt;AIに関して&lt;a class=&quot;anchor&quot; href=&quot;#aiに関して&quot;&gt;&lt;span class=&quot;anchor-icon&quot; data-pagefind-ignore=&quot;&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;正直に書くとmogiriの書き直しはほぼClaudeに書かせています。Django + Nuxtを読んで同じ画面フローをSvelteKitで作り直す、という作業です。人間がやったのは上に書いた判断と、出てきたものを触って直すことでした。&lt;/p&gt;&lt;p&gt;1言語1プロセスで生成コードが読みやすい、という選択はこの前提があるから効いています。読めないものを大量に生成されても困るので、書く量が少なく構造が素直なSvelteを選んだのはAIに任せる範囲を広げるための判断でもあります。&lt;br&gt;
この辺りの実感は&lt;a href=&quot;https://doany.io/posts/slack-search-read/&quot;&gt;Slackの記事&lt;/a&gt;の後半に書いています。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2 id=&quot;まとめ&quot;&gt;まとめ&lt;a class=&quot;anchor&quot; href=&quot;#まとめ&quot;&gt;&lt;span class=&quot;anchor-icon&quot; data-pagefind-ignore=&quot;&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;小〜中規模ならバックエンドを分けない。SvelteKit一本でコンテナ1つ&lt;/li&gt;
&lt;li&gt;Svelteは書く量と読みやすさで選んだ。Reactの生態系に付き合う気はない&lt;/li&gt;
&lt;li&gt;SQLiteは限界を分かって使う。PVC1つで完結し、大きくなったらPostgreSQL&lt;/li&gt;
&lt;li&gt;Bunは同梱物の多さで選んだ。代わりにNodeへの逃げ道は塞がる&lt;/li&gt;
&lt;li&gt;重い計算やキューが要るところは.NETに切り出す&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;5つ作って全部同じ形に収まったので、次に何か作るときもたぶんこのまま始めると思います。この構成で困っている方や、ここはこうしたほうがいいというのがあればコメント頂けると助かります。&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>Slackで「自分の全投稿を取得するアプリ」は配布できない</title><link>https://doany.io/posts/slack-search-read/</link><guid isPermaLink="true">https://doany.io/posts/slack-search-read/</guid><description>search.messagesを使うアプリを他人のワークスペースに届けようとしたら、search:readがSlack Marketplaceの拒否スコープに名指しされていました。代替経路も含めて調べた結果と、結局どういう形にしたかのメモです。</description><pubDate>Fri, 31 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Slackで自分の全投稿を横断して取得するアプリを作ろうとしたところ、Slack Marketplaceに掲載できないことが分かりました。必要になる&lt;code&gt;search:read&lt;/code&gt;がガイドラインで拒否スコープとして名指しされているためです。&lt;br&gt;
迂回路もひととおり潰れていて、結局ユーザー自身に内部アプリを作ってもらう以外の方法がありませんでした。同じことを調べる人がまた1日溶かさないように、引用と出典を付けて残しておきます。&lt;/p&gt;
&lt;section&gt;&lt;h2 id=&quot;やりたかったこと&quot;&gt;やりたかったこと&lt;a class=&quot;anchor&quot; href=&quot;#やりたかったこと&quot;&gt;&lt;span class=&quot;anchor-icon&quot; data-pagefind-ignore=&quot;&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Slackの投稿時刻から稼働表(勤務時間の一覧)を自動生成したい、という話です。&lt;br&gt;
必要なのは時刻だけで本文は要りません。誰がいつ発言したかが分かれば、活動の塊から稼働の開始・終了・休憩を推定できます。&lt;/p&gt;&lt;p&gt;これを実現するAPIは&lt;code&gt;search.messages&lt;/code&gt;です。&lt;code&gt;from:&amp;#x3C;@USER_ID&gt; after:2026-06-01 before:2026-07-01&lt;/code&gt;のようなクエリで自分の投稿だけを期間指定で引けます。必要なスコープは&lt;code&gt;search:read&lt;/code&gt;ひとつ。&lt;br&gt;
権限としてはむしろ小さいほうだと思います。チャンネルの履歴を丸ごと読むわけではなく、自分の投稿しか返らないからです。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2 id=&quot;searchreadの扱い&quot;&gt;search:readの扱い&lt;a class=&quot;anchor&quot; href=&quot;#searchreadの扱い&quot;&gt;&lt;span class=&quot;anchor-icon&quot; data-pagefind-ignore=&quot;&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;ガイドラインにそのまま書かれています。&lt;/p&gt;&lt;blockquote&gt;
&lt;p&gt;legacy/restricted scopes or methods, scopes that provide extensive access to workspace data without a clear use case that requires them, or coded workflow scopes (e.g. &lt;code&gt;admin.*&lt;/code&gt;, &lt;code&gt;identity.*&lt;/code&gt;, &lt;strong&gt;&lt;code&gt;search:read&lt;/code&gt;&lt;/strong&gt;, &lt;code&gt;workflow.steps:execute&lt;/code&gt;, &lt;code&gt;triggers:*&lt;/code&gt;)
参考: &lt;a href=&quot;https://docs.slack.dev/slack-marketplace/slack-marketplace-app-guidelines-and-requirements/&quot;&gt;Slack Marketplace app guidelines and requirements&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;スコープのリファレンス側でもlegacy扱いです。&lt;/p&gt;&lt;blockquote&gt;
&lt;p&gt;This is a legacy scope
参考: &lt;a href=&quot;https://docs.slack.dev/reference/scopes/search.read/&quot;&gt;search:read scope&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;&lt;blockquote class=&quot;admonition bdm-important&quot;&gt;
&lt;span class=&quot;bdm-title&quot;&gt;IMPORTANT&lt;/span&gt;
&lt;p&gt;廃止されたわけではありません。user tokenであれば&lt;code&gt;search.messages&lt;/code&gt;は現役で動きます。掲載できないだけです。ここを混同すると「もう使えない」と誤解するので注意してください。&lt;/p&gt;
&lt;/blockquote&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2 id=&quot;historyでの迂回に関して&quot;&gt;*:historyでの迂回に関して&lt;a class=&quot;anchor&quot; href=&quot;#historyでの迂回に関して&quot;&gt;&lt;span class=&quot;anchor-icon&quot; data-pagefind-ignore=&quot;&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;検索がダメならチャンネル履歴を読めばいいのでは、と考えるところですが、同じページがやってはいけないこととして挙げています。&lt;/p&gt;&lt;blockquote&gt;
&lt;p&gt;Request user token &lt;code&gt;*:history&lt;/code&gt; and &lt;code&gt;files:read&lt;/code&gt; scopes &lt;strong&gt;for the collection of message and file data&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;しかも2025年5月にレート制限が変わり、この経路は実質的に死んでいます。&lt;/p&gt;&lt;blockquote&gt;
&lt;p&gt;The &lt;code&gt;conversations.history&lt;/code&gt; API method rate limit for commercially distributed apps created after May 29, 2025 … will be limited to 1 request per minute … These methods will have a new rate limit of 15 messages per request.
参考: &lt;a href=&quot;https://docs.slack.dev/changelog/2025/05/29/rate-limit-changes-for-non-marketplace-apps/&quot;&gt;Rate limit changes for non-Marketplace apps&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;1分に1リクエスト、1リクエストあたり15件です。1か月分を遡って集計する用途では話になりません。&lt;br&gt;
そもそも履歴の取得はチャンネル内の全員のメッセージを読むことになります。自分の投稿だけ欲しいのに要求する権限は検索より遥かに広くなるわけで、摩擦を減らそうとしてより侵襲的になるという交換なので筋が悪いです。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2 id=&quot;real-time-search-apiに関して&quot;&gt;Real-time Search APIに関して&lt;a class=&quot;anchor&quot; href=&quot;#real-time-search-apiに関して&quot;&gt;&lt;span class=&quot;anchor-icon&quot; data-pagefind-ignore=&quot;&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;2026年2月にSlackは&lt;code&gt;search:read&lt;/code&gt;の代替としてReal-time Search APIを出しています。&lt;code&gt;assistant.search.context&lt;/code&gt;と、粒度を細かくした&lt;code&gt;search:read.public&lt;/code&gt; / &lt;code&gt;.private&lt;/code&gt; / &lt;code&gt;.im&lt;/code&gt;などです。&lt;/p&gt;&lt;blockquote&gt;
&lt;p&gt;参考: &lt;a href=&quot;https://docs.slack.dev/changelog/2026/02/17/slack-mcp/&quot;&gt;Announcing the Slack MCP server and Real-time Search API&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;こちらは掲載できます。ただし利用条件が4つあり、用途によっては全部刺さります。&lt;/p&gt;
























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;条件&lt;/th&gt;&lt;th&gt;内容&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;データ保存の禁止&lt;/td&gt;&lt;td&gt;”You must not store or copy any of the data retrieved from this API.”&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;ゲスト利用不可&lt;/td&gt;&lt;td&gt;”Workspace guests are not permitted to access apps using platform AI features”&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;プラン制限&lt;/td&gt;&lt;td&gt;semantic searchはBusiness+ / Enterprise+&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;AI features限定&lt;/td&gt;&lt;td&gt;”exclusively in your app using AI features”&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;blockquote&gt;
&lt;p&gt;参考: &lt;a href=&quot;https://docs.slack.dev/apis/web-api/real-time-search-api/&quot;&gt;Using the Real-time Search API&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;自分の用途では2番目が致命的でした。客先常駐や業務委託の人は常駐先のワークスペースにゲストとして参加していることが多いので、狙っている利用者層をそのまま除外する条件になっています。&lt;br&gt;
1リクエストあたり最大20件、ユーザーあたり毎分10リクエストという上限もあります。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2 id=&quot;ワークスペース側のアプリ承認設定&quot;&gt;ワークスペース側のアプリ承認設定&lt;a class=&quot;anchor&quot; href=&quot;#ワークスペース側のアプリ承認設定&quot;&gt;&lt;span class=&quot;anchor-icon&quot; data-pagefind-ignore=&quot;&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;ここが一番の収穫でした。内部アプリなんてどうせ管理者に止められるのではと思っていたのですが、調べてみると前提が逆でした。&lt;/p&gt;&lt;blockquote&gt;
&lt;p&gt;By default, members can install apps without approval from a Workspace Owner.
参考: &lt;a href=&quot;https://slack.com/help/articles/222386767-Manage-app-approval-for-your-workspace&quot;&gt;Manage app approval for your workspace&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;デフォルトは承認不要です。そのうえで設定を厳しくした場合の挙動が下記の通りです。&lt;/p&gt;
























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;ワークスペースの設定&lt;/th&gt;&lt;th&gt;Marketplace掲載アプリ&lt;/th&gt;&lt;th&gt;自作の内部アプリ&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;制限なし(デフォルト)&lt;/td&gt;&lt;td&gt;通る&lt;/td&gt;&lt;td&gt;通る&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Marketplaceのアプリのみ許可&lt;/td&gt;&lt;td&gt;通る&lt;/td&gt;&lt;td&gt;通る&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;全アプリ承認必須&lt;/td&gt;&lt;td&gt;承認待ち&lt;/td&gt;&lt;td&gt;承認待ち&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;2行目についてはSlackが明言しています。&lt;/p&gt;&lt;blockquote&gt;
&lt;p&gt;Workspace Owners can set a permission to “Only allow apps from the Slack Marketplace” … &lt;strong&gt;This will not prevent members from creating and installing internal apps.&lt;/strong&gt;
参考: &lt;a href=&quot;https://slack.com/help/articles/202035138-Add-apps-to-your-Slack-workspace&quot;&gt;Add apps to your Slack workspace&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;つまり「Marketplace限定」の設定は内部アプリを止めません。名前から受ける印象と逆です。&lt;br&gt;
3行目の「全アプリ承認必須」ではMarketplace掲載アプリも同じく承認待ちになるので、内部アプリが不利になる設定は存在しないことになります。&lt;/p&gt;&lt;p&gt;さらに先ほどのレート制限の変更にはこう書かれています。&lt;/p&gt;&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Internal customer-built apps will not notice any changes.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;内部アプリは制限強化の対象外です。&lt;br&gt;
結果として内部アプリ方式は掲載できないので仕方なく選ぶ次善策ではなく、この用途で唯一まともに動く選択肢でした。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2 id=&quot;実際の配布方法&quot;&gt;実際の配布方法&lt;a class=&quot;anchor&quot; href=&quot;#実際の配布方法&quot;&gt;&lt;span class=&quot;anchor-icon&quot; data-pagefind-ignore=&quot;&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;ユーザー自身にアプリを作ってもらう形にしました。手間を減らすためApp ManifestをURLに載せて渡します。&lt;/p&gt;&lt;div class=&quot;expressive-code&quot;&gt;&lt;figure class=&quot;frame&quot;&gt;&lt;figcaption class=&quot;header&quot;&gt;&lt;/figcaption&gt;&lt;pre data-language=&quot;plaintext&quot; class=&quot;wrap&quot; style=&quot;--ecMaxLine:73ch&quot;&gt;&lt;code&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;https://api.slack.com/apps?new_app=1&amp;#x26;manifest_yaml=&amp;#x3C;URL エンコードした manifest&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;button class=&quot;copy-btn&quot; aria-label=&quot;コードをコピー&quot;&gt;&lt;div class=&quot;copy-btn-icon&quot;&gt;&lt;svg viewBox=&quot;0 0 24 24&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;copy-btn-icon copy-icon&quot;&gt;&lt;g fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-width=&quot;2&quot;&gt;&lt;rect width=&quot;14&quot; height=&quot;14&quot; x=&quot;8&quot; y=&quot;8&quot; rx=&quot;2&quot; ry=&quot;2&quot;&gt;&lt;/rect&gt;&lt;path d=&quot;M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;svg viewBox=&quot;0 0 24 24&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;copy-btn-icon success-icon&quot;&gt;&lt;path fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-width=&quot;2&quot; d=&quot;M20 6L9 17l-5-5&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;/button&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;参考: &lt;a href=&quot;https://docs.slack.dev/app-manifests/configuring-apps-with-app-manifests/&quot;&gt;Configuring apps with app manifests&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;これでアプリ名・説明・スコープが入力済みの状態から始められます。要求するのは&lt;code&gt;search:read&lt;/code&gt;ひとつだけなので同意画面も軽いです。&lt;br&gt;
ドキュメント上は「リンクを踏む → Create → Install → トークンをコピー」で終わるように読めるのですが、実際にやると罠が2つありました。&lt;/p&gt;&lt;section&gt;&lt;h3 id=&quot;作成時に出る赤いエラー&quot;&gt;作成時に出る赤いエラー&lt;a class=&quot;anchor&quot; href=&quot;#作成時に出る赤いエラー&quot;&gt;&lt;span class=&quot;anchor-icon&quot; data-pagefind-ignore=&quot;&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Step 2のCreate and Installを押すと白いポップアップが一瞬開いて閉じ、下記の様に表示されます。&lt;/p&gt;&lt;div class=&quot;expressive-code&quot;&gt;&lt;figure class=&quot;frame&quot;&gt;&lt;figcaption class=&quot;header&quot;&gt;&lt;/figcaption&gt;&lt;pre data-language=&quot;plaintext&quot; class=&quot;wrap&quot; style=&quot;--ecMaxLine:70ch&quot;&gt;&lt;code&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;Installation was not completed. Click Create and Install to try again.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;button class=&quot;copy-btn&quot; aria-label=&quot;コードをコピー&quot;&gt;&lt;div class=&quot;copy-btn-icon&quot;&gt;&lt;svg viewBox=&quot;0 0 24 24&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;copy-btn-icon copy-icon&quot;&gt;&lt;g fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-width=&quot;2&quot;&gt;&lt;rect width=&quot;14&quot; height=&quot;14&quot; x=&quot;8&quot; y=&quot;8&quot; rx=&quot;2&quot; ry=&quot;2&quot;&gt;&lt;/rect&gt;&lt;path d=&quot;M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;svg viewBox=&quot;0 0 24 24&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;copy-btn-icon success-icon&quot;&gt;&lt;path fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-width=&quot;2&quot; d=&quot;M20 6L9 17l-5-5&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;/button&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;アプリ自体は作成できています。一覧を再読み込みすれば出てきます。&lt;br&gt;
原因はおそらくこのアプリがbotスコープを1つも持っていないことです。作成とインストールを一度に行う導線なのにインストールするbotが存在しないので空振りしている。botスコープを足せば消えると思われますが、そのために要求権限を増やすのは本末転倒なのでそのままにしています。&lt;br&gt;
初回オンボーディングの一歩目で赤いエラーが出るのは説明が無ければ確実に離脱するので、「これは正常です」と手順に書くしかありませんでした。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3 id=&quot;token-rotationに関して&quot;&gt;token rotationに関して&lt;a class=&quot;anchor&quot; href=&quot;#token-rotationに関して&quot;&gt;&lt;span class=&quot;anchor-icon&quot; data-pagefind-ignore=&quot;&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;OAuth &amp;#x26; Permissionsのページ上部に下記の様に書かれた項目があります。&lt;/p&gt;&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Recommended&lt;/strong&gt; for developers building on or for security-minded organizations&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;Recommendedと書いてある以上押したくなりますが、押すとトークンが短時間で失効するようになり、リフレッシュの仕組みを持っていないアプリは繋がらなくなります。&lt;br&gt;
生成するmanifestでは&lt;code&gt;token_rotation_enabled: false&lt;/code&gt;にしていますが、後から画面で有効にできてしまうので、こちらも手順に「有効にしないでください」と明記しています。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2 id=&quot;aiに関して&quot;&gt;AIに関して&lt;a class=&quot;anchor&quot; href=&quot;#aiに関して&quot;&gt;&lt;span class=&quot;anchor-icon&quot; data-pagefind-ignore=&quot;&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;正直に書いておくと、コードはほぼAI(Claude Code)に書かせています。人間側がやったのは何を作るか・何を作らないかの判断です。&lt;br&gt;
これは楽な仕事ではありませんでした。AIは指示すれば動くものを作りますが、指示が間違っていれば間違ったものが完成度高く出来上がります。&lt;/p&gt;&lt;p&gt;具体例を挙げると、無料プランの線引きを最初は「Slack連携だけ無料、他のサービスは有料」に設計していました。Slackが主力のデータ源なので一見もっともらしい線です。実装も料金ページも決定記録もその前提で書かれ、テストも通っていました。&lt;br&gt;
間違いに気づいたのは自分で触ったときです。GitHubしか繋いでいない人は無料プランでは何も生成できず、サインアップして連携して空の稼働表を見て帰るだけになります。無料で価値を見せ切るのが目的だったのに、その目的を壊す線を引いていたわけです。&lt;br&gt;
線を「サービスの種類は問わず、連携1つまで」に変えました。同時にコミット時刻だけで稼働表を作ると1か月の実働が9時間にしかならないことも実データで分かり、そちらは推定モデルの調整に繋がりました。&lt;/p&gt;&lt;p&gt;AIに任せられるのは作る作業で、何を作るかを間違えないことは任せられない、というのが今のところの実感です。動くかどうかはテストが教えてくれますが、正しいかどうかは教えてくれません。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2 id=&quot;まとめ&quot;&gt;まとめ&lt;a class=&quot;anchor&quot; href=&quot;#まとめ&quot;&gt;&lt;span class=&quot;anchor-icon&quot; data-pagefind-ignore=&quot;&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;code&gt;search.messages&lt;/code&gt;を使うアプリを配布したい人向けにまとめると下記の通りです。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;Marketplaceには掲載できません。&lt;code&gt;search:read&lt;/code&gt;が拒否スコープに名指しされています&lt;/li&gt;
&lt;li&gt;&lt;code&gt;*:history&lt;/code&gt;での迂回も潰れています。ガイドラインで禁止され、レート制限も1req/分・15件&lt;/li&gt;
&lt;li&gt;Real-time Search APIは掲載できますが、データ保存禁止・ゲスト利用不可・プラン制限があります&lt;/li&gt;
&lt;li&gt;内部アプリ方式は現役です。ワークスペースの「Marketplaceのみ許可」設定でも止まりませんし、レート制限強化の対象外です&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;作ったものはこれです。SlackやGitHubの活動ログから日別の稼働開始・終了・休憩・実働を推定して稼働表の下書きを出します。常駐先に監視エージェントを入れられない環境でも使えて、過去の月にも遡って生成できます。&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://w.doany.io&quot;&gt;https://w.doany.io&lt;/a&gt;&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>サイトをAstro + k3sで作り直した話</title><link>https://doany.io/posts/renewal/</link><guid isPermaLink="true">https://doany.io/posts/renewal/</guid><description>Next.jsで動かしていたこのブログをAstro製テーマFuwariに全面移行しました。ビルドから配信、コメント、購読まで現在の構成をひととおり書いておきます。コメントはgiscus、remark42、Artalkを経て、結局自分で書きました。</description><pubDate>Wed, 29 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;このサイトは元々HUGOで作り、その後Next.js(tailwind-nextjs-starter-blog)で運用していましたが、このたびAstro製のテーマ&lt;a href=&quot;https://github.com/saicaca/fuwari&quot;&gt;Fuwari&lt;/a&gt;に全面移行しました。&lt;br&gt;
せっかくなので現在の構成を最初から最後まで書いておきます。&lt;/p&gt;
&lt;a class=&quot;card-github no-styling&quot; href=&quot;https://github.com/saicaca/fuwari&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;div class=&quot;gc-titlebar&quot;&gt;&lt;div class=&quot;gc-titlebar-left&quot;&gt;&lt;div class=&quot;gc-owner&quot;&gt;&lt;div class=&quot;gc-avatar&quot; style=&quot;background-image: url(https://avatars.githubusercontent.com/u/25200299?v=4); background-color: transparent&quot;&gt;&lt;/div&gt;&lt;div class=&quot;gc-user&quot;&gt;saicaca&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;gc-divider&quot;&gt;/&lt;/div&gt;&lt;div class=&quot;gc-repo&quot;&gt;fuwari&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;github-logo&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;gc-description&quot;&gt;✨A static blog template built with Astro. &lt;/div&gt;&lt;div class=&quot;gc-infobar&quot;&gt;&lt;div class=&quot;gc-stars&quot;&gt;5.1K&lt;/div&gt;&lt;div class=&quot;gc-forks&quot;&gt;1.3K&lt;/div&gt;&lt;div class=&quot;gc-license&quot;&gt;MIT&lt;/div&gt;&lt;span class=&quot;gc-language&quot;&gt;Astro&lt;/span&gt;&lt;/div&gt;&lt;/a&gt;
&lt;section&gt;&lt;h2 id=&quot;全体像&quot;&gt;全体像&lt;a class=&quot;anchor&quot; href=&quot;#全体像&quot;&gt;&lt;span class=&quot;anchor-icon&quot; data-pagefind-ignore=&quot;&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;div class=&quot;expressive-code&quot;&gt;&lt;figure class=&quot;frame&quot;&gt;&lt;figcaption class=&quot;header&quot;&gt;&lt;/figcaption&gt;&lt;pre data-language=&quot;plaintext&quot; class=&quot;wrap&quot; style=&quot;--ecMaxLine:54ch&quot;&gt;&lt;code&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;記事 (Markdown)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot; style=&quot;--ecIndent:2ch&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;↓ pnpm build&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;Astro → dist/ + Pagefind の検索インデックス&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot; style=&quot;--ecIndent:2ch&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;↓ docker build (multi-stage)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;node:24-slim でビルド → caddy:2-alpine に dist/ だけ載せる&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot; style=&quot;--ecIndent:2ch&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;↓ GitHub Actions&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;ghcr.io へ push → k3s のマニフェストを自動で書き換えてコミット&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot; style=&quot;--ecIndent:2ch&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;↓ ArgoCD が Git を監視して同期&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;k3s + Traefik（Let&apos;s Encrypt / DNS-01）→ Cloudflare → 読者&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;button class=&quot;copy-btn&quot; aria-label=&quot;コードをコピー&quot;&gt;&lt;div class=&quot;copy-btn-icon&quot;&gt;&lt;svg viewBox=&quot;0 0 24 24&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;copy-btn-icon copy-icon&quot;&gt;&lt;g fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-width=&quot;2&quot;&gt;&lt;rect width=&quot;14&quot; height=&quot;14&quot; x=&quot;8&quot; y=&quot;8&quot; rx=&quot;2&quot; ry=&quot;2&quot;&gt;&lt;/rect&gt;&lt;path d=&quot;M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;svg viewBox=&quot;0 0 24 24&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;copy-btn-icon success-icon&quot;&gt;&lt;path fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-width=&quot;2&quot; d=&quot;M20 6L9 17l-5-5&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;/button&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;サーバーサイドのアプリケーションは一切動いておらず、配信されているのは完全に静的なファイルだけです。&lt;/p&gt;&lt;blockquote class=&quot;admonition bdm-note&quot;&gt;
&lt;span class=&quot;bdm-title&quot;&gt;NOTE&lt;/span&gt;
&lt;p&gt;2026年10月追記 その後パッケージマネージャをpnpmからBunに替えたので、ビルドは&lt;code&gt;bun run build&lt;/code&gt;、ビルド用のイメージは&lt;code&gt;node:24-slim&lt;/code&gt;ではなく&lt;code&gt;oven/bun&lt;/code&gt;になっています。ページ遷移もSwupからAstro標準のClientRouterに置き換えました。それ以外の流れは変わっていません。最新の構成は&lt;a href=&quot;https://github.com/DAnything/blog&quot;&gt;リポジトリ&lt;/a&gt;を見てください。&lt;/p&gt;
&lt;/blockquote&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2 id=&quot;ビルド&quot;&gt;ビルド&lt;a class=&quot;anchor&quot; href=&quot;#ビルド&quot;&gt;&lt;span class=&quot;anchor-icon&quot; data-pagefind-ignore=&quot;&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Astroなので出力は静的HTMLです。ページ遷移はSwupが担当していてフルリロードなしで切り替わります。&lt;/p&gt;&lt;p&gt;全文検索にはPagefindを使っています。ビルド時に&lt;code&gt;dist/&lt;/code&gt;を走査してインデックスを作る方式で、検索用のサーバーが要りません。日本語もちゃんと引っかかります。&lt;/p&gt;&lt;blockquote class=&quot;admonition bdm-note&quot;&gt;
&lt;span class=&quot;bdm-title&quot;&gt;NOTE&lt;/span&gt;
&lt;p&gt;Pagefindは日本語のステミングには対応していないので語形変化をまたいだ一致はしませんが、個人ブログの検索としては十分実用的だと思います。&lt;/p&gt;
&lt;/blockquote&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2 id=&quot;配信はcaddy&quot;&gt;配信はCaddy&lt;a class=&quot;anchor&quot; href=&quot;#配信はcaddy&quot;&gt;&lt;span class=&quot;anchor-icon&quot; data-pagefind-ignore=&quot;&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;イメージは2段構成にしています。ビルド用に&lt;code&gt;node:24-slim&lt;/code&gt;、配信用に&lt;code&gt;caddy:2-alpine&lt;/code&gt;。最終的なイメージには&lt;code&gt;dist/&lt;/code&gt;と&lt;code&gt;Caddyfile&lt;/code&gt;しか入っていません。&lt;/p&gt;&lt;p&gt;nginxではなくCaddyを選んだのには理由があります。&lt;br&gt;
Astroは&lt;code&gt;trailingSlash: &quot;always&quot;&lt;/code&gt;なので、&lt;code&gt;/posts/foo&lt;/code&gt;へのアクセスに対して&lt;code&gt;/posts/foo/&lt;/code&gt;へリダイレクトが常時発生します。nginxはこのリダイレクトURLを&lt;code&gt;$scheme&lt;/code&gt;から組み立てるため、TLSを前段のプロキシで終端していると&lt;code&gt;http://&lt;/code&gt;へ301してしまうという古典的な罠があります。&lt;code&gt;absolute_redirect off;&lt;/code&gt;を書けば回避できますが、知らないと必ず踏みます。&lt;br&gt;
Caddyは相対リダイレクトを返すのでこの問題が最初から存在しません。実際に確認すると下記の通りです。&lt;/p&gt;&lt;div class=&quot;expressive-code&quot;&gt;&lt;figure class=&quot;frame is-terminal&quot;&gt;&lt;figcaption class=&quot;header&quot;&gt;&lt;span class=&quot;title&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sr-only&quot;&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre data-language=&quot;console&quot; class=&quot;wrap&quot; style=&quot;--ecMaxLine:58ch&quot;&gt;&lt;code&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt;$ curl -sI https://doany.io/posts/truck &lt;/span&gt;&lt;span style=&quot;--0:#F97583&quot;&gt;|&lt;/span&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt; &lt;/span&gt;&lt;span style=&quot;--0:#B392F0&quot;&gt;grep&lt;/span&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt; &lt;/span&gt;&lt;span style=&quot;--0:#79B8FF&quot;&gt;-i&lt;/span&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt; &lt;/span&gt;&lt;span style=&quot;--0:#9ECBFF&quot;&gt;location&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#79B8FF&quot;&gt;location: https://doany.io/posts/truck/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;button class=&quot;copy-btn&quot; aria-label=&quot;コードをコピー&quot;&gt;&lt;div class=&quot;copy-btn-icon&quot;&gt;&lt;svg viewBox=&quot;0 0 24 24&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;copy-btn-icon copy-icon&quot;&gt;&lt;g fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-width=&quot;2&quot;&gt;&lt;rect width=&quot;14&quot; height=&quot;14&quot; x=&quot;8&quot; y=&quot;8&quot; rx=&quot;2&quot; ry=&quot;2&quot;&gt;&lt;/rect&gt;&lt;path d=&quot;M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;svg viewBox=&quot;0 0 24 24&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;copy-btn-icon success-icon&quot;&gt;&lt;path fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-width=&quot;2&quot; d=&quot;M20 6L9 17l-5-5&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;/button&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;ついでに&lt;code&gt;encode zstd gzip&lt;/code&gt;の1行でzstd圧縮まで効きます。nginxでzstdを使おうとするとモジュールのビルドが必要なのでこの手軽さはかなり大きいです。トップページで97,465バイト → 16,264バイトまで落ちています。&lt;/p&gt;&lt;p&gt;旧URLからのリダイレクトもCaddyに集約しました。&lt;/p&gt;&lt;div class=&quot;expressive-code&quot;&gt;&lt;figure class=&quot;frame&quot;&gt;&lt;figcaption class=&quot;header&quot;&gt;&lt;/figcaption&gt;&lt;pre data-language=&quot;text&quot; class=&quot;wrap&quot; style=&quot;--ecMaxLine:49ch&quot;&gt;&lt;code&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;@blogPost path_regexp blogPost ^/blog/(.+?)/?$&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;redir @blogPost /posts/{re.blogPost.1}/ permanent&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;button class=&quot;copy-btn&quot; aria-label=&quot;コードをコピー&quot;&gt;&lt;div class=&quot;copy-btn-icon&quot;&gt;&lt;svg viewBox=&quot;0 0 24 24&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;copy-btn-icon copy-icon&quot;&gt;&lt;g fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-width=&quot;2&quot;&gt;&lt;rect width=&quot;14&quot; height=&quot;14&quot; x=&quot;8&quot; y=&quot;8&quot; rx=&quot;2&quot; ry=&quot;2&quot;&gt;&lt;/rect&gt;&lt;path d=&quot;M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;svg viewBox=&quot;0 0 24 24&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;copy-btn-icon success-icon&quot;&gt;&lt;path fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-width=&quot;2&quot; d=&quot;M20 6L9 17l-5-5&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;/button&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;/blog/*&lt;/code&gt; &lt;code&gt;/tags/*&lt;/code&gt; &lt;code&gt;/projects&lt;/code&gt; &lt;code&gt;/feed.xml&lt;/code&gt;あたりが旧構成のURLなので、全部301で新しい場所へ飛ばしています。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2 id=&quot;デプロイはgitops&quot;&gt;デプロイはGitOps&lt;a class=&quot;anchor&quot; href=&quot;#デプロイはgitops&quot;&gt;&lt;span class=&quot;anchor-icon&quot; data-pagefind-ignore=&quot;&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;ここが個人的に一番気に入っているところで、手元から&lt;code&gt;kubectl apply&lt;/code&gt;を叩くことは一切ありません。&lt;/p&gt;&lt;p&gt;&lt;code&gt;main&lt;/code&gt;にpushするとまずGitHub Actionsがイメージをビルドして&lt;code&gt;ghcr.io&lt;/code&gt;へpushします。そのあと同じジョブが&lt;code&gt;deploy/deployment.yaml&lt;/code&gt;のイメージタグをコミットSHAに書き換えてリポジトリにコミットし返します。&lt;/p&gt;&lt;div class=&quot;expressive-code&quot;&gt;&lt;figure class=&quot;frame&quot;&gt;&lt;figcaption class=&quot;header&quot;&gt;&lt;/figcaption&gt;&lt;pre data-language=&quot;yaml&quot; class=&quot;wrap&quot; style=&quot;--ecMaxLine:121ch&quot;&gt;&lt;code&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt;- &lt;/span&gt;&lt;span style=&quot;--0:#85E89D&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--0:#9ECBFF&quot;&gt;Update deployment image tag&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot; style=&quot;--ecIndent:2ch&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;  &lt;/span&gt;&lt;span style=&quot;--0:#85E89D&quot;&gt;run&lt;/span&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--0:#F97583&quot;&gt;|&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot; style=&quot;--ecIndent:4ch&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;&lt;span style=&quot;--0:#9ECBFF&quot;&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;--0:#9ECBFF&quot;&gt;sed -i &quot;s#image: ${REGISTRY}/${IMAGE_NAME}:.*#image: ${REGISTRY}/${IMAGE_NAME}:${GITHUB_SHA}#&quot; deploy/deployment.yaml&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;button class=&quot;copy-btn&quot; aria-label=&quot;コードをコピー&quot;&gt;&lt;div class=&quot;copy-btn-icon&quot;&gt;&lt;svg viewBox=&quot;0 0 24 24&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;copy-btn-icon copy-icon&quot;&gt;&lt;g fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-width=&quot;2&quot;&gt;&lt;rect width=&quot;14&quot; height=&quot;14&quot; x=&quot;8&quot; y=&quot;8&quot; rx=&quot;2&quot; ry=&quot;2&quot;&gt;&lt;/rect&gt;&lt;path d=&quot;M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;svg viewBox=&quot;0 0 24 24&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;copy-btn-icon success-icon&quot;&gt;&lt;path fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-width=&quot;2&quot; d=&quot;M20 6L9 17l-5-5&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;/button&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;そしてk3s側にはArgoCDが常駐していてこのリポジトリを監視しています。マニフェストの変更を検知すると自動で同期し、新しいイメージのPodに入れ替わります。&lt;br&gt;
つまりGitがそのままクラスタの状態になっていて、リポジトリを見ればいま何が動いているか分かります。ロールバックしたければ&lt;code&gt;git revert&lt;/code&gt;するだけです。&lt;/p&gt;&lt;p&gt;ArgoCD自体もk3sの&lt;code&gt;HelmChart&lt;/code&gt; CRDでマニフェストとして宣言してあるので、クラスタを作り直しても同じ手順で戻せます。ログインはEntra IDのOIDCに寄せてローカルのadminアカウントは無効化してあります。&lt;br&gt;
証明書はTraefikがLet’s EncryptからDNS-01チャレンジで取得しています。前段にはCloudflareを挟んでいます。&lt;/p&gt;&lt;section&gt;&lt;h3 id=&quot;シークレットの扱い&quot;&gt;シークレットの扱い&lt;a class=&quot;anchor&quot; href=&quot;#シークレットの扱い&quot;&gt;&lt;span class=&quot;anchor-icon&quot; data-pagefind-ignore=&quot;&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;コメントシステムの署名鍵やOIDCのクライアントシークレットといった秘密情報は、Gitには置いていません。自前でホストしているInfisicalに入れておき、k3s側の純正operatorがそれを読んでSecretにします。マニフェストには「Infisicalのどのフォルダを見るか」だけが書いてあります。&lt;/p&gt;&lt;div class=&quot;expressive-code&quot;&gt;&lt;figure class=&quot;frame&quot;&gt;&lt;figcaption class=&quot;header&quot;&gt;&lt;/figcaption&gt;&lt;pre data-language=&quot;yaml&quot; class=&quot;wrap&quot; style=&quot;--ecMaxLine:41ch&quot;&gt;&lt;code&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#85E89D&quot;&gt;secretsScope&lt;/span&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot; style=&quot;--ecIndent:2ch&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;  &lt;/span&gt;&lt;span style=&quot;--0:#85E89D&quot;&gt;projectSlug&lt;/span&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--0:#9ECBFF&quot;&gt;doa&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot; style=&quot;--ecIndent:2ch&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;  &lt;/span&gt;&lt;span style=&quot;--0:#85E89D&quot;&gt;envSlug&lt;/span&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--0:#9ECBFF&quot;&gt;prod&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot; style=&quot;--ecIndent:2ch&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;  &lt;/span&gt;&lt;span style=&quot;--0:#85E89D&quot;&gt;secretsPath&lt;/span&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--0:#9ECBFF&quot;&gt;/yosegaki/yosegaki-secrets&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;button class=&quot;copy-btn&quot; aria-label=&quot;コードをコピー&quot;&gt;&lt;div class=&quot;copy-btn-icon&quot;&gt;&lt;svg viewBox=&quot;0 0 24 24&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;copy-btn-icon copy-icon&quot;&gt;&lt;g fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-width=&quot;2&quot;&gt;&lt;rect width=&quot;14&quot; height=&quot;14&quot; x=&quot;8&quot; y=&quot;8&quot; rx=&quot;2&quot; ry=&quot;2&quot;&gt;&lt;/rect&gt;&lt;path d=&quot;M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;svg viewBox=&quot;0 0 24 24&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;copy-btn-icon success-icon&quot;&gt;&lt;path fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-width=&quot;2&quot; d=&quot;M20 6L9 17l-5-5&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;/button&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;以前はSealed Secretsで暗号化したものをコミットしていましたが、値を差し替えるたびに封入し直すのが面倒で、Infisicalの画面で書き換えれば数秒でPodが入れ替わる今の形に寄せました。Gitに全部あるという状態は崩れましたが、参照だけはGitにあるので、何がどこにあるかは追えます。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2 id=&quot;コメントは自作した&quot;&gt;コメントは自作した&lt;a class=&quot;anchor&quot; href=&quot;#コメントは自作した&quot;&gt;&lt;span class=&quot;anchor-icon&quot; data-pagefind-ignore=&quot;&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;ここは二転三転したので経緯ごと書いておきます。最終的には自分で書いたものを動かしています。&lt;/p&gt;&lt;section&gt;&lt;h3 id=&quot;giscusに関して&quot;&gt;giscusに関して&lt;a class=&quot;anchor&quot; href=&quot;#giscusに関して&quot;&gt;&lt;span class=&quot;anchor-icon&quot; data-pagefind-ignore=&quot;&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;移行の直後はgiscus(GitHub Discussionsを使うやつ)を入れていたのですが、コメントするのにGitHubアカウントが要るのがどうしても引っかかりました。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3 id=&quot;remark42に関して&quot;&gt;remark42に関して&lt;a class=&quot;anchor&quot; href=&quot;#remark42に関して&quot;&gt;&lt;span class=&quot;anchor-icon&quot; data-pagefind-ignore=&quot;&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;そこでremark42に載せ替えました。Goの単一バイナリでストレージもBoltDBのファイルなので別途データベースが要りません。&lt;code&gt;AUTH_ANON=true&lt;/code&gt;を入れるとアカウントなしで投稿できます。&lt;/p&gt;&lt;p&gt;読者は匿名のままでいい一方、荒らされたときに消す人間は要ります。そこで管理者だけEntra IDでログインする構成にしました。ArgoCDや他の内部サービスと同じアプリ登録を使い回しています。&lt;br&gt;
ここで少しハマりました。アプリ登録がシングルテナントだと既定の&lt;code&gt;/common&lt;/code&gt;エンドポイントは使えません。&lt;/p&gt;&lt;div class=&quot;expressive-code&quot;&gt;&lt;figure class=&quot;frame&quot;&gt;&lt;figcaption class=&quot;header&quot;&gt;&lt;/figcaption&gt;&lt;pre data-language=&quot;text&quot; class=&quot;wrap&quot; style=&quot;--ecMaxLine:73ch&quot;&gt;&lt;code&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;AADSTS50194: Application is not configured as a multi-tenant application.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;Usage of the /common endpoint is not supported for such applications.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;button class=&quot;copy-btn&quot; aria-label=&quot;コードをコピー&quot;&gt;&lt;div class=&quot;copy-btn-icon&quot;&gt;&lt;svg viewBox=&quot;0 0 24 24&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;copy-btn-icon copy-icon&quot;&gt;&lt;g fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-width=&quot;2&quot;&gt;&lt;rect width=&quot;14&quot; height=&quot;14&quot; x=&quot;8&quot; y=&quot;8&quot; rx=&quot;2&quot; ry=&quot;2&quot;&gt;&lt;/rect&gt;&lt;path d=&quot;M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;svg viewBox=&quot;0 0 24 24&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;copy-btn-icon success-icon&quot;&gt;&lt;path fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-width=&quot;2&quot; d=&quot;M20 6L9 17l-5-5&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;/button&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;テナントを明示するオプションが必要なのですが、これはremark42 v1.16以降でしか使えませんでした。アプリ登録をマルチテナント化すれば通るものの、その登録は他のサービスも共有しているので認証範囲を広げるのは避けたい。結局remark42を上げて解決しました。&lt;/p&gt;&lt;p&gt;しばらく使って引っかかったのが見た目です。サイトはTailwindで組んでいるのにコメント欄だけ明らかに別物の顔をしている。&lt;br&gt;
直そうとして分かったのですが、remark42はiframeで埋め込まれます。ホストページのCSSが中に届かないので外から手を入れる余地がなく、公開されている調整点は&lt;code&gt;theme: light | dark&lt;/code&gt;だけです。つまり見た目が気に入らないなら乗り換えるしかありません。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3 id=&quot;候補の比較&quot;&gt;候補の比較&lt;a class=&quot;anchor&quot; href=&quot;#候補の比較&quot;&gt;&lt;span class=&quot;anchor-icon&quot; data-pagefind-ignore=&quot;&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;匿名コメントに対応していて、かつ見た目に手が届くものを並べました。&lt;/p&gt;














































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;td&gt;&lt;/td&gt;&lt;th&gt;実装 / DB&lt;/th&gt;&lt;th&gt;描画&lt;/th&gt;&lt;th&gt;スタイル&lt;/th&gt;&lt;th&gt;管理者認証&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;th scope=&quot;row&quot;&gt;Artalk&lt;/th&gt;&lt;td&gt;Go単一バイナリ / SQLite&lt;/td&gt;&lt;td&gt;ホストDOM&lt;/td&gt;&lt;td&gt;CSS変数・ダークモード&lt;/td&gt;&lt;td&gt;パスワード&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th scope=&quot;row&quot;&gt;Isso&lt;/th&gt;&lt;td&gt;Python / SQLite&lt;/td&gt;&lt;td&gt;ホストDOM&lt;/td&gt;&lt;td&gt;完全に自由&lt;/td&gt;&lt;td&gt;パスワード&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th scope=&quot;row&quot;&gt;Comentario&lt;/th&gt;&lt;td&gt;Go / SQLite&lt;/td&gt;&lt;td&gt;Web Component&lt;/td&gt;&lt;td&gt;全切り・差し替え可&lt;/td&gt;&lt;td&gt;OIDC可&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th scope=&quot;row&quot;&gt;Waline&lt;/th&gt;&lt;td&gt;Node.js / 各種&lt;/td&gt;&lt;td&gt;ホストDOM&lt;/td&gt;&lt;td&gt;CSS変数&lt;/td&gt;&lt;td&gt;パスワード&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th scope=&quot;row&quot;&gt;remark42&lt;/th&gt;&lt;td&gt;Go単一バイナリ / BoltDB&lt;/td&gt;&lt;td&gt;iframe&lt;/td&gt;&lt;td&gt;light/darkのみ&lt;/td&gt;&lt;td&gt;OIDC可&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;Cusdisはアーカイブ済み、Commentoは2022年で放置(Comentarioが後継)、utterancesとgiscusはGitHubアカウント必須なので落としました。&lt;/p&gt;&lt;p&gt;Issoは古いと決めつけていたのですが、これは間違いでした。Issoは&lt;code&gt;data-isso-css=&quot;false&quot;&lt;/code&gt;で既定のスタイルシートを丸ごと切れる、自分でCSSを書く前提の作りです。素の見た目が地味なだけで寄せようと思えばどこまでも寄せられます。&lt;/p&gt;&lt;p&gt;数字も見ました。starはIssoが5,293で最多ですがこれは14年分の累積です。実運用に近いDockerのプル数ではArtalkが63.9万、Issoは非公式イメージに分散して合計36万程度でした。Comentarioは3桁で、機能は良いのに前例がほぼありません。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3 id=&quot;artalkに関して&quot;&gt;Artalkに関して&lt;a class=&quot;anchor&quot; href=&quot;#artalkに関して&quot;&gt;&lt;span class=&quot;anchor-icon&quot; data-pagefind-ignore=&quot;&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;決め手はremark42と運用の形が同じことでした。Goの単一バイナリにSQLiteなので、PVC1つに単一Podという構成がそのまま使い回せます。マニフェストはホスト名とイメージを差し替えるだけで済みました。&lt;br&gt;
iframeではなくホストページのDOMに描画するのでCSSを当てる道が残っていて、実際にCSS変数をサイトの配色に繋いで、それなりに馴染む見た目にはなりました。&lt;/p&gt;&lt;p&gt;代償もありました。ArtalkにはOIDCがないので、せっかく組んだEntra IDでの管理者ログインは失いました。管理画面は共有パスワード1個です。管理者は自分ひとりでやることは荒らしの削除だけなので、そこは飲みました。&lt;/p&gt;&lt;p&gt;使い込むうちに別のところが引っかかってきました。日本語の翻訳が怪しい箇所がいくつかあり、通知センターはiframeで別のCSSが当たるので中国語向けのフォント指定がそのまま出ます。本家にPRは出しましたが、フォントも文言も自分の手の届かないところで決まっているのは変わりません。&lt;br&gt;
スタイルも、変数で寄せられる範囲は寄せたものの、ページ遷移で消えるスタイルシートを入れ直したり、並び替えメニューの隙間を塞いだりと、こまごました上書きが積み上がっていきました。コメント欄の見た目はサイト側で決めたいのに、コメントシステムが自前のCSSを持っているせいで喧嘩している、という構図です。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3 id=&quot;yosegakiに関して&quot;&gt;yosegakiに関して&lt;a class=&quot;anchor&quot; href=&quot;#yosegakiに関して&quot;&gt;&lt;span class=&quot;anchor-icon&quot; data-pagefind-ignore=&quot;&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;それなら自分で書いたほうが早い、となって作ったのが&lt;a href=&quot;https://github.com/DAnything/yosegaki&quot;&gt;yosegaki&lt;/a&gt;です。SvelteKit + Bun + SQLiteで、構成は&lt;a href=&quot;https://doany.io/posts/svelte-bun-sqlite/&quot;&gt;別の記事&lt;/a&gt;に書いた通りいつものやつです。&lt;/p&gt;&lt;a class=&quot;card-github no-styling&quot; href=&quot;https://github.com/DAnything/yosegaki&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;div class=&quot;gc-titlebar&quot;&gt;&lt;div class=&quot;gc-titlebar-left&quot;&gt;&lt;div class=&quot;gc-owner&quot;&gt;&lt;div class=&quot;gc-avatar&quot; style=&quot;background-image: url(https://avatars.githubusercontent.com/u/143234231?v=4); background-color: transparent&quot;&gt;&lt;/div&gt;&lt;div class=&quot;gc-user&quot;&gt;DAnything&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;gc-divider&quot;&gt;/&lt;/div&gt;&lt;div class=&quot;gc-repo&quot;&gt;yosegaki&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;github-logo&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;gc-description&quot;&gt;寄せ書き。SvelteKit + Bun + SQLite のコメントサーバ。管理画面なし、どのコメント欄からでもサイト全体の新着と自分宛ての返信が見える&lt;/div&gt;&lt;div class=&quot;gc-infobar&quot;&gt;&lt;div class=&quot;gc-stars&quot;&gt;0&lt;/div&gt;&lt;div class=&quot;gc-forks&quot;&gt;0&lt;/div&gt;&lt;div class=&quot;gc-license&quot;&gt;AGPL-3.0&lt;/div&gt;&lt;span class=&quot;gc-language&quot;&gt;TypeScript&lt;/span&gt;&lt;/div&gt;&lt;/a&gt;&lt;p&gt;方針は下記の通りです。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;スタイルを持たない。同梱のCSSは色を決めず、埋め込み先の文字色を薄めて罫線や背景にするだけなので、ライトとダークにも勝手に追従します。&lt;code&gt;data-css=&quot;false&quot;&lt;/code&gt;で丸ごと捨てて自分で書くこともできます&lt;/li&gt;
&lt;li&gt;管理画面を作らない。管理はコメント欄の中で済ませます。通知パネルからサイト全体の新着と承認待ちが見えて、その場で承認や削除、横断検索ができます。読者にこの入口は見せず、記事のURLに&lt;code&gt;#yosegaki-admin&lt;/code&gt;を付けて開いたときだけログインボタンが出ます&lt;/li&gt;
&lt;li&gt;管理者の認証はOIDCだけ。パスワード認証は自前で持つと追従が辛いので最初から作っていません。Entra IDのアプリ登録はArgoCDと同じものを使い回し、adminsグループに入っている人だけ通します。remark42で組んでArtalkで失ったものが、ここで戻ってきました&lt;/li&gt;
&lt;li&gt;承認なしで即公開。botはCloudflare Turnstileとハニーポットで止めます。Turnstileは必要なときだけ出るので普段は何も見えません&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;APIはJSONだけを返す作りで、埋め込みスクリプトはその一利用者に過ぎません。画面を作り直したくなってもAPIはそのまま使えます。&lt;/p&gt;&lt;div class=&quot;expressive-code&quot;&gt;&lt;figure class=&quot;frame&quot;&gt;&lt;figcaption class=&quot;header&quot;&gt;&lt;/figcaption&gt;&lt;pre data-language=&quot;html&quot; class=&quot;wrap&quot; style=&quot;--ecMaxLine:52ch&quot;&gt;&lt;code&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;--0:#85E89D&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt; &lt;/span&gt;&lt;span style=&quot;--0:#B392F0&quot;&gt;id&lt;/span&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--0:#9ECBFF&quot;&gt;&quot;yosegaki&quot;&lt;/span&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt;&gt;&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;--0:#85E89D&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt;&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;--0:#85E89D&quot;&gt;script&lt;/span&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt; &lt;/span&gt;&lt;span style=&quot;--0:#B392F0&quot;&gt;src&lt;/span&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--0:#9ECBFF&quot;&gt;&quot;https://yk.doany.io/embed.js&quot;&lt;/span&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt;&gt;&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;--0:#85E89D&quot;&gt;script&lt;/span&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt;&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;button class=&quot;copy-btn&quot; aria-label=&quot;コードをコピー&quot;&gt;&lt;div class=&quot;copy-btn-icon&quot;&gt;&lt;svg viewBox=&quot;0 0 24 24&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;copy-btn-icon copy-icon&quot;&gt;&lt;g fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-width=&quot;2&quot;&gt;&lt;rect width=&quot;14&quot; height=&quot;14&quot; x=&quot;8&quot; y=&quot;8&quot; rx=&quot;2&quot; ry=&quot;2&quot;&gt;&lt;/rect&gt;&lt;path d=&quot;M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;svg viewBox=&quot;0 0 24 24&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;copy-btn-icon success-icon&quot;&gt;&lt;path fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-width=&quot;2&quot; d=&quot;M20 6L9 17l-5-5&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;/button&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;デプロイはHelmチャートにして、CIが&lt;code&gt;ghcr.io&lt;/code&gt;にOCIで押し込んだものを、このブログの&lt;code&gt;deploy/&lt;/code&gt;からHelmChartとして参照しています。SQLiteのファイルをPVCに1つ持つだけなので、運用の形はArtalkのときと変わっていません。&lt;br&gt;
なお乗り換えを決めた時点でコメントは0件でした。移行コストが実質ゼロだったので何度も踏み切れた、という面は正直あります。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2 id=&quot;購読と支援&quot;&gt;購読と支援&lt;a class=&quot;anchor&quot; href=&quot;#購読と支援&quot;&gt;&lt;span class=&quot;anchor-icon&quot; data-pagefind-ignore=&quot;&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;サイドバーに置いてあるやつです。&lt;/p&gt;&lt;p&gt;Ko-fiは公式ウィジェットが外部スクリプトを読み込むのでただのリンクとして実装しました。表示速度に影響せず、テーマのライト/ダークにもそのまま追従します。&lt;/p&gt;&lt;p&gt;NewsletterはButtondownを使っています。当初はRSSフィードを監視して自動配信してくれる機能を使うつもりだったのですが、これが月$9のアドオンでした。年に数本しか書かないブログには少し重い。&lt;br&gt;
一方でAPIは無料プランでも叩けます。やりたいことは記事が増えたらメールを作るだけなので、それなら自分で書けます。そこで記事をpushしたときに動くワークフローを足しました。&lt;/p&gt;&lt;div class=&quot;expressive-code&quot;&gt;&lt;figure class=&quot;frame&quot;&gt;&lt;figcaption class=&quot;header&quot;&gt;&lt;/figcaption&gt;&lt;pre data-language=&quot;yaml&quot; class=&quot;wrap&quot; style=&quot;--ecMaxLine:67ch&quot;&gt;&lt;code&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt;- &lt;/span&gt;&lt;span style=&quot;--0:#85E89D&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--0:#9ECBFF&quot;&gt;Collect newly added posts&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot; style=&quot;--ecIndent:2ch&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;  &lt;/span&gt;&lt;span style=&quot;--0:#85E89D&quot;&gt;run&lt;/span&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--0:#F97583&quot;&gt;|&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot; style=&quot;--ecIndent:4ch&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;&lt;span style=&quot;--0:#9ECBFF&quot;&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;--0:#9ECBFF&quot;&gt;# 追加 (A) されたファイルのみ。既存記事の修正では配信しない。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot; style=&quot;--ecIndent:4ch&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;&lt;span style=&quot;--0:#9ECBFF&quot;&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;--0:#9ECBFF&quot;&gt;FILES=$(git diff --name-only --diff-filter=A &quot;$BEFORE&quot; &quot;$SHA&quot; \&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot; style=&quot;--ecIndent:6ch&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;&lt;span style=&quot;--0:#9ECBFF&quot;&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;--0:#9ECBFF&quot;&gt;-- &apos;src/content/posts/**.md&apos; | tr &apos;\n&apos; &apos; &apos;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;button class=&quot;copy-btn&quot; aria-label=&quot;コードをコピー&quot;&gt;&lt;div class=&quot;copy-btn-icon&quot;&gt;&lt;svg viewBox=&quot;0 0 24 24&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;copy-btn-icon copy-icon&quot;&gt;&lt;g fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-width=&quot;2&quot;&gt;&lt;rect width=&quot;14&quot; height=&quot;14&quot; x=&quot;8&quot; y=&quot;8&quot; rx=&quot;2&quot; ry=&quot;2&quot;&gt;&lt;/rect&gt;&lt;path d=&quot;M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;svg viewBox=&quot;0 0 24 24&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;copy-btn-icon success-icon&quot;&gt;&lt;path fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-width=&quot;2&quot; d=&quot;M20 6L9 17l-5-5&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;/button&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;--diff-filter=A&lt;/code&gt;で新規追加されたファイルだけに絞っているのが要点です。これがないと誤字を直すたびに購読者へメールが飛びます。&lt;br&gt;
作られるのは下書きまでで、送信はButtondown側で内容を確認してから手動で押しています。慣れたら自動送信に切り替えるつもりですが、メールは取り消しが効かないので当面はこのままにします。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2 id=&quot;上流への追従&quot;&gt;上流への追従&lt;a class=&quot;anchor&quot; href=&quot;#上流への追従&quot;&gt;&lt;span class=&quot;anchor-icon&quot; data-pagefind-ignore=&quot;&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Fuwariはテーマとして使わせてもらっているので本家の更新を取り込みたい。とはいえ毎回手で確認するのは続きません。&lt;br&gt;
そこで月に一度上流を自動でチェックしてPRを出すワークフローを入れました。マージが衝突なく通ればPR、衝突したらPRは作らずIssueで知らせるという挙動にしてあります。&lt;/p&gt;&lt;p&gt;これを成立させるためにGitの履歴も細工しています。このリポジトリとFuwariには元々共通の祖先が1つもなかったので、そのままでは&lt;code&gt;git merge upstream/main&lt;/code&gt;が”refusing to merge unrelated histories”で弾かれます。そこで移行時にFuwariの全コミットの上に自分の変更を1コミット載せる形へ履歴を作り直しました。&lt;/p&gt;&lt;div class=&quot;expressive-code&quot;&gt;&lt;figure class=&quot;frame is-terminal&quot;&gt;&lt;figcaption class=&quot;header&quot;&gt;&lt;span class=&quot;title&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sr-only&quot;&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre data-language=&quot;console&quot; class=&quot;wrap&quot; style=&quot;--ecMaxLine:60ch&quot;&gt;&lt;code&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt;$ git log --oneline -3&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#79B8FF&quot;&gt;xxxxxxx feat: Next.js 版ブログの内容を Fuwari の上に移行&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#79B8FF&quot;&gt;6d39b0d chore(deps): bump the patch-updates group ... (#681)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#79B8FF&quot;&gt;415fb97 chore(deps): bump the patch-updates group ... (#648)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;button class=&quot;copy-btn&quot; aria-label=&quot;コードをコピー&quot;&gt;&lt;div class=&quot;copy-btn-icon&quot;&gt;&lt;svg viewBox=&quot;0 0 24 24&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;copy-btn-icon copy-icon&quot;&gt;&lt;g fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-width=&quot;2&quot;&gt;&lt;rect width=&quot;14&quot; height=&quot;14&quot; x=&quot;8&quot; y=&quot;8&quot; rx=&quot;2&quot; ry=&quot;2&quot;&gt;&lt;/rect&gt;&lt;path d=&quot;M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;svg viewBox=&quot;0 0 24 24&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;copy-btn-icon success-icon&quot;&gt;&lt;path fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-width=&quot;2&quot; d=&quot;M20 6L9 17l-5-5&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;/button&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;GitHub上のフォーク表示にはなりませんが、フォークにしたかった目的(上流追従)はこれで達成できています。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2 id=&quot;まとめ&quot;&gt;まとめ&lt;a class=&quot;anchor&quot; href=&quot;#まとめ&quot;&gt;&lt;span class=&quot;anchor-icon&quot; data-pagefind-ignore=&quot;&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;静的サイトなので落ちる要素がほとんどなく、記事を書いてpushするだけで公開されます。コメントだけは自前で面倒を見ることになりましたが、そのぶん読者はアカウントなしで書き込めるようになりました。&lt;br&gt;
ソースコードは全部&lt;a href=&quot;https://github.com/DAnything/blog&quot;&gt;GitHub&lt;/a&gt;で公開しています。構成に関して気になる点などあればコメント頂けると助かります。&lt;/p&gt;&lt;a class=&quot;card-github no-styling&quot; href=&quot;https://github.com/DAnything/blog&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;div class=&quot;gc-titlebar&quot;&gt;&lt;div class=&quot;gc-titlebar-left&quot;&gt;&lt;div class=&quot;gc-owner&quot;&gt;&lt;div class=&quot;gc-avatar&quot; style=&quot;background-image: url(https://avatars.githubusercontent.com/u/143234231?v=4); background-color: transparent&quot;&gt;&lt;/div&gt;&lt;div class=&quot;gc-user&quot;&gt;DAnything&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;gc-divider&quot;&gt;/&lt;/div&gt;&lt;div class=&quot;gc-repo&quot;&gt;blog&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;github-logo&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;gc-description&quot;&gt;doany.io のソース — Fuwari ベースの Astro 製静的ブログ&lt;/div&gt;&lt;div class=&quot;gc-infobar&quot;&gt;&lt;div class=&quot;gc-stars&quot;&gt;0&lt;/div&gt;&lt;div class=&quot;gc-forks&quot;&gt;0&lt;/div&gt;&lt;div class=&quot;gc-license&quot;&gt;MIT&lt;/div&gt;&lt;span class=&quot;gc-language&quot;&gt;Astro&lt;/span&gt;&lt;/div&gt;&lt;/a&gt;&lt;/section&gt;</content:encoded></item><item><title>ステーションワゴンを貨物登録して税金を安くしてみた</title><link>https://doany.io/posts/truck/</link><guid isPermaLink="true">https://doany.io/posts/truck/</guid><description>自動車検査証(車検証)に用途という項目があります。ここの項目を乗用から貨物に変更して適用される税区分を変更し税金を安くできます。その方法、条件等を説明します。</description><pubDate>Wed, 06 Aug 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;久しぶりの投稿ですが、最近はウェブ関係とはうって変わって車ばかりに現を抜かしております。&lt;br&gt;
その関係で先日スバル レガシィ(3ナンバー)を貨物登録(1ナンバー)してきましたので、その方法等を書いていこうと思います。&lt;/p&gt;
&lt;blockquote class=&quot;admonition bdm-note&quot;&gt;
&lt;span class=&quot;bdm-title&quot;&gt;NOTE&lt;/span&gt;
&lt;p&gt;2026年9月追記 この記事に書いた手順を自分でも毎回なぞるのが面倒になったので、仕入れから販売までを工程にした台帳を作りました。&lt;a href=&quot;https://tk.doany.io/?from=blog-truck&quot;&gt;トドロク&lt;/a&gt;といいます。最大積載量を決めるときに使っていた重量分布計算のexcelもウェブに置いたので、後述の&lt;a href=&quot;https://tk.doany.io/tools/weight?from=blog-truck&quot;&gt;重量分布計算書&lt;/a&gt;から使えます。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;section&gt;&lt;h2 id=&quot;貨物登録とは&quot;&gt;貨物登録とは&lt;a class=&quot;anchor&quot; href=&quot;#貨物登録とは&quot;&gt;&lt;span class=&quot;anchor-icon&quot; data-pagefind-ignore=&quot;&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;まず貨物登録とはなんぞやという話ですが、自動車検査証(車検証)に用途という項目があります。ここの項目を乗用から貨物に変更して適用される税区分を変更しようというものです。&lt;br&gt;
詳細な税制度に関してはここでの説明は省きますが、今回貨物登録した車両では下記の通り税金が変わります。(2026年10月3日現在。旧の重量税, 自賠責は24ヶ月分を2で割っています。自賠責は2026年11月1日始期の契約からの基準料率です。)&lt;/p&gt;


































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;td&gt;&lt;/td&gt;&lt;th&gt;旧&lt;/th&gt;&lt;th&gt;新&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;th scope=&quot;row&quot;&gt;自動車税&lt;/th&gt;&lt;td&gt;51,750&lt;/td&gt;&lt;td&gt;8,800&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th scope=&quot;row&quot;&gt;重量税&lt;/th&gt;&lt;td&gt;22,800&lt;/td&gt;&lt;td&gt;8,200&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th scope=&quot;row&quot;&gt;自賠責&lt;/th&gt;&lt;td&gt;9,280&lt;/td&gt;&lt;td&gt;17,930&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th scope=&quot;row&quot;&gt;合計&lt;/th&gt;&lt;td&gt;83,830&lt;/td&gt;&lt;td&gt;34,930&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th scope=&quot;row&quot;&gt;差額&lt;/th&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;-48,900&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;上記の通りかなり安くなりますが、いくつかデメリットもあります。&lt;br&gt;
大きなものだとETCの利用料金区分が普通から中型になり、料金があがります。どれくらい乗ると差額の元が取れなくなるか、新東名(普通区間)で計算してみます。NEXCOの料金は(ターミナルチャージ150円＋24.6円×距離)×車種の比率×1.1(消費税)で、中型は普通の1.2倍、100kmを超える分は長距離逓減で安くなります。上の差額48,900円を1kmあたりの差で割ったものが、元が取れなくなる年間の高速の走行距離です。&lt;/p&gt;












































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;1回の距離&lt;/th&gt;&lt;th&gt;普通車&lt;/th&gt;&lt;th&gt;中型車&lt;/th&gt;&lt;th&gt;差&lt;/th&gt;&lt;th&gt;1kmあたりの差&lt;/th&gt;&lt;th&gt;元が取れなくなる年間距離&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;50km&lt;/td&gt;&lt;td&gt;1,518円&lt;/td&gt;&lt;td&gt;1,822円&lt;/td&gt;&lt;td&gt;304円&lt;/td&gt;&lt;td&gt;約6.1円&lt;/td&gt;&lt;td&gt;約8,100km&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;100km&lt;/td&gt;&lt;td&gt;2,871円&lt;/td&gt;&lt;td&gt;3,445円&lt;/td&gt;&lt;td&gt;574円&lt;/td&gt;&lt;td&gt;約5.7円&lt;/td&gt;&lt;td&gt;約8,500km&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;200km&lt;/td&gt;&lt;td&gt;4,900円&lt;/td&gt;&lt;td&gt;5,881円&lt;/td&gt;&lt;td&gt;980円&lt;/td&gt;&lt;td&gt;約4.9円&lt;/td&gt;&lt;td&gt;約10,000km&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;300km&lt;/td&gt;&lt;td&gt;6,795円&lt;/td&gt;&lt;td&gt;8,154円&lt;/td&gt;&lt;td&gt;1,359円&lt;/td&gt;&lt;td&gt;約4.5円&lt;/td&gt;&lt;td&gt;約10,800km&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;1回の距離が長いほど逓減が効いて差が縮みます。年間8,000km以上高速を走るような使い方でなければ問題はありません。&lt;br&gt;
ただし休日割引(3割引)は普通車と軽だけで中型は対象外なので、土日祝に乗ることが多いと差が広がります(深夜割引は中型も対象です)。&lt;/p&gt;












































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;1回の距離&lt;/th&gt;&lt;th&gt;普通車(休日割引)&lt;/th&gt;&lt;th&gt;中型車&lt;/th&gt;&lt;th&gt;差&lt;/th&gt;&lt;th&gt;1kmあたりの差&lt;/th&gt;&lt;th&gt;元が取れなくなる年間距離&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;50km&lt;/td&gt;&lt;td&gt;1,063円&lt;/td&gt;&lt;td&gt;1,822円&lt;/td&gt;&lt;td&gt;759円&lt;/td&gt;&lt;td&gt;約15.2円&lt;/td&gt;&lt;td&gt;約3,200km&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;100km&lt;/td&gt;&lt;td&gt;2,010円&lt;/td&gt;&lt;td&gt;3,445円&lt;/td&gt;&lt;td&gt;1,436円&lt;/td&gt;&lt;td&gt;約14.4円&lt;/td&gt;&lt;td&gt;約3,400km&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;200km&lt;/td&gt;&lt;td&gt;3,430円&lt;/td&gt;&lt;td&gt;5,881円&lt;/td&gt;&lt;td&gt;2,450円&lt;/td&gt;&lt;td&gt;約12.3円&lt;/td&gt;&lt;td&gt;約4,000km&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;300km&lt;/td&gt;&lt;td&gt;4,756円&lt;/td&gt;&lt;td&gt;8,154円&lt;/td&gt;&lt;td&gt;3,397円&lt;/td&gt;&lt;td&gt;約11.3円&lt;/td&gt;&lt;td&gt;約4,300km&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;もう一つが、車検が一年に一度になることです。こちらは年に一回検査手数料を払う費用が増えますが、たかだか2,600円程度です(2026年4月改定後の普通車の持込検査の手数料)。車検をディーラーやショップに預けている方もいるとおもいますが、日本車でしたらほとんどメンテナンスなんてしなくても車検はとおります。そもそもこの記事を読みに来ている時点で維持費を節約したい方だと思うので、維持費を抑えたいなら自分で整備道具を買ってネットで検索して車を維持するための最低限のメンテナンス方法ぐらいはぐぐりましょうそれができないならおとなしくディーラーの言いなりでお金を払いましょう。そのためのサービス料です。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2 id=&quot;貨物登録の流れ&quot;&gt;貨物登録の流れ&lt;a class=&quot;anchor&quot; href=&quot;#貨物登録の流れ&quot;&gt;&lt;span class=&quot;anchor-icon&quot; data-pagefind-ignore=&quot;&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3 id=&quot;車庫証明の取得&quot;&gt;車庫証明の取得&lt;a class=&quot;anchor&quot; href=&quot;#車庫証明の取得&quot;&gt;&lt;span class=&quot;anchor-icon&quot; data-pagefind-ignore=&quot;&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;こちらは貨物登録には関係ないのですが、車両の名義を変更するのに必要です。&lt;br&gt;
今回の場合下記書類を私が借りている駐車場の場所の管轄の警察署に提出しました。管轄警察署等は各県警によってホームページなどで公開されています。無い場合は直接電話して聞きましょう。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;自働車保管場所証明申請書(2通(キャッシュレス等で印紙が無い場合は1通))&lt;/li&gt;
&lt;li&gt;保管場所の所在図・配置図&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;上記2種類の書類は下記のページ内のXLSXファイルをパソコンで編集して提出しています。手書きである必要はありません。&lt;br&gt;
&lt;a href=&quot;https://www.keishicho.metro.tokyo.lg.jp/tetsuzuki/kotsu/hokan/syako_tetsuzuki/jidousha_syomei.html&quot;&gt;保管場所証明申請手続&lt;/a&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;保管場所使用承諾証明書&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;こちらに関しては要件(貸主、借主、契約日、契約満了日など)を満たしていれば駐車場の賃貸契約書等で可能な場合があります。&lt;br&gt;
自分はいつも駐車場の賃貸契約書のコピーで申請しています。自分の契約書が使えるかどうかの確認は警察署に問い合わせてみるといいでしょう。&lt;/p&gt;&lt;blockquote&gt;
&lt;p&gt;参考: &lt;a href=&quot;https://www.keishicho.metro.tokyo.lg.jp/tetsuzuki/kotsu/hokan/syako_syousai/youken.html&quot;&gt;保管場所（車庫）の要件と使用権原書面&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;&lt;/section&gt;&lt;section&gt;&lt;h3 id=&quot;仮ナンバーの取得&quot;&gt;仮ナンバーの取得&lt;a class=&quot;anchor&quot; href=&quot;#仮ナンバーの取得&quot;&gt;&lt;span class=&quot;anchor-icon&quot; data-pagefind-ignore=&quot;&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;今回通した車ですが、購入時にすでに一時抹消されていたため仮ナンバーを借りにいきました。こちらがないと車両を車検や車検整備のために回送することができません。&lt;br&gt;
仮ナンバーを借りるためには自賠責保険の加入が必要なのですが、今回購入した車がすでに自賠責が切れていたため商品自動車の契約で5日間だけ加入しました。&lt;br&gt;
以前は抹消した状態の車種で1か月で自賠責が発行できたのですが、自賠責保険規制強化があったらしく現在は仮ナンバーを借りるという用途の場合商品自動車という形で5日間の契約しかできないようです。&lt;br&gt;
また、自賠責代理店によっては商品自動車の契約の取り扱いが無い場合があります。陸運局事務所の敷地内や近くにある行政書士法人や、保険会社の支社などであれば確実に契約できます。カー用品店等では取り扱いがありませんでした。&lt;br&gt;
自賠責に加入したら最寄りの市役所や仮ナンバーの貸し出しを行っている支所等に向かい仮ナンバーの貸し出し申請を行います。このとき最大貸し出し期間が5日なので上記の車庫証明の発行と後ほど記載する事前審査が完了してから借りに行くのをおすすめします。
自分も順番を間違えて5日が切れかけたことがあるので、&lt;a href=&quot;https://tk.doany.io/?from=blog-truck&quot;&gt;トドロク&lt;/a&gt;の工程にはこの順番と各窓口の持ち物、現金がいる箇所を入れてあります。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3 id=&quot;貨物登録の為の改造&quot;&gt;貨物登録の為の改造&lt;a class=&quot;anchor&quot; href=&quot;#貨物登録の為の改造&quot;&gt;&lt;span class=&quot;anchor-icon&quot; data-pagefind-ignore=&quot;&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;section&gt;&lt;h4 id=&quot;貨物として認定される基準&quot;&gt;貨物として認定される基準&lt;a class=&quot;anchor&quot; href=&quot;#貨物として認定される基準&quot;&gt;&lt;span class=&quot;anchor-icon&quot; data-pagefind-ignore=&quot;&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;まず自動車等はどのようにして用途ごとの検査基準を設けているかというと、国土交通省からの政令によって決められています。&lt;br&gt;
道路運送車両法で定められているんじゃないのという疑問を持つ方がいるかと思いますが、道路運送車両法には大まかな内容しか書かれておらず、その内容の解釈などを別途政令で定めています。&lt;br&gt;
時代によって自動車の技術などの入れ替わりは激しいのでこのような形態を取っているというのが建前ですが、結局は関係各所とよろしくやるための制度だと思います。&lt;br&gt;
貨物自動車として検査に通すための基準は下記の様な内容になります。政令から抜粋して平易な表現に書き換えています。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;積載設備の床面積が1m2以上あること&lt;/li&gt;
&lt;li&gt;乗車設備の床面積より積載設備の床面積が大きいこと&lt;/li&gt;
&lt;li&gt;乗車設備の乗員重量より積載重量のほうが大きいこと&lt;/li&gt;
&lt;li&gt;物品を積み下ろしする開口部が縦横800mm*800mm以上かつ投影面積が0.64m2以上であること&lt;/li&gt;
&lt;li&gt;乗員と積載設備との保護仕切りがあること&lt;/li&gt;
&lt;/ul&gt;&lt;blockquote class=&quot;admonition bdm-note&quot;&gt;
&lt;span class=&quot;bdm-title&quot;&gt;NOTE&lt;/span&gt;
&lt;p&gt;乗車設備とは2列目以降のことです運転席がある一列目は含みません&lt;/p&gt;
&lt;/blockquote&gt;&lt;blockquote&gt;
&lt;p&gt;参考: &lt;a href=&quot;https://www.mlit.go.jp/jidosha/kensatoroku/kensa/kns07_1.htm&quot;&gt;自動車の用途等の区分について（依命通達）&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;この政令に書かれていることの他NALTECが別途審査委事務規定というものを定めており、政令に書かれていない箇所に関してどう扱うかを明記しています。&lt;br&gt;
国でも無い機関が勝手に法律、政令を解釈していいのかという疑問をいだきますが、節約のために飲み込みましょう。&lt;br&gt;
下記が貨物登録するにあたって追加の条件となる規定です。不要な部分はカットしています。&lt;/p&gt;&lt;blockquote&gt;
&lt;p&gt;第 4 章 自動車の検査等に係る審査の実施方法&lt;br&gt;
4-17 貨物自動車の審査&lt;br&gt;
4-17-1 用途の判定&lt;br&gt;
（2）乗用自動車（車体の形状が箱型、幌型又はステーションワゴンのものに限る。）として認証を受けた四輪以上の指定自動車等及びこれらの自動車に対し「指定自動車等と関連」に区分される並行輸入自動車の乗車人員の携帯品の積載箇所は、用途区分通達における物品積載設備とは判断しない。&lt;br&gt;
ただし、車体の形状がステーションワゴンのもの（ステーションワゴン以外の自動車であるが別添 3「並行輸入自動車審査要領」6.2.7.を準用した場合にステーションワゴンと分類できるもの又は幌型の自動車であって座席後方の幌が車両の最後尾附近まであるものを含む。）に限り、後部座席等の取外し（座席定員の設定が複数ある状態で認証等を受けたものについて、後部座席等の取外しを行った状態のものと同様な状態で認証等を受けたものを含む。）又は床面への格納固定を行い、これによってできた床面及び当該床面と連続した乗車人員の携帯品の積載箇所については物品積載設備とするものとする。
参照: &lt;a href=&quot;https://www.naltec.go.jp/publication/regulation/hbh5ss0000002mk7-att/gtg5d20000000fn8.pdf&quot;&gt;第4章 自動車の検査等に係る審査の実施方法&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;上記を要約すると下記の様になります。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;箱型、幌型、ステーションワゴンの最初からついてる荷物置き場は用途区分通達における物品積載設備とは判定しません。&lt;/li&gt;
&lt;li&gt;ステーションワゴンもしくは並行輸入自動車審査要領6.2.7.を準用してステーションワゴンと分類できるものは座席の取り外しや収納などをしてできたスペースと最初からあった荷物置き場を合計して物品積載設備とみなす。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h4 id=&quot;実際の改造箇所&quot;&gt;実際の改造箇所&lt;a class=&quot;anchor&quot; href=&quot;#実際の改造箇所&quot;&gt;&lt;span class=&quot;anchor-icon&quot; data-pagefind-ignore=&quot;&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;上記要件を満たすために今回行った改造を書いていきます。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;物品を積み下ろしする開口部が縦横800mm*800mm以上かつ投影面積が0.64m2以上であること&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;こちらに関してはメジャー等で計って800mm以上あれば概ね問題ありません。この時荷室の高さではなく開口部の高さなのに注意してください。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;積載設備の床面積が1m2以上あること&lt;/li&gt;
&lt;li&gt;乗車設備の床面積より積載設備の床面積が大きいこと&lt;/li&gt;
&lt;li&gt;乗車設備の乗員重量より積載重量のほうが大きいこと&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;今回は2列目シートの右側を倒した状態で固定(NALTEC事務要領に格納固定とあるので固定が必要です)し荷室面積を増やすことにしました。&lt;br&gt;
固定の方法ですが、ヘッドレスト用の穴にボルトをいれチェーンを繋ぎ座席の下にある座面を固定するストライカーとそのチェーンをつなげて固定しました。外すのが容易ですが、一般的にはこの状態でも固定と言えると思います。&lt;br&gt;
また、検査員によっては平床であることを言ってくる検査員が居ますが法律、政令上平床である必要はありません。&lt;br&gt;
先ほど参考にも記載した&lt;code&gt;自動車の用途等の区分について（依命通達）&lt;/code&gt;の注2(2)に&lt;code&gt;タイヤえぐり、蓄電池箱等の占める面積は、物品の積載に支障がない限り物品積載設備の床面積に含めるものとする。&lt;/code&gt;という記載があります。&lt;br&gt;
こちらを読み解くとタイヤえぐり等の湾曲部が存在する箇所であっても物品の積載に支障が無い限り積載面積とするという風に書かれています。物品というのがここでは定義が記されていなく砂利などの可能性もあるため平床にしなくても問題ないと解するのが妥当だと思います。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;乗員と積載設備との保護仕切りがあること&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;100均などで売っている棚に使うような金網を買ってきて90度曲げて倒した座席の下に差し込みました。&lt;br&gt;
検査を通す際検査官にボルトなどで固定していないと指摘されたのですが、その際自分はボルトで固定されていてもボルトを回せば外れるので構造的に優位な差はありませんよね？と返したところその検査官はブツブツと言いながらどこかに消え検査が無事通りました。&lt;br&gt;
またそもそも保護仕切りに具体的にどういった固定方法が必要かなどは指定されてないので一般的なバンなどに付いているつっかえ棒のようなものでもいいはずです。&lt;br&gt;
このようにNALTECが行う保安基準適合検査とは、検査官の恣意的な判断が多く検査当日は、実際の政令や理論をしっかり理解し検査官を言い負かせる様になっておいた方が良いです。&lt;br&gt;
そもそもNALTECの職員は道路運送車両法にある通り基準適合性審査結果を書面をもって国土交通省に通知することとなっています。つまり道路運送車両と国土交通省政令に沿って作成された事務要領などに反する内容を審査結果に記載した場合虚偽有印公文書作成に当たる可能性があります事実過去に起訴猶予になりましたが、摘発事例があります。&lt;br&gt;
そういった話をしても埒が開かない場合、検査処分に関しては行政行為の一部だと思いますので、審査請求等も手だと思います。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h4 id=&quot;最大積載量に関して&quot;&gt;最大積載量に関して&lt;a class=&quot;anchor&quot; href=&quot;#最大積載量に関して&quot;&gt;&lt;span class=&quot;anchor-icon&quot; data-pagefind-ignore=&quot;&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;貨物登録するにあたって下記のような規定があります。また前記の部分で&lt;code&gt;乗車設備の乗員重量より積載重量のほうが大きいこと&lt;/code&gt;とあったと思います。&lt;br&gt;
また、乗車設備とは前席を除く箇所と政令に規定がありさらには積載量は50kg単位での計算とするNALTECの規定があります。&lt;br&gt;
総合すると100kg以上で同一類別区分中の最大の車両総重量を超えない範囲となります。&lt;br&gt;
今回の場合座席を格納固定しただけなため同一類別区分中の最大の車両総重量(これはメーカーかNALTECに問い合わせればわかります)を超えてしまう場合があります。&lt;br&gt;
そのためスペアタイヤなどの取り外しが必要になります。それでも足りなければ車載工具やラゲッジボード、カーナビ類内装等外してみてください。&lt;/p&gt;&lt;blockquote&gt;
&lt;p&gt;オ 指定自動車等のうち、車両総重量及び軸重の許容限度が明確でないものにあっては、同一型式の類別区分中の最大の車両総重量を超えない範囲内で指定する。
カ アからオまでに規定する自動車以外の自動車にあっては、取外した乗車設備分の定員数に55kgを乗じた重量を超えない範囲内で指定する。
参照: &lt;a href=&quot;https://www.naltec.go.jp/publication/regulation/hbh5ss0000002mk7-att/gtg5d20000002lfr.pdf&quot;&gt;7-124、8-124 最大積載量&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;今度は下記規定を見てみてください&lt;code&gt;産出される物品の積載量のうち最大のものとする&lt;/code&gt;こちらの記載を根拠に積載量を総重量のうち最大で取るようにNALTECから言われます。&lt;br&gt;
ここで問題になるのは積載を最大に取った結果車両総重量が2トンを超えてしまうことがあるということです。2トンを超えると重量税が高くなるためなるべく軽くなるように収めたほうが良いと思います。&lt;br&gt;
例として仕様上の最大車両総重量が2040kgで測定結果車両重量が1895kg+100kg=1995kgの場合と1890kg+150kg=2040kgの場合を例に出すとわかりやすいでしょうか。&lt;br&gt;
この場合軽くしすぎてしまうと重量税が増えてしまうため微妙な調整が必要です対外はラゲッジボードの有無や内装部品の有無で調整できます。&lt;br&gt;
この辺の計算は自分用に作っていたexcelをウェブに置いたので&lt;a href=&quot;https://tk.doany.io/tools/weight?from=blog-truck&quot;&gt;重量分布計算書&lt;/a&gt;を使ってください。前後の軸重、ホイールベース、残す座席の位置、積載量、タイヤのLIを入れると車両総重量と類別から取れる積載量の上限(50kg単位)が出ます。ついでに積載時の前輪荷重割合(20%を切ると通りません)とタイヤの負荷率も見ています。判定まではログインしなくても見れます。&lt;br&gt;
まだ実現可能か未検証ですが、最大車両総重量が2090kg等どう頑張っても2トンを超えてしまう車両は一回2トン超えで登録し、座席の完全な撤去や内装部品の取り外しで重量を軽くした場合総重量2トン以下にできるのではないかと考えています。&lt;/p&gt;&lt;blockquote&gt;
&lt;p&gt;（1）自動車の最大積載量は、本章の規定に適合して安全な運行を確保し、及び公害を防止できる範囲内において積載することができるものとして、（2）から（11）までの基準に基づき算出される物品の積載量のうち最大のものとする。&lt;/p&gt;
&lt;/blockquote&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h3 id=&quot;事前審査&quot;&gt;事前審査&lt;a class=&quot;anchor&quot; href=&quot;#事前審査&quot;&gt;&lt;span class=&quot;anchor-icon&quot; data-pagefind-ignore=&quot;&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;2025年4月時点で規定が改正され、一部構造変更などで事前審査が不要になる旨が明確化されました。&lt;br&gt;
今までの規定でも読み方によってはステーションワゴン-&gt;バンなどの場合は事前審査が不要な様に読めますが、おそらく各地域のNALTEC事務所ごとに解釈の違いがあり、問題になるのを避けるための改正だと思われます。&lt;br&gt;
そのためこの章は不要になりますが、また今後書類審査が必要になる可能性も0ではないため残しておきます。&lt;br&gt;
&lt;a href=&quot;https://www.naltec.go.jp/news/hbh5ss0000001vvf-att/hbh5ss0000001vvv.pdf&quot;&gt;審査事務規程の一部改正について（第63次改正）&lt;/a&gt;&lt;/p&gt;&lt;p&gt;2024年10月28日より書類提出がオンラインでできるようになりました。ただし一部書類はこちらで用意してからアップロードする方式なので書類を一式用意してから申請を行うことになります。&lt;br&gt;
審査の回答まで提出してから最大で15日かかります。ですので車庫証明などを発行してしまった場合早めに提出したほうがいいです。(車庫証明の有効期限は1か月程度)また自分の場合は書類提出した際に事前に車庫証明の有効期限が近いことを伝えると早く処理していただけました。&lt;/p&gt;&lt;section&gt;&lt;h4 id=&quot;提出手順&quot;&gt;提出手順&lt;a class=&quot;anchor&quot; href=&quot;#提出手順&quot;&gt;&lt;span class=&quot;anchor-icon&quot; data-pagefind-ignore=&quot;&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://naltecsss.service-now.com/naltec&quot;&gt;こちら&lt;/a&gt;のサイトでアカウントを作る ログイン-&gt;アカウント登録で作れる&lt;/li&gt;
&lt;li&gt;アカウントを作りログインしたら新規検査届出をクリック&lt;/li&gt;
&lt;li&gt;届出の作成をクリック&lt;/li&gt;
&lt;li&gt;下記の通り選択、記入し次へをクリック
&lt;ol&gt;
&lt;li&gt;届出方法選択: &lt;code&gt;個別届出&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;附則: &lt;code&gt;技術基準等の審査を要する自動車、自動車予備検査証の交付を受けた自動車又は使用の過程にある自動車若しくは特定の大型特殊自動車&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;区分: &lt;code&gt;3.2.（1）技術基準等の審査を要する自動車&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;届出先: 検査を受ける検査事務所を選択してください&lt;/li&gt;
&lt;li&gt;車名、型式、車体番号: 車検証の通り記入してください&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;新規検査等届出書（第１号様式）（その１）は下記の通り記入する
&lt;ol&gt;
&lt;li&gt;類別区分番号又は車両仕様記号: &lt;code&gt;類別区分番号&lt;/code&gt;を選択入力欄に車検証に記載のある類別区分番号を入れる&lt;/li&gt;
&lt;li&gt;当該型式・類別区分番号の指定自動車等に対して変更している自動車の構造・装置
&lt;ol&gt;
&lt;li&gt;構造・装置の変更有無: &lt;code&gt;有&lt;/code&gt;を選択&lt;/li&gt;
&lt;li&gt;オプション: &lt;code&gt;（記入欄のとおり）&lt;/code&gt;を選択&lt;/li&gt;
&lt;li&gt;記入欄: 下記の通り入力(現在の仕様に合わせて適宜書き換えてください)&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&quot;expressive-code&quot;&gt;&lt;figure class=&quot;frame&quot;&gt;&lt;figcaption class=&quot;header&quot;&gt;&lt;/figcaption&gt;&lt;pre data-language=&quot;plaintext&quot; class=&quot;wrap&quot; style=&quot;--ecMaxLine:23ch&quot;&gt;&lt;code&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;乗車定員の変更（5人→3人）2列目右側座席固定&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;用途変更（乗用→貨物）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;車体形状の変更（ステーションワゴン→バン）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;button class=&quot;copy-btn&quot; aria-label=&quot;コードをコピー&quot;&gt;&lt;div class=&quot;copy-btn-icon&quot;&gt;&lt;svg viewBox=&quot;0 0 24 24&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;copy-btn-icon copy-icon&quot;&gt;&lt;g fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-width=&quot;2&quot;&gt;&lt;rect width=&quot;14&quot; height=&quot;14&quot; x=&quot;8&quot; y=&quot;8&quot; rx=&quot;2&quot; ry=&quot;2&quot;&gt;&lt;/rect&gt;&lt;path d=&quot;M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;svg viewBox=&quot;0 0 24 24&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;copy-btn-icon success-icon&quot;&gt;&lt;path fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-width=&quot;2&quot; d=&quot;M20 6L9 17l-5-5&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;/button&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;騒音防止装置に係る構造・装置の変更有無: &lt;code&gt;無&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;騒音防止装置に係る過回転防止装置の有無: &lt;code&gt;無&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;新規検査等届出書（第１号様式）（その２）にアップロードする書類はNALTECが配布するwindowsアプリケーションで作成できます。下記リンクからzipファイルをダウンロードしbinフォルダ内のInitPreEntry.exeを実行すると起動します。
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.naltec.go.jp/hbh5ss0000000tvb-att/a1743469302713.zip&quot;&gt;新規検査届出書第一号様式2&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;入力する内容は実際に車両を測定するかメーカーに問い合わせて諸元表をもらえばできます。&lt;/li&gt;
&lt;li&gt;計算が要る部分に関しては、NALTECの事務所で重量分布計算書というものがもらえる場合がありますが、場所によって対応が異なるようです。前述の&lt;a href=&quot;https://tk.doany.io/tools/weight?from=blog-truck&quot;&gt;重量分布計算書&lt;/a&gt;で出した数値をそのまま転記してください。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;自動車を特定する書面は登録識別情報等通知書のスキャンデータをアップロードする&lt;/li&gt;
&lt;li&gt;諸元表又は車両諸元要目表はメーカーに問い合わせた諸元と外観四面図をアップロードする&lt;/li&gt;
&lt;li&gt;技術基準等への適合性を証する書面は「保安基準各条項の技術的要件の適合性に関する書面」をアップロードしてください。内容は自分の車に合った計算をして記載してください。
&lt;ul&gt;
&lt;li&gt;※2026年10月追記 以前ここで配布していたサンプル入力済みのwordファイルは公開を終了しました。今は&lt;a href=&quot;https://tk.doany.io/?from=blog-truck&quot;&gt;トドロク&lt;/a&gt;の構造等変更の画面で、台帳に入れた車両の値からこの書面と外観四面図を作れます。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;その他書面には下記をアップロードしてください
&lt;ul&gt;
&lt;li&gt;横からの画像に車両全長を記載&lt;/li&gt;
&lt;li&gt;前方からの画像に全幅を記載&lt;/li&gt;
&lt;li&gt;後方からの画像に全高と荷室の全高と開口部の高さ&lt;/li&gt;
&lt;li&gt;座面を固定および荷室との仕切り壁がわかる画像&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h3 id=&quot;キャッシュレスの登録&quot;&gt;キャッシュレスの登録&lt;a class=&quot;anchor&quot; href=&quot;#キャッシュレスの登録&quot;&gt;&lt;span class=&quot;anchor-icon&quot; data-pagefind-ignore=&quot;&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;2023年1月より検査登録に必要な支払いをキャッシュレスで行えるようになりました。&lt;br&gt;
下記より支払い情報の登録が行えます。&lt;br&gt;
&lt;a href=&quot;https://www.car-cashless.mlit.go.jp/cashless-web/&quot;&gt;くるまの保有関係手続 お支払い情報登録サービス&lt;/a&gt;&lt;/p&gt;&lt;p&gt;支払い情報登録の際手続きの種類を中古新規にしてください。そうしないと後で手続きの種類を変更することができないので、車検証発行の段階で現金で払うことになります。&lt;br&gt;
車検が残っており一時抹消などで税の還付を受けない場合は構造変更を選択してください。&lt;br&gt;
自賠責だけは別になるので自賠責分だけ現金を用意する必要があります。カー用品店等ではカードで自賠責が買えるためそちらで発行するのも手です。&lt;br&gt;
また、ナンバーセンターでのナンバープレート発行費用及び記念所蔵時の穴あけ料についても現金になります。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3 id=&quot;検査当日&quot;&gt;検査当日&lt;a class=&quot;anchor&quot; href=&quot;#検査当日&quot;&gt;&lt;span class=&quot;anchor-icon&quot; data-pagefind-ignore=&quot;&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;検査当日までに下記サイトから予約が必要です。予約時検査種別は一時抹消済みであっても&lt;code&gt;構造等変更検査&lt;/code&gt;になります。&lt;br&gt;
ただし、場所によっては予約が非常に取りにくいことがあります。&lt;br&gt;
その理由として、一部の事業者が複数台分の予約枠を確保し、当日来なかった車両分だけをキャンセルするという運用をしているケースがあるためです。こうした行為には特にペナルティがないため、予約枠が埋まってしまうことがあります。&lt;br&gt;
また、上記のような運用している事業者は当日予約をキャンセルすることが多いため当日に予約が空くこともあるので当日早朝及び第一ラウンド検査中などに見てみるのも手だと思います。&lt;br&gt;
&lt;a href=&quot;https://www.reserve.naltec.go.jp/&quot;&gt;自動車検査インターネット予約システム&lt;/a&gt;&lt;/p&gt;&lt;p&gt;当日の流れですが、大まかには下記のようになります。細かいところは陸運局ごとに違うと思いますので、省略させていただきます。&lt;br&gt;
またキャッシュレスの登録をしなかった場合当日書く書類が2,3枚増えますのでできるだけキャッシュレスでの手続きをおすすめします。下記手順では現金の場合の手続きを省いています。&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;検査受付書類を印刷するPCが登録事務所の検査受付窓口の近くに在るので、車検証のQRをスキャンして受付書類を出す&lt;/li&gt;
&lt;li&gt;通常の継続検査レーンで検査を受ける&lt;/li&gt;
&lt;li&gt;審査書類を提出した検査小屋で審査書類をうけとる※事前審査をしてない場合は不要&lt;/li&gt;
&lt;li&gt;新規検査用のレーンで車重などを量る&lt;/li&gt;
&lt;li&gt;普通貨物で自賠責を加入する&lt;/li&gt;
&lt;li&gt;中古新規および構造変更どちらの場合でも一号様式に記入し登録窓口に提出する&lt;/li&gt;
&lt;li&gt;税申告書を記入し税申告窓口に行き書類を提出する&lt;/li&gt;
&lt;li&gt;ナンバプレート窓口でナンバープレートを受け取る(元々のナンバーが付いている場合は外してから)&lt;/li&gt;
&lt;li&gt;ナンバープレートを取り付けし封印をしてもらう&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2 id=&quot;まとめ&quot;&gt;まとめ&lt;a class=&quot;anchor&quot; href=&quot;#まとめ&quot;&gt;&lt;span class=&quot;anchor-icon&quot; data-pagefind-ignore=&quot;&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;行政手続きや政治、法律のプロではないのでブログの内容や私の考えに間違いなどあるかもしれませんが、その辺りどしどしコメント頂けると助かります。
冒頭にも書きましたが、この記事の流れに前後の仕入れと販売を足した8工程を&lt;a href=&quot;https://tk.doany.io/?from=blog-truck&quot;&gt;トドロク&lt;/a&gt;の台帳にしてあります。次に通す人は台帳から始めると、持ち物と現金の要る箇所、かかった費用が一か所に残るので楽だと思います。
今回節税するために貨物登録を行いましたが、そもそも現在の税制はあまり受益者負担になっていなのではないかと言うような疑問やNALTECや警察組織の思惑ばかりで本当に安全な交通社会に寄与できるような規制になっていないのではないかなどの疑問が私の場合は残りますが、その辺り皆さんはどう思われますでしょうか。&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>Mercedes NTG ATAロック解除メモ</title><link>https://doany.io/posts/ntg-ssd/</link><guid isPermaLink="true">https://doany.io/posts/ntg-ssd/</guid><description>NTG SSD化における私的メモ</description><pubDate>Sat, 25 May 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;下記で紹介されているxboxhdmを使う有名な方法があるがxboxhdm v1.9はsata接続に対応していないため4.5のsata接続以降では利用できない&lt;br&gt;
&lt;a href=&quot;https://mhhauto.com/Thread-NTG4-5-4-7-HDD-imaging-project&quot;&gt;NTG4.5 / 4.7 HDD imaging project&lt;/a&gt;&lt;br&gt;
fujtoolを利用する方法等が紹介されているがそもそもwindows用のsmart編集ツールなどで解除できないか調べた&lt;br&gt;
windowsで利用できるusb, sataなどに対応したsmart編集用ツールとしてsmartctlがある、またxboxhdmの最新版v.2.3においてはunlockhdコマンドにsmartctlが利用されている&lt;/p&gt;
&lt;p&gt;ならば上記フォーラムに記載のパスワード生成手順と合わせ下記のようなコマンドでロックが解除できるのではないかと予想している&lt;/p&gt;
&lt;div class=&quot;expressive-code&quot;&gt;&lt;figure class=&quot;frame is-terminal&quot;&gt;&lt;figcaption class=&quot;header&quot;&gt;&lt;span class=&quot;title&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sr-only&quot;&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre data-language=&quot;shell&quot; class=&quot;wrap&quot; style=&quot;--ecMaxLine:81ch&quot;&gt;&lt;code&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#B392F0&quot;&gt;./smartctl.exe&lt;/span&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt; &lt;/span&gt;&lt;span style=&quot;--0:#79B8FF&quot;&gt;-s&lt;/span&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt; &lt;/span&gt;&lt;span style=&quot;--0:#9ECBFF&quot;&gt;security-unlock,&quot;longUserPasswordFromMelcoCalculator&quot;&lt;/span&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt; &lt;/span&gt;&lt;span style=&quot;--0:#9ECBFF&quot;&gt;/dev/sdb&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#B392F0&quot;&gt;./smartctl.exe&lt;/span&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt; &lt;/span&gt;&lt;span style=&quot;--0:#79B8FF&quot;&gt;-s&lt;/span&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt; &lt;/span&gt;&lt;span style=&quot;--0:#9ECBFF&quot;&gt;security-disable,&quot;longUserPasswordFromMelcoCalculator&quot;&lt;/span&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt; &lt;/span&gt;&lt;span style=&quot;--0:#9ECBFF&quot;&gt;/dev/sdb&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;button class=&quot;copy-btn&quot; aria-label=&quot;コードをコピー&quot;&gt;&lt;div class=&quot;copy-btn-icon&quot;&gt;&lt;svg viewBox=&quot;0 0 24 24&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;copy-btn-icon copy-icon&quot;&gt;&lt;g fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-width=&quot;2&quot;&gt;&lt;rect width=&quot;14&quot; height=&quot;14&quot; x=&quot;8&quot; y=&quot;8&quot; rx=&quot;2&quot; ry=&quot;2&quot;&gt;&lt;/rect&gt;&lt;path d=&quot;M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;svg viewBox=&quot;0 0 24 24&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;copy-btn-icon success-icon&quot;&gt;&lt;path fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-width=&quot;2&quot; d=&quot;M20 6L9 17l-5-5&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;/button&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;</content:encoded></item><item><title>OSSで移転登録してみた</title><link>https://doany.io/posts/oss-transfer/</link><guid isPermaLink="true">https://doany.io/posts/oss-transfer/</guid><description>OSSで移転登録をしてみたのでその方法を解説します。</description><pubDate>Mon, 01 Jan 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;前回に引き続き車ネタです。&lt;/p&gt;
&lt;blockquote class=&quot;admonition bdm-note&quot;&gt;
&lt;span class=&quot;bdm-title&quot;&gt;NOTE&lt;/span&gt;
&lt;p&gt;2026年9月追記 この記事のあと中古車店を始めて、自分が申請者になる移転登録は今もOSSでやっています。仕入れから販売までの手続きを台帳にした&lt;a href=&quot;https://tk.doany.io/?from=blog-oss&quot;&gt;トドロク&lt;/a&gt;を作りました。この記事に関係するのは2つで、車検証のQRをスマホで読むと後述の車検証情報取込みファイルを出せること、車庫証明を同時申請するときの所在図・配置図を地図の上で描けることです。該当の箇所に追記しています。あわせて2026年9月時点で手順を見直し、変わったところ(保管場所標章の廃止、動作環境、リンク先)も追記しました。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;section&gt;&lt;h2 id=&quot;ossとは&quot;&gt;OSSとは&lt;a class=&quot;anchor&quot; href=&quot;#ossとは&quot;&gt;&lt;span class=&quot;anchor-icon&quot; data-pagefind-ignore=&quot;&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;OSSとはワンストップサービスの略で国土交通省が提供しているインターネット上で移転登録などの自動車に関する登録事務手続きができるサービスです。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2 id=&quot;通常の手続きとの違い&quot;&gt;通常の手続きとの違い&lt;a class=&quot;anchor&quot; href=&quot;#通常の手続きとの違い&quot;&gt;&lt;span class=&quot;anchor-icon&quot; data-pagefind-ignore=&quot;&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;最近では自動車ディーラー等が手続きを簡素化したりするために導入しています。
通常の手続きと下記のような違いがありますが、個人が使う範囲ではあまりメリットはありません。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;車庫証明も同時申請できるため警察署に行く回数が少なく済む&lt;/li&gt;
&lt;li&gt;手数料がPay-easy, クレジットカード等で納付可能なため手続きを管轄している陸運局がキャッシュレス決済に対応していなくても現金以外で支払いできる。&lt;/li&gt;
&lt;li&gt;電子証明で申請する場合、自分の印鑑証明が不要なため印鑑証明代が節約できる&lt;/li&gt;
&lt;li&gt;紙の書類を書かなくていい(譲渡証明書、委任状を除く)&lt;/li&gt;
&lt;li&gt;電子車検証を用いて車両情報の記入時間を減らせる&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2 id=&quot;実際の流れ&quot;&gt;実際の流れ&lt;a class=&quot;anchor&quot; href=&quot;#実際の流れ&quot;&gt;&lt;span class=&quot;anchor-icon&quot; data-pagefind-ignore=&quot;&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;OSSを導入しているディーラーで購入した場合譲渡証明書等が電子登録されている場合がありますが、希有なケースな為今回は紙の委任状と譲渡証明書を受け取った場合で話をすすめます。&lt;/p&gt;&lt;section&gt;&lt;h3 id=&quot;事前準備&quot;&gt;事前準備&lt;a class=&quot;anchor&quot; href=&quot;#事前準備&quot;&gt;&lt;span class=&quot;anchor-icon&quot; data-pagefind-ignore=&quot;&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;section&gt;&lt;h4 id=&quot;ossブラウザアドオン&quot;&gt;OSSブラウザアドオン&lt;a class=&quot;anchor&quot; href=&quot;#ossブラウザアドオン&quot;&gt;&lt;span class=&quot;anchor-icon&quot; data-pagefind-ignore=&quot;&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;OSSを使うためのブラウザアドオンのインストールが必要です。&lt;br&gt;
下記からアドオンとchrome用の拡張機能をインストールしてください。&lt;br&gt;
自分の場合microsoft edgeを使用しましたが、edgeでも変わりません。&lt;br&gt;
&lt;a href=&quot;https://www.oss.mlit.go.jp/secure/beginner/jizen-junbi/pc-kankyou/add-on-kankyou-chrome/kyodaku-add-on/index.html&quot;&gt;OSSブラウザアドオン&lt;/a&gt;&lt;br&gt;
&lt;a href=&quot;https://chrome.google.com/webstore/detail/%E8%87%AA%E5%8B%95%E8%BB%8A%E4%BF%9D%E6%9C%89%E9%96%A2%E4%BF%82%E6%89%8B%E7%B6%9A%E3%83%AF%E3%83%B3%E3%82%B9%E3%83%88%E3%83%83%E3%83%97%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%83%96%E3%83%A9%E3%82%A6%E3%82%B6%E3%83%97%E3%83%A9/medknhfnoeebjofagappbmbpcgeffpca?hl=ja&quot;&gt;chrome用拡張機能&lt;/a&gt;&lt;/p&gt;&lt;blockquote class=&quot;admonition bdm-note&quot;&gt;
&lt;span class=&quot;bdm-title&quot;&gt;NOTE&lt;/span&gt;
&lt;p&gt;2026年9月追記 動作保証はWindows 11(24H2・25H2)のEdgeかChromeだけになっています。Windows 10は対象外です。&lt;a href=&quot;https://www.oss.mlit.go.jp/portal/beginner/jizen-junbi/pc-kankyou/index.html&quot;&gt;動作環境&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;&lt;/section&gt;&lt;section&gt;&lt;h4 id=&quot;マイナンバー関連&quot;&gt;マイナンバー関連&lt;a class=&quot;anchor&quot; href=&quot;#マイナンバー関連&quot;&gt;&lt;span class=&quot;anchor-icon&quot; data-pagefind-ignore=&quot;&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;一部の申請には、マイナンバーカードの電子署名機能が必要です。PCにカードリーダーを接続してマイナンバーカードを読み取る場合は&lt;code&gt;利用者クライアントソフト&lt;/code&gt;をスマホで読み取る場合は&lt;code&gt;マイナポータルアプリ&lt;/code&gt;をインストールしてください。&lt;br&gt;
今回はPCの場合で話を進めます。&lt;/p&gt;&lt;p&gt;利用者クライアントソフトは下記からインストールできます。&lt;code&gt;利用者クライアントソフトのダウンロード&lt;/code&gt;からダウンロードしてください。ブラウザ利用版のインストールは不要です。&lt;br&gt;
&lt;a href=&quot;https://www.jpki.go.jp/download/win.html&quot;&gt;公的個人認証サービス ポータルサイト&lt;/a&gt;&lt;/p&gt;&lt;p&gt;マイナポータルアプリは下記から。&lt;br&gt;
&lt;a href=&quot;https://play.google.com/store/apps/details?id=jp.go.cas.mpa&quot;&gt;android&lt;/a&gt;&lt;br&gt;
&lt;a href=&quot;https://apps.apple.com/jp/app/%E3%83%9E%E3%82%A4%E3%83%8A%E3%83%9D%E3%83%BC%E3%82%BF%E3%83%AB/id1476359069&quot;&gt;iOS&lt;/a&gt;&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h4 id=&quot;キャッシュレス決済登録&quot;&gt;キャッシュレス決済登録&lt;a class=&quot;anchor&quot; href=&quot;#キャッシュレス決済登録&quot;&gt;&lt;span class=&quot;anchor-icon&quot; data-pagefind-ignore=&quot;&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;クレジットカード等のキャッシュレス決済を利用したい場合、下記から登録を行う必要があります。&lt;br&gt;
&lt;a href=&quot;https://www.car-cashless.mlit.go.jp/cashless-web/register&quot;&gt;お支払い情報登録サービス&lt;/a&gt;&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h4 id=&quot;電子車検証読み取り&quot;&gt;電子車検証読み取り&lt;a class=&quot;anchor&quot; href=&quot;#電子車検証読み取り&quot;&gt;&lt;span class=&quot;anchor-icon&quot; data-pagefind-ignore=&quot;&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;電子車検証を利用して入力を省略できます。&lt;br&gt;
&lt;a href=&quot;https://apps.microsoft.com/detail/9PFXXK8VGX7N?rtc=1&amp;#x26;hl=ja-jp&amp;#x26;gl=JP&quot;&gt;車検証閲覧アプリ&lt;/a&gt;&lt;/p&gt;&lt;blockquote class=&quot;admonition bdm-note&quot;&gt;
&lt;span class=&quot;bdm-title&quot;&gt;NOTE&lt;/span&gt;
&lt;p&gt;2026年9月追記 iPhone・Android版も出ていて、スマホでも車検証情報取込みファイルを出せるようになりました。&lt;a href=&quot;https://www.jidoushatouroku-portal.mlit.go.jp/etsuran-app&quot;&gt;閲覧アプリの案内&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;2026年9月追記 閲覧アプリで出せる車検証情報取込みファイルは、&lt;a href=&quot;https://tk.doany.io/?from=blog-oss&quot;&gt;トドロク&lt;/a&gt;でも出せます。車検証のQRをスマホで読んで1台登録すると、車両情報の画面から同じ形式のJSONが落とせます。車検証を車に戻してしまったあとでも作れます。&lt;/p&gt;
&lt;/blockquote&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h3 id=&quot;受任者情報ファイルの作成&quot;&gt;受任者情報ファイルの作成&lt;a class=&quot;anchor&quot; href=&quot;#受任者情報ファイルの作成&quot;&gt;&lt;span class=&quot;anchor-icon&quot; data-pagefind-ignore=&quot;&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;電子で委任状を作成するのですが、その前に受任者情報ファイルという自分の情報を作成する必要があります。&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://www.oss.mlit.go.jp/secure/tetsuduki/principal/kyodaku-junin/index.html#&quot;&gt;受任者情報ファイル作成&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;上記ページの申請開始をクリック&lt;/li&gt;
&lt;li&gt;ICカードを選択&lt;/li&gt;
&lt;li&gt;カードリーダーを利用を選択&lt;/li&gt;
&lt;li&gt;電子署名用パスワードを入力してマイナンバーカードを読み取る&lt;/li&gt;
&lt;li&gt;&lt;code&gt;自動車の車台番号をご存知ですか。&lt;/code&gt;の項目でいいえを選択(ここでいいえを選択すると申請する車に制限なく申請に使えるようになります)&lt;/li&gt;
&lt;li&gt;受任者情報ファイルの保存&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;section&gt;&lt;h3 id=&quot;委任状の作成&quot;&gt;委任状の作成&lt;a class=&quot;anchor&quot; href=&quot;#委任状の作成&quot;&gt;&lt;span class=&quot;anchor-icon&quot; data-pagefind-ignore=&quot;&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;紙の委任状を受け取っていると思いますが、電子でも作成する必要があります。&lt;br&gt;
下記リンクから作成できます。&lt;br&gt;
&lt;a href=&quot;https://www.oss.mlit.go.jp/secure/tetsuduki/principal/sentaku-inin/kyodaku-inin2/index.html#&quot;&gt;委任状作成&lt;/a&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;相手方電話番号がわからない際自分の電話番号を入れましたが、問題ありませんでした。&lt;/li&gt;
&lt;li&gt;受任者情報ファイルのところには先ほど作成したファイルを指定してください。&lt;/li&gt;
&lt;li&gt;こちらでは車体番号を入れる必要があります。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;所有者・使用者の別&lt;/code&gt;は旧所有者を選択してください。(ここを正しく選択しないと申請できません。)&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3 id=&quot;移転登録&quot;&gt;移転登録&lt;a class=&quot;anchor&quot; href=&quot;#移転登録&quot;&gt;&lt;span class=&quot;anchor-icon&quot; data-pagefind-ignore=&quot;&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;下記から移転登録の申請をします。&lt;br&gt;
&lt;a href=&quot;https://www.oss.mlit.go.jp/secure/tetsuduki/principal/shinsei/tourokusha/kyodaku-iten/index.html&quot;&gt;移転登録&lt;/a&gt;(※2026年9月追記 ページの場所が変わっていたのでリンクを直しました)&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;譲渡証明書の種類は紙を選択してください。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;すでに取得済みの保管場所証明書を利用した申請ですか。&lt;/code&gt;の欄でいいえを選択すれば車庫証明も同時に申請できます。
&lt;ul&gt;
&lt;li&gt;※2026年9月追記 同時申請には所在図・配置図の画像添付が要ります。手書きをスキャンしてもいいですが、&lt;a href=&quot;https://tk.doany.io/?from=blog-oss&quot;&gt;トドロク&lt;/a&gt;なら住所から航空写真を出して駐車枠と道路の幅を描き、OSSの条件(JPEG、1024×768まで、100KB程度)に合わせた画像で落とせます。審査で見られる点(使用の本拠から2km以内、車が枠に収まるか)は&lt;a href=&quot;https://tk.doany.io/guide/shako-shomei-jibun?from=blog-oss&quot;&gt;車庫証明を自分で申請する方法&lt;/a&gt;にまとめました。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;委任状のところでは先ほど作成したものを選択してください。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3 id=&quot;書類の提出&quot;&gt;書類の提出&lt;a class=&quot;anchor&quot; href=&quot;#書類の提出&quot;&gt;&lt;span class=&quot;anchor-icon&quot; data-pagefind-ignore=&quot;&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;電子で申請すると言っても委任状と譲渡証明書は紙の原本の提出が必要です。&lt;br&gt;
OSSでの申請完了後陸運局に行って提出する必要があります。&lt;br&gt;
陸運局によって違うと思いますが、自分の行った習志野の場合はOSS専用の受付窓口がありそちらで提出しました。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3 id=&quot;手数料の納付&quot;&gt;手数料の納付&lt;a class=&quot;anchor&quot; href=&quot;#手数料の納付&quot;&gt;&lt;span class=&quot;anchor-icon&quot; data-pagefind-ignore=&quot;&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;ステータスが更新されるたびにメールが来ます。メールが来たらすぐ確認しましょう。&lt;br&gt;
書類の提出後申請のステータスが更新され保管場所証明手数料納付待ちになりますので、メールに記載のURLから申請が面にログインできるので申請時に決めたパスワードでログインしてPay-easyか対応している金融機関から支払いを行います。&lt;br&gt;
納付後警察内管理番号が発行されますが、そちらを管轄の警察署に電話で伝え保管場所標章を郵送でお願いすることもできるようです。&lt;/p&gt;&lt;p&gt;その後2,3日経つと保管場所標章手数料納付待ちになりますので、同じように納付します。&lt;br&gt;
納付した翌日、検査登録手数料納付待ちになりますので、こちらも同じように納付しますが、納付先が違う関係で対応している金融機関が異なります。Pay-easyはこちらも使えます。&lt;/p&gt;&lt;blockquote class=&quot;admonition bdm-note&quot;&gt;
&lt;span class=&quot;bdm-title&quot;&gt;NOTE&lt;/span&gt;
&lt;p&gt;2026年9月追記 保管場所標章(車庫のステッカー)は2025年4月1日に廃止されたので、標章の手数料の納付は無くなりました。いまは保管場所証明手数料、検査登録手数料、該当すれば自動車税の順です。保管場所証明の手数料は都道府県で額が違います。&lt;/p&gt;
&lt;/blockquote&gt;&lt;/section&gt;&lt;section&gt;&lt;h3 id=&quot;保管場所標章と自動車検査証の受け取り&quot;&gt;保管場所標章と自動車検査証の受け取り&lt;a class=&quot;anchor&quot; href=&quot;#保管場所標章と自動車検査証の受け取り&quot;&gt;&lt;span class=&quot;anchor-icon&quot; data-pagefind-ignore=&quot;&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;検査登録手数料を納付した段階で保管場所標章の発行は完了しているので管轄の警察署に受け取りに行きます。&lt;/p&gt;&lt;blockquote class=&quot;admonition bdm-note&quot;&gt;
&lt;span class=&quot;bdm-title&quot;&gt;NOTE&lt;/span&gt;
&lt;p&gt;2026年9月追記 標章が廃止されたので、警察署に受け取りに行く工程は無くなりました。車庫証明の結果はOSSの中で運輸支局に渡るので、受け取りに行くのは陸運局だけです。&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;その後、陸運局に行き自動車検査証を受け取りに行きます。移転登録の際管轄する陸運局が変更になる場合ナンバープレートの変更が必要なので、車を持って行ってください。&lt;br&gt;
上記の順番はどちらでもいいです先に自動車検査証を受け取りに行っても大丈夫です。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2 id=&quot;まとめ&quot;&gt;まとめ&lt;a class=&quot;anchor&quot; href=&quot;#まとめ&quot;&gt;&lt;span class=&quot;anchor-icon&quot; data-pagefind-ignore=&quot;&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;上記が大まかな流れです。紙の書類に関しては陸運局に提出しなければならないため、あまりインターネットを用いてるメリットはないです。更には申請画面の選択項目も煩雑なため手続きにある程度詳しくないと使用するのは難しいと思います。既存の方法をそのままデジタル化しているためこのような仕様なのだと思いますが、個人的には辞めてほしいです。&lt;/p&gt;&lt;blockquote class=&quot;admonition bdm-note&quot;&gt;
&lt;span class=&quot;bdm-title&quot;&gt;NOTE&lt;/span&gt;
&lt;p&gt;2026年9月追記 店として車を売る側になる場合は事情が変わります。2026年1月施行の改正行政書士法で、買主の申請書類を店が作るのは名目を問わず違反になりました。OSSの代理申請も同じです。どこまで店がやれるかは&lt;a href=&quot;https://tk.doany.io/guide/gyoseishoshi-ho-2026?from=blog-oss&quot;&gt;改正行政書士法で中古車販売店ができること・できないこと&lt;/a&gt;に書きました。&lt;/p&gt;
&lt;/blockquote&gt;&lt;/section&gt;</content:encoded></item><item><title>アウディコーディングメモ</title><link>https://doany.io/posts/audi-coding/</link><guid isPermaLink="true">https://doany.io/posts/audi-coding/</guid><description>アウディにてVCDSを用いて電装系の動作のカスタマイズ(俗にコーディングというらしい)を行ったので、手順やカスタマイズできる内容などを紹介していく。</description><pubDate>Wed, 08 Jul 2020 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote class=&quot;admonition bdm-caution&quot;&gt;
&lt;span class=&quot;bdm-title&quot;&gt;CAUTION&lt;/span&gt;
&lt;p&gt;以下内容を実行した際車両の破損や車検不適合が発生した際当方は一切の責任を負いません&lt;br&gt;
あくまでも自己責任でお願いいたします。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;アウディにてVCDSを用いて電装系の動作のカスタマイズ(俗にコーディングというらしい)を行ったので、手順やカスタマイズできる内容などを紹介していく。&lt;/p&gt;
&lt;section&gt;&lt;h2 id=&quot;1-vcdsケーブルの準備&quot;&gt;1. VCDSケーブルの準備&lt;a class=&quot;anchor&quot; href=&quot;#1-vcdsケーブルの準備&quot;&gt;&lt;span class=&quot;anchor-icon&quot; data-pagefind-ignore=&quot;&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;ヤフオクや楽天などでVCDSと検索すればケーブルが出てきますのでそちらを購入すれば問題ありません。&lt;/p&gt;&lt;p&gt;バージョンなどが記載されていますが商品詳細ページに対応車種、年代などが書かれています大体新しめのものを買っておけば問題ありません。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2 id=&quot;2-pcの準備&quot;&gt;2. PCの準備&lt;a class=&quot;anchor&quot; href=&quot;#2-pcの準備&quot;&gt;&lt;span class=&quot;anchor-icon&quot; data-pagefind-ignore=&quot;&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;大体ディスクが付属していますのでディスク内にある内容など読んで適宜セットアップしてください。&lt;/p&gt;&lt;p&gt;VCDSのアプリケーションが起動できたら先にAuto-Scanからマップデータを取得して保存しておきます。復元用に利用できます。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2 id=&quot;3-設定リスト&quot;&gt;3. 設定リスト&lt;a class=&quot;anchor&quot; href=&quot;#3-設定リスト&quot;&gt;&lt;span class=&quot;anchor-icon&quot; data-pagefind-ignore=&quot;&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;各種カスタマイズするには、車両側OBD2とPC側にケーブルを指してSelect Control ModuleのSelectをクリックします。下記メニュー内での番号になります。車種によっては該当の項目が存在しない場合がありますその場合は別の項目にあるか対応していない可能性があります。&lt;br&gt;
A5B8用です&lt;/p&gt;&lt;div class=&quot;expressive-code&quot;&gt;&lt;figure class=&quot;frame&quot;&gt;&lt;figcaption class=&quot;header&quot;&gt;&lt;/figcaption&gt;&lt;pre data-language=&quot;text&quot; class=&quot;wrap&quot; style=&quot;--ecMaxLine:66ch&quot;&gt;&lt;code&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;- MMI再起動方法&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;前期 SETUP+ジョイコンの真ん中+右上のボタン同時押し&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;後期 MENU+ジョイコンの真ん中+右上のボタン同時押し&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;長押しはいらないです同時押しがちゃんと認識されてれば話した瞬間再起動します。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;- グリーンメニュー有効化&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;details class=&quot;ec-section github&quot;&gt;&lt;summary&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;expand&quot;&gt;&lt;/span&gt;&lt;span class=&quot;collapse&quot;&gt;&lt;/span&gt;&lt;span class=&quot;text&quot;&gt;11 collapsed lines&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/summary&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;MMI 2gの場合&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;[07-Bed.Paneel/Display]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;[Aanpassen-10]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;[Kanaal 08]  &apos;1&apos;を入力&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;前期: SETUP+CAR同時押し&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;後期: CAR+MENU同時押し&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;MMI 3gの場合&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;[5F-Informatie Electr.]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;[Aanpassen-10]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;[Kanaal 06]  &apos;1&apos;を入力&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;メニュー起動方法は同一&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/details&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;- クルコンの距離調整画面表示&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;details class=&quot;ec-section github&quot;&gt;&lt;summary&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;expand&quot;&gt;&lt;/span&gt;&lt;span class=&quot;collapse&quot;&gt;&lt;/span&gt;&lt;span class=&quot;text&quot;&gt;4 collapsed lines&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/summary&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;[13-Afstandsregeling]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;[Aanpassen-10]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;[Kanaal 07]  値を&apos;1&apos;に&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;MMIにてCAR-&gt;ACC内に表示されると思います。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/details&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;22&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;- パーキングアシスト解除速度設定&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;details class=&quot;ec-section github&quot;&gt;&lt;summary&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;expand&quot;&gt;&lt;/span&gt;&lt;span class=&quot;collapse&quot;&gt;&lt;/span&gt;&lt;span class=&quot;text&quot;&gt;4 collapsed lines&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/summary&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;23&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;[10-Parkeerhulp]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;24&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;[Aanpassen-10]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;25&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;前期  [Kanaal 23]  最大20km/h&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;26&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;後期  [Kanaal 233]  最大20km/h&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/details&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;27&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;- 停車中に内気循環切り替え(外付けではないがパーキングエアコンというらしい)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;details class=&quot;ec-section github&quot;&gt;&lt;summary&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;expand&quot;&gt;&lt;/span&gt;&lt;span class=&quot;collapse&quot;&gt;&lt;/span&gt;&lt;span class=&quot;text&quot;&gt;5 collapsed lines&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/summary&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;28&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;[08-Airco/Verwarming]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;29&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;[Hercoderen-07] longcoding&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;30&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;[Byte 01]  [Bit 4]  有効化&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;31&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;グリーンメニュー表示-&gt;&apos;Car&apos;-&gt;&apos;cardevicelist&apos;-&gt;&apos;Auxillary heating&apos; 有効化&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;32&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;グリーンメニュー表示-&gt;&apos;Car&apos;-&gt;&apos;carmenuoperations&apos;-&gt;&apos;Auxillary heating&apos;この項目を5に&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/details&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;33&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;- キーアンサーバック有効化&amp;#x26;MMI設定表示有効化(盗難防止装置付き車両のみ)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;details class=&quot;ec-section github&quot;&gt;&lt;summary&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;expand&quot;&gt;&lt;/span&gt;&lt;span class=&quot;collapse&quot;&gt;&lt;/span&gt;&lt;span class=&quot;text&quot;&gt;6 collapsed lines&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/summary&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;34&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;[46-Comfortsysteem]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;35&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;[Hercoderen-07] longcoding&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;36&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;[Byte 01]  [Bit 2]  有効化&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;37&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;[46-Comfortsysteem]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;38&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;[Aanpassen-10]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;39&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;[Kanaal 63]  初期値 40; 44で有効化&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/details&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;40&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;- 内部監視機能付き警報装置有効化(日本版だと標準装備ではないが後付けした場合)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;details class=&quot;ec-section github&quot;&gt;&lt;summary&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;expand&quot;&gt;&lt;/span&gt;&lt;span class=&quot;collapse&quot;&gt;&lt;/span&gt;&lt;span class=&quot;text&quot;&gt;8 collapsed lines&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/summary&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;41&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;[46-Comfortsysteem]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;42&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;[Hercoderen-07] longcoding&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;43&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;[Byte 01]  [Bit 1]  盗難防止装置有効化&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;44&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;[Byte 01]  [Bit 2]  ホーンでのアラーム有効化&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;45&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;[Byte 01]  [Bit 3]  傾斜計有効化&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;46&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;[Byte 01]  [Bit 4]  内部モニタ有効化&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;47&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;[Byte 01]  [Bit 5]  リアウィンドウセンサ有効化&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;48&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;[Byte 01]  [Bit 6]  アンチロッドモニタリング無線接点有効化&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/details&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;49&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;- アウトバーンライト有効化&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;details class=&quot;ec-section github&quot;&gt;&lt;summary&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;expand&quot;&gt;&lt;/span&gt;&lt;span class=&quot;collapse&quot;&gt;&lt;/span&gt;&lt;span class=&quot;text&quot;&gt;6 collapsed lines&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/summary&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;50&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;130km/hで点灯します日本での車検適合未確認&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;51&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;[09-Boordnet]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;52&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;[Hercoderen-07] longcoding&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;53&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;上のプルダウンから下記の様な表示のやつを選ぶ&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;54&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;&apos;2 -- xxx -- RLS&apos; (Rain and Light Sensor)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;55&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#e1e4e8&quot;&gt;[Byte 00]  [Bit 0]  有効化&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/details&gt;&lt;/code&gt;&lt;button class=&quot;copy-btn&quot; aria-label=&quot;コードをコピー&quot;&gt;&lt;div class=&quot;copy-btn-icon&quot;&gt;&lt;svg viewBox=&quot;0 0 24 24&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;copy-btn-icon copy-icon&quot;&gt;&lt;g fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-width=&quot;2&quot;&gt;&lt;rect width=&quot;14&quot; height=&quot;14&quot; x=&quot;8&quot; y=&quot;8&quot; rx=&quot;2&quot; ry=&quot;2&quot;&gt;&lt;/rect&gt;&lt;path d=&quot;M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;svg viewBox=&quot;0 0 24 24&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;copy-btn-icon success-icon&quot;&gt;&lt;path fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-width=&quot;2&quot; d=&quot;M20 6L9 17l-5-5&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;/button&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;</content:encoded></item><item><title>RDS+ECSで定期的にダンプをS3に保存してみる</title><link>https://doany.io/posts/rdsecsdump/</link><guid isPermaLink="true">https://doany.io/posts/rdsecsdump/</guid><description>RDS+ECSで定期的にダンプをS3に保存してみる</description><pubDate>Thu, 31 Oct 2019 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h2 id=&quot;概要&quot;&gt;概要&lt;a class=&quot;anchor&quot; href=&quot;#概要&quot;&gt;&lt;span class=&quot;anchor-icon&quot; data-pagefind-ignore=&quot;&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;AWS にて RDS の定期ダンプを取得したかったので ECS にある cron 的な機能を使ってダンプを定期取得する設定をしてみた&lt;br&gt;
ECS で動かす定期実行用のコンテナのイメージやタスクも管理を自動化してみた&lt;br&gt;
今回 postgres が対象です mysql 等は適宜 dockerfile を変更してください&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2 id=&quot;前提条件&quot;&gt;前提条件&lt;a class=&quot;anchor&quot; href=&quot;#前提条件&quot;&gt;&lt;span class=&quot;anchor-icon&quot; data-pagefind-ignore=&quot;&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;AWS のアカウント取得済み&lt;/li&gt;
&lt;li&gt;RDS 構築済み&lt;/li&gt;
&lt;li&gt;bitbucket のアカウント取得済み&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2 id=&quot;準備&quot;&gt;準備&lt;a class=&quot;anchor&quot; href=&quot;#準備&quot;&gt;&lt;span class=&quot;anchor-icon&quot; data-pagefind-ignore=&quot;&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3 id=&quot;iam-ユーザーの作成&quot;&gt;IAM ユーザーの作成&lt;a class=&quot;anchor&quot; href=&quot;#iam-ユーザーの作成&quot;&gt;&lt;span class=&quot;anchor-icon&quot; data-pagefind-ignore=&quot;&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;今回 bitbucket pipeline からのデプロイとダンプデータ S3 へのアップロード用にユーザーを作成する。&lt;br&gt;
通常はデプロイと S3 でユーザーを分けた方がいいのだが今回は管理コストの面で一つで作成します。&lt;/p&gt;&lt;p&gt;IAM を開き左メニューにあるユーザーを開くその後ユーザーの追加を開くと下記の様な画面になる&lt;br&gt;
ユーザー名を適宜入力,アクセスの種類をプログラムによるアクセスに制限&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;https://doany.io/static/images/blog/rdsecsdump0.webp&quot; alt=&quot;console.aws.amazon.com_iam_home_.png&quot; width=&quot;1280&quot; height=&quot;720&quot;&gt;&lt;/p&gt;&lt;p&gt;&lt;code&gt;AmazonECS_FullAccess&lt;/code&gt;, &lt;code&gt;AmazonEC2ContainerRegistryFullAccess&lt;/code&gt;, &lt;code&gt;AmazonS3FullAccess&lt;/code&gt;を選択(今回 CLI で同一ユーザーを使いたかったので広に権限取ってあります。わかる人は適宜絞ってください。)&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;https://doany.io/static/images/blog/rdsecsdump1.webp&quot; alt=&quot;console.aws.amazon.com_iam_home_ (1).png&quot; width=&quot;1280&quot; height=&quot;720&quot;&gt;&lt;/p&gt;&lt;p&gt;その後特に設定項目はないのでユーザーの作成まで進む&lt;br&gt;
最後にこのような画面が表示されるのでアクセスキー ID とシークレットアクセスキーをメモしておいてください。シークレットアクセスキーに関しては追加発行できますが二度と再表示できないので絶対にメモしておいてください。&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;https://doany.io/static/images/blog/rdsecsdump2.webp&quot; alt=&quot;console.aws.amazon.com_iam_home_ (2).png&quot; width=&quot;1280&quot; height=&quot;720&quot;&gt;&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3 id=&quot;iam-ロールの作成&quot;&gt;IAM ロールの作成&lt;a class=&quot;anchor&quot; href=&quot;#iam-ロールの作成&quot;&gt;&lt;span class=&quot;anchor-icon&quot; data-pagefind-ignore=&quot;&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;タスクを実行するためのロールだが自動で作られるものではあるのだが ECS を全く使っていない場合は作成されていないので手動で作成する。&lt;br&gt;
(&lt;code&gt;ecsTaskExecutionRole&lt;/code&gt;と最後に付くロールが既にある場合はその ARN をメモしておいてください)&lt;br&gt;
IAM を開き左メニューにあるロールを開くその後ロールの作成を開くと下記の様な画面になる&lt;br&gt;
&lt;code&gt;Elastic Container Service&lt;/code&gt;を選択次に&lt;code&gt;Elastic Container Service Task&lt;/code&gt;を選択次へ&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;https://doany.io/static/images/blog/rdsecsdump3.webp&quot; alt=&quot;console.aws.amazon.com_iam_home_region=ap-northeast-1 (1).png&quot; width=&quot;1280&quot; height=&quot;720&quot;&gt;&lt;/p&gt;&lt;p&gt;&lt;code&gt;AmazonECSTaskExecutionRolePolicy&lt;/code&gt;を選択その後特に設定項目はないのでロールの作成まで進む&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;https://doany.io/static/images/blog/rdsecsdump4.webp&quot; alt=&quot;console.aws.amazon.com_iam_home_region=ap-northeast-1 (2).png&quot; width=&quot;1280&quot; height=&quot;720&quot;&gt;&lt;/p&gt;&lt;p&gt;作成が完了したら元の画面に戻ってくるので先ほど作成したロールを開く下記画面の&lt;code&gt;ロール ARN&lt;/code&gt;をメモしておいてください。&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;https://doany.io/static/images/blog/rdsecsdump5.webp&quot; alt=&quot;console.aws.amazon.com_iam_home_region=ap-northeast-1 (4).png&quot; width=&quot;1280&quot; height=&quot;720&quot;&gt;&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3 id=&quot;バケットの作成&quot;&gt;バケットの作成&lt;a class=&quot;anchor&quot; href=&quot;#バケットの作成&quot;&gt;&lt;span class=&quot;anchor-icon&quot; data-pagefind-ignore=&quot;&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;特別設定する項目はありません。適宜設定の上作成しておいてください。&lt;br&gt;
その際作成した名前をメモしておいてください。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3 id=&quot;ecr-リポジトリの作成&quot;&gt;ECR リポジトリの作成&lt;a class=&quot;anchor&quot; href=&quot;#ecr-リポジトリの作成&quot;&gt;&lt;span class=&quot;anchor-icon&quot; data-pagefind-ignore=&quot;&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;こちらも特別設定する項目はありませんが、パイプラインでタグを上書きする関係上タグのイミュータビリティは無効化しておいてください(デフォルトで無効)&lt;br&gt;
作成した後 URI のカラムにある URL みたいなものをメモしておいてください。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3 id=&quot;bitbucket-でリポジトリの作成&quot;&gt;bitbucket でリポジトリの作成&lt;a class=&quot;anchor&quot; href=&quot;#bitbucket-でリポジトリの作成&quot;&gt;&lt;span class=&quot;anchor-icon&quot; data-pagefind-ignore=&quot;&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;いつも通りリポジトリを作成してください。&lt;br&gt;
ローカルで下記の通りファイルを作成してください。&lt;/p&gt;&lt;div class=&quot;expressive-code&quot;&gt;&lt;figure class=&quot;frame is-terminal&quot;&gt;&lt;figcaption class=&quot;header&quot;&gt;&lt;span class=&quot;title&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sr-only&quot;&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre data-language=&quot;shell&quot; class=&quot;wrap&quot; style=&quot;--ecMaxLine:26ch&quot;&gt;&lt;code&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#F97583&quot;&gt;~&lt;/span&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt;/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot; style=&quot;--ecIndent:1ch&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt; &lt;/span&gt;&lt;span style=&quot;--0:#B392F0&quot;&gt;├&lt;/span&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt; &lt;/span&gt;&lt;span style=&quot;--0:#9ECBFF&quot;&gt;.pgpass&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot; style=&quot;--ecIndent:1ch&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt; &lt;/span&gt;&lt;span style=&quot;--0:#B392F0&quot;&gt;├&lt;/span&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt; &lt;/span&gt;&lt;span style=&quot;--0:#9ECBFF&quot;&gt;bitbucket-pipelines.yml&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot; style=&quot;--ecIndent:1ch&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt; &lt;/span&gt;&lt;span style=&quot;--0:#B392F0&quot;&gt;├&lt;/span&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt; &lt;/span&gt;&lt;span style=&quot;--0:#9ECBFF&quot;&gt;Dockerfile&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot; style=&quot;--ecIndent:1ch&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt; &lt;/span&gt;&lt;span style=&quot;--0:#B392F0&quot;&gt;└&lt;/span&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt; &lt;/span&gt;&lt;span style=&quot;--0:#9ECBFF&quot;&gt;docker-entrypoint.sh&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;button class=&quot;copy-btn&quot; aria-label=&quot;コードをコピー&quot;&gt;&lt;div class=&quot;copy-btn-icon&quot;&gt;&lt;svg viewBox=&quot;0 0 24 24&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;copy-btn-icon copy-icon&quot;&gt;&lt;g fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-width=&quot;2&quot;&gt;&lt;rect width=&quot;14&quot; height=&quot;14&quot; x=&quot;8&quot; y=&quot;8&quot; rx=&quot;2&quot; ry=&quot;2&quot;&gt;&lt;/rect&gt;&lt;path d=&quot;M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;svg viewBox=&quot;0 0 24 24&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;copy-btn-icon success-icon&quot;&gt;&lt;path fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-width=&quot;2&quot; d=&quot;M20 6L9 17l-5-5&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;/button&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;.pgpass は postgres にパスワードを省略してアクセスするためのパスワードファイルですダ下記の通り記述してください。&lt;/p&gt;&lt;div class=&quot;expressive-code&quot;&gt;&lt;figure class=&quot;frame is-terminal&quot;&gt;&lt;figcaption class=&quot;header&quot;&gt;&lt;span class=&quot;title&quot;&gt;&lt;/span&gt;&lt;span class=&quot;sr-only&quot;&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre data-language=&quot;shell&quot; class=&quot;wrap&quot; style=&quot;--ecMaxLine:40ch&quot;&gt;&lt;code&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#B392F0&quot;&gt;hostname:port:database:username:password&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;button class=&quot;copy-btn&quot; aria-label=&quot;コードをコピー&quot;&gt;&lt;div class=&quot;copy-btn-icon&quot;&gt;&lt;svg viewBox=&quot;0 0 24 24&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;copy-btn-icon copy-icon&quot;&gt;&lt;g fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-width=&quot;2&quot;&gt;&lt;rect width=&quot;14&quot; height=&quot;14&quot; x=&quot;8&quot; y=&quot;8&quot; rx=&quot;2&quot; ry=&quot;2&quot;&gt;&lt;/rect&gt;&lt;path d=&quot;M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;svg viewBox=&quot;0 0 24 24&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;copy-btn-icon success-icon&quot;&gt;&lt;path fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-width=&quot;2&quot; d=&quot;M20 6L9 17l-5-5&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;/button&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;bitbucket-pipelines.yml は bitbucket のパイプラインの定義を記述するファイルです下記の通り記述してください。&lt;br&gt;
execution-role-arn のところに先ほどメモした&lt;code&gt;ロール ARN&lt;/code&gt;を記入してください。&lt;/p&gt;&lt;div class=&quot;expressive-code&quot;&gt;&lt;figure class=&quot;frame&quot;&gt;&lt;figcaption class=&quot;header&quot;&gt;&lt;/figcaption&gt;&lt;pre data-language=&quot;yml&quot; class=&quot;wrap&quot; style=&quot;--ecMaxLine:281ch&quot;&gt;&lt;code&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#99A0A6&quot;&gt;# enable Docker for your repository&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#85E89D&quot;&gt;options&lt;/span&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot; style=&quot;--ecIndent:2ch&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;  &lt;/span&gt;&lt;span style=&quot;--0:#85E89D&quot;&gt;docker&lt;/span&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--0:#79B8FF&quot;&gt;true&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#85E89D&quot;&gt;pipelines&lt;/span&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot; style=&quot;--ecIndent:2ch&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;  &lt;/span&gt;&lt;span style=&quot;--0:#85E89D&quot;&gt;default&lt;/span&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot; style=&quot;--ecIndent:4ch&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt;- &lt;/span&gt;&lt;span style=&quot;--0:#85E89D&quot;&gt;step&lt;/span&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot; style=&quot;--ecIndent:8ch&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;--0:#85E89D&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--0:#9ECBFF&quot;&gt;build-push&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot; style=&quot;--ecIndent:8ch&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;--0:#85E89D&quot;&gt;image&lt;/span&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--0:#9ECBFF&quot;&gt;atlassian/pipelines-awscli:latest&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot; style=&quot;--ecIndent:8ch&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;--0:#85E89D&quot;&gt;deployment&lt;/span&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--0:#9ECBFF&quot;&gt;test&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot; style=&quot;--ecIndent:8ch&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;--0:#85E89D&quot;&gt;caches&lt;/span&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot; style=&quot;--ecIndent:10ch&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt;- &lt;/span&gt;&lt;span style=&quot;--0:#9ECBFF&quot;&gt;docker&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot; style=&quot;--ecIndent:8ch&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;--0:#85E89D&quot;&gt;script&lt;/span&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot; style=&quot;--ecIndent:10ch&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;          &lt;/span&gt;&lt;span style=&quot;--0:#99A0A6&quot;&gt;# aws login&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot; style=&quot;--ecIndent:10ch&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt;- &lt;/span&gt;&lt;span style=&quot;--0:#9ECBFF&quot;&gt;aws ecr get-login-password --region ${AWS_DEFAULT_REGION} | docker login --username AWS --password-stdin ${AWS_REGISTRY_URL%%/*}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot; style=&quot;--ecIndent:10ch&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;          &lt;/span&gt;&lt;span style=&quot;--0:#99A0A6&quot;&gt;# docker&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot; style=&quot;--ecIndent:10ch&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt;- &lt;/span&gt;&lt;span style=&quot;--0:#9ECBFF&quot;&gt;export BUILD_ID=$BITBUCKET_BRANCH_$BITBUCKET_COMMIT_$BITBUCKET_BUILD_NUMBER&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot; style=&quot;--ecIndent:10ch&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt;- &lt;/span&gt;&lt;span style=&quot;--0:#9ECBFF&quot;&gt;docker build -t ${AWS_REGISTRY_URL}:$BUILD_ID -t ${AWS_REGISTRY_URL}:development .&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot; style=&quot;--ecIndent:10ch&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt;- &lt;/span&gt;&lt;span style=&quot;--0:#9ECBFF&quot;&gt;docker push ${AWS_REGISTRY_URL}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot; style=&quot;--ecIndent:4ch&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt;- &lt;/span&gt;&lt;span style=&quot;--0:#85E89D&quot;&gt;step&lt;/span&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot; style=&quot;--ecIndent:8ch&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;22&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;--0:#85E89D&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--0:#9ECBFF&quot;&gt;deploy&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot; style=&quot;--ecIndent:8ch&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;23&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;--0:#85E89D&quot;&gt;image&lt;/span&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--0:#9ECBFF&quot;&gt;atlassian/pipelines-awscli:latest&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot; style=&quot;--ecIndent:8ch&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;24&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;--0:#85E89D&quot;&gt;deployment&lt;/span&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--0:#9ECBFF&quot;&gt;production&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot; style=&quot;--ecIndent:8ch&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;25&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;--0:#85E89D&quot;&gt;script&lt;/span&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;details class=&quot;ec-section github&quot;&gt;&lt;summary&gt;&lt;div class=&quot;ec-line&quot; style=&quot;--ecIndent:10ch&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;expand&quot;&gt;&lt;/span&gt;&lt;span class=&quot;collapse&quot;&gt;&lt;/span&gt;&lt;span class=&quot;text&quot;&gt;9 collapsed lines&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/summary&gt;&lt;div class=&quot;ec-line&quot; style=&quot;--ecIndent:10ch&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;26&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt;- &lt;/span&gt;&lt;span style=&quot;--0:#9ECBFF&quot;&gt;export BUILD_ID=$BITBUCKET_BRANCH_$BITBUCKET_COMMIT_$BITBUCKET_BUILD_NUMBER&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot; style=&quot;--ecIndent:10ch&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;27&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt;- &lt;/span&gt;&lt;span style=&quot;--0:#9ECBFF&quot;&gt;export IMAGE_NAME=&quot;${AWS_REGISTRY_URL}:$BUILD_ID&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot; style=&quot;--ecIndent:10ch&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;28&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;          &lt;/span&gt;&lt;span style=&quot;--0:#99A0A6&quot;&gt;# ECS variables&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot; style=&quot;--ecIndent:10ch&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;29&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt;- &lt;/span&gt;&lt;span style=&quot;--0:#9ECBFF&quot;&gt;export ECS_CLUSTER_NAME=&quot;${BITBUCKET_REPO_OWNER}&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot; style=&quot;--ecIndent:10ch&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;30&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt;- &lt;/span&gt;&lt;span style=&quot;--0:#9ECBFF&quot;&gt;export ECS_SERVICE_NAME=&quot;${BITBUCKET_REPO_SLUG}&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot; style=&quot;--ecIndent:10ch&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;31&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt;- &lt;/span&gt;&lt;span style=&quot;--0:#9ECBFF&quot;&gt;export ECS_TASK_NAME=&quot;${BITBUCKET_REPO_SLUG}&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot; style=&quot;--ecIndent:10ch&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;32&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;          &lt;/span&gt;&lt;span style=&quot;--0:#99A0A6&quot;&gt;# Create ECS cluster, task, service&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot; style=&quot;--ecIndent:10ch&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;33&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt;- &lt;/span&gt;&lt;span style=&quot;--0:#9ECBFF&quot;&gt;aws ecs list-clusters | grep &quot;${ECS_CLUSTER_NAME}&quot; || aws ecs create-cluster --cluster-name &quot;${ECS_CLUSTER_NAME}&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot; style=&quot;--ecIndent:10ch&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;34&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;          &lt;/span&gt;&lt;span style=&quot;--0:#99A0A6&quot;&gt;# Updating the existing cluster, task, service&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/details&gt;&lt;div class=&quot;ec-line&quot; style=&quot;--ecIndent:10ch&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;35&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt;- &lt;/span&gt;&lt;span style=&quot;--0:#9ECBFF&quot;&gt;export TASK_VERSION=$(aws ecs register-task-definition&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot; style=&quot;--ecIndent:12ch&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;36&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;--0:#9ECBFF&quot;&gt;--family &quot;${ECS_TASK_NAME}&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot; style=&quot;--ecIndent:12ch&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;37&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;--0:#9ECBFF&quot;&gt;--execution-role-arn &quot;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;details class=&quot;ec-section github&quot;&gt;&lt;summary&gt;&lt;div class=&quot;ec-line&quot; style=&quot;--ecIndent:10ch&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;expand&quot;&gt;&lt;/span&gt;&lt;span class=&quot;collapse&quot;&gt;&lt;/span&gt;&lt;span class=&quot;text&quot;&gt;7 collapsed lines&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/summary&gt;&lt;div class=&quot;ec-line&quot; style=&quot;--ecIndent:12ch&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;38&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;--0:#9ECBFF&quot;&gt;--network-mode &quot;awsvpc&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot; style=&quot;--ecIndent:12ch&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;39&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;--0:#9ECBFF&quot;&gt;--requires-compatibilities &quot;FARGATE&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot; style=&quot;--ecIndent:12ch&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;40&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;--0:#9ECBFF&quot;&gt;--cpu &quot;256&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot; style=&quot;--ecIndent:12ch&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;41&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;--0:#9ECBFF&quot;&gt;--memory &quot;512&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot; style=&quot;--ecIndent:12ch&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;42&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;--0:#9ECBFF&quot;&gt;--container-definitions &quot;[{\&quot;name\&quot;:\&quot;${ECS_TASK_NAME}\&quot;,\&quot;image\&quot;:\&quot;${IMAGE_NAME}\&quot;,\&quot;logConfiguration\&quot;:{\&quot;logDriver\&quot;:\&quot;awslogs\&quot;,\&quot;options\&quot;:{\&quot;awslogs-group\&quot;:\&quot;/ecs\&quot;,\&quot;awslogs-region\&quot;:\&quot;${AWS_DEFAULT_REGION}\&quot;,\&quot;awslogs-stream-prefix\&quot;:\&quot;${ECS_TASK_NAME}\&quot;}}}]&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot; style=&quot;--ecIndent:12ch&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;43&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;--0:#F97583&quot;&gt;|&lt;/span&gt;&lt;span style=&quot;--0:#FDAEB7;--0fs:italic&quot;&gt; jq --raw-output &apos;.taskDefinition.revision&apos;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot; style=&quot;--ecIndent:10ch&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;44&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;&lt;span style=&quot;--0:#9ECBFF&quot;&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;--0:#9ECBFF&quot;&gt;- echo &quot;Registered ECS Task Definition:&quot; &quot;${TASK_VERSION}&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/details&gt;&lt;/code&gt;&lt;button class=&quot;copy-btn&quot; aria-label=&quot;コードをコピー&quot;&gt;&lt;div class=&quot;copy-btn-icon&quot;&gt;&lt;svg viewBox=&quot;0 0 24 24&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;copy-btn-icon copy-icon&quot;&gt;&lt;g fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-width=&quot;2&quot;&gt;&lt;rect width=&quot;14&quot; height=&quot;14&quot; x=&quot;8&quot; y=&quot;8&quot; rx=&quot;2&quot; ry=&quot;2&quot;&gt;&lt;/rect&gt;&lt;path d=&quot;M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;svg viewBox=&quot;0 0 24 24&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;copy-btn-icon success-icon&quot;&gt;&lt;path fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-width=&quot;2&quot; d=&quot;M20 6L9 17l-5-5&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;/button&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;blockquote class=&quot;admonition bdm-note&quot;&gt;
&lt;span class=&quot;bdm-title&quot;&gt;NOTE&lt;/span&gt;
&lt;p&gt;2026年10月追記 ログインに使っていた&lt;code&gt;aws ecr get-login&lt;/code&gt;はAWS CLI v2で削除されたので、&lt;code&gt;aws ecr get-login-password&lt;/code&gt;を&lt;code&gt;docker login&lt;/code&gt;に渡す形に書き換えました(v1でも1.17.10以降なら動きます)。&lt;a href=&quot;https://docs.aws.amazon.com/cli/latest/userguide/cliv2-migration-changes.html#cliv2-migration-ecr-get-login&quot;&gt;AWS CLI v2の変更点&lt;/a&gt;&lt;br&gt;
また&lt;code&gt;atlassian/pipelines-awscli&lt;/code&gt;イメージは非推奨になっていて、&lt;a href=&quot;https://hub.docker.com/r/amazon/aws-cli&quot;&gt;amazon/aws-cli&lt;/a&gt;への移行が案内されています。&lt;a href=&quot;https://hub.docker.com/r/atlassian/pipelines-awscli&quot;&gt;Docker Hub&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;Dockerfile は ECS でデプロイする用のコンテナ定義です下記の通り記述してください。&lt;br&gt;
補足がある箇所は先ほどメモしたものから適宜いれてください。&lt;/p&gt;&lt;div class=&quot;expressive-code&quot;&gt;&lt;figure class=&quot;frame&quot;&gt;&lt;figcaption class=&quot;header&quot;&gt;&lt;/figcaption&gt;&lt;pre data-language=&quot;dockerfile&quot; class=&quot;wrap&quot; style=&quot;--ecMaxLine:51ch&quot;&gt;&lt;code&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#F97583&quot;&gt;FROM&lt;/span&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt; alpine&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#F97583&quot;&gt;RUN&lt;/span&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt; apk --no-cache add postgresql-client aws-cli&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#F97583&quot;&gt;ENV&lt;/span&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt; AWS_DEFAULT_REGION ap-northeast-1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#F97583&quot;&gt;ENV&lt;/span&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt; AWS_ACCESS_KEY_ID {アクセスキーID}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#F97583&quot;&gt;ENV&lt;/span&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt; AWS_SECRET_ACCESS_KEY {シークレットアクセスキー}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#F97583&quot;&gt;RUN&lt;/span&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt; mkdir dump&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#F97583&quot;&gt;WORKDIR&lt;/span&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt; /root/dump&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#F97583&quot;&gt;ADD&lt;/span&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt; .pgpass /root/.pgpass&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#F97583&quot;&gt;RUN&lt;/span&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt; chmod 0600 /root/.pgpass&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#F97583&quot;&gt;ADD&lt;/span&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt; docker-entrypoint.sh /root/docker-entrypoint.sh&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#F97583&quot;&gt;RUN&lt;/span&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt; chmod +x /root/docker-entrypoint.sh&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#F97583&quot;&gt;CMD&lt;/span&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt; [&lt;/span&gt;&lt;span style=&quot;--0:#9ECBFF&quot;&gt;&quot;/root/docker-entrypoint.sh&quot;&lt;/span&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;button class=&quot;copy-btn&quot; aria-label=&quot;コードをコピー&quot;&gt;&lt;div class=&quot;copy-btn-icon&quot;&gt;&lt;svg viewBox=&quot;0 0 24 24&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;copy-btn-icon copy-icon&quot;&gt;&lt;g fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-width=&quot;2&quot;&gt;&lt;rect width=&quot;14&quot; height=&quot;14&quot; x=&quot;8&quot; y=&quot;8&quot; rx=&quot;2&quot; ry=&quot;2&quot;&gt;&lt;/rect&gt;&lt;path d=&quot;M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;svg viewBox=&quot;0 0 24 24&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;copy-btn-icon success-icon&quot;&gt;&lt;path fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-width=&quot;2&quot; d=&quot;M20 6L9 17l-5-5&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;/button&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;blockquote class=&quot;admonition bdm-note&quot;&gt;
&lt;span class=&quot;bdm-title&quot;&gt;NOTE&lt;/span&gt;
&lt;p&gt;2026年10月追記 最近のAlpineでは&lt;code&gt;pip3 install&lt;/code&gt;でシステムのPythonにパッケージを入れられない(externally-managed-environment で止まる)ので、AWS CLIはAlpineのパッケージ(&lt;a href=&quot;https://pkgs.alpinelinux.org/packages?name=aws-cli&quot;&gt;aws-cli&lt;/a&gt;)から入れる形に直しました。&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;docker-entrypoint.sh は docker 起動時に実行するコマンド群ですいわゆる cron の中身です。&lt;br&gt;
補足がある箇所は先ほどメモしたものから適宜いれてください。&lt;br&gt;
保存構成的には最初のプレフィックスが削除周期次に DB 名最後にファイルの接頭辞が今回はダンプの周期を入れています。&lt;/p&gt;&lt;div class=&quot;expressive-code&quot;&gt;&lt;figure class=&quot;frame&quot;&gt;&lt;figcaption class=&quot;header&quot;&gt;&lt;/figcaption&gt;&lt;pre data-language=&quot;shell&quot; class=&quot;wrap&quot; style=&quot;--ecMaxLine:92ch&quot;&gt;&lt;code&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#99A0A6&quot;&gt;#!/bin/sh&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#B392F0&quot;&gt;mkdir&lt;/span&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt; &lt;/span&gt;&lt;span style=&quot;--0:#79B8FF&quot;&gt;-p&lt;/span&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt; &lt;/span&gt;&lt;span style=&quot;--0:#9ECBFF&quot;&gt;yearly/{DB名}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#B392F0&quot;&gt;pg_dump&lt;/span&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt; &lt;/span&gt;&lt;span style=&quot;--0:#79B8FF&quot;&gt;-Fc&lt;/span&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt; &lt;/span&gt;&lt;span style=&quot;--0:#79B8FF&quot;&gt;-h&lt;/span&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt; &lt;/span&gt;&lt;span style=&quot;--0:#9ECBFF&quot;&gt;{DBのホスト}&lt;/span&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt; &lt;/span&gt;&lt;span style=&quot;--0:#79B8FF&quot;&gt;-U&lt;/span&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt; &lt;/span&gt;&lt;span style=&quot;--0:#9ECBFF&quot;&gt;{ユーザー}&lt;/span&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt; &lt;/span&gt;&lt;span style=&quot;--0:#9ECBFF&quot;&gt;{DB名}&lt;/span&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt; &lt;/span&gt;&lt;span style=&quot;--0:#F97583&quot;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt; &lt;/span&gt;&lt;span style=&quot;--0:#9ECBFF&quot;&gt;yearly/{DB名}/weekly-`&lt;/span&gt;&lt;span style=&quot;--0:#B392F0&quot;&gt;date&lt;/span&gt;&lt;span style=&quot;--0:#9ECBFF&quot;&gt; &quot;+%Y%m%d_%H%M%S&quot;`&lt;/span&gt;&lt;span style=&quot;--0:#B392F0&quot;&gt;.custom&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#B392F0&quot;&gt;aws&lt;/span&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt; &lt;/span&gt;&lt;span style=&quot;--0:#9ECBFF&quot;&gt;s3&lt;/span&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt; &lt;/span&gt;&lt;span style=&quot;--0:#9ECBFF&quot;&gt;sync&lt;/span&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt; &lt;/span&gt;&lt;span style=&quot;--0:#9ECBFF&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt; &lt;/span&gt;&lt;span style=&quot;--0:#9ECBFF&quot;&gt;s3://{S3のバケット}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;button class=&quot;copy-btn&quot; aria-label=&quot;コードをコピー&quot;&gt;&lt;div class=&quot;copy-btn-icon&quot;&gt;&lt;svg viewBox=&quot;0 0 24 24&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;copy-btn-icon copy-icon&quot;&gt;&lt;g fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-width=&quot;2&quot;&gt;&lt;rect width=&quot;14&quot; height=&quot;14&quot; x=&quot;8&quot; y=&quot;8&quot; rx=&quot;2&quot; ry=&quot;2&quot;&gt;&lt;/rect&gt;&lt;path d=&quot;M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;svg viewBox=&quot;0 0 24 24&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;copy-btn-icon success-icon&quot;&gt;&lt;path fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-width=&quot;2&quot; d=&quot;M20 6L9 17l-5-5&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;/button&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;準備が完了したらいつもの通り先ほど作成したリポジトリにプッシュしてください。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3 id=&quot;bitbucket-での-pipeline-の準備&quot;&gt;bitbucket での pipeline の準備&lt;a class=&quot;anchor&quot; href=&quot;#bitbucket-での-pipeline-の準備&quot;&gt;&lt;span class=&quot;anchor-icon&quot; data-pagefind-ignore=&quot;&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;先ほどプッシュしたリポジトリを bitbucket で開く&lt;br&gt;
設定-&gt;PIPELINES-&gt;Settings に進み&lt;code&gt;Enable Pipelines&lt;/code&gt;を有効にする&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;https://doany.io/static/images/blog/rdsecsdump6.webp&quot; alt=&quot;bitbucket.org_j-roi_dump_admin_addon_admin_pipelines_settings.png&quot; width=&quot;1280&quot; height=&quot;720&quot;&gt;&lt;/p&gt;&lt;p&gt;次に&lt;code&gt;Repository variables&lt;/code&gt;を開く&lt;br&gt;
下記の通り先ほどメモしたものから設定をする。&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;https://doany.io/static/images/blog/rdsecsdump7.webp&quot; alt=&quot;bitbucket.org_j-roi_dump_admin_addon_admin_pipelines_repository-variables.png&quot; width=&quot;1280&quot; height=&quot;720&quot;&gt;&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2 id=&quot;デプロイと-cron-の設定&quot;&gt;デプロイと cron の設定&lt;a class=&quot;anchor&quot; href=&quot;#デプロイと-cron-の設定&quot;&gt;&lt;span class=&quot;anchor-icon&quot; data-pagefind-ignore=&quot;&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3 id=&quot;デプロイの実行&quot;&gt;デプロイの実行&lt;a class=&quot;anchor&quot; href=&quot;#デプロイの実行&quot;&gt;&lt;span class=&quot;anchor-icon&quot; data-pagefind-ignore=&quot;&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;引き続き bitbucket の画面で再度メニューから&lt;code&gt;Pipelines&lt;/code&gt;を開く次に&lt;code&gt;Run pipeline&lt;/code&gt;をクリックし下記の通り選択して&lt;code&gt;Run&lt;/code&gt;をクリック&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;https://doany.io/static/images/blog/rdsecsdump8.webp&quot; alt=&quot;bitbucket.org_j-roi_dump_addon_pipelines_home.png&quot; width=&quot;1280&quot; height=&quot;720&quot;&gt;&lt;/p&gt;&lt;p&gt;完了すると下記の様になるのでパイプラインが完了するのを待つ&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;https://doany.io/static/images/blog/rdsecsdump9.webp&quot; alt=&quot;bitbucket.org_j-roi_dump_addon_pipelines_home (1).png&quot; width=&quot;1280&quot; height=&quot;720&quot;&gt;&lt;/p&gt;&lt;p&gt;次回以降ブランチに変更が入る度自動で実行されます。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3 id=&quot;aws-でスケジュールの作成&quot;&gt;AWS でスケジュールの作成&lt;a class=&quot;anchor&quot; href=&quot;#aws-でスケジュールの作成&quot;&gt;&lt;span class=&quot;anchor-icon&quot; data-pagefind-ignore=&quot;&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;AWS ECS 上でリポジトリオーナー名でクラスタが作成されているのでそのクラスタを開く(クラスタ名が書かれているところをクリックすると開きます)。&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;https://doany.io/static/images/blog/rdsecsdump10.webp&quot; alt=&quot;ap-northeast-1.console.aws.amazon.com_ecs_home_region=ap-northeast-1.png&quot; width=&quot;1280&quot; height=&quot;720&quot;&gt;&lt;/p&gt;&lt;p&gt;タスクのスケジューリングのタブを開き作成をクリック&lt;/p&gt;&lt;blockquote class=&quot;admonition bdm-note&quot;&gt;
&lt;span class=&quot;bdm-title&quot;&gt;NOTE&lt;/span&gt;
&lt;p&gt;2026年10月追記 現在のECSコンソールでは画面が変わっています。定期実行はAmazon EventBridge Schedulerでスケジュールを作り、ターゲットにECSの&lt;code&gt;RunTask&lt;/code&gt;を選ぶ形が案内されています。cron式もEventBridge Schedulerのものを使います。&lt;a href=&quot;https://docs.aws.amazon.com/AmazonECS/latest/developerguide/tasks-scheduled-eventbridge-scheduler.html&quot;&gt;Using Amazon EventBridge Scheduler to schedule Amazon ECS tasks&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;&lt;img src=&quot;https://doany.io/static/images/blog/rdsecsdump11.webp&quot; alt=&quot;ap-northeast-1.console.aws.amazon.com_ecs_home_region=ap-northeast-1 (1).png&quot; width=&quot;1280&quot; height=&quot;720&quot;&gt;&lt;/p&gt;&lt;p&gt;実行間隔等を設定しターゲットの部分は今回&lt;code&gt;FARGATE&lt;/code&gt;用にタスクを作成したので起動タイプを&lt;code&gt;FARGATE&lt;/code&gt;を選択タスク定義のファミリーはリポジトリ名と同名のタスクがあるのでそれを選択する。VPC とセキュリティグループは適宜設定してください。&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;https://doany.io/static/images/blog/rdsecsdump12.webp&quot; alt=&quot;ap-northeast-1.console.aws.amazon.com_ecs_home_region=ap-northeast-1 (2).png&quot; width=&quot;1263&quot; height=&quot;1747&quot;&gt;&lt;/p&gt;&lt;blockquote class=&quot;admonition bdm-note&quot;&gt;
&lt;span class=&quot;bdm-title&quot;&gt;NOTE&lt;/span&gt;
&lt;p&gt;Cron 式を選択したときに躓いたのだが busybox cron 等の cron 式とは違う模様下記を参考にいたしました。&lt;br&gt;
&lt;a href=&quot;https://qiita.com/da-sugi/items/ef3bb45a8a99a4acacb1&quot;&gt;AWS_Cron 式のワイルドカード&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>GUIを入れたubuntuでネットワークが繋がらない</title><link>https://doany.io/posts/guiubuntunet/</link><guid isPermaLink="true">https://doany.io/posts/guiubuntunet/</guid><description>GUIを入れたubuntuでネットワークが繋がらない</description><pubDate>Fri, 11 Jan 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;ubuntu等のlinuxにnetplanでipを固定設定をしていてその後にubuntu-desktopやnetworkmanager等のGUIを入れた際NetworkManagerの管理外となりネットワークが繋がらなかったりGUIから設定できなくなることがあるその際は&lt;code&gt;/etc/netplan/&lt;/code&gt;にyamlファイルを作成しNetworkManagerがnetplanを利用できるように設定を書き足せば良い下記の通り設定すれば動くと思われる。&lt;/p&gt;
&lt;div class=&quot;expressive-code&quot;&gt;&lt;figure class=&quot;frame&quot;&gt;&lt;figcaption class=&quot;header&quot;&gt;&lt;/figcaption&gt;&lt;pre data-language=&quot;yaml&quot; class=&quot;wrap&quot; style=&quot;--ecMaxLine:26ch&quot;&gt;&lt;code&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#85E89D&quot;&gt;network&lt;/span&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot; style=&quot;--ecIndent:2ch&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;  &lt;/span&gt;&lt;span style=&quot;--0:#85E89D&quot;&gt;version&lt;/span&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--0:#79B8FF&quot;&gt;2&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot; style=&quot;--ecIndent:2ch&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;  &lt;/span&gt;&lt;span style=&quot;--0:#85E89D&quot;&gt;renderer&lt;/span&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--0:#9ECBFF&quot;&gt;NetworkManager&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;button class=&quot;copy-btn&quot; aria-label=&quot;コードをコピー&quot;&gt;&lt;div class=&quot;copy-btn-icon&quot;&gt;&lt;svg viewBox=&quot;0 0 24 24&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;copy-btn-icon copy-icon&quot;&gt;&lt;g fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-width=&quot;2&quot;&gt;&lt;rect width=&quot;14&quot; height=&quot;14&quot; x=&quot;8&quot; y=&quot;8&quot; rx=&quot;2&quot; ry=&quot;2&quot;&gt;&lt;/rect&gt;&lt;path d=&quot;M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;svg viewBox=&quot;0 0 24 24&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;copy-btn-icon success-icon&quot;&gt;&lt;path fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-width=&quot;2&quot; d=&quot;M20 6L9 17l-5-5&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;/button&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;</content:encoded></item><item><title>hls.jsのレベル変更で躓いた件</title><link>https://doany.io/posts/hlsrate/</link><guid isPermaLink="true">https://doany.io/posts/hlsrate/</guid><description>hls.jsのレベル変更で躓いた件</description><pubDate>Tue, 18 Dec 2018 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h2 id=&quot;概要&quot;&gt;概要&lt;a class=&quot;anchor&quot; href=&quot;#概要&quot;&gt;&lt;span class=&quot;anchor-icon&quot; data-pagefind-ignore=&quot;&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;すごく稚拙の理由だがhls.jsでレベル変更機能(m3u8ファイルの切り替え)で躓いた。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2 id=&quot;躓いたとこ&quot;&gt;躓いたとこ&lt;a class=&quot;anchor&quot; href=&quot;#躓いたとこ&quot;&gt;&lt;span class=&quot;anchor-icon&quot; data-pagefind-ignore=&quot;&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;hls.jsにはhls.currentLevelというapiが用意されていてこちらの値を変更することでレベルの変更ができるようになっているのだがこちらにslectを変更した際にoptionの値を導入するという仕様で作成を試みたのだが-1を与えてると再生が止まる状況に陥ってしまった。&lt;/p&gt;&lt;div class=&quot;expressive-code&quot;&gt;&lt;figure class=&quot;frame&quot;&gt;&lt;figcaption class=&quot;header&quot;&gt;&lt;/figcaption&gt;&lt;pre data-language=&quot;js&quot; class=&quot;wrap&quot; style=&quot;--ecMaxLine:42ch&quot;&gt;&lt;code&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#B392F0&quot;&gt;$&lt;/span&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--0:#9ECBFF&quot;&gt;&apos;.res&gt;select&apos;&lt;/span&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt;).&lt;/span&gt;&lt;span style=&quot;--0:#B392F0&quot;&gt;on&lt;/span&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--0:#9ECBFF&quot;&gt;&apos;change&apos;&lt;/span&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;--0:#F97583&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt;() {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot; style=&quot;--ecIndent:4ch&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt;hls.currentLevel &lt;/span&gt;&lt;span style=&quot;--0:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt; &lt;/span&gt;&lt;span style=&quot;--0:#B392F0&quot;&gt;$&lt;/span&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--0:#79B8FF&quot;&gt;this&lt;/span&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt;).&lt;/span&gt;&lt;span style=&quot;--0:#B392F0&quot;&gt;val&lt;/span&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt;();&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt;});&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;button class=&quot;copy-btn&quot; aria-label=&quot;コードをコピー&quot;&gt;&lt;div class=&quot;copy-btn-icon&quot;&gt;&lt;svg viewBox=&quot;0 0 24 24&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;copy-btn-icon copy-icon&quot;&gt;&lt;g fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-width=&quot;2&quot;&gt;&lt;rect width=&quot;14&quot; height=&quot;14&quot; x=&quot;8&quot; y=&quot;8&quot; rx=&quot;2&quot; ry=&quot;2&quot;&gt;&lt;/rect&gt;&lt;path d=&quot;M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;svg viewBox=&quot;0 0 24 24&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;copy-btn-icon success-icon&quot;&gt;&lt;path fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-width=&quot;2&quot; d=&quot;M20 6L9 17l-5-5&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;/button&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;section&gt;&lt;h3 id=&quot;解決方法&quot;&gt;解決方法&lt;a class=&quot;anchor&quot; href=&quot;#解決方法&quot;&gt;&lt;span class=&quot;anchor-icon&quot; data-pagefind-ignore=&quot;&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;optionのvalueをNumberでキャストすれば治ります。&lt;/p&gt;&lt;div class=&quot;expressive-code&quot;&gt;&lt;figure class=&quot;frame&quot;&gt;&lt;figcaption class=&quot;header&quot;&gt;&lt;/figcaption&gt;&lt;pre data-language=&quot;js&quot; class=&quot;wrap&quot; style=&quot;--ecMaxLine:45ch&quot;&gt;&lt;code&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#B392F0&quot;&gt;$&lt;/span&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--0:#9ECBFF&quot;&gt;&apos;.res&gt;select&apos;&lt;/span&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt;).&lt;/span&gt;&lt;span style=&quot;--0:#B392F0&quot;&gt;on&lt;/span&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--0:#9ECBFF&quot;&gt;&apos;change&apos;&lt;/span&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;--0:#F97583&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt;() {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot; style=&quot;--ecIndent:4ch&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span class=&quot;indent&quot;&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt;hls.currentLevel &lt;/span&gt;&lt;span style=&quot;--0:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt; &lt;/span&gt;&lt;span style=&quot;--0:#B392F0&quot;&gt;Number&lt;/span&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--0:#B392F0&quot;&gt;$&lt;/span&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--0:#79B8FF&quot;&gt;this&lt;/span&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt;).&lt;/span&gt;&lt;span style=&quot;--0:#B392F0&quot;&gt;val&lt;/span&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt;());&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;ec-line&quot;&gt;&lt;div class=&quot;gutter&quot;&gt;&lt;div class=&quot;ln&quot; aria-hidden=&quot;true&quot;&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code&quot;&gt;&lt;span style=&quot;--0:#E1E4E8&quot;&gt;});&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;button class=&quot;copy-btn&quot; aria-label=&quot;コードをコピー&quot;&gt;&lt;div class=&quot;copy-btn-icon&quot;&gt;&lt;svg viewBox=&quot;0 0 24 24&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;copy-btn-icon copy-icon&quot;&gt;&lt;g fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-width=&quot;2&quot;&gt;&lt;rect width=&quot;14&quot; height=&quot;14&quot; x=&quot;8&quot; y=&quot;8&quot; rx=&quot;2&quot; ry=&quot;2&quot;&gt;&lt;/rect&gt;&lt;path d=&quot;M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;svg viewBox=&quot;0 0 24 24&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; class=&quot;copy-btn-icon success-icon&quot;&gt;&lt;path fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-width=&quot;2&quot; d=&quot;M20 6L9 17l-5-5&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;/button&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3 id=&quot;原因&quot;&gt;原因&lt;a class=&quot;anchor&quot; href=&quot;#原因&quot;&gt;&lt;span class=&quot;anchor-icon&quot; data-pagefind-ignore=&quot;&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;val()で取得した値は非明示的に文字になったり数字になったりする-がついた際に文字にキャストされさらにはhls.jsが内部で値チェック等を行っていなかったためエラーなどもでず再生できなくなったと思われる。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2 id=&quot;まとめ&quot;&gt;まとめ&lt;a class=&quot;anchor&quot; href=&quot;#まとめ&quot;&gt;&lt;span class=&quot;anchor-icon&quot; data-pagefind-ignore=&quot;&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;かなりレベルの低い内容だったが筆者のレベルが低いのか解決になかなか時間がかかったりする。日本語でこういった情報が溢れていてくれるとありがたい。&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>磁気ストライプの検証</title><link>https://doany.io/posts/mstripe/</link><guid isPermaLink="true">https://doany.io/posts/mstripe/</guid><description>磁気ストライプの検証</description><pubDate>Sun, 26 Aug 2018 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h2 id=&quot;磁気ストライプカードとは&quot;&gt;磁気ストライプカードとは&lt;a class=&quot;anchor&quot; href=&quot;#磁気ストライプカードとは&quot;&gt;&lt;span class=&quot;anchor-icon&quot; data-pagefind-ignore=&quot;&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;磁気ストライプカードとはwikipediaによると磁気ストライプカード（じきストライプカード、英: magnetic stripe card）は、磁性体の帯があるカードで、その中の鉄をベースとした小さな磁性粒子の磁性を変化させることでデータを格納できるもの。とありますが簡単に説明するとみなさんが持っているポイントカードやクレジットカードなどの磁性体を持ったカードのことを言います。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2 id=&quot;概要&quot;&gt;概要&lt;a class=&quot;anchor&quot; href=&quot;#概要&quot;&gt;&lt;span class=&quot;anchor-icon&quot; data-pagefind-ignore=&quot;&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;今回は磁気ストライプの基本的な仕様等の説明、簡単に仕様特定等に行った検証を掲載していく。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2 id=&quot;仕様&quot;&gt;仕様&lt;a class=&quot;anchor&quot; href=&quot;#仕様&quot;&gt;&lt;span class=&quot;anchor-icon&quot; data-pagefind-ignore=&quot;&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3 id=&quot;磁気ストライプ内データ&quot;&gt;磁気ストライプ内データ&lt;a class=&quot;anchor&quot; href=&quot;#磁気ストライプ内データ&quot;&gt;&lt;span class=&quot;anchor-icon&quot; data-pagefind-ignore=&quot;&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;まず磁気ストライプ内のデータだがMSR705と付属のソフトウェアを使用し内部データを読み取りネット上の情報等を参考にまとめた。ネット上の情報に関しては&lt;a href=&quot;https://en.wikipedia.org/wiki/Magnetic_stripe_card&quot;&gt;こちら&lt;/a&gt;を参考にした。&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;https://doany.io/static/images/blog/mstripe0.webp&quot; alt=&quot;スクリーンショット&quot; width=&quot;700&quot; height=&quot;566&quot;&gt;&lt;/p&gt;&lt;p&gt;上記が読み取ったデータであるサンプルにはアクティベートを行っていないおさいふポンタを使用した。クレジットカードはTrack1, Track2, Track3がありそれが縦に並ぶような形で配置されています。(※国内で発行されている殆どのクレジットカードはTrack3はありません)磁気ストライプ内の番号に関して上記を例に簡単に解説をつけると下記の通りです。&lt;br&gt;
Track1&lt;br&gt;
B(開始符号)3574001005472095(カード番号)^(区切り符号)MEMBER/OSAIFUPONTA(氏名)&lt;br&gt;
^(区切り符号)2110(有効期限)121(サービスコード)679(cvc1)&lt;/p&gt;&lt;p&gt;Track2&lt;br&gt;
3574001005472095(カード番号)=(区切り符号)2110(有効期限)121(サービスコード)679(cvc1)&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3 id=&quot;サービスコードについて&quot;&gt;サービスコードについて&lt;a class=&quot;anchor&quot; href=&quot;#サービスコードについて&quot;&gt;&lt;span class=&quot;anchor-icon&quot; data-pagefind-ignore=&quot;&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;先ほどの磁気ストライプ内のデータにあったサービスコードについて解説していくこのサービスコードとは決済端末側に要求しうる動作を決める為のもので数字によって下記の様な意味を持つ。&lt;br&gt;
1桁目&lt;br&gt;
1:国際ブランド&lt;br&gt;
2:国際ブランド&amp;#x26;ICチップ搭載&lt;br&gt;
5:国内ブランド&lt;br&gt;
6:国内ブランド&amp;#x26;ICチップ搭載&lt;br&gt;
7:プライベート用&lt;br&gt;
9:テスト用&lt;/p&gt;&lt;p&gt;2桁目&lt;br&gt;
0:決済機側で判断&lt;br&gt;
2:イシュアーに問い合わせる&lt;br&gt;
4:二国間協定を除いてイシュアーに問い合わせる&lt;/p&gt;&lt;p&gt;3桁目
0:制限なし&amp;#x26;PIN入力要求&lt;br&gt;
1:制限なし&lt;br&gt;
2:物品とサービスのみ&lt;br&gt;
3:ATMのみ&amp;#x26;PIN入力要求&lt;br&gt;
4:キャッシングのみ&lt;br&gt;
5:商品とサービスのみ&amp;#x26;PIN入力要求&lt;br&gt;
6:制限なし&amp;#x26;可能な場合はPIN入力要求&lt;br&gt;
7:物品とサービスのみ&amp;#x26;可能な場合はPIN入力要求&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2 id=&quot;検証&quot;&gt;検証&lt;a class=&quot;anchor&quot; href=&quot;#検証&quot;&gt;&lt;span class=&quot;anchor-icon&quot; data-pagefind-ignore=&quot;&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;カードの偽造可否や偽造カードの使用可否等の検証を行った。&lt;/p&gt;&lt;section&gt;&lt;h3 id=&quot;カードの偽造&quot;&gt;カードの偽造&lt;a class=&quot;anchor&quot; href=&quot;#カードの偽造&quot;&gt;&lt;span class=&quot;anchor-icon&quot; data-pagefind-ignore=&quot;&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;まず結論から言うと偽造は可能であるしかしカード番号や有効期限、CVC2を知っていても偽造は不可能である理由として先ほど説明したCVC1が不明であるためである実はクレジットカードは通常裏面等に記載があるものはCVC2でありこちらはEC決済等に用いられるが磁気ストライプ内のものは店頭決済用のCVC1となっておりこちらは乱数で推測が不可能であるため偽造は不可能である。ではどうやって偽造が可能かと言うと有名な手口ではあるが決済機等に付けるスキミング装置を用いる方法やまた悪意のある加盟店に直接磁気ストライプ内データが盗まれたりした際に偽造カードの作成は可能になってしまう磁気ストライプには書き換え不能な固有データ等が存在しないため磁気ストライプ内のデータを直接抑えられたら終わりなのである。&lt;br&gt;
対策等は近年日本でも増えてきているが決済操作のセルフ化と決済端末等を目視確認することだ。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3 id=&quot;偽造カードの使用&quot;&gt;偽造カードの使用&lt;a class=&quot;anchor&quot; href=&quot;#偽造カードの使用&quot;&gt;&lt;span class=&quot;anchor-icon&quot; data-pagefind-ignore=&quot;&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;こちらも結論から言うと使用可能であるしかし近年のIC対応で使用が難しくなっているのも事実であり理由としては先ほど説明したサービスコードだがこちらの1桁目が2か6である場合ICが要求されてしまい(要求しない決済機もあり)決済ができないまたこちらのサービスコードを書き換えて検証を行ったところ現在のクレジットカードインフラではイシュア側で少しでも違う番号等があると決済できない仕様となっており決済が不能だった。ここで余談だが本検証で分かったことなのだがTrack1にデータがない場合(磁気等を取り去った状態)決済できないがTrack1になんらかのカード情報があった場合決済できたのだがTrack1に如何なるカード情報を入れてもTrack2のカード情報により決済が行われた、また先ほどのサービスコードもTrack2のものが使用される仕様となっていた。&lt;br&gt;
対策としてはカードのIC搭載、決済機のIC対応だ。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2 id=&quot;まとめ&quot;&gt;まとめ&lt;a class=&quot;anchor&quot; href=&quot;#まとめ&quot;&gt;&lt;span class=&quot;anchor-icon&quot; data-pagefind-ignore=&quot;&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;以上の通り割と簡単に不正利用ができてしまうことが判明した特に日本国内の決済事情的にはかなり早急な対応が必要な状態だと思われる。&lt;/p&gt;&lt;blockquote class=&quot;admonition bdm-note&quot;&gt;
&lt;span class=&quot;bdm-title&quot;&gt;NOTE&lt;/span&gt;
&lt;p&gt;2026年10月追記 この記事の直前、2018年6月1日に改正割賦販売法が施行され、クレジットカードを取り扱う加盟店にはICカードで決済できる端末の設置が義務付けられています。磁気ストライプをスワイプするだけの端末は置き換えの対象です。&lt;a href=&quot;https://www.jcb.co.jp/merchant/release/kappu_security.html&quot;&gt;割賦販売法の改正に関するお知らせ|JCB&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;&lt;/section&gt;</content:encoded></item><item><title>クレジットカード番号の検証</title><link>https://doany.io/posts/number/</link><guid isPermaLink="true">https://doany.io/posts/number/</guid><description>クレジットカード番号の検証</description><pubDate>Fri, 27 Jul 2018 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h2 id=&quot;はじめに&quot;&gt;はじめに&lt;a class=&quot;anchor&quot; href=&quot;#はじめに&quot;&gt;&lt;span class=&quot;anchor-icon&quot; data-pagefind-ignore=&quot;&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;普段目にしているクレジットカードの番号ですがこれにも様々なルールやセキュリティ対策がなされています。今回はそれについて説明していきます。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2 id=&quot;番号の概要&quot;&gt;番号の概要&lt;a class=&quot;anchor&quot; href=&quot;#番号の概要&quot;&gt;&lt;span class=&quot;anchor-icon&quot; data-pagefind-ignore=&quot;&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;まずクレジットカード番号がどのように構成されているかですがクレジットカード番号はISO/IEC 7812にて策定されており、6桁のBIN（Bank Identification Number, 銀行識別番号）もしくはIIN（Issuer Identification Number, 発行者識別番号）+残りの番号はイシュアによって決定されます。&lt;/p&gt;&lt;blockquote class=&quot;admonition bdm-note&quot;&gt;
&lt;span class=&quot;bdm-title&quot;&gt;NOTE&lt;/span&gt;
&lt;p&gt;2026年10月追記 ISO/IEC 7812-1:2017の改訂でIINは8桁に拡張され、国際ブランドは2022年4月以降、新規には8桁のBINしか割り当てていません(既存の6桁のBINも引き続き使われています)。以下は6桁を前提にした話なので、8桁のBINが特定できる場合は未知の桁が2桁減る点に注意してください。&lt;a href=&quot;https://en.wikipedia.org/wiki/ISO/IEC_7812&quot;&gt;ISO/IEC 7812&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;&lt;section&gt;&lt;h3 id=&quot;biniinについて&quot;&gt;BIN、IINについて&lt;a class=&quot;anchor&quot; href=&quot;#biniinについて&quot;&gt;&lt;span class=&quot;anchor-icon&quot; data-pagefind-ignore=&quot;&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;BIN、IINもまた複数要素で構成されており最初の1桁はMII（Major industry identifier, 主要産業識別子）と呼ばれており、カードを使用する業界を示し対応表を下記のとおりです。&lt;/p&gt;
















































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;MII値&lt;/th&gt;&lt;th&gt;産業&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;ISO予約値&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;航空&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;航空 / その他将来発生する産業&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;旅行・娯楽/銀行・金融&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;銀行・金融&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;銀行・金融&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;運送 / 銀行・金融&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;7&lt;/td&gt;&lt;td&gt;石油 / その他将来発生する産業&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;8&lt;/td&gt;&lt;td&gt;ヘルスケア / 医療 / 通信 / その他将来発生する産業&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;9&lt;/td&gt;&lt;td&gt;国毎に割り当て可能&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;また以下は主な過去に存在していた若しくは現在存在するBINのリストです。&lt;/p&gt;


























































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;カードの種別&lt;/th&gt;&lt;th&gt;プレフィックス&lt;/th&gt;&lt;th&gt;番号長&lt;/th&gt;&lt;th&gt;検証&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;American Express&lt;/td&gt;&lt;td&gt;34, 37&lt;/td&gt;&lt;td&gt;15&lt;/td&gt;&lt;td&gt;Luhnアルゴリズム&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;中国銀聯 (China UnionPay)&lt;/td&gt;&lt;td&gt;622126-622925, 624-626, 6282-6288&lt;/td&gt;&lt;td&gt;16&lt;/td&gt;&lt;td&gt;なし&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Diners Club International&lt;/td&gt;&lt;td&gt;300-303574, 3095, 36, 38-39&lt;/td&gt;&lt;td&gt;14&lt;/td&gt;&lt;td&gt;Luhnアルゴリズム&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Discover Card&lt;/td&gt;&lt;td&gt;60110, 60112-60114, 601174-601179, 601186-601199, 644-649, 65&lt;/td&gt;&lt;td&gt;16&lt;/td&gt;&lt;td&gt;Luhnアルゴリズム&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;JCB&lt;/td&gt;&lt;td&gt;3528-3589&lt;/td&gt;&lt;td&gt;16&lt;/td&gt;&lt;td&gt;Luhnアルゴリズム&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;MasterCard&lt;/td&gt;&lt;td&gt;510000 - 559999, 222100 - 272099&lt;/td&gt;&lt;td&gt;16&lt;/td&gt;&lt;td&gt;Luhnアルゴリズム&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;UATP&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;15&lt;/td&gt;&lt;td&gt;不明&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Visa&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;13, 16&lt;/td&gt;&lt;td&gt;Luhnアルゴリズム&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2 id=&quot;チェックディジットに関して&quot;&gt;チェックディジットに関して&lt;a class=&quot;anchor&quot; href=&quot;#チェックディジットに関して&quot;&gt;&lt;span class=&quot;anchor-icon&quot; data-pagefind-ignore=&quot;&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;クレジットカード番号にはLuhnアルゴリズムが使用されており、主な目的として連番での発行をさせず、入力ミス等で他人のカードが決済されるのを防ぐためだと推測される。但しこれは計算可能な為悪意のある決済を防ぐ為のものではない。&lt;/p&gt;&lt;section&gt;&lt;h3 id=&quot;セキュリティ面での検証&quot;&gt;セキュリティ面での検証&lt;a class=&quot;anchor&quot; href=&quot;#セキュリティ面での検証&quot;&gt;&lt;span class=&quot;anchor-icon&quot; data-pagefind-ignore=&quot;&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;以上のルールを踏まえ当方が検証した内容を記述する。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3 id=&quot;検証概要&quot;&gt;検証概要&lt;a class=&quot;anchor&quot; href=&quot;#検証概要&quot;&gt;&lt;span class=&quot;anchor-icon&quot; data-pagefind-ignore=&quot;&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;近年ではApple Pay等でクレジットカード番号の下4桁が管理用に表示され尚且つApple Payの場合クレジットカードデザインからある程度イシュアが特定可能な為そこからクレジットカード番号が推測できないか検証してみた。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3 id=&quot;biniinの特定&quot;&gt;BIN,IINの特定&lt;a class=&quot;anchor&quot; href=&quot;#biniinの特定&quot;&gt;&lt;span class=&quot;anchor-icon&quot; data-pagefind-ignore=&quot;&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;まずカードデザインよりBINを特定してみる、BIN等は公にはされていないが以下サイト等で調べることができるがカード会社によっては途方もないBINの登録がありこの時点でカード番号を特定できるイシュアーが限られてくるが続きはBINが特定されたものとして進めていく&lt;a href=&quot;https://www.bincodes.com/bin-search/&quot;&gt;BIN search&lt;/a&gt;&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3 id=&quot;カード番号の特定&quot;&gt;カード番号の特定&lt;a class=&quot;anchor&quot; href=&quot;#カード番号の特定&quot;&gt;&lt;span class=&quot;anchor-icon&quot; data-pagefind-ignore=&quot;&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;BINが特定されたものとして話を進めていきます。この時点で6桁のBIN+下4桁が判明していることになります。ここで全てのLuhnアルゴリズムに当てはまる数字を算出してみました(今回は16桁で)下記サイトでチェックしましたがゆうに100件を超えており特定が不可能でした。&lt;a href=&quot;https://businer.com/discard_credit_card_generator.php&quot;&gt;credit card number generator&lt;/a&gt;&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2 id=&quot;まとめ&quot;&gt;まとめ&lt;a class=&quot;anchor&quot; href=&quot;#まとめ&quot;&gt;&lt;span class=&quot;anchor-icon&quot; data-pagefind-ignore=&quot;&quot;&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;以上の通りスクリーンショットやレシート画像等から番号特定は現実的にはほぼ不可能という結果になりましたまた近年ではセキュリティコードの必須化や3D secure導入等が進んでおり仮に割れたところで現実的には決済できる加盟店は存在しないでしょう。&lt;/p&gt;&lt;blockquote class=&quot;admonition bdm-note&quot;&gt;
&lt;span class=&quot;bdm-title&quot;&gt;NOTE&lt;/span&gt;
&lt;p&gt;2026年10月追記 クレジットカード・セキュリティガイドライン【5.0版】で、2025年3月末までに原則すべてのEC加盟店にEMV 3-Dセキュアの導入が求められることになりました。&lt;a href=&quot;https://www.jcb.co.jp/merchant/release/emv3-dsecure.html&quot;&gt;カード決済時の本人認証サービス(EMV 3-Dセキュア)導入のご案内|JCB&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;&lt;/section&gt;</content:encoded></item></channel></rss>