【Ruby】【Clean Architecture】オープン・クローズの原則をRubyで書いてみた

はじめに

最近、クリーンアーキテクチャの話が話題に上がっており
「理解したつもりでもコードで示さないと理解したことにならない」
という気持ちがあったので簡単ではあるが、Rubyで書いてみました。

環境

前提条件

ruby コマンドで実行できること

実行

オープン・クローズの原則に沿っていないコード

clean_architecture_ruby/order_service.rb at main · Y-Fujikawa/clean_architecture_ruby · GitHub

# frozen_string_literal: true

class OrderService
  # OCP(オープン・クローズの原則)に反したメソッド
  # 新たな条件が追加された場合、既存メソッドを修正しないといけない
  def order(order_type = nil)
    case order_type
    when 'eat_in'
      # 店内の処理
      p '店内'
    when 'take_out'
      # 持ち帰りの処理
      p '持ち帰り'
    when 'delivery'
      # 配達の処理
      p '配達'
    else
      # それ以外
    end
  end
end

order_type = 'take_out'
OrderService.new.order(order_type)

オープン・クローズの原則に沿っているコード

clean_architecture_ruby/ocp/after at main · Y-Fujikawa/clean_architecture_ruby · GitHub

# frozen_string_literal: true

require_relative './order/eat_in.rb'
require_relative './order/delivery.rb'
require_relative './order/take_out.rb'

class OrderService
  def order(order_type = nil)
    order_type.call
  end
end

order_type = EatIn.new
OrderService.new.order(order_type)

clean_architecture_ruby/ocp/after/order at main · Y-Fujikawa/clean_architecture_ruby · GitHub

# frozen_string_literal: true

class EatIn
  def call
    p '店内'
  end
end
# frozen_string_literal: true

class TakeOut
  def call
    p '持ち帰り'
  end
end
# frozen_string_literal: true

class Delivery
  def call
    p '配達'
  end
end

まとめ

文字で説明するよりもコードの方がわかりやすくていいですね。
これを機にコード化できるところはしていきます。

参考

【iOS】【2段階認証】iOSの2段階認証を「Google Authenticator」から「Microsoft Authenticator」にした

はじめに

新しいiPhoneが発売されました。
早速、移行しようとしたしたのですが、単純にやってしまうと移行しなくて積む可能性があったので念の為確認していました。

その結果、以下が1番気をつけなければいけないようです。

上記あたりが1番慎重にやらないといけないもののようです。

  • モバイルSuicaは一旦削除して、新しいiPhoneで登録すればいけそう。
  • LINEはバックアップの手順が公式で書かれているので問題なさそう。

問題なのは「二段階認証アプリ」でした。
もともと「Google Authenticator」を使っていたのですが
問題点として iCloudにバックアップが取れない というところです。

iPhoneXSにしたときよりも2段階認証するサービスの数が増えており
仕事でも使うようになり、かなりの数となりました。

環境

調査

入れ替える条件は以下の通りです。

  • Google Authenticatorと同等以上の機能があるもの
  • iCloudでバックアップできるもの
  • 2段階認証アプリ自体にもFaceIDなどをつけられること(つけられなくてもOK)

結果

Microsoft Authenticator にしました。

Microsoft Authenticator

Microsoft Authenticator

apps.apple.com

まず、条件に全て満たしておりマイクロソフトから出ているというのがあったからです。
バックアップ方法について、個人用 Microsoft アカウント の作成が必要ですが
Gmailアカウントを使って作成できるので手間ではありませんでした。

ドキュメントは以下の通りです。

docs.microsoft.com

まとめ

パスワードつきでiCloudにバックアップを取っておいて
そのまま2段階認証もすべて移行できるようになりとても楽になりました。

【CloudFront】【Lambda@Edge】オリジンレスポンスでリダイレクト処理を入れる方法

はじめに

AWSでSPA(シングルページアプリケーション)のインフラ部分を作っているときに
要件として
「トップページやその配下のディレクトリにもページがある。ただし、ないディレクトリが指定されたらリダイレクトする」
という話をもらいました。

それまではトップページしかなかったので、トップページ以外の場合はリダイレクトしていたが
配下のディレクトリにも気を配る必要があります。

それを解決するために Lambda@Edge を使って対応してしました。
すぐに忘れてしまいそうなので簡単にですが手順をまとめておきます。

環境

前提条件

  • AWSコンソールにログインできること
  • Lambda@Edgeを作成できるIAMユーザーであること ※CloudFrontが設定されていなくてもいいが、設定されていると検証しやすい

調査

CloudFrontは以下の順で処理されます。

  • ビューアーリクエス
  • オリジンリクエス
  • オリジンレスポンス
  • ビューレスポンス

今回、コンテンツが取れなかった場合なので オリジンレスポンス に対して処理を追加していきます。

対応方法

AWSのドキュメントにやりたいことが書いてあったので、手順通り作成します。

Lambda@Edge 関数の例 - Amazon CloudFront

新規にLambda関数を作成する。

f:id:fujikawa-y:20201022104505p:plain

雛形を修正する。

f:id:fujikawa-y:20201022104532p:plain

AWSのドキュメントに書かれいてたコードを記述する。
そのままだとクエリストリングがそのまま渡ってしまうので不要な処理を削除する。

f:id:fujikawa-y:20201022104550p:plain

$LASTETではLambda@Edgeが使えないのでバージョンを作成する。

f:id:fujikawa-y:20201022104617p:plain

バージョンの発行が行われました。

f:id:fujikawa-y:20201022104637p:plain

この後は、作成済みのCloudFrontに紐づけてあげれば完成です。 紐付けるのはCloudFrontのオリジンレスポンスとなりますので注意してください。

まとめ

これでエラーページではなく、トップページに戻れるようになりました。

参考

Lambda@Edge 関数の例 - Amazon CloudFront

【Datadog】【Rails】Railsのログを出力するとき「日付とプロセスID、リクエストID」を出力されないようにする

はじめに

Webサービスの開発でDatadogのLog Managementを使うときの小ネタ。

lograge というライブラリを使い、Datadog Logsにログを転送していたのですが
標準ログ+JSONという形になってしまいLogsで自動で解析してもらえなくなってしまった。

なので、標準ログも含めたい場合JSONの中に入れてやると良いです。

環境

前提条件

lograge を使って何かしらログが出力されていること。

調査

logrageJSON化したにも関わらず、日付とプロセスID、リクエストIDが出てしまう。

I, [2020-08-24T15:54:36.321933 #1]  INFO -- : [95a6f86c-c6ca-45fa-a9e9-1e6ee241d034] .... 以下略

原因と解決方法

制御しているのは /enviroment/production.log にありました。

# Prepend all log lines with the following tags.
config.log_tags = [:request_id]

# Use default logging formatter so that PID and timestamp are not suppressed.
config.log_formatter = ::Logger::Formatter.new

これを無効にすれば出力されなくなります。

まとめ

これで本番環境で正常にDatadogでログが解析できるようになりました。

参考

Railsのログについて(Rails.logger) | 酒と涙とRubyとRailsと

【AWS】Amazon QuickSightでS3へアクセスできないときの対処法

はじめに

AppFlowを使ってSlackの発言回数を可視化させるために
Amazon QuickSightを使ってみることにした。

その際にハマったところをメモする。

前提条件

  • AppFlowを使ってS3にデータが保存されていること
  • Athenaでデータが取得できること

原因

Amazon S3への許可設定をしていなかった。

現象

f:id:fujikawa-y:20200806094707p:plain

対応方法

以下のドキュメント通りにやったらできた。 https://docs.aws.amazon.com/ja_jp/quicksight/latest/user/troubleshoot-connect-S3.html

f:id:fujikawa-y:20200806094817p:plain

f:id:fujikawa-y:20200806094847p:plain
データが入っているバケットを選択する。

【Ruby】RubyMineでrbenvでインストールしたRubyを指定する

はじめに

RubyMine(以下、IDE) をJetBrains経由で新しくダウンロードして
IDEの設定を設定していたところRubyのバージョンを指定する必要がありました。

筆者は rbenvRubyをインストールしていたため指定方法に
手間取ったので記録として残しておきます。

前提条件

環境

  • macOS Mojave
  • RubyMine version 2020.1
  • rbenvがインストールされていて
    何かしらのバージョンのRubyがインストールされている

やり方

command と , を押して設定画面を開く。

f:id:fujikawa-y:20200418234510p:plain

+ を押して New local... を選択する。

f:id:fujikawa-y:20200418234556p:plain

/Users/{ユーザー名}/.rbenv/versions/2.7.0/bin/ruby を指定する。
※自分の設定がここなので、個々によって違うかもしれません。

f:id:fujikawa-y:20200418234650p:plain

指定したバージョンが表示されればOK

f:id:fujikawa-y:20200418234724p:plain

まとめ

~/.rbenv にあるはずなのですが New local version manager... で指定しても反映されず
その調査をするより直接Rubyのバージョンを指定する方が早いと思いこの通りにしました。

もし、バージョンマネージャーを指定できてる人がいたら教えてもらえると嬉しいです。

参考

https://www.jetbrains.com/help/ruby/configuring-language-interpreter.html

【Rails】ActiveModelSerializersのログを出力しないようにする

はじめに

Webサービスを開発していて、気づいたことがあったのでメモ

環境

前提条件

active_model_serializers を使って何かしらレスポンスが返されるようになっていること

調査

Datadogでログを確認していたところ以下のようなログが出力されていた。

[active_model_serializers] Rendered ActiveModel::Serializer::CollectionSerializer with ActiveModelSerializers::Adapter::Json (103.91ms)

原因

ドキュメントを確認すると ActiveModelSerializers でデフォルト出力することがわかりました。
https://github.com/rails-api/active_model_serializers/blob/a032201a91cbca407211bca0392ba881eef1f7ba/lib/active_model_serializers.rb#L19

解決方法

config/environments/production.rb に以下の通り記述すれば出力されなくなります。

Rails.application.configure do
  # Disable ActiveModelSerializers Logging
  ActiveSupport::Notifications.unsubscribe(ActiveModelSerializers::Logging::RENDER_EVENT)
end

まとめ

これで本番環境で不要なログが表示されないようになりました。

参考

ruby on rails - Remove log message in active-model-serializers - Stack Overflow