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

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

Ruby 無限ループで each_with_index のようなカウント数を得る

# コード例

“`rb
(1..Float::INFINITY).each { |i| p i }
“`

# 実行例

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89618/7d8aec45-3622-31d1-7825-34e98926fba3.png)

元記事を表示

Rubyでじゃんけんを作る プログラングの練習

# 何?

– 人数を指定してじゃんけんをする
– 勝敗がつくまでじゃんけんを続けて、勝敗がついたら試行回数を数える

# コード

“`ruby

variations = [“G”,”C”,”P”]

MEMBER = ENV[“MEMBER”].to_i || 3

puts “JANKEN!”
puts “#{MEMBER} members”

try_count = 0

loop do
cards = []
try_count += 1

MEMBER.times do
cards.push variations.sample
end

puts cards.join(” “)

# 勝敗が決まった場合
# じゃんけんで勝敗が決まるのは、手の種類が2個の場合である
if cards.uniq.count == 2
break
end
end

puts “#{try_count} tried”
“`

# 実行例

![image.png](https://qiita-image-store.s3.ap-nort

元記事を表示

FactoryBotを使用した2通りのインスタンス生成

# アウトプット
`FactoryBot.build(:モデル名)`は、ActiveRecordのnewメソッドと同様の意味を持つ。
新しいインスタンスを生成し、それに対するテストを行う際に用いる。

`FactoryBot.create(:モデル名)`は、ActiveRecordのcreateメソッドと同様の意味を持つ。
既にデータベースにインスタンスが登録されている状態で、テスト行う際に用いる。

# 学んだこと
buildメソッドは、主に下記のテストで使用する。
– ユーザー機能モデル単体テストコード
– データ機能モデル単体テストコード
– ユーザー新規登録機能結合テストコード

createメソッドは、主に下記のテストで使用する。
– データ機能コントローラー単体テストコード
– ユーザーログイン機能結合テストコード
– データ機能結合テストコード
– コメント機能結合テストコード

元記事を表示

Railsのbinding.irbで処理を止めて変数に代入しようとするとArgumentErrorがでる

# エラーの説明
動作などを確認する際にbinding.irbで処理を止めて変数に値を代入するような処理を行うと
このようなエラーが表示される。
エラーが表示されても変数の代入は行われるし、
binding.irbで処理を止めない場合も問題なく処理は行われる。
なお、binding.irbを記載する箇所、変数や値はどれでもエラーが出るので関係ない模様。
“`
irb:001:0> a = 1
/Users/ユーザーネーム/.rbenv/versions/3.1.0/lib/ruby/gems/3.1.0/gems/hirb-0.7.3/lib/hirb/view.rb:186:in `output_value’: wrong number of arguments (given 1, expected 0) (ArgumentError)
from :5:in `irb’

元記事を表示

【Rails】loggerの出力をminitestでテストする方法

コントローラのテストをする際に、logger出力のテスト方法につまったので、備忘録として残します。他にいい方法があれば教えていただけると幸いです。

## バージョン

Rails 6.1.5

## 実装方法

適当なアクションに遷移した時にlogを吐く場面を想定します。

“`ruby
class XXXController < ApplicationController def index logger.info "通ったで" #ここを検出したい end end ``` ログの内容をテストします。 ```ruby # stubを使用するために必要 require 'minitest/mock' # 略 test 'logger.info を出力' do http_method = lambda { get staffs_path } logs = get_logs(http_method) expected_message = "通ったで" assert_log(logs,expected_message) end # 略 #

元記事を表示

Gem 名の命名規則について

ユーザに Gem の読み込み方針を提示するために、命名規則が推奨されている

https://guides.rubygems.org/name-your-gem/

実際には、↑ の命名になっていない Gem もあるけど、デファクトスタンダードとして知っておく

# ① クラス・モジュール名に複数単語が含まれる場合
単語を `_` 区切りにする

require 先と同じ表記になるので、ユーザーフレンドリー

例えば、

– Gem 名は `ruby_parser`
– require 先は `〃`
– クラス・モジュール名は `RubyParser`

# ② 別の Gem を拡張する場合
拡張元を `-` 区切りにする

[require先は `/` 区切りとなり](https://ruby.studio-kingdom.com/bundler/guides/bundler_setup#:~:text=%E9%8B%AD%E3%81%84%E8%AA%AD%E8%80%85%E3%81%A7%E3%81%82%E3%82%8C%E3%81%B0%E3%80%81rack%2Dc

元記事を表示

【LeetCode】108. Convert Sorted Array to Binary Search Treeを解いてみた

## はじめに
コーディングテスト対策としてLeetCodeの108. Convert Sorted Array to Binary Search Treeを解いていく。

## 問題文を和訳
– 要素が昇順でソートされる整数配列numsが与えられた場合、
– それを高さバランスのとれた二分探索木に変換します。
– 高さバランスのとれた二分木は、
– すべてのノードの2つのサブツリーの深さが1つより大きく異なることのない二分木です。
– Input: nums = [-10,-3,0,5,9]
– Output: [0,-3,9,-10,null,5]
– Explanation: [0,-10,5,null,-3,null,9] is also accepted:

## 回答
“`108_ConvertSortedArraytoBinarySearchTree.rb
def sorted_array_to_bst(nums)
if nums.length <= 0 return nil end middle = nums.length / 2 root

元記事を表示

rails6 systemdの書き方について

# はじめに
初めてsystemdを書いた時の自分への戒めとして、こちらを書こうと思います。

# 環境
ruby 3.0.2
rails 6.1.4
puma 5.4

# 参考URL
https://www.rochefort.dev/posts/puma-systemd/

# エラー
“`
$ sudo journalctl -fp err
systemd:Failed at step CHDIR spawning /home/ec2-user/.rbenv/shims/bundle: No such file or directory
“`
単純に「bundleのファイルかディレクトリがありません」と思い確認してみた所、存在しています。
# 対象コード
“`
[Unit]
Description=Puma HTTP Server
After=network.target

[Service]

Type=notify

WatchdogSec=10

User=tomo

WorkingDirectory=/var/www/my_app/current

Environ

元記事を表示

【備忘録】Railsリレーション検索・作成総集

– ユーザー VS 性別(1:多)
– ユーザー VS スキル (多:多)

## 1:多(検索)
“`
User.find_by(sex_id: 1)
“`

## 多:多(検索)
“`
User.includes(:skills).where(user_skills: { skill_id: 1 })
“`
※user_skillsは中間テーブル

## 多:多(作成)
“`
User.new(skills: [Skill.find(1)])
“`

元記事を表示

Railsでxml, html などMIMEタイプごとに返すViewを指定する

mime typeによって返すviewを変更する方法です。

例えばxml, htmlへのレスポンスを別々に作成する場合

“`ruby:UsersController.rb
class UsersController < ApplicationController def show @user = users.find(params[:id]) respond_to do |format| # HTMLのレスポンス format.html # XMLを使う場合のレスポンス format.xml     # 指定がない場合のレスポンス     format.any end ``` html, xml それぞれに対応したテンプレートは以下のパスに作成します。 `app/views/users/show.html.erb` `app/views/users/show.xml.erb` ### MIME TYPE種類 https://developer.mozilla.org/ja/docs/Web/HTTP

元記事を表示

M1MacでGemのmysql2でエラー

# 環境
ホストOS:MacOS12.3
CPU:M1
仮想環境:docker compose
ruby: 2.7.5p203
rails: 6.1
MySQL: 8.0

# エラーメッセージ
以下は主なエラーを抜粋したものです。

“`
An error occurred while installing mysql2 (0.5.3), and Bundler cannot continue.
“`

“`
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.
“`

“`
ld: warning: directory not found for option ‘-L/usr/local/opt/openssl/lib’
“`

“`
ld: library not found for -lzstd
“`

エラーメッセージはerror,failed,not foundあたりが原因のことが多いですね。

# 解消するためにやったこと
### MySQLインストール
新しいPCでMySQ

元記事を表示

RailsアプリケーションでN+1問題を解決する

# N+1問題とは
N+1問題とは、1つのテーブルへのSQL発行+複数(N回)の関連テーブルへのSQL発行が発生している現象のことを示している。
つまり、データ量が増えるだけパフォーマンスが低下してしまう。また、大量のSQL発行でDBに高負荷をかけてしまう副次的な問題も発生してしまう。
###### 例えば、console上でSkillCategoryモデルから5つSkillの名前を取得してみると
“`ruby:ruby
Skill.limit(5).each do |skill|
p skill.skill_category.name
end
“`
###### 下のようにconsole上でSQL発行ログが出力される
“`sql:sql
Skill Load (0.4ms) SELECT “skills”.* FROM “skills” LIMIT ? [[“LIMIT”, 5]]
SkillCategory Load (0.2ms) SELECT “skill_categories”.* FROM “skill_categories” WHERE “skill_

元記事を表示

本日のRuby基礎練習問題(22/4/12)

# 問題
以下の要件を満たすsum_numberメソッドを実装しましょう。
第一仮引数をnとし、第二仮引数をmとすること
nからmまでの数を足し合わせていき、その総和を出力すること
(例:n=1,m=5の場合、総和は1+2+3+4+5=11)

↓雛形
“`ruby.rb
def sum_number(n, m)
# 処理を記述
end

# 呼び出し例
sum_number(1,10)
“`
出力例
sum_number(1,3) → 6 <計算内容:1+2+3>
sum_number(1,10) → 55 <計算内容:1+2+3+4…+10>
sum_number(5,15) → 110 <計算内容5+6+7+8…+15>
# 私の回答
“`ruby.rb
def sum_number(n, m)
total = 0
while n <= m total = total + n n = n + 1 end puts total end # 呼び出し例 sum_number(5,15) ``` # 解説 まず2行目に変数totalに0を代入

元記事を表示

Ruby 正規表現「先読み」

正規表現で「先読み」というものについて最近知ったので自分の言葉でまとめてみようと思う。

## Onigmoとは

Ruby2.0以降では[Onigmo](https://github.com/k-takata/Onigmo)という正規表現エンジンが使用されています。
Onigmoは[鬼車](https://github.com/kkos/oniguruma)のフォークバージョンであり、鬼車はRubyのバージョン1.9やバージョン5以降のPHPの正規表現エンジンとして採用されています。

## ?= 先読み Look-ahead

「先を読む」とはなんだろう。
「look ahead」には「先のことを考える」「将来に備える」という意味がある。

先読みの正規表現とは、“`A(?=B)“`のようにかき、以下のようにマッチします。

“`ruby:Ruby
p “When we look at global environmental issues, we have to look ahead to the future”.scan(/look (?=ahead)/)
#=>[“lo

元記事を表示

Railsのバージョンアップ時にCSRFトークンに悩まされた話

Railsを使用していると、普段何気なく運用しているCSRFという仕組み。
このCSRFについて、Railsのバージョンアップ時に苦戦した経緯がありましたのでシェアしたいと思います。
そもそもCSRFとは?という方については、下記に分かりやすく解説してくれている記事がありますのでそちらを参考にして頂ければと思います。
[RailsのCSRF対策について](https://qiita.com/eshow/items/915f8e8ad317aa8e49a6)

### Railsのバージョンによって生成されるCSRFトークンが異なる
今回のバージョンアップではRailsを6.1→7.0に上げたのですが、この旧バージョンと新バージョンで生成されるCSRFトークンが異なります。どのような違いかというと、旧バージョンでは通常のBase64でトークンがエンコードされるのに対し、新バージョンではURLセーフなBase64でエンコードするようになりました。
そしてこのトークンが異なる状態で、ページ遷移するとArgumentErrorを引き起こします。(この時は旧バージョンから新バージョン、新バージョ

元記事を表示

RubyのHashでキーと値を入れ替える

# 組み込みメソッド invert を使う
キーと値を入れ替えた新しいハッシュを作成して返す。
元のハッシュで値が重複していた場合、最後に定義されている値のみ残る。
“`ruby
hash1 = {main: “hamburger”, side: “potato”, drink: “cola”}
hash1.invert
#=> {“hamburger”=>:main, “potato”=>:side, “cola”=>:drink}

hash2 = {main: “hamburger”, side: “hamburger”, drink: “cola”}
hash2.invert
#=> {“hamburger”=>:side, “cola”=>:drink}
“`

詳しくはこちら
https://docs.ruby-lang.org/ja/latest/method/Hash/i/invert.html

# invert を使わない方法
あまり需要はないかもしれないが、`Hash#each_with_object` でも表現できる。

“`ruby
hash.each

元記事を表示

vimからdocker-compose上のrspecを実行する

# 結論

`Vim`で開いている`rspec`ファイルのカーソル位置にあるテストを、自分の開発環境の`docker compose`上の`rspec`で、気軽に実行出来る様にしました。

– 結果は[vim-dispatch](https://github.com/tpope/vim-dispatch)を使って`quickfix`に表示。
– あとは温かみのある手作り。
– `rspec`に渡すパスは、`docker-compose`のパスに合うように、`rspec`の絶対パスから切り出して作成
– カーソル行を取得してテスト対象を指定

“`vim
” docker-composeでのテスト用定義。環境が変わったら書き換える
function! RunLineSpec() abort
let absolute_path = expand(“%:p”)
let relation_path = absolute_path[stridx(absolute_path, “spec/”):]
let rspec_cmd = ‘docker compose run {do

元記事を表示

Ruby を Crystal にトランスパイル して競プロ典型90問_001: Yokan Party(★4)を解いてみた

# はじめに
https://qiita.com/superrino130/items/55d602f64360d55c51e8

前回記事のview数の伸びに驚きました。~~普段の記事の10倍くらい~~

それはさておき、少しずつマッシュアップしたいものです。
# Yokan Party
https://atcoder.jp/contests/typical90/tasks/typical90_a

ご存知、競プロ典型90問の1問目。
二分探索を行います。
# Ruby 元コード(最適化前)
“`rb:before.rb
def check(mid)
cnt = 0
cut = 0
@a.each do |x|
if x – cut >= mid
cut = x
cnt += 1
end
end
cnt >= K + 1
end

N, L = gets.split.map(&:to_i)
K = gets.to_i
@a = gets.split.map(&:to_i)
@a << L @a.unshift 0 puts

元記事を表示

RSpecのディレクトリ

# アウトプット
RSpecのディレクトリは下記の通り。

– spec
– factories `(FactoryBot)`
– models `(モデル単体テストコード)`
– requests `(コントローラー単体テストコード [Request Spec])`
– system `(結合テストコード [System Spec])`

# 学んだこと
(factoriesは除く)テストコードの実行時にコマンド入力するのは、
`bundle exec rspec spec/ディレクトリ名/ファイル名`
と共通している。

`何に対するテストを行おうとしているか`を把握しておけば、
ファイルの場所やコマンド入力に苦労しにくくなる。

元記事を表示

Ruby-Graphviz でサブグラフを描く

# ゴール
[Ruby-Graphviz](https://github.com/glejeune/Ruby-Graphviz) で[サブグラフ](https://graphviz.org/Gallery/directed/cluster.html) を描きたい

# まずは、dot 言語で書いてみる
[Graphviz 解説記事](https://qiita.com/rubytomato@github/items/51779135bc4b77c8c20d#%E3%82%B5%E3%83%96%E3%82%B0%E3%83%A9%E3%83%95%E3%81%AE%E5%AE%9A%E7%BE%A9)を参考にして

“`dot
digraph node_sample {

subgraph cluster_1 {
label = “clu1”;
labelloc = “t”;
labeljust = “l”;
fillcolor = “#888888”;

nu [label = “nu”, shape = “trapezium”];

元記事を表示

OTHERカテゴリの最新記事