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

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

CのヘッダーファイルからRuby-FFIのコードを自動生成するc2ffi4rbをリバイバルした

## はじめに

Rubyは、PythonやJavaScriptのような人気言語と比較すると利用人口が少ないため、やりたいことを実現するためには、C言語やRust言語など、他言語で書かれたライブラリのバインディングを適宜自作する必要があります。

Ruby言語では、バインディング作成のための仕組みが数多く用意されています。

* ネイティブC拡張
* fiddle
* ruby-ffi
* GObject Introspection
* Magnus(Rust用)

swig というのもありますが、私は使用経験がありません。

この中で「個人用のバインディングの作成時間の最小化」という観点から評価すると ruby-ffi が最もよいと思います。ruby-ffiは、Cの型とRubyのクラスを自動で相互変換してくれ、構造体に対するサポートも豊富です。

しかし、ruby-ffiを選択する場合でも、バインディング作成の敷居は低くはありません。私も読者もフルタイムでRubyのライブラリを作れるわけではありません。最初の数時間でプロトタイプが完成する、ぐらいの工数でないと、なかなか隙間時間でバイ

元記事を表示

【Ruby】アソシエーションを使った投稿分類【投稿分類応用】

# はじめに
筆者は 大学生限定 プログラミングコミュニティ 『GeekSalon』で活動している者です!
もし少しでも興味がありましたら、ぜひお話を聞きにきてください!

# 前提
この記事でできることを紹介します。
今回は投稿の分類をし、その後にアソシエーションを使いさらに分類するといったことをします。

例えば、音楽をジャンル毎に分ける → ジャンル毎にアーティストを投稿する → アーティストの曲ごとに分類する。
流れはこんな感じになります。

他にも、スポーツをジャンル毎に分ける → ジャンル毎にスポーツを投稿する → そのスポーツチームごとに分ける。といったこともできます。

https://qiita.com/kubochiro/items/4d80a91a6133b680cb4b

参考記事:投稿の分類はこちらの記事を参考にしました

