Ruby on RailsにおけるCookieとキャッシュの活用方法

Ruby on RailsにおけるCookieとキャッシュの活用方法

  • ウェブアプリケーションの開発において、パフォーマンスの向上やユーザーエクスペリエンスの改善は重要な要素です。
  • Ruby on Railsでは、Cookieとキャッシュという2つの機能が、これらの目標を達成するための有力なツールとなっています。
  • 本記事では、Ruby on RailsにおけるCookieとキャッシュの活用方法について解説します。

Cookieの活用方法

Cookieとは

Cookieは、ウェブブラウザに保存される小さなデータの塊のようなものです。主にユーザーのセッション管理や情報の永続化に使用されています。

Cookieの実装方法

Ruby on Railsでは、cookiesヘルパーを使用してCookieを操作します。以下は、基本的なCookieの設定方法の例です。

# Cookieに値を保存する
cookies[:user_id] = current_user.id

# Cookieから値を取得する
user_id = cookies[:user_id]

# Cookieを削除する
cookies.delete(:user_id)

キャッシュの活用方法

キャッシュは、ウェブアプリケーションのパフォーマンスを向上させるために使用されるメカニズムです。Ruby on Railsでは、様々な種類のキャッシュが提供されており、それぞれ異なる用途に使用されます。

キャッシュの種類と実装方法

Ruby on Railsで利用される主なキャッシュの種類とその実装方法は以下の通りです。

  • ページキャッシュ: ページ全体を静的なHTMLファイルとしてキャッシュし、サーバーの負荷を軽減します。
  • アクションキャッシュ: アクションの結果をキャッシュし、再利用することで処理速度を向上させます。
  • フラグメントキャッシュ: ページ内の特定の部分(フラグメント)をキャッシュし、動的なコンテンツの再計算を回避します。
  • ロシアンドールキャッシュ: データベースからのデータを一時的にキャッシュし、アクセス速度を向上させます。
  • 低レベルキャッシュ: コントローラーやビューのロジック内でキャッシュを使用して、特定の計算結果を一時的に保存します。
  • SQLキャッシュ: データベースからのクエリ結果をキャッシュし、データベースへの負荷を軽減します。 キャッシュの実装方法 各種類のキャッシュの実装方法は以下の通りです。

実装方法

  • ページキャッシュ: caches_pageメソッドを使用してアクションをキャッシュします。
class ProductsController < ApplicationController
  caches_page :index
end
  • アクションキャッシュ: caches_actionメソッドを使用してアクションをキャッシュします。
class ProductsController < ApplicationController
  caches_action :show
end

フラグメントキャッシュ: cacheヘルパーを使用してフラグメントをキャッシュします。

<% cache @product do %>
  <%= render @product %>
<% end %>

その他のキャッシュ: Rails.cacheを使用して任意のデータをキャッシュします。

Rails.cache.write('weather_data', @weather_data)

以上が、Ruby on RailsにおけるCookieとキャッシュの活用方法についての解説です。これらの機能を適切に活用することで、ウェブアプリケーションのパフォーマンスやユーザーエクスペリエンスを向上させることができます。

method_missingに触れた~メタプログラミング~

はじめに

メタプログラミングは、プログラムが自身を操作したり変更したりすることを指します。 この辺りは知識としてあったんですが、実装で触れる機会も特にありませんでした。 業務でmethod_missingを使用する場面があって、「おお!これがメタプログラミングか!!」となったので、忘れないように書いていきます。

メタプログラミングとは

メタプログラミングは、プログラムが自身の振る舞いや構造を操作するプロセスらしい。

method_missing メソッドとは

method_missingは、Rubyの特別なメソッドの一つです。 method_missingを見た時に、「魔法やん!」って思っていたら色々な記事で魔法と言っていたので、認識は正しかったようです。 これを初見で見た時に理解できないことは私は魔法学校出身ではないことの証明でもあるので実装で詰まっていた時間も許せるなと思いました。

method_missingはどんなメソッドかというと、オブジェクトが存在しないメソッドが呼び出された際に自動的に呼び出されます。 これを活用することで、未定義のメソッドに対する柔軟な処理が可能になります。 No method errorがない世界ですね

method_missing の使用法

  • 基本的な構文
def method_missing(method_name, *args, &block)
  # 未定義のメソッドが呼ばれた際の処理を記述する
