- 1. [Ruby on Rails]既存のテーブルにカラムを追加するためのマイグレーションにえらい苦戦した話
- 2. [Ruby]配列やハッシュの展開
- 3. [Ruby]クラスメソッドと定数をprivateにする
- 4. 【Rails】modelでメソッドにselfをつける時とつけないときの違い
- 5. BUILD FAILED (macOS 13.5 on arm64 using ruby-build 20231114)
- 6. 戻り値(返り値)とはどういう概念か掘り下げて考えた
- 7. Ruby on Railsアップデート(ErrorReporter#unexpected/with_routingテストヘルパー 他 2023-11-24)
- 8. 【Rails】text_fieldにカンマ入り金額が入力され1円で出品されそうになった話
- 9. Sinatra アプリで Sass の処理を行う一手法
- 10. Go:レシーバについて解説(Rubyとの違いも合わせて解説)
- 11. 【Ruby】n 人を m 班に分ける
- 12. 初めてのRspecで学んだこと
- 13. 【OpenAI】RailsでChat GPTを導入しよう
- 14. 素因数分解をするrubyスクリプト
- 15. ebay出品時のコンディション設定について
- 16. Tinker Board S R2.0 にRuby 3.2を入れるまでのメモ
- 17. Ruby Gold 3.1を受けた感想。出題傾向/対策まとめ(2023年11月)
- 18. エラトステネスの篩で素数を出力するRubyスクリプト
- 19. bcryptGemを用いたパスワードのハッシュ管理
- 20. DeviseGemを使わないログイン機能の実装方法
[Ruby on Rails]既存のテーブルにカラムを追加するためのマイグレーションにえらい苦戦した話
## 経緯
初任教育研修で、既存のタスク管理アプリに機能を追加する際に苦戦したときのメモです。
タスク管理アプリに、タスクの期限機能を追加開発する際に、既存のtasksテーブルにduedateカラムを追加しようとしていました。## db:migrateコマンドの実行
まずはTasksテーブルにduedateカラムを追加するためのマイグレーションファイルを作成するためにgenarateコマンドを実行します。“`terminal
rails g migration AddDueDateToTasks duedate:datetime
“`
これで自動的に以下のようなマイグレーションファイルができました
“`Ruby
class AddDueDateToTasks < ActiveRecord::Migration[7.1] def change add_column :tasks, :duedate, :datetime end end ``` ## マイグレーションファイルの編集の際に陥った勘違い まず、自分が勘違いして書いた間違ったコードが
[Ruby]配列やハッシュの展開
配列はオブジェクトの前に`*`を、ハッシュはオブジェクトの前に`**`を付けることで「展開」することができます。「展開」が何を意味しているかは、[マージ](#マージ)や[引数](#引数)の欄を参照してイメージを掴んでください。
## マージ
`merge`メソッドや`reverse_merge`メソッドを使ってもハッシュをマージできますが、`**`で展開すると簡潔に書けます。
“`ruby
pp ([1, *[2, 3]])
# => [1, 2, 3]pp ({ hoge: 1, **{ fuga: 2 } })
# => { hoge: 1, fuga: 2 }
“`ハッシュのキーが重複している場合は、後に指定した値が優先されます。ただし、展開したハッシュの値が展開先のハッシュの値を上書きする場合は、警告が出ます。
“`ruby
pp ({ hoge: 1, **{ hoge: 2 } })
# warning: key :hoge is duplicated and overwritten on line 1
# => { hoge: 2 }pp ({
[Ruby]クラスメソッドと定数をprivateにする
インスタンスメソッドをprivateにするには、class定義の中にprivate領域を作って、その中で定義します。
“`ruby
class C
privatedef func
“called”
end
end# private method `func’ called
# pp C.new.func
“`特異メソッドや定数については、この方法が使えなかったため、記事としてまとめておきます。
## クラス特異メソッド
### `private_class_method`
`private_class_method`メソッドを使ってprivateにします。
“`ruby
class C
def self.get_const
“const”
endprivate_class_method :get_const
end# private method `get_const’ called for C:Class
# pp C.get_const
“`### 特異クラス
【Rails】modelでメソッドにselfをつける時とつけないときの違い
どうもこんにちは。
今回はRailsでモデルファイルで定義したメソッドに`self`をつける時とつけない時の違いについて説明します。(おまけでバリデーションメソッドについても説明しています。)
# モデルにメソッドを定義する理由
## 1. 全体で利用可能
モデルに定義したメソッドはアプリケーション全体で利用可能となるメソッドです。そのため、コントローラやビュー、他のモデルの中でも使用することができます。
## 2. 処理の共通化
アプリケーション内で何度も同じ処理をする必要がある場合があります。その時に**同じ処理の共通化**を目的としてモデルにメソッドに定義し、同じ処理をしたい箇所でメソッドを呼び出すことでコードが簡略化できます。
## 3. バリデーションを定義
本来は、`validates`メソッドを使用してカラムに対して「空白禁止」や「文字数制限」を定義します。大体のバリデーションは1行で完結できます。しかし、二つのカラムにデータが入っていない場合のバリデーションを定義するときには、俗にいう「バリデーションメソッド」を定義します。
# selfを付けない場合
BUILD FAILED (macOS 13.5 on arm64 using ruby-build 20231114)
# 事象
– M2 Macで `rbenv install 3.2.2` が通らない## 解決策
– .bashrcにhomebrewのpathを明示する
“`bash
export PATH=”/opt/homebrew/bin:$PATH”
“`
– .bashrcでRUBY_CONFIGURE_OPTSを指定する
“`bash
export RUBY_CONFIGURE_OPTS=”–with-openssl-dir=$(brew –prefix openssl@1.1)”
“`—
## 原因と流れ
### 原因1(homebrewのpath)
.bashrcの記載を変えた際に、homebrewのpathを消去してしまっていた“`bash
$ rbenv install 3.2.2
ruby-build: using openssl@3 from homebrew
==> Downloading ruby-3.2.2.tar.gz…
-> curl -q -fL -o ruby-3.2.2.tar.gz https://cache.ruby-l
戻り値(返り値)とはどういう概念か掘り下げて考えた
## 自己紹介
はじめまして、はると申します。完全異業種からのエンジニア転職を目指して、スクールに通いながら学習をしています。## 概要
プログラミングにおける「戻り値」について、Rubyの例を用いて説明します。## 注意
私は前職が完全異業種であり、英語も苦手で、スクールに入って初めてプログラミングに触れました。
そんな自分が理解しづらかった部分を、同じように初めてプログラミングの概念に触れた人に向けてまとめました。
自分の復習も兼ねて、超超噛み砕いて書いているため、周りくどい書き方になっている箇所もあるかと思います。また、初学者のため、間違っている箇所もあるかもしれませんのでその際は教えて頂けると嬉しいです🙇
## 戻り値とは
戻り値とは、言語に関わらずプログラミングに共通する概念です。
この記事全体を通して説明していきます。## 噛み砕いて考える
私が初めて戻り値に出会ったときは、「 **あらかじめ定義しているメソッド** を **使って** 結果が得られている」のに、どうして **「戻り」** 値なの?🤔と疑問に思っていました。
それでは、例を用いて説明し
Ruby on Railsアップデート(ErrorReporter#unexpected/with_routingテストヘルパー 他 2023-11-24)
## 引用元
https://world.hey.com/this.week.in.rails/errorreporter-unexpected-with_routing-test-helpers-and-more-1b2c56f6## 今週のトピック
### [ErrorReporter#unexpectedを本番環境ではreportし開発環境ではraiseするようにする](https://github.com/rails/rails/pull/49951)
https://railsguides.jp/error_reporting.html
この変更により、前提条件違反を報告する`ErrorReported#unexpected`が追加された。例えば、以下のコードではdevelopment環境とtest環境ではエラーをraiseするが、production環境ではエラーをreportする。
“`
def edit
if published?
Rails.error.unexpected(“[BUG] Attempting to edit a pub
【Rails】text_fieldにカンマ入り金額が入力され1円で出品されそうになった話
## 経緯
ECサイトにシステムから1800ドルで出品する処理を行ったところ1ドルで出品されるという報告を受ける。
⇨検証のため同じ環境で同じ価格で出品したところ、正常に出品される。
⇨原因がわからない。
という事象が発生。## 原因
出品テストの担当に聞いたところ1800ドルが1ドル、2200ドルが2ドルになっているとのこと。
ここで「入力値にカンマやピリオドが入っているのでは」と気付く。入力欄を確認するとnumber_fieldではなくtext_fieldとなっており、
価格を1,800ドルで出品してみると、1ドルで出品される現象が再現された。## いろいろ確認してみた
今回の対処としてはtext_fieldをnumber_fieldに修正し、
数字以外入力不可能とすることで完了したが、
int型,decimal型で文字列を含む数字を受け取った時の挙動を確認してみた。1,000 → 1
1,000円 → 1
10,000 → 10
¥10,000 → 0
いちまんえん → 0先頭から文字列までの数値が保存されるようだ。
## まとめ
価格、数量など数値しか扱わ
Sinatra アプリで Sass の処理を行う一手法
もっと良いやり方があるかもしれないけど。
# 動機
Sinatra で Sass を使うには,
“`rb
get “/hoge.css” do
sass :hoge
end
“`みたいな感じ書いてやればいいのだが,この `sass` メソッドを使う方法は [sass](https://rubygems.org/gems/sass) gem もしくは [sassc](https://rubygems.org/gems/sassc) gem を使うことが前提になる(たぶん)。
両 gem は既に開発を終了しており,イマドキの Sass 仕様(`@use` とか)には対応していないので,新規プロジェクトでは使いたくない。Ruby でイマドキの Sass を使うには,[sass-embedded](https://rubygems.org/gems/sass-embedded) gem を採用するのがよいと考えている。
Sinatra では,CSS など静的なもの(動的生成しなくよいもの)は `public` ディレクトリーに入れておけばよく,上記のような `get`
Go:レシーバについて解説(Rubyとの違いも合わせて解説)
# はじめに
レシーバは一般的に利用される関数と違い形式がわかりづらいです。
本記事を読んでいただき、レシーバの理解に役立てていただければ幸いです。# レシーバとは
レシーバは特定の型に対するメソッドを定義する際に使用されます。
メソッドが操作する主体を指し、メソッドがどの型に属するかを定義します。# レシーバの書き方
“`go
package mainimport “fmt”
// 1. 型の定義:
// type ~ structは、Rectangle構造体を定義しています。Rectangleは長方形を表します。
type Rectangle struct {
Width, Height int
}// 2. レシーバを持つメソッドの定義:
// Rectangle構造体に対するAreaメソッドを定義しています。これは長方形の面積を計算します。
func (r Rectangle) Area() int {
return r.Width * r.Height
}func main() {
// 3. Rectangle構造体のインスタンスを作成
【Ruby】n 人を m 班に分ける
# お題
長さ `n` の配列があるとする。
配列の要素は,まあ何でもいいんだけど,人を表しているとする。
簡単のため,“`rb
persons = [“Alice”, “Bob”, “Carol”, “Dan”, “Emily”, “Finn”]
“`としよう。
これを**均等に** `m` 個に分割したいとする。要する班わけですな。
さきほどの `persons` を 3 班に分けるなら,たとえば
“`rb
[
[“Alice”, “Bob”],
[“Carol”, “Dan”],
[“Emily”, “Finn”]
]
“`みたいな二重配列が欲しいわけだ。
一般には `n` が `m` で割り切れるとは限らないので,班によって人数が異なりうる,ということに注意しよう。
その場合でも,なるべく人数が揃うようにしたい。# 班の最大人数は ceil(n/m)
なるべく人数が均等になるようにするなら,班の最大人数は
“`math
\left\lceil \frac nm \right\rceil
“`となる。($\lceil\h
初めてのRspecで学んだこと
課題で出てきて、初めて取り組んだRspec!
色々なポイントを学んだので備忘録として残しておく。
初学者なので、間違ってる点などあればご指摘下さい。“`
ruby 3.2.2
rails 6.1.7.6
“`
作成しているアプリはタスク管理アプリ## SystemSpecの基本
### Factoryを使用したテスト
Factoryとは、railsでテストをする時用のテストデータを作成してくれるテンプレートのこと。
factory_bot_railsというgemをインストールすることで使用できるようになる。
(Factoryを使用する手順(インストール方法など)は今回は省略。)
今回のタスク管理アプリで、「一覧画面に遷移した場合」→「作成済みのタスク一覧が表示される」というテストコードを書く際、Factoryを使用した。“`spec/factories/task_spec.rb
FactoryBot.define do
factory :task do
name { ‘パパ’ }
content { ‘日曜日歯医者’ }
end
end
“`
【OpenAI】RailsでChat GPTを導入しよう
## はじめに
どうもこんにちはもきお([@mokio_50](https://twitter.com/mokio_50))です。突然ですが皆さんはChat GPTは好きですか? 自分は大好きです。どれほど開発の手助けになってきたことか。そんなChat GPTを会社のシステムとAPI連携することになりました。その機能開発を担当したので今回はRailsでChatGPTのAPI連携する流れを記事にしたいと思います。
## 目次
1. APIキーの発行
2. 今回の実装イメージ
3. 実装
4. 検証## 1. APIキーの発行
外部APIとの連携を行うためにはAPIキーが必要になります。以下の記事が参考になりました。## 2. 実装イメージ
通常の外部API連携だと例えば法人番号を取得できるAPIと連携するとしましょう。その場合法人番号が取得できるリクエストを作成し、返ってきたレスポンスに対して整形し表示なりデータベースに保存するなりする流れになるかなと思います。今回はChat機能
素因数分解をするrubyスクリプト
素因数分解をするrubyスクリプトです。
`chmod +x factor.ruby`
`./factor.ruby`
として動かしてください。“`factor.ruby
#!/usr/bin/ruby
def primefactorization(n)
if n==0 || n==1
return []
end
i=2
f=[]
while n!=1 do
if n%i==0
f+=[i]
n/=i
else
i=i+1
end
end
f
endn=ARGV[0].to_i
f=primefactorization(n)
print n,”:”,f,”\n”
“`
ebay出品時のコンディション設定について
## コンディションについて
コンディションとはヤフオクで言う「新品」「中古」「可」など商品の状態を指すものであり、
eBayへ出品を行う際、一部のカテゴリを除き指定が必須となっています。じゃあ指定すればいいだけの話じゃん。となりそうですが実はeBayのコンディションは
ヤフオクのようにどの商品でも共通しているわけではなくカテゴリによって
選択できるコンディションが異なっています。例えば下表の赤枠は食品ですが、こちらは「New」しか選択できないのに対し
青枠のカメラ等は非常に多くのコンディションが選択できます。
![スクリーンショット 2023-11-26 0.02.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3083940/5d56ae5e-2d5a-a19b-1b28-d4ca73845e65.png)
_[eBayドキュメント](https://developer.ebay.com/devzone/finding/callref/enums/conditionidlist.ht
Tinker Board S R2.0 にRuby 3.2を入れるまでのメモ
## apt-get update
“`
$ sudo apt-get update
Get:1 http://ftp.jp.debian.org/debian buster InRelease [122 kB]
Get:2 http://ftp.jp.debian.org/debian buster-updates InRelease [56.6 kB]
Get:3 http://ftp.jp.debian.org/debian buster-backports InRelease [51.4 kB]
Get:4 http://security.debian.org buster/updates InRelease [34.8 kB]
Get:5 http://security.debian.org buster/updates/main armhf Packages [565 kB]
Get:6 http://security.debian.org buster/updates/main Translation-en [309 kB]
Get:7 http://security
Ruby Gold 3.1を受けた感想。出題傾向/対策まとめ(2023年11月)
### はじめに
2023年11月にRuby技術者認定試験Goldを受験しました。
結果は96点でした。ある程度余裕をもって合格することができたので、以下を公開することにしました。
1. 実際に出題された問題例
1. 受験に向けて実施したこと
1. 対策としてまとめていた点念入りに対策して臨んだこともあり、試験で解答に迷う問題はありませんでした。
私のように余裕を持って合格したい方は、こちらの記事を参考にしていただければと思います。### 受験に向けて実施したこと
#### 勉強期間
Silver合格後、1ヶ月間(70H)ほど勉強しました。
– 10月28日 Ruby技術者認定試験 Silver 受験
– 11月23日 Ruby技術者認定試験 Gold 受験#### 参考にしたサイ
エラトステネスの篩で素数を出力するRubyスクリプト
エラトステネスの篩で素数を出力するRubyスクリプトです。
`chmod +x sieve.ruby`して、
`./sieve.ruby 1000` として実行して下さい。“`sieve.ruby
#!/usr/bin/rubydef sieve(n)
tab=(2..n).to_a
l=[]
while l.push(tab.shift).last do
tab.reject!{ |x| x%l.last==0 }
end
l[0..-2]
endprimes=sieve(ARGV[0].to_i)
p primes, primes.length
“`実行結果
“`
$ ./sieve.ruby 1000
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167
bcryptGemを用いたパスワードのハッシュ管理
# bcryptGemを用いたパスワードのハッシュ管理
Webアプリケーションのセキュリティを確保する上で、パスワードの安全な管理は重要な役割を果たします。`bcrypt` Gemを使用することで、Railsアプリケーションにおいて、パスワードを安全にハッシュ化し、管理することが可能です。この記事では、`bcrypt` Gemを使用したパスワードのハッシュ化と認証プロセスについて詳しく解説します。
## bcryptGemとは
`bcrypt` Gemは、パスワードのセキュリティを向上させるために使用されるRubyのライブラリです。このGemは、パスワードをハッシュ化することで、データベースに平文のパスワードを保存するリスクを回避します。
### パスワードのハッシュ化
– ユーザーがパスワードを設定すると、`bcrypt` Gemはそのパスワードをハッシュ化します。これにより、実際のパスワードとは異なる、独特な文字列が生成されます。
## has_secure_passwordの利用
Ruby on Railsでは`has_secure_password`メソッドを使用
DeviseGemを使わないログイン機能の実装方法
# DeviseGemを使わないログイン機能の実装方法
Webアプリケーションにおいて、ユーザー認証機能はセキュリティとユーザーエクスペリエンスを確保するために不可欠です。しかし、すべてのプロジェクトでDeviseGemなどの認証フレームワークを使用するわけではありません。ここでは、DeviseGemを使わない基本的なログイン機能の実装方法を解説します。
## サインインとログインの基本的な仕組み
### セッションの利用
– ユーザーがログインすると、そのユーザーのIDがセッション変数に保存されます(`session[:user_id] = @user.id`)。
– ブラウザはこのセッション情報を受け取り、以降のリクエストにセッションIDを含めてサーバーに送信します。
– サーバー側はセッションIDを確認し、それに基づいてユーザーがログイン済みであるかどうかを判断します。
– ユーザーログアウトして際は、ユーザーのIDをセッションから剥奪します(`session[:user_id] = nil`)。### カレントユーザーの設定
– セッションに保存されているユーザー