'sqr'atch-note

ちりはつもれど ちりぬるを

『Docker/Kubernetes実践コンテナ開発入門』読んだ

  • 日常的にDockerを活用してないのでDockerの情報が追えておらず知識が古くなってしまいがちなので、最近の情報をキャッチアップするためにも買って読んでみた。
    • 本書は、2018年の初版を大幅改訂した"改訂新版"ではあるが、ぼくは初版の方を読んでいない。
  • 意外(失礼)に内容がしっかりしており好印象。表紙がポップだったので、よくある入門書のように簡単に使い方を説明して終わりなのかなと思っていた。
    • 実際には、コンテナをどう設計するか(第3章)、第9章以降は運用していくための知識がまとまっており、非常に良かった。
  • 4章では、Webアプリケーションにおいてよく用いられるWeb3層アーキテクチャのWebアプリケーションをコンテナで構築するというハンズオン形式の内容になっている。
    • 4章に限らず本書ではGo言語(Golang)がWebアプリを記述する言語として使用されているのも個人的にポイントが高い。といっても、Golangの知識が無くても全く問題は無く、読めると実際に何をやってるのかがより詳しく分かって嬉しい位。
    • Golangが使われてる理由としては、Golangがシングルバイナリを作れるからコンテナとの親和性が高く、さらにバックエンドで使われてるケースが多いからだと思う。Dockerやk8sGolangで記述されてもいるし。
  • 個人的な本書での学びは、envsubstコマンドの存在を知ったことで(p.151)、本書ではnginxのイメージで利用できるテンプレートエンジン的な仕組みとして紹介されてる。中身はenvsubstコマンドをラップしたシェルスクリプトで実現している。
    • composeのyamlでenvironment属性から環境変数をコンテナに渡してあげて、コンテナの中でテンプレートファイルからコンフィグファイルを生成するという仕組みなので、自分がコンテナイメージを作るときにも使えそうだし、積極的に使っていきたいと思った。
  • 普段、ホスト環境を汚したくないけどミドルウェアの動きを見たいからコンテナ使ってるケースが多いので、使い捨て前提でコンテナのベストプラクティスを無視した汚いDockerfileを書いてしまっており、本書で述べられているような「より良いイメージを作る」こともあまり意識していない。
    • マルチステージビルドとenvsubstコマンドは、次にコンテナを作るときには意識していきたい。
  • 無意識に動かしてる部分であっても、こういう本の説明を見て始めて仕組みに気づいて納得できるという場面があるし、やはり読書は面白い。

PostfixでGmailにメールを送る

  • Gmailのメール送信者向けのガイドラインや神奈川県出願システムのトラブルなどで話題になっていたから、送信ドメイン認証技術について最近調べた内容をまとめる。
  • 別にGmailでは無くても良いんだけど、いちばん分かりやすいのでGmailに送ることを考える。
  • 併せて、本記事ではPostfixにてSPFDKIMを設定する部分までを記載する。本当ならDMARCまでやってしまいたいが、それはまたの機会にしたいと思う。

用語の簡単な説明

