「若手に新しい技術を学ばせる」んじゃないんだよ、まず先に自分で学ぶんだよ
— magnoliak🍧 (@magnolia_k_) 2022年11月8日
自分が技術を学ぶために、プライベートの時間を使うべきか、みたいな話は自分で考えよう、としか言えないんだけど、人に学んでもらうためにどうするか?というと、思いつくのはこれくらいなんだよなぁ。
学びは強制できないよね。
「若手に新しい技術を学ばせる」んじゃないんだよ、まず先に自分で学ぶんだよ
— magnoliak🍧 (@magnolia_k_) 2022年11月8日
自分が技術を学ぶために、プライベートの時間を使うべきか、みたいな話は自分で考えよう、としか言えないんだけど、人に学んでもらうためにどうするか?というと、思いつくのはこれくらいなんだよなぁ。
学びは強制できないよね。
説明のために手順を確認したので、その覚書。
$ git clone git@github.com:isucon/isucon12-qualify.git
値上げが最近話題になりましたが、個人利用は無料です。
次回はRancher Desktopを試してみます。
一箇所だけ書き換えないと、起動しません。
Docker Hubから「mysql/mysql-server:8.0.29」のイメージが無くなっていて、MySQLが起動できません。8.0.30以降のバージョンを指定しましょう(無くなった理由は探せませんでした...)。
2022/11/06追記
mysql-serverのバージョンを上げるPRを作って、それが取り込まれたので、これからクローンした場合は、上記の修正は不要となっています。
また、Go言語以外の言語で動かす場合は、webappのサービスに指定されているbuild
のパスを言語に合わせて書き換えます。
コンテナを起動します。
$ docker-compose up
初期データを展開します。
benchのコンテナにrootでログインします。
$ docker exec -u 0 -it isucon12-qualify-bench-1 bash
isucon
ディレクトリへ移動して、initial_data.tar.gz
をダウンロードします。
$ cd /home/isucon $ curl -LO https://github.com/isucon/isucon12-qualify/releases/download/data%2F20220712_1505-745a3fdfb5783afc048ecaebd054acd20151872d/initial_data.tar.gz $ tar xvf initial_data.tar.gz
docker-compose.ymlのvolumes
セクションで用意したストレージの権限がrootになっていて、このままだとアプリの実行時に権限エラーになるので、まとめて書き換えておきます。
$ chown -R isucon:isucon /home/isucon
一回抜けて、isuconユーザーで再ログインする。
$ docker exec -it isucon12-qualify-bench-1 bash
最後に、初期データを準備する。
$ cd /home/isucon/data
$ make build-for-docker-compose
これで準備完了。
$ cd bench
$ ./bench
初期スコアを確認して、あとはチューニングを始めましょう。
当日のマニュアルは熟読しましょう。
そもそもアプリケーションの仕様が分からないと何もできないので、じっくり読みましょう。
webapp
以下のディレクトリは、ビルドのたびにホストマシンのリポジトリの内容がコンテナ内のストレージにコピーされてからビルドが開始されます。
なので、アプリケーションコードの修正は、慣れた手元の環境でやると良いでしょう。
用意ができたらISUCON本を見ながら、チューニングを始めましょう。
network_mode
をhost
指定すると、本当のホストマシンであるmacから見えなくなってしまいます。せっかく作り込まれたフロントエンドの画面が見れないのはちょっと寂しいので、別の手段で環境を構築してみましょう。ネットワーク構成を作り直しても良いでしょう。useradd
コマンドでグループ名を指定しない時の挙動が分からなかったので、調べたところ、/etc/default/useradd
に書かれていました。そこなんだ?# The default behavior (when -n and -g are not specified) is to create a # primary user group with the same name as the user being added to the # system.
2022/11/6 追記
MySQL 8.0.29の件、いくつか情報をいただきました。なるほどー酷いバグだ......
8.0.29、AWSのRDSでも選べなくていくつかクラッシュ系のバグがあった気がする
— でえもん (@dmnlk) 2022年11月6日
ISUCON12予選問題をdocker-composeで起動する - Magnolia Tech https://t.co/yOONoANRee
あんまり大きな声では言えませんが、運用に支障が出るレベルの問題があったので公開停止しました。
— tkyk04 (@taka_yuki_04) 2022年11月6日
どういうことがあったのかな?というのは30以降のリリースノートのbug fixedを見て予想してみてください。
答えの一つはコレです
— tkyk04 (@taka_yuki_04) 2022年11月6日
> InnoDB: After upgrading to MySQL 8.0.29, a failure occurred when attempting to access a table with an instantly added column. (Bug #34233264)https://t.co/JFQr9ZKQf8
mysql 8.0.29消えてるんですね…(いろいろ問題あったバージョンみたいです) あとでリポジトリ直しておきます。ありがとうございます
— fujiwara (@fujiwara) 2022年11月5日
というわけで、PRを作成しておきました。
あと、Docker Desktop for Macのネットワークについても情報をいただきました。
Docker Desktop for Macとnetwork_mode: hostの問題はもしかしたら違うかもしれませんが、docker compose v2(docker composeとハイフン無し)ならアクセスできた気がします。今出先なので不正確ですが https://t.co/2xLgSzXNva
— とっとこラム太郎🐑 (@mackee_w) 2022年11月6日
docker-compose
と、docker compose
は違うとは......こちらも引き続き調べてみたいと思います。
現在では、docker-compose
と、docker compose
は同じV2を向いているようです。
Docker Desktop for Mac 4.13.1をクリーンインストールしたところ、docker-compose
もV2を使う設定が最初からオンになっていました。
設計の「why」を言語化できる人は強いんですよ
— magnoliak🍧 (@magnolia_k_) 2022年10月29日
っていうか、驚くくらい「why」が上手く表現できないんですよ、普通は
— magnoliak🍧 (@magnolia_k_) 2022年10月29日
手順は言えても、なぜ?が言えない
設計において、すべての決定について仔細に「なぜ、そうしたか?」を言えるべきなのだけど、これを上手く言語化できない人は多い。「このプロジェクトでは以前からそうしているから」「そうするのが当たり前だと思っていた」などなど、本当に理解してないまま「設計という作業」を進めている人もいれば、上手く自分の行為を言語化できないだけの人もいる。
また、必ずしも自分が設計したことについて説明する場面ばかりとも限らない。既に存在する設計から「なぜ」を類推するしかない場面もある。他人のコードを読み取るときに、振る舞いだけでなく、「なぜそうしたのか?」が分からないと、その後にどんな改修を加えれば適切になるのかは分からないからだ。「振る舞い」と「根拠」を同時に読み取る必要性が出てくる場面が多々ある。
だからこそ、設計の「why」を言語化するために、そもそも「なぜ?」が言えること、それを表現するテクニックを持っている人は設計における強い人と認識される。
「設計レビュー」、設計された結果を見るものではなく、「どんな要求が有って、どんな検討プロセスを経て、どんなメリット・デメリットを考慮したか?」を聞くものなんですよ
— magnoliak🍧 (@magnolia_k_) 2022年10月29日
「設計を取り巻く環境・構造」を正しく認識できていることにレビュアーと、レビュイーが合意できれば、そこでレビューはほぼ終わったも同然な訳です。
でもこれは、「才能」ではなく「教育と経験」によって培われるものなので、できない人は、その機会をまだ十分に得られていないだけ、と捉えるべきなんですよ https://t.co/4Ne2TYaRp6
— magnoliak🍧 (@magnolia_k_) 2022年10月29日
で、それがコミュニケーション力と言えるのかもしれないけど、これは完全に「教育と経験」で一定の底上げができるものなので、意識的にやっていくとよいのです。
「道具を見つめてもどのように使えば善いか悪いかは道具自体が教えてくれない」という本質的な話があります。なぜその手段が必要かどのように使うと善いかなどの目的や価値については方法から逆算すればするほどわからなくなるんです。行き着く先は宗教・哲学・文学。それが語れる人は強い。 https://t.co/cdoIU0ddL6
— 加藤潤一(かとじゅん) (@j5ik2o) 2022年10月29日
そして引用RTでいただいたご意見がまた興味深いので、貼っておきます。みなさま、ありがとうございます。
アインシュタイン曰く
— 加藤潤一(かとじゅん) (@j5ik2o) 2022年10月29日
> これこれであるという知識は、これこれであるべきだ、ということへ直接通じる扉を開いてはくれないのです。
> こうこうであるということの知識を、いくら明瞭に完全にもつことができても、人間の願望の目標であるべきかを、それから演繹することはできないのです。
— 加藤潤一(かとじゅん) (@j5ik2o) 2022年10月29日
> 客観的な知識は、ある種の目的を達成するための、強力な道具を提供してはくれますが、究極的な目標そのもの、およびそれに到達しようとする憧れは、他の源泉から生まれねばなりません。
— 加藤潤一(かとじゅん) (@j5ik2o) 2022年10月29日
コストを筆頭に、設計は様々な要素とのトレードオフなので、なぜその選択が妥当だと判断したのかを多角的に言語化する能力が求められる。 https://t.co/ML84pWpo0j
— ミノ駆動 (@MinoDriven) 2022年10月29日
設計ってあらゆる決定事項に意思がないと弾かれるイメージ
— yas (@yas98303392) 2022年10月29日
なんでこの数字にしたの?
なんでこのパッケージ使ってるの?
といった内容に応えられないと、、、 https://t.co/bdCMN2gYyx
whyが言語化されてない設計ってヤバそうだなぁ、、
— Yukio🦀 (@AYukiEngineer) 2022年10月29日
ノリでDDD, 一応MVC的な https://t.co/fpyTWYnXl3
「What」をしているのかを聞いたときに、「How」ではなく「What」を的確に説明できる人も類する気がする。 https://t.co/r0KGW6J8uC
— みり🎗🕊ITストラテジー🕊🦴 (@MiryGoAround) 2022年10月29日
「なぜそう思うの?」とラダーダウンしていって、それ以上答えられなくなった最後のところにそのひとの価値観がある。
— ゆめみん || yumemi (@yumemean) 2022年10月28日
今までFluentdは全然使ったことが無かったこともあり、先日出版された『Fluentd実践入門』を読み始めました。
入門と謳われていますが、単なるインストール方法から基本的な使い方までを一通り説明して終わり、というような内容ではなく、そもそも「Fluentdとは何か」「どんな機能があるのか」「なぜそのような機能になっているのか?」「プロダクションレベルで運用するために何をすればいいのか」「プラグインはどうやって作るのか」と、500ページ近いボリュームで実践的な内容が網羅されています。
特に、第1章の「Fluentdとは何か」は、興味深くて、大量のデータをストリーム処理するための知見(バッファリングや、リトライ)がコンパクトにまとまっていて、ここを読むだけでも設計の「学び」が有ります。
第1章以外も至るところに、「なぜこういう設計になっているか?」ということが語られている箇所が多数登場するので、「あーなるほどー」と感心するところが多い1冊ですね。
複数のサーバが協調して動く環境で「上手くいかない時にどうするか?」を設計できているか否かで運用性が全然違ってきます。この辺りは良い設計を見て学ぶしかないので、単にFluentdのことを理解するだけでなく、実践的な設計の理解、という意味でもお勧めです。
sys.env
という関数が用意されていて、実態はSystem.getenv()
をScalaのMapのインタフェースで包んだものが得られます。immutableなので、書き換えることはできません。
存在しない環境変数を参照と例外が送出されますので、参照する際はgetOrElse
でデフォルト値を必ず与えておくと良いでしょう。
短いので、Scala 2.13のソースコードをそのまま貼り付けてしまいます。
def env: Map[String, String] = Map.from(System.getenv().asScala).withDefault { v => val s = System.getenv(v) if (s == null) throw new NoSuchElementException(v) s }
Mapとして丸っとコピーするには環境変数は大きいので、必要な物だけアクセスすればいいのでは?ということで、scala.util.Properties
に、envOrElse
関数が用意されてます。
これも短いので、該当箇所をまるっと貼り付けてしまいますが、以下のようなコードになっています。
def envOrElse(name: String, alt: => String) = Option(System getenv name) getOrElse alt
sys.env
の方がタイプ数が短いのだけど、若干「なんかScalaっぽくない」感じがするので、scala.util. Properties
を使った方が好みです。また、ScalaやJDKのバージョン取得用のメソッドが用意されていたりと、便利なメソッドが用意されているので、scala.util. Properties
のメソッドは一通り見ておくと良いかも。
アーキテクトは、過剰なアーキテクチャを作りたくなってしまう衝動と戦わないといけないのですよ
— magnoliak🍧 (@magnolia_k_) 2022年10月15日
すべてはトレードオフなんですよ
— magnoliak🍧 (@magnolia_k_) 2022年10月15日
何かに関心を集中させると、何かの要素が薄くなっていくんですよ
それが何かを判断しないで、無限にやることを増やそうとしても、暗黙のうちにできていないことが増えていくだけなんですよ
でも、一回くらい過剰に作り込んで失敗しないと分からない感覚でもあるよなーとも言える
— magnoliak🍧 (@magnolia_k_) 2022年10月15日
何を以て、過剰か、というと定義しづらいけど、「作る物が増え過ぎて、品質保証が終わらない」「動かすために優先度が低い部分が作られない」「動く時は動くけど、動かない時は中途半端に動かない」「そもそも運用するために理解すべきことが多過ぎる」などなど...「本当にこれは必要なのかな?」と疑問に思う瞬間が訪れた時、「過剰」が存在するのかもしれない。
そして、「過剰」が発生するのは、このような分断があるからでは?と言えるかも。
これまでR&DとDevとOpsが別れてて、DevとOpsは一体化に向けて進んできたけど、R&Dはまだで、でも一方で不確実性が上がってるのに「プロなんだから一発で完成させられるでしょ?」みたいな期待値に対してはR&Dも一体化じゃない?PoC込みで計画するよね?みたいな価値観の変化が必要かなぁとか
— magnoliak🍧 (@magnolia_k_) 2022年10月14日
振り返って「最適なアーキテクチャだった」と言い切るのはけっこう難しいけど、「最適ではなかった」ということは気付きやすいので、そういう言語化は大事だなーと。