'sqr'atch-note

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

それPixelaでも出来るよ

zenn.dev

エンジニアたるもの、どうせならGithub に草を生やしたい

  • それPixelaでも出来るよ
  • というか、個人的にはGithubよりも記録に特化したPixelaに集約する方がより良いのでは?と思ったりする。
  • Pixelaは、commitという単位に縛られず、例えば水を飲んだ回数や量、一日に歩いた距離、もちろんGithubのcommitと連携する仕組みを整えればcommitで芝を育てることが出来る
    • 分かってしまえば面白いサービスなんだけど、初めての時はどうやって使った良いものかイメージしづらい気がする(少なくともぼくは)。そういうときには、このいろいろなサンプルが掲載されたページを眺めて自分がやりたいことに近い内容を探すと参考になると思う。
    • Useful case examples · a-know/Pixela Wiki · GitHub
  • ぼくの場合は、読書したページ数を記録している。去年8月から育て初めて現状はこんな感じ。
    • そして、こんな感じで今日と昨日(カッコ内)にどれくらい読んだか分かるし、これまでの累積、平均なども分かるので便利。
    • 各Pixel(一つのマス目)を参照すれば何時にどれくらい活動したかの記録も残っている
    • さらには、時刻だけでは無くPixelには10KBまでの情報を持たせることも出来て、読書記録であれば、その時に読んだ本のタイトルを記録することも出来る(はず)
  • ぼくは使っていないけど、Pixelaは時間の計測もできるでの、Togglのようなタイムトラッキングを実現できたりもする。
  • Pixelaの利用方法は、いちばん手っ取り早いのはcurlで呼び出してあげる方法なんだけど、iPhoneユーザであれば”ショートカット”アプリを使って実装できると思う

TILのやり方

『動かして学ぶGit 入門』読んだ

  • これまでつまみ食いで、必要な時に必要なコマンドをググって使っていたので、もうちょっと体系的にgitについて学びたかったので読んだ。
  • 割と良かった。
    • これまで作業ツリー、ステージング、リポジトリの概念が分かってなかったけど、読む前よりイメージが掴めた気がする。
    • この概念が曖昧だとgit操作で何をやってるのか曖昧になってしまう気がするし、そこがちゃんと分かったので良かった。
  • git checkoutの話
    • 本編、全体を通してブランチの切り替え、ファイルの取り出しはcheckoutを使って説明されている。
    • でも、最近ではブランチの切り替えにはswitchを、ファイルの取り出しにはrestoreのサブコマンドが追加されてるので、どちらかと言うとcheckoutよりも「何がしたいか」が明確なswitch, restoreのサブコマンドの方が個人的には分かりやすくて好き。
  • 本書の中であまり理解できなかったところは、ブランチのrebase部分。複数人の開発をほぼやったことがないため、よく分からなかった。
    • 多人数開発じゃなくても、個人でブランチ切りまくってゴチャゴチャやってる時にもrebaseは使えるとは思うものの、どういうツリーが良い状態かみたいな部分が分かってないので、rebaseの有用性が腑に落ちなかった感じ。

フレッツ光が引けなかったのでWiMAX +5Gを契約

新居でフレッツ光を引くことが困難だったため、Try WiMAXをやって十分な速度が出るなと検討した上でWiMAX +5Gを契約した。WiMAXの良い噂をあまり聞かないので不安があったけど、杞憂だったという話。

  • 新居には無料インターネットが付属していたが、もともと”無料”と言うだけあって、速度には全く期待していなかったのでフレッツ光を引くつもりで賃貸契約を結んだ。
    • 期待はしていなかったが、”みんそく”で同じ地域の速度を眺めていると意外にも検討していることが分かり、フレッツ光を引くまでも無いのかもしれないと少し期待してしまったが、蓋を開けてみたら無料の名に恥じない低速インターネットだった。
    • 日中帯は20〜30Mbpsくらいだったので全く使えないということもないが、夜はひどく10Mbpsを切るのもザラで、iPhoneでYortubeを見ようとしても再生が止まってしまうレベルの品質だった。
    • マンションまでは1Gbpsの光回線が引き込まれているが、そこから各戸に1Gbpsの有線LANが引かれている形態。もちろん有線であるため、レイテンシは20ms台で安定はしている。なので、純粋に使ってる人数に対して、大元の回線帯域が小さすぎるというのが原因だと思う。
  • そういうわけで、夜に10Mbps程度しか出ない回線を無料だと言っても使い続けるのは不可能なので、フレッツ光の引き込みを検討した(インターネットの速度は、呼吸のしやすさとほぼ同じなので、ずっと低速だと息苦しい)
    • フレッツの提供形式はマンションタイプでは無く、ホームタイプとなるため、光ファイバーを電線からマンションに引き込み、さらに居室まで引いていく必要があるという話になり、そのためにはオーナーの許可、管理会社とのいろいろな調整が必要だった。
    • 結局、管理会社との調整が(光回線の引き込み周りはよく分からないという感じで)困難を極め、しんどくなったため前から気になっていた5Gを利用した無線のインターネット接続サービスを検討し始めた。
  • ドコモのHome 5Gが気になっていたが、最近の首都圏など都市部でドコモ回線の品質悪化が話題になってたことと、居室で事前に5Gの速度がどれくらい出るのかの計測が出来なかったため、試用が出来るTry WiMAXを使ってみた。
    • 届いた初日に、PCとホームルータ(Speed Wi-Fi HOME 5G L13)を有線接続して速度計測した結果がこれ(平日AM 11:45ごろ)。
    • アンロード済みとロード済みのレイテンシの差が非常に大きいのが気になるが、無線のサービスであるため致し方ないのかもしれない。とはいえ、回線速度自体は十分という結果になった。
    • 土日の朝、昼、夜の回線速度も見てみたところ、流石に土日は200〜300Mbpsに落ちてしまうが、それでも十分な速度。
  • お試しで十分な速度が出ると分かったので、今回正式契約をした。
    • しかし、新しいホームルータが届いてTry WiMAXの筐体とほぼ同じ条件にして回線速度を測ってみたところ、Try WiMAX側は480Mbpsほど出たのに、契約した方は20Mbps程度しか出ないという、あまりにも期待外れの結果になってしまい思わず騙されたのか??とまで思ってしまった。あまりにも差が歴然なので、Try WiMAXのSIMは帯域制御をしておらず、契約した方は帯域制御しているのかと疑ってしまったものの、どういう理屈か分からないが「2〜3時間ほど放置していたら」Try WiMAXと同じ速度が出た。どうして??
    • 車のエンジンを"慣らす"とか、キャッシュを"温める"とか、そんな話が無線の5Gでもあるのか?と不思議には思ったけど、お試しの時と似た速度が出るようになって一安心した。
  • 以上、無線のサービスなので、これから先使ってる人が増えていくと速度も落ちていくとは思うけど、流石にマンション付属の無料インターネットレベルまでは劣化しないと願いつつ、WiMAXは期待してたよりも良かったという話。

『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部分は本書で読んでなるほどと思ったものの、インターネットで追加の調べ物をしているとやっぱり訳が分からなくなってくる。
    • とはいえ、本書の記述の問題では無く、メール技術が本質的にはらんでる闇だと思うので、あまり深入りしすぎないようにはしたいと思っている。

関連

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