<?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>サイトを Astro + k3s で作り直した話</title><link>https://doany.io/posts/renewal/</link><guid isPermaLink="true">https://doany.io/posts/renewal/</guid><description>Next.js で動かしていたこのブログを Astro 製テーマ Fuwari に全面移行しました。ビルドから配信、コメント、購読まで、現在の構成をひととおり紹介します。</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;strong&gt;Fuwari&lt;/strong&gt; に全面移行しました。&lt;/p&gt;
&lt;p&gt;せっかくなので、現在の構成を最初から最後まで書いておきます。&lt;/p&gt;
&lt;p&gt;::github{repo=&quot;saicaca/fuwari&quot;}&lt;/p&gt;
&lt;h2&gt;全体像&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;記事 (Markdown)
  ↓ pnpm build
Astro → dist/ + Pagefind の検索インデックス
  ↓ docker build (multi-stage)
node:24-slim でビルド → caddy:2-alpine に dist/ だけ載せる
  ↓ GitHub Actions
ghcr.io へ push → k3s のマニフェストを自動で書き換えてコミット
  ↓ ArgoCD が Git を監視して同期
k3s + Traefik（Let&apos;s Encrypt / DNS-01）→ Cloudflare → 読者
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;サーバーサイドのアプリケーションは一切動いていません。&lt;strong&gt;配信されているのは完全に静的なファイルだけ&lt;/strong&gt;です。&lt;/p&gt;
&lt;h2&gt;ビルド&lt;/h2&gt;
&lt;p&gt;Astro なので出力は静的 HTML です。ページ遷移は Swup が担当していて、フルリロードなしで切り替わります。&lt;/p&gt;
&lt;p&gt;全文検索には &lt;strong&gt;Pagefind&lt;/strong&gt; を使っています。ビルド時に &lt;code&gt;dist/&lt;/code&gt; を走査してインデックスを作る方式で、検索用のサーバーが要りません。日本語もちゃんと引っかかります。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[!NOTE]
Pagefind は日本語のステミングには対応していないので、語形変化をまたいだ一致はしません。とはいえ個人ブログの検索としては十分実用的です。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;配信は Caddy&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;/p&gt;
&lt;p&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; から組み立てるため、&lt;strong&gt;TLS を前段のプロキシで終端していると &lt;code&gt;http://&lt;/code&gt; へ 301 してしまう&lt;/strong&gt;という古典的な罠があります。&lt;code&gt;absolute_redirect off;&lt;/code&gt; を書けば回避できますが、知らないと必ず踏みます。&lt;/p&gt;
&lt;p&gt;Caddy は相対リダイレクトを返すので、この問題が最初から存在しません。実際に確認するとこうなります。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ curl -sI https://doany.io/posts/truck | grep -i location
location: https://doany.io/posts/truck/
&lt;/code&gt;&lt;/pre&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;pre&gt;&lt;code&gt;@blogPost path_regexp blogPost ^/blog/(.+?)/?$
redir @blogPost /posts/{re.blogPost.1}/ permanent
&lt;/code&gt;&lt;/pre&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;h2&gt;デプロイは GitOps&lt;/h2&gt;
&lt;p&gt;ここが個人的に一番気に入っているところです。&lt;strong&gt;手元から &lt;code&gt;kubectl apply&lt;/code&gt; を叩くことは一切ありません。&lt;/strong&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;k3s/deployment.yaml&lt;/code&gt; のイメージタグをコミット SHA に書き換えて、リポジトリにコミットし返します。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;- name: Update deployment image tag
  run: |
    sed -i &quot;s#image: ${REGISTRY}/${IMAGE_NAME}:.*#image: ${REGISTRY}/${IMAGE_NAME}:${GITHUB_SHA}#&quot; k3s/deployment.yaml
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;そして k3s 側には &lt;strong&gt;ArgoCD&lt;/strong&gt; が常駐していて、このリポジトリを監視しています。マニフェストの変更を検知すると自動で同期し、新しいイメージの Pod に入れ替わります。&lt;/p&gt;
&lt;p&gt;つまり &lt;strong&gt;Git がそのままクラスタの状態&lt;/strong&gt;になっていて、リポジトリを見ればいま何が動いているか分かります。ロールバックしたければ &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;/p&gt;
&lt;p&gt;証明書は Traefik が Let&apos;s Encrypt から DNS-01 チャレンジで取得しています。前段には Cloudflare を挟んでいます。&lt;/p&gt;
&lt;h3&gt;シークレットも Git に置いてある&lt;/h3&gt;
&lt;p&gt;コメントシステムの署名鍵や管理パスワードといった秘密情報も、&lt;strong&gt;Sealed Secrets&lt;/strong&gt; で暗号化した状態で公開リポジトリにコミットしています。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ ./bootstrap/kubeseal.sh /tmp/secret.yaml k3s/remark42-secret.yaml
wrote k3s/remark42-secret.yaml
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;クラスタ内のコントローラが持つ秘密鍵でしか復号できないので、公開リポジトリに置いても問題ありません。おかげで「Git に全部ある」という状態を崩さずに済んでいます。&lt;/p&gt;
&lt;h2&gt;コメントは remark42 をセルフホスト&lt;/h2&gt;
&lt;p&gt;移行の直後は giscus（GitHub Discussions を使うやつ）を入れていたのですが、&lt;strong&gt;コメントするのに GitHub アカウントが要る&lt;/strong&gt;のがどうしても引っかかりました。&lt;/p&gt;
&lt;p&gt;そこで &lt;strong&gt;remark42&lt;/strong&gt; に載せ替えました。Go の単一バイナリで、ストレージも BoltDB のファイルなので別途データベースが要りません。&lt;code&gt;AUTH_ANON=true&lt;/code&gt; を入れるとアカウントなしで投稿できます。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;- name: AUTH_ANON
  value: &quot;true&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;k3s に PVC を持たせることになるので、その分だけステートレスではなくなりました。そこは素直にトレードオフです。&lt;/p&gt;
