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

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

文字列を圧縮・展開する/バイナリ文字列を 16 進数文字列に変換する

# この記事は?

Ruby で以下を行う方法を備忘録として残します ✍️

– 文字列を [zlib](https://docs.ruby-lang.org/ja/latest/library/zlib.html) で圧縮・展開する。
– バイナリ文字列を 16 進数文字列に、あるいは16 進数文字列をバイナリ文字列に変換する。

# 方法

“`rb
require ‘zlib’

string = ‘ヨーヨー振りたい 🪀’

# 文字列を圧縮 → バイナリ文字列 → 16 進数文字列
binary_string = Zlib::Deflate.deflate(string, Zlib::BEST_COMPRESSION)
#=> “x\xDA{\xDC\xBC\xE2q\xF3\x9E\xC7`\xF2Y\xCF\xFA\xC7M]\x8F\e\xE7?nlQ\xF80\x7FU\x03\x00+q\x135”
hex_string = binary_string.unpack1(‘H*’)
#=> “78da7bdcbce271f39ec760f259cffac74d5d8f

元記事を表示

[個人開発・本リリース] 完全未経験が冷蔵庫の中身を簡単管理できるサービスをリリースした件

## はじめに

こんにちは。ryosuke([@ryousuke_mogurA](https://x.com/ryousuke_mogurA))と申します。現在プログラミングスクール RUNTEQ にて、Ruby on Rails を学習しています。

前回MVPリリースしたアプリを本リリースしたので新たな記事を書くことにしました。
技術的な部分での誤りやサービスについての感想などありましたら、コメント等で教えていただけると助かります。
## 目次
[1.作成したサービスの紹介](#サービスの紹介)
[2.作成した経緯](#作成した経緯)
[3.技術スタック](#技術スタック)
[4.こだわったポイント](#こだわったポイント)
[5.画面紹介](#画面紹介)
[6.ER図](#ER図)
[7.実装機能](#実装機能)
[8.今後の展開](#今後の展開)
[9.反省点](#反省点)
[10.感想](#感想)

## サービスの紹介
[![Image from Gyazo](https://i.gyazo.com/385a7078b695448cfef79567d7cd142b.jpg

元記事を表示

LMDBでnosyncすると速くなった

## 背景
Kontur Population PMTiles ([optgeo/kpop-pmtiles](https://github.com/optgeo/kpop-pmtiles))というプロダクトを作りにあたって、[H3](https://h3geo.org/#)のresolutionを変えながらデータベースに値を記録していくということを行いました。

## わかったこと
[過去の経験](https://qiita.com/hfu/items/a23d8e5168d710490f5b)から、LMDBを使っていたのですが、LMDB.newする際に `:nosync => true` を付加すると高速になることがわかりました。

“`ruby
require ‘lmdb’

$env = LMDB.new(‘db’,
:nosync => true, :nometasync => true,
:writemap => true, :mapasync => true,
:mapsize => 5000 * 1024 * 1024 * 1024
)
$db = $

元記事を表示

【Rails】button_to_functionが使用できない

## はじめに
Railsのアップデート中にbutton_to_functionを使用している箇所でエラーが出たので、その対応をまとめます。

## 問題
以下のように、button_to_functionを使用するとエラーがでます。
“`ruby
<%= button_to_function "ボタン", "clickButton()", {:class=> “button”} %>
“`

## 解決方法
button_to_functionはRails4.1で削除されました。
javascriptなどでボタンをクリックしたときのコードを実装します。
“`ruby
ボタン

$(document).ready(function() {
$(“#button”).click(function() {
clickButton();
});
})
“`

## 参考
https://www.techscore.com/tech/Ruby/rails-4.0/view/

元記事を表示

Shift_JISに変換する際に『 〜 』が化けちゃう【波ダッシュ・全角チルダ問題】

## 解決策
文字列をShift_JISに変換する際 “~”が消える事例に遭遇した人へ
下記のコードを付けよう

~~~ ruby
# 全角チルダを波ダッシュに変換
.gsub(‘~’, ‘〜’)
~~~

## 原因
上のインライン部分に書いてあるとおり、実は”**~**”と”**〜**”は違う文字

全角チルダ ” **~** “はShift_JISにエンコードする際バグってしまうみたい

https://www.tohoho-web.com/ex/dash-tilde.html

元記事を表示

【O’Reilly】初めての自動テスト読んでみた。

# 初めに

個人的な都合で自動テストに詳しくならないといけないので今回の本を読んでみました。

www.amazon.co.jp/dp/4873118166

# 簡単にこの本ってどんなものなの?

Rubyを通して自動テストの初歩について解説しています。

テスター視点で自動テストの特徴や簡単な設計運用、単体・結合・E2E、TDDについて解説しています。

# どんな人が読むべきだと思う?

以下の人が読むべきだと思います。

– 自動テストに振れたことない・触れたばかりのテスターや開発者
– 自動テストにおける単体・結合・E2Eを簡単に知りたい人
– Rubyの自動テストを勉強したい人

逆に読まなくていい人はこんな感じです。

– 実践的な自動テストの設計運用を知りたい人
– JSTQBの試験対策
– 自動テストにおける単体・結合・E2Eを簡単に分かっている人
– Rubyにアレルギーを感じる人
– SPAやSSRのテストアプローチを知りたい人
– 手動・自動テスト関係ない汎用的なテストについて知りたい人
– 現在と2017年の違いを把握できない人

# 本の内容について詳細解

元記事を表示

ActiveAdminで、全てのチェックボックスを選択するチェックボックスを追加する

## 動機
[前回の記事](https://qiita.com/Erga-mion/items/5ba48dbeb10573dd70c2)では、ActiveAdminで、複数のレコードを関連づけるために、フォームにチェックボックスを追加していました。 その続きになります。

そこに、選択できるレコードの数が膨大になることが考えられるので、それらを全て選択できるチェックボックスを追加して欲しい、という要望がありました。

ActiveAdminのドキュメント等を確認しましたが、そういった機能は用意されていないようですので、JavaScriptで実装することにしました。(もしありましたらご指摘お願いします:bow:)
## 動作環境
– ruby 3.2.2
– rails 7.0.8
– activeadmin 2.14.0

## 実装
前回の記事のものと同じものになります。

`User` の作成・更新ページに、複数の`Book` を選択できるチェックボックスを追加しています。

“`mermaid
erDiagram
User ||–o{ BookReservation : u

元記事を表示

Rubyで多重配列に名前を付けてループを回す方法について

# はじめに
Rubyで多重配列を扱う際に、各要素に名前を付けてeachやmapで回す事ができます。

# 環境

“`
❯ ruby -v
ruby 3.2.0 (2022-12-25 revision a528908271) [x86_64-darwin20]
“`

# 多重配列の例
まず、以下のような多重配列を用意します。

“`rb
data = [
[1, “Alice”, 30],
[2, “Bob”, 25],
[3, “Charlie”, 35]
]
“`

この配列は、ID、名前、年齢の情報を持つ3つの要素から構成されています。

# 名前を付けてループを回す方法
多重配列の各要素に名前を付けてループを回すには、eachメソッドやmapメソッドでブロック引数に名前を付けて以下のように書きます。

## eachの例
“`rb
data.each do |id, name, age|
puts “ID: #{id}, Name: #{name}, Age: #{age}”

元記事を表示

【Rails】Rails始めて2週間でよく使ったコマンド

こんにちは!
今回はRailsを始めて2週間でよく使ったコマンドを紹介したいと思います。
最後まで読んでいただけると嬉しいです!

# コマンド紹介
“` php
rails server
“`
説明: Railsアプリケーションをローカルで実行するためのコマンドです。http://localhost:3000でアプリケーションを確認できます。
“` php
rails generate scaffold [モデル名] [カラム名:型, …]
“`
説明: モデル、ビュー、コントローラなどの基本的なCRUD機能を一括で生成するコマンドです。開発初期によく使用します。
“` php
rails db:migrate
“`
説明: データベースのスキーマを最新の状態に更新するためのコマンドです。新しいマイグレーションファイルを適用します。
“` php
rails console
“`
説明: RailsアプリケーションのコンテキストでインタラクティブにRubyコードを実行できるコンソールです。モデルの操作やデバッグに便利です。
“` ph

元記事を表示

ActiveAdminで、多対多の関連付け(中間テーブル)レコードを追加する

ActiveAdminで1対多や多対多の関係のあるモデルでは、`has_many` メソッドを使うことで、多のモデルをもう一方のモデルのフォームで追加・更新できるようにできます。(https://activeadmin.info/5-forms.html)

本記事では、その`has_many`を使う方法と、もう一つ別のアプローチで、多対多のモデルを関連づける中間テーブルのレコードを作成・更新できるようにします。

ここでは、以下のようなモデル構成での実装を示します。
`User`のページで、`Book`との中間テーブルである、複数の`BookReservation`を作成・更新・削除できるようにします。
“`mermaid
erDiagram
User ||–o{ BookReservation : user_id
BookReservation o{–|| Book : book_id
“`

## 動作環境
– ruby 3.2.2
– rails 7.0.8
– activeadmin 2.14.0

## has_manyを使用する場合
### 画面
– 「Add N

元記事を表示

【paiza x Qiitaコラボ】「お菓子の詰め合わせ(ランクA相当)」を解いて解説入れてみた(なんちゃって全探索)

こんにちは、paizaランクAのtomosukeです。「paiza x Qiitaコラボ」投稿は2回目です。今回はランクA相当の問題にトライしました。

今回も、考え方を頑張ってかみ砕いて説明してみたいと思います。

コラボ企画へのリンクは[こちら](https://paiza.jp/pages/campaign/paiza-qiita)

# 今回のお題は「お菓子の詰め合わせ」
[問題文はこちら](https://paiza.jp/works/mondai/a_rank_skillcheck_archive/school_hiking)

## 概要(筆者の脳内で変換されています)

![スクリーンショット 2024-08-18 22.28.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63377/39a7ce7a-35ce-be74-5b8c-eb0b091742d2.png)
↑ paizaからの引用

お菓子を買うためにお小遣いをもらいます。いくつかのお菓子が売っていて、それを次の

元記事を表示

rswagでAPI仕様書自動生成するときにindexアクションの扱いに困った

# 前提

[rswagの公式Doc](https://github.com/rswag/rswag?tab=readme-ov-file#getting-started)を見ながらAPI仕様書の自動作成に取り組んでいた時の話。
自動作成までの手順として、RSpecでAPIのテストを書いた後、ターミナルで`RAILS_ENV=test rake rswag:specs:swaggerize`を実行する。
すると、`swagger/v1/swagger.yaml` が自動で作成されて、`api-docs/index.html` にアクセスするとswaggerのAPIDocが確認できる。

# うまく行ったこと

createアクションはドキュメント通りに以下のようなテストを作った。(ユーザーに関するAPI)

“`ruby: users_spec.rb
require ‘swagger_helper’

RSpec.describe ‘api/v1/users’, type: :request do
path ‘/api/v1/users’ do
post(‘create

元記事を表示

Rubyプログラミング考え方{その7:カンマ区切りのN個のデータの入力 (paizaランク D 相当)}

https://paiza.jp/works/mondai/stdin/stdin_comma_n

**ステップ1: 要件の分析**
– 最初の行で整数 `N` が与えられます。
– 次の行で `N` 個の文字列がカンマ区切りで1行で与えられます。
– これらの文字列を順に `N` 行で出力するプログラムを作成します。

**ステップ2: 擬似コードの設計**
1. 最初の行で `N` を取得します。
2. 次の行でカンマ区切りの文字列を取得し、分割します。
3. 各文字列を順に出力します。

**ステップ3: コメント付きRubyコードの作成**

“`ruby
# 1行目でNを取得
n = gets.to_i

# 2行目でN個の文字列を取得し、カンマ区切りで分割する
strings = gets.chomp.split(“,”)

# 各文字列を順に出力
strings.each do |str|
puts str
end
“`

**ステップ4: コードの解説**
– **`N` の取得:** 最初に `gets.to_i` を使って、入力から整数 `N` を取得しま

元記事を表示

Rubyプログラミング考え方{その7:カンマ区切りの3つのデータの入力 (paizaランク D 相当)}

https://paiza.jp/works/mondai/stdin/stdin_comma_3

**ステップ1: 要件の分析**
– 標準入力で3つの文字列がカンマ区切りで1行で与えられます。
– これらの文字列を順に3行で出力するプログラムを作成します。

**ステップ2: 擬似コードの設計**
1. 標準入力から1行の文字列を取得します。
2. 取得した文字列をカンマで分割し、3つの文字列に分けます。
3. 各文字列を順に出力します。

**ステップ3: コメント付きRubyコードの作成**

“`ruby
# 標準入力から1行の文字列を取得し、カンマで分割して3つの文字列に分ける
strings = gets.chomp.split(“,”)

# 各文字列を順に出力する
strings.each do |str|
puts str
end
“`

**ステップ4: コードの解説**
– **文字列の取得と分割:** `gets.chomp.split(“,”)` を使って、標準入力から取得した文字列をカンマで分割し、3つの文字列の配列にします。
– **出力:**

元記事を表示

Rubyプログラミング考え方{その6:N個のデータの入力 (paizaランク D 相当)}

https://paiza.jp/works/mondai/stdin/stdin_n

**ステップ1: 要件の分析**
– 最初の行で整数 `N` が与えられます。
– 次の行で `N` 個の文字列が半角スペース区切りで与えられます。
– これらの文字列を順番に `N` 行で出力するプログラムを作成します。

**ステップ2: 擬似コードの設計**
1. 標準入力から最初の行で整数 `N` を取得します。
2. 次の行で与えられた `N` 個の文字列を取得し、半角スペースで分割します。
3. 分割された各文字列を順に出力します。

**ステップ3: コメント付きRubyコードの作成**

“`ruby
# 1行目でNを取得
n = gets.to_i

# 2行目でN個の文字列を取得し、スペース区切りで配列にする
strings = gets.chomp.split(” “)

# 各文字列を順に出力
strings.each do |str|
puts str
end
“`

**ステップ4: コードの解説**
– **`N` の取得:** 最初に `gets.to_i`

元記事を表示

Rubyプログラミング考え方{その5:3つのデータの入力 (paizaランク D 相当)}

https://paiza.jp/works/mondai/stdin/stdin_3

**ステップ1: 要件の分析**
– 標準入力で3つの文字列が1行で、半角スペース区切りで与えられます。
– それらの文字列を順に3行で出力するプログラムを作成します。

**ステップ2: 擬似コードの設計**
1. 標準入力から1行の文字列を取得します。
2. 取得した文字列を半角スペースで分割し、3つの文字列に分けます。
3. それぞれの文字列を順に出力します。

**ステップ3: コメント付きRubyコードの作成**

“`ruby
# 標準入力から1行の文字列を取得し、スペースで分割して3つの文字列に分ける
strings = gets.chomp.split(” “)

# 各文字列を順に出力する
strings.each do |str|
puts str
end
“`

**ステップ4: コードの解説**
– **文字列の取得と分割:** `gets.chomp.split(” “)` を使って、標準入力から取得した文字列を半角スペースで分割し、3つの文字列の配列にします。

元記事を表示

Rubyプログラミング考え方{その4:N行のデータの入力 (paizaランク D 相当)}

https://paiza.jp/works/mondai/stdin/stdin_n_line

**ステップ1: 要件の分析**
– 標準入力で最初に整数 `N` が与えられます。
– 続く `N` 行には、文字列がそれぞれ与えられます。
– 与えられた文字列を順にそのまま `N` 行で出力するプログラムを作成します。

**ステップ2: 擬似コードの設計**
1. 標準入力から最初の行で整数 `N` を取得します。
2. ループを使って `N` 回、標準入力から文字列を取得し、その都度出力します。

**ステップ3: コメント付きRubyコードの作成**

“`ruby
# 1行目でNを取得
n = gets.to_i

# N行の文字列を順に取得して出力
n.times do
line = gets.chomp
puts line
end
“`

**ステップ4: コードの解説**
– **`N` の取得:** 最初に `gets.to_i` を使って、入力から整数 `N` を取得します。
– **ループ処理:** `n.times` ループを用いて、`N` 回標準

元記事を表示

ABC367 A~DをRubyで解く

# 概要
Rubyの練習のために実装例を書いてみます

:::note warn
問題の解説を目的とした記事ではありません
:::

# A – Shout Everyday

– 問題: https://atcoder.jp/contests/abc367/tasks/abc367_a
– 提出: https://atcoder.jp/contests/abc367/submissions/56856137

時刻としてありうるのは高々24通りなので、起きている時間をすべて試して問題ないです

“`ruby
# 入力を受け取る
A, B, C = gets.split.map(&:to_i)

# 起きている時間についてループ
t = C
while t != B do
# 時刻Aで起きていたらYesを出力して終了
if t == A then
print “Yes”
exit
end

t = (t + 1) % 24
end

# Noを出力
print “No”
“`

# B – Cut .0
– 問題: https://atcoder.j

元記事を表示

RubyのREPLとデバッグ:初心者から見たツールの進化と効率化

> Rubyの初心者として、最近私はRubyのREPL(Read-Eval-Print Loop)ツールとデバッグ機能について深く探求しました。この過程は、Rubyへの理解を深めただけでなく、ツールの進化と開発効率の関係について考えさせられる機会となりました。

### RubyのREPLツール:IRBからPryへ
Ruby公式が提供するIRB(Interactive Ruby)は強力なREPLツールですが、コミュニティ主導の需要により、Pryのようなさらに高機能なツールが生まれました。Pryはコード探索、コンテキストナビゲーション、リアルタイム編集など、より高度な機能を提供しています。

例えば、Pryを使用すると、クラスやメソッドの定義を簡単に確認できます:

“`ruby
[3] pry(main)> show-source Array#map

From: array.c (C Method):
Owner: Array
Visibility: public
Number of lines: 17

static VALUE
rb_ary_map(VALUE ary)
{

元記事を表示

Rubyプログラミング考え方{その4:3行のデータの入力 (paizaランク D 相当)}

https://paiza.jp/works/mondai/stdin/stdin_3_line

**ステップ1: 要件の分析**
– 標準入力で3行の文字列が与えられます。それぞれの文字列をそのまま3行で出力するプログラムを作成します。
– 各行の文字列は1文字以上100文字以下で、英小文字、大文字、数字、または半角スペースを含むことができます。

**ステップ2: 擬似コードの設計**
1. 標準入力から3行の文字列を順番に取得します。
2. 取得した各文字列をそのまま出力します。

**ステップ3: コメント付きRubyコードの作成**

“`ruby
# 1行目の文字列を取得
a = gets.chomp
# 2行目の文字列を取得
b = gets.chomp
# 3行目の文字列を取得
c = gets.chomp

# 1行目の文字列を出力
puts a
# 2行目の文字列を出力
puts b
# 3行目の文字列を出力
puts c
“`

**ステップ4: コードの解説**
– **標準入力の取得:** `gets.chomp`を使って、各行の入力を取得し、末尾の改行

元記事を表示

OTHERカテゴリの最新記事