まずは簡単に用語の整理と説明。

  • MUA
    • メールユーザエージェント。Thunderbirdなど
  • MTA
    • メール転送エージェント。Postfixなど
  • エンベロープTo、ヘッダTo
  • エンベロープFrom
    • Return-Pathとしてメールヘッダ内に記載されている送信者アドレス
    • メールが相手のメールボックスに届けられなかったり、バウンスしたメールの送り先を指定する
    • エンベロープFromとヘッダFromは一致しなくてよい。むしろバウンスメールを受信するとメールボックスがパンクするなどが考えられるので、別のバウンスメール受信用のアドレスを指定するのがベター
  • ヘッダFrom
    • MUA上で表示されているメールの送信元アドレス。普段、メールアドレスと言ったときに思い浮かべるのはこちらのアドレス
  • Recievedフィールド
    • メールがどういった中継サーバを経由して届いたかの履歴
    • Postfixがメールを送信する場合、送信元サーバの$myhostnameが最初に記録される
  • SPF
    • 送信者メールアドレス(エンベロープFrom)のドメインを検証する仕組み。DNSSPFレコードを登録して、そのドメインがどのグローバルアドレスから届くのかを書いておく
    • ここで設定したドメインSPFレコードが無いと受信を拒否されてしまうケースがある
  • DKIM
    • エンベロープFromとヘッダFromが一致しないのはままありうるので、なりすましなどを防ぐにはSPFだけでは十分ではない。DKIMは、メールヘッダと本文に対して署名を行い、受信側でそれを検証することでなりすましやメールの改ざんを検知するための仕組み
    • DKIMには、作成者署名(そのドメインを所有しているユーザの秘密鍵・公開鍵で署名と検証を行う)方式と第三者署名が存在する
      • 三者署名は、メールの作成者と署名者の関係性が分からないので、ほぼ役には立たない*1
  • DMARC
    • ヘッダFromを検証する仕組み
    • さらに、SPFDKIMの検証結果に応じて、そのメールをどう扱うか(破棄するか、受信するかなど)を予め指定出来る

Postfixの基本設定

ここでは、以下のような内容でメールを送るための設定例を記載する

myhostname = example.local # ローカルのホスト名を記入する
smtp_helo_name = mail.example.com # SMTPのEHLOやHELO コマンドで使用するホスト名を指定する(receivedフィールドの値に使用される)
mydomain = example.com # インターネットドメイン名
myorigin = $mydomain # 外部に出ていくときに使用するドメインを指定する(エンベロープFromで使用)
inet_interfarce =  loopback-only  # 受信するIPアドレスを指定する
mynetworks = localhost # メールを受信するネットワークアドレスを指定する
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain # 自ドメイン宛のメールを受信できるようにする
home_mailbox = Maildir/ # 自身のメールボックスを指定する

SPFの設定

  • SPFレコードの登録は、DNS側の設定なので、Postfixに設定が必要というわけでは無い。
  • 使っているDNSに以下のようなTXTエントリを追加してあげれば良い
  • example.com. IN TXT "v=spf1 ip4:198.51.100.0/24 -all"
    • ドメインは、Postfixの設定で$mydomainに設定した値を書く
    • IPアドレスは、メールサーバのグローバルアドレスを設定する(ここでは、/24で指定しているが、/32で指定する場合はサブネットマスクは書かなくて良い)

DKIMの設定

  • 次はDKIMを設定していく
  • 何はともあれDKIMを使うためには、opendkimパッケージが必要なのでインストールを行う
dnf config-manager --set-enabled crb
dnf install epel-release
dnf install opendkim
dnf install opendkim-tools
  • opendkimに必要なライブラリがCRBリポジトリに存在するので、まずCRBリポジトリを有効化している
  • 加えて、opendkimはEPELに存在するので使えるようにする
  • opendkim-toolsは、署名に使うキーペアを生成するコマンドを含んだパッケージなのでインストールする

opendkimの設定

  • opendkimの設定だが、以下のような流れになる
    • 署名に使うキーペアを生成する
    • opendkim.confに必要な起動設定を書く
    • postfixのmain.cfにopendkimとの連携設定を書く
    • DNSに作成したキーペアの公開鍵を登録する
  • まずキーペアの作成は、今回は作成者署名を行うので、署名するドメインをexmaple.comとし、DKIMセレクタ名をdefaultとして作成する
mkdir /etc/opendkim/keys/example.com
opendkim-genkey -D /etc/opendkim/keys/example.com/ -d example.com -s default
chown opendkim:opendkim -R /etc/opendkim/example.com
  • 次にopendkim.confを編集する
Mode    sv

#Socket local:/run/opendkim/opendkim.sock
Socket  inet:8891@localhost