&lt;p&gt;読者は匿名のままでいい一方、荒らされたときに消す人間は要ります。そこで&lt;strong&gt;管理者だけ Entra ID でログインする&lt;/strong&gt;構成にしました。ArgoCD や他の内部サービスと同じアプリ登録を使い回しています。&lt;/p&gt;
&lt;p&gt;ここで少しハマりました。アプリ登録がシングルテナントだと、既定の &lt;code&gt;/common&lt;/code&gt; エンドポイントは使えません。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;AADSTS50194: Application is not configured as a multi-tenant application.
Usage of the /common endpoint is not supported for such applications.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;テナントを明示するオプションが必要なのですが、これは remark42 v1.16 以降でしか使えませんでした。アプリ登録をマルチテナント化すれば通るものの、その登録は他のサービスも共有しているので、認証範囲を広げるのは避けたい。結局 remark42 を上げて解決しました。&lt;/p&gt;
&lt;h2&gt;購読と支援&lt;/h2&gt;
&lt;p&gt;サイドバーに置いてあるやつです。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ko-fi&lt;/strong&gt; は、公式ウィジェットが外部スクリプトを読み込むので、ただのリンクとして実装しました。表示速度に影響せず、テーマのライト/ダークにもそのまま追従します。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Newsletter&lt;/strong&gt; は Buttondown を使っています。当初は RSS フィードを監視して自動配信してくれる機能を使うつもりだったのですが、これが&lt;strong&gt;月 $9 のアドオン&lt;/strong&gt;でした。年に数本しか書かないブログには少し重い。&lt;/p&gt;
&lt;p&gt;一方で &lt;strong&gt;API は無料プランでも叩けます&lt;/strong&gt;。やりたいことは「記事が増えたらメールを作る」だけなので、それなら自分で書けます。&lt;/p&gt;
&lt;p&gt;そこで記事を push したときに動くワークフローを足しました。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;- name: Collect newly added posts
  run: |
    # 追加 (A) されたファイルのみ。既存記事の修正では配信しない。
    FILES=$(git diff --name-only --diff-filter=A &quot;$BEFORE&quot; &quot;$SHA&quot; \
      -- &apos;src/content/posts/**.md&apos; | tr &apos;\n&apos; &apos; &apos;)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;--diff-filter=A&lt;/code&gt; で&lt;strong&gt;新規追加されたファイルだけ&lt;/strong&gt;に絞っているのが要点です。これがないと、誤字を直すたびに購読者へメールが飛びます。&lt;/p&gt;
&lt;p&gt;作られるのは下書きまでで、送信は Buttondown 側で内容を確認してから手動で押しています。慣れたら自動送信に切り替えるつもりですが、メールは取り消しが効かないので当面はこのままにします。&lt;/p&gt;
&lt;h2&gt;上流への追従&lt;/h2&gt;
&lt;p&gt;Fuwari はテーマとして使わせてもらっているので、本家の更新を取り込みたい。とはいえ毎回手で確認するのは続きません。&lt;/p&gt;
&lt;p&gt;そこで &lt;strong&gt;月に一度、上流を自動でチェックして PR を出す&lt;/strong&gt; ワークフローを入れました。マージが衝突なく通れば PR、衝突したら PR は作らず Issue で知らせる、という挙動にしてあります。&lt;/p&gt;
&lt;p&gt;これを成立させるために、Git の履歴も細工しています。このリポジトリと Fuwari には元々&lt;strong&gt;共通の祖先が1つもなかった&lt;/strong&gt;ので、そのままでは &lt;code&gt;git merge upstream/main&lt;/code&gt; が &quot;refusing to merge unrelated histories&quot; で弾かれます。そこで移行時に、&lt;strong&gt;Fuwari の全コミットの上に自分の変更を1コミット載せる&lt;/strong&gt;形へ履歴を作り直しました。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ git log --oneline -3
xxxxxxx feat: Next.js 版ブログの内容を Fuwari の上に移行
6d39b0d chore(deps): bump the patch-updates group ... (#681)
415fb97 chore(deps): bump the patch-updates group ... (#648)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;GitHub 上のフォーク表示にはなりませんが、フォークにしたかった目的（上流追従）はこれで達成できています。&lt;/p&gt;
&lt;h2&gt;おわりに&lt;/h2&gt;
&lt;p&gt;静的サイトなので落ちる要素がほとんどなく、記事を書いて push するだけで公開されます。コメントだけは自前で面倒を見ることになりましたが、そのぶん読者はアカウントなしで書き込めるようになりました。&lt;/p&gt;
&lt;p&gt;ソースコードは全部公開しています。&lt;/p&gt;
&lt;p&gt;::github{repo=&quot;DAnything/blog&quot;}&lt;/p&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;h2&gt;貨物登録とは&lt;/h2&gt;
&lt;p&gt;まず貨物登録とはなんぞやという話ですが、自動車検査証(車検証)に用途という項目があります。ここの項目を乗用から貨物に変更して適用される税区分を変更しようというものです。&lt;br /&gt;
詳細な税制度に関してはここでの説明は省きますが、今回貨物登録した車両では下記の通り税金が変わります。(旧の重量税, 自賠責は24ヶ月分を2で割っています。)&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;旧&lt;/th&gt;
&lt;th&gt;新&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;自動車税&lt;/td&gt;
&lt;td&gt;51,750&lt;/td&gt;
&lt;td&gt;8,800&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;重量税&lt;/td&gt;
&lt;td&gt;22,800&lt;/td&gt;
&lt;td&gt;8,200&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;自賠責&lt;/td&gt;
&lt;td&gt;8,825&lt;/td&gt;
&lt;td&gt;16,900&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;合計&lt;/td&gt;
&lt;td&gt;83,375&lt;/td&gt;
&lt;td&gt;33,900&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;差額&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;-49,475&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;上記の通りかなり安くなりますが、いくつかデメリットもあります。&lt;br /&gt;
大きなものだとETCの利用料金区分が普通から中型になり、料金があがります。ただこちらは年間差額5万円以上出るような使い方をしないかぎり問題はありません。もう一つが、車検が一年に一度になることです。こちらは年に一回検査手数料を払う費用が増えますが、たかだか2000円程度です。車検をディーラーやショップに預けている方もいるとおもいますが、日本車でしたらほとんどメンテナンスなんてしなくても車検はとおります。そもそもこの記事を読みに来ている時点で維持費を節約したい方だと思うので、維持費を抑えたいなら自分で整備道具を買ってネットで検索して車を維持するための最低限のメンテナンス方法ぐらいはぐぐりましょうそれができないならおとなしくディーラーの言いなりでお金を払いましょう。そのためのサービス料です。&lt;/p&gt;
&lt;h2&gt;貨物登録の流れ&lt;/h2&gt;
&lt;h3&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;h3&gt;仮ナンバーの取得&lt;/h3&gt;
&lt;p&gt;今回通した車ですが、購入時にすでに一時抹消されていたため仮ナンバーを借りにいきました。こちらがないと車両を車検や車検整備のために回送することができません。&lt;br /&gt;
仮ナンバーを借りるためには自賠責保険の加入が必要なのですが、今回購入した車がすでに自賠責が切れていたため商品自動車の契約で5日間だけ加入しました。&lt;br /&gt;
以前は抹消した状態の車種で1か月で自賠責が発行できたのですが、自賠責保険規制強化があったらしく現在は仮ナンバーを借りるという用途の場合商品自動車という形で5日間の契約しかできないようです。&lt;br /&gt;
また、自賠責代理店によっては商品自動車の契約の取り扱いが無い場合があります。陸運局事務所の敷地内や近くにある行政書士法人や、保険会社の支社などであれば確実に契約できます。カー用品店等では取り扱いがありませんでした。&lt;br /&gt;
自賠責に加入したら最寄りの市役所や仮ナンバーの貸し出しを行っている支所等に向かい仮ナンバーの貸し出し申請を行います。このとき最大貸し出し期間が5日なので上記の車庫証明の発行と後ほど記載する事前審査が完了してから借りに行くのをおすすめします。&lt;/p&gt;
&lt;h3&gt;貨物登録の為の改造&lt;/h3&gt;
&lt;h4&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;p&gt;※ 乗車設備とは2列目以降のことです運転席がある一列目は含みません&lt;/p&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;h4&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;h4&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;
まだ実現可能か未検証ですが、最大車両総重量が2090kg等どう頑張っても2トンを超えてしまう車両は一回2トン超えで登録し、座席の完全な撤去や内装部品の取り外しで重量を軽くした場合総重量2トン以下にできるのではないかと考えています。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;（1）自動車の最大積載量は、本章の規定に適合して安全な運行を確保し、及び公害を防止できる範囲内において積載することができるものとして、（2）から（11）までの基準に基づき算出される物品の積載量のうち最大のものとする。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;事前審査&lt;/h3&gt;
&lt;p&gt;2025年4月時点で規定が改正され、一部構造変更などで事前審査が不要になる旨が明確化されました。&lt;br /&gt;
今までの規定でも読み方によってはステーションワゴン-&amp;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;h4&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;のサイトでアカウントを作る ログイン-&amp;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;pre&gt;&lt;code&gt;乗車定員の変更（5人→3人）2列目右側座席固定  
用途変更（乗用→貨物）  
車体形状の変更（ステーションワゴン→バン）
&lt;/code&gt;&lt;/pre&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の事務所で重量分布計算書というものがもらえる場合がありますが、場所によって対応が異なる場合があるようです。ですので自動で計算するexcelを当方で作成いたしました。少しお値段すると思いますが、購入いただければ他の書類の記入方法に関してもお答えします。&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://doany.stores.jp/items/637b648f4292bf1b8c654cc7&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;サンプル入力済みのwordファイル&lt;a href=&quot;https://1drv.ms/w/s!AjrdNwEZ9ty_gdlusCl6qbSlUrqVew?e=hrTT2z&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;h3&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;h3&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;h2&gt;まとめ&lt;/h2&gt;
&lt;p&gt;行政手続きや政治、法律のプロではないのでブログの内容や私の考えに間違いなどあるかもしれませんが、その辺りどしどしコメント頂けると助かります。
今回節税するために貨物登録を行いましたが、そもそも現在の税制はあまり受益者負担になっていなのではないかと言うような疑問やNALTECや警察組織の思惑ばかりで本当に安全な交通社会に寄与できるような規制になっていないのではないかなどの疑問が私の場合は残りますが、その辺り皆さんはどう思われますでしょうか。&lt;/p&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;pre&gt;&lt;code&gt;./smartctl.exe -s security-unlock,&quot;longUserPasswordFromMelcoCalculator&quot; /dev/sdb
./smartctl.exe -s security-disable,&quot;longUserPasswordFromMelcoCalculator&quot; /dev/sdb
&lt;/code&gt;&lt;/pre&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;h2&gt;OSSとは&lt;/h2&gt;
&lt;p&gt;OSSとはワンストップサービスの略で国土交通省が提供しているインターネット上で移転登録などの自動車に関する登録事務手続きができるサービスです。&lt;/p&gt;
&lt;h2&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;h2&gt;実際の流れ&lt;/h2&gt;
&lt;p&gt;OSSを導入しているディーラーで購入した場合譲渡証明書等が電子登録されている場合がありますが、希有なケースな為今回は紙の委任状と譲渡証明書を受け取った場合で話をすすめます。&lt;/p&gt;
&lt;h3&gt;事前準備&lt;/h3&gt;
&lt;h4&gt;OSSブラウザアドオン&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;h4&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;h4&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;h4&gt;電子車検証読み取り&lt;/h4&gt;
&lt;p&gt;電子車検証を利用して入力を省略できます。&lt;br /&gt;
&lt;a href=&quot;https://apps.microsoft.com/detail/9PFXXK8VGX7N?rtc=1&amp;amp;hl=ja-jp&amp;amp;gl=JP&quot;&gt;車検証閲覧アプリ&lt;/a&gt;&lt;/p&gt;
&lt;h3&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;h3&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;h3&gt;移転登録&lt;/h3&gt;
&lt;p&gt;下記から移転登録の申請をします。&lt;br /&gt;
&lt;a href=&quot;https://www.oss.mlit.go.jp/secure/tetsuduki/principal/shinsei/kyodaku-iten/index.html#&quot;&gt;移転登録&lt;/a&gt;&lt;/p&gt;
&lt;ul&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;/ul&gt;
&lt;h3&gt;書類の提出&lt;/h3&gt;
&lt;p&gt;電子で申請すると言っても委任状と譲渡証明書は紙の原本の提出が必要です。&lt;br /&gt;
OSSでの申請完了後陸運局に行って提出する必要があります。&lt;br /&gt;
陸運局によって違うと思いますが、自分の行った習志野の場合はOSS専用の受付窓口がありそちらで提出しました。&lt;/p&gt;
&lt;h3&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;h3&gt;保管場所標章と自動車検査証の受け取り&lt;/h3&gt;
&lt;p&gt;検査登録手数料を納付した段階で保管場所標章の発行は完了しているので管轄の警察署に受け取りに行きます。&lt;br /&gt;
その後、陸運局に行き自動車検査証を受け取りに行きます。移転登録の際管轄する陸運局が変更になる場合ナンバープレートの変更が必要なので、車を持って行ってください。&lt;br /&gt;
上記の順番はどちらでもいいです先に自動車検査証を受け取りに行っても大丈夫です。&lt;/p&gt;
&lt;h2&gt;まとめ&lt;/h2&gt;
&lt;p&gt;上記が大まかな流れです。紙の書類に関しては陸運局に提出しなければならないため、あまりインターネットを用いてるメリットはないです。更には申請画面の選択項目も煩雑なため手続きにある程度詳しくないと使用するのは難しいと思います。既存の方法をそのままデジタル化しているためこのような仕様なのだと思いますが、個人的には辞めてほしいです。&lt;/p&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&gt;
&lt;p&gt;※以下内容を実行した際車両の破損や車検不適合が発生した際当方は一切の責任を負いません&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;↑あくまでも自己責任でお願いいたします。&lt;/p&gt;
&lt;p&gt;アウディにてVCDSを用いて電装系の動作のカスタマイズ(俗にコーディングというらしい)を行ったので、手順やカスタマイズできる内容などを紹介していく。&lt;/p&gt;
&lt;h2&gt;1. VCDSケーブルの準備&lt;/h2&gt;
&lt;p&gt;ヤフオクや楽天などでVCDSと検索すればケーブルが出てきますのでそちらを購入すれば問題ありません。&lt;/p&gt;
&lt;p&gt;バージョンなどが記載されていますが商品詳細ページに対応車種、年代などが書かれています大体新しめのものを買っておけば問題ありません。&lt;/p&gt;
&lt;h2&gt;2. PCの準備&lt;/h2&gt;
&lt;p&gt;大体ディスクが付属していますのでディスク内にある内容など読んで適宜セットアップしてください。&lt;/p&gt;
&lt;p&gt;VCDSのアプリケーションが起動できたら先にAuto-Scanからマップデータを取得して保存しておきます。復元用に利用できます。&lt;/p&gt;
&lt;h2&gt;3. 設定リスト&lt;/h2&gt;
&lt;p&gt;各種カスタマイズするには、車両側OBD2とPC側にケーブルを指してSelect Control ModuleのSelectをクリックします。下記メニュー内での番号になります。車種によっては該当の項目が存在しない場合がありますその場合は別の項目にあるか対応していない可能性があります。&lt;br /&gt;
A5B8用です&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;- MMI再起動方法
前期 SETUP+ジョイコンの真ん中+右上のボタン同時押し
後期 MENU+ジョイコンの真ん中+右上のボタン同時押し
長押しはいらないです同時押しがちゃんと認識されてれば話した瞬間再起動します。
- グリーンメニュー有効化
MMI 2gの場合
[07-Bed.Paneel/Display]
[Aanpassen-10]
[Kanaal 08]  &apos;1&apos;を入力
前期: SETUP+CAR同時押し
後期: CAR+MENU同時押し
MMI 3gの場合
[5F-Informatie Electr.]
[Aanpassen-10]
[Kanaal 06]  &apos;1&apos;を入力
メニュー起動方法は同一
- クルコンの距離調整画面表示
[13-Afstandsregeling]
[Aanpassen-10]
[Kanaal 07]  値を&apos;1&apos;に
MMIにてCAR-&amp;gt;ACC内に表示されると思います。
- パーキングアシスト解除速度設定
[10-Parkeerhulp]
[Aanpassen-10]
前期  [Kanaal 23]  最大20km/h
後期  [Kanaal 233]  最大20km/h
- 停車中に内気循環切り替え(外付けではないがパーキングエアコンというらしい)
[08-Airco/Verwarming]
[Hercoderen-07] longcoding
[Byte 01]  [Bit 4]  有効化
グリーンメニュー表示-&amp;gt;&apos;Car&apos;-&amp;gt;&apos;cardevicelist&apos;-&amp;gt;&apos;Auxillary heating&apos; 有効化
グリーンメニュー表示-&amp;gt;&apos;Car&apos;-&amp;gt;&apos;carmenuoperations&apos;-&amp;gt;&apos;Auxillary heating&apos;この項目を5に
- キーアンサーバック有効化&amp;amp;MMI設定表示有効化(盗難防止装置付き車両のみ)
[46-Comfortsysteem]
[Hercoderen-07] longcoding
[Byte 01]  [Bit 2]  有効化
[46-Comfortsysteem]
[Aanpassen-10]
[Kanaal 63]  初期値 40; 44で有効化
- 内部監視機能付き警報装置有効化(日本版だと標準装備ではないが後付けした場合)
[46-Comfortsysteem]
[Hercoderen-07] longcoding
[Byte 01]  [Bit 1]  盗難防止装置有効化
[Byte 01]  [Bit 2]  ホーンでのアラーム有効化
[Byte 01]  [Bit 3]  傾斜計有効化
[Byte 01]  [Bit 4]  内部モニタ有効化
[Byte 01]  [Bit 5]  リアウィンドウセンサ有効化
[Byte 01]  [Bit 6]  アンチロッドモニタリング無線接点有効化
- アウトバーンライト有効化
130km/hで点灯します日本での車検適合未確認
[09-Boordnet]
[Hercoderen-07] longcoding
上のプルダウンから下記の様な表示のやつを選ぶ
&apos;2 -- xxx -- RLS&apos; (Rain and Light Sensor)
[Byte 00]  [Bit 0]  有効化
&lt;/code&gt;&lt;/pre&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;h2&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;h2&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;h2&gt;準備&lt;/h2&gt;
&lt;h3&gt;IAM ユーザーの作成&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;/static/images/blog/rdsecsdump0.png&quot; alt=&quot;console.aws.amazon.com_iam_home_.png&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;/static/images/blog/rdsecsdump1.png&quot; alt=&quot;console.aws.amazon.com_iam_home_ (1).png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;その後特に設定項目はないのでユーザーの作成まで進む&lt;br /&gt;
最後にこのような画面が表示されるのでアクセスキー ID とシークレットアクセスキーをメモしておいてください。シークレットアクセスキーに関しては追加発行できますが二度と再表示できないので絶対にメモしておいてください。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/static/images/blog/rdsecsdump2.png&quot; alt=&quot;console.aws.amazon.com_iam_home_ (2).png&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;IAM ロールの作成&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;/static/images/blog/rdsecsdump3.png&quot; alt=&quot;console.aws.amazon.com_iam_home_region=ap-northeast-1 (1).png&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;/static/images/blog/rdsecsdump4.png&quot; alt=&quot;console.aws.amazon.com_iam_home_region=ap-northeast-1 (2).png&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;/static/images/blog/rdsecsdump5.png&quot; alt=&quot;console.aws.amazon.com_iam_home_region=ap-northeast-1 (4).png&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;バケットの作成&lt;/h3&gt;
&lt;p&gt;特別設定する項目はありません。適宜設定の上作成しておいてください。&lt;br /&gt;
その際作成した名前をメモしておいてください。&lt;/p&gt;
&lt;h3&gt;ECR リポジトリの作成&lt;/h3&gt;
&lt;p&gt;こちらも特別設定する項目はありませんが、パイプラインでタグを上書きする関係上タグのイミュータビリティは無効化しておいてください(デフォルトで無効)&lt;br /&gt;
作成した後 URI のカラムにある URL みたいなものをメモしておいてください。&lt;/p&gt;
&lt;h3&gt;bitbucket でリポジトリの作成&lt;/h3&gt;
&lt;p&gt;いつも通りリポジトリを作成してください。&lt;br /&gt;
ローカルで下記の通りファイルを作成してください。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;~/
 ├ .pgpass
 ├ bitbucket-pipelines.yml
 ├ Dockerfile
 └ docker-entrypoint.sh
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;.pgpass は postgres にパスワードを省略してアクセスするためのパスワードファイルですダ下記の通り記述してください。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;hostname:port:database:username:password
&lt;/code&gt;&lt;/pre&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;pre&gt;&lt;code&gt;# enable Docker for your repository
options:
  docker: true

pipelines:
  default:
    - step:
        name: build-push
        image: atlassian/pipelines-awscli:latest
        deployment: test
        caches:
          - docker
        script:
          # aws login
          - eval $(aws ecr get-login --no-include-email --region ${AWS_DEFAULT_REGION})
          # docker
          - export BUILD_ID=$BITBUCKET_BRANCH_$BITBUCKET_COMMIT_$BITBUCKET_BUILD_NUMBER
          - docker build -t ${AWS_REGISTRY_URL}:$BUILD_ID -t ${AWS_REGISTRY_URL}:development .
          - docker push ${AWS_REGISTRY_URL}

    - step:
        name: deploy
        image: atlassian/pipelines-awscli:latest
        deployment: production
        script:
          - export BUILD_ID=$BITBUCKET_BRANCH_$BITBUCKET_COMMIT_$BITBUCKET_BUILD_NUMBER
          - export IMAGE_NAME=&quot;${AWS_REGISTRY_URL}:$BUILD_ID&quot;
          # ECS variables
          - export ECS_CLUSTER_NAME=&quot;${BITBUCKET_REPO_OWNER}&quot;
          - export ECS_SERVICE_NAME=&quot;${BITBUCKET_REPO_SLUG}&quot;
          - export ECS_TASK_NAME=&quot;${BITBUCKET_REPO_SLUG}&quot;
          # Create ECS cluster, task, service
          - aws ecs list-clusters | grep &quot;${ECS_CLUSTER_NAME}&quot; || aws ecs create-cluster --cluster-name &quot;${ECS_CLUSTER_NAME}&quot;
          # Updating the existing cluster, task, service
          - export TASK_VERSION=$(aws ecs register-task-definition
            --family &quot;${ECS_TASK_NAME}&quot;
            --execution-role-arn &quot;&quot;
            --network-mode &quot;awsvpc&quot;
            --requires-compatibilities &quot;FARGATE&quot;
            --cpu &quot;256&quot;
            --memory &quot;512&quot;
            --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;
            | jq --raw-output &apos;.taskDefinition.revision&apos;)
          - echo &quot;Registered ECS Task Definition:&quot; &quot;${TASK_VERSION}&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Dockerfile は ECS でデプロイする用のコンテナ定義です下記の通り記述してください。&lt;br /&gt;
補足がある箇所は先ほどメモしたものから適宜いれてください。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;FROM alpine

RUN apk --no-cache add postgresql-client python3
RUN pip3 install awscli
ENV AWS_DEFAULT_REGION ap-northeast-1
ENV AWS_ACCESS_KEY_ID {アクセスキーID}
ENV AWS_SECRET_ACCESS_KEY {シークレットアクセスキー}
RUN mkdir dump
WORKDIR /root/dump
ADD .pgpass /root/.pgpass
RUN chmod 0600 /root/.pgpass
ADD docker-entrypoint.sh /root/docker-entrypoint.sh
RUN chmod +x /root/docker-entrypoint.sh

CMD [&quot;/root/docker-entrypoint.sh&quot;]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;docker-entrypoint.sh は docker 起動時に実行するコマンド群ですいわゆる cron の中身です。&lt;br /&gt;
補足がある箇所は先ほどメモしたものから適宜いれてください。&lt;br /&gt;
保存構成的には最初のプレフィックスが削除周期次に DB 名最後にファイルの接頭辞が今回はダンプの周期を入れています。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#!/bin/sh

mkdir -p yearly/{DB名}
pg_dump -Fc -h {DBのホスト} -U {ユーザー} {DB名} &amp;gt; yearly/{DB名}/weekly-`date &quot;+%Y%m%d_%H%M%S&quot;`.custom
aws s3 sync . s3://{S3のバケット}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;準備が完了したらいつもの通り先ほど作成したリポジトリにプッシュしてください。&lt;/p&gt;
&lt;h3&gt;bitbucket での pipeline の準備&lt;/h3&gt;
&lt;p&gt;先ほどプッシュしたリポジトリを bitbucket で開く&lt;br /&gt;
設定-&amp;gt;PIPELINES-&amp;gt;Settings に進み&lt;code&gt;Enable Pipelines&lt;/code&gt;を有効にする&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/static/images/blog/rdsecsdump6.png&quot; alt=&quot;bitbucket.org_j-roi_dump_admin_addon_admin_pipelines_settings.png&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;/static/images/blog/rdsecsdump7.png&quot; alt=&quot;bitbucket.org_j-roi_dump_admin_addon_admin_pipelines_repository-variables.png&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;デプロイと cron の設定&lt;/h2&gt;
&lt;h3&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;/static/images/blog/rdsecsdump8.png&quot; alt=&quot;bitbucket.org_j-roi_dump_addon_pipelines_home.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;完了すると下記の様になるのでパイプラインが完了するのを待つ&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/static/images/blog/rdsecsdump9.png&quot; alt=&quot;bitbucket.org_j-roi_dump_addon_pipelines_home (1).png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;次回以降ブランチに変更が入る度自動で実行されます。&lt;/p&gt;
&lt;h3&gt;AWS でスケジュールの作成&lt;/h3&gt;
&lt;p&gt;AWS ECS 上でリポジトリオーナー名でクラスタが作成されているのでそのクラスタを開く(クラスタ名が書かれているところをクリックすると開きます)。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/static/images/blog/rdsecsdump10.png&quot; alt=&quot;ap-northeast-1.console.aws.amazon.com_ecs_home_region=ap-northeast-1.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;タスクのスケジューリングのタブを開き作成をクリック&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/static/images/blog/rdsecsdump11.png&quot; alt=&quot;ap-northeast-1.console.aws.amazon.com_ecs_home_region=ap-northeast-1 (1).png&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;/static/images/blog/rdsecsdump12.png&quot; alt=&quot;ap-northeast-1.console.aws.amazon.com_ecs_home_region=ap-northeast-1 (2).png&quot; /&gt;&lt;/p&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;
</content:encoded></item><item><title>DooDでcronをコンテナで分離してみる&amp;swarm対応</title><link>https://doany.io/posts/doodcron/</link><guid isPermaLink="true">https://doany.io/posts/doodcron/</guid><description>DooDでcronをコンテナで分離してみる&amp;swarm対応</description><pubDate>Tue, 24 Sep 2019 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;概要&lt;/h2&gt;
&lt;p&gt;dockerで複数サービスを1サービス1コンテナで管理している際1コンテナ内それぞれにcronを常駐させるもしくはホスト側cronで動かすのは個人的に好ましくない(どう好ましくないかは長くなるし大体の人はわかると思うのでここでは割愛します)と思ったのでDooDを使ってcron用コンテナを作成して管理できるようにしてみた&lt;/p&gt;
&lt;h2&gt;構成&lt;/h2&gt;
&lt;p&gt;下記の様にファイルを配置すれば動く
ssmtpに関してはcron実行結果をメール送信する際sendmailコマンドを内部的に利用するのだがalpineではそもそもsmtpサーバーが内蔵されていないため外部のsmtpサーバーを指定できるようにするためのものです。例ではgmailのsmtpサーバーを利用します。
※cronファイルの権限をrootユーザーにしないと動きません&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;~/
 ├ cron/
 │ ├ root
 │ ├ ssmtp.conf
 │ └ Dockerfile
 └ docker-compose.yml
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;# docker-compose.yml
version: &apos;3.7&apos;
services:
  cron:
    build: cron
    restart: always # docker起動時に毎回自動起動
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock # ホストのdockerソケットをマウントすることでDooDを可能に
      - ./cron/root:/var/spool/cron/crontabs/root # busybox cronの初期設定ディレクトリ
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;# cron/Dockerfile
FROM alpine
# cronの実行時間が初期設定だと9hずれてしまうのでtimezoneを設定
RUN apk add --update --no-cache tzdata &amp;amp;&amp;amp; \
    cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime &amp;amp;&amp;amp; \
    apk del tzdata
# dockerのクライアントとssmtpをインストール
RUN apk add ssmtp docker-cli
# ssmtpのコンフィグを追加
ADD ssmtp.conf /etc/ssmtp/ssmtp.conf
# crondをフォアグラウンドで標準出力を使用して起動
CMD crond -f -d 8
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;# cron/root
# cron実行完了時に実行結果をメールするメアド
MAILTO=メアド
# docker execでコンテナ内でバッチを走らせる
00  10  *  *  3 docker exec -w /var/www/api/m docker_lb_1 php cu.php

# docker swarm用inspectコマンド等を使ってコンテナIDを特定してる
00  10  *  *  3 docker exec -w /var/www/api/m $(docker inspect --format &apos;{{ .Status.ContainerStatus.ContainerID }}&apos; $(docker service ps --filter &apos;desired-state=running&apos; main_lb -q)) php cu.php
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;# smtpサーバーホスト
mailhub=smtp.gmail.com:587
# gmailログイン用ユーザー名(大体メアド)
AuthUser=hoge@gmail.com
# gmailパスワード
AuthPass=password
# smtpサブミッション認証時にSTARTTLSを利用する(gmail等のSTARTLSサーバーでは必須)
UseSTARTTLS=YES
# メール送信時の送信元ホストを下記で書き換えるイメージ(dockerデフォルトだとコンテナIDが入ってしまうため大体迷惑メールとしてブロックされます)
hostname=gmail.com
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>ubuntuのlxdが仮想ブリッジからネットワークにつながらない</title><link>https://doany.io/posts/ubuntulxdnet/</link><guid isPermaLink="true">https://doany.io/posts/ubuntulxdnet/</guid><description>ubuntuのlxdが仮想ブリッジからネットワークにつながらない</description><pubDate>Fri, 20 Sep 2019 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;概要&lt;/h2&gt;
&lt;p&gt;ubuntuでlxdの環境を構築した際ネットワークにつながらないという事象が発生した。&lt;/p&gt;
&lt;h2&gt;構成情報&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;ubuntu18.04.3&lt;/li&gt;
&lt;li&gt;lxc,lxd3.17(snapバージョン)&lt;/li&gt;
&lt;li&gt;netplanにて仮想ブリッジを作成&lt;/li&gt;
&lt;li&gt;lxcコンテナにnetplanで作成したブリッジをアタッチした状態&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;解決策&lt;/h2&gt;
&lt;p&gt;どういった条件で引き起こされるかは不明だがubuntuのlxdがufwの書き換えでnatを設定しているためufwが無効化されているとコンテナ内部から適切にnat forwardされずに外部と疎通できなくなる。つまり下記コマンドで解消する&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo ufw enable
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;これでもつながらない場合は本来は個別にroutedを作成しなければいけないがめんどくさい場合は下記を実行してすべてのroutingを許可&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo ufw default allow routed
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>ZabbixのアラートをIFTTTで通知する</title><link>https://doany.io/posts/zabbixifttt/</link><guid isPermaLink="true">https://doany.io/posts/zabbixifttt/</guid><description>ZabbixのアラートをIFTTTで通知する</description><pubDate>Tue, 17 Sep 2019 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;概要&lt;/h2&gt;
&lt;p&gt;ちまたではPushbulletを使う方法やSlackを使う方法等が紹介されているがそもそもIFTTTアプリをスマホに入れており。履歴を記録する必要もなかったためIFTTTのプッシュ通知機能でアラートを受け取れるよう設定した。&lt;/p&gt;
&lt;h2&gt;前提条件&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Zabbixのバージョンは4
&lt;ul&gt;
&lt;li&gt;基本的には下記記事で構築した通りの環境&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;./dockerzabbix&quot;&gt;dockerでzabbixを導入してみる&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;設定を日本語に変更済み今回は日本語でのUIを使って解説する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;iOSもしくはandroid端末にIFTTTアプリを導入しプッシュ通知を許可済み&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;設定手順&lt;/h2&gt;
&lt;h3&gt;メディアの作成&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;管理&lt;/code&gt;-&amp;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;SUBJECT&lt;/code&gt;は二個要らないですミスで入れてしまいました。)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;/static/images/blog/zabbixifttt0.png&quot; alt=&quot;image.png&quot; /&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;(画像では登録済みのため更新と出ているが)追加をクリック&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;メディアの紐づけ&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;右上のユーザーアイコンをクリック&lt;/li&gt;
&lt;li&gt;&lt;code&gt;メディア&lt;/code&gt;-&amp;gt;追加をクリック&lt;/li&gt;
&lt;li&gt;&lt;code&gt;タイプ&lt;/code&gt;でpushを選択&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;h3&gt;IFTTTレシピの作成&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://ifttt.com/create&quot;&gt;レシピの作成&lt;/a&gt;を開く&lt;/li&gt;
&lt;li&gt;thisにwebhooksを設定(途中で&lt;code&gt;Event Name&lt;/code&gt;を聞かれますが後で使うので覚えておいてください)&lt;/li&gt;
&lt;li&gt;thatに&lt;code&gt;Notification&lt;/code&gt;の&lt;code&gt;Send a rich notification from the IFTTT app&lt;/code&gt;を設定&lt;/li&gt;
&lt;li&gt;下記の通り設定&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;/static/images/blog/zabbixifttt1.png&quot; alt=&quot;image.png&quot; /&gt;&lt;/p&gt;
&lt;h4&gt;プッシュ通知のテストとURLの取得&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://ifttt.com/maker_webhooks&quot;&gt;webhooks&lt;/a&gt;を開く&lt;/li&gt;
&lt;li&gt;右上の&lt;code&gt;Documentaition&lt;/code&gt;を開く&lt;/li&gt;
&lt;li&gt;イベントの箇所に先ほど作成したwebhookのイベント名&lt;code&gt;value1&lt;/code&gt;に適当な文言&lt;code&gt;value2&lt;/code&gt;に適当なURLを入れる&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Test It&lt;/code&gt;をクリック&lt;/li&gt;
&lt;li&gt;IFTTTアプリが入ってる端末にプッシュ通知が届きプッシュ通知を開いた際に&lt;code&gt;value2&lt;/code&gt;に入れたURLが開かれることを確認&lt;/li&gt;
&lt;li&gt;この時のテスト画面にあったURLをコピーしておいてください&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;scriptの設定&lt;/h3&gt;
&lt;p&gt;Monitoring Artistのdockbixのalertスクリプトのパスは&lt;a href=&quot;https://github.com/monitoringartist/dockbix-xxl&quot;&gt;この&lt;/a&gt;公式資料の&lt;code&gt;ZS_AlertScriptsPath&lt;/code&gt;にあるとおり&lt;code&gt;/usr/local/share/zabbix/alertscripts&lt;/code&gt;にあるzabbixの環境によってこのパスはことなると思うが、基本的にzabbixで設定されているalertscriptsディレクトリにスクリプトファイルを設置しないと呼び出されません。(永続化は別途設定必要)&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;alertscriptsディレクトリに&lt;code&gt;push.sh&lt;/code&gt;を作成下記の通り記述&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;※何故STDINを使って改行しているかというと&lt;code&gt;$1&lt;/code&gt;の中身が改行されていたため最初通知の発砲に失敗しており個の箇所を現在の様に修正したら治りました。よりよい解決放があればご教示願います。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#!/bin/sh
curl -X POST {先ほどのURL} -H &quot;Content-Type: application/json&quot;
-d @- &amp;lt;&amp;lt; EOF
{
  &quot;value1&quot;:&quot;${1}&quot;,
  &quot;value2&quot;:&quot;${2}&quot;
}
EOF
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;2.最後におまじないをして終わり&lt;code&gt;chmod +x push.sh&lt;/code&gt;(大体意味は分かると思うので説明は割愛)&lt;/p&gt;
&lt;h3&gt;プッシュ通知用にアクションをカスタマイズ(テスト中動かないかも)&lt;/h3&gt;
&lt;p&gt;IFTTTでURL用のパラメーターを設定したがそれをアクションの件名を使って引用しているので件名の欄をイベントURLに書き換えれば通知を開いた際アラートのイベント画面が開く(はず)&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;設定&lt;/code&gt;-&amp;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;実行内容&lt;/code&gt;,&lt;code&gt;復旧時の実行内容&lt;/code&gt;,&lt;code&gt;更新時の実行内容&lt;/code&gt;の&lt;code&gt;デフォルト件名&lt;/code&gt;を下記の様な形式に書き換え&lt;br /&gt;
&lt;code&gt;http://{zabbixホスト}/tr_events.php?triggerid={TRIGGER.ID}&amp;amp;eventid={EVENT.ID}&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;実行内容&lt;/code&gt;,&lt;code&gt;復旧時の実行内容&lt;/code&gt;,&lt;code&gt;更新時の実行内容&lt;/code&gt;の&lt;code&gt;実行内容&lt;/code&gt;のステップ1の&lt;code&gt;変更&lt;/code&gt;をクリック&lt;/li&gt;
&lt;li&gt;&lt;code&gt;次のメディアのみ使用&lt;/code&gt;の箇所を&lt;code&gt;push&lt;/code&gt;を選択&lt;/li&gt;
&lt;li&gt;&lt;code&gt;作成&lt;/code&gt;をクリック&lt;/li&gt;
&lt;/ol&gt;
</content:encoded></item><item><title>dockerでzabbixを導入してみる</title><link>https://doany.io/posts/dockerzabbix/</link><guid isPermaLink="true">https://doany.io/posts/dockerzabbix/</guid><description>dockerでzabbixを導入してみる</description><pubDate>Wed, 24 Apr 2019 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;概要&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;./bbdhdeploy&quot;&gt;前回の記事&lt;/a&gt;で紹介したウェブアプリデプロイ環境だが今回はここにzabbixを導入してみる。
最近ではdockerの死活環境を監視するにはdatadogやprometheus+etc.等での監視環境があるがdatadogはコンテナ監視機能が有料なのとprometheusはalertとalertのgrafanaへの反映等にとても作業手順が多いため最初からalertやdashboardの設定がされているzabbixを採用した。
基本的に前回の続きからとなるためパッケージの導入やディレクトリ構成等は上記記事を参照してください。&lt;/p&gt;
&lt;h2&gt;zabbixの導入&lt;/h2&gt;
&lt;p&gt;まず手元の環境がlxcなのでコンテナ内特権を許可するために以下を実行。コンテナ内特権はzabbix-agentコンテナで使用します。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;lxc config set {コンテナ名} security.privileged true
cat &amp;lt;&amp;lt;EOT | lxc config set {コンテナ名} raw.lxc -
lxc.cgroup.devices.allow = a
lxc.cap.drop =
EOT
lxc restart {コンテナ名}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;次にzabbix関連のコンテナを用意していきます今回はzabbix公式イメージではなくmonitoringartistのdocker向けのzabbixイメージを利用しますこちらを利用することでテンプレートの設定の手間等がほぼなしでセットアップができます。それでは前回作成したdocker-compose.ymlを下記の様に編集します。データベースのユーザ,パスワード等は適宜設定を変更してください。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;version: &apos;3&apos;
services:
  db:
    image: mysql
    ports:
      - &quot;3306:3306&quot;
    environment:
      MYSQL_ROOT_PASSWORD: &apos;0000&apos;

  laravel:
    image: yuim/laravel

  zabbixdb:
    image: monitoringartist/zabbix-db-mariadb
    restart: always
    environment:
      MARIADB_USER: &quot;zabbix&quot;
      MARIADB_PASS: &quot;zabbix&quot;
    volumes:
      - zabbixdb:/var/lib/mysql

  zabbixs:
    image: monitoringartist/dockbix-xxl
    restart: always
    environment:
      ZS_DBHost: &quot;zabbixdb&quot;
      ZS_DBUser: &quot;zabbix&quot;
      ZS_DBPassword: &quot;zabbix&quot;
      PHP_date_timezone: &quot;Asia/Tokyo&quot;

  zabbixa:
    image: monitoringartist/dockbix-agent-xxl-limited
    privileged: true
    restart: unless-stopped
    volumes:
      - /:/rootfs
      - /var/run:/var/run

volumes:
  zabbixdb:
    driver: local
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;次にzabbixのコンソールにアクセスできるようにvhosts.confを下記のように追記&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;server{
  listen 80;
  server_name {fqdn};
  location / {
    proxy_set_header Host $proxy_host;
    proxy_pass http://laravel;
  }
}
server{
  listen 80;
  server_name {fqdn};
  location / {
    proxy_set_header Host $proxy_host;
    proxy_pass http://zabbixs;
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;最後に下記コマンドを実行するとzabbixが立ち上がります。コマンド実行完了後30秒程度でアクセスできるようになります。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;docker-compose up -d
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;agentの設定&lt;/h2&gt;
&lt;p&gt;起動が完了したら早速コンソールにアクセスしてログインします初期ID/PWは&lt;code&gt;Admin/zabbix&lt;/code&gt;ですログインしたらメニューの&lt;code&gt;Configration&lt;/code&gt;-&amp;gt;&lt;code&gt;Hosts&lt;/code&gt;の順番でクリックし右上の&lt;code&gt;Create host&lt;/code&gt;をクリックします。下記の通り設定してください。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/static/images/blog/dockerzabbix0.png&quot; alt=&quot;Screenshot from 2019-04-24 22-05-01.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;次にTemplatesタブに移動して&lt;code&gt;Select&lt;/code&gt;をクリックし&lt;code&gt;Template App Docker - www.monitoringartist.com&lt;/code&gt;と&lt;code&gt;Template OS Linux&lt;/code&gt;を選択しSelectをクリックその後下の&lt;code&gt;Add&lt;/code&gt;をクリックしさらにその下にある&lt;code&gt;Add&lt;/code&gt;で登録します。初期設定で10分程度でコンテナが認識されるはずですコンテナの状況は&lt;code&gt;Monitoring&lt;/code&gt;-&amp;gt;&lt;code&gt;Latset data&lt;/code&gt;で確認できます。&lt;/p&gt;
&lt;h2&gt;alertの設定&lt;/h2&gt;
&lt;p&gt;そのままではdockerがstopした際等にalertをしてくれないのでプロトタイプにtriggerを設定していく。webの疎通確認のトリガーに関してはdockerだからといって特段変わった設定は要らないので今回は割愛します。プロトタイプのtrigger設定は先程の&lt;code&gt;Hosts&lt;/code&gt;の画面で先程作成したホストの&lt;code&gt;Discovery&lt;/code&gt;をクリック次に&lt;code&gt;Running containers&lt;/code&gt;と記載がある行の&lt;code&gt;Trigger prototypes&lt;/code&gt;をクリックその次に右上の&lt;code&gt;Create trigger prototype&lt;/code&gt;をクリックそうするとtrigger作成画面になるので下記のように入力し&lt;code&gt;Add&lt;/code&gt;をクリックし作成します。こちらも10分程度で反映されます。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/static/images/blog/dockerzabbix1.png&quot; alt=&quot;Screenshot from 2019-04-24 22-20-24.png&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;mail通知の設定&lt;/h2&gt;
&lt;p&gt;dockerの監視に関する設定は以上になるが、zabbixにはメール通知機能がついておりそちらも設定したので設定方法を紹介する。まず&lt;code&gt;Administration&lt;/code&gt;-&amp;gt;&lt;code&gt;Media types&lt;/code&gt;をクリック次にEmailをクリックgmailのsmtpsを利用する際は下記の様に設定します。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/static/images/blog/dockerzabbix2.png&quot; alt=&quot;Screenshot from 2019-04-24 22-32-18.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;次にメール送信先ユーザーを設定していきます。今回は初期アカウントであるAdminに設定します。まず&lt;code&gt;Administration&lt;/code&gt;-&amp;gt;&lt;code&gt;Users&lt;/code&gt;をクリック次に&lt;code&gt;Admin&lt;/code&gt;をクリック&lt;code&gt;Media&lt;/code&gt;タブを選択し&lt;code&gt;Add&lt;/code&gt;をクリック&lt;code&gt;Type&lt;/code&gt;で&lt;code&gt;Email&lt;/code&gt;を選択し&lt;code&gt;Send to&lt;/code&gt;に送信先を入力し&lt;code&gt;Add&lt;/code&gt;をクリック最後にその下の&lt;code&gt;Update&lt;/code&gt;をクリックして保存します。最後に&lt;code&gt;Configuration&lt;/code&gt;-&amp;gt;&lt;code&gt;Actions&lt;/code&gt;をクリックし&lt;code&gt;Disabled&lt;/code&gt;になっている箇所をクリックして&lt;code&gt;Enabled&lt;/code&gt;にします。以上でメール送信の設定は完了です。&lt;/p&gt;
</content:encoded></item><item><title>docker-hubを利用して簡易的なウェブアプリデプロイ環境を構築する</title><link>https://doany.io/posts/bbdhdeploy/</link><guid isPermaLink="true">https://doany.io/posts/bbdhdeploy/</guid><description>docker-hubを利用して簡易的なウェブアプリデプロイ環境を構築する</description><pubDate>Wed, 17 Apr 2019 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;docker-compose version3でのlinksの取り扱いが変更になっており今回の場合不要だったため削除(全然知りませんでした…)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;概要&lt;/h2&gt;
&lt;p&gt;bitbucketとdocker-hubを用いて自動ビルド&amp;amp;デプロイ環境を構築した&lt;/p&gt;
&lt;h2&gt;docker用インスタンスの作成&lt;/h2&gt;
&lt;p&gt;手元の環境ではlxcでサーバを管理していたため下記コマンドでlxcを立ち上げ&amp;amp;ip固定を行った。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;lxc launch ubuntu:18.04 docker
lxc network attach lxdbr0 docker eth0 eth0
lxc config device set docker eth0 ipv4.address &amp;lt;IPアドレス&amp;gt;
lxc stop docker
lxc config set docker security.nesting true #コンテナ内コンテナのセキュリティ許可
lxc start docker
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;またlxcデフォルトテンプレートだとsshでkey認証が必須なので下記コマンドでgithubに保存してあるpublic keyを設定した。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;curl https://github.com/{githubのアカウントid}.keys &amp;gt;&amp;gt; ~/.ssh/authorized_keys
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;docker用インスタンスの準備&lt;/h3&gt;
&lt;p&gt;下記コマンドでdocker-composeごとインストールします。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo apt update
sudo apt install docker-compose
sudo gpasswd -a $USER docker    #aptで入れると実行する現在のアカウントが権限不足で実行エラーやroot権限が必要となってしまうためインストール後にグループ設定を行う。
sudo systemctl restart docker
exit    #一旦セッションを消す
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;bitbucketリポジトリの作成&lt;/h2&gt;
&lt;p&gt;docker-hubで自動ビルドさせるリポジトリを作成していきます。今回はlaravelをデプロイする想定です。まず適当なディレクトリを作り下記の様なDockerfileとvhost.confを作成します。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;FROM centos

RUN yum install -y yum-utils epel-release
RUN yum-config-manager --enable rhui-REGION-rhel-server-extras rhui-REGION-rhel-server-optional
RUN rpm -Uvh http://rpms.remirepo.net/enterprise/remi-release-7.rpm
RUN yum install -y --enablerepo=remi --enablerepo=remi-php72 php-cli php-zts php-intl php-mbstring php-dom php-pdo php-mysql php-pgsql php-devel php-gd php-zip
RUN php -r &quot;copy(&apos;https://getcomposer.org/installer&apos;, &apos;composer-setup.php&apos;);&quot; \
 &amp;amp;&amp;amp; php -r &quot;if (hash_file(&apos;sha384&apos;, &apos;composer-setup.php&apos;) === &apos;48e3236262b34d30969dca3c37281b3b4bbe3221bda826ac6a9a62d6444cdb0dcd0615698a5cbe587c3f0fe57a54d8f5&apos;) { echo &apos;Installer verified&apos;; } else { echo &apos;Installer corrupt&apos;; unlink(&apos;composer-setup.php&apos;); } echo PHP_EOL;&quot; \
 &amp;amp;&amp;amp; php composer-setup.php \
 &amp;amp;&amp;amp; php -r &quot;unlink(&apos;composer-setup.php&apos;);&quot; \
  &amp;amp;&amp;amp; mv composer.phar /usr/local/bin/composer
RUN yum install -y python2-certbot-apache git httpd unzip
ADD ./vhost.conf /etc/httpd/conf.d/vhost.conf
ADD ./laravel /var/www/html
RUN chmod -R 777 /var/www/html

EXPOSE 80
EXPOSE 443

CMD httpd -DFOREGROUND
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;DocumentRoot /var/www/html/public
ServerName localhost
&amp;lt;Directory &quot;/var/www/html&quot;&amp;gt;
AllowOverride All
&amp;lt;/Directory&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;次にdockerfileを作成したディレクトリでlaravelプロジェクトを立ち上げます。下記の様なコマンドで立ち上げます。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cd {dockerfileを作成してディレクトリ}
sudo apt install composer php-zip
composer global require &quot;laravel/installer&quot;
PATH=$PATH:~/.config/composer/vendor/bin
export PATH #パスは必要に応じて永続化(.bashrcに記述)等してください
laravel new laravel
rm laravel/.gitignore #開発もdocker前提なのでignoreを消してしまいます。開発用サーバーを分離したい等あれば別途設定してください
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;これをdockerfileごとbitbucketにpushします。(bitbucketのリポジトリ作成方法は割愛します)&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git init
git add .
git commit -m &quot;first commit&quot;
git remote add origin {bitbucketリポジトリ}
git push -u origin HEAD
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;docker-hubの自動ビルド設定&lt;/h2&gt;
&lt;p&gt;次にdocker-hubでリポジトリを作成します。アカウント設定で先ほどbitbucketにpushしたアカウントをconnectしておきます。そうするとリポジトリ作成時に下記の様にリポジトリが出てくるので先ほどpushしたリポジトリを選択しcreate&amp;amp;buildをクリックします。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/static/images/blog/dhss.png&quot; alt=&quot;image.png&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;docker-composeでの運用&lt;/h2&gt;
&lt;p&gt;docker-hubのbuild画面にてsuccessが出ていたらbuild完了です。build完了を確認したらdockerを動かしたいインスタンスにて適当なディレクトリを作成し下記の様なdocker-compose.ymlとvhosts.confファイルを作成します。一様dbもdockerで用意していますが今回は設定方法や管理方法等は一旦割愛します。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;version: &apos;3&apos;
services:
  db:
    image: mysql
    ports:
      - &quot;3306:3306&quot;
    environment:
      MYSQL_ROOT_PASSWORD: &apos;0000&apos;

  proxy:
    image: nginx
    ports:
      - &quot;80:80&quot;
      - &quot;443:443&quot;

  laravel:
    image: {先ほど作成したdocker-hubのリポジトリ}
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;server{
  listen 80;
  server_name {FQDN};
  location / {
    proxy_set_header Host $proxy_host;
    proxy_pass http://laravel;
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;ファイルの作成が完了したらdocker-compose.ymlがあるディレクトリで下記コマンドでコンテナを追加。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;docker-compose up -d
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;サイトの開発&lt;/h2&gt;
&lt;p&gt;docker-composeを用いて本番環境とほぼ同一の環境の開発環境を構築する。先ほどのdocker-compose.ymlとvhosts.confをベースにローカル開発環境用にディレクトリを作成し下記ファイルを作成する。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;version: &apos;3&apos;
services:
  db:
    image: mysql
    ports:
      - &quot;3306:3306&quot;
    environment:
      MYSQL_ROOT_PASSWORD: &apos;0000&apos;

  proxy:
    image: nginx
    ports:
      - &quot;80:80&quot;
      - &quot;443:443&quot;
    volumes:
      - ./vhosts.conf:/etc/nginx/conf.d/default.conf

  laravel:
    build: ./laravel
    volumes:
      - ./laravel/laravel:/var/www/html
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;server{
  listen 80;
  server_name laravel.localhost;
  location / {
    proxy_set_header Host $proxy_host;
    proxy_pass http://laravel;
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;次にlaravelリポジトリをサブモジュールとして追加し新規リポジトリを作成しpush。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git init
git submodule add {先ほど作成したlaravelのリポジトリ} laravel
git add .
git commit -m &quot;first&quot;
git add remote origin {bitbucketの新規リポジトリ}
git push origin HEAD
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;開発環境の起動を行う基本的には本番インスタンスと同じで下記コマンドを実行し&lt;code&gt;laravel.localhost&lt;/code&gt;にアクセス&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;docker-compose up -d
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;バージョンの更新&lt;/h3&gt;
&lt;p&gt;基本的にdocker-hubで設定したブランチに変更が入ると自動でビルドが開始されるのでブランチに変更を行いdocker-hub上でビルドが完了したら下記コマンドを本番インスタンスでdocker-compose.ymlがある場所で実行するだけで本番環境へのデプロイが完了する。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;docker-compose pull
docker-compose up -d
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;まとめ&lt;/h2&gt;
&lt;p&gt;以上が個人的に利用しているごく簡単なデプロイ環境の一例です間違っている箇所やもっと効率的にCI/CD等と連携できる方法等あればご教授いただけると助かります。&lt;/p&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;pre&gt;&lt;code&gt;network:
  version: 2
  renderer: NetworkManager
&lt;/code&gt;&lt;/pre&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;h2&gt;概要&lt;/h2&gt;
&lt;p&gt;すごく稚拙の理由だがhls.jsでレベル変更機能(m3u8ファイルの切り替え)で躓いた。&lt;/p&gt;
&lt;h2&gt;躓いたとこ&lt;/h2&gt;
&lt;p&gt;hls.jsにはhls.currentLevelというapiが用意されていてこちらの値を変更することでレベルの変更ができるようになっているのだがこちらにslectを変更した際にoptionの値を導入するという仕様で作成を試みたのだが-1を与えてると再生が止まる状況に陥ってしまった。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$(&apos;.res&amp;gt;select&apos;).on(&apos;change&apos;, function() {
    hls.currentLevel = $(this).val();
});
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;解決方法&lt;/h3&gt;
&lt;p&gt;optionのvalueをNumberでキャストすれば治ります。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$(&apos;.res&amp;gt;select&apos;).on(&apos;change&apos;, function() {
    hls.currentLevel = Number($(this).val());
});
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;原因&lt;/h3&gt;
&lt;p&gt;val()で取得した値は非明示的に文字になったり数字になったりする-がついた際に文字にキャストされさらにはhls.jsが内部で値チェック等を行っていなかったためエラーなどもでず再生できなくなったと思われる。&lt;/p&gt;
&lt;h2&gt;まとめ&lt;/h2&gt;
&lt;p&gt;かなりレベルの低い内容だったが筆者のレベルが低いのか解決になかなか時間がかかったりする。日本語でこういった情報が溢れていてくれるとありがたい。&lt;/p&gt;
</content:encoded></item><item><title>EC-CUBE3系に簡単なAjax用エンドポイントを作成してみる</title><link>https://doany.io/posts/ec-ajax/</link><guid isPermaLink="true">https://doany.io/posts/ec-ajax/</guid><description>EC-CUBE3系に簡単なAjax用エンドポイントを作成してみる</description><pubDate>Mon, 03 Dec 2018 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;仕事の方でEC-CUBE3系を触る機会がありその際EC-CUBE3系にAjax用のエンドポイントを実装したので備忘録としてまとめてみた。&lt;/p&gt;
&lt;h2&gt;概要&lt;/h2&gt;
&lt;p&gt;EC-CUBE3系では標準でwebAPIが用意されているのだがそちらをSymfony内で有効化する方法や利用方法のドキュメントが皆無でありSymfony内で開発したほうが早いと思われたため自前で実装をした。&lt;/p&gt;
&lt;h2&gt;How to&lt;/h2&gt;
&lt;h3&gt;routeの設定&lt;/h3&gt;
&lt;p&gt;まずはじめにAPI用のrouteを定義する。今回は特にCRUIDを意識した実装内容でないためmatchで下記の通りとした。routeの定義場所についてはPlugin内が推奨Pluginの構築方法等は&lt;a href=&quot;https://note.mu/j_ukyo/n/n47bc02beb30a&quot;&gt;こちら&lt;/a&gt;を参考にさせていただいた。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$app-&amp;gt;match(&apos;/api&apos;, &apos;Plugin\Custom\Controller\ApiController::index&apos;)-&amp;gt;bind(&apos;api&apos;);
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;コントローラの実装&lt;/h3&gt;
&lt;p&gt;次にエンドポイントとなるコントローラの実装だがroute定義でおわかりの通りSymfonyのform builderは使用せずにCSRF対策を行うEC-CUBEの公式ドキュメント等に記載はないが$app内にcsrf_providerがあるのでそちらを利用する。今回はajaxで実装するため下記の通り実装した。動作自体は商品IDを受け取ったらをれをお気に入りに追加するというものだ簡易的なものなのでお気に入り追加済み等のチャックやtry等は実装していない。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;?php
    namespace Plugin\Custom\Controller;

    use Eccube\Application;
    use Symfony\Component\HttpFoundation\Request;
    use Symfony\Component\Security\Csrf\CsrfToken;
    use Symfony\Component\HttpFoundation\Response;

    class ApiController {
        public function index(Application $app, Request $request) {
            if($app[&apos;form.csrf_provider&apos;]-&amp;gt;isTokenValid(new CsrfToken(&apos;csrf&apos;, $request-&amp;gt;get(&apos;csrf&apos;)))) {
                $Customer = $app-&amp;gt;user();
                $Product = $app[&apos;eccube.repository.product&apos;]-&amp;gt;get($request-&amp;gt;get(&apos;id&apos;));
                $res = $app[&apos;eccube.repository.customer_favorite_product&apos;]-&amp;gt;addFavorite($Customer, $Product);
                return &apos;{&quot;success&quot;: &quot;success&quot;}&apos;;
            }
            return Response::create(&apos;&apos;, 400);
        }
    }
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;フロントの実装&lt;/h3&gt;
&lt;p&gt;次にフロントの実装だが今回はAjaxにjQueryを使用した。まずdefault_frame.twig等に下記の用にcsrf用のトークンを入れる。じつはcsrf_tokenが定義済みでtwig内で使用可能となっている()内のcsrfの部分はハッシュとなるためこちらの値が先程のコントローラのCsrfTokenインスタンス化時に指定した値と一致していなければならない本来はフォームを特定するためのものなのだがそこまでの対策でセキュリティの懸念には対して影響しないと思われたため今回はこのような実装とした。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;var csrf = &quot;{{ csrf_token(&apos;csrf&apos;) }}&quot;;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;ajax実行部分については下記の通り実装したidの箇所には商品IDが入る。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$.ajax({
    type: &apos;POST&apos;,
    url: &apos;/index_dev.php/api&apos;,
    data: &apos;csrf=&apos;+csrf+&apos;&amp;amp;id=&apos;+id,
    dataType: &apos;json&apos;
}).then(function(data) {
    console.log(data);
}, function(data) {
    console.log(data);
});
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;まとめ&lt;/h2&gt;
&lt;p&gt;かなり早足で簡単な実装方法を紹介したがあくまでこれは旧バージョンで半ば強制的に対応する方法なので特段理由がないのであればそうそうに3系のサポートを切り旧バージョンのFWを採用するようなEC-CUBEの利用はやめましょう。(筆者のおすすめはWooCommerceのほうがおすすめです)&lt;/p&gt;
</content:encoded></item><item><title>hhvm環境でlaravel5.7のプロジェクトを作成しようとしたら苦労した話</title><link>https://doany.io/posts/hhvmlaravel/</link><guid isPermaLink="true">https://doany.io/posts/hhvmlaravel/</guid><description>hhvm環境でlaravel5.7のプロジェクトを作成しようとしたら苦労した話</description><pubDate>Thu, 27 Sep 2018 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;hhvmでのphpのサポートが終了していますhhvmでのphpの利用は非推奨です。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;初めに&lt;/h2&gt;
&lt;p&gt;当方がhhvm環境でlaravel5.7を導入しようとした際の備忘録として導入の際に発生した問題、解決策を書いていく&lt;/p&gt;
&lt;h2&gt;composerの導入&lt;/h2&gt;
&lt;p&gt;自分は簡単なLaravelインストーラーを使用したのでまずLaravelインストーラーを導入するためにcomposerを導入しようとしたのだがその際下記の様なコマンドで導入しようとしたのだがインストール自体は完了するがapt自体がcomposerに必要なphp-commonやphp-cliを自動で同時にインストールされるためその際hhvmとphp-cliが競合してしまいcomposerコマンドが使い物にならなくなるなので解決策としては下記を参照&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo apt install composer
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://getcomposer.org/download/&quot;&gt;公式ページ&lt;/a&gt;にもあるがセットアップ用のスクリプトをダウンロードしてきてpharを作成しパスを通すこれでhhvm環境でも問題なく動くはずだこの際注意なのだが誤ってaptでcomposerを導入してしまった場合composerだけでなくphp-*等で特に理由がない限りはphp環境を削除しておくこと&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;php -r &quot;copy(&apos;https://getcomposer.org/installer&apos;, &apos;composer-setup.php&apos;);&quot;
php -r &quot;if (hash_file(&apos;SHA384&apos;, &apos;composer-setup.php&apos;) === &apos;93b54496392c062774670ac18b134c3b3a95e5a5e5c8f1a9f115f203b75bf9a129d5daa8ba6a13e2cc8a1da0806388a8&apos;) { echo &apos;Installer verified&apos;; } else { echo &apos;Installer corrupt&apos;; unlink(&apos;composer-setup.php&apos;); } echo PHP_EOL;&quot;
php composer-setup.php
php -r &quot;unlink(&apos;composer-setup.php&apos;);&quot;
mv composer.phar /usr/local/bin/composer
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;laravelインストーラーの導入&lt;/h2&gt;
&lt;p&gt;次にlaravelインストーラーを導入していくといっても下記のコマンドを実行してパスを通すだけどこちらでは特に問題は発生しなかった&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;composer global require &quot;laravel/installer=~1.1&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;上記コマンドを実行して&lt;code&gt;~/.composer/vendor/bin&lt;/code&gt;こちらにパスを通せば完了&lt;/p&gt;
&lt;h2&gt;phpenvの導入&lt;/h2&gt;
&lt;p&gt;ここでやっとプロジェクトの作成ができると思ったのだが何やらエラーが出てきて進めなくなりました。この時点では知らなかったのですlaravel5.7がphp7.1からサポートなのですがhhvmは最新安定板がphp7.0ベースなため動かないことが判明しました。解決策としてはphpenvを導入してcliのphpバージョンを切り替えるという方法です。下記コマンドを実行していきます。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git clone https://github.com/CHH/phpenv.git
cd phpenv/bin
./phpenv-install.sh
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;上記が完了したら下記を&lt;code&gt;.bashrc&lt;/code&gt;なりに記述します&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;export PATH=&quot;$HOME/.phpenv/bin:$PATH&quot;
eval &quot;$(phpenv init -)&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;そうしたら&lt;code&gt;source ~/.bashrc&lt;/code&gt;なりで.bashrcを読み込みなおして&lt;code&gt;phpenv&lt;/code&gt;コマンドが通っていればphpenvの導入は完了です。&lt;/p&gt;
&lt;h2&gt;phpenvでphpのビルド&lt;/h2&gt;
&lt;p&gt;次はphp7.1以上の環境をphpenvで導入していきます。下記コマンドでインストール可能リストがみれますので7.1以上のものをえらびます。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;phpenv install --list
phpenv install {インストールするバージョン、エディション}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;当方の環境ではライブラリが足りずビルドができなかったphpのビルドには様々なライブラリが必要なのだがaptでのパッケージ名で必要なライブラリの一覧等が見つけられなかったのでエラーに出てきたライブラリをインストールしてビルドしなおすという作業を繰り返しました。(ライブラリ一覧やもっと効率の良い方法があったら教えていただけると助かります)そしてビルドが完了したら下記コマンドでphpenvのバージョンを切り替えます。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;phpenv global {インストールしたバージョン、エディション}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;laravelプロジェクトの作成&lt;/h2&gt;
&lt;p&gt;laravelのプロジェクト自体はコマンドで作成できる。これで環境が構築できたと思うがphpenvの仮想環境はcliのみの設定となっているのでロードバランサー側のphp設定はhhvmのままだとエラーが出る可能性があるので別途設定がひつようだ。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;laravel new {プロジェクト名}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;まとめ&lt;/h2&gt;
&lt;p&gt;単純に当方の技術、能力不足な面が大きいが環境構築だけでかなりてこずってしまったこの記事が何かの解決につながれば幸いだ。&lt;/p&gt;
</content:encoded></item><item><title>PayPalのClient Integrationの簡易的な実装方法</title><link>https://doany.io/posts/paypalmeetup/</link><guid isPermaLink="true">https://doany.io/posts/paypalmeetup/</guid><description>PayPalのClient Integrationの簡易的な実装方法</description><pubDate>Wed, 26 Sep 2018 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://techplay.jp/event/690091&quot;&gt;PayPal Tech Meetup&lt;/a&gt;に行ってきてPayPalのClient Integrationについて色々お話が聞くことができたので決済後処理、決済フローのカスタマイズを除いて簡易的にボタンを作成する方法を紹介していく&lt;/p&gt;
&lt;h2&gt;1.スタイルの決定&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.paypal.com/demo/checkout/#/pattern/checkout&quot;&gt;Checkout Integration Patterns&lt;/a&gt;こちらでCheckoutボタンのテストができるのでこちらで確認しながらきめるとよいだろう下記がstyle関連で使用できるオプションです。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;locale: &apos;ja_JP&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;ボタン等に使用する言語使用可能な言語は&lt;a href=&quot;https://developer.paypal.com/docs/integration/direct/rest/locale-codes/#supported-locale-codes&quot;&gt;こちら&lt;/a&gt;を参照&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;style: {
    size: &apos;small&apos;,
    color: &apos;gold&apos;,
    shape: &apos;pill&apos;,
    label: &apos;checkout&apos;,
    tagline: &apos;true&apos;,
    layout: &apos;vertical&apos;,
    fundingicons: &apos;true&apos;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;ボタンのデザインに関するオプション&lt;a href=&quot;https://developer.paypal.com/docs/checkout/how-to/customize-button/#button-styles&quot;&gt;こちら&lt;/a&gt;から使用できるオプションを確認できます。&lt;br /&gt;
またfundingだが日本だったら特にカスタマイズは要らないはずですチェックアウトボタンでのクレジットカード決済は有効になっているのでfundingiconsをtrueにしていただくか、layoutをverticalにしていただければアクセプタンスマークが表示されるはずですのでそちらからクレジットカード決済が可能になります。&lt;/p&gt;
&lt;h2&gt;2.ボタンの実装&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.paypal.com/developer/applications/&quot;&gt;こちら&lt;/a&gt;でREST API appsのCreate Appフロー通り情報を入力してAppを作成してください、作成が完了したらappのページを開きClient IDをどこかにメモしておいてくださいこれがSandbox(テスト)のIDになります次に右上のLiveをクリックしてください違うClient IDが表示されるのでこちらもメモしておいてくださいこれがLive(本番)のIDになります&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;script src=&quot;https://www.paypalobjects.com/api/checkout.js&quot;&amp;gt;&amp;lt;/script&amp;gt;&amp;lt;!--checkout.min.jsにするとminify版になります--&amp;gt;
&amp;lt;div id=&quot;paypal-button-container&quot;&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;!--DOMで操作したいエレメント簡単に言うとボタンの設置場所--&amp;gt;
&amp;lt;script&amp;gt;
    paypal.Button.render({
        env: &apos;sandbox&apos;, //snadbox(テスト)かproduction(本番)か
        locale: &apos;ja_JP&apos; //言語設定
        style: {
            //ここに先ほど決定したデザインを入れる
        },
        client: {
            sandbox: &apos;&apos;, //先ほどメモしたsandboxのClient IDを入れる
            production: &apos;&apos; //先ほどメモしたLiveのClient IDを入れる
        },
        payment: function(data, actions) {
            return actions.payment.create({
                payment: {
                    transactions: [
                        {
                            amount: {total: &apos;1000&apos;, currency: &apos;JPY&apos;}
                        }
                    ]
                }
            });
        }, //商品内容や買い手へのメッセージ等の設定ができるこちらを参照https://developer.paypal.com/docs/checkout/integrate/#2-set-up-a-payment
            //また配送情報の削除等も可能こちらを参照https://developer.paypal.com/docs/checkout/how-to/customize-flow/#pass-web-experience-profile-options
        onAuthorize: function(data, actions) {
            return actions.payment.execute().then(function() {
                window.alert(&apos;Payment Complete!&apos;);
            });
        } //決済時のhookアクション等の設定ができる見本は決済完了時こちらを参照https://developer.paypal.com/docs/checkout/how-to/customize-flow/#show-a-confirmation-page
    }, &apos;#paypal-button-container&apos;);//ボタンをレンダリングするエレメントのセレクタが引数
&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;3.決済テスト&lt;/h2&gt;
&lt;p&gt;テスト用アカウントをログインできるようにする必要がある&lt;a href=&quot;https://developer.paypal.com/developer/accounts/&quot;&gt;こちら&lt;/a&gt;を開きアカウントをクリックしたらprofileをクリックそうするとモーダルが開くのでChange passwordをクリック任意のパスワード入力後saveをクリックこれを2アカウントあるはずなので両方行う次にチェックアウトボタンをテスト用のページなりで使用できるようにするコードが問題なければボタンが表示されるはずなのでクリックするenvの値がsandboxの場合sandboxの決済画面が開くので先ほどのアカウント一覧の画面のPERSONALと書かれている方でログインする、そうすれば決済ができるはずです。次にテスト用のアカウントで決済の受け取りが完了しているかの確認ですが&lt;a href=&quot;https://www.sandbox.paypal.com/jp/signin?country.x=JP&amp;amp;locale.x=ja_JP&quot;&gt;こちら&lt;/a&gt;から先ほどのアカウント一覧の画面のBUSINESSと書かれている方でログインすると先ほどテストで決済した分が反映されていれば成功していることになりますが、反映まで時間がかかるので注意が必要です。&lt;/p&gt;
&lt;h2&gt;まとめ&lt;/h2&gt;
&lt;p&gt;速足で簡単な実装について説明して感じたことだが公式の&lt;a href=&quot;https://qiita.com/PPJP/items/990c55538213b7da04ad&quot;&gt;qiita&lt;/a&gt;の情報の少なさ英語版リファレンスの非フロー的な機能説明(主に情報が分散しすぎてる)が多いと感じました。その辺りなんとかなればもっと利用者が増えるのではないだろうか。&lt;/p&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;h2&gt;磁気ストライプカードとは&lt;/h2&gt;
&lt;p&gt;磁気ストライプカードとはwikipediaによると磁気ストライプカード（じきストライプカード、英: magnetic stripe card）は、磁性体の帯があるカードで、その中の鉄をベースとした小さな磁性粒子の磁性を変化させることでデータを格納できるもの。とありますが簡単に説明するとみなさんが持っているポイントカードやクレジットカードなどの磁性体を持ったカードのことを言います。&lt;/p&gt;
&lt;h2&gt;概要&lt;/h2&gt;
&lt;p&gt;今回は磁気ストライプの基本的な仕様等の説明、簡単に仕様特定等に行った検証を掲載していく。&lt;/p&gt;
&lt;h2&gt;仕様&lt;/h2&gt;
&lt;h3&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;/static/images/blog/mstripe0.png&quot; alt=&quot;スクリーンショット&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;h3&gt;サービスコードについて&lt;/h3&gt;
&lt;p&gt;先ほどの磁気ストライプ内のデータにあったサービスコードについて解説していくこのサービスコードとは決済端末側に要求しうる動作を決める為のもので数字によって下記の様な意味を持つ。&lt;br /&gt;
1桁目&lt;br /&gt;
1:国際ブランド&lt;br /&gt;
2:国際ブランド&amp;amp;ICチップ搭載&lt;br /&gt;
5:国内ブランド&lt;br /&gt;
6:国内ブランド&amp;amp;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;amp;PIN入力要求&lt;br /&gt;
1:制限なし&lt;br /&gt;
2:物品とサービスのみ&lt;br /&gt;
3:ATMのみ&amp;amp;PIN入力要求&lt;br /&gt;
4:キャッシングのみ&lt;br /&gt;
5:商品とサービスのみ&amp;amp;PIN入力要求&lt;br /&gt;
6:制限なし&amp;amp;可能な場合はPIN入力要求&lt;br /&gt;
7:物品とサービスのみ&amp;amp;可能な場合はPIN入力要求&lt;/p&gt;
&lt;h2&gt;検証&lt;/h2&gt;
&lt;p&gt;カードの偽造可否や偽造カードの使用可否等の検証を行った。&lt;/p&gt;
&lt;h3&gt;カードの偽造&lt;/h3&gt;
&lt;p&gt;まず結論から言うと偽造は可能であるしかしカード番号や有効期限、CVC2を知っていても偽造は不可能である理由として先ほど説明したCVC1が不明であるためである実はクレジットカードは通常裏面等に記載があるものはCVC2でありこちらはEC決済等に用いられるが磁気ストライプ内のものは店頭決済用のCVC1となっておりこちらは乱数で推測が不可能であるため偽造は不可能である。ではどうやって偽造が可能かと言うと有名な手口ではあるが決済機等に付けるスキミング装置を用いる方法やまた悪意のある加盟店に直接磁気ストライプ内データが盗まれたりした際に偽造カードの作成は可能になってしまう磁気ストライプには書き換え不能な固有データ等が存在しないため磁気ストライプ内のデータを直接抑えられたら終わりなのである。&lt;br /&gt;
対策等は近年日本でも増えてきているが決済操作のセルフ化と決済端末等を目視確認することだ。&lt;/p&gt;
&lt;h3&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;h2&gt;まとめ&lt;/h2&gt;
&lt;p&gt;以上の通り割と簡単に不正利用ができてしまうことが判明した特に日本国内の決済事情的にはかなり早急な対応が必要な状態だと思われる。&lt;/p&gt;
</content:encoded></item><item><title>ubuntuで超簡単にmastodonインスタンスを作成する方法(docker)</title><link>https://doany.io/posts/mstdn/</link><guid isPermaLink="true">https://doany.io/posts/mstdn/</guid><description>ubuntuで超簡単にmastodonインスタンスを作成する方法(docker)</description><pubDate>Fri, 17 Aug 2018 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;概要&lt;/h2&gt;
&lt;p&gt;qiita等に上がっている既存の情報ですと情報が少し古かったりしまたtootsuiteによる公式ドキュメントも現在は存在する為公式ドキュメントに沿って無駄な構成要素を省いて構築していく。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;2018-12-25:対話形式のものを使用するように修正タイトルを修正&lt;br /&gt;
2018-12-25:公式ドキュメントが移動dockerページがなくなるサポート状況不明&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;環境&lt;/h2&gt;
&lt;p&gt;OS:Ubuntu server 18.04 AMI
HW:aws c5.large&lt;/p&gt;
&lt;h2&gt;nginxの構築&lt;/h2&gt;
&lt;h3&gt;nginxのインストール&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;sudo apt update
sudo apt install nginx
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;インストールが完了したら下記の通りconfファイルを作成しexample.comを今回インスタンスを作成するドメインに修正する(serverとssl証明書の4箇所)&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;map $http_upgrade $connection_upgrade {
  default upgrade;
  &apos;&apos;      close;
}

server {
  listen 80;
  listen [::]:80;
  server_name example.com;
  root /home/mastodon/live/public;
  # Useful for Let&apos;s Encrypt
  location /.well-known/acme-challenge/ { allow all; }
  location / { return 301 https://$host$request_uri; }
}

server {
  listen 443 ssl http2;
  listen [::]:443 ssl http2;
  server_name example.com;

  ssl_protocols TLSv1.2;
  ssl_ciphers HIGH:!MEDIUM:!LOW:!aNULL:!NULL:!SHA;
  ssl_prefer_server_ciphers on;
  ssl_session_cache shared:SSL:10m;

  ssl_certificate     /etc/letsencrypt/live/example.com/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

  keepalive_timeout    70;
  sendfile             on;
  client_max_body_size 8m;

  root /home/mastodon/live/public;

  gzip on;
  gzip_disable &quot;msie6&quot;;
  gzip_vary on;
  gzip_proxied any;
  gzip_comp_level 6;
  gzip_buffers 16 8k;
  gzip_http_version 1.1;
  gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;

  add_header Strict-Transport-Security &quot;max-age=31536000&quot;;

  location / {
    try_files $uri @proxy;
  }

  location ~ ^/(emoji|packs|system/accounts/avatars|system/media_attachments/files) {
    add_header Cache-Control &quot;public, max-age=31536000, immutable&quot;;
    try_files $uri @proxy;
  }
  
  location /sw.js {
    add_header Cache-Control &quot;public, max-age=0&quot;;
    try_files $uri @proxy;
  }

  location @proxy {
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto https;
    proxy_set_header Proxy &quot;&quot;;
    proxy_pass_header Server;

    proxy_pass http://127.0.0.1:3000;
    proxy_buffering off;
    proxy_redirect off;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection $connection_upgrade;

    tcp_nodelay on;
  }

  location /api/v1/streaming {
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto https;
    proxy_set_header Proxy &quot;&quot;;

    proxy_pass http://127.0.0.1:4000;
    proxy_buffering off;
    proxy_redirect off;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection $connection_upgrade;

    tcp_nodelay on;
  }

  error_page 500 501 502 503 504 /500.html;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;sslの取得&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;sudo apt install certbot
sudo systemctl stop nginx
sudo certbot certonly --standalone -d {ドメイン}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;この後は対話型で情報入力していきます。&lt;/p&gt;
&lt;h2&gt;dockerの構築&lt;/h2&gt;
&lt;h3&gt;dockerのインストール&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;sudo apt-get -y remove docker docker-engine docker.io containerd runc
sudo apt-get update
sudo apt-get -y install \
    ca-certificates \
    curl \
    gnupg \
    lsb-release
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo \
  &quot;deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable&quot; | sudo tee /etc/apt/sources.list.d/docker.list &amp;gt; /dev/null
sudo apt-get update
sudo apt-get -y install docker-ce docker-ce-cli containerd.io docker-compose-plugin
sudo adduser $USER docker
exit    #一旦セッションを消す
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;dockerのビルド&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;cd
git clone https://github.com/tootsuite/mastodon
cd mastodon
cp .env.production.sample .env.production
docker-compose run --rm web bundle exec rake mastodon:setup
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;ビルドが完了すると対話形式で情報を入力していきます。
途中&lt;code&gt;This configuration will be written to .env.production&lt;/code&gt;と聞かれた際にYesを選択その後下記のような設定ファイルが出力されるのでメモっておき処理が完了したら&lt;code&gt;.env.production&lt;/code&gt;にコピペして保存する。
※このとき別のセッション等で保存後に続きの質問を続行する&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# Generated with mastodon:setup on 2018-12-25 10:12:56 UTC

LOCAL_DOMAIN=m.do-a.co
SINGLE_USER_MODE=false
SECRET_KEY_BASE=xxxxxxx
OTP_SECRET=xxxxxx
VAPID_PRIVATE_KEY=xxxx=
VAPID_PUBLIC_KEY=xxxx=
DB_HOST=db
DB_PORT=5432
DB_NAME=postgres
DB_USER=postgres
DB_PASS=
REDIS_HOST=redis
REDIS_PORT=6379
REDIS_PASSWORD=
SMTP_SERVER=mail.so-net.ne.jp
SMTP_PORT=587
SMTP_LOGIN=xx
MTP_PASSWORD=xxx
SMTP_AUTH_METHOD=plain
SMTP_OPENSSL_VERIFY_MODE=none
SMTP_FROM_ADDRESS=Mastodon &amp;lt;notifications@m.do-a.co&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;最後に下記コマンドを実行して起動&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;docker-compose up -d
sudo systemctl restart nginx
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;以上で管理者アカウントの設定まで他保守に関する設定は一切省いた構成となっているので実際に複数人数で利用する際は別途設定が必要です。&lt;/p&gt;
</content:encoded></item><item><title>WordPressをマルチサイト化してgitを導入してみた</title><link>https://doany.io/posts/wpgit/</link><guid isPermaLink="true">https://doany.io/posts/wpgit/</guid><description>WordPressをマルチサイト化してgitを導入してみた</description><pubDate>Thu, 02 Aug 2018 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;経緯&lt;/h2&gt;
&lt;p&gt;日頃から WordPress の改修等やっているが理想的な管理方法はないかと思い自分なりに管理環境を構築してみた。&lt;/p&gt;
&lt;h2&gt;概要&lt;/h2&gt;
&lt;p&gt;大まかな概要としては以下の通り。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;WordPress をマルチサイト化&lt;/li&gt;
&lt;li&gt;ステージング用テーマを作成&lt;/li&gt;
&lt;li&gt;テーマディレクトリを branch ごとに管理&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;環境は以下の通り&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ubuntu server 18.04.1&lt;/li&gt;
&lt;li&gt;nginx&lt;/li&gt;
&lt;li&gt;hhvm&lt;/li&gt;
&lt;li&gt;mysql&lt;/li&gt;
&lt;li&gt;WordPress 4.9.7&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;nginx の設定&lt;/h3&gt;
&lt;p&gt;まず nginx の設定をしていく
nginx で virtual host と basic 認証の設定をしていく&lt;/p&gt;
&lt;h4&gt;.htpasswd の生成&lt;/h4&gt;
&lt;p&gt;.htpasswd を生成するため下記を実行&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo htpasswd -c -b {生成する.htpasswdのパスファイル名も含めて} {ユーザ名} {パスワード}
#例
sudo htpasswd -c -b /etc/nginx/conf.d/.htasswd hogehoge hugahuga
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;basic 認証と virtual host の設定&lt;/h4&gt;
&lt;p&gt;basic 認証と virtual host を設定していく下記に例を示す。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;server{
    listen 443 ssl;#今回は443で待ち受けてsslを有効
    server_name stg.doany.io;#マルチサイトに使用するドメイン
    index index.php;#インデックスを有効にするファイル
    root /var/www/html;#ルートディレクトリ
    location / {
           try_files $uri $uri/ /index.php?$args;#WordPresのリライトを有効
        auth_basic &quot;Restricted&quot;;#basic認証を有効
        auth_basic_user_file /etc/nginx/conf.d/.htpasswd;#.htpasswdのディレクトリを指定
    }
    location ~ \.php$ {#fast cgiの設定
        include fastcgi_params;
        fastcgi_pass 127.0.0.1:9000;
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;nginx を下記コマンドで再起動して起動すれば OK 起動しなければ文法ミス等が考えられるので修正。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo systemctl restart nginx
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;WordPress のマルチサイト化&lt;/h3&gt;
&lt;p&gt;次に WordPress をマルチサイト化してステージング環境を作成していく。&lt;/p&gt;
&lt;h4&gt;WordPress のマルチサイトを有効化&lt;/h4&gt;
&lt;p&gt;まずマルチサイトの有効かだが wp-config.php に以下の一行を追加&lt;code&gt;/* 編集が必要なのはここまでです ! WordPress でブログをお楽しみください。 */&lt;/code&gt;の上あたりに追加します。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;define(&apos;WP_ALLOW_MULTISITE&apos;, true);
/* 編集が必要なのはここまでです ! WordPress でブログをお楽しみください。 */
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;次にマルチサイト導入の為一旦プラグインを全て無効かしてから管理画面で左メニューのツール → ネットワークの設置クリックします。そして今回はサブディレクトリを選択サイトネットワーク名等を入力してインストールをクリック画面が変わったら案内通り下記を参考に wp-config を編集※下記の htaccess は今回は nginx の為無視してください。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;define(&apos;MULTISITE&apos;, true);
define(&apos;SUBDOMAIN_INSTALL&apos;, true);
define(&apos;DOMAIN_CURRENT_SITE&apos;, &apos;doany.io&apos;);#お使いのサイトのドメインによってかわります
define(&apos;PATH_CURRENT_SITE&apos;, &apos;/&apos;);#こちらもWordPressの構成によってかわります
define(&apos;SITE_ID_CURRENT_SITE&apos;, 1);
define(&apos;BLOG_ID_CURRENT_SITE&apos;, 1);
/* 編集が必要なのはここまでです ! WordPress でブログをお楽しみください。 */
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;再度ログインしていただいてプラグインを有効かして既存のサイトが表示されていれば OK ですまたカスタム投稿タイプ等を使用していて記事が表示できなくなった場合フロントでのリライトを無効かすると治ることがあります。&lt;/p&gt;
&lt;h4&gt;ステージング用サイトの構築&lt;/h4&gt;
&lt;p&gt;今回はプラグインを使用して構築しました。&lt;a href=&quot;https://premium.wpmudev.org/project/cloner/&quot;&gt;Cloner&lt;/a&gt;こちらをインストール後左メニューのサイトを開きステージング環境を作成したいサイトの下の Clone をクリック Create a new Site を選択その下にサブドメイン(※フルドメインは不要です)を入力 Clone Site を実行。しばらくすると処理が始まり管理画面が表示されたら完了です。&lt;br /&gt;
次に ftp なりで本番サイトで使用しているテーマを同じ themes ディレクトリ内に複製します。(※この時サイトネットワークから有効化しないと使用できない場合があります)そしたらそのテーマをステージングサイトで有効化します。&lt;/p&gt;
&lt;h2&gt;Git の導入&lt;/h2&gt;
&lt;p&gt;次に本番テーマを master、ステージングテーマを stg としてブランチを作り git を構築していきます。&lt;/p&gt;
&lt;h3&gt;git の導入と github への push&lt;/h3&gt;
&lt;p&gt;先に GitHub でリポジトリを作成しておいてください。作成したら ssh で入り本番用テーマのディレクトリ以下を git 管理します GitHub の案内通り git を導入していきます下記に例を示す。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git init
git add .
git commit -m &quot;first commit&quot;
git remote add origin https://github.com/16dyui/mywordpress.git #作成したリポジトリのurl
git push -u origin master
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;ステージングブランチの作成&lt;/h3&gt;
&lt;p&gt;次にステージングブランチを作成していきます。ssh で stg サイトで有効にしたテーマディレクトリに移動してくださいそこで下記のようなコマンドを実行してください。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git init
git add .
git commit -m &quot;my first stg&quot;
git remote add origin https://github.com/16dyui/mywordpress.git #作成したリポジトリのurl
git branch -m stg #現在のブランチをstgにリネーム
git push origin stg #stgをリモートにpush
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;まとめ&lt;/h2&gt;
&lt;p&gt;問題発生を防ぐ為サーバーを分けたりする場合が多いですが今回は簡易的に WordPress を git 管理する方法を紹介させていただきました。このようにマルチサイトを利用することでより簡易的に WordPress を Git 管理することができます。&lt;/p&gt;
</content:encoded></item><item><title>postfixの導入とOP25Bの回避</title><link>https://doany.io/posts/op25b/</link><guid isPermaLink="true">https://doany.io/posts/op25b/</guid><description>postfixの導入とOP25Bの回避</description><pubDate>Wed, 01 Aug 2018 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;概要&lt;/h2&gt;
&lt;p&gt;ubuntu server 18.04.1にてpostfixを導入しOP25Bの回避設定をしたので備忘録としてこちらに書いていく。&lt;/p&gt;
&lt;h2&gt;postfixの導入&lt;/h2&gt;
&lt;p&gt;下記コマンドを実行。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo apt install postfix
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;postfixの設定&lt;/h2&gt;
&lt;h3&gt;OP25Bの回避&lt;/h3&gt;
&lt;p&gt;まずOP25Bとは簡単に説明すると25番ポートを用いて直接メールを送信するのをブロックし迷惑メールを減らすためのもので今ではほとんどのISPが導入している、その為ISPのメールサーバー等を経由(ここに関してはお使いの環境によって異なります)してメールを送信するように設定する必要がある、方法は簡単で/etc/postfix/main.cf内を下記の様に編集していく。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;relayhost = [mail.so-net.ne.jp]:587 #ISPのmailサーバー
smtp_sasl_auth_enable = yes
smtp_sasl_mechanism_filter = plain
smtp_sasl_password_maps = hash:/etc/postfix/mailpass
smtp_sasl_security_options = noanonymous
smtp_sasl_tls_security_options = noanonymous
smtp_use_tls = yes
smtp_tls_CApath = /etc/ssl/certs/ca-certificates.crt #ca証明書(お使いの環境によって違います)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;次に/etc/postfix/mailpassを作成下記の様に記述していく。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[{ISPのメールサーバー}]:587 {ID}:{パスワード}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;次にID、パスワードをハッシュ化しpostfixを再起動して送信テストするため以下を実行。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo postmap hash:/etc/postfix/mailpass
sudo systemctl restart postfix
echo &quot;Hello post&quot; | sendmail {メールアドレス}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;まとめ&lt;/h2&gt;
&lt;p&gt;以上でOP25Bの回避ができます。自宅サーバーでメールが送信できないなんてときは試してみてください。&lt;/p&gt;
</content:encoded></item><item><title>ubuntuでhhvm+nginx+mysqlでwordpress環境の構築</title><link>https://doany.io/posts/wpdevenv/</link><guid isPermaLink="true">https://doany.io/posts/wpdevenv/</guid><description>ubuntuでhhvm+nginx+mysqlでwordpress環境の構築</description><pubDate>Sat, 28 Jul 2018 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;経緯&lt;/h2&gt;
&lt;p&gt;環境構築の経緯だが大変間抜けな話だがubuntuのpythonコアをあろうことかpurgeしてしまい修復するにも手が付けられずまたguiからcuiに乗り換える目的から1から環境構築しなおしたので備忘録としてこちらに書いていこうと思う。&lt;/p&gt;
&lt;h2&gt;バックアップ&lt;/h2&gt;
&lt;p&gt;以下の順番でバックアップしていった&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;mysql&lt;/li&gt;
&lt;li&gt;その他設定等のファイル群&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;mysqlのダンプ&lt;/h3&gt;
&lt;p&gt;まずmysqlだが幸いシリアルコンソールは起動したので下記コマンドにてダンプファイルを生成した。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;mysqldump -u root -p {データベース名} &amp;gt; dump.sql
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;ファイルのバックアップ&lt;/h3&gt;
&lt;p&gt;live cdより起動して先ほどのmysqlのダンプファイルと自己ビルドしたnginxを使用していたため/usr/local/nginx内を全て外部メモリに保存した。この際設定ファイル等には隠しファイルや権限が必要なファイルがある可能性もあるのできおつけること。&lt;/p&gt;
&lt;h2&gt;ubuntuのインストール&lt;/h2&gt;
&lt;p&gt;次にUbuntuをインストールしていく内容はさほど凝ったものではないので飛ばし飛ばし書いていく。&lt;/p&gt;
&lt;h3&gt;Ubuntuイメージディスクの作成&lt;/h3&gt;
&lt;p&gt;今回はUbuntu server 18.04.1を使用した。下記よりダウンロードしwindows7以降ならWindowsディスクイメージ書き込みツールが搭載されているはずなのでそちらで焼いた。
&lt;a href=&quot;https://www.ubuntu.com/server&quot;&gt;Ubuntu server&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Ubuntuのインストール&lt;/h3&gt;
&lt;p&gt;まずUbuntu serverを起動するこの時点では知らなかったのだが今のUbuntu serverはEFIブートするらしいのでわざわざ書き込みツール使う必要もなかったのですがまあいいでしょうインストールを進めていきます。EFIで起動したら黒い画面に白字で選択画面がでるのでInstallなんちゃらを選択する。今は便利でCUIながらグラフィカルなインストールのマネージャーが上がるので以下に手順を簡単に示す。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Englishを選択。&lt;/li&gt;
&lt;li&gt;キーボードレイアウトを選択&lt;/li&gt;
&lt;li&gt;Install Ubuntuを選択&lt;/li&gt;
&lt;li&gt;セットアップに使用するネットワークI/Fを選択(今回は優先でオンボードのドライバが当たっていたので特に何も設定せず進めた)&lt;/li&gt;
&lt;li&gt;仕様するプロキシーの設定(今回は特別に設定はしてない)&lt;/li&gt;
&lt;li&gt;ミラーアドレスの設定(こちらも今回特別に設定はしていない)&lt;/li&gt;
&lt;li&gt;ディスクの構成(今回は得に考えずUse An Entire Diskを選択)&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;h2&gt;Ubuntuの設定&lt;/h2&gt;
&lt;p&gt;ubuntuが起動したらユーザー名とパスワードを打ってログインします。&lt;/p&gt;
&lt;h3&gt;ipの固定&lt;/h3&gt;
&lt;p&gt;ローカルipを固定してポートフォワードを設定していたのでipを固定します。インストール時に実は設定できたのですが知らなかったので後から設定します。/etc/netplan/50-cloud-init.yaml以下を編集します。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;network:
    ethernets:
        {デバイス}:
            addresses: [{ipアドレス}]
            dhcp4: true
    version: 2
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;設定の適用は&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo netplan apply
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;sshポートの変更&lt;/h3&gt;
&lt;p&gt;デフォルトのポート(22)で使用していた際海外からのアクセスが集中し認証できなくなるという事態が発生したのでポートは絶対に変えておきましょう。/etc/ssh/sshd_configの記述を変更。念のためテストしようと思ったのですが、以前のキーが残っていると接続できないので厳密にはそれぞれキーを再生成すべきなのですがめんどくさいので~/.ssh/known_hostsを削除しました(非推奨)&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Port {ポート番号}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;sslの取得&lt;/h2&gt;
&lt;p&gt;通常だとnginxのインストールが先な気がしますが今回はssl化が前提なので先にsslを取得していきます。&lt;/p&gt;
&lt;h3&gt;certbotの導入&lt;/h3&gt;
&lt;p&gt;下記コマンドを実行。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo apt update
sudo apt install software-properties-common
sudo add-apt-repository universe
sudo add-apt-repository ppa:certbot/certbot
sudo apt update
sudo apt install certbot
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;証明書の取得&lt;/h3&gt;
&lt;p&gt;今回は複数ドメイン+サブドメインを同時に証明書取得したいと思います。
下記既にcertbot-auto導入済みなので下記コマンドを実行-dの後ろはドメイン(今回は二つ指定)-mの後ろはメールアドレスに適宜書き換えてください。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo certbot certonly --agree-tos --no-eff-email --manual-public-ip-logging-ok --manual -m {メールアドレス} -d {ドメイン} -d {ドメイン}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;次に下記の様な案内がでますのでネームサーバーのtxtレコードに案内の通り設定していきます。もし-dを2つ以上設定していた場合下記の様な案内が出た後エンターを押す度指定したドメインの数だけ案内がでますので全てtxtレコード設定してください。※最後の案内が出た後エンターを押さないでそのままにしてください。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Please deploy a DNS TXT record under the name
_acme-challenge.siteyui.site with the following value:

lb0hNdyPwXpftFbkZcIVsXIyQFxd5bzmTKrKQJlGqMs

Before continuing, verify the record is deployed.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;設定が終わりtxtレコードが反映完了したらエンターを押してください。反映されていない段階でエンターを押したりエラーが出た際には上のコマンドを再度実行して1から設定しなおしてください。
また下記コマンドでtxtレコードの状態を確認できます。ドメイン名のところはサブドメイン無しのドメインを入れればすべてのレコードが見れるはずです。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;dig -t txt {ドメイン名}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;mysqlのインストール&lt;/h2&gt;
&lt;p&gt;先にmysqlをインストール設定していきます。下記コマンドを実行。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo apt install mysql-server
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;mysqlの初期パスワード設定&lt;/h3&gt;
&lt;p&gt;本来は非推奨らしいのだがセキュリティプラグイン周りは詳しくない為平文で直接テーブルを書き換える。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo mysql

mysql&amp;gt;ALTER USER &apos;root&apos;@&apos;localhost&apos; IDENTIFIED WITH mysql_native_password BY &apos;{パスワード}&apos;;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;mysqlでのインポート&lt;/h3&gt;
&lt;p&gt;テーブルを作ってエクスポートの逆をやるだけ。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;mysql -u root -p

mysql&amp;gt;CREATE DATABASE {データベース名};
mysql&amp;gt;exit;

mysql -u root -p {データベース名} &amp;lt; {ダンプファイル}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;hhvmのインストール&lt;/h2&gt;
&lt;p&gt;今回はphpの代わりに速度改善の為にhhvmを入れていきます。下記コマンドを順次実行。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo apt update
sudo apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0xB4112585D386EB94
sudo add-apt-repository https://dl.hhvm.com/ubuntu
sudo apt update
sudo apt install hhvm
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;nginxのインストールとセットアップ&lt;/h2&gt;
&lt;p&gt;他記事等ではaptでのインストールだとバージョンが古いと書かれているものもありますが2018/07/28現在1.15.2がインストールされるので問題ないです。下記コマンドを実行&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo apt install nginx
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;nginxの設定&lt;/h3&gt;
&lt;p&gt;nginxの設定をしていくaptでインストールした場合は/etc/nginx/conf.d以下に拡張子.confでファイルを作成すれば自動的に読み込まれる今回は下記の様な設定を行ったので簡単に説明していく。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;server{
    listen 80;#80番ポートで待ち受け
    server_name .siteyui.site;#.でスタートするとドメイン+サブドメイン全てが対象
    return 301 https://$host$request_uri;#httpsに全て301リダイレクト
}
client_max_body_size 100m;#自分の環境ではwordpressのメディアアップロード時エラーが出ていたため明示的にリクエストサイズを指定
ssl_certificate /etc/letsencrypt/live/siteyui.site/cert.pem;
ssl_certificate_key /etc/letsencrypt/live/siteyui.site/privkey.pem;#先ほどcertbotで取得した証明書の設定
server{
    listen 443 ssl;#443で待ち受け&amp;amp;SSLを有効
    server_name tv.siteyui.site;
    location / {
        auth_basic &quot;Restricted&quot;;#ベーシック認証を使用
        auth_basic_user_file /etc/nginx/conf.d/.htpasswd;#id,pwファイルの指定
        proxy_pass http://192.168.0.2;#プロキシの設定
    }
}
server{
    listen 443 ssl;
    server_name siteyui.site;
    index index.php;#indes.phpにインデックスを有効
    root /var/www/html;
    location / {
           try_files $uri $uri/ /index.php?$args;#スラッグでのアクセスをクエリに変換(wordpress用)
    }
    location ~ \.php$ {#hhvmの設定
        include fastcgi_params;
        fastcgi_pass 127.0.0.1:9000;
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;最後に&lt;/h2&gt;
&lt;p&gt;以上となりますがセキュリティ的におすすめできるような内容ではないので後学の為にも指摘等頂けると大変助かります。&lt;/p&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;h2&gt;はじめに&lt;/h2&gt;
&lt;p&gt;普段目にしているクレジットカードの番号ですがこれにも様々なルールやセキュリティ対策がなされています。今回はそれについて説明していきます。&lt;/p&gt;
&lt;h2&gt;番号の概要&lt;/h2&gt;
&lt;p&gt;まずクレジットカード番号がどのように構成されているかですがクレジットカード番号はISO/IEC 7812にて策定されており、6桁のBIN（Bank Identification Number, 銀行識別番号）もしくはIIN（Issuer Identification Number, 発行者識別番号）+残りの番号はイシュアによって決定されます。&lt;/p&gt;
&lt;h3&gt;BIN、IINについて&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;h2&gt;チェックディジットに関して&lt;/h2&gt;
&lt;p&gt;クレジットカード番号にはLuhnアルゴリズムが使用されており、主な目的として連番での発行をさせず、入力ミス等で他人のカードが決済されるのを防ぐためだと推測される。但しこれは計算可能な為悪意のある決済を防ぐ為のものではない。&lt;/p&gt;
&lt;h3&gt;セキュリティ面での検証&lt;/h3&gt;
&lt;p&gt;以上のルールを踏まえ当方が検証した内容を記述する。&lt;/p&gt;
&lt;h3&gt;検証概要&lt;/h3&gt;
&lt;p&gt;近年ではApple Pay等でクレジットカード番号の下4桁が管理用に表示され尚且つApple Payの場合クレジットカードデザインからある程度イシュアが特定可能な為そこからクレジットカード番号が推測できないか検証してみた。&lt;/p&gt;
&lt;h3&gt;BIN,IINの特定&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;h3&gt;カード番号の特定&lt;/h3&gt;
&lt;p&gt;BINが特定されたものとして話を進めていきます。この時点で6桁のBIN+下4桁が判明していることになります。ここで全てのLuhnアルゴリズムに当てはまる数字を算出してみました(今回は16桁で)下記サイトでチェックしましたがゆうに100件を超えており特定が不可能でした。&lt;a href=&quot;https://www.elfqrin.com/discard_credit_card_generator.php&quot;&gt;credit card number generator&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;まとめ&lt;/h2&gt;
&lt;p&gt;以上の通りスクリーンショットやレシート画像等から番号特定は現実的にはほぼ不可能という結果になりましたまた近年ではセキュリティコードの必須化や3D secure導入等が進んでおり仮に割れたところで現実的には決済できる加盟店は存在しないでしょう。&lt;/p&gt;
</content:encoded></item></channel></rss>