Ruby関連のことを調べてみた2022年12月29日

Ruby関連のことを調べてみた2022年12月29日
目次

[Ruby] 整数を判定する、あるいは”整数ではない”について

何番煎じですかってお題ですが、地味に詰まったので言葉にして残してみます。

# はじめに: 筆者について
Ruby歴2ヶ月ほどで、バックエンドの開発が得意です。Javaのエンジニアからキャリアをスタートし、最近1年半くらいはサーバーサイドKotlinの導入やプロダクション用のビルドやアプリ基盤開発などに従事してきました。個人的な趣味としても、規約よりも設定、型によるモデルの実装といった堅牢だが冗長な実装を好む傾向にあります。

そのような背景がありますので、型やnullの状態がコンパイル時にわかるような気で、 “Java屋的な” 発想でRubyを書いてしまいがちです。

# お題: 小数点付きならエラー
簡単な修正の担当となり、「小数点付きならエラー」を実装しようとしていました。

以下の修正が結論です。変数名などはぼかして書いています。
“`ruby
do_on_error unless !@subject&.is_a(Integer)
“`

## インスタンスの型もnullabilityも明示的ではない
はじめに気づいたことは、検査対象は数値のインスタンスとは限らないというこ

元記事を表示

SQLでバルクインサートを使ってテストデータを大量に作成する

# この記事を書いた背景
RailsのAPIモードで開発していたのですが、動作確認のためステージング環境にテストデータを大量に作成する必要がありました。

その際、Railsコンソールからデータを増やそうと思い`each`で繰り返しデータの生成を実行したのですが、herokuのプランの都合上1時間に発行できるクエリ数が3,600に限られており、それがオーバーしたようでデータの作成が途中で終わってしまいました(泣)

しかも、一度クエリの上限数を超えると1時間ほどDBにアクセスできなくなるという問題も、、、
(現在は有料プランに切り替えたので恐らく問題ないですが、当時は無料プランだったためこうした制限に引っ掛かりました)

参考:https://zenn.dev/ttskch/articles/905ae809e29504

– 急に有料プランに切り替えたくても自社持ちの費用でないため承認まで時間がかかる可能性があること、
– リリースまで時間がなく、なるべくすぐにステージング環境で動作検証をしたかったこと
このような理由から、herokuが復旧後、SQLでバルクインサートを行い発行する

元記事を表示

さくらレンタルサーバーで ruby 3.2.0 をビルド

# はじめに
複数のトラップがあり,苦労したので記録する.以下は 2022/12/29 現在の話.

# 手順

## rbenv および ruby-build のセットアップ
今調べたら Homebrew 利用の方法ばかりヒットするので,念のため書いておく.`git pull`のエイリアスとして`rbenv_update`を登録しておく.新しい Ruby のバージョンがリリースされたら,`rbenv_update`してから`rbenv install`する.

“`
$ git clone https://github.com/rbenv/rbenv.git ~/.rbenv
$ git clone https://github.com/rbenv/ruby-build.git ~/.rbenv/plugins/ruby-build
$ echo ‘export PATH=”$HOME/.rbenv/bin:$PATH”‘ >> ~/.bashrc
$ echo ‘eval “$(rbenv init -)”‘ >> ~/.bashrc
$ echo ‘alias rbenv_up

元記事を表示

引数とハッシュを使って要素を取り出す

# 問題
ある映画のハッシュを定義し、格納されている
「title」(タイトル)・「genre」(ジャンル)・「year」(公開年)の三つの要素の中から
一つを取り出すプログラムを作成してください。
##### 定義する変数
~~~ruby
①movie = {“title” => “ハリーポッター”, “genre” => “ファンタジー”, “year” => “2001年”}
~~~

②ユーザーが入力するキーを、getsメソッドを利用し定義しましょう

# 模範解答
~~~ruby
def movie_info(movie, data)
puts movie[data]
end

movie = {“title” => “ハリーポッター”, “genre” => “ファンタジー”, “year” => “2001年”}

puts “以下から一つを選んで入力してください。
・title
・genre
・year”

info = gets.chomp

movie_info(movie, info)
~~~

# 解答
まず、ハッシュ名[キー名]と記述する事で、

元記事を表示

ShangriLa Anime APIを使って簡易的なアニメ情報サイトを作ってみた

# はじめに
この記事は[Life is Tech ! Tokai Advent Calendar 2022](https://qiita.com/advent-calendar/2022/life-is-tech-tokai)の19日目の記事です。

現在と過去のAnime情報を取得できるAPIであるShangriLa Anime APIの使い方とその詳細ページの画面出しわけ方法について紹介しています。

### 使用している技術
– ShangriLa Anime API
– Ruby
– Sinatra

# ShangriLa Anime APIについて
ShangriLa Anime APIとはアニメ作品の情報を返すREST形式のAPIサーバーのことです。
詳しい内容については[公式ドキュメント](https://github.com/Project-ShangriLa/sora-playframework-scala)をみてください。この記事では最低限必要な情報を紹介していきます。

– エンドポイント:http://api.moemoe.tokyo/anime/v1

元記事を表示

個人的Rubyメソッドまとめ

# 1、メソッドの定義から
defを使って定義。
“`
def hello()
puts “hello world”
end
“`
定義されたメソッドは、それより下の位置から呼び出すことができる。
“`
def hello()
puts “hello world”
end

hello()
“`
出力結果として
“`
hello world
“`

# 2、メソッドの命名規則

メソッドの名前は、次のルールに従う。
・1文字目:英語または、「_」(アンダーバー)
・2文字目以降:英語の大文字・小文字・数字「_」(アンダーバー)
・慣習として、メソッドの先頭には大文字を使わない

# 3,引数と戻り値を追加する
“`
def sum(x, y) # xとyが引数
return x + y # 戻り値(returnは省略可)
end

puts sum(3, 4)
puts sum(300, 400)
num = sum(30, 40) # numに戻り値が代入される
puts num
“`
出力結果は
“`
7
700
70

元記事を表示

Railsでポートフォリオ制作③【実装:GitHubにあげる〜ユーザー機能実装】

ポートフォリオの環境構築が完了したので、実装に入ります。

## これまで
https://qiita.com/mahariiku/items/1f062eed36dab8ace782

https://qiita.com/mahariiku/items/31a741d478004598b995

## 実装手順
– GitHubに上げる
– issueを作っていく
– gemのインストールと各種設定
– GitHub Actionsを導入
– Dockerを導入
– タイムゾーンの設定
– devise(ユーザー認証gem)の導入
– 国際化(localize)
– UIのテンプレートを導入
– ユーザー関連機能のviewとspec実装

## GitHubに上げる
– GitHubのマイページで、リポジトリの新規作成
– ローカルのrailsプロジェクトのディレクトリで`add`→`commit`→`remote add`→`push`
– GitHubのリポジトリページを更新してローカルの内容がプッシュされているのを確認!
![スクリーンショット 2022-11-12 7.10.

元記事を表示

【Ruby】UFO演算子

UFO演算子について。深掘りしきれなかったので、自分用メモです。。。

# UFO演算子とは
`<=>`という演算子があります。これは、両辺のオブジェクトを比較して値を返すものです。
self <=> otherで比較した時の挙動は
– 左が大きい =「1」
– 等しい =「0」
– 右が大きい=「-1」
となります。

これをもう少しわかりやすく書くと
“`ruby
1 <=> 0 #=> 1
1 <=> 1 #=> 0
0 <=> 1 #=> -1
“`
となります。

また、UFO演算子を利用するために、`Comparable`モジュールをインクルードする必要があります。
`Comparable`モジュールをインクルードしたクラスでは、インスタンス同士を比較演算子を利用して比較することができます。
`< , <= , == , > , >= , between?`

# `<=>`演算子の使い方
先ほど説明した`<`や`>`などを利用することができますが、比較結果を-1、0、1を返すように定義する必要があります。
クラスに<=>演算子をメソッドで定義して、インスタンスを比較で

元記事を表示

[Ruby on rails] 駆け出しエンジニアの「なんでこの名前なん?」4選

どうも、9月に入社しました駆け出しエンジニア(4か月)です。
この記事では、僕が「**え、それそういう由来だったのね**」と思ったIT用語や略語を4つまとめてみたいと思います。
漠然とした機能に加え、その語の由来やニュアンスを的確に捉えることができれば初学者はよりスムーズに、経験者はより深く用語について理解できるのではないでしょうか。
尚、以下は完全なる僕の主観に基づいた情報であり、現状の僕の用語に対する理解です。
間違い、補足等あれば都度コメントいただけると幸いです。
それではスタートです。
※Ruby on Railsを主に触っている前提です。
# erb
これは”Embedded RuBy”の略です。日本語に訳すと、「**埋められたruby**」。
よくHTMLファイルなどで見かかけますね。
〇〇.html.erbのような感じです。つまり、「rubyが埋められたHTMLファイル」だよ!ってことを示してくれています。「あれ、、rubyが読み込まれてない、、」なんてことが起きた時は拡張子がきちんと「.erb」になっていなかった。なんてことはよくあるので、よくよく確かめてみるべきだ

元記事を表示

Ruby の benchmark ライブラリと愉快な仲間たち

> _推測するな、計測せよ。_

_~~Load, Aim, Shoot~~_
_Load, Aim, **Measure**_
(ベンチマークライブラリを読み込み、計測対象を定め、計測する。)

# この記事は?

Ruby でベンチマークを計測するための機能や Gem をご紹介します。

# バージョン情報

“`shell
$ ruby -v
ruby 3.1.3p185 (2022-11-24 revision 1a6b16756e) [arm64-darwin21]

$ gem l

元記事を表示

Ruby on Rails + Vue.js + AWS Fargate + Circle CiでSPAアプリを作成してみた

## はじめに
最近、と言ってもこのアプリを作ったのは2021年終わりから2022年前半くらいになるのですが、
未経験エンジニアのポートフォリオのレベルがだいぶ上がっているという話を耳にすることが多く、未経験で業界に飛び込んだ自分も負けていられないなという思いから業務後にコツコツアプリを作ってみました。

先に言い訳をしておくと、転職活動中だったこともあり`Terraform`でインフラのコード化までやり切ることができず、テストコードも未実装というかなりお粗末なアプリになってしまいました。反省。。。
ただ、業務と並行して未経験の技術をキャッチアップしていたことが転職面接時には結構ウケが良かったので、ある程度プラス評価はしてもらったかなと思っています。
あとシンプルに自分の作りたいものが形になっていくのはやっぱり楽しい

【Rails】HERE Maps APIで地図機能を作ってみる

# 概要
今回、無料でMap機能が使えるかつGoogleMapのAPIよりすごい!という話を
[以下の記事](https://qiita.com/Akira-Isegawa/items/a31be5893e362c6f10c3)で見かけたので、Railsで実装してみました!
投稿機能を実装していれば実装できる機能なので、ぜひ遊んでみてください〜!

https://qiita.com/Akira-Isegawa/items/a31be5893e362c6f10c3

:::note warn
投稿機能の実装が必要です
:::

# アカウント登録とプロジェクトの作成
以下の記事にある、`Developerの登録`を参考に進めましょう!

https://qiita.com/Akira-Isegawa/items/a31be5893e362c6f10c3

上記の記事のようにプロジェクトの作成が終わったら
アプリのディレクトリ直下(Gemfileと同じ階層)に`.env`という名前のファイルを作成し
APIキーを`.env`に入れます。

“`:.env
HERE_MAP_API_KE

CloudWatchでRailsアプリケーションログの10秒以上の処理を抽出するフィルタの書き方

# はじめに
医療系クラウドサービスを提供しているレイヤードという会社で働いています。

今回あるサービスのデータベースにおいて`Lock wait timeout exceeded`が発生し、やたら処理時間が長いヤツがいそうだゾ(しかもトランザクションかけてやがる!)、という事で犯人捜しをした時のメモです。

AWSのClowdWatchでRailsのproductionログを対象に「◯秒以上の処理」を検索しました(しょーもなくてごめんなさいw)。
RailsのログでなくてもDBやWebサーバのログ検索も同様に使えると思います。

# 前提
当然ながらClowdWatchにログを上げている前提です。
Railsのログは下図のようになっており矢印のms箇所を検索します。
[![Image from Gyazo](https://i.gyazo.com/38b43cfc7f81df1c54d564b685b6aee9.png)](https://gyazo.com/38b43cfc7f81df1c54d564b685b6aee9)

# 手順
– ClowdWatchの画面で「ログのイン

【覚悟】find, find_by, whereの違い【備忘録】

# find, find_by, whereの違い
この前足元をすくわれたので、もう間違えないという覚悟の備忘録。
基礎的な内容だからこそ今一度。

## findメソッド
**モデルのidで検索してデータを取得できる。**
idでしか検索ができないため、取得対象のデータのidが具体的にわかっている場面で使用する。

該当するデータが存在しない場合は、`ActiveRecord::RecordNotFound`が返ってくる。

## find_byメソッド
**モデルのid以外でも検索条件としてデータを取得できる。**
複数条件を指定できるが、返ってくるデータは最初にヒットした1件のみ

該当するデータがない場合は、`nil`が返ってくる。

## whereメソッド
**モデルのid以外でも検索条件としてデータを取得できる。**
該当するデータが全て返ってくる。

該当するデータがない場合は、空の配列が返ってくる。

### 注意
**whereはActiveRecord::Relationを返す**。これは検索クエリを組み立てるもので、find, find_byの返す検索結果のオ

ActiveRecordっぽくFirestoreを操作できるgemを作りました(ActAsFireRecordBeta)

## はじめに
ActiveRecordっぽくFirestoreを操作できるgemを作りました。

https://github.com/JunichiIto/act_as_fire_record_beta

## 概要

こんなモデルを定義します。

“`ruby
class Book
include ActAsFireRecordBeta

# 属性の名前と型を定義
firestore_attribute :title, :string
firestore_attribute :published_on, :date
firestore_attribute :page, :integer

# 必要に応じてバリデーションも追加
validates :title, presence: true
end
“`

CRUDする例です。

“`ruby
# Create
book = Book.new(title: ‘An Awesome Book’, published_on: ‘2022-12-01’.to_date, page: 200)
boo

Ruby on Railsでプルダウン検索機能を実装する(gem不使用)


こんにちは。GeekSalonのプログラミング駆け出しメンターです。
今日はgem(ransack)を使用せずに実装できるプルダウン検索機能についての記事を書こうと思います。
初めて記事を書くので、温かい目で見てくださると嬉しいです。

# 目次
①前提
②開発概要
③実際のコード

## 前提
○開発環境
Ruby 3.0.4
Rails 6.1.6

○前提
・ ListでのCRUD機能実装済み
・ 新規投稿ページでプルダウン機能を実装

## 開発概要
①投稿時にプルダウンで選択した情報を、変数を使って検索をプルダウン式でかける。
②検索用のparamsをコントローラーで作成
・検索したいカラムの選択項目を検索バーにも作成する
③コントローラーで検索した結果だけを表示する変数を作る
・ビューに表示

実装イメージはこちら

ー投稿一覧ページー
![スクリーンショット 2022-12-27 15.19.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.co

【Ruby】4つの等値演算子

# equal?メソッド

以下の例を見てみます。

“`ruby
p “foo”.equal?(“foo”) # => false
“`
これは一見して、同じ値に見えますが、falseが出力されます。
`equal?メソッド`では、内容や値で2つのオブジェクトを比較するのではなく、オブジェクトIDで2つの値比較します。

そしてこれから紹介する他の等値演算子と使い方に注意しなければいけないことは、**equal?メソッドをオーバーライドしてはいけない**ということです。
比較しているオブジェクトの両方が、メモリ内の同じオブジェクトを指していない限りtrueを返してはいけないように動作すべきと考えられています。

# “==”演算子
数値の比較でよくみる演算子です。
数値だけでなく、文字列の比較にも使用できます。

“`ruby
“foo” == “foo” # => ture
1.0 == 1 # => true
“`
FixnumとFloatの比較でも数値が同等であればtrueを返します。

# eql?メソッド
基本的には`==演算子`を同じ動きをしますが、特

【Rails】なぜcountよりもsizeを使うべきなのか?〜lengthの動きも一緒に確認〜

## 1. はじめに
パフォーマンス向上を考える時、“count“より“size“を使おうという話はよく耳にする。
「“size“だとクエリを毎回発行しないから良いんでしょ」くらいのことは知っていても、実際それぞれのメソッドがどんな挙動をしていて、どう使い分けたら良いかあまり意識せずなんとなくで使っている人は多いのではないだろうか

この記事では実際に3つのメソッドの動きを確認し、「なぜ“count“よりも“size“を使うべき」と言われているのか、また同時にどういう場合にどのメソッドを使ったら良いのかを考えてみたい

## 2. countメソッド
– SQLのCOUNTを使う
– キャッシュの有無に関係なく、毎回クエリを発行する
[GitHub](https://github.com/rails/rails/blob/984c3ef2775781d47efa9f541ce570daa2434a80/activerecord/lib/active_record/relation/calculations.rb#L43-L53)

“`console:conso

[Rails,Javascript]モーダルウィンドウの実装

チーム開発で活用しようと思った技術をアウトプット投稿
## 目的
以下のようなモーダルウィンドウの実装
商品の写真をクリックすると以下のように表示、背景の黒い部分をクリックすると戻る
![スクリーンショット.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2950107/b51c11a5-777b-d3f4-a5ff-cc91f28a67c4.png)

## 開発環境
– Ruby 3.1.2
– Rails 6.1.7
– bootstrap併用(bootstrap自体は実装機能と関係なし)

## 実装手順
### 1.モーダルの設置
モーダルを表示させたいページに以下の記述を行う
例)`index`ページに`show`ページの内容を表示したい場合は`index`に記述
“`(例)index.html.erb

“`
### 2.CSSの設定

[Rails,Javascript]RailsのviewでJavaScriptを用いて一定時間後に指定したページへ飛ぶ

チーム開発で活用した技術アウトプット投稿
## 目的
– 特定ページを訪れた際、一定時間後指定したページへリダイレクトする

## 開発環境
– Ruby 3.1.2
– Rails 6.1.7

## 基本的な書き方
指定したいページに下記`script`を記述

“`.js

“`
– `action`内の`window.location.href = ‘URL’;`で遷移先を指定
– `time`内の5*1000で秒数を指定(ミリ秒で指定する。1000 = 1秒)
– `setTimeout`で`time`に指定した時間経過後に`action`を実行

## 問題点
この記述をしたページから違うページに飛んだ場合でも実行されてしまう
※指摘してくれたチームメイトに感謝

例)Aboutページに指定している、指定