Domain example.com
Selector        default
KeyFile /etc/opendkim/keys/example.com/default.private

InternalHosts   refile:/etc/opendkim/TrustedHosts
  • デフォルトでは、Modeがvになっており検証するだけなので、署名を行うためsvに変更する
  • 次にPostfixとの連携のためSocketディレクティブを書くが、ソケットを使う方法とIPを使う方法がある。上記では、IPを使う方法を書いている
    • ソケットを使う場合は、chown -R opendkim:mail /run/opendkim/のようにディレクトリの所有グループをopendkimからmailに変更してあげる必要がある。そうしないとPostfixから読みか書きが出来ないため
  • Domainには、署名するドメインを指定し、Selectorにはキーペア作成時に指定したセレクター名を指定、KeyFileには作成したキーペアのうち秘密鍵のパスを設定する
  • 最後に、InternalHostsをアンコメントしてPostfixとの通信が出来るようにしてあげる
  • いったんここまででopendkimパッケージの設定は終わりで、次はPostfixで連携設定を書く
milter_default_action = accept
smtpd_milters = inet:127.0.0.1:8891
smtpd_milters = local:/run/opendkim/opendkim.sock    # ソケットを利用する場合
non_smtpd_milters = $smtpd_milters
  • 上記の3行をmain.cfの末尾などに追記してあげる
    • $smtpd_miltersは、opendkimとの通信方式に応じたどちらかの設定を書いてあげる
  • ここまででopendkimとPostfixの設定は終わり。次にDNSDKIMのキーペアの公開鍵を登録する
  • 作成した公開鍵は下記のファイルに書かれているので、DNSにTXTレコードとして登録してあげる
    • cat /etc/opendkim/keys/example.com/default.txt
  • digコマンドなどで登録されたことを確認できたら、opendkimとPostfixを再起動し、Gmailにテストメールを送って、メールヘッダを表示してみてSPF/DKIMのどちらもPASSしていれば完了
systemctl start opendkim
systemctl start postfix

