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

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

本日の基礎練習問題(22/3/24)

# 問題
メソッドに3つの整数a b cを与えます。
・「aとbの差が1」または「aとcの差が1」であり、かつ「bとcとの数値の差が2以上」の場合はTrue
・それ以外はFalse
と出力するメソッドを作りましょう。

出力例:
close_far(1, 2, 10) → True
close_far(1, 2, 3) → False
close_far(4, 1, 3) → True

ヒント
返り値を絶対値(この場合は正の整数)に変換する際はabsメソッドを使いましょう。

# 私の回答
“`
def number_far(a,b,c)
x = (a-b).abs
y = (a-c).abs
z = (b-c).abs

if x == 1 && z >= 2
puts “True”
elsif y == 1 && z >= 2
puts “True”
else
puts “False”
end
end
“`

# 解説
まずa,b,cの整数の差をabsメソッドを使用しx,y,zに代入。
その後「aとbの差が1」または「aとc

元記事を表示

【Ruby】requireとloadの違いについて

requireとloadの違いについてまとめておく。

## requireの場合

“` test.rb
module Lib
$num += 1
end
“`
“`test1.rb
$num = 0
1..10.times do |n|
require ‘./test.rb’
end
puts $num
“`
“`
1
“`
上記では“require“を使用してtest.rbをロードしている。
requireの場合は、ファイルのロードは1度のみ行われるため、1が表示される。

## loadの場合
“` test.rb
module Lib
$num += 1
end
“`
“`test1.rb
$num = 0
1..10.times do |n|
load ‘./test.rb’
end
puts $num
“`
“`
10
“`
“load“を使用してtest.rbの読み込みを行なっている。
“load“は無条件にファイルをロードすることができるため、10回処理が行われて“10“となる。

## requireとloa

元記事を表示

カレンダーミニアプリを作ってみた

RailsのGemであるSimple Calendarを利用して、ミニアプリを作ってみた。

## アプリの新規作成
まずはアプリの新規作成から。
ターミナルで以下を実行する。

“`:ターミナル
rails _6.0.0_ new minicalendar -d mysql
“`

次にencodingの設定を変更。

“`yaml:config/database/yaml
default: &default
adapter: mysql2
encoding: utf8 #ここを変更する
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
username: root
“`

.gitignoreファイルの一番下の行に、.Ds_Storeと追記。

“`:gitignore
/public/packs
/public/packs-test
/node_modules
/yarn-error.log
yarn-debug.log*
.yarn-integrity
.Ds_Store #ここに追記
“`

元記事を表示

【LeetCode】26. Remove Duplicates from Sorted Arrayを解いてみた

## はじめに
コーディングテスト対策としてLeetCodeの7. Reverse Integerを解いていく。

## 問題文を和訳
– これは、O(1) の余分なメモリを使用して入力配列をin-placeで変更することによって行う必要があります。
– 明確化:
– 戻り値が整数であるのに、答えが配列である理由が混乱していますか?
– 入力配列は参照によって渡されることに注意してください。
– つまり、入力配列への変更は呼び出し側にも認識されます。
– 内部的には、次のように考えることができます。
– numsは参照によって渡されます。(つまり、コピーを作成せずに)
– int len = removeDuplicates(nums);
– 関数内のnumsへの変更は、呼び出し元に認識されます。
– 関数から返された長さを使用して、最初のlen要素を出力します。
“`
for(int i = 0; i

元記事を表示

【LeetCode】21. Merge Two Sorted Listsを解いてみた

## はじめに
コーディングテスト対策としてLeetCodeの21. Merge Two Sorted Listsを解いていく。

## 問題文を和訳
– 並べ替えられた 2 つの連結リストをマージし、
– 並べ替えられた連結リストとして返します。
– リストは、最初の 2 つのリストのノードをつなぎ合わせて作成する必要があります。
– Input: l1 = [1,2,4], l2 = [1,3,4]
– Output: [1,1,2,3,4,4]

## 回答
“`21_MergeTwoSortedLists.rb
def merge_two_lists(list1, list2)
list3 = ListNode.new(0)
result = list3
while list1 != nil && list2 != nil
if list1.val <= list2.val list3.next = list1 list1 = list1.next else list3.next = list2 l

元記事を表示

復習 Ruby on Rails

1

元記事を表示

Rubyではシフト演算 `1 << k` より配列参照 `lookup[k]` のほうが速い

AtCoderの問題をRubyで復習していて、どうしても時間制限超過(TLE)してしまうものがあった。

他の方の解答を見たりして試しているうちに、どうも**シフト演算の実行回数が多いとTLEしやすい**ということがわかった[^bit-op]。計算したいのは `1 << k` という単純なもの(を最大3000万回ほど)なので、これを事前に計算しておき配列参照 `lookup[k]` に置き換えたところ無事に通過した。 そんなに速度差があるのか気になったので、ベンチマークしてみた。 [^bit-op]: 他の演算なども遅い可能性はあるが、削減しやすいのはシフト演算だけだった。 ## ベンチマーク AtCoderのコードテストを利用。その結果、配列参照のほうが**約1.3倍**速く、3000万回計算すると0.3秒ほど短くなった。 ```ruby:shift-vs-lookup.rb puts RUBY_DESCRIPTION puts require 'benchmark' n = 30 lookup = Array.new(n) { |i| 1 << i } m = 30_

元記事を表示

【Ruby】みんな理解出来てる?テンプレートメソッドパターンのこと。

# テンプレートメソッドパターンとは?
テンプレートメソッドパターンは[GoF](https://gimo.jp/glossary/details/gang_of_four.html)のデザインパターンの一種です。

このパターンは、基底クラスに不変の部分を記述し、変わる部分はサブクラスに定義するメソッドにカプセル化するというモノです。
`変わるものと変わらないものを分離する`という設計の考えに基づいています。

つまり次の2つのオブジェクトによって構成されます。

“`ruby
– 骨格となる「抽象的な基底クラス」
– 実際の処理を行う「サブクラス」
“`

## メリット
– 基底クラス側に、「不変の基本的なアルゴリズム」を配置可能になる。
– 「高レベルの処理を制御すること」に集中できる。
– サブクラス側に、「変化するロジック」を置ける
– 「詳細を埋めること」に集中できる
– 似通った部分を共通化して「サブクラスに対してスーパクラスで実装されている抽象メソッドを実装する」という責任を与えることが可能になる。

## 実装例

### 基底クラス

“`r

元記事を表示

【Ruby】構造体クラスを使いこなしたい。

# 概要
みなさん。「構造体クラス」使ってますか?
たくさん利用してる人もいれば、聞いた事もない人がいるかと思います。
便利なRubyのクラスなのでぜひ頭の隅にでも置いておいてください!

## Sturctとは
Rubyにおける構造体クラス(Struct)は簡易的なクラスのようなものです。
簡易的なもののため、「継承」「メンバ」の追加・削除は出来ません。
明示的にアクセスメソッドを定義しなくても、構造体クラス外でメンバの参照・更新は可能です。

以下のような場面で使えます。
– まとまったデータを扱いたいが、クラスを作るまでもない場合。
– クラス内で特定のデータのまとまりを表現する場合。

### 定義方法

以下のように定義することで構造体クラスを使えるようになります。

“`ruby
# Struct.new(‘構造体クラス名’, メンバ)
Struct.new(“User”, :name, :age)

# 第一引数を省略する事も可能
User = Struct.new(:name, :age)

# クラスのように定義する事も可能
class User < Struct.

元記事を表示

【Rails】なぜ”private” “protected” “public”に分けるのか

# 概要
あるメソッドを実装するときに「アクセス権をどうするか?」という問題に必ず直面すると思います。
それぞれの特徴を知っておくことで、効率良く設計・開発が可能です。
ちなみにこれは`カプセル化`と言い、、オブジェクト同士の紐付き(関係性)を薄くし独立性を高め、再利用や交換といった保守性を高める効率の考え方です。

## 特徴
### publicメソッド

“`
– クラスの主な責任や目的を明らかにする
– 外部から実行されることが想定される
– 思いつくままに変更されたりはしない
– 他者が依存したとしても安全
– テストで完全に文書化されている
“`

### privateメソッド

“`
– 実装の詳細に関わる部分
– 外部から実行されることは想定されていない
– 変更されやすい
– 他者が依存するのは危険
– 基本的にはテストはしない(個人的な意見です。諸説あり。)
“`

### protectedメソッド

“`
– 外部からは隠蔽されている
– 仲間(自クラスかサブクラスのレシーバー、親子関係にあるクラスのみ)からは実行可能
“`

## 判断のポ

元記事を表示

RailsアプリにChoices.jsを使ったセレクトボックスを作る

## 概要
Choices.jsを使ってセレクトボックスを作成しました

## はじめに
現在、[フィヨルドブートキャンプ](https://bootcamp.fjord.jp/)でチーム開発をしています。
[Choices.js](https://github.com/Choices-js/Choices)というライブラリを使って、セレクトボックスを作成しましたが、情報が少なかったのでQiitaに記事として残しておきます。
初学者向けの内容となっています。

## Choices.jsについて
軽量な選択ボックス/テキスト入力プラグインです。リッチなセレクトボックスが作れます→[DEMO](https://choices-js.github.io/Choices/)
Select2およびSelectizeに似ていますが、jQueryの依存関係はありません。
2年ほどリリースが止まっていたようですが、2021年の12月より再びメンテナンスされているようです。

## インストール
– npm
“`
npm install choices.js
“`
– yarn
“`
yarn

元記事を表示

Rails + RBS & Steepを試してみて困ったところとか感想とか

## まえがき

Railsアプリに型チェックを導入しようとして試しているのですが、なかなか一筋縄ではいかないようで、試行錯誤しています。

おそらく他にも似たようなことでハマったりしている人もいるかと思うので、これまで困ったこと、そして(回避できた場合は)回避策を書いてみます。

なお、RBSやSteepとはなんぞやといった辺りは特に説明せずにいきなり本題に入るため、詳しくない方は[mameさんの記事「Ruby 3の静的解析機能のRBS、TypeProf、Steep、Sorbetの関係についてのノート」](https://techlife.cookpad.com/entry/2020/12/09/120454)などを参考にしてください。

## Steep & RBSで困ったところ

### BigDecimalを導入してもto_dが使えない

Steepfileに`library “bigdecimal”`を書いてもダメでした。rbsの定義が必要そうですが、stdlibのテストの書き方がよく分からない…(assert_send_typeを使ってもmethod_typesでエラーにな

元記事を表示

本日の基礎練習問題②(22/3/23)

# 問題
西暦の年数および月を入力し、その月の日数を求めるプログラムを書きます。
その場合、閏年について考慮する必要があります。

閏年は以下の判断基準で決まります。
①その西暦が4で割り切れたら閏年である
②ただし、例外として100で割り切れる西暦の場合は閏年ではない
③ただし、その例外として400で割り切れる場合は閏年である

つまり、西暦2000年は閏年であり、西暦2100年は閏年ではありません。
これらに対応できるように、出力例と雛形をもとに実装しましょう。

出力例
1990年2月 =>”1990年2月は28日間あります”
2000年2月 =>”2000年2月は29日間あります”
2100年2月 =>”2100年2月は28日間あります”
2000年3月=>”2000年3月は31日間あります”
“`雛形.
def get_days(year, month)
month_days = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
# ここに処理を書き加えてください
end

puts “年を入力してください:”
yea

元記事を表示

本日の基礎練習問題①(22/3/23)

**問題**
以下の要件を満たすxyz_thereメソッドを実装しましょう。
任意の文字列から連続する文字列”xyz”を探し、その直前にピリオド(.)がない場合はTrueを出力する
任意の文字列から連続する文字列”xyz”を探し、その直前にピリオド(.)がある場合はFalseを出力する
上記2つの条件に当てはまらない場合はFalseを出力する
“`雛形.
def xyz_there(str)
# 処理を記述
end

# 呼び出し例
xyz_there(‘abcxyz’)
“`
出力例
xyz_there(‘abcxyz’) → True
xyz_there(‘abc.xyz’) → False
xyz_there(‘xyz.abc’) → True
xyz_there(‘azbycx’) → False
xyz_there(‘a.zbycx’) → False

# 私の回答
“`ruby.
def xyz_there(str)
if str.include?(“.xyz”)
puts “False”
elsif str.include?(“xyz”)

元記事を表示

Rubyのメソッド名につく?(クエスチョンマーク)について

# はじめに
末尾に `?` がついているメソッドをよく見かけるけど、どういう役割なんだろう?と気になった

# そもそも `?` はどこで使われるているの?

>def xx?
この場合の「?」はメソッド名の一部分です。慣用的に、真偽値を返すタイプのメソッドを示すために使われます。

(引用: [Rubyリファレンス](https://docs.ruby-lang.org/ja/latest/doc/symref.html#q))

https://docs.ruby-lang.org/ja/latest/doc/symref.html#q

つまり `?` まで含んだものがメソッド名になるということ

“`ruby
def test?
true
end

[1] pry(main)> test1?
=> true
“`

# 例えばArrayクラスだと

https://docs.ruby-lang.org/ja/latest/class/Array.html

`include?` や `empty?` などのインスタンスメソッドがこれに相当する

# 末尾以外でも使え

元記事を表示

【Ruby】Procオブジェクトの呼び出し

“` ruby
def foo(n)
n ** n
end

foo = Proc.new { |n|
n * 4
}

puts foo[2] * 2
“`

この答えは “16“ になる。
Procを呼び出すときには、[]もしくは.callで呼び出すことができるらしい。

そのため、この問題では“puts foo[2] * 2“としているため、
“`
foo = Proc.new { |n|
n * 4
}
“`
この処理が走るということらしい。

ちなみに、“puts foo 2 * 2“であれば、
“` ruby
def foo(n)
n ** n
end
“`
この処理が走ることになるらしい。
あっているかわからないので、詳しい方コメントいただけたら嬉しいです。

元記事を表示

rails7(apiモード), react, dockerを使って環境構築してみた

# 環境

* Ruby 3.1.1
* Rails 7.0.2.3(apiモード)
* MySQL8.0
* node 17.2

rails→3001port、react→3000portになるように設定する

# 環境構築

まずは以下のディレクトリとファイルを作成

“`
invest_qa
|-api
|-Gemfile
|-Gemfile.lock
|-Dockerfile
|-entrypoint.sh
|-front
|-dockerfile
|-docker-compose.yml
“`

docker-compose.ymlは以下のように

“`yml:docker-compose.yml
version: ‘3’
services:
db:
platform: linux/x86_64 # M1チップ対応のため追記
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: password
ports:
– ‘3306:330

元記事を表示

RubyとPHPの比較(文字列と変数)

# この記事の概要
Rubyで学習を始めてPHPに言語チェンジをする人が一定数いるみたいなので
そういった人達が参考にするための記事です。

# 簡単な出力
簡単な出力からそれぞれ見ていきます。

⚫︎“`Ruby“`

“`rb
puts “プログラミング”
“`

⚫︎“`PHP“`

“`php

“`
PHPだと“`最後に;“`がつくのが特徴です。

両方とも***プログラミングと出力***されます。

⚫︎補足
“”だけでなく”で囲むことも可

# コメントの書き方
 コメントの書き方がそれぞれ違います。

⚫︎“`Ruby“`

“`rb
#コメント
puts “Ruby”
“`
Rubyでは“`#“`を使います。

⚫︎“`PHP“`

“`php

“`
PHPでは“`//“`を使います。

# 文字列と数値の連結

⚫︎“`Rub

元記事を表示

【Mac】Ruby3.1.1がインストールできなくて辛かった

なんとなく「Rails7を使ってみよう!せっかくだからRubyも新しいの入れとくか!」と思い立ったものの、全然全くインストールできずハマったのでのでその時の対処法をメモ。

実行環境:macOS Monterey(12.2.1)

## エラー
ruby3.1.1をインストールしようとするもエラーを吐かれてしまう。
“`
$ rbenv install 3.1.1

Last 10 log lines:
checking for llvm-strip… no
checking for gcc… clang
checking whether the C compiler works… yes
checking for C compiler default output file name… a.out
checking for suffix of executables…
checking whether we are cross compiling… configure: error: in `/var/folders/r1/x9mwdc5s12z1fj13

元記事を表示

ログイン情報保持について理解する(ステートレス、ステートフル)

## 目次
– ログイン情報はどのように保存されている?
– ステートレスの概念とは
– ステートフルの概念とは
– HTTP通信の仕組み
– ①リクエストに含まれるuser_idを頼りにする
– ②情報を暗号化してブラウザのクッキーのみで保持する
– その他のセッション管理方法
– セッション管理まとめ

## ログイン情報はどのように保存されている?
ログイン情報などを保存する際に重要になる「ステートレスな通信、ステートフルな通信」という概念について解説をします。

### ステートレスの概念とは
HTTP通信は **「ステートレス」** な通信です。
これは 前の通信を引き継がない、 **1つの通信が独立している** という意味です。
ステートレスの概念を理解するために、 マクドナルドでポテトを注文する ケースを想定してみましょう。

![1059a5f526dd6faed3eaf0713c814c1c.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2600373/43ea

元記事を表示

OTHERカテゴリの最新記事