Ruby関連のことを調べてみた

Ruby関連のことを調べてみた

Gem作者が開発するときに考えていること

私は、 [ruby-duckdb](https://github.com/suketa/ruby-duckdb) という gem を開発しています。普段、 gem を開発する上で考えていることを書いてみたいと思います。

## 複数のRubyのバージョンで動作する

普段、業務で開発している Rails アプリケーションとは違い、 gem を使うユーザーは、 どのバージョンの Ruby を使うかわかりません。
なので、広く使われるように、複数の Ruby で使えるようにしたいと考えてます。
とはいえ、古いバージョンのサポートを続けるのは、労力がかかるので、 Ruby が公式にメンテしているバージョンに限定しています。

手元で全バージョンを確認するのも手間なので、CI (GitHub Actions) を使って自動テストを実行して動作確認しています。
なお、CIで実行するときは、head や preview バージョン (2023年11月26日時点では、 3.3.0-preview2)でもテストしています。

私は、開発するときは、最新のバージョンを使っています。
たまに、Ruby 3

元記事を表示

Rails 入力した値をその通り保存できなかった時に、ログを確認して学んだこと!

## バージョン
– ruby 3.2.2
– Rails 6.1.7.6
————————-

スクールの課題でタスク管理アプリを作成中、先に`name`と`content`のカラムを作ってあり、後で、`timelimit`(終了期限)のカラムを追加した。後からカラムを追加すると、既に保存してあるデータベースについては、後から追加したカラムの値が`nil`となってしまいエラーになってしまうので、デフォルト値を設定した。
### しかし、新規投稿しても、終了期限が、デフォルト値で設定してある「今日」になって登録されてしまう!!なぜだ!!

![スクリーンショット 2023-12-01 10.32.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3566175/9e18e723-f2dd-7fab-16c1-9d5304bf224d.png)

`schema.rb` の中身はこんな感じ↓
“`schema.rb
create_table “tasks”, for

元記事を表示

3回目のRuby技術者認定試験Gold 3.1で合格した話

# はじめに
2023年11月上旬に2回目のRuby Gold受験し68点で落ちた([落ちた話はこちら](https://qiita.com/Takaharu_01/items/5da7f656f1e317dc0bc4))ので、2023年11月下旬に3回目受けました。
結果は82点で合格したので、2回目受験から今回の3回目受験までの期間取組んだこと等をまとめてみます。

# 試験当日までにやったこと
1. [Ruby技術者認定試験合格教本](https://www.amazon.co.jp/gp/product/B0756VF9Y3/ref=ppx_yo_dt_b_d_asin_title_o00?ie=UTF8&psc=1)
1. 基礎力確認問題を解く
1. 模擬試験を解く
1. [ctc問題](https://www.school.ctc-g.co.jp/ruby/training_ruby_gold_01_10.html)を解く
1. [模擬問題集](https://github.com/ruby-association/prep-test/blob/versio

元記事を表示

Rails アプリの webpacker を shakapacker に移行した

[webpacker]:https://github.com/rails/webpacker
[shakapacker]:https://github.com/shakacode/shakapacker
[webpack]:https://webpack.js.org/

[ツクリンク プロダクト部 Advent Calendar 2023](https://qiita.com/advent-calendar/2023/tsukulink) の2日目です。

# 概要

[webpacker][webpacker] はもうメンテナンスされないので [shakapacker][shakapacker] に移行した。手順通りやればうまくいくけど、ハマったポイントもある。

# [webpacker][webpacker] はもうメンテされない

> Webpacker has been retired 🌅

[webpacker READMEより][webpacker]

[webpacker][webpacker] はもうメンテナンスされません。最後のコミットから1年くらい経っていて、

元記事を表示

Rails6 で動的なセレクトボックスを作りたい(JQuery編)

## この投稿は、
DMM WEBCAMP Advent Calendar 2023
シリーズ2 投稿2日目のエントリーです。

1日目は @yuki82511988 さんで
[【Ruby】+ と<<で配列の要素を追加した時の話](https://qiita.com/yuki82511988/items/496e69158086bbe2c33c)でした。 Rubyは詳しければ詳しい程幸せになれますね。 ## はじめに DMM WEBCAMP でメンターをやらせていただいております。 @tomoaki-kimura です。 Rails7のリリースから随分経ちますが、Rails6の環境もまだまだあります。 ということで、今年の寄稿はRails6で改めて動的なフォームの処理に触れてみたいと思います。 ## 環境 - Ruby 3.1.2 - Rails 6.1.4 - yarn 1.22.18 ## 作るもの [![Image from Gyazo](https://i.gyazo.com/68f2fe8778990ddf75eed13579d57419.png)](http

元記事を表示

Ruby芸160チャレンジ(#2):ディレクトリ内のファイル全てに処理を適用

## この記事は何
[shellgei160を通じて言語習得 Advent Calendar 2023](https://qiita.com/advent-calendar/2023/learning-via-shellgei160)に参加しています。

書籍「シェル芸ワンライナー160本ノック」の例題をRubyで解いてみて、Rubyの学習に役立てようとするものです。

例題はこちらのリポジトリで公開されているものに限ります。
https://github.com/shellgei/shellgei160

## 実行環境など
– Docker image: ruby:3.0.2
– 上記リポジトリをクローンした上で、リポジトリのルートディレクトリ直下に`answer-ruby`ディレクトリを作り、その中に解答となるファイルを作成していきます。

## 今回のテーマ
https://github.com/shellgei/shellgei160/blob/master/answer/2.md

“`bash
$ time ls *.png | sed ‘s/\.png$//’ | x

元記事を表示

FormObject 複雑な検索機能のカプセル化

## はじめに
チーム開発で学んだことや、アプリ開発を通して調べたこと、実装手順、またプログラミングスクールで学習した内容をまとめています。

今回は、複雑な検索機能を実装する際にFormObjectについて調べたことをまとめます。

# FormObjectとは
FormObjectとは、`form_with`のmodelオプションにActive Record以外のオブジェクトを渡すためのデザインパターンです。このパターンは、データベースと直接関係のないフォームや複数のモデルを扱うフォームを作成する際に、処理をすっきりと記述することができます。

# FormObjectにおけるカプセル化とは
フォームに関連するデータとロジックを一箇所にまとめて記述することでコードを効果的に管理し、アプリケーション全体の構造とコードの品質を向上させることができる重要な手法です。これにより、より維持しやすく、拡張しやすいコードを書くことができます。

## メリット

説明

【Rails7】Hotwireでアプリ作り

# はじめに

大体0から始めるRuby入門その2  ~ゲームを作る~

この記事は[【完走したい】楽しくいろいろやる Advent Calendar 2023](https://qiita.com/advent-calendar/2023/notbeginner)の2日目です。
# 簡単なゲームを作る
簡単な数あてゲームです。
数字を入力し、決められた数よりも大きいか小さいか、あるいは正解かを判断する例のあれです。
これを作るにあたって、数字を入力する部分、if文について学んでいきます。
# 数字を入力できるようにする
数字を入力するには「gets」を使うようです。
また、入力後にEnterを押した際改行がされるのを防ぐために「chomp」というのをつけるそうです。
さらに、入力した文字を数値に変えるために「to_i」を用いるようです。
全て組み合わせて、実際にやってみた結果がこちら
↓コード
“`
puts “ある人は”
getter =gets.chomp
puts “ある人は”+getter+”です。”
“`
出力
“`
C:\Users\xxxxx\Desktop>ruby Advent2023.rb
ある人は
人間
ある人は人間です。

VercelでNode.js以外のランタイムを動かしてみる(Go, Python, Ruby)

Vercel といえば Next.js なので、 Node.js を動かすものというイメージがあります。

ですが、Vercel では Node.js 以外のアプリケーションもデプロイすることができます。

想像以上に簡単にデプロイできて、すごかったです :hushed:

## 公式が対応しているランタイム

Vercel は以下のランタイムに対応しています。

– Node.js
– Edge
– Go
– Python
– Ruby

## コミュニティ・ランタイム

公式がサポートしているランタイムとは別に、ユーザが作成したコミュニティ・ランタイムも存在します。コミュニティ・ランタイムには、以下のランタイムがあります。

– Bash
– Deno
– PHP
– Rust
– Bun

コミュニティ・ランタイムは、GitHub の [Vercel Community](https://github.com/vercel-community) リポジトリで管理されているようです。

## ランタイムの比較

基本的に、サーバレスなアプリケーションを構築をする場合には No

【Rails】ActiveStorageでvariantを行うと画像が表示されない問題を解決する

現象としてlocalhost:3000/items/:idで実装している機能の動作確認を行っていたところ、variantを指定して表示したいんだけど非表示になってしまっていた。
![スクリーンショット 2023-11-26 22.45.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2532739/02837960-4253-4832-af62-f6132dcee2ab.png)

# 原因:minimagickを明示的に指定していなかった

Gemfile.lockを確認するとmini_magickがちゃんとインストールされていることがわかりました。

問題はvariantを利用するためにmini_magickを明示的に指定していないことが問題なようです。

参考URL

[https://zenn.dev/iloveomelette/articles/76aad4d9ce86d1](https://zenn.dev/iloveomelette/articles/76aad4d9ce86d1)

【Ruby】OpenSSLライブラリでのAES-256-CBC復号化にて少し詰まった点

### 概要
Ruby on Railsを利用したwebシステムの開発において、[公式ドキュメント](https://docs.ruby-lang.org/ja/latest/class/OpenSSL=3a=3aCipher.html)を参照しつつ
OpenSSLライブラリを利用したAES-256-CBC復号化を試みた際に、鍵の設定において少し詰まってしまったためその備忘録となります。

### 要点
OpenSSLライブラリを利用してAES-256-CBC復号化を実施する際、鍵・IVは16進数の文字列ではなくバイト列として設定する必要があり、バイト列への変換は以下のような手順で可能
~~~
irb(main):028:0> key = [‘a377a0c1afb45312592296a5be06384b03adae8172248f4ab85e3b281e7b6c3c’].pack(“H*”)
=> “\xA3w\xA0\xC1\xAF\xB4S\x12Y\”\x96\xA5\xBE\x068K\x03\xAD\xAE\x81r$\x8FJ\xB8^;(\x1E{l<" ~~~

booleanはsortのキーに使えないのか

何番煎じか分かりませんが、ちょっと面白かったのでメモがてら書いてみます。

“`ruby
data = [
{flag: true, score: 30},
{flag: false, score: 20},
{flag: true, score: 10},
{flag: false, score: 40}
]

# こういうデータがある時、条件1: trueを上に、条件2: スコア順でソートしたい

data.sort_by { |item| [item[:flag], item[:score]] }
# => ArgumentError: comparison of Array with Array failed

# むむ? キーをflagだけにすると…
data.sort_by { |item| item[:flag] }
# => ArgumentError: comparison of TrueClass with false failed

# なるほど! TrueClassとFlaseClassで比較はできないよってことね

# ということは..

stimulus-rails gemを読み解く

# はじめに

私は、RailsでWebアプリを開発しているプログラマーです。
Webアプリで、インタラクティブな使用感を出したい時は、Hotwireを使っています。
Hotwireとは、レスポンスのHTMLでインタラクティブな使用感を実現するアプローチです。
このアプローチの実現は、TurboとStimulusによりできます。

Turboは、HTTPリクエストを自然に呼ぶだけで画面をインタラクティブに変更できるように設計されたライブラリです。
Stimulusは、HTMLを拡張するように設計されたJavaScriptフレームワークです。

どちらも違和感なく使えています。
これは開発者の設計が良いからでしょう。

このような使い勝手が良いものは、どのように作られているのだろうか?
気になったので、コードを1から読み解いていくことにしました。

RailsでStimulusを使いやすいようにするgemがあります。
手始めに、そのgemのコードを1から読み解きます。

# stimulus-rails gem

[stimulus-rails](https://github.com/h

【Rails】Renderにデータベースをデプロイした時のエラー解消

# 概要
Railsチュートリアルの第10章を進めていた時、
データベースのマイグレーションの設定をRenderにデプロイしたときにビルドエラーが発生しました。
“`
rails aborted!
ActiveRecord::ProtectedEnvironmentError: You are attempting to run a destructive action against your ‘production’ database.
If you are sure you want to continue, run the same command with the environment variable:
DISABLE_DATABASE_ENVIRONMENT_CHECK=1

Tasks: TOP => db:migrate:reset => db:drop => db:check_protected_environments
(See full trace by running task with –trace)
==> Build failed 😞
“`

#

[Ruby] クラス定義が重複した場合の挙動

Rubyでクラス定義を複数回書いた場合の動きが予想外でした。

## 結論

Rubyではクラス定義が重複してもエラーは起きません。メソッドは一番最後に定義したものが実行されます。

## クラス定義

“`ruby
class C
def name
“alice”
end

def age
20
end
end

class C
def name
“bob”
end
end
“`

## 実行結果

“`ruby
C.new.name # => bob
C.new.age # => 20
“`

[Rails] fixtureが読み込まれない問題

## まず結論から

`setup`でfixtureを使う時は、`teardown`でfixtureのキャッシュを消しましょう。

## fixtureが読み込まれない現象
まずは問題のあるコードを掲載します。`SecondTest`の`some test 2`テストを見てください。`TableClass`のテーブルにfixtureデータが入っていません。

“`ruby
require ‘test_helper’

class FirstTest < ActiveSupport::TestCase setup do fixture_directory = '' fixture_files = [:tbl] fixture_models = { tbl: TableClass } ActiveRecord::FixtureSet.create_fixtures(fixture_directory, fixture_files, fixture_models, DBClass) end test

eachメソッドの使い方

## `each`メソッドについて
[each](https://docs.ruby-lang.org/ja/latest/method/Hash/i/each.html)は繰り返しメソッドのひとつです。
ブロック内の処理をオブジェクトの要素分だけ繰り返すことができます。
オブジェクト内の要素の計算などもできます。
___
#### 使い方
“`
オブジェクト.each do |変数|
  実行したい処理内容
end
“`
doを省略することもできます。
“`
オブジェクト.each { |変数|
実行したい処理内容
}
“`
___
#### eachを使ってオブジェクト内の要素の計算をしてみよう!
“`
array = [1, 2, 3]

sum = 0
array.each { |x|
sum += x
end

puts sum
“`
“`
実行結果
6
“`
___
|変数|の縦棒`「|」`はバーティカルバーと呼ばれる記号です。

Rubyのputs, print, pメソッドの違い

Rubyには出力の際によく使うメソッドがあります。
どれも結果を出力するメソッドではありますが、それぞれ出力結果に違いがあります。

## ◉ [puts](https://docs.ruby-lang.org/ja/latest/method/Kernel/m/puts.html) メソッド
渡されたオブジェクトを出力します。

**末尾には改行が追加**されるため、表示される内容は1行ごとに改行されます。

“`
puts “Hello”
puts “Ruby”
puts “World”
“`

-出力結果-
“`
Hello
Ruby
World
“`

putsメソッドの戻り値は `nil` です。

“`
irb(main):001:0> puts “Hello”
Hello
=> nil
“`

## ◉ [print](https://docs.ruby-lang.org/ja/latest/method/Kernel/m/print.html) メソッド
putsメソッドとは異なり、**改行を追加しません**。
そのため、printメソッドを使うと、出力さ

Ruby で Thread.new してるコードを RSpec 実行時だけ同じスレッドで実行させる

“`ruby:some_klass.rb
class SomeKlass
def main
do_something

Thread.new do
do_something_heavy
end
end
end
“`

こんな風に `Thread.new` してるコードがある時、テストではスレッドを分けずに同じスレッドで処理をさせたくなることがある。そんなときは `Thread.new` を何もしないように `allow` してしまう。

“`ruby:some_klass_spec.rb
describe SomeKlass do
describe ‘#main’ do
subject { described_class.new.main }

# Thread.new をただブロック実行するだけにする
before { allow(Thread).to receive(:new) { |&block| block.call }

it { is_expected.to eq ‘somethi