# カテゴリー分けその1
今回は、音楽をジャンル毎に分ける → ジャンル毎にアーティストを投稿する → アーティストの曲ごとに分類することをします!
![Qiita動画2.gif](https://qiita-image-store.s3.

元記事を表示

【Rails】rubocop導入手順の備忘録

# はじめに
お疲れさまです。
おおくまです。

現在、色々なことを試して遊んでいるミニアプリに~~重い腰を上げて~~rubocopを導入しました。
その際の備忘録です。

# 環境
Ruby 3.2.2
Rails 7.0.8

# 注意点
:::note warn
私はプログラミング学習中で、初学者です。
内容に誤りがある場合があります。
コメント等で教えていただけると幸甚です。
:::

# 実装
[rubocop](https://github.com/rubocop/rubocop)をインストールする。
“`ruby:Gemfile
+ gem ‘rubocop’, require: false
“`
“bundle install“を実行。

“bundle exec rubocop“でrubocopを通してみる。

“`ruby:ターミナル
52 files inspected, 688 offenses detected, 669 offenses autocorrectable

The following RuboCop extension libra

元記事を表示

【Ruby】puts / print / p / pp の違い 【チェリー本を読んで】

## はじめに
今回の記事は過去に「プロを目指す人のためのRuby入門」を読んで、勉強になった・意識していなかった
部分を備忘録的にまとめています。

`puts` `print` `p` `pp` のメソッドについてどれも出力に使用するものですが、
どれも挙動が少し違います

## それで、puts / print / p / pp の違いは何なの?
**結論**

| メソッド | 出力後の改行 | 配列の表示 | 呼び出すメソッド | 戻り値 | 対象者 |
|:-:|:-:|:-:|:-:|:-:|:-:|
| puts | あり | 要素ごとに改行 | to_s | nil | 一般ユーザ |
| print | なし | 改行しない | to_s | nil | 一般ユーザ |
| p | あり | 改行しない | inspect | 引数のオブジェクト | 開発者 |
| pp | あり | 見やすく整形 | inspect | 引数のオブジェクト | 開発者|

挙動として、上記の図のようになります!
因みに `pp` の見やすく整形は配列だけではなく、ハッシュ等の大

元記事を表示

[Ruby] 初めての記号プログラミング

# 概要

Ruby はその言語の特性を利用することで,英数字を使用せずにプログラムを書ける.英数字を使用しないプログラムを書くことは,俗に記号プログラミングと呼ばれる.

この記事では,[偉大な先駆者の記事](https://qiita.com/zifre/items/951dc73ae0ee56348538)をベースに,詳しい解説を加えつつ,競技プログラミングの簡単な問題に正解するプログラムを作成する段階まで追加で説明する.

# 前提

* Ruby で FizzBuzz を書ける
* Ruby で簡単な再帰処理をかける

# 注意事項

記号プログラミングは,暇を持て余したプログラマーが個人で楽しむための遊びである.保守性や可読性が著しく低いため,仕事では使用しないこと.

# 本編

先に方針について触れると,最終的には `eval` に任意の文字列を渡すことで任意のプログラムを実行させる.そのためには文字列を生成する必要があるが,英字は使用できないため数値を使用する.よって,まずは数値を錬成する.

## 0 と 1 の錬成

Ruby で記号のみから数値を錬成する最も簡単

元記事を表示

【RSpec】備忘録:stub_constメソッド、create_listメソッド

## stub_constで定数をスタブ化する

:::note
RSpecのテストフレームワークを使用しているRubyやRuby on Railsのプロジェクトで見られるメソッドの一つ。一時的に定数の値をスタブ(つまり、偽の値に置き換える)するのに役立つ。
:::

#### 使用例
特定の定数の値に依存するコードをテストしている場合、その定数の値を一時的に変更してテストシナリオを検証することができる。

“`ruby
it “does something based on MY_CONSTANT” do
stub_const(“MyClass::MY_CONSTANT”, “fake_value”)

# このブロック内では、MyClass::MY_CONSTANTは”fake_value”として扱われる
expect(MyClass.some_method).to eq(expected_result_based_on_fake_value)
end
“`

この例では、`MyClass::MY_CONSTANT`を`fake_value`に一時的に置き換え

元記事を表示

【Rails】Qiita APIを使ってRailsに関する記事を取得する

# はじめに
お疲れさまです。
おおくまです。

[前回](https://qiita.com/kumaryoya/items/eafbc5063e60e3aaa4d5)に引き続きAPIについてです。
今回は、**Qiita API**を使ってRailsでミニアプリを作ってみました。

# 環境
Ruby 3.2.2
Rails 7.0.8

# 注意点
:::note warn
私はプログラミング学習中で、初学者です。
内容に誤りがある場合があります。
コメント等で教えていただけると幸甚です。
:::

# アクセストークンを取得する
それでは、[Qiita APIのドキュメント](https://qiita.com/api/v2/docs)に沿って実装していきたいと思います。
まず、初めに**アクセストークン**を取得します。
アクセストークンを取得しなくてもAPIを利用することはできますが、認証している状態ではユーザーごとに1時間に1000回まで、認証していない状態ではIPアドレスごとに1時間に60回までという[利用制限](https://qiita.com/api/v2/doc

元記事を表示

ransack scopeの検索キーワードとして ‘T’ が使えない

# 問題

ransackでは、ActiveRecordのscopeを用いて検索することができます。しかし、以下のように検索キーワードとして `’T’` は使えません。エラーメッセージにある通り、scopeに渡されているはずのキーワードが渡されていません。

![Sep-24-2023 23-49-35.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3472392/4e3f26ba-85f5-3ce6-680d-540e33f2515d.gif)

## 環境

– Rails 7.1.7
– Ruby 3.2.2
– Ransack 4.0.0

# 原因

このような問題が起きるのは、`’T’` などといった真理値っぽいものは、ActiveRecordのscopeに渡される前にサニタイズされるからです。

検索キーワードとして、真っぽいものが入っていたら `true`に、偽っぽいものが入っていたら`false`に変換しています(`sanitized_scope_args`メソッドの5-8行目)。

元記事を表示

コールバックでのsaved_change_to_ と will_save_change_to

## はじめに
スクールにて、コールバックの設定に手間取り、その際調べることで挙動の違いを理解したつもりなので、同じようなことにハマった人のためになればいいなと、健忘録として残します。

### 開発環境
Rails 6.1.7.4
ruby 3.0.1

### 目的
管理者が、最後の1人のとき、管理者が0人とならないように権限の編集を制限する。
つまり、1人もいなくなっちゃ困るので、必ず1人は権限を在籍させたい訳です。

### 最初に試したこと(失敗したこと)
– Qiita記事や調べてまずは下記のように設定
“`rb
def admin_cannot_update
if User.where(admin: true).count == 1 && self.saved_change_to_admin == [true,false]
throw :abort
end
end
“`
adminに設定されたユーザーがデータベースに1人だけであり、かつ対象のオブジェクトのadminカラムをtrueからfalseに変更しようとしたとき、 thow :abortで更新を中

元記事を表示

【個人開発】LINEMessagingAPIを使って無差別に飯テロできるアプリを作りました

# はじめに
こんにちは、すずゆーと申します。

突然ですが皆様は飯テロをしたことはありますでしょうか。
私はSNSに美味しいご飯をアップするのが大好きです。
アップした写真に対してフォロワーさんからの反応を楽しむのが大好きです。

しかし、SNSだとせっかくアップしても本当に見てもらいたい人に見てもらえない時があったり…
そんな中、LINEなら確実に相手に届くし見てもらえるじゃん!ということで私の悪戯心を具現化したアプリを開発しました。

## 記事を読む上での注意点
当記事はプログラミング学習を開始して日の浅い業界未経験者が書いたものになりますので、技術的な内容などは誤りを含む可能性があります。予めご了承ください。

# サービス名

### 飯テログ
URL: https://meshitelog.com
GitHub: https://github.com/suzuyu0115/meshitelog
![placeholder.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493892

元記事を表示

【Ruby】ブロックとyield・Proc・lambda

# はじめに

`yield`、`Proc`、`lambda`、こいつらを目にするたびに

1. 「何だったっけなぁ、ブロックを扱う概念だった気がするけど、よくわからん」
2. 調べて、軽くコードを書いて実行してみる
3. わかった気がして満足する
4. しばらく使うこともなく、1へ戻る

を繰り返していました。

そもそも「ほとんど使うことがない」というのも、理解が不十分だから使える場面を見逃しているのではないかという気もしてきたので、ここらで記事にまとめて、理解を深めていこうと思います。

実際にコードを書きながら挙動を確認していくので、似たようなことを感じている方はぜひ、手を動かしながらご覧ください!

「公式ドキュメントを読めばわかるだろ!」という話かもしれませんが、やっぱり自分でコードを書いて(さらに気になったことを思いつくまま試した方が)理解が深まると思います。

# 目次

– [検証環境](#検証環境)
– [ブロック](#ブロック)
– [yield](#yield)
– [Proc](#proc)
– [lambda](#lambda)
– [Proc.newとla

元記事を表示

rails非同期処理 gem比較

実務で扱っているアプリケーション(Rails)に非同期処理を導入することになり、代表的なgemの特徴・メリット・デメリットを調査しました。せっかくなので簡単にまとめておきます。

## 調査対象のgem
– Sidekiq
– Shoryuken
– Rescue
– Delayed_job

## 比較表
GitHubスター数は2023年9月頃のものです。また「〇、△、✕」は条件次第で変わってくるものもあると思います、参考程度の認識でお願いします。

【Rails】診断機能をラジオボタンを使って実装!


## 【Rails】診断機能をラジオボタンを使って実装!

今回はRuby on Railsで診断機能を実装します!
その時にチェックボックスではなくてラジオボタンを使って実装してみようと思います!
目次は以下の通りです!

### 1. コントローラー設計
### 1. データベース周り
### 1. Viewページ周り
### 1. ルート周り

## 1. コントローラー設計

“`ruby:travels_controller.rb
class TravelsController < ApplicationController def index end def new @travel = Travel.new end def show @travel = Travel.find_by(id: params[:id]) end def create @travel = Travel.new(travel_params) if @travel.save flash[:notice]

【初学者】API?パース?なにそれ?おいしいの?

# はじめに
お疲れさまです。
おおくまです。

今回は、個人的に私が苦手意識を持っている「**API**」と「**パース**」と向き合いました。
Railsでミニアプリを作りながら、理解を深めてみました。

# 環境
Ruby 3.2.2
Rails 7.0.8

# 注意点
:::note warn
私はプログラミング学習中で、初学者です。
内容に誤りがある場合があります。
コメント等で教えていただけると幸甚です。
:::

# APIとは
「**API**」とは、「**Application Programming Interface**」の頭文字です。
**インターフェース**とは、コンピュータ用語でいうと、「何か」と「何か」をつなぐものという意味を持ちます。
**つまりAPIとは、アプリケーション、ソフトウェア、プログラムなどをつなぐものという意味になります。**
APIを利用し、そのアプリケーションと連携することで、自分で1からプログラムを組む必要がなくなり、アプリケーション開発の効率化がはかれます。
アプリケーション開発側にとって、開発時間を短縮することができるのは大きな

配列に格納されたハッシュを複数条件でソートしたい

# やりたいこと

まずは、`sort`メソッドを使い、以下の配列をheightの昇順(背の低い順)でソートします。

“`ruby
people = [{ name: ‘Sato’, weight: 20, height: 180 },
{ name: ‘Suzuki’, weight: 30, height: 170 },
{ name: ‘Ito’, weight: 60, height: 160 },
{ name: ‘Watanabe’, weight: 50, height: 150 }]
“`

その後で、**複数条件でのソート**(マルチソート)を試します。
例として、heightが同じ数値の場合はweightの降順(体重が上の順)でソートするようにします。

`sort_by`を使った書き方も最後に紹介します。

## sortメソッドを使用

### heightの昇順でソート

配列の並び替えには[sortメソッド](https://docs.ruby-lang.org/ja/latest/m

RailsのRubyライブラリ自動読み込みについて | なぜrequireしなくても動くのか?

Railsでアプリを開発中、外部APIを叩く処理で[URIライブラリ](https://docs.ruby-lang.org/ja/latest/library/uri.html)を使用する場面がありました。

URIライブラリは[組み込みライブラリ](https://docs.ruby-lang.org/ja/3.1/library/_builtin.html)ではないので、コード内に`require ‘uri’`が必ず必要だと思っていたのですが、require無しでも動いたため、その理由について調べたことをまとめます。

## Rubyライブラリの種類

本題に入る前にRubyライブラリの種類について簡単に。

#### ①組み込み標準ライブラリ
– Ruby本体に組み込まれている。
– require を書かなくても使うことができる。
– 例)Array, Hash, String, Integer

#### ②組み込みではない標準ライブラリ(この記事で扱います)
– Ruby本体に付属している。
– インストール不要でコード内でrequireして使う。
– 例)Date,

has_secure_password の 72 文字制限にご用心

Rails にはパスワードフィールドを管理する方法として `has_secure_password` という機能がある。機能自体については[公式のドキュメント](https://guides.rubyonrails.org/active_model_basics.html#securepassword)を参照してほしい。

本題はこの機能の 72 文字制限についてである。公式のドキュメントにもある通り、この機能が作るパスワードフィールドには最大 72 文字のバリデーションが自動的にかかる。

“`irb
irb> user.password = user.password_confirmation = ‘a’ * 73
irb> user.valid?
=> false
irb> user.errors
=> #72}>]>
“`
[ソースコード]( https://github.com/rai

Railsで静的データのモデルの実装

## 最初に

本記事でやりたかったことは [active_hash](https://github.com/active-hash/active_hash) を使ってもできるので、その前提でお読みいただけると。

記事を書いたときは `active_hash` を知らず、コメントで教えていただきました。

## 背景
Ruby on Railsで開発をしていて、
更新性の低いデータ、DB管理する必要ないであろうデータの扱い方に迷ったので、
対応方法を残します。

## 対象データ
Webサービスのプラン情報についてです。
基本的にリリース後に追加はあっても変更する可能性は低いです。
追加に関してもあっても2年に一度とかとかになるかな..と考えています。

ですので、管理画面作って変更するまでもないし、
DBに入れるまでもないデータだなと思ってどのように実装するかを迷っていました。

## 対処方法
Modelとしては実装しつつも、
DBには保存せず静的なデータで定義をしました。

## 実際のコード

以下のModelクラスを実装です。

“`models/plan.rb
clas

BundlerとRubygemsの依存性によるトラブルシュート

## 環境
Ubuntu20.4
Ruby2.6.0

## はじめに

自分の開発環境から別の環境にRailsのソースを移行して、bundlerを動かそうとしたところ、動かないといった問題に遭遇したため、そのトラブルシュートの記事です。

Bundelrの公式サイトのBlogによると、この問題に関する是正内容が、2019年1月4日の記事で発表されています。わりと古い内容なので、今更な話題ではあります。

https://bundler.io/blog/2019/01/04/an-update-on-the-bundler-2-release.html

## 内容

Bundlerのバージョンを確認したところつぎのエラーが発生しました。
“`
$bundle -v
Traceback (most recent call last):
2: from /usr/local/rbenv/versions/2.5.0/bin/bundle:23:in `


1: from /usr/local/rbenv/versions/2.5.0/lib/

rails 通知機能

**はじめに**

今回は、投稿のいいね機能についての通知機能を実装します。

バージョン
rails 6.1.7.4
ruby 3.1.2
通知する機能いいね機能作成済みとします
________

### モデル作成
“`
rails g modle Notification
“`
“`notification.rb
class Notification < ApplicationRecord # デフォルトの並び順を「作成日時の降順」で指定、に新しい通知からデータを取得することができる default_scope -> { order(created_at: :desc) }
belongs_to :visitor, class_name: ‘User’, optional: true
belongs_to :visited, class_name: ‘User’, optional: true
# optional: trueは、nilを許可するもの
belongs_to :post, optional: true
belongs_to :c

Sidekiq Shoryuken Rescue Delayed_job
GitHubスター数 12.7k 2k 9.3k 4.8k