TILS 2024 まとめ
Redis インスタンスを変更するため Sidekiq の予約ジョブマイグレーションで使えるかもでやってみた
code:dump.sh
redis-cli -u redis://src.redis:6379 --raw dump some-key:schedule | head -c -1 > backup.dump
cat backup.dump | redis-cli --user some_user -u redis://dist.redis:6379/5 -x restore schedule 0
ランニングシューズ 500km, 700km で買い替えて、のような風説
問題があったときにその場でパッと取りたい(取れる状況にある)というときにはaws cliで取得できるワンライナーあるといいな
ecsta list --cluster some-ecs-cluster
ECS Auto Scaling Policy で max, min capacity が設定されていれば desired count は影響を受ける
The service scheduler respects the desired count at all times, but as long as you have active scaling policies and alarms on a service, Service Auto Scaling could change a desired count that was manually set by you.
Sidekiq 6 は redis gem のバージョン依存があり < 5, >= 4.5.0となっている
info コマンドが打てるのは v5 以上
最小再現をするとき gem install some_gem -v x.x.x でバージョン指定するのを忘れない
Sidekiq 6 で redis-client をアダプタに変更する
code:sidekiq.rb
# Sidekiq 7 へのアップデート時にはデフォルトクライアントが redis-client となるため不要
Sidekiq::RedisConnection.adapter = :redis_client
Sidekiq.configure_server do |config|
config.redis = { url: ENV.fetch("AWESOME_REDIS") }
# ...
end
SIDEKIQ_REDIS_CLIENT 環境変数で切り替えられることもできるが、コードのアップデートと距離が遠くなりそう
Sidekiq のスケジュールジョブは Redis ZSET(ソート済セット型) を使っている
v22 の変更が熱かった
CJS(require)/ESM の互換性をもたせられるオプション
一貫性が先でコストは二の次
つい実行短縮を目指しがちだが一貫性がなくなってはしかたがない
GitHub Actions
GitHub Actions でジョブの概要追加が任意の環境変数に書き込むことで可能ということがわかった $GITHUB_STEP_SUMMARY
調査下手くそ問題
460 はクライアントからの切断、Nginx では 499 なんでやねん
Ruby 3.4 までは構文追加がされることはない(パーサのため)
テスト
fakeAsync テストが保留中のタイマーイベントタスク(キューされたsetTimeOutおよびsetIntervalコールバック)を持ったまま終了すると、 テストは失敗し、明確なエラーメッセージが表示される
テストはキューにタスクが入っていない状態で終了する必要があるため、保留中のタイマータスクが予測される場合は、 タスクキューをフラッシュするためにdiscardPeriodicTasksを呼び出してエラーを回避する
Standalone コンポーネントのテストで自らが依存をすべて知っているコンポーネントである場合にはそれなりの工夫が必要
Collects providers from all NgModules and standalone components, including transitively imported ones.
code:provider.ts
export function provideTestingModules() {
return [
importProvidersFrom(HttpClientTestingModule),
importProvidersFrom(ApolloTestingModule),
{ provide: FooService, useValue: jasmine.createSpyObj('doSomething') } ];
}
内科にいったが特に異常なしと診断だったのでメンタル面。動悸がおかしいときがたまにある(ような気がしているだけ?)
キンミヤ焼酎のストレートを飲み続けてしまったが、かなりダメな飲み方をしている。今日の体調が悪くて反省した
2度目の不眠症
買い物下手シリーズ
ランニング中に手元から落ちてガラスが割れる。Pixel 9 が出る前に Pixel 8 を買ってしまう、ケースを買い間違う
SQLを書くのに補完が効くのがうれしい
BQ独自の関数
Time.now, Time.zone.now はクラス違うんだってのを今まで知らなかった
Rails で扱える Timezone 一覧
ActiveSupport::TimeZone.all.map {|tz| tz }
tz.tzinfo などで環境変数 TZ への値を確認可能
Rails アップデートでモンキーパッチ
code:patch.rb
class ActiveSupport::TimeWithZone
class ErrorDepreCatedToSConversation < StandardError; end
alias origin_to_s to_s
def to_s(format = :default)
if format == :default
raise ErrorDepreCatedToSConversation
else
origin_to_s(format)
end
end
end
テストをコケるようにして検証
rails app:update マージ用のエディタは環境変数 THOR_MERGE の指定がないとマージできない
@suginoy: Rails で config/application.rb や config/enverironments/*.rb などの使わない設定は消さずににコメントアウトするのが自分的ベストプラクティスになった。バージョンアップ時の diff チェックが https://t.co/LI1erA4dSP の差分と app:update の結果との比較でかなり楽になる。 Rubocop の設定ファイルをまともに書いたことがなかったのでいろいろわかった
inherit_from: 別ファイルの設定を継承するときに使う( .rubocop_todo.yml がよく継承されている) チケットぴあ、今でもアクセス集中して見れないとかある
enconding/json パッケージにて json.Unmarshall するときフィールドは case-insentive らしい
Unmarshal時のGo struct fieldとJSON objectのキー名とのマッチングがでcase-insensitiveである。
preferring an exact match but also accepting a case-insensitive match.
お約束なエラー実装について: struct, error型を満たす Error() 実装など
Defined Type について
goroutine を使った実装をしてセマフォについて知る(lambdaにおけるHTTPリクエストの並行実行)
tkdn.icon ハマってしまったタスクでStagingにAttributeつけてデプロイしたりした
tracetest.InMemoyExporter 構造体でメモリ上の Span を記録できる
✅ HTTPクライアントがDNS解決、TLSハンドシェイクでどのくらいかかっているか見る
コードサンプル
GODEBUG=netdns=cgo のようなオプションを与えてビルドするとホストの getaddrinfo(3) を使う
Trace以外のログなどを突き合わせて見るのがきつい問題。Traceから一本釣りしたい
setTag でスカラー値ではない場合にけっこう圧の強い表示になるようになってた
https://scrapbox.io/files/67417ef9d774a1ba7fe8b750.png
SQLに IGNORE というキーワードがある
create, changed など見やすく差分を知りたい場合は tfcmt を使うと良い
tfcmt --output plan.md plan -- terraform plan
Terreform AWS Provider aws_security_group における name は若干コンソールで表示されるものとミスマッチがある
そもそも Optional なので指定がなければ Terraform がよしなにユニークな命名をする
https://scrapbox.io/files/6749d6264e5b81968fe95204.png
コンソール上では name = は Security group name 列に反映されて、Name は tag で指定された Name が入る
コミットをstep by stepで刻むとレビュワーの理解度が全然違うなと思ったので真似したい
PostgreSQL の ALTER TABLE では一番強いレベルのテーブルロック(ACCESS EXCLUSIVE)がかかるとドキュメントにあり、書き込みだけではなく読み取りの SELECT も影響を受ける
Only an ACCESS EXCLUSIVE lock blocks a SELECT (without FOR UPDATE/SHARE) statement.
ALTER TABLE … NOT NULL DEFAULT DDLにおいてはスキーマのメタデータからデフォルトを返す
DELETE/UPDATE 文に LIMIT を使えない
While there is no LIMIT clause for DELETE, it is possible to get a similar effect using the same method described in the documentation of UPDATE:
etc
sed で正規表現リテラルの / デリミタはバックスラッシュ以外の最初の文字なら何でもデリミタにできるの知らなかった
man sed
1.In a context address, any character other than a backslash (“\”) or newline character may be used to delimit the regular expression.
✅ PlantUMLで note にパイプ区切りを使うとテーブルっぽくなる
https://www.planttext.com/api/plantuml/png/XOzB2W8n343tEKKkqCMCEn6PyGZUeDC9fb1RRTDT3c_yW203RbzUoClKn5VfrmHpYe7G7V5KbZtENPYonE0bbendkdTg0ZP3PyvBth3QhUH60Ba8OOqN5a1KyKiYn-HNgeFogBpJBm-Kqg1Xr62KyehFPVZjCSXKqMztlUM3St_iJzzaP-pd1m00#.png
code:seq.ml
@startuml
Alice -> Bob: Authentication Request
Bob --> Alice: Authentication Response
note right
|table-header1|h2|h3|
|table-cell1|c2|c3|
end note
Alice -> Bob: Another authentication Request
Alice <-- Bob: Another authentication Response
@enduml
難しい課題の解き方を求められているわけではなく、ど真ん中でスタンダードな設計が求められているにもかかわらずアジャストする設計(を含んだ優位順のバリエーションの立案)にいたれる能力が不足している