end
  • method_nameは呼び出されたメソッドの名前を表し、argsは引数の配列、blockはブロックを表します。

  • respond_to_missing?メソッドの実装

  • method_missingを使う際には、対応するrespond_to_missing?メソッドも実装することが推奨されます。 これは、オブジェクトが特定のメソッドを実装しているかどうかを判断するために用いられます。
def respond_to_missing?(method_name, include_private = false)
  # method_name が対応するメソッドを実装しているかを返す処理を記述する
end

method_missing の活用例 動的な属性アクセス method_missing を使用する典型的な例は、動的な属性アクセスの実装です。以下のようなクラスを考えてみましょう。

class DynamicAttributes
  def initialize
    @attributes = {}
  end

  def method_missing(name, *args)
    if name.to_s =~ /^set_(.*)=$/
      @attributes[$1] = args[0]
    elsif @attributes.key?(name.to_s)
      @attributes[name.to_s]
    else
      super
    end
  end

  def respond_to_missing?(name, include_private = false)
    name.to_s.start_with?('set_') || @attributes.key?(name.to_s) || super
  end
end

このクラスでは、set_で始まるメソッドが呼ばれた際に、それに対応する属性を動的に設定します。また、属性の値を取得するためのメソッドも同様に動的に生成されます。

dynamic_obj = DynamicAttributes.new
dynamic_obj.set_name = "John"
dynamic_obj.set_age = 30
puts dynamic_obj.name  # => "John"
puts dynamic_obj.age   # => 30

まとめ

method_missingは、Rubyにおける強力なメタプログラミング機能の一つです。 その適切な活用により、柔軟性の高いコードを実現することができます。しかし、過度な使用はコードの可読性や保守性を損なう恐れがあるため、慎重に使う必要があります。是非、実際の開発でmethod_missingを活用し、Rubyメタプログラミングの世界を探索してみてください。

チーム開発未経験者のgitの使い方

はじめに

私は2023年にエンジニアとして採用をしていただいて、現場に配属された それまでチーム開発はおろかまともにgitも使っていなかったので、「○○してください」と言われたときに「git ○○」と検索をしていた。

配属されたときによく見た「初心者のためのgitの使い方」などには求めている内容が見つからなかったので、一年目に覚えておくと困らないコマンドについて紹介する

超初級編

ここは他の記事にもあるので、あえて簡潔に書く

  • ワークツリー (Working Directory):プロジェクトの作業ディレクトリで、実際にファイルを変更・編集する場所
  • ステージングエリア (Staging Area) / インデックス (Index):コミットする変更を準備する場所。ステージングエリアに追加されたファイルは、次のコミットに含まれます。
  • リポジトリ (Repository):ローカルリポジトリとリモートリポジトリの2つがある

  • 以下の画像の中が自分の頭の中にスッと入ってきたので、添付しておく

  • 変更した内容を確認

    • ワークツリーで変更された内容を確認するには、git status コマンドを使用する
    • またそこで変更があったファイルをgit diffコマンドで確認する
  • 変更した結果をステージングにあげる

    • git add <file name>で編集しただファイルをgit commitに追加
    • git addでは編集したファイルをステージングに追加
  • 変更した結果をリモートリポジトリにあげる

    • git commitでaddしたファイルをコミット化する
  • 個人的によく使うコマンドの流れ

git status                     //変更したファイルを確認
git diff                         //変更した実装の差分を確認(typoないことなど確認)
git add .                      //「.」で変更したすべてのファイルをステージングにあげる
git commit -m "xxx"       //コミット名をつける
git log                        //コミットした内容を確認できる
git push                     // リモートリポジトリにアップする

こう言われたらこのコマンド

「mainブランチからブランチ切って作業してください」

  • 並列で作業するために、ブランチというものが存在します。
  • 基本的には、機能ごとやissueごとだと思いますが、そのあたりはチームのルールを参照してください
  • git branch
    • 自分が今いるブランチがわかるコマンド
    • 以下は、mainブランチにいることを示します
$ git branch
* main
  issue1
  • git checkout xxxxx:ブランチを切る
    • ブランチを切るにはcheckoutを使います
    • 上の例では、既に存在するブランチに対して、ブランチの変更のために使うコマンドです
  • git checkout -b new_branch:ブランチを作成する
    • ブランチは誰かが作成しなければいけません
    • そのため、新しいブランチを作成する場合、使用するコマンドです

「ローカルのブランチ多いですね、pushしたブランチがmergeされたら削除していいですよ」

  • おそらくあなたのブランチはこうなっているはずです。
$git branch
>main
*test
develop_1
develop_2
develop_3
develop_4
develop_5
develop_6
develop_7
  • git branch -D develop_1:任意のブランチを削除したい

    • -Dオプションで削除することが可能です
    • 削除するブランチにいると削除できないので、他のブランチに移動しておく
  • ブランチ関連では、checkoutを使用する時とbranchを使用する時があり少し苦労しました

「20commit遅れてます。rebaseしてください」

  • 開発スピードが遅いとブランチを切った時点からmergeしたい時に、他の人が大量のコミットを追加していることがあります。
  • git rebase <コミットハッシュ>:これでベースにしたいコミットを変更することができます。
  • rebaseは、ベース(もとになるコミット)をつけかえるものです

「あ、コンフリクトしてます!」

  • コンフリクト直せればgitわかるマン(自称)ぐらいになれそうです。
  • git rebaseすると、ターミナルのメッセージにconflictという文字が出てきて、失敗するはずです
  • 以下のコマンドで修正できます
  • git rebase --continue:これでコンフリクト作業を直すというモードになります
  • git rebase --abort:これでミスった時にもとに戻れます、逃げられます!

  • コンフリクトが起きるとどちらが正しいのかをこちらで判断しなければなりません

  • しっかり見極めて修正しましょう
<<<<<<<<<<HEAD^
red
==========
>>>>>>>>>>388d0g09d08d
blue
  • よくやる流れ
$git rebase -i <コミットハッシュ>
$git rebase --continue
$git grep "<<<<<"    //コンフリクトする場所を探す
//直す
$git grep "<<<<<"   //直ったか確認する

私「これ不要になった、だるい、消したい」

  • 変更した点を削除したい
$git status
>test1.md
>test2.md
>test3.md
...
  • 私はgit resetをよく使います
  • 例)test1.mdだけ消す
$git add test1.md
$git commit -m "削除"  // git logすると削除が一番上にくる

$git reset --hard HEAD^
  • git reset --hard HEAD^
    • HEAD^にある変更点もすべて削除する
    • 上記の例だとtest1.mdが変更されてないことになる

私「この追加を最新のコミットにまとめたいな」

  • git reset --soft HEAD^
    • HEAD^にあるコミットのファイルをステージングにおろす
    • git addしたときと同じ状態
    • 個人的には、最新のコミットと追加しようとするファイルを同じコミットにまとめたいときに使う
$ git add test2.rb
$git commit -m "最新のコミット"

//test2.rbを変更した「最新のコミット」とほぼ同じ内容
$git reset --soft HEAD^
$git status  // test2.rbがステージングにある状態
$git add test2.rb
$ git commit -m "一緒にしたコミット"

おまけ

  • git log --oneline:git logだとログが詳細に出てくるので、logの情報を1行で出すコマンド
  • git reset <ファイル名>:ミスってaddしてしまったファイルをステージングから削除する
  • git diff --stat --name-only <コミットID A> <コミットID B>:コミットID AからコミットID Bまでの差分のファイルが標示される
  • git reset --hard origin/xxx:リモートリポジトリのxxxブランチのHEAD^と同じ内容になる
    • git reset --hardはブランチにも使用できる
  • aliasを使用する
    • 私はgit pushgit phgit checkoutgit cogit branchgit bなどにしています

2024年エンジニア目標

 自己紹介

  • 概要:2023年の4月からエンジニア採用として、都内のIT企業で自社プロダクトに関わっています。
  • 言語:Ruby,PHP
  • フレームワークRuby on Rails,Laravel
  • 仕事の内容:問い合わせ(40%)/保守(30%)/開発(30%)

 2年目の目標:つよつよエンジニアに片足をつっこむ

  • エンジニアとして半人前にも満たないレベルの知識量だったので、
    • エンジニアとして基礎力と技術力を高める
    • つよつよエンジニアになるための習慣力を身に着ける
    • 得意と言える技術を1つ身に着ける
そのためにやること
  • 社内では、昇進試験のようなものが存在するので、この一年で昇進の基準を満たす
  • 技術ブログを週に1回以上書く(年間45記事)
  • 面倒な作業は全てプログラムで解決する
  • Rubyで3つ以上個人開発をする
  • 新しい言語を身に着ける:JavaScript/TypeScriptのどちらか
  • SPAの資格を取得する
  • エンジニア思考を身に着ける
  • 1時間以上、朝活する
  • 月1冊以上技術書を読む
  • 1つでも得意な領域を見つける
  • やったことを細かくログに残す