Rails のcomposed_of
の使い方をメモしておく。
巷にはcomposed_ofの説明がたくさんある。しかし自分が調べてもサクッと分からず、自前で実装して確認したことを残しておく。
composed_of
にする対象のカラムはjson
型class_name
のValueObject(モデル)にインナークラスを利用する場合には、class_name: "ExternalSetting::ServiceConfig"
のように指定することで利用できる。mapping
にはマッピングをしたい[%w(当該モデルのメソッド名 class_nameで指定したValueObjectのメソッド名), ...
で指定する# == Schema Information## Table name: external_settings## id :bigint not null, primary key# external_service :integer default("default_setting"), not null# service_config :json# created_at :datetime not null# updated_at :datetime not null#classExternalSetting <ApplicationRecord composed_of(:service_config,class_name:"ExternalSetting::ServiceConfig",mapping: [%w(external_service service),%w(service_config config)],allow_nil:true ) enumexternal_service: {default_setting:0 }classServiceConfigattr_reader:service,:configDefaultConfig =Struct.new(:usase)dodeffoo? usase ==:fooend ....enddefinitialize(external_service, service_config)@service = external_service.to_i@config = service_configif service ==ExternalSetting.external_services[:default_setting]@default_setting_config =DefaultConfig.new(get_value(:usase))endendprivatedefget_value(key) config.present? && config[key]endendend
config = {usase::foo }external_setting =ExternalSetting.firstservice_config =ExternalSetting::ServiceConfig.new(external_setting.external_service, config)external_setting.service_config = service_configexternal_setting.saveexternal_setting.service_config.default_config.foo?
AWS CloudTrailからSession Managerでログインした内容をAWSCLIで取得する方法をメモする。
Session Manager でログインをすると、StartSession
というイベントになる。aws cloudtrail
コマンドでStartSession
のイベントを取得して、レスポンスからjq
で 時刻、ユーザー名、インスタンスIDを出力している。
$ aws cloudtrail lookup-events--lookup-attributesAttributeKey=EventName,AttributeValue=StartSession | jq-r'.Events[] | "\(.EventTime) \(.Username) \(.CloudTrailEvent | fromjson | .requestParameters.target)"'
2025-02-12T17:18:34+09:00 user_a i-0123456789a1b23e4562025-02-12T14:34:15+09:00 user_a i-0123456789a1b23e4562025-02-12T10:42:11+09:00 user_a i-0123456789a1b23e4562025-02-12T10:41:36+09:00 user_a i-0123456789a1b23e4562025-02-07T15:14:50+09:00 user_a i-0123456789a1b23e456
組織再編があった。まだ完全移籍ではなく2ヶ月ほど現チームと新チームの半々の状態で働くことになっている。新チームにジョインして1週間時点での状況と考えを残しておく。
異動先チームは、様々な事情から2ヶ月ほどメンバー1名で運用保守と開発をしていた。そこに自分がジョインして2名体制で開発をすることになった。
異動前のチームでは(なんちゃってではあるが)スクラム開発をしていた。それなりに良い循環が出来ていたので新たなチームでも採用したいと考えていた。
まず、スクラムがマッチするかどうか、エッセンシャル スクラムで紹介されているクネビン(カネヴィン)フレームワーク で考えてみる。
ざっくりと内容を抜粋すると以下のような内容になる。
クネビンフレームワークに当て嵌めて考えると、「複雑な領域」になりスクラムにマッチしていそう。
成功した事例を、どんな環境にも柔軟に合わせて再度成功させることが出来るような、再現性が高い人間になりたい。
異動前のチームでは、品質が高く一定の頻度でリリースをする安定した開発が出来るチームへとリード出来た。
前提や環境が全く違うが、異動先のチームでもその再現をしていきたい。
Pull Requestのレビュー指摘を修正した後に、コメントで修正したコミットのハッシュを記載している。コピーするのが手間なので、コマンドでの手順をメモしておく。
環境はMac
$ git log -N --pretty=format:"%H %s"
$ git show --pretty=format:"%H" --no-patch | pbcopy
$ git show HEAD~N --pretty=format:"%H" --no-patch | pbcopy
$ git log-3--pretty=format:"%H %s"7fe68ebba167b4927bcd0636cc39379ca4e28fc2 :add: foo5efda28a322259427ff676e8d7f976a686af5479 :add: barb7d7fdd2b472c008de448ceb7c94be8695dc4e0b :update: baz
$ git show--pretty=format:"%H"--no-patch | pbcopy
$ git show HEAD~3--pretty=format:"%H"--no-patch | pbcopy
社内の勉強会で実施したいテーマを考える。どうゆう軸で考えるべきかいつも迷う。
エンジニアチームの生産性の高め方 〜開発効率を向上させて、人を育てる仕組みを作る を読んで、「第6章 エンジニアリングイネーブルメント」の内容に興味を持った。本書にある「能力向上の取り組み」を自分なりに簡単に試してみる。
第6章にある「開発プロセスの全体像の定義」と「能力向上施策の定義と実施」の内容をザックリまとめると以下のステップになる。
簡易的だが開発ステップを洗い出してみた。
ステップ | 要件定義 | スプリントプランニング | 設計 | 実装 | スプリントレビュー | レトロスペクティブ | QA | リリース | 不具合・障害対応 |
---|---|---|---|---|---|---|---|---|---|
ファクター | 要求仕様 | 見積もり | ADR | コーディング | デモ | プロセスの改善 | デプロイ | 監視・モニタリング | |
プロダクトバックログ | 仕様書 | 設計レビュー | コードレビュー | メトリクス | |||||
テスト | ログ | ||||||||
CI/CD | |||||||||
リファクタリング |
開発ステップのファクターに必要なスキルをパッと思いつく限り書き出してみた。
ステップ | 要件定義 | スプリントプランニング | 設計 | 実装 | リリース | 不具合・障害対応 | リリース | 不具合・障害対応 | |
---|---|---|---|---|---|---|---|---|---|
ファクター | 仕様書 | 見積もり | ADR | コーディング | テスト | デプロイ | 監視・モニタリング | デプロイ | 監視・モニタリング |
スキル | UI/UXの知識 | 開発手法 | システム設計の知識 | Ruby | rspec | Docker | CloudWatch | メトリクス | |
ドメイン知識 | Go | go test | GitHub Actions | New Relic | ログ | ||||
React | Jest | CircleCI | |||||||
MySQL |
本来はチームメンバー全員のレベルを出すが、一旦は自分のスキルレベルを一部書き出してみる。
スキル | ドメイン知識 | 開発手法 | システム設計の知識 | Ruby | Go | React | MySQL | Docker | GitHub Actions | CloudWatch |
---|---|---|---|---|---|---|---|---|---|---|
レベル | 3 | 4 | 3 | 4 | 3 | 3 | 3 | 2 | 2 | 2 |
このフローに則れば、チームの業務に必要かつ向上すべきスキルが可視化できる。やみくもに勉強会のテーマを決めるよりも業務への即効性がありそうなので良いフレーミングだと思った。チームで早速試してみたい。
カオスエンジニアリング ―回復力のあるシステムの実践 をサラッと読んだので簡単に所感をメモしておく。
「カオスエンジニアリング」という言葉は知っていた。しかし、具体的な内容は認識していなかった。本書を通じて「カオスエンジニアリング」の理解を深めることが出来た。
まずはそのきっかけ。カオスエンジニアリングがNetflixの危機から誕生して、度重なる障害の中で段階的に成長していくことで形成されていった。そして、「カオスエンジニアリングの原則」というのあることを知った。
本書を読み進めていく中で、カオスエンジニアリングの説明でしっくりきた箇所を抜粋しておく。
その他、実際にカオスエンジニアリングをするにあたって、どう進めていくべきかなどの具体的な考え方や方法が参考になる、と感じた。
ただ、自分の組織ではまだカオスエンジニアリングを実践する段階には至ってはいない。しかし、考え方のエッセンスや段階的に取り入られる事はあると思った。
React Hook FormのhandleSubmitでEventを活用する方法をメモしておく。
typeformSchema=yup.InferType<typeofFooSchema>;exportdefaultfunctionApp(){const{register,control,handleSubmit,formState:{errors},} = useForm<formSchema>({ ...}, } )asyncfunctionfetchAPI( form:formSchema){ ...}functionhasError(errors:FieldErrors<formSchema>){returnObject.keys(errors).length >0;}const onClick = (_data:formSchema, e:any)=>{if (hasError(errors)){return;} setShowModal(true); e.stopPropagation(); e.preventDefault();}const onSubmit =async (data:formSchema)=> fetchAPI(data);return (<><form> ...<inputtype="submit"onClick={(e)=>{ handleSubmit(onClick)(e);}}/></form><SampleModal...onClick={async ()=>{ handleSubmit(onSubmit)();}}/></> )}
モーダルのボタンを押下するタイミングでもバリデーションが実行されてしまうが、onClick
でエラーがなければモーダルを表示するようにしているのでonSubmit
でバリデーションエラーにはならないはず。もっと良い方法があれば見つけたい。
引用をストックしました
引用するにはまずログインしてください
引用をストックできませんでした。再度お試しください
限定公開記事のため引用できません。