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

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

Rubyでコマンドライン引数を扱う方法 optparse(2023/2/3 備忘録)

Rubyにはコマンドラインを扱う方法が色々ありますが、今回はコマンドライン引数を扱うための有名なライブラリとして、**optparse**を紹介します。

## 概要
optparseは、Rubyの標準ライブラリであり、コマンドラインオプションを解析するためのライブラリです。
これにより、Rubyのスクリプトを実行する際に、ユーザーが指定するオプションを解析し、適切な値を取得することができます。

下記、公式のマニュアルがあるので参照ください。

[library optparse (Ruby 3.1 リファレンスマニュアル)](https://docs.ruby-lang.org/ja/latest/library/optparse.html)

## 基本的な使い方
1) まずは、optparseを使うために、requireします。
“`ruby:sample
require ‘optparse’
“`

2) 次に、OptionParserオブジェクトを作成します。
“`ruby:sample
options = OptionParser.new do |opt

元記事を表示

【Rails】render.comを使ってデプロイする

# 概要
– render.comを使用して、アプリケーションをデプロイする
– 無料プランを利用&クレジットカードの登録は行ない

# 開発環境
– OS:MacOS(m1チップ)
– 言語:ruby 3.1.2
– フレームワーク:Ruby on Rails7.0.2
– DB:PostgreSQL(←要注意:詳細後述)
– Docker等のコンテナは使わず、PCのローカル環境に構築

# 本番環境(production環境)を用意する
“`ruby:Gemfile
group :production do
gem “pg”
end
“`
ここで注意が必要
`gem “pg”`はPostgreSQLを使用するために導入(筆者はsqliteを使用していた)
render.comはデータベースをPostgreSQLしかサポートしていないため、
MySQLやSQLite等を使用している場合は、本番環境のデータベースのみPostgreSQLnに変更する必要がある

### gemをインストールする
“`
bundle install
“`
# render.yamlの作成
以下

元記事を表示

Ruby12

# 問題
ターミナルから数字を入力して、数字に応じて以下のように出力するプログラムを書いてください。

・10以下なら10以下の数字です
・10より大きい数値なら10より大きい数字です
・10以下でかつ0以下なら0以下の数字です

“`Ruby:雛形(ソースコードを追記すること)
input = gets.to_i
“`

# 模範解答

“`Ruby:模範解答
input = gets.to_i

if input <= 0 puts "0以下の数字です" elsif input <= 10 puts "10以下の数字です" else puts "10より大きい数字です" end ``` # 【解説】 ### ①ターミナルから数値を入力する書き方 ターミナルから数値を入力するにはgetsというメソッドを使います。 このgetsメソッドを使って入力した値は全て文字列になるため、getsの値をto_iメソッドを使って数値に変換します。 ### ②条件分岐の書き方 条件分岐はif文を使います。今回は3つのパターンで分岐するためelsif

元記事を表示

【テックジム無料講座】Ruby on Rails講座 <問合せフォームを作ろう>の感想

テックジムが無料で開催している、Ruby on Rails講座 <問合せフォームを作ろう>をオンラインで受講してみました。Rubyを勉強した経験が無く、動画の通りには出来たものの、何をやっているのか良く解りませんでした。AWS Cloud9を利用しているので、ウェブベースで受講出来るのが便利だと思いました。現在の私の場合、テックジムさんのRuby on Rails本講座を受講する前に、progate等で、Rubyの基礎を学ばないと、独習は難しいと感じました。

1-0 環境構築編
1-1の解説動画
1-2の解説動画
1-3の解説動画
1-4の解説動画

元記事を表示

【ServerlessFramework】API GatewayのWebSocket通信を利用してリアルタイムに変化するTodoアプリを作成した

# はじめに

ServerlessFrameworkを用いて、ApiGatewayのWebsocket通信を利用したリアルタイムアウトTodoアプリを実装した時のメモ。

# 環境

* Svelte
* 3.54.0
* ServerlessFramework
* 3.27.0

# 完成画面

![realTimeTodo.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2985550/a50b694f-0e0b-0b0f-aa85-52efb182f739.gif)

# 環境について

## 構成図

## WebSocket説明

### 1. connect / disconnect時にはDynamoDB

元記事を表示

rubyXLのconvenience_methods一覧

公式の方でまとめられているものを書き出しています
https://github.com/weshatheleopard/rubyXL/tree/master/lib/rubyXL

#### rubyXL/convenience_methods/cell
– change_contents
– remove_formula
– get_border
– get_border_color
– change_horizontal_alignment
– change_vertical_alignment
– change_text_wrap
– change_shrink_to_fit
– change_text_rotation
– change_text_indent
– change_border
– change_border_color
– is_italicized
– is_bolded
– is_underlined
– is_struckthrough
– font_name
– font_size
– font_color
– fill_color
– horizon

元記事を表示

【備忘録】NoMethodError: undefined method `change_contents’ for #

rubyXLを3.4.0以降のバージョンに上げたときに

“`
NoMethodError: undefined method `change_contents’ for # require ‘rubyXL/convenience_methods/cell’
require ‘rubyXL/convenience_methods/color’
require ‘rubyXL/convenience_methods/font’
require ‘rubyXL/convenience_methods/workbook’
require ‘rubyXL/convenience_methods/worksheet’

https://github-com.translate.goog/weshatheleopard/rubyXL/issues/328?_x_tr_sl=en&_x_t

元記事を表示

Ruby include?メソッド

# include?メソッド
指定した値が配列や文字列内に含まれているかを判定するメソッドです。
指定した値が含まれている→true
指定した値が含まれていない→false  を返り値として返します。

例1
“`ruby
string = [“hello”, “goodbye”]
puts string.include?(“hello”)
“`

“`
true
# ターミナル出力
“`
例2
“`ruby
string = [“hello”, “goodbye”]
puts string.include?(“thanks”)
“`

“`
false
# ターミナル出力
“`

# include?メソッドとif文を使って文字列を検知するプログラムを作成する

条件1:名前を入力すると「登録が完了しました」という文字列を出力すること
条件2:名前の中にピリオド(.)がある場合は、「 “!エラー!記号は登録できません”」という文字列を出力すること
条件3:名前の中に空白(半角のみ)がある場合は、「 “!エラー!空白は登録できません”」という文字列を出力すること
※今回

元記事を表示

Ruby11

# 概要
対象の文字列の中に特定の値が含まれているかどうかを検知するプログラムを実装します。

# 問題
以下の要件を満たすcheck_nameメソッドを実装しましょう。

・名前を入力すると「登録が完了しました」という文字列を出力すること
・名前の中にピリオド(.)がある場合は、「 “!エラー!記号は登録できません”」という文字列を出力すること
・名前の中に空白(半角のみ)がある場合は、「 “!エラー!空白は登録できません”」という文字列を出力すること
※今回空白に関しては、半角スペースのみを考えることとします。

“`Ruby:雛形
def check_name(str)
# 処理を記述
end

puts “登録したい名前を入力してください(例)YamadaTaro”
str = gets
check_name(str)
“`
“`Ruby:ターミナル
YamadaTaro → 登録が完了しました
Yamada.Taro→!エラー!記号は登録できません
Yamada Taro → !エラー!空白は登録できません
“`

### ?ヒント?
include?メ

配列の操作一覧

### 配列について

初めて配列を操作するにあたり、どの様な操作が出来るか・動きをするかまとめていきます。

## 空の配列xを作成
“`
x = []
=>[]
“`
空の配列xを作成しました。
このxに要素(文字列や数字)を入れていきます。

## 空の配列xに0,0,1,2,2,3,4を入れる
“`
x.push(0,0,1,2,2,3,4)
=>[0,0,1,2,2,3,4]
“`

これで配列に要素を入れることが出来ました。
入れたばかりではありますが、さっそく削除していきます。

## 要素の削除

“`
x.delete(0)
=>[1,2,2,3,4]
“`
削除が出来ましたが、指定した”0″に該当する要素がすべて消えてしましました。

## 場所を指定して要素を削除

“`
x.delete_at(3)
=>[1,2,3,4]
“`
delete_at()で指定した、前から数えた数字の要素が削除されます。
ですので、今回は(3)を指定した為、前から3番目の”2″が削除されました。

## 指定範囲の要素を削除する

“`
x.slice!(1

Ruby10

# 概要
任意の数字が配列の中の何番目に格納されているかを確認できるプログラムを実装します。

# 問題
以下の配列から任意の数字を探して何番目に含まれているかという結果を返すsearchメソッドを、each_with_indexを用いて作成しましょう。

“`Ruby
input = [3, 5, 9 ,12, 15, 21, 29, 35, 42, 51, 62, 78, 81, 87, 92, 93]
“`

以下の雛形のコードを参考に解答しましょう。

“`Ruby:雛形
def search(target_num, input)
# 処理を記述
end

input = [3, 5, 9 ,12, 15, 21, 29, 35, 42, 51, 62, 78, 81, 87, 92, 93]
# 呼び出し例
search(11, input)
“`

### 出力例
search(5, input) → 2番目にあります
search(12, input) → 4番目にあります
search(7, input) → その数は含まれていません

### ?ヒント?

Ruby on Rails チュートリアル 非ログインユーザーからのプロフィールページへのアクセスを防ぐ

Ruby on Rails チュートリアル(第7版)を1周走破しましたが、個人的に気になる点があったので修正してみました。

気になる点とは、
”非ログインユーザーが、登録済みユーザーのプロフィールページにアクセスできる”点です。
(プロフィール編集ページにはアクセスできないため、問題ないのでしょうか?)

/users/(id) リクエストを送信すると、非ログインユーザーでもアクセス可能でした。

この操作を行っている箇所を探します。

“`ruby:users_controller.rb
def show
@user = User.find(params[:id])
redirect_to root_url and return unless @user.activated?
@microposts = @user.microposts.paginate(page: params[:page])
end
“`

showアクションでプロフィールページが表示されています。
この前にログイン確認をしたいので、

“`ruby:users_contr

Ruby9

# 問題
次の要件を満たすプログラムを実装しましょう。

・1~10の数値を順番に足し合わせる
・足し算の合計値がターミナルに出力される

しかし、以下のような順番に並べて、足し算しただけのプログラムはNGです。

“`Ruby:NGコード
sum = 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10
“`

ループ処理を用いて実装しましょう。

## ?ヒント?
times文を用いることで、ループ処理を実装できます。
ループ処理とは、特定の条件下にて、任意の処理を繰り返すことでした。
今回の問題にループ処理を当てはめると、

0に1を足し、
その結果に2を足し、
その結果に3を足し、
その結果に4を足し、
その結果に5を足し、
…と10まで繰り返していきます。

# 模範解答

“`Ruby:模範解答1
sum = 0

10.times do |i|
sum = sum + i + 1
end

puts sum
“`
“`Ruby:模範解答2
sum = 0

10.times do |i|
sum

ruby ハッシュのキー名を文字列とシンボルの違い

# 前書き.
ハッシュのキー名は文字列の方がいいのかシンボルで描くのがいいのか新しい気づきがあったので記事に残します。
ruby学習者の参考になれば幸いです.

# 記事の対象者.
rubyの文法少し知っている方.
rails tutorial4章まで進んでいる方.
rubyの文法を少し詳しく知りたい方.

# 目次
1.ハッシュのキーとは.
2.ハッシュのキー名を文字列にする場合とシンボルにする場合の違い.
3.実際に処理速度を測ってみた.
4.コンピュータはどのようにデータを管理しているかについて.

# ハッシュのキーとは.
⇨バリューを取得するために必要なもの.
ハッシュの書き方3つ.
1つ目キーに文字列を使う.
“`
変数 = { キー => バリュー}
変数[キー]⇨バリュー出力.
favorite_food = { “food” =>”ラーメン”}
puts favorite_food[“food”] /ラーメンと出力

“`

2つ目キーに数字を使う.
“`
変数 = { キー =>  バリュー

`bootsnap`を`1.16.0`にバージョンアップしたら`Psych::DisallowedClass`エラーが発生した

# 事象

`bootsnap`をバージョン`1.16.0`にバージョンアップしたら以下のエラーが発生しました。

“`ruby
Psych::DisallowedClass:
Tried to load unspecified class: Time
“`

# 原因

`ruby`の`YAML`パーサーライブラリ`Psych`において、バージョン`4.0.0`以降セキュリティ脆弱性対策として`YAML.load_file`メソッドの挙動がデフォルトで`safe_mode`という厳格なパースを行うように変更されている様です。
※ これまでの挙動と同じにするには`YAML.unsafe_load_file`を使う必要がある様です。

https://github.com/ruby/psych/pull/487

上記に付随して`bootsnap`でも `Date`と`Time`の値とエイリアスを適切に拒否する様に対応がされました。

https://github.com/Shopify/bootsnap/issues/434

“`ruby
Psych::DisallowedC

Ruby 配列を使ったプログラムの作成

# each_with_index
each_with_indexはRubyに標準で組み込まれているメソッドです。
繰り返し処理をしながら、その要素が何番目に処理されたのか、表示することができます。

“`ruby
配列名.each_with_index do |item, i|

end
“`


“`ruby
animals = [“ねこ”, “とり”, “うさぎ”]

animals.each_with_index do |animal, i|
puts “#{i + 1}番目の動物は、#{animal}です”
end
“`

“`
1番目の動物は、ねこです
2番目の動物は、とりです
3番目の動物は、うさぎです
# ターミナル出力
“`

配列は0番目から始まるため、#{i + 1}としています。

# searchメソッドとeach_with_indexメソッドを組み合わせてプログラムを作る

“`ruby
def search(target_num, input)

input.each_with_index do |num, i|
if n

日本語化 i18n

# 1.はじめに
– 日本語化対応の手順をメモ

# 2.日本語化実装
### 2−1.i18nのプラグインを確認
“`
$ bundle list
“`
– 一覧を確認して`i18n (1.12.0)`などの記載があればOK
– ない場合は、`Gemfile`に下記を記載
“`:Gemfile
gem ‘rails-i18n’
“`
その後
“`
$ bundle install
“`

### 2−2.config/application.rbに下記を追記
“`:config/application.rb
config.i18n.default_locale = :ja
“`

### 2−3.翻訳用ファイルをgitHubからダウンロード
https://github.com/svenfuchs/rails-i18n/blob/master/rails/locale/ja.yml

ダウンロード後`./config/locale/`の配下に入れる。

### 2−4.日本語訳をja.ymlに追加する
“`:./config/locale/ja.yml
ja:

Ruby timesメソッドで繰り返し処理を行う

# timesメソッド
指定した数値の回数だけ、繰り返し処理を行います。

“`ruby
数値.times do
# 繰り返す処理
end
“`

5回繰り返し処理を行う場合は、5times. do~endとなります。

“`ruby
10.times do |i|
puts i + 1
end
“`

“`
# ターミナル出力
1
2
3
4
5
6
7
8
9
10
“`

|i| これはブロック変数と言います。iは任意の変数です。
##ブロック変数とは、do~endで囲まれた処理のまとまりの言います。

“`ruby
数値.times do |ブロック変数|
# 繰り返す処理
# 繰り返しの回数を使う場合、ブロック変数を使用する
end
“`

# timesメソッドを使って繰り返し処理を行う

timesメソッドを使って、1~100の数字を足し合わせていくための、コードを考えてみる。

“`ruby
sum = 0
100.times do |i|
sum += i + 1
end
puts sum
“`

“`
5050
# ターミナ

【Rails】Rakeタスク「task xxx: :environment do」の意味

# 結論

`environmentタスク` → `xxxタスク(実行する処理)`の順に処理が実行される。

“`rb
task xxx: :environment do
実行する処理
end
“`

# 仕組み

– taskの引数にはハッシュが渡っており、key-value相当(`{ xxx: environment }`)の関係にある。
– rakeが提供する`Prerequisites`機能によって、valueのタスクを事前に実行できる。
– Hashリテラルのため、以下のように書いても動作する。

“`rb
task :xxx => :environment do
実行する処理
end

task xxx: [:environment] do
実行する処理
end
“`

# environmentタスク呼び出しの流れ

“`
railties/lib/rails/application.rb
run_tasks_blocks 呼び出し

task :environment を実行

require_environm

Rubyのoptparseを使ってCLIアプリを作成した

## 作成したもの

“`bash:引数ありでcalendar.rbを実行する
ruby calendar -m 6
“`

指定した月のカレンダーを表示します。

![スクリーンショット 2023-01-31 午前6.45.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569408/d603b086-e6fc-2a17-eaf1-af492d48ed55.png)

## optparseの使用方法の例

“`ruby:calendar.rb
require ‘optparse’

opt = OptionParser.new
opt.on(‘-m [VAL]’) do |month|
current_month = month
end
opt.parse!(ARGV)
“`

1. OptionParser オブジェクト opt を生成する。
2. オプションを取り扱うブロックを opt に登録する。
3. opt.parse(ARGV) でコマンドラインを実際に parse する