Ruby関連のことを調べてみた2021年12月31日

Ruby関連のことを調べてみた2021年12月31日
目次

rails s時の「Address already in use」の解決方法

rails s でローカルホスト3000を立ち上げようとした時に、「Address already in use」というエラーが出て起動ができない問題が派生しました。
その際に実施した解決法について備忘録としてまとめます。

以下エラー文です

“`ruby:qiita.rb
Address already in use – bind(2) for “127.0.0.1” port 3000 (Errno::EADDRINUSE)
“`
翻訳すると、ローカルホスト3000は既に立ち上がっている。という意味なので、ターミナルを全て終了させたのですが、改善しませんでした。

エラーの原因としては、アプリの動作中にctrl cで強制終了させた事のようです。
その際に行った対処法は
①lsof -i:3000コマンドで、ローカルホスト3000を使用しているアプリを見る
②kill -9 PID番号で該当するPID番号のプロセスを終了させる
という手順です。
順番に説明します。

#「lsof -i:3000」 コマンド

まずはlsof -i:3000 コマンドを実行してローカルホス

元記事を表示

RubyとRuby on Railsの環境構築

## はじめに
railsの環境構築でいろいろ試したので困っている人は参考にして欲しい

2時間後に帰省のバスに乗らないといけないので焦っている
本日は12月31日  みなさん良いお年を

## Homebrewのインストール
1. Homebrewのバージョン確認と更新
`brew -v` `brew update`
home brewのinstall方法は他の記事でもよく紹介されているので割愛する
既に入っているuserも多いと思う
もし入っていなければ
参考サイトのURLを下部に貼っておくのでそちらを確認して欲しい

## rbenvとrbenv-buildのインストール
1. ebenvのインストール
`brew install rbenv`
2. rbenvのバージョン確認と更新
`rbenv -v` `brew upgrade rbenv`
3. rbenv-buildのインストール
`brew install ruby-build`
4. rbenvのセットアップ (pathを通す)
`echo ‘eval “$(rbenv init -)”‘ >> ~/

元記事を表示

『エラトステネスの篩』各言語記述例まとめ

タイトル通りです.筆者過去まとめ記事と趣旨は同じなのですが,一説に『ネット上のエラトステネスの篩のプログラムの大半がエラトステネスの篩じゃない』というのがあるらしく,その割合を少しでも減らす,という目論見もあったりします.なにそれ.

初版で用意した各言語記述例については,とりあえず[Wikipediaの説明](https://ja.m.wikipedia.org/wiki/%E3%82%A8%E3%83%A9%E3%83%88%E3%82%B9%E3%83%86%E3%83%8D%E3%82%B9%E3%81%AE%E7%AF%A9)に沿っているつもりですが,上記の記事の趣旨から,それちげーよというツッコミ大歓迎.また,最初にPython版を作成してそれを基に各言語に書き換えたという経緯から,各言語の特徴を活かした,よりシンプルでわかりやすい記述例も大募集.ただし,次の条件を満たすプログラムとします.

* アルゴリズムが『エラトステネスの篩』であること.
* 1から一億までの範囲の素数を一旦求め,その中で最大の素数(99999989)を出力すること.

差し替える際には,当方の次の

元記事を表示

【Rails】モデルにインスタンスメソッドを定義する方法

##モデルにメソッドを定義する理由
モデルに書くのはvalidatesやbelongs_to,has_manyなどだけでなく、メソッドも定義できる。

もちろんモデルを使わなくても小さいサービスであればコントローラーでも全然問題ないが、
理由として少し大きなサービスになってくると、すぐにコントローラーのコード量が増えてしまうからである。(ファットコントローラー)

その時は理解できても、数ヶ月後にコードを見返すと何のコードなのかわからなくなってしまう可能性がある。

##例を交えて解説

“`user_controller.rb

def index
@user = User.find(1)
@my_age = @user.too_young ⬅️
end
“`
このtoo_youngがインスタンスメソッドというもので、モデルで書いたメソッドを
コントローラーで呼び出している。

“`user.rb

class User < ApplicationRecord validates :username, presence: true validates :emai

元記事を表示

【Ruby のまずいコード】漢字を数える

# お題

引数として与えられた文字列中の漢字の個数を数えて返すメソッドを書いてください。
同じ漢字が複数回出てきてもそれぞれカウントします。
文字列は UTF-8 であるとします。

# コード

“`rb
def kanji_count(str)
str.scan(/[一-龥]/).count
end
“`

# 講評

「すべての漢字」を表す正規表現として `[一-龥]` は使えません。これでは Unicode の漢字の一部分しか拾えません。

Unicode では,漢字がいくつものブロックに分かれて収録されていますが,そのうちの最も基本的なものが「CJK 統合漢字(CJK Unified Ideographs)」と呼ばれるブロックです。
CJK 統合漢字のブロックは,Unicode バージョン 1.0 のとき,「一」で始まり「龥」で終わっていました。
`[一-龥]` という正規表現はその時代(30 年前!)の名残でしょう。

# 改善

「すべての漢字」を表す文字クラスは `\p{Han}` と書けます。これを使うのが簡単です。

“`rb
def kanji_cou

元記事を表示

【Rails】セレクトボックスを作る方法と注意点【select・collection_select】

Railsのセレクトボックスって、
引数の順番とか指定できる項目の種類が
ごちゃごちゃしてて、なんとなーくの理解だったので、
色々調べてみました!

なお、間違いやもっと良い方法がある…等ありましたら、
お気軽にコメントください。お願いいたします!

# 作成方法①:select メソッド

select メソッドを使ったセレクトボックスの構文は下記です。

“`
select(オブジェクト名, オプションタグの要素(配列 or ハッシュ), オプション, HTMLオプション)
“`

まず、コントローラーでselect に渡す要素を準備する必要があります。どのような方法でも良いですが、例として下記のような取得方法があるでしょう。

“`app/controllers/user_controller.rb
@users = User.pluck(:name, :id)
# => [[“A太郎”, 1], [“B太郎”, 2], [“C太郎”, 3]]

@users = User.all.map { |user| [ user.name, user.id ] }
# => [

元記事を表示

【Rails】ルーティングのネストについて

##ルーティングのネストとは
ルーティングのネストとは、あるコントローラへのルーティングの記述の中に、別のコントローラへのルーティングを記述すること。

例えばTwitterの場合、ツイートに対してコメントできる機能があるその場合、このアプリケーションのルーティング(routes.rb)の記述は以下のようになる。

“`
Rails.application.routes.draw do
resources :tweets do
resources :comments, only: [:create]
end
end
“`

tweetsコントローラへのルーティングの記述の中に、commentsコントローラへの記述が書かれている。こうすることによって、どのツイートに紐づいたコメントなのかをURLで判別できるようにしている。

##メリット
**①URLの階層構造ができる**
先程のTwitterのルーティング記述により生成されるURLは、「/tweets/id/comments」になる。

もっと具体的に言うと、とあるツイートにコメントすると「/tweets/2/co

元記事を表示

【Ruby のまずいコード】引数の扱い

# お題

引数として文字列の配列が与えられたとき,それらをハイフンで繋いだ文字列を返すメソッドを書いてください。
配列の要素はすべて文字列であると仮定して構いません。
ただし,要素は空文字列の可能性があり,これを除いたものだけをハイフンで繋ぎます。

つまり,以下のような動作をするものとします:

“`rb
p join_with_hyphen([“foo”, “bar”, “”, “baz”])
# => “foo-bar-baz”
“`

(メソッド名が英語として妥当でない気がしますが,英語が苦手なのでよく分かりません。得意な方は教えてください)

# コード

“`rb
def join_with_hyphen(strings)
strings.delete(“”)
strings.join(“-“)
end
“`

# 問題点

このメソッドはお題のとおりに動作します。
しかし,引数のオブジェクトを破壊的に変更しているのは非常に悪い流儀です。残念ながらこういうコードをよく目にします。

`join_with_hyphen` を呼び出す側では,与えた実引数を他の

元記事を表示

Ruby-FFIのManagedStructは、ObjectSpace#define_finalizerを利用して、GCにオブジェクトが回収される際に、予め登録されたメモリを解放する関数をFFIで呼ぶ

Ruby-FFIでは、C言語の構造体と、Rubyのクラスを関連付けることができる。Rubyのクラスのインスタンスオブジェクトが作成されると、C言語の構造体用のメモリが確保される。しかし、RubyのインスタンスがGCによって回収される時に、C言語の構造体のメモリが解放されるとは限らない。

そこでRuby-FFIでは、RubyのオブジェクトがGCに回収された時に、C言語側でメモリを自動的に解放してくれるクラス`ManagedStruct`というものが用意されている。ManagedStructはC拡張でゴリゴリと難しいことをしているのかと思いきや、意外にもシンプルにRubyで実装されている。

その内容を見てみると、`ObjectSpace#define_finalizer` というものを利用している。これはオブジェクトがGCに回収される時に呼び出されるメソッドであるようだ。コレが呼ばれた時に、メモリ解放用の関数が発火するように登録しておけばいい。

この記事は以上です。

元記事を表示

【Ruby のまずいコード】素数判定

# お題

引数として与えられた正の整数が素数かどうか判定するメソッドを書いてください。
[prime](https://docs.ruby-lang.org/ja/master/library/prime.html) ライブラリーは用いず,2 以上の整数で順に割り切れるかを調べるごくごく素朴な実装としてください。

# コード

“`rb
def prime?(n)
2.upto(Math.sqrt(n)) do |k|
return false if n % k == 0
end
true
end
“`

2, 3, 4, 5, 6, … で割った剰余を求め,割り切れたら `false` を返しています。
どれでも割り切れなかったとき `true` を返しています。
4 以上の偶数は試す必要がありませんが,お題ではそういった工夫もせず素朴に実装することを求めているのでそうしています[^sbk]。

[^sbk]: この記事で伝えたい以外のことをできるだけシンプルにしたかったわけ。

ただし,効率に関わる大きな工夫が一つあります。
除数として `n` まで

元記事を表示

【 rails db:migrate実行時のエラー 】

##カラムを新しく追加し、rails db:migrateを実行したが、エラー発生
deviseを導入し、ユーザー管理機能を実装していました。
`login_id`カラムを追加しようと思い、マイグレーションファイルにカラムを追記し、
`rails db:migrate`を実行したところ、
`Mysql2::Error: Table ‘users’ already exists`と表示される。
(usersテーブルは既に存在していますよ〜)

##なぜ?
原因はよく分からないまま、エラーをもとに検索。
##結果
`rails db:dorp`で一度データベースを削除し、
`rails db:create`で再生成。

その後`rails db:migrate`を実行すると、エラーも無く、
`login_id`カラムも追加されていました。

##反省
configディレクトリ内のdatabase.ymlファイルに記してある、
`utf-8mb4`を`utf-8`に変更していなかった事が原因と考えられます。
この二つではデータの保存形式が異なるそうです。

元記事を表示

GitHub Pages の Jekyll 自動ビルドで使えるプラグインをまとめてみた

# はじめに
GitHub 上の HTML を Web ページとして公開してくれる GitHub Pages というサービスがある。作ったツールのドキュメントなどを、自分でサーバを用意することなく Web ページとして公開することができるが、サイトジェネレータを使用すればブログのようなサイトを GitHub Pages で公開することもできる。

HTML / CSS / JavaScript しか使用できない (Ruby や Go などサーバサイドの処理は行えない) ので、基本的にはブログ記事をマークダウン等で書いたら、それをローカルでビルドして HTML に変換してからその HTML を GitHub リポジトリ上にプッシュすることになるが、実は Jekyll というサイトジェネレータに限っては、自分でローカルでビルドせずとも、GitHub が自動でビルドまで行ってくれる。つまりマークダウンをそのまま GitHub リポジトリ上にプッシュすれば GitHub が自動的に HTML に変換して Web ページを作ってくれるというわけだ。

ただし、それには制限がある。自分でローカルで

元記事を表示

Rails 7.0で”DEPRECATION WARNING: image/jpg is not a valid content type”のようなエラーが出た場合

## 発生した問題
Rails 7.0にバージョンアップしてテストを実行したら以下のようなエラーメッセージが出ました。

“`
DEPRECATION WARNING: image/jpg is not a valid content type, it should not be used when creating a blob, and support for it will be removed in Rails 7.1. If you want to keep supporting this content type past Rails 7.1, add it to `config.active_storage.variable_content_types`. Dismiss this warning by setting `config.active_storage.silence_invalid_content_types_warning = true`. (called from public_send at /Users/jnito/.rbenv/versions/

元記事を表示

Rails7のlink_toでmethod: :deleteする

Rails7で

“`erb
<%= link_to t("sign_out"), sign_out_path, method: :delete %>
“`
しようとしたら動きませんでした。

代わりに

“`erb
<%= link_to t("sign_out"), sign_out_path, data: { turbo_method: :delete } %>
“`

を使えば良いようです。

元記事を表示

改訂版・チェリー本発売記念 点字メーカープログラムに挑戦してみた!(Advent Calendar 2021/Qiita主催)

[フィヨルドブートキャンプ](https://bootcamp.fjord.jp/)で学習中のはるぐちです。

伊藤淳一([@jnchito](https://twitter.com/jnchito))さん著『プロを目指す人のためのRuby超入門/技術評論社』(通称チェリー本)の改訂2版が発売されたということで[Rubyプログラミング問題にチャレンジ! -改訂版・チェリー本発売記念-](https://qiita.com/advent-calendar/2021/ruby-challenge)で出題されている「点字メーカープログラム」に挑戦してみました。アドベントカレンダー12月6日担当です。([ブログ](https://haruguchi-yuma.hatenablog.com/entry/2021/12/06/102158)からの転載です)

こういう企画に参加するのは初めてだったのですが、

– チェリー本に育てられたといっても過言ではないので発売記念イベントを是非盛り上げたい
– 自分の書いたコードを他人に見てもらうのは良い学習になる
– 他の人の書いたコードを読むのは良

元記事を表示

[Rails]オブジェクト指向とは 3行で要約

#オブジェクト指向を簡単に言うと
“`
同じようなプログラムを1か所にまとめてコードを再利用しやすくする仕組み
他のプログラムからできるだけ変更できない仕組み
継承したコードの一部を変更して利用するための仕組み
“`

下記URLに詳しく書かれています。
[オブジェクト指向とは](https://robo-done.com/blog/2021/04/doneship_object_oriented/)

元記事を表示

インスタンス変数の2つの特徴について

プログラミング学習中です。 
今回はインスタンス変数について備忘録としてまとめてみます。

#インスタンス変数とは
 まずインスタンス変数とはクラスの中で、以下のように@変数名とすることで定義することができる特殊な変数のことである。

“`ruby:qiita.rb
class book
def initialize(title)
@title = title
end
end
“`

この@で始まるインスタンス変数は大きく分けて2つの特徴があります。
1つ目は、クラス内の全メソッドで使用する事ができる。
2つ目は、インスタンス毎に違う値を持てる。
です。順番に解説します。

#クラス内の全メソッドで使用する事ができる

まずインスタンス変数の1つ目特徴である、「クラス内の全メソッドで使用できる」という事を、コードで見てみます。

“`ruby:qiita.rb
class Book
def initialize(title)
@title = title
end
 
 def output
puts “好きな本は#{@title}です”

元記事を表示

「heroku run rails db:migrate」コマンドとは・・・

##環境
– Ruby 2.6.5
– Rails 6.1.4.1

##調査の背景・目的
Herokuのデプロイ時のエラー文「We’re sorry, but something went wrong.」が出た際の対処法で、「heroku run rails db:migrate」コマンドを入力すると解消された。コマンドの詳細について記載する。

##そもそもmigrationとは・・・
– データベースの構造(テーブル、カラム)を変更するときに利用する機能

##migrationファイルとは・・・
– データベースを生成する際の設計図

##「rails db:migrate」コマンドで何をする?
– migrationファイルの内容をデータベースに反映する

##「heroku run rails db:migrate」コマンドで何をする?
– migrationファイルの内容を**herokuサーバのデータベース**に反映する

以上

元記事を表示

メモ: チェリー本の気づいたこと、印象に残ったことメモ 12/28

[プロを目指す人のためのRuby入門(通称チェリー本) 改訂2版](https://www.amazon.co.jp/%E3%83%97%E3%83%AD%E3%82%92%E7%9B%AE%E6%8C%87%E3%81%99%E4%BA%BA%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AERuby%E5%85%A5%E9%96%80-%E6%94%B9%E8%A8%822%E7%89%88-%E8%A8%80%E8%AA%9E%E4%BB%95%E6%A7%98%E3%81%8B%E3%82%89%E3%83%86%E3%82%B9%E3%83%88%E9%A7%86%E5%8B%95%E9%96%8B%E7%99%BA%E3%83%BB%E3%83%87%E3%83%90%E3%83%83%E3%82%B0%E6%8A%80%E6%B3%95%E3%81%BE%E3%81%A7-Software-Design/dp/4297124378/ref=asc_df_4297124378/?tag=jpgo-22&linkCode=df0&hvadid=52952

元記事を表示

【Rails】定数の定義方法【上書きトラブル注意】freeze

皆さんは、定数ってよく使いますか?

「Rails」も別の言語と同様で、
どこか専用の場所に定義して使うんだろうなー…ってフワッとした認識だったのですが、調べてみると色々注意点が出てきました。

Railsの定数っていうのは「定数=定まった変数」と言いながら、
実はプログラム内で値を書き換えることが可能なのですね。

チーム開発においては、その辺特にバグの原因にもなり得る箇所かなーなんて思うので、
ぜひ皆さんの今後の開発トラブル回避に繋がるなら幸いだなーと思います!

注意点の前に、
まず、Railsの定数の定義方法について3つ共有します!

# 定数を定義する方法①【カンタン】

一番カンタンな方法がこちら。
「config/initializers/constants.rb」ファイルに定数を定義する方法です。これが、アプリケーションのどこからでも定数を呼び出せる一番カンタンな方法でした。

“`config/initializers/constants.rb
module Hoge
FUGA = [“これは定数です”]
end

p Hoge::FUGA
# => “これ

元記事を表示

OTHERカテゴリの最新記事