Ruby関連のことを調べてみた

Ruby関連のことを調べてみた
目次

Ruby で解く AtCoder ABC 043 D – アンバランス (ARC 059 D)

# はじめに
– [AtCoder Problems](https://kenkoooo.com/atcoder/#/table) の ABC042 以降の問題を解いています
– 勉強のために Ruby で解いています
– 速度的な面で他の言語には劣りますが、あくまで勉強のためです
# お題
– 今回のお題は、 [ABC 043 Dのアンバランス](https://atcoder.jp/contests/abc043/tasks/arc059_b) という問題です
– 入力文字列の部分文字列がアンバランスかどうかを判定し、アンバランスなら具体的な区間を答えるというもの

# 考えたこと
– 何も考えずに作ろうとすると、時間計算量は$O(n^3)$になる
– 部分文字列の列挙で$O(n^2)$
– 判定で$O(n)$
– 位置を1つ示せば良い
– 答えは複数あるのだが、少なくとも1つのアンバランスな区間を示せれば良い
– アンバランスな文字列は以下のパターンを満たす
– 長さ2の”XX”というパターン
– 長さ3の”XYX”というパターン

元記事を表示

RailsにおけるRSpecテストコードで生成されたデータがデータベースに保存されない仕組み

### RailsでRSpecなどのテストコードを実行すると、テストコード内で生成されたデータは通常、データベースに保存されません。これは、テストコードと本番環境を分離し、テストデータが本番データに混入することを防ぐためです。

# 仕組み

RSpecなどのテストフレームワークは、テストコードを実行する前に、以下の2つの重要な処理を行います。

1\. トランザクションの開始: テストコードの実行前に、データベースへのトランザクションを開始します。
2\. トランザクションのロールバック: テストコードの実行後に、トランザクションをロールバックします。

トランザクションのロールバックにより、テストコード内で生成されたすべてのデータ変更はデータベースにコミットされず、本番環境に影響を与えることはありません。

# 例外

一部のテストシナリオでは、テストデータをデータベースに保存する必要がある場合があります。そのような場合は、以下の方法で実現できます。

save! メソッドを使用する: モデルオブジェクトを保存する際に save! メソッドを使用すると、トランザクションのロールバッ

元記事を表示

[Rails]個人アプリでN+1問題を見つけて解消してみた

バックエンドエンジニアの実務では、N+1問題を見つけ、解決する場面がある、ということを聞きました。

そこで、クエリの適化を行う練習のためにも、自分のアプリを使って、N+1問題について勉強したことをまとめてみます!

# N+1問題は何が問題(悪影響)なのか?

N+1問題の何が問題かというと、
– 何度も(N回)テーブルにデータを取りに行くと、当然、処理が重くなる
– これが例えば、N=20回程度なら問題はないかもしれないが、N=50,000など大量のデータを処理する際には、負荷がかかる
– 結果、サービスの利便性が悪くなる。ビジネスに影響が出る

という認識です。

つまり、そこまで多くのデータを処理しないケースなら、あまり問題にはならないはずです。

私のアプリケーションもそれに該当するのかなと思います。

しかし、大量の処理を想定して、設計したらどうなるか、ということを実際にやって見ることは勉強になるので、試してみました。

# N+1問題の特定

私は以下の方法で、N+1問題が発生しているところを特定しようと思いました。

– gem’bullet’の活用
– 複数テーブル

元記事を表示

「あの赤い丸 🔴 」を消せ!RubyMine (およびJetBrains系IDE、VS Code、Vim) でファイルの末尾に改行文字を自動的に付与する設定

## はじめに
GitHubでプルリクエストのコードレビューをしたりすると、たまにこんな赤い丸🔴を見かけませんか?

![Screenshot 2024-04-13 at 11.23.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7465/7f5553c3-1fe6-67f7-a6b8-9ea61e058228.png)

これはファイルの末尾が改行文字で終わっていないことを示す警告マークです。

改行文字を `\n` で可視化するなら、本来は

“`
end\n
end\n
“`

こうなっているべきなのに、実際は

“`
end\n
end
“`

こうなって保存されている、ということです。

実際問題、ファイル末尾が改行文字で終わっていないからといってプログラムがおかしな動きをするということは滅多にありません。
ですが、[POSIX](https://ja.wikipedia.org/wiki/POSIX)[^1]の規格では「テキストファイルの末尾は改行文字で終わらないといけ

元記事を表示

【Rails】レコードの中から、ある項目ごとの最新データを取得する方法

株式会社学びと成長しくみデザイン研究所の藤澤です。

## 前提
データベースに蓄積されたログから、特定の項目ごとの最新のデータを取得したいことがあるかと思います。

例えば、各タスクの実行状況を記録する TaskLog テーブルがあるとします。このテーブルには、タスクの識別コード(タスクコード)、ステータス、作成日時、更新日時が記録されています。
“`rb
TaskLog(id, task_code, status, created_at, updated_at)
“`

そして、テーブルには以下のようなデータが存在するとします。
“`sh
id | task_code | status | created_at | updated_at |
1 | “taskA” | “ok” | 2022/04/01 12:30:00 | 2022/04/01 12:30:00 |
2 | “taskB” | “ok” | 2022/04/02 12:30:00 | 2022/04/02 12:30:00 |
3 | “taskA

元記事を表示

【Rails】スキーマ情報が一目でわかるannotate_models

## はじめに

ファットコントローラーよりファットモデルの方が良い、という教えを守った結果、テーブル情報の確認しづらさを感じ調べてみました。

前回の記事でもアノテーションというものを取り上げた気がしているため、もう注釈おじさんと呼んでください🙇

:::note warn
ご覧いただきありがとうございます!
この記事の投稿者は主にRuby on Railsを学習している初学者です。
理解不足な点や内容に誤りがございましたらご指摘いただけますと幸いです。
:::

## 問題
テーブル・ルーティングの情報をできたら一目で確認したい。
ファイルを開いたときに毎回下までスクロールしないと全容がわからない・・・

## 解決方法
gemがありました🥹

https://github.com/ctran/annotate_models

Gemfileの`development`グループへ

“`ruby:Gemfile
gem ‘annotate’
“`
“`
bundle install
“`
ここからは固有のコマンドです.
実行すると`lib/tasks/auto_annota

元記事を表示

【RSpec】APIを使うメソッドのテストでVCRを使う【Youtube Data API】

# はじめに
この記事ではポートフォリオ作成中に学んだことを自分のために記録しています。
初学者のため理解が不十分なところがあるかもしれませんが、その場合はご指摘いただけると幸いです。

# やりたいこと
– VCRを使ってAPIを使用しているメソッドのテストを書く

YouTube Data API v3を使用して動画情報を検索するヘルパーメソッドのテストをRSpecで書いていきます。
実装の詳細は下記の記事でまとめているのでよければご覧ください。
[【Rails】Youtube APIを使ってIDで動画を検索する](https://qiita.com/mnmnm_37/items/315033fd8a63f8aad4e8)

# VCRとは?
テストでのHTTP通信を1回目で記録しておき、以降のテストではその記録(カセットと呼ばれるyamlファイル)を使用することで通信の結果を再現してくれるgem。
2回目以降のテストは実際のHTTP通信を行わないため処理が早くなります。
また、APIを使用するテストにおいては何度テストを実行しても割り当てを消費しないというメリットがあります。

元記事を表示

if文の条件部分で代入式があるけど?

# はじめに
[Railsチュートリアル](https://railstutorial.jp/ “Railsチュートリアル”) でRailsの学習をしている中で
気になった箇所があったので知識整理も兼ねて調べた内容をまとめます。

## if文の条件で代入してる
以下のコードにてif文の条件部分にてある変数に代入している箇所がありました。
元々は session[:user_id] が存在すれ真の判定、存在しなければ偽の判定でした。

“`ruby
if (user_id = session[:user_id])
@current_user ||= User.find_by(id: user_id)
elsif (user_id = cookies.encrypted[:user_id])
user = User.find_by(id: user_id)
:
end

# 元々は以下のコードだった
# if session[:user_id]
# @current_user ||= User.find_by(id: session[:user_id])
# elsif

元記事を表示

【Rails,AWS】SageMakerのエンドポイントをRailsで使用してみる

どうもこんにちは。

今回は、以下の記事でトレーニングしたBERTモデルをRailsアプリケーションで呼び出してみました。

https://qiita.com/PDC-Kurashinak/items/f55d5d9e534f59440313

# 前提条件

上の記事で手順12まで実行できていることを前提として進めます。

# SageMakerノートブックインスタンス側での設定

## 1. トレーニングしたモデルをデプロイ

SageMakerのノートブックインスタンス内で以下のコードを実行します。

“`python
predictor = huggingface_estimator.deploy(
initial_instance_count=1,
instance_type=’ml.g4dn.xlarge’,
endpoint_name=’endpoint-01′ # ここは任意の名前
)
“`

ここで発行したエンドポイントは、「リアルタイム推論」をするためのエンドポイントとなります。
「サーバレス推論」をするためのエンドポイントを発行する手

元記事を表示

【備忘録】久しぶりにRubyGoldの勉強をしてみた

どうもこんにちは。

半年前に受けて**落ちた**RubyGoldをまた受けようかなと思い、久々に[Rex](https://rex.libertyfish.co.jp/exam_histories)を使用して模擬問題を受けてみました。

https://qiita.com/PDC-Kurashinak/items/2a4279fae328bbc7937b

https://rex.libertyfish.co.jp

# 結果は…

70点…(合格点は75点)

![スクリーンショット 2024-04-04 23.04.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2711491/a759ec71-e99f-a7a2-699f-db84302bd6b5.png)

# 解説

自分なりに解説してみました。ご指摘あったらコメントください。

## 1

`Singleton`モジュールは、「**あるモジュールのインスタンスがプログラム全体で1つしか存在しないことを保証する**」モジュールで

元記事を表示

There are no versions of nokogiri (~> 1.14) compatible with your Ruby & RubyGems.

Railsに挑戦しようと、かの有名な[Ruby on Railsチュートリアル](https://railstutorial.jp/)に挑戦することにした。
その際に、最初のRailsのインストールで表題のエラーで躓いたので、備忘録としてこちらを執筆。

まずは下記のコマンドでRailsをバージョン指定でインストールしろとのこと。

“`
gem install rails -v 7.0.4.3
“`

上記のコマンドを実行したが、下記のエラーに遭遇。

“`
Fetching nokogiri-1.16.4-x86_64-darwin.gem
ERROR: While executing gem … (Gem::FilePermissionError)
You don’t have write permissions for the /Library/Ruby/Gems/2.6.0 directory.
“`

`sudo`をつけて回避しようと試みる。

“`
sudo gem install rails -v 7.0.4.3
“`

ところが、次は下記のエ

元記事を表示

古いruby(1.8.7)と新しいruby(3.3.0)でソート結果に違いが出る話(on Linux)

# はじめに
Linux環境において(他の環境は未検証)、古いruby(1.8.7など)と新しいruby(3.3.0など)で配列のソート結果に違いが出るという、現代を生きている方には特に役に立たない情報についての共有です。

# 検証コード
ruby1.8.7でもruby3.3.0でも同じコードが実行可能なように、古い書き方で記述しておきます。
“`ruby
[
{:name => ‘elm1’, :val => 1},
{:name => ‘elm2’, :val => 5},
{:name => ‘elm3’, :val => 3},
{:name => ‘elm4’, :val => 1},
{:name => ‘elm5’, :val => 2},
{:name => ‘elm6’, :val => 6},
{:name => ‘elm7’, :val => 2},
{:name => ‘elm8’, :val => 7},
{:name => ‘elm9’, :val => 4},
{:name => ‘elm10’, :val =>

元記事を表示

なんかRBENV_VERSIONが勝手に入ってるな。。と思ったらjetbrainsを疑う

SSIA(最近覚えたので使ってみる)

rbenvでは`.ruby-version`より`RBENV_VERSION`の値が優先される。

プロジェクトで`rbenv local 2.6.10`みたいな事をして2.6.10を使おうとしていたら、`ruby -v`で違うバージョンが出てびっくり、ということがあったので備忘録として残す。

# 結論

RubyMineを使っていたのだが、こいつが勝手に`RBENV_VERSION`に値を入れてくる模様。

`Ruby SDK and Gems`で変えられるので、ここを変えたら`RBENV_VERSION`も変えられる。

![スクリーンショット 2024-04-10 15.45.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/441085/f3fbcd03-f069-dc3f-1562-718236998eb9.png)

元記事を表示

DartとJavaScriptでPythonやRubyみたいに%書式(sprintf)を使えるようにしましょう

# はじめに

PythonとRubyを使っているみんなさん、いつも「%書式」を使っていますか?私はいつも使っています。これは元々C言語の機能で、printfとsprintfで文字列を出力する時に使われていたが、その後色んな言語で同じように搭載されています。

PHPなどではsprintfという関数の形で使えますが、文法の一部として扱えるPythonとRubyの方が直感的で便利です。

勿論、PythonとRubyは%書式以外に他の書式の機能がありますね。[前にもPythonで使える書式を比較する記事を書きました。](https://qiita.com/phyblas/items/0a122fe4a18a18a83050)それぞれ特徴があって違いがあります。**色んな言語共通で使える**のは%書式の長所です。

ただし残念ながらJavaScriptはこんな便利な機能を持っていません。関数という使いたいとしても追加パッケージをインストールする必要があります。

最初にJavaScriptを勉強した時に不便を感じて、ないなら自分で作ればいいよね、と思って結局頑張って実装してみました。

元記事を表示

Effective Rubyを読んだ備忘録

# 3章:コレクション
## nil、スカラーオブジェクトを配列に変換するには、Arrayメソッドを使おう

次のようなピザの注文のためのクラスについて考えてみる。

“`ruby
class Pizza
def initialize (toppings)
toppings.each do |topping|
add_and_price_topping(topping)
end
end

end
“`
initializeメソッドは、トッピングの配列を期待しているが、単一のトッピングも渡したいし、トッピングがなければnilも渡せるようにしたい。

そこでArrayメソッドを利用する。Arrayメソッドは、ほとんどのオブジェクトを1個の要素を含む集合に変換し、引数がnilなら空配列に、引数が配列ならそのまま引数を返す。
“`ruby
irb> Array(‘Betelgeuse’)
—>[“Betelgeuse”]
irb> Array(nil)
—>[]
irb> Array([‘Nodroj’, ‘Retep’])
—>

元記事を表示

FactoryBotでhas_oneの関連付けを表現する。traitの基本的な使い方。

FactoryBotでhas_oneの関連付けを表現するのってどうやるんだっけ?ってなったので自分用に備忘録を残しました。

traitという機能を使用しました。
今回はtraitの基本的な使い方➕作業の全体像を記しています。

参考にした記事

https://qiita.com/ShotaroHirose59/items/7c64be350676120de9bd

## 前提条件

CustomerがProfileをhas_oneしています。

“`customer.rb
class Customer < ApplicationRecord has_one :profile, dependent: :destroy end ``` ```profile.rb class Profile < ApplicationRecord belongs_to :customer end ``` ## 本題のコード customerの方のFactoryBot “`spec/factories/customers.rb FactoryBot.d

元記事を表示

【Rails】erbからslimへ変換したい方へ

## はじめに

みなさん`slim`はお好きでしょうか?

`erb`から`slim`への変換をしてくれる便利な`html2slim`というgemがあるのですが、非推奨のメソッドが使用されている関係で警告が出ていました。

それだけでなく、一部のファイルが変換できない現象があったため解決しようと試みました💡

:::note warn
ご覧いただきありがとうございます!
この記事の投稿者は主にRuby on Railsを学習している初学者です。
理解不足な点や内容に誤りがございましたらご指摘いただけますと幸いです。
:::

## 問題
“`
NoMethodError: undefined method `exists?’ for class File
“`
exists?メソッドが非推奨(そして最終的に削除された)ために発生しているようです。
現在は`File.exists?`の代わりに`File.exist?`を使用するのだそうです。

詳しいことまではわからないのですが、ライブラリの記述で起きている問題のため、本家のgemの更新を待つ他にはないようです。

## 解決方法

元記事を表示

備忘: Railsで古い日付を JST の TimeWithZoneに変換すると時刻がずれる

# 追記
https://qiita.com/vivid_muimui/items/876d89f8bdc0a35c4fb5#comment-96533a49b7d45a748ead

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26310/518d80f7-da5c-fc0c-555f-92f95e641442.png)

コメントで教えていただきました!

# 以下、元記事

:memo: ふかぼりきれておらず事象だけのメモ

# 環境

ruby: ruby 3.3.0 (2023-12-25 revision 5124f9ac75) [arm64-darwin22]
rails: 7.1.2

# 現象

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26310/af57e6c1-d3d5-e39b-72d4-2136a63f4e7f.png)

“`rb
❯ TZ=

元記事を表示

Discord の BOT で音楽を流したい (w/Ruby)

## 概要

Discord の BOT でボイスチャンネル (以下 VC) に接続して音楽を流す.言語は Ruby.

当記事で BOT の作り方には触れないので[私の過去の記事](https://qiita.com/RabbitAATS/items/31c98b0896f57194ef6b
)を,Discordrb に関する詳しい内容は [Discordrb の GitHub](https://github.com/shardlab/discordrb) を参照されたい.

https://qiita.com/RabbitAATS/items/31c98b0896f57194ef6b

https://github.com/shardlab/discordrb

## 環境

– OS: Rocky Linux 9.3
– 言語: Ruby 3.0.4

## ライブラリの準備

Discord の BOT が VC に接続するには,以下のライブラリが必要.

– libsodium: 暗号処理ライブラリ
– libopus (Opus): 音声圧縮ライブラリ (FFmpeg が使

元記事を表示

AtCoder Beginner Contest 348参戦記録(A~C問題)

RubyでAtCoderに参戦した記録です。
今回はABC3完でした。

## [ABC348 A Penalty Kick](https://atcoder.jp/contests/abc348/tasks/abc348_a)
N回のペナルティキックの結果を「o」と「x」で記述します。3の倍数回目の時のみキックに失敗するそうです。

“`Ruby
n= gets.to_i
for i in (1..n) do
if i % 3 ==0
print “x”
else
print “o”
end
end
“`
特に難しいわけでもないのですが、最初n.timesで書こうとして「あれ?」となりました。
“`Ruby
# 誤答です
n.times do
if (n+1)%3 == 0
print “x”
else
print “o”
end
end
“`
.timesでは0~nまでが順番に渡されるという記憶があったのですが、それは下記のようにパラメータを設定した時ですね。
“`Ruby
n.times do |i|
if

元記事を表示

OTHERカテゴリの最新記事