原始に続く穴、初クリア・・・?

  • シレン6のとぐろ島の神髄(表)は、攻略について何となくコツをつかんで飽きちゃったので、未クリアでトラウマになっていた原始に続く穴へをNintendo Switchシレン5+で再挑戦してた。
  • そして何度目かの挑戦でクリア。DS版で初めて原始に挑戦してから9年越しの初クリアだ!!って喜んでいたんだけど、iPhoneのフォトアルバムで過去の挑戦歴の写真を眺めていたら、2015年1月31日クリアしてた写真が残っていた・・・・。
    • 全く記憶に無かったし、原始に続く穴は未クリアなもんだとずーーーっと思ってた。もしクリアしてたならブログに書いてたと思うんだけど、その記事も無かったので。
    • 何と言うか、ぬか喜びになっちゃった。
  • だから本当は2回目だけど、前回の記憶が無かったのでプレイしているときは初クリア出来るかも?と思いながらやってたので、絶対にミスできないっていう手に汗握る緊張感があって非常に楽しかった。
  • そういう緊張感を持ってプレイしていても、一発で冒険終了しておかしくないようなあまりにもお粗末なプレミをしてる場面が多く、運に助けられまくった場面が結構あった。シレンは基本的に無慈悲な事故で倒れてしまうゲームだと思うんだけど、逆に運良く助けられている。
    • 例えば、あと1発で倒れてしまうって言う場面でHPを回復せずに、手拍子でスカイドラゴンを殴って攻撃が外れてしまう場面だったり。そのときは、スカイドラゴンも攻撃を外してくれたので九死に一生を得た。
    • 例えば、タツジンにとんでもない場所にヌーンクイーンを飛ばされた時は(後ろに飛ばすだけだと思ってた)、めっちゃ焦って罠チェックもしない、HPも回復しないで通路を歩くという雑プレイしちゃったり。
    • またある時には、序盤で店売りの変換の盾があったので、それを購入しよう思ってたのに、店売りの100Gの未識別の草が手持ちと被ったので飲んで漢識別しようとした時に何を思ったのか店売りの方を間違って飲んでしまい、それが運悪く高飛び草であり、即泥棒になってしまった時は、ほんとに死を覚悟した。でも、めちゃくちゃ運がよくて階段のある部屋へ高飛びできたので、店主に殴られることなく先に進めた(が、変換の盾は手に入れられなかったから、その先でガラ魔道士種に苦しめられることになる)
  • プレミしても運がよく助かっただけではなく、クリアしてみて振り返ると原始に続く穴って、こんなに簡単でよかったんだっけ?っていうくらい運はよかったように思う。
    • 道中、ドレッドラビとテリブルラビに呼ばれたけど、それも困ったときの巻物で切り抜けられたのは運がよかった。それに2回くらいしか呼ばれなかったのも運がよかった。
    • 催眠無効印を低層で合成できてたからゲンナマゲイズは全く脅威じゃ無く、90F以降に向けたギタン砲の稼ぎに使わせてもらった(しかしアイテム欄に入れておいた5000Gはアイテム整理ボタンを間違って押して無くなっちゃったけど)
    • 95F以降に出現するアビスドラゴンは1枚だけ残しておいた白紙の巻物でねだやししちゃったから、95〜99Fは冒険の中では一番簡単だったように思う。
    • それにスーパー状態が結構続いてくれたから、攻撃力アップと防御アップ状態とか、二階攻撃、倍速とかとかがあってくれたおかげで相当助かった。ハラモチ印が無かったけど、やわらかな仙桃と大きいおにぎりが十分にあったから深層では満腹度の心配せず素振りをしつつ動けたのが良かった思う。
  • 今回の冒険では、初めてとなる「1度も倒れずにクリア」というエキスパート証明書もとれて、これで一人前かなー。
  • Switch版の番付は、こんな感じになった。50F(初回クリア)の次が99Fであまりにも運が良かったとしか言えない。

『メール技術の教科書』読んだ

www.seshop.com

  • ちょうど1ヶ月前くらいに話題になった神奈川県立高校の出願システムからGmail宛メールが届かない問題。そのタイミングでこの本の発売が発表されたのは、何というかグッドタイミングというか、たぶん神奈川の件で気になってこの本を買ったようなぼくのような人は多いんじゃ無いのかと思う。
  • それよりも前、去年10月にGmailスパムメール対策としてメール送信者向けのガイドラインが更新されており、ここ数ヶ月メール周りがちょっとだけ話題になっているように感じる。
  • ぼくも、改めてこの機会にメール送信に関するドメイン認証技術について、ちょっとだけネットで調べてみたりVPSPostfixを入れて遊んでみたけど、複雑怪奇すぎて調べれば調べるほどごっちゃになってしまい煮詰まってしまったのもあり、この本の発売を楽しみにしていた。
    • メールの書き方については腐るほどビジネス書があふれかえっているけど、メール送信の技術に関してはそれだけに特化した本というのは、ほとんど無いように思う。
  • 本書は、メール送受信に関する技術(SMTPサーバ、IMAP/POP、ドメイン認証)について、体系的に把握できるように書かれている入門書。全体像を把握できるように、細かすぎる内容には踏み込まず肝となる部分を説明しつつ、実際にPostfixをインストールして、DNS(BIND)でMXレコードを設定したりして手を動かしながら確認もできるように構成されている。
  • ぼくは、インターネットでキーワードを検索して断片的に調べていたけど、正直こんがらがって訳が分からなくなったので、ざっくりと全体像を整理して解説した本書が非常にありがたかった。
    • 特に気になってたのは、ドメイン認証周りだったので"5章 スパムメールを防ぐ"を重点的に読んだ。SPFDKIMあたりは本書で改めて整理できて理解したと思うんだけど、DMARK部分は本書で読んでなるほどと思ったものの、インターネットで追加の調べ物をしているとやっぱり訳が分からなくなってくる。
    • とはいえ、本書の記述の問題では無く、メール技術が本質的にはらんでる闇だと思うので、あまり深入りしすぎないようにはしたいと思っている。

関連

本書以外の、最近ぼくがメール周りを調べてて面白かった参考情報

とぐろ島の神髄クリア!

  • シリーズ恒例の99Fを目指すもっと不思議なダンジョンのとぐろ島の神髄をクリアした。非常に楽しかった。
    • 今作ではユーザがどれくらいの割合でクリアできているのかというクリア率が表示されるのだけど、神髄のクリア率は2%で、ぼくは37回目の冒険で抜けられてだいたい周りと同じような感じでクリアできた。
  • 今回の最終ダンジョンは、SFC版のフェイの最終問題と64版の最果てへと続く道に似た感じで非常に楽しめた。難易度は、難しすぎず易しすぎず、楽しめる難易度に調整されてあって、非常に好印象。
    • 過去シレン5などの最終ダンジョンが、ほんとうに嫌がらせとしか言えないような内容だったので、今回の神髄のように難易度をまとめてくれた開発チームに感謝。
    • といっても、道中は軽い絶望を何度か味わった。
    • 10回に1回は割と武器も盾もいい感じに強化できて、この冒険は99F到達できるのでは?と思ったのに、戦車フロアでモンハウに遭遇してイッテツ戦車とガンコ戦車に囲まれてやられたり、ドラゴンとスカイドラゴンが堅すぎて回復アイテムを消費させられたり、大鬼サソリにちからの最大値を削られたり、、、と絶望を何度か味わった。
  • なので、どれだけの奇跡を重ねればクリア出来るんだ?と思って諦めかけてたけど、友人とシレン6の話をしてた時にふと攻略方法を思いついて、実際に試したら割とするすると深層を目指すことが出来、クリアできた。
    • 運が良かったのは、深層フロアでアークドラゴンがあまり出ずにそこまで困らなかったところ。根絶やしせずにすんだし、階段運にも恵まれたように思う。
    • そのせいか、アイテムを余らせすぎてしまった。

『風来のシレン6』買った

  • 実に14年ぶりのナンバリングタイトルが1/25に発売された。去年9月のニンダイで突然発表されてからあっという間に発売日を迎えた気がする。
    • ぼくは2014年にDS版のシレン5を初めて遊んだので個人的には10年ぶり。
  • 今回のシレン6は、ニンダイのPV見て64版のシレン寄りのSDちっくなキャラクターになったしアスカも登場とすると知って非常に楽しみに思った反面、発売されるまでほとんど話題を見かけなかったし、開発者インタビューのプレイ画像を見るとグラフィックがしょぼそうだし微妙では?という、期待と不安が入り交じった気持ちだった。
  • で、ここ5日くらい遊んでみた結果、結構満足している。
    • 神器の海廊が楽しくて、まだ最後のもっと不思議なダンジョンを出したものの挑めてないけど。。。
  • 全体の評価はざっくりこんな感じ。
    • ストーリー:★★★☆☆
    • シレンらしさ:★★★★★
    • 遊びやすさ:★★★★★
    • グラフィック:★★☆☆☆
  • ストーリーに関しては元々シレンはストーリーが面白い!っていうゲームではないので、普通だったという評価。
  • シレンらしさという上手く言語化できない部分だけど、なんとなく原点であるSFC版のシレンに存在した面白さが戻っている気がする。
    • 純粋に不思議なダンジョンを楽しめるような構成になっている。いやらしい昼夜システムが廃止されてるのが大きい
    • 神器の海廊、買い物上手の修験道とかシステムを楽しめるダンジョンがあるのが良いと思った
    • 印の数が増えたので、最強の武具を作るっていう楽しみが増したと思う
      • 今回、過去最強の武具が作れると思えるほど性能が壊れた印がいくつかある
  • 遊びやすさという点では、操作に関して細かい改善が行われていると感じた。
    • 壺に入れるアイテムの選択時に、装備しているアイテムの下から選べるようになっている。間違えて装備品を壺に入れてしまう事故が起こりにくくなってる
    • マップにどこを歩いたのかがマッピングされるようになっている。ので、罠を踏む可能性が少なくなってると思う(それでも未踏の場所を歩いて罠にかかるのが人間の性・・・)
    • アイテム欄にギタンがあって整理しても所持金に加算されなくなった!これは非常にありがたい機能改善だった
  • グラフィックに関しては、発売前から不安に感じてたとおり、微妙だった。
    • というか、インディーズで発売されるゲームのグラフィックがすごすぎて、それと比べてしまうと見劣りしてしまう。これなら、ドットでも良かったんじゃ無いかとも思ってしまうが、まあ比べてもしょうがない。
    • シレンとコッパの3Dモデルがなにやらガビガビしている。慣れればある程度は平気にはなってくるが・・・。
      • コッパの毛並みが非常に堅そう。ゴワゴワしてそう。
      • 金の剣なのに、見た目が木刀みたいに見えてしまう。
      • あと、ダンジョン内では陰に違和感があるように思う。アイテムに乗ったときアイテムの画像が差し変わるのが気になる
    • シレンに関しては、派手なグラフィックがウリなゲームでは無いので、そこまで欠点では無いものの。
  • 今回、おそらく富江慎一郎さんが関わる最後のシレンだと思うけど、若い人たちが多く参加して作り上げられたんだと思うし、それでこのシレンが出来たと考えると次回作も期待出来るなと感じた。
    • 次回作が出来るかどうかも今回の売り上げ次第なのかな。

シェケナダム、初野良カンスト達成!!

  • 1/21のシフトで、シェケナダムの野良カンストを初めて達成!これで野良カンストは5つ目。残るは魔境ドンブラコ・・・・。
    • 今回のシフトはこんな編成だった。
    • 重量級ブキ(ダイナモローラー)が入ってる編成で上位を目指すのはなかなか大変という印象はあったものの、対雑魚シャケで無類の強さを誇るダイナモだったのと、満潮シェケナダムの相性が良かったからか、同じ重量級ブキのハイドラント込みの編成の時よりも動きやすさはあったように思う。
    • 他のブキもスプラマニューバーとボトル、96ガロンで全部シューターなので動きやすかった。96ガロンについては射撃中の移動速度が極端に遅いから、周りをシャケに囲まれたり、インクの塗りが甘い場所で逃げるときに塗りながら逃げるって言うのがなかなか難しく苦戦した。
    • とはいえ、評価40スタートでは無く、評価300から始まったのに野良カンストまでの総バイト数は112回。800台を抜けるのに37回もバイトする羽目になり正直心が折れそうだった・・・。
  • 今回、立ち回り方について頭で分かっていたのに対応できていなかった部分がなんとなく出来るようになったのは良い収穫だったと思う。
    • 基本的には納品を楽にするためにオオモノの寄せを考える必要があるのだけど、評価が上がっていくと必要なイクラ数に対して湧くオオモノが非常に多くなってくるので、寄せの意識から処理効率を意識した立ち回りに変えていく必要がある。800台で長時間苦しんだ時に、途中でそういう意識の切り替えをしたら少し成功率をあげられた。
    • 今回800台でバイト中に気づいて立ち回りを変えたけど、正直600を超えてきたらもう処理優先を考えて良い気がする。
    • 処理優先であっても、海岸寄りで倒さずにコンテナ周りに上手く誘導してあげた方がいいオオモノもいるから、処理優先だと言っても見かけたオオモノを海岸で片っ端に処理していると今度は納品に困る結果になるだろうし難しい。