「開発者向けの MySQL 入門」という勉強会をしました

 今、自分が所属している会社では、いわゆるフルサイクルなアプリケーションエンジニアがほとんどで、SRE のような、システムを運用改善することを専門にするメンバーは居ません。一方でそれなりにプロダクトの数は多く、各種ミドルウェアの運用で困っているのを見かけることがあります。

 色々な人が似た問題に悩むのはもったいないので、「MySQL を運用したことがある人からすると、こういう考え方をする」という風な目線で勉強会を行いました。せっかくなので社内の情報を抜いたうえで公開します(同じようなことを色々な場所で言っていて、その都度作り直しているから……というのもあります)。

speakerdeck.com

 ちなみに DB のどこで悩むかはだいぶ業界ドメインに左右されると思っています(それはそう)。ゲーム業界なんかは、激しくスパイクするワークロードな上にミスったときの機会損失が激しいので、シャーディングをしたいし、出来るだけインフラコストを下げつつ運用したいというのが関心事でしょう。なんなら DBA が居ますよね。しかしうちはそうではなく、規模自体は小〜中規模程度なので、「片手間でなんとか運用するには」という助けになればと思って書きました。あと EXPLAIN の読み方なんかはいくらでも良い資料が見つかるので書いていません。

 間違っているところ等あればこっそり教えていただけるとありがたいです。

独学 CISSP 受験の記録

せっかく合格したので、受験の記録を残しておきます。

モチベーション

最近、会社で AWS 環境のマネジメント・ガバナンス強化に取り組んでいます。具体的には Organizations, IAM Identity Center, CloudTrail, Config, Control Tower, Security Hub といったサービスを触って、多数ある AWS アカウントのセキュリティのベースラインを引き上げようとしています。

セキュリティを専門とする方が居れば良いのですが、残念ながら今のところ会社には居ません。代わりの実務者としてちょうどいいポジションに居るのが自分なのですが、自分がやるにしても、基本を外さないように体系的に知識を身に着けたいし、せっかくなら「この人はちゃんと勉強しているんだな」という客観的な証明も欲しいです(いつか来る転職活動でも使えるかもしれないし)。

そこで、セキュリティエンジニアの求人でもよく見る CISSP 試験を受けてみることにしました。https://cybersecurity-jp.com/column/21726 や、類似の記事を見る限り、そこそこ難しい試験に位置しているようなので、良い目標になるかなとも思ってのトライです。

お前誰

  • 200 人ぐらいの規模の事業会社に居る、0x20 未満の自称インフラエンジニアです。
    • オンプレ・クラウド共に経験しています
    • 簡単な Web アプリケーションなら書けます
  • 目安になりそうな資格を挙げると、IPA はセキュスペ・デスペ、AWS の試験は SAP on AWS 以外の全て、GCP の試験は PCA, PDE を取得しています。
    • 目標を決めて計画的に走るのは多分得意なほうです、というアピール(?)です

勉強した期間

 期間は 3 週間程度です。平均して平日は 2 時間, 休日は 6 時間ほど充てました。合計すると 80 時間ぐらいでしょうか。ゼルダの伝説の新作をずっと我慢しながら勉強していました

試験対策の流れ

 ドメインガイドブックを読んで試験範囲を確認し、参考書で内容を理解し、問題集でアセスメントするという王道パターンです。

0. 情報収集

いずれも、勉強を始めたころに読み込みました。勉強のペースを掴むうえで、めちゃくちゃ参考になりました。「試験そのものについて語ることが出来ない」CISSP の試験の特性上、どれぐらいやれば合格できるかはおぼろげなので、こうした記録は落ち着いて受験するためにも大事でした。この記録もまた、自分と似た背景の人の役に゙立てばいいと思って書いています。

1. 公式問題集(日本語版) の模擬問題をやる

自分の位置を測るために、まずは公式問題集の模擬問題 1 をやってみたところ、初回で 7 割少々の得点率でした。

アメリカの法律のような CISSP でないと中々触れないような(?)設問はともかく、技術的な設問に関してはさほど難しくないように感じたので、案外スタートラインは前の方にありそうと判断し、そのまま試験日を設定しました。

一度落ちても再受験できるキャンペーンがあり、金額的にさすがに落ちるとショックなのでこれを利用しました。もともとの受験料からして高いのにね……

その代わり、試験は 3 週間後と(自分にしては)やや早めに設定しました。「CISSP は試験勉強があんまり役に立たない」という言葉を目にしたことがあり、仮にそうであれば作戦を練り直せるので、その意味でも早く受けたほうが良いかなと思ったからです。

2. ドメインガイドブックを確認する

https://japan.isc2.org/files/CISSP_DomainGuide2022.pdf です。何が出題されるのかが分かっていないと不安で仕方ないので、あらためて一通り確認しました。

3. Eleventh Hour CISSP®: Study Guide を読む

全体像を掴むため、参考書に 『Eleventh Hour CISSP®: Study Guide』 なる書籍を利用しました。日本語版の公式ガイドと迷いましたが、どちらも 2021 年の改定前のものですし、軽量なものの方が挫折しにくいかなと思ってこちらを選びました。 休日 2 日を使って一気に読みました。よくまとまっていると思います。でも後述する Youtube のビデオも同じぐらいよく出来ているので、ここはスキップしても良かったかもしれません。

4. 公式問題集(日本語版) を解く

CISSP 公式問題集』が今回の主力です。2 周しました。1 周目は 1 日 1 ドメインを目安に、間違ったものは復習することのほか、正解した設問もなぜ他の選択肢が不正解なのか理解できるように調べることを徹底しました。各ドメインは 65%-80% ぐらいの得点率でした。

2 周目は間違った問題だけ復習するようにして、1 日 2-3 ドメインを目標にサクサク進めました。得点率は 9 割ぐらいでしたが、解答とセットで暗記してしまっている気があったので、これぐらいでちょうど良い気がします。

5. その他、ためになったもの

tex2e さんの勉強ノート

https://tex2e.github.io/blog/security/cissp-notes

神です。日本人の CISSP 受験者の勉強効率を大幅に引き上げているといっても過言ではないと思います。印刷して手元に置き、試験当日までスキマ時間に読み返すなどしました。

Pete Zerger さんという方の Youtube ビデオ

https://www.youtube.com/watch?v=_nyZhYnCNLA

英語のリスニング能力に自信が無かったので、概要欄からダウンロードできる投影資料を流し見しただけですが、各ドメインのおさらいにちょうど良かったです。かうさんの勉強会 Discord から知りました。

かうさんの勉強会 Discord

https://qiita.com/kau/items/913184212c571943cc92#%E5%8B%89%E5%BC%B7%E4%BC%9A

CISSP 受験者の集う Discord です。なんだかんだで時間が合わず、勉強会には一度も参加していない実質 ROM 専ユーザなのですが、「他にも勉強している人がいる」という励みになりました。

6. 試験当日

西新宿の試験会場で受験しました。

試験時間は 6 時間と設定されてますが、2 時間 30 分ほどで終わりました。途中で休憩するためにお茶などを用意していたものの、むしろ途中で休憩を挟むことで集中が途切れそうだったので、一気に解きました。「ま、再受験できるバウチャーあるから…… 今回落ちてもまた受ければいいから……」と気楽に構えていました。

終了と同時に合格の旨が印刷された紙を渡され、一安心しました。

その他、感想など

  • SRE らしいバックグラウンドがある場合、想像よりも取得のハードルは低いと思います。多少コードが書けてインフラも組めるのであれば、全体の半分ほどを占める技術系のドメインの勉強には苦労しないと思います。

  • あっさり合格しているように見えますが、もともと(セキュリティに限らず)雑食的に技術書を読むので、そうした積み重ねがあったからな気はします。例として、直近半年ぐらいに読んだ、この試験に関連しそうなものを挙げます。どれも今回の試験に役立っています。

  • 実務として、まれにセキュリティチェックシートの記入を求められる(正確には自分が記入するわけではなく、記入する人から「この質問、どういうことだと思います?」と聞かれる)ことがあり、セキュリティチェックシートってどういう由来でこんな項目があるんだろうねー、と考え調べたこともあります。AWS Config などを触り、"CIS Benchmarks" や "Control" といったドメイン 1 っぽい用語の定義、考え方に慣れていたのもプラスでした。あれ、結構やってるな……。

  • 総じて勉強は楽しかったです。基礎となる考え方に触れられたことが良かったです。試験前日に https://japan.isc2.org/files/CISSP_DomainGuide2022.pdf を再読しましたが、「CISSP CBK を理解するためのエッセンス」の項に書かれていることが理解できたので「本当にそう!ぼくもそう思います!」となりました。

  • セキュリティエンジニアの方がどのように日々の鍛錬(?)を行っているかの解像度も上がりました。次は脆弱性診断で利用される Burp Suite や OWASP ZAP のようなツールの理解や、Hack the Box などをやってみようかなと思います。

  • セキュリティエンジニア、募集しています!

Aliexpress で買った電子ペーパーを雑に動かす

dailyportalz.jp

この記事を見て、電子ペーパーめっちゃカッコいいな!と思ったのと、クローンを自作することが出来そうだったので衝動的に Aliexpress で諸々を購入した。とりあえず今は、bmp ファイルを無事に表示できることを確認したところ。

買ったもの

3色の電子ペーパーモジュール GDEH042Z21

Raspberry Pi Pico

電子ペーパーの種類が混沌としていてよく分からない

 この電子ペーパーを動かす際、 RES スイッチをどちらにするか(3Ω or 0.47Ω)と、ドライバを調べる必要があった。まず前者だけど、データシートの Reference circuit の RESE に書いてある。GDEH042Z21 の場合 0.47Ω のようだ。

ドライバは面倒だった。というか未だにスッキリしていなくて「動いているからヨシ!」な状態。今の所、こちらのライブラリを使っている。

 様々なラインナップの電子ペーパーモジュールに対して、統一されたドライバがあるわけではなく、モジュールごとにドライバ(もとい IC )が異なっている。今回購入した GDEH042Z21 は UC8276 という IC を使っているけど、CircuitPython のドライバはない。300*400 で tri-color で 4.2 インチ のもの…… となると IL0398 なるものが見つかり、試しに書き込んでみたら動いてしまった。本当はちゃんとデータシートと命令セットを読まないといけないけど……。

 また、Aliexpress で電子ペーパーを選ぶ際、GooDisplay というメーカーと Waveshare というメーカーが人気のようだった。後々両者のデータシートを見比べてみると、パッと見中身は同じに見える。なぜだろう……。OEM 的な何かなのかな。

続・M5StickC Plus / 環境もろもろ測定デバイスを作った

何?

 環境もろもろ測定デバイスを作りました。温度・湿度・気圧・二酸化炭素濃度を測定します。ついでに Ambient というサービスにデータを送信して、グラフ化しています。

バイスの見た目はこんな感じ。

グラフの見た目はこんな感じ。

f:id:wrsn0:20210515134605p:plain

材料

ソースコード

github.com

ssid, password, channelId, writeKey を書き換えたら動くはず。利用しているライブラリのうち、以下は Library manager からではなく github 経由で利用しました。(M5Stack のライブラリ周りの乱立、もっとどうにかならんのか……)。

Ambient とは

 IoT データの可視化サービス。チャネルと呼ばれるデータの管理単位を作る・マイコンに送信用のコードを3行ぐらい書く だけでグラフが生成されるので、使い始めるハードルが非常に低く、プロトタイピングに便利。無料ユーザでも十分なチャネルを生成できるし、データも1年間保存される。エンドデバイスからのデータ受信監視機能や、アラート機能は有料ユーザ向けになっている。  色々書くよりも、チュートリアルを見たほうが手っ取り早いので、使い方については割愛します。

その他の感想

  • M5Stack Core2 や M5StickC Plus 等、現行のデバイスの組み込みの Wifi は 2.4GHz 帯にのみ対応している。5GHz のほうに接続しようとして出来なくて、少し焦った
  • Ambient 簡単すぎてすごい
  • 実は手元に ENV II Hat, ブレイクアウトボードの BMP280, Yun Hat があり、手元に合計4つの BMP280 がある(???)。ただいずれも微妙にセンサの個体差があり、特に湿度では ±5% ぐらいの差があった。補正したいところだけど、お手本にしたい計器がないので、特にやってない
  • 「1000ppm を超えるとブザーを鳴らす」というのも簡単に作れるけど、やらなかった。部屋を締め切って寝るときなど、ブザーを鳴らされたくないときがあるし、デバイス側にその仕組をもたせるとそのへんの機微を調整しづらいため。

M5StickC Plus + MH-Z19C の二酸化炭素計

前回に引き続いて、せっかくなので昨今流行りの二酸化炭素計を作りました。といっても先人の方の書かれたプログラムをほとんどそのまま使っているだけですが……。環境が少しずつマイナーチェンジしているので、対応したときに考えたことの雑なメモを残しておきます。

元ネタ

無印 M5StickC -> Plus へ

公式ドキュメントを見比べてみる。

M5StickC-Plus can use most programs of M5StickC. Due to hardware differences such as screens, please download the M5StickC-Plus library before compiling the program and modify the header file reference in the program as M5StickCPlus.h.

とある。ほとんどの M5StickC プログラムはヘッダファイルさえ書き換えれば Plus でも動くと言っている

-#include <M5StickC.h>
+#include <M5StickCPlus.h>

ピンマップの差分として、無印の G36 ポートが G25/G36 ポートに変更されている。今回は G36 ポートを Analog input として利用したいので G25 を floating とする。接続の際のピン配置は元ネタのままで大丈夫。

+// setup() 中の M5.begin() の後に書く
+pinMode(36, INPUT);
+gpio_pulldown_dis(GPIO_NUM_25);
+gpio_pullup_dis(GPIO_NUM_25);

LCD のサイズが 80 * 160 から 135 * 240 にサイズアップしたので、LCD への描画周りの調整が必要。こちらを参考にした。

ところで、一次ソースと思われる m5stack/m5-docsM5.Lcd.setTextFont についての記述が存在しない(2021/05/08 時点)のはなぜなんでしょうね……?一旦は気にしないことにします。

MH-Z19B -> MH-Z19C へ

データシートを確認する。

パッと見た感じシリアル通信でのデータ取得のコマンド (0x86-) は変わっていないけど、マイナーチェンジということでいくつか違いはある。例えば Detection range の下限が 400ppm, 上限が 5000ppm になっている。が、大気中の CO2 濃度は 400ppm 程度であること、1000ppm を超えると不快感を感じ始めるらしいことを考えると、実用上あまり気にしなくても良さそう。

元ネタで利用されているライブラリ MHZ19は MH-Z19C には対応していないようなので、以下を参考に MHZ_uart に差し替え。

ソースコード

動かしてみて

f:id:wrsn0:20210509005423j:plainf:id:wrsn0:20210509005437j:plain

  • 思った以上に面白いです。今までは "空気がこもっている気がするので窓を開けるか〜" 程度の感覚でやっていたので、この目安が二酸化炭素濃度という指標をもって定量化されるのがうれしい。人が居ると少しずつ ppm がきれいに増加していくし、換気すれば 400ppm 近くまで一気に下がっていきます。
  • IFTTT 連携して換気扇を回すなど、応用例もありそう。
  • 環境問題に関連し、CO2 排出量云々のお話をよく耳にしますが、二酸化炭素濃度も少しずつ上昇トレンドにあるようですね。このままだと20年後にはしょっちゅう換気する世界になっていたりするんでしょうか?
  • あまり見栄えが良くないので、100均でケースがないだろうか…… と探していたところ、3D プリンタで HAT を自作している方を発見。素晴らしい!早速買いました。自分も 3D プリンタ触ってみたいな

M1 Macbook Air で M5StickC Plus を動かす

M5StickC Plus - スイッチサイエンス を購入しました。昔、Arduino や 9DOF センサを使って電子工作をしていたので懐かしいです。今どきは LiPo バッテリもカラー LCD もセンサもちょっとしたインタフェースもくっついて3000円以下とは、隔世の感があります。

普段使いが M1 MBA (Big Sur) なので、その場合の環境構築の流れを書いておきます。M1 特有の何かを踏むことを予想していましたが、2021/05 時点では案外簡単でした。

セットアップ

基本的には 公式ドキュメント のとおりです。ただし、ドライバのインストールは不要でした。 以下の流れで進みます。

  • IDE のインストール
  • ボードマネージャ から M5Stack の追加
  • ライブラリ M5StickCPlus のインストール

IDE のインストール

  • Arduino IDE をインストールします。brew でも pkg でも何でもいいと思います。(2021/05 時点では v1.8.13)

ボードマネージャから M5Stack の追加

  • Arduino > Preference から、「追加のボードマネージャのURL」欄に以下を追加します。
https://m5stack.oss-cn-shenzhen.aliyuncs.com/resource/arduino/package_m5stack_index.json
  • ツール > ボード > ボードマネージャ から "M5Stack" と検索し、M5Stack パッケージをインストールします。(2021/05 時点では v1.0.7)

ライブラリ M5StickCPlus のインストール

  • スケッチ > ライブラリをインクルード > ライブラリを管理 から "M5StickCPlus" と検索し、 M5StickCPlus ライブラリをインストールします。(2021/05 時点では v0.0.2)

サンプルスケッチを焼く

  • シリアルポートを選択する
    • おそらく、/dev/cu.usbserial-XXXXXXX といった名前をしています。
  • ボードを選択する
    • ツール > ボード > M5Stack Arduino > M5Stick-C-Plus を選択。
  • 適当なサンプルスケッチを選ぶ
    • ファイル > スケッチ例 > M5StickCPlus から、M5Stick 単体で動作しそうなものを選びます。Basics > Display なんか良いんじゃないでしょうか。

ImportError: No module named serial が出たら

コンパイル時に以下のようなエラーメッセージが出た場合の対処です。

Traceback (most recent call last):
  File "/Users/wrsn/Library/Arduino15/packages/m5stack/tools/esptool_py/3.0.0/esptool.py", line 39, in <module>
    import serial
ImportError: No module named serial
exit status 1
ボードM5Stick-C-Plusに対するコンパイル時にエラーが発生しました。

どうやら Arduino IDE が python2.7 を使ってしまうようで、PATH を設定したりしていてもだめっぽい。といったことが community forum で議論されていたので、以下のコマンドを実行しました。

sudo pip3 install --target /Library/Python/2.7/site-packages pyserial

これぐらいの小さいサイズなので、動いているのを見るとなかなか可愛いもんです。 f:id:wrsn0:20210501172237j:plain

『データベースリライアビリティエンジニアリング』(通称DBRE本)を読んだ

DBRE 本を読みました。せっかくなので感想を書きます。 www.oreilly.co.jp

なお、この感想を書いている人間は DBA を3年ほど経験しています。

DBRE については、ざっくり言うと SRE の DB 版というイメージを持っています(単なるデータの管理者ではなく、コードを書いて仕組みを作ったり、他のロールと協業する人)。

どんな本?

従来の DBA (Database Administorator) はデータの管理者、門番という印象が強い。しかし昨今では、データベースそのものの進化に加え、IaC, CI/CD, クラウドインフラといった技術が主流になり、データベース管理(者)をとりまく状況は変わってきている。データベースの本質は「長期的に安定していること」(Reliability) であることに変わりないが、データベースもまた、他のインフラと同じように管理されることが期待されている。このギャップを埋めるための、基本的な概念を解説している書籍…… って感じでしょうか。原著は2017年に出ています。

感想など

目次を見ると分かりますが、前半はオペレーションについて、後半はデータベースを効率的に使用するためのアーキテクチャについて書かれています。SRE本 (O'Reilly Japan - SRE サイトリライアビリティエンジニアリング) と DDIA本 (O'Reilly Japan - データ指向アプリケーションデザイン) をデータベースという具体的なドメインで語りつつ、要約したような内容です。実際にこの2冊は参考書籍としても挙げられています。先にこの2冊を読んでいた場合、インプットとしては少し物足りなさを感じるかも?SRE本+DDIA本で約1200Pほどに対し、DBRE本は約1/4の分量なので、お得にエッセンスを学べるとも言えます。

個人的には、これまで自分が DBA をやってきたときの経験・考え方がいい感じに言語化されていて、読んでいてよい振り返りになりました。7章の「リカバリ戦略の解剖」のくだりを例に挙げると、

バックアップ戦略と呼ばずリカバリ戦略というのには、理由があります。リカバリこそバックアップの帰結となるものだからです。バックアップはその手段となるものであり、究極的には、リカバリの要求仕様に則って実行される必要があります。

これは本当にそのとおりで、"我々はつい気軽にバックアップという言葉を使いがちだけど、本当にやりたいのはデータの保護なんだから、暗黙的にリストアを包含してしまっていたな。たしかに、リカバリ戦略という言葉のほうが実態を表しているなあ……。" といった具合で、頷きながら読める本でした。 主に考え方・哲学を学ぶための本のように感じているので、もっと具体的な実装、ハウツーを知りたいのであれば、この本ではないかもしれないです。

DBRE のあり方として「チームの枠を超えて活動をしよう」と繰り返し述べられています。これは DBA をやったことがある人ほど耳が痛い話だと思います。実際に、開発チームと対立とまでは言わないけど、何らかの壁を感じることはありました。SWE からしたら DB の細かい作法まで守ってコードを書くのは大変ですし、DBA からしたら「なんでこんなクエリ書いちゃったんだ……」「なんでこんな設計でサービスインしちゃったんだ……」と愚痴ってしまうことはあったはず。DBRE らしくあるためには、データベースの世話をする人、面倒を見る人(ケツを拭く人)という気持ちを早めに捨てて、オープンに・積極的に議論に参加していくべきだなあー、と改めて意識できました。

蛇足

  • 英語

原著が発売されたのは2017年です。英語が読めないとそれだけ情報を得ることが遅れると考えると、読めるようになっておきたいなあと思いました。(2018年に Kindle 版の原著を買ったけど、積んでいました ^q^) 正直に言ってしまうと、やや古さを感じる記述がちらほらありましたが、発売当時に読んでいたらそうは感じなかったかもしれません。typo もそれなり。。

  • DBRE というポジション

知っている範囲では、日本では freee さんやビズリーチさん、海外では gitlab さんが DBRE というロールを設けているのを見ています。これらの JD を見たほうが分かりやすいのかも。https://about.gitlab.com/job-families/engineering/infrastructure/database-reliability-engineer/ など。

  • DDIA 本のすすめ

SRE 方面からこの本を読んで、データに関わるシステムの設計に興味を持った方は、ぜひ『データ指向アプリケーションデザイン』も読んでもらいたいです。DBRE 本の 10章-12章 にあったような話題が非常によくまとまっていました。この本の魅力は、もう他の方によりだいぶ語られているので、ここでは話しません。