2022年の振り返り
仕事
4月からSREチームに異動した。お前がやってるの転職じゃなくて転社だよ!の中間形態です。
インプットする情報が変わると人の思考は変わるのだなというのを感じた一年であった。
バックエンドとして働いていた時は、モデリング、DDD、データ整合性について考えることが多かったがSREになってからはCPU、OS、コストについて考えることが多くなった。
チームメンバー全員が技術に関心があり議論できる環境なのは恵まれているとヒシヒシと感じる。
異動前に少しの間スクラムマスターをやっていたが、やりたいこととアンマッチしていたというのは別で振り返りたい。(自分からやりたいと言った。俺が悪かった。あれは間違いだ!)
チーム異動して成果を発揮できるか心配だったが杞憂だった。(給与が下がらなかったため。)
理想と現実とのギャップを明らかにし課題を発見する。進むべき方向があっているか検査するためチェックポイントをタスク開始時に設定する。といった汎用的なスキルを身につけていたのが大きかったように思える。また、バックエンドの知識を活かした取り組みなど自分が価値を発揮しやすいところを探して目標設定するみたいな社会人っぽい動きもした。
異動後に新規構築タスクを2つ任せてもらえたのでSREの仕事全体を早めにキャッチアップできたのも大きかった。やりたいと言ったら信頼して任せてもらえるチームメンバーや上司には感謝しかない。
とはいってもインフラやSRE活動面では、チームメンバーとの知識ギャップがありTakerになっているので、何かしら分野でGiverになりたい。
技術面では、以下のような成長があった。
- 怪しさ満載だが体験が良いJPINでJava学ぶことでinterfaceに対してプログラミングするという言葉の意味がやっとわかった。
- [試して理解]Linuxのしくみ 第一版やコンピュータの構成と設計の下巻を読むことでCPUやメモリについて理解できた
- K8sや周辺ツールを基礎知識
- AWS SAAやTerraform Associate試験を通して基礎知識をつけることができた
- ガベージコレクションについて理解した。ガベージコレクションのアルゴリズムと実装は、いいぞ!
- インフラを管理するとコスト意識を持つようになり財務諸表を読めるようになった。
SREをやっていくには、人を動かすようなスキルが必要ということを理解したので人格形成が課題だ。また、顧客やプロダクトのことを深く理解してSLOを設定するためのアプローチを確立できていないのも課題なのでやっていきである。RDRAを駆使してSLO設定できないか?というアイデアを持っているので深めていきたい。
人生
進捗なしです。
マッチングサービスを使ってみるかと思いPairsに登録してマッチングしたりしなかったりした。(この構文誰が始めたのか謎。流行表現になってる。)
大抵の男は何も考えず右スワイプすると思うのだが、マッチングした後に特に返信内容が思いつかないので、まあ軽く1週間ぐらい放置し1週間経つと返信しなくなるというループを繰り返していた。1万円で右手の稼働時間を増やしたのでヨシとしたい。まずは、右手から運動していこうな。
後半は、メッセージのやり取りがないDineを使っていたがトークスキルのなさを感じる結果となった。日々精進です。右スワイプは継続中。
女体に興味ないのでは?という鋭い指摘を飲み会でされた。興味あるはず!多分ね。。。人に興味ないのもかも?
交友関係は、良好だった。
社を離れた人と定期的にシズラー行ったり、飲みに行ったりした。ユナイトもな!
大学時代の友人とも定期的に交流している。
「つなげーと」というサービスを利用して、外に出る機会を作っている。イベント以降遊びに行くことが皆無なのだが、一人だけ仲良くなって1月にスノボーに行くことになった。大切にしていきたい。
自分が好きなことを一緒にやってくれる友達を見つけたい。スノボーや日本酒を飲みに行ける人ね。
まとめ
まあ、人生なので色々ある。そろそろ社会人5年目になるので、2023はキャリアを考える年にしていきたい。
週報 12/20-12/26
技術メモ
1Podで複数コンテナが動いている場合、以下は1つのコンテナに対してシェルを取得する。
kubectl exec pod_name -it /bin/bash
- CORSとCSP違い
- Aというサイトをブラウザで表示しているとする。Aでは、B APIにリクエストする。
- BがAからのリクエストを許可するのが、CORS
- AがBへのリクエストを許可するのが、CSP
- https://developer.mozilla.org/ja/docs/Web/HTTP/CSP
- https://docs.uipath.com/orchestrator/lang-ja/docs/cors-csp-configuration
- サーバーを役割ごとに分ける理由は「性質に合わせてサーバースペックや台数を調整することができる」だと思っていたが、ログの観点もあるらしい。
- serverlessだとドメイン貧血症になるのでは?と思って聴いた。必要なモデルだけlabmdaにアップロードすると思っていたが、10GBアップロードできるので困ることはなさそう。
- RDRAの復習
コレオグラフィーパターン
- 各コンポーネントが決められた振る舞いを持っている。
- https://learn.microsoft.com/ja-jp/azure/architecture/patterns/choreography
- https://d1.awsstatic.com/serverless-jp/contents/202102_EDA_steps_patterns.pdf
- 以下は、他のコレオグラフィーの説明と合致にしない気がしてる。
lambdaのblue/greenデプロイどうやるねんと思って調べた。関数をversioningできるので、これを使って実現できそう。
- diadogタグ
- https://twitter.com/sushi__melody/status/1601118365518467072?s=20&t=NhVcOZiTTF4pTQNdc5RLRQ
- https://developer.mozilla.org/en-US/docs/Web/API/HTMLDialogElement
- dialog.openの初期値は、false。close処理をListenしているタグをdiadogタグ内に書かないと閉じることができない。
<dialog id="Dialog"> <p>Hello Dialog</p> <div> <button id="close">close Dialog</button> </div> </dialog> <div> <button id="open">open Dialog</button> </div> <script> (() => { const openButton = document.getElementById("open"); const closeButton = document.getElementById("close"); const dialog = document.getElementById("Dialog"); function openCheck(dialog) { if (dialog.open) { console.log("Dialog open"); } else { console.log("Dialog closed"); } } openButton.addEventListener("click", () => { dialog.showModal(); openCheck(dialog); }); closeButton.addEventListener("click", () => { dialog.close(); openCheck(dialog); }); })(); </script>
- reactを完全理解したい時に見るべきやつを発見した
日記
- アプリケーションコードを書いている時はリファクタリング好きだったが、IaCのリファクタリングはテンションが上がらないという不思議
- リンク集販売サービスと飲みたい日本酒からお店を探すことができるサービスを作ろうと思う。年末に作るぞ!!!
- 開催しているRuby内部構造の勉強会が次回で最後だ。しばらくは、勉強会開催するの控えたい。理由は、まあ色々ある。
- Dineでマッチングした。前回の反省として以下があるので、トレーニングを積んでいきたい。
- 興味ない話に興味のあるふりをできないという社会性のなさ。
- 自分の深掘り力が足りないのも良くないと思うので、コーチングの書籍読むとかする。
- 記憶力が皆無なので、読んだ本やアニメ、ドラマ、映画の内容を覚えておらず話題が続かない。5minぐらい話せるのは、大学の歴史か豆腐カレーのことぐらい。
- 記憶が定着しない理由を考えた。インプットした後にアウトプットをしていないが悪い。映画を一人で見るな。友達と語り合え。ブログを書け。
- 興味ない話に興味のあるふりをできないという社会性のなさ。
- Dineでマッチングしたが、返信来なかった。一回休み。
- 年末は足元を見られて物価が高騰するので、勉強や内省をしたい。3月に台湾行きたいので調査するぞ!
- フロント強い人があれであれしてるので、TypeScriptやブラウザの勉強してフィードバック得るという作戦もありだな〜と思ってる。
- 社の人と漫画の話をした。みんなの好きなコンテンツを知れるのは良い。
- M-1とかいう最強の娯楽。Youtube配信してる。これ読んでいるお前も免許奉納していけ!
- ハリーポッターを見たくなった。せいやさんの着眼点はすごい
- 2019年に社の人と飲んだ店に再訪した。残っているのは僕だけ。それぞれの人生を再度交わせる。最高に楽しかった。次は、僕の退職した時に集まるそうです。
- クラブで踊った。(例のアレです。察して下さい。)何事も経験。
- カジュアル面談を受けることになったので、業界知識をインプットできる書籍を読んだ。賃金安すぎて辛い….。国に大きく依存している業界の開発について根掘り葉掘り聞いていきたい。
- 勉強ばかりしていて遊んでないので、遊んでいくぞ!
- 3年ぶりに歯医者に行った。金を稼いでいてよかった。
読んだ本・記事
- The Amazon Builders' Library
- https://scrapbox.io/mikutas/ オススメ
- ゼロから分かる! 図解日本酒入門
- これ一冊でわかる! 介護の現場と業界のしくみ 第2版
- https://www.youtube.com/watch?v=q2wESM38i6M&t=2s
- https://aws.amazon.com/jp/blogs/news/build-a-cqrs-event-store-with-amazon-dynamodb/
- https://qiita.com/hirokidaichi/items/53f0865398829bdebef1
- https://zenn.dev/tatta/books/5096cb23126e64/viewer/b0ba7c
- 「ソフトウェアアーキテクチャーの基礎」6-7章
- システム運用アンチパターン
- 社で読んでいたやつが完結した。
今週のお店
https://tabelog.com/ibaraki/A0802/A080201/8000161/
https://tabelog.com/tokyo/A1305/A130503/13012817
今週の英語
- hinder: 妨げる
週報 12/12-12/19
技術
- アドベントカレンダーを書いた
- OIDC周りの復習をした
- コナーセンスという用語を知った。関数内の意味のある値を定数にしたいというのが、言語化できた。今まで感覚的にやっていることが言語化されてるのは良い体験だ。
- S3のOACとOAIについて調べていた。そのうちブログを出します。
S3暗号化のメリットがよくわからないとなった。チームメンバーから責任共有モデルのためでは?という意見が出た。技術的な議論をできるチームはよい。
-
- サブドメインまで一つの証明書で賄うことができる
- https://jprs.jp/pubcert/about/wildcard/
日記
- 食べログで評価の標準があるの良いとなった。みんなに入力してほしいので、設定する前までは目立つ場所においてほしい。
Herokuの404ページが、開発意欲を上げてくるのでよい
- Laprasからきたスカウトが興味をそそる分野だった。GovTech面白そう。昔は、教育に興味あったが今は薄れてきている。転職するなら、ミッションクリティカルな分野や知識をアウトプットする人が多い会社が良いな〜とぼんやり思い始めた。
- 来週は、飲み会が多いので楽しみだ。
- 親からピスタチオが送られてきた。感謝。
読んだ本・記事
- 「ソフトウェアアーキテクチャーの基礎」3-5章
- 「食べる!SSL! ―HTTPS環境構築から始めるSSL入門」1-2章
- https://qiita.com/nuko-suke/items/50ba4e35289e98d95753
- https://inside.dmm.com/entry/2022/12/16/improve-legacy-app-mon
- https://cloudacademy.com/library/amazon-web-services/
今週の英語
日本語で過ごした。
週報 12/05 -12/11
技術メモ
- ひたすらGCの勉強をしていた。
- ポインタ型に、intを代入できるのなぜ?という疑問が生じたので調査した。NULLは、0のアドレスを指す。NULL代入と同義のようだ。
- AWS CLI V2からlessコマンドが必要になった。以下どちらかで回避できる。https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-usage-pagination.html
AWS_PAGER
-no-cli-pager
- JSONは、最後までfile.readしないとparseできないのでサイズが大きいとメモリを大量に消費すると知った。CSVでline毎に処理しよう
- OOMなどでEC2にログインできなくなった時に、コンソールスクリーンショットが原因調査に役立つと知った。
日記
- 豆腐カレーの旨さを求めて2つの施策をおこなった。料理もアジャイルに。
- 絹豆腐の利用
- 豆腐カレーに絹豆腐を使うのは、スキルが必要だと気づいた。https://twitter.com/imaharuTech/status/1599615717451927552
- ルーを変える。社の人からグリーンカレーを試せすべしというアドバイスをもらった。
- 絹豆腐の利用
- お湯が出るようになった。人類が費やした努力の結晶を享受します。
- 10月分のネット料金払い忘れていたので、2時間程ネットが利用できなかった。
- 友達と忘年会を企画した。飲みたい日本酒でググるとなかなか店が見つからない。「都内 銘柄の都道府県 日本酒 居酒屋」で検索するとよい。
- https://www.hayashisyuzo.com/ が飲みたい場合は、「都内 富山 日本酒 居酒屋」である
- 700円のわかめスープを出す店に、気軽に通えるように稼いでいくぞ!
読んだ書籍
- ITエンジニアのための伝わる文章力ドリル
- 考える技術・書く技術―問題解決力を伸ばすピラミッド原則
- 「ソフトウェアアークテクチャーの基礎」1-2章
- システム運用アンチパターン
- 情報のため込み:ブレントだけが知っている
読んだ記事
https://i.loveruby.net/ja/rhg/book/gc.html
https://netmark.jp/2022/12/2022-12-05-13-43.html
http://matsu-www.is.titech.ac.jp/~endo/gc/gc.pdf
https://go.dev/doc/effective_go#interfaces_and_types
https://go.dev/ref/spec#Interface_types
https://qiita.com/advent-calendar/2022/memory-chan
今週の英語
週報 11/28-12/04
大週報時代の波に乗ることにしました。これを見たお前もやったりやらなかったりしていけ。
https://qwyng.dev/posts/20221127/
https://shifumin.hatenadiary.com/entry/2022/11/06/200000
https://log.chroju.dev/2022-1-2649042839c24aaaab5d130542ec8bf3
技術メモ
- assume roleしているroleを調べるときに便利。SREになって覚えたデバッグ術とか整理したい。
$ aws sts get-caller-identity
- Kinesis Firehoseでバッチ処理的なことができるらしい。試したい。
- WEB+DB PRESS Vol.117 page.130
- 完全に理解しました。
ディスク周りの調査コマンド集
$ df -h # ディスク使用量を調べるコマンド。ファイルシステム単位 $ df -i # ディスクinode数などを調べるコマンド $ du -sh ./ # ディスク使用量を調べるコマンド。ファイル単位 $ free # メモリ使用量を確認するコマンド $ swapoff -a # /etc/fstabでスワップとして認識されているデバイス領域を無効にする。ディスクが溢れた時に使うと良さそう。
linux snap mount
ECSのデバッグ方法。task定義とclusterだけは、ECS Execできない…。ちょっと不便だ。
# タスク定義にFARGATEを指定していると、--launch-type。 # awsvpcを指定していると、--network-configurationの設定追加が必要。 $ aws ecs create-service --cluster cluster --enable-execute-command --task task --desired-count 1 --service-name service_name --network-configuration 'awsvpcConfiguration={subnets=[subnet],securityGroups=[sg]' --launch-type FARGATE $ aws ecs execute-command --cluster cluster --command "/bin/sh" --interactive --task task $ aws ecs describe-tasks --cluster cluster --tasks task | jq '.tasks[].enableExecuteCommand'
- Advent Calendarに向けてガベージコレクションの実装方式の一つであるマーク・アンド・スイープの実装を進めていた。頭で理解していると実装できるとの間には、大きな壁があるんだな〜と改めて感じた。RVAULEのptr先のバイト列もGC heapのメモリを利用すると思っていた。今の理解は、以下
- さっとググった範囲では、golangでenum型を定義することができない?color2は、コンパイルエラーになってほしい…。どうにかならないものだろうか
package main import ( "fmt" ) type Color int const ( Red Color = iota Blue Yellow ) func main() { var color1 Color = Yellow; var color2 Color = 10; # コンパイルエラーになってほしい fmt.Println(color1) fmt.Println(color2) }
日記
- 食事制限のため豆腐カレーを食してる。水は切れば切れるほど旨い。不足した栄養素は、金曜日にシズラーで帳尻を合わせる。
- 海外の企業に履歴書出すのやってないので、やっていきたい。英語の履歴書を書くのってめんどくさいじゃん….
- ポケモンは楽しい。ポケモンは、スピンオフ。ポケットモンスターが本家。ポケモンリーグ行く前に図鑑を埋めたい。
- インフラ業のセルフサービス化推進に伴い、業務でドキュメントを書く機会が増えた。人に動いてもらえる文書書くトレーニングを積みたい。
- https://youtrust.jp/ に登録した。今のところ魅力がわかってない。知り合いが今何しているか知れるのは少し嬉しい。各位転職先を公開したり、しなかったりしろ。
- AWSを使ったインフラ構築できる副業先を見つけたい。
- 社会人になって初めてIT系以外の友達ができたかもしれない。
- 整体で教えてもらったストレッチを続けたおかげで、2週間経っても肩こりがなかった
- 突然お湯が出なくなったので管理者会社に給湯器を修理してもらうことになった。止血策として電子ケトルでお湯を沸かして風呂に入った。人間本気になれば、電気ケトル2回分で風呂に入れる。風呂桶は、2.5Lという知見を得た。
- JAISTで科目履修するために書類を書いた。石川の授業を受けることができるのか不明なのでメールか電話で確認したい。電話の方が早そう。受けたいのは、以下2つ。曜日時限が被ってるので、無理そうか?
- 計算機アーキテクチャ特論 Computer Architecture
- オペレーティングシステム特論 Operating Systems
- 給湯器の修理が完了する12/8まで銭湯に通うことなった。入れ墨をしている人を毎日観測するので、多分50人に1人は入れ墨してる。
- すずめの戸締まりを観た。正直、特段感想がない。面白かった。面白かった以外の深いコメントができない。もっと、語彙力と感受性を磨いていきたい。
読んだ記事
https://lab.astamuse.co.jp/entry/2018/03/15/114500
https://techlife.cookpad.com/entry/2018/05/10/090000
https://creators.bengo4.com/entry/2022/11/29/083000
https://blog.studysapuri.jp/entry/slo-burn-rate-monitoring
https://note.com/n0mimono/n/n548fac74f8e7
https://qiita.com/c60evaporator/items/2f24d4796202e8b06a77
今週の英語
- https://medium.com/swlh/good-tech-lead-bad-tech-lead-948b2b806d86
- grungy: 汚れた
- roadblocks: 障害
- make sure: ~ を確認する。~ するようにする。
- foregone conclusions: わかりきっている結論
- persuade: 説得する
- hamper: 妨げる
- recap: 要約
ISUCON9にて、nginxのaccess_log Directives設定が反映されない際の対応
予選用イメージファイルを利用したインスタンスの起動を参考に、AWSに環境構築した。その後、ベンチマークを流したがaccess_log
の出力先にログが吐かれない。
上記を問題を解決する方法がわかったので、ブログに残しておく。
解決策
80番ポートをlistenさせる。
$ cat /etc/nginx/sites-enabled/isucari.conf server { access_log /var/log/nginx/isucon.log; listen 80; # 追加 listen 443 ssl; server_name isucon9.catatsuy.org; ssl_certificate /etc/nginx/ssl/fullchain.pem; ssl_certificate_key /etc/nginx/ssl/privkey.pem; location / { proxy_set_header Host $http_host; proxy_pass http://127.0.0.1:8000; } }
その後、EC2のパブリック IPv4 アドレス
を benchmarkerの target-url
と target-host
に渡せばよい。
$ pwd /home/isucon/isucari $ ./bin/benchmarker -target-url http://public_ip_address -target-host public_ip_address
解説
ベンチマーカの説明から、デフォルトtarget-url
と target-host
は以下の通りである。
-target-host string target host (default "isucon9.catatsuy.org") -target-url string target url (default "http://127.0.0.1:8000")
デフォルトでは、アプリケーションに対して直接ベンチマーカを実行するため、nginxを経由しない。そのため、/var/log/nginx/isucon.log
にログが吐き出さない。
解決策は、nginxを経由するようにベンチマーカにオプションを渡すことだ。
解決策に至るまでのプロセス
ブラウザからアクセスすると、アクセスログにログを吐く。ベンチマーカを実行するとログを吐かない。
このことから、ベンチマーカはNginxにリクエストしていない可能性があると考えた。仮説を元に、ドキュメントを読み解決に至った。
アドバイスほしいところ
以下のように、https
に対してベンチマーカを実行したかったが、証明書問題を解決できなかった。 https
に対して、ベンチマークを実行する方法を知っていればコメントもらいたい。
$ ./bin/benchmarker -target-url https://public_ip_address -target-host public_ip_address
文字集合とエンコーディングについて説明してみた
MySQL徹底入門 第4版 MySQL 8.0対応を読んでいる
11章 CharSetの紹介で、文字集合とエンコーディングを合わせたものがCharSetであると記載されているが、各用語の意味が理解できていなかったので言語化してみた
現実世界の文字集合をコンピューター世界の文字集合に写像させたい この時、コンピュータ世界の文字集合は数値として表現される つまり、現実世界の文字集合を数値集合に写像したい この数値集合の元を文字コードと呼ぶ エンコーディングは、写像する時の関数である
間違っていたら、Twitterでメンションなど頂けると幸いです
gemのコードリーディング手法
sidekiq-cronを題材にする
いつも調べてしまうので、自分用メモとして残しておく
# Gemfile # frozen_string_literal: true source 'https://rubygems.org' git_source(:github) { |repo_name| "https://github.com/#{repo_name}" } gem 'sidekiq' gem "sidekiq-cron", "~> 1.1" gem 'pry-byebug'
# debug.rb require "bundler/setup" Bundler.require hash = { 'name_of_job' => { 'class' => 'MyClass', 'cron' => '1 * * * *', 'args' => '(OPTIONAL) [Array or Hash]' }, 'My super iber cool job' => { 'class' => 'SecondClass', 'cron' => '*/5 * * * *' } } Sidekiq::Cron::Job.load_from_hash hash
bundle install --path vendor/bundle
を実行後、vendor/bundleの該当箇所に、binding.pryを差し込む。その後、ruby debug.rb
を実行
require "bundler/setup"
と Bundler.require
が肝です。後は、普段開発しているように地味にデバックしていくだけ
GitHub上で、レビュアーにアサインされてるPRを一覧で見る方法
PullRequestページのフィルターで、以下のように入力すればよい
is:open review-requested:@me
branch間の移動を数字で行う方法
メモ書きです
git checkout branch-name
で、いつもbranch移動をしていた。
branch移動は、頻繁に行うため簡略化すると生産性が向上するので、調査を行った。以下のAliasを追加すればよい。
$ cat ~/.gitconfig [alias] b = "! git branch | cat -n" sbn = "!f() { branch_name=$(git branch --format='%(refname:short)' | head -n $1 | tail -n 1); git checkout $branch_name; }; f" # switch branch by number