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

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

100日後くらいに個人開発するぞ!day052

## 今日はインスタンスメソッドを学んでみた!

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2632394/1927ee16-998b-e958-856c-3062b5e1877a.png)

## 今日の学び
### クラスの中で定義したメソッドの使い方
* クラスの中でメソッドを定義でき、「インスタンス.メソッド名」で呼び出せる
* 例
* `class Menu`
* ` attr_accessor :name`
* ` attr_accessor :price`
* ` def show`
* ` puts “私はメニューです”`
* ` end`
* `end`
* `menu1 = Menu.new`
* `puts menu1.show`
* インスタンスメソッドも引数を受け取ったり戻り値を返すことができる

元記事を表示

【Ruby】バリデーションのかけ方 Part1

## バリデーションの基本的な掛け方
### バリデーションとは?
入力されたデータ、プログラミング言語やマークアップ言語の記述が、適切に記述されているかどうかを検証することである。
多くの場合は、プログラミング言語においてフォームなどに入力された文字列が入力規則に対して妥当に記述されているかどうかを検証する仕組みを指す。記述が妥当でない場合はエラーとして値を返すように設定される。

### 基本的なバリデーションの掛け方
“`
validates :カラム名, ヘルパー
“`
Railsにはバリデーションのヘルパーが多数用意されている。
このヘルパーを使うとどういう検証を行うかを定義することができる。
主なヘルパーを紹介していきますね。

### バリデーションのヘルパー
#### presence
一番多く使うヘルパー。
定義すると「空でないか」を検証してくれ、空でない場合はエラーで弾かれる。
多くの場合は必須で入力するじゃないかな?
“`
validates :カラム名, presence: true
“`
入力するカラム名が空でないかを検証する。
例えば以下のように入力

元記事を表示

クラス変数を使ったインスタンスカウンターの書き方(自分用)

https://www.javadrive.jp/ruby/class/index8.html

元記事を表示

[ポリモーフィズムとは?]具体例で考える

## こんな人に読んでほしい
– ポリモーフィズムって言葉は聞いたことがある
– ググってもイマイチわからない
– 具体例を出して説明してほしい

## 具体例
ここはブック○フ。最近は、本も洋服もゲームも売っている。

こことコンビニさえあれば、一生生きていけるなぁ、
そんなことを思っていた矢先、在庫を管理するシステムの設計を任された。

先輩 「まず、在庫の情報を出力するコードをかいてね☆」

さぁ、こんなときどんなコードを書きますか??

## ポリモーフィズムを一言でいうと
ポリモーフィズム(多態性)の文字通り、同じメソッド名なのに、
クラスによって実行結果が変わる

## 今回の例でいうと
Itemを継承しているBook、GameSoft、Clotheにおいて定義したprintメソッドがあり、それを呼び出すと、それぞれの子クラスに合わせて違う結果を返してくれる

## 情報の整理
– 在庫(stock)にある商品(item)には全て、title, price, categoryがある
– 商品の種類は3種類
– 本(book): 著者(author)の情報がある

元記事を表示

Rubyで宣言的なプログラムを書くためのテクニックTips

## この記事は何
この記事は、宣言的なプログラムを書くために使える、ちょっとしたテクニックを紹介していきたいと思います。

宣言的なプログラミングが何かは以下の記事が参考になると思います。

https://qiita.com/jun1s/items/5f60bbb886626d897abc

## テクニック集

### テクニック1: 変数は使い回さない
Rubyの場合、定数が少しピーキーな挙動になっているので、基本的に全ての変数は可変になってしまうと思います。
変数を使いまわしたり、値を変更するのはできるだけ避けることで、コードが追いやすくなり、冪等性の担保されたコードがかけるようになります。

“`rb:bad
a = 1
a += 1
“`

“`rb:good
a = 1
b = a + 1
“`

### テクニック2: 破壊的メソッドは用いない
破壊的メソッドは、自身の状態を変更させるメソッドです。これらのメソッドを用いると、テクニック1で述べた内容と同じく、コードが追いづらくなります。

値の変更はできるだけ非破壊的なメソッドと変数代入を用いるようにしましょ

元記事を表示

eachの危険性を体で覚えて、その代替手段を知る(Ruby, Rails)

# やっちまった
話を単純化してお伝えすると、1万件以上レコードがあるusersテーブルに対して、`is_active`というカラムがあって、全員trueにしたかったです。

これを実現するのに、**全usersに`each`をかけて`update_column`する処理を仕掛けたら、本番のサーバーを一瞬死なせてしまい、めちゃめちゃ焦りました**。

“`ruby
User.all.each do |user|
user.update_column(:is_active, true)
end
“`

`User.all.each`すると、該当するレコードを全て取得してきて、メモリに置いて処理をするので、それで激烈に重くなってしまうようです。この場合、Userのインスタンスを1万件以上取得して配列にしてそれをメモリにドーン!と置いて処理しようとしたので、それがメモリを強烈に圧迫してしまったみたい。

# 解決策1:`find_each`を使う
この時の対処方法の1つが`find_each`を使うこと。

これはレコードを持ってくる数に制限をかけながら処理を実行するので、メモリへの

元記事を表示

Ruby で手続きを別プロセスに渡したい

# はじめに
Ruby の並列実行では,[parallel](https://github.com/grosser/parallel) を使うのが簡便である.

“`ruby
require ‘parallel’

results = Parallel.map([‘a’,’b’,’c’], in_processes: 3) do |one_letter|
SomeClass.expensive_calculation(one_letter)
end
“`

他方,`in_processes` では,メインプロセスをフォークして実行するので,メインプロセスのメモリ使用量が多く,分割プロセス数が膨大な場合,メモリが枯渇して `Parallel::DeadWorker` や「Killed」が発生してしまう.これを回避するには,子プロセスを,`Kernel.#system` などによる別コマンドとして実行すると良い[^1].入出力が必要な場合は,`IO.popen` などを使うとよいだろうか.

[^1]: [Ractor](https://techlife.cookpad.com/e

元記事を表示

Ruby 練習問題3 ~クラスとインスタンスの概念を用いたコードの作成~

こんにちは、プログラミング初学者”fujitacoma”です!

今回は、Ruby練習問題シリーズの3回目です。
前回まではハッシュ問題でしたが、今回はクラスとインスタンスの問題です!

それでは早速始めます!

# 問題
“`ruby
class Article

def initialize(author, title, content)
@author = author
@title = title
@content = content
end

end
“`
上記のコードに追加を行い、以下の出力結果を得られるようにしてください。
ただし、クラスとインスタンスを使用するものとします。
“`
著者: 阿部
タイトル: Rubyの素晴らしさについて
本文: Awesome Ruby!
“`
# 回答と解説
### 模範解答
“`ruby
class Article

def initialize(author, title, content)
@author = author
@title = title
@con

元記事を表示

SinatraでCtrl+Cを2回押さないと停止しない問題

# 事の始まり
( ^o^)「Sinatraでメモアプリ作るぞ〜〜」

( ^o^)「起動を確認して…大丈夫だな。Ctrl+Cで終了するぞ」

(; ^o^)__「…あれ!?一回押しただけじゃ終わらない!?」__

# 結論(原因)
– スーパークラスの指定を間違えていた
– READMEをしっかり読んでいなかった
– 思い込みでコードを書いていた
– GitHub(ソースコードやissue、使用例)を読んでいなかった
– 開発のためにrequireしていたものが影響を与えていた

## 開発環境
Ruby 3.1.2p20
Sinatra 2.2.0

# Sinatraとは?
> Sinatra is a DSL for quickly creating web applications in Ruby with minimal effort:
引用元: [Sinatra](http://sinatrarb.com/)

簡単にRubyでWebアプリケーションを作ることができる[DSL](https://ja.wikipedia.org/wiki/%E3%83%89%E3%

元記事を表示

100日後くらいに個人開発するぞ!day051

## 今日はクラスとインスタンスを学んでみた!

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2632394/aebc7b0f-72df-b942-24af-ad4b602d2c8f.png)

## 今日の学び
### クラス
* プログラムの設計図をクラス、生成されるものをインスタンスという
* インスタンスを生成するステップ
* クラス(設計図)を用意する
* クラスからインスタンスを生成する
* インスタンスに情報を追加する
* クラスは「class クラス名」で定義できる
* クラス名は必ず大文字で始める
* 「end」を書く必要がある

### インスタンス変数
* クラスのインスタンスの変数をインスタンス変数という
* 例:Menuクラスにnameというインスタンス変数を設定する場合
* `class Menu`
* ` attr_accessor :name`
* `e

元記事を表示

管理者機能実装後におけるデプロイ時の注意点

こんばんは、プログラミング初学者”fujitacoma”です!

今回は、以前に投稿しました記事、
”管理者ユーザー機能の実装[Ruby, Rails]”の後日談のようなものを、
備忘録として書いていきたいと思います!

”管理者ユーザー機能の実装[Ruby, Rails]”はこちらからどうぞ↓
https://qiita.com/fujitacoma/items/974d18fbebf8c73c411c

# はじめに
使用クラウドサービスはHerokuです。

# 起こったこと

それは、管理者ユーザー機能を実装及びデプロイ完了後に、
嬉々として本番環境で確認をしようとした際に起こりました、、

管理者用のアドレスとパスワードでログインできない、、、!!
冷や汗。

# 原因調査
なぜ?意味なく開発環境のdbも確認する。
ちゃんと管理者用のアドレスとパスワードは保存されている。(当然)

db/seed.rbに管理者ユーザー情報が記述されているか確認する。

次はデプロイのログを隅々まで確認する。
ちゃんと、
“`
git push heroku master
“`

“`

元記事を表示

railsでsorceryをbundleしたらoauth2をアップデートしてくださいと言われた

先日`rails`で`sorcery`を使おうと思い、`Gemfile`に追加して`bundle install`を実行したところ、「インストールされている`oauth2`のバージョンがもうサポートされていないのでアップデートしてください」と言われ少し詰まったのでまとめました。

## 環境
Rubyバージョン 3.1.2
Railsバージョン 6.1.6

## 詳細
`Gemfile`に`sorcery`をバージョンを指定せず追加

“`ruby:Gemfile
# 追加
gem ‘sorcery’
“`

`bundle install`を実行したところ以下のようなメッセージエラーが出ました。
“`shell:ターミナル
% bundle install
You have installed oauth2 version 1.4.10, which is EOL.
No further support is anticipated for the 1.4.x series.

OAuth2 version 2 is released.
There are BREA

元記事を表示

曜日を10秒で暗算しよう!

# 曜日を暗算でパっと計算したい
「来月の31日にスケジュール入れておいたから」
「水曜日ですね、わかりました(キリッ」

これがやりたい。
毎回式だけ作って忘れちゃうのでメモ。

# ツェラーの公式
曜日を求めたい日付を西暦$Y$年$m$月$d$日とすると、
曜日$h$(0 = 日曜日, …, 6 = 土曜日)は、以下の式で表せられる。[^1][^2]
$${\displaystyle h=\left(d+\left\lfloor {\frac {13(m+1)}{5}}\right\rfloor +K+\left\lfloor {\frac {K}{4}}\right\rfloor +\left\lfloor {\frac {J}{4}}\right\rfloor -2J -1\right){\\%7}}$$
ただし:
$$K={\displaystyle Y\\% 100,}\\\\
J={\displaystyle\left\lfloor {\frac {Y}{100}}\right\rfloor,}\\\\
m=1\mbox{ または }m=2\mbox{ のときは

元記事を表示

Nokogiriを使って絵文字unicodeとキーワードのJSONを作る

# はじめに
ふと、絵文字のunicodeと絵文字のキーワード(検索とか予測変換に使う単語)が組み合わさったJSONが欲しくなりました。
こんな感じのJSON
“`JSON
[
{
“hex”: “1F347”,
“annotations”: [
“ぶどう”,
“グレープ”,
“果物”
]
},
{
“hex”: “1F348”,
“annotations”: [
“メロン”,
“果物”,
“野菜”
]
},
{
“hex”: “1F349”,
“annotations”: [
“スイカ”,
“果物”,
“野菜”
]
}
]
“`

なのでNokogiriを使ってスクレイピングしてJSONを作りたいと思います。

# やること
スクレイピングする対象のサイトはUnicodeコンソーシアムの[CJK Annotations](https://unicode-org.github.io

元記事を表示

nervの模様のコードを作ったよ!

# TL;DR
quine作った!
ちなみにこのコードは動きます、試してみてね!
“`ruby
eval(
(%w(1.upto
(18)do|i|s=i
;if (i==1);s=”A DAM”elsi
f( i==2);s=”LILITH”elsif(i
==3);s=”SACHIEL”elsif(i==4);s=
“SHAMSHEL”elsif(i==5);s=”RAMIE
L”elsif(i==6);s=”GAGHIEL”els
if(i == 7);s=”ISRAFIL”elsif(i==8);
s=”SA N DAL PHON”elsif(i==9);
s =”MATA RAEL”elsif(i==10);s=”SA

元記事を表示

【Ruby on Rails】検索機能追加

# 開発環境
Rails 6.1.4.1
ruby 2.6.3

# 前提条件
– devise導入
– Bootstrap導入
– Userモデル、Bookモデル実装済み
– ユーザー一覧表示と投稿一覧は部分テンプレートで作成済み

# 目次
– コントローラー作成
– ルーティング
– モデル定義
– View作成

## ①コントローラー作成
まずは検索機能のコントローラーを作成します。
同時にコントローラーアクションも作成します。

“`ruby:ターミナル
$ rails g controller searches search
“`

searchesコントローラーのsearchアクションを定義します
“`ruby:searches.contoroller.rb
class SearchesController < ApplicationController before_action :authenticate_user! def search @range =params[:range] @word =params[:word]

元記事を表示

Selenium(Capybara)+Firefox+Rubyでconsole.logを取得する

## このページについて
Firefox + Selenium(Capybara) で console.log に出力される値を取得する方法について、苦戦したので備忘録です。

## 環境
* Ruby 2.6
* Capybara 3.32.1
* Firefox 2022/7/5 時点で最新のもの
* Geckodriver 2022/7/5 時点で最新のもの
## やりたいこと
console.log に出力される値を Selenium で取得し、ログに出力したい。

Chrome の場合は `driver.manage.logs.get` で簡単に取得できますが、Geckodriver ではこの方法は現時点では使えません。
以下 issue に代替案が書かれていますので、こちらを参考にします。
https://github.com/mozilla/geckodriver/issues/284

## コード
Capybara の設定に `devtools.console.stdout.content` を追加します。
“`ruby
Capybara.register_driv

元記事を表示

「完全に理解した」状態の僕が「チョットワカル…」になるまでのとある企業の新人研修 part.3

▼part1こちらから▼
https://qiita.com/kobayashimakoto/items/4fe942815c7fc941821f

▼part2こちらから▼
https://qiita.com/kobayashimakoto/items/ca131b8fbe8007a18f00

こんにちは
part2でご紹介した、~~社内でのボッチ生活を解決する~~ サービス **TeaTime** についてのお話です。

リリースして困ったことや、実際に運用してみてどうだったのかをご紹介します。

# そもそもTeaTimeって?
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2508607/654ccc04-4980-aa6b-d197-c387034e71fd.png)
ざっくり言うと、アプリに登録さえしといたら、
登録者の間でいい感じにお茶会をセッティングしてくれて
そのお茶会に参加することで、**仲良くなれる機会を得る**というサービスです。

▼作った時の話はpart2を

元記事を表示

Mysql2::Error: Duplicate column name ‘xxxx’が出たときは既にあるカラムを消そう

# 背景
あるテーブルに3つのカラム追加する実装。

## 一度migrateでエラー
“`zsh
$ rails db:migrate
Mysql2::Error: Unknown column ‘xxx’ in ‘zzz’: ALTER TABLE `zzz` ADD `xxx` varchar(255) COMMENT ‘xxx’ AFTER `xxx`
“`

原因としてあるカラムを追加する際に、afterを使用してカラム位置を指定したが、その指定したカラム名を間違っていたためエラーを吐いていた。

再度、カラム名を修正してmigrateすると

“`zsh
$ rails db:migrate
Mysql2::Error: Duplicate column name ‘xxx’: ALTER TABLE `zzz` ADD `xxx` varchar(255) COMMENT ‘xxx’ AFTER `zzz`
“`

エラーを吐いていたが、エラー前に実行されたadd_columnでカラム追加されていた様で
同じカラムが存在していると再度エラーになった。

# 対処法

元記事を表示

Ruby 練習問題2 ~二重ハッシュ~

こんにちは、プログラミング初学者”fujitacoma”です!

今回は、Ruby練習問題シリーズの2回目です。
1回目より少しは難易度上がったかな、、?

それでは早速始めます!

# 問題
配列の内部に、複数のユーザーの情報をハッシュとして持つ変数user_dataがあります。
“`ruby
user_data = [
{user: {profile: {name: ‘George’}}},
{user: {profile: {name: ‘Alice’}}},
{user: {profile: {name: ‘Taro’}}},
]
“`
user_dataを利用して、全てのユーザーの名前だけが出力されるようにRubyでコーディングしてください。
ただし、出力結果は次のようになるものとします。
“`
George
Alice
Taro
“`

# 回答と解説

### 模範解答
“`ruby
user_data.each do |u|
puts u[:user][:profile][:name]
end
“`
もしくは
“`ruby
user_data.

元記事を表示

OTHERカテゴリの最新記事