Movatterモバイル変換


[0]ホーム

URL:


mkdir blog && cd $_

ITエンジニアの雑感

carrierwave で webmock を利用する場合

carrierwave が利用されている箇所で、webmockを利用してstub化すると、指定していないIPアドレスへのリクエストをしてしまう。

     Failure/Error:...          WebMock::NetConnectNotAllowedError:       Real HTTP connections are disabled. Unregistered request: GET http://23.215.0.138/test.png with headers{'Accept'=>'*/*','Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3','Host'=>'example.com','User-Agent'=>'CarrierWave/3.0.5'}            You can stub this request with the following snippet:            stub_request(:get,"http://23.215.0.138/test.png").         with(headers: {'Accept'=>'*/*','Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3','Host'=>'example.com','User-Agent'=>'CarrierWave/3.0.5'}).         to_return(status:200, body:"",headers: {})============================================================

これは、carrierwave がResolv.getaddresses を利用して、指定された URL のドメイン名を IP アドレスとして解決するため。その IP アドレスを使ってリソースを取得しようとしている。

cf.)

stackoverflow.com

なので、Resolv.getaddresses をmockして固定のIPを返す必要がある。

before

    beforedoWebMock.enable!WebMock.stub_request(:get,"http://example.com/test.png")        .to_return(body:File.new(Rails.root.join("spec/fixtures/test.png")),status:200,headers: {"Content-Type" =>"image/png"          }        )end    afterdoWebMock.disable!end

after

    beforedoWebMock.enable!      allow(Resolv).to receive(:getaddresses).with("example.com").and_return(["5.5.5.5"])WebMock.stub_request(:get,"http://5.5.5.5/test.png")        .to_return(body:File.new(Rails.root.join("spec/fixtures/test.png")),status:200,headers: {"Content-Type" =>"image/png"          }        )end    afterdoWebMock.disable!end

特定のGemのPatchバージョンのみを最新にする方法

Gemのバージョンアップをする場合に、ある特定のGemのPatchのみを最新にしたい場合がある。よくその方法を忘れるのでメモしておく。

$ bundle update{gem名}--conservative--patch

オプションについては以下を参照する。

cf.)

bundler.io

解決策:Ubuntuパッケージのインストール障害への対応

CircleCIで、

...commands:setup:steps:-run:name:"apt-get install -y"command: |            sudo apt update -y            sudo apt-get install -y --fix-missing pkg-config imagemagick libmagick++-dev p7zip-full...

を最初に実行してパッケージのインストールをしていた。

先日の archive.ubuntu.com の障害以降、archive.ubuntu.com への接続が不安定になった。

https://status.canonical.com/ をみると正常に稼働している。世間的にも大きな問題にはなっていないが、なぜかCIで並列実行しているといくつかのJobで、以下のようなエラーとなり正常に終わらずに困った。

sudo apt update-ysudo apt-get install-y--fix-missing pkg-config imagemagick libmagick++-dev p7zip-fullGet:1 https://download.docker.com/linux/ubuntu jammy InRelease[48.8 kB]Get:2 http://archive.ubuntu.com/ubuntu jammy InRelease[270 kB]                Get:3 http://archive.ubuntu.com/ubuntu jammy-updates InRelease[128 kB](中略)E: Failed to fetch http://archive.ubuntu.com/ubuntu/pool/main/libw/libwmf/libwmf-0.2-7_0.2.12-5ubuntu1_amd64.deb403  Forbidden[IP:185.125.190.8380]E: Failed to fetch http://archive.ubuntu.com/ubuntu/pool/main/libw/libwmf/libwmf-dev_0.2.12-5ubuntu1_amd64.deb403  Forbidden[IP:185.125.190.8380]E: Sub-process /usr/bin/dpkg returned an error code(1)Exited with codeexitstatus100

色々と試したが、結局↓のようにして解消をした。

sudosed-i.org-e's|archive.ubuntu.com|ubuntutym.u-toyama.ac.jp|g' /etc/apt/sources.listsudo apt update-ysudo apt-get install-y--fix-missing pkg-config imagemagick libmagick++-dev p7zip-full

ただ根本的な原因等は依然として不明のままなので、気になっている。

Railsのcomposed_ofの使い方

Railscomposed_of の使い方をメモしておく。

巷にはcomposed_ofの説明がたくさんある。しかし自分が調べてもサクッと分からず、自前で実装して確認したことを残しておく。

railsdoc.com

前提

  • composed_of にする対象のカラムはjson

実装例

  • class_name のValueObject(モデル)にインナークラスを利用する場合には、class_name: "ExternalSetting::ServiceConfig" のように指定することで利用できる。
  • mapping にはマッピングをしたい[%w(当該モデルのメソッド名 class_nameで指定したValueObjectのメソッド名), ... で指定する
  • ValueObjectの中で構造体を利用してJsonのデータを設定できるようにする
# == 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?

Session Managerログインイベントの取得と出力方法

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

docs.aws.amazon.com

docs.aws.amazon.com

組織再編とスクラム開発

組織再編があった。まだ完全移籍ではなく2ヶ月ほど現チームと新チームの半々の状態で働くことになっている。新チームにジョインして1週間時点での状況と考えを残しておく。

異動先チームは、様々な事情から2ヶ月ほどメンバー1名で運用保守と開発をしていた。そこに自分がジョインして2名体制で開発をすることになった。

スクラムをするべきか?

異動前のチームでは(なんちゃってではあるが)スクラム開発をしていた。それなりに良い循環が出来ていたので新たなチームでも採用したいと考えていた。

まず、スクラムがマッチするかどうか、エッセンシャル スクラムで紹介されているクネビン(カネヴィン)フレームワーク で考えてみる。

ざっくりと内容を抜粋すると以下のような内容になる。

クネビンフレームワーク

  • 複雑な領域
    • 物事を予期できないことのほうが多い。正解があるとしても、後でふりかえって初めてわかる。
    • スクラムは、特にこの複雑な領域に取り組むのにうまく当てはまる。
  • 込み入った領域
    • 専門家が活躍する適切なプラクティスの領域になる。
      • e.g) システム全体のパフォーマンスを最適化するためにパラメータを調整するような作業。
    • シックスシグマのような戦術的・定量的アプローチの多くは特にうまくいく。
  • 単純な領域
    • 誰の目にも因果関係がはっきりしている。
    • スクラムは単純な問題にも用いることができるが、この場合は最も効率的というわけではない。適切に定義され、反復可能な手順が組み合わせられたプロセスを用いたほうがうまくいく。
  • カオスな領域
    • 危機に瀕しているので、これ以上の被害を食い止め、何らか秩序を回復するために素早い対応が求められる。
    • スクラムではうまくいかない。作業のバックログの優先順位を付けて、次のイテレーションでやるべき作業を判断するような状況ではない。
  • 無秩序
    • どの領域に自分がいるのかわからなければ、それは無秩序な領域にいる。この領域は危険である。
    • 残念ながらこのアプローチはソフトウェア開発ではほとんどうまくいかない。無秩序な領域から脱出するためには、状況を構成要素に分解して、それぞれをその他の4つの領域に当てはめることだ。

感じた課題

  • タスク管理が出来ていない。
    • チケットはあるがゴールが曖昧で属人的になっていた。
    • 優先度付のバランスが悪い。フレームワークのアップデートをしておらず、EOLになる
  • QAでの不具合が多い。
  • リリースのスケジュール管理が出来ていない。他チームとの兼ね合いがある点を考慮しても改善の余地がある。せっかく実装してもリリースされずに滞留している。

クネビンフレームワークに当て嵌めて考えると、「複雑な領域」になりスクラムにマッチしていそう。

en.wikipedia.org

最後に

成功した事例を、どんな環境にも柔軟に合わせて再度成功させることが出来るような、再現性が高い人間になりたい。

異動前のチームでは、品質が高く一定の頻度でリリースをする安定した開発が出来るチームへとリード出来た。

前提や環境が全く違うが、異動先のチームでもその再現をしていきたい。

Git Log Command Reference

Pull Requestのレビュー指摘を修正した後に、コメントで修正したコミットのハッシュを記載している。コピーするのが手間なので、コマンドでの手順をメモしておく。

前提

環境はMac

手順

  1. 直近N件のログをコミットハッシュと件名を出力する:$ git log -N --pretty=format:"%H %s"
  2. コミットハッシュをクリップボードにコピーする
    • 直近の場合:$ git show --pretty=format:"%H" --no-patch | pbcopy
    • N件前の場合:$ git show HEAD~N --pretty=format:"%H" --no-patch | pbcopy

e.g.)

直近N件のログをコミットハッシュと件名を出力する

$ git log-3--pretty=format:"%H %s"7fe68ebba167b4927bcd0636cc39379ca4e28fc2 :add: foo5efda28a322259427ff676e8d7f976a686af5479 :add: barb7d7fdd2b472c008de448ceb7c94be8695dc4e0b :update: baz

直近のコミットハッシュをコピーする

$ git show--pretty=format:"%H"--no-patch | pbcopy

3件前のコミットハッシュをコピーする

$ git show HEAD~3--pretty=format:"%H"--no-patch | pbcopy

参考

git-scm.com

注目記事
検索

引用をストックしました

引用するにはまずログインしてください

引用をストックできませんでした。再度お試しください

限定公開記事のため引用できません。

読者です読者をやめる読者になる読者になる

[8]ページ先頭

©2009-2025 Movatter.jp