- 1. Ruby 3.1.0 preview 1でTypeProf for IDEを試してみた
- 2. Ruby で解く AtCoder ABC 227 D
- 3. Pryのlsを使うと謎の^A^B^A^Bとかが表示されて格闘した話
- 4. 【RSpec】Railsチュートリアル第6版 第14章
- 5. 【Rails/carrierwave】画像データをsubmitしたらバリデーションエラーになった話
- 6. デフォルト引数は意図がわかるように使いたい
- 7. Rakeタスクのメソッドと定数はどこに定義するか
- 8. Rails6 LINEログインとプッシュ通知
- 9. 【rubyでcomet2を作る】①概要
- 10. Fakerを導入
- 11. rails formタグについて調べてみた
- 12. 【RSpec】例外処理が発生することをテストしたいときに気をつけること
- 13. 【Rails】例外処理raise
- 14. 【初心者向け】Railsのビューでエラーが表示されない・レイアウトが崩れる
- 15. FactoryBotを導入
- 16. to_i(num)がつまづいた件
- 17. rationalizeメソッドとto_rメソッドの違い
- 18. Railsで子モデルの所有数ランキングを取得するスコープの書き方
- 19. gem ‘date’のReDos脆弱性についての内容と対応の注意点 [CVE-2021-41817]
- 20. 【Rails】seedファイルについて
Ruby 3.1.0 preview 1でTypeProf for IDEを試してみた
先日Ruby 3.1.0 Preview 1がリリースされました。
https://www.ruby-lang.org/en/news/2021/11/09/ruby-3-1-0-preview1-released/
先日のRubyKaigi Takeout 2021のKeynoteで発表があったようにRuby 3.1からTypeProfの Experimental IDE supportが実装されています。
https://rubykaigi.org/2021-takeout/presentations/mametter.html
面白そうだったのでちょっと触ってみて、「Rubyで静的型付けを使った現代的な開発体験」を体験してみました。
## 準備
“`bash
$ brew upgrade && brew upgrade rbenv ruby-build
$ rbenv install –list-all | grep 3.1.0
3.1.0-dev
3.1.0-preview1
jruby-9.3.1.0
rbx-3.100$ rbenv install 3.
Ruby で解く AtCoder ABC 227 D
# はじめに
*[AtCoder Problems](https://kenkoooo.com/atcoder/#/)* の Recommendation を利用して、過去の問題を解いています。
AtCoder さん、AtCoder Problems さん、ありがとうございます。# 今回のお題
*[AtCoder Beginner Contest D – Project Planning](https://atcoder.jp/contests/abc227/tasks/abc227_d)*
Difficulty: 1643今回のテーマ、二分探索 + 鳩ノ巣原理
青レートは難しいですが、解いてみました。
# Ruby
“`ruby
n, k = gets.split.map(&:to_i)
a = gets.split.map(&:to_i).sort
b =[0]
n.times do |i|
b[i + 1] = b[i] + a[i]
end
ans = (0..).bsearch do |x|
c = a.
Pryのlsを使うと謎の^A^B^A^Bとかが表示されて格闘した話
## pryを0.14.1に更新したらなんかls機能が正しく動いてない
shellのlsではなく、pryのlsの話です
最後に付け加えていますが、0.14.1だからバグるという話ではないみたいです
## 問題の現象
“`ruby
pry> ls ActiveRecord::Base
“`pryでページングが必要になるような長いリストを出力されるようなものをlsすると下の画像のような文字化けを起こす
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39804/b6606a0f-dee3-5394-e416-9f62566855f7.png)
## 解決方法
“`bash
export PAGER=” less –raw-control-chars -F -X”
“`– 環境変数PAGERにlessをオプション付きで設定する
– lessの直前にある**スペースが とても とても 重要**[pry/pry Non-Visible Characters P
【RSpec】Railsチュートリアル第6版 第14章
#はじめに
Railsチュートリアル第6版のテストをRSpecで書き直していく。###目次
– [第3章](https://qiita.com/supyolo888/items/35081ead2cfafb40a995)
– [第4章](https://qiita.com/supyolo888/items/939b670b62eb18467f6d)
– [第5章](https://qiita.com/supyolo888/items/42234ac2ed3919b14586)
– [第6章](https://qiita.com/supyolo888/items/bd10e64c77fe391cf203)
– [第7章](https://qiita.com/supyolo888/items/d2824ced26402b5f58d1)
– [第8章](https://qiita.com/supyolo888/items/508caaa40edf307093ed)
– [第9章](https://qiita.com/supyolo888/items/62e471b07a0c9a81575
【Rails/carrierwave】画像データをsubmitしたらバリデーションエラーになった話
##やりたかったこと##
ユーザが画像を投稿する際に、投稿確認画面で内容確認後、画像投稿を完了させる。##実行環境##
ruby 3.0.1
Rails 6.0.4.1**使用gem:**
carrierwave
pry-rails (デバッグで使用のため)##問題##
①確認画面(confirm view)から投稿ボタン(form_submit)を押すと、バリデーションエラーが発生する
②モデルに設定したバリデーションを解除し、再投稿したらNil location provided. Can’t build URI.が発生する
![4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2259269/5f93d55f-bbb4-a6a4-ac49-582f527ab862.png)##問題の発生理由##
**new viewからconfirm viewにページが移る際に画像のデータが渡されずに消えてしまう。**
①は確認画面に移る際にユーザーから渡された画像データがロストしてるため、画像デ
デフォルト引数は意図がわかるように使いたい
コードレビューをしていて、使わないのにデフォルト引数を実装しているのを指摘することが多いです。
今後引数に渡し忘れてもいいように実装しているのかもしれないが、渡し忘れても動作するのはリスクが高いと思っています。
デフォルト設定を採用する場合、どうして採用したかがわかるような使い方がいいと感じたため、例を残しておきます。
(Rubyに関わらず当てはまると思うが、Rubyだと意識している人が少ないのかもしれないです。)## 悪い例
この例では、arg2を引数に渡さないパターンが存在せず、今後の実装でarg2を渡し忘れた場合もエラーにならないため、
意図しない挙動をしても検知しにくくなってしまっています。“`ruby
def do_something(arg1, arg2 = 0)
arg1 + arg2
end# arg2が未設定で使用するパターンが存在しない
do_something(1, 2)
do_something(2, 3)
“`## 良い例
この例では、arg2を使用しないパターンが存在しているため、
基本的にはarg1だけを渡す形で使用し、arg2
Rakeタスクのメソッドと定数はどこに定義するか
##経緯
Rakeタスクの中でメソッドと定数を定義していたためリファクタリングしたかったときに参考記事が少なかったため独自で調べたこととその方法について書こうと思います。
“`ruby.rake
namespace :XXXXX do
task YYYYY: :environment do
#リファクタリングしたい定数の集団
CONSTANT1 = hogehoge.freeze
CONSTANT2 = hogefuga.freeze
CONSTANT3 = fugafuga.freeze
CONSTANT4 = fugahoge.freeze################
# rakeタスク処理 #
################
end#リファクタリングしたいメソッドの集団
privatedef method1(arg)
…
enddef method2(arg)
…
enddef method3(arg1, arg2)
Rails6 LINEログインとプッシュ通知
# 作るもの
LINEログインを利用し、アプリ上で登録したタスクを期限の日に通知をしてくれる簡単なLINEbot。
ちょこっといじくると期限の前日などに通知がくるようにもできます。
かなり雑な記事なのでわかりにくいところや間違いがあればなんでも言ってください!![スクリーンショット 2021-11-18 18.39.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674324/49f3663b-6d5d-2bb2-d89f-6d801915dd2a.png)
![スクリーンショット 2021-11-18 18.41.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674324/2253b851-0a01-82c0-eb8d-b6af50370b95.png)
# 環境
– Ruby
– Ruby on Rails 6
– Heroku
– LINE Developers(LINE Messaging
【rubyでcomet2を作る】①概要
### はじめに
未経験からWebエンジニアを目指した際に基本情報技術者試験を受験しました。その際にCPUの機能や5大装置の関係性を学びましたが、なんとなく暗記しただけで実際には、あまりイメージ出来ていなかったと思います。就職活動も終わり、勤務開始まで少し時間がありましたので、改めて学習をしてみたいと思いました。
現在は [放送大学の講義](https://v.ouj.ac.jp/view/ouj/#/navi/vod?ca=807)を参考にインプットを行なっています。アウトプットとrubyの学習のために擬似環境を作ってみたいと思います。rubyという高水準言語を用いて、低水準言語であるアセンブラを表現することは逆行的ですが、先にrubyやJAVAなどの学習を行なった人の理解の手助けになれば嬉しいです。
(rubyもコンピュータの基本動作についても初心者のため、誤った内容があればぜひご教授いただきたいです)### 目次(現在1.まで執筆済み)
1. 概要(COMET2の概念をまとめる)
1. CPUオブジェクト、メモリオブジェクトを定義する1
1. CPUオブジェクト、メモリオ
Fakerを導入
#①.Fakerフェイカー
ランダムな値を生成するGemです!
メールアドレス、人名、パスワードなど、さまざまな意図に応じたランダムな値を生成してくれます!
ここまでで、FactoryBotやbeforeをつかって、テストコードをスッキリとまとめることができました!
しかし、もう1つ対応しなければならないことがあります!
FactoryBotで設定した値は、’test@example’など固有のものでした!
しかし、これから複数のテストを行う際に、「すでにemailの重複したインスタンスが存在する」といったような意図しない形で弾かれてしまうことがあります!
beforeでインスタンスを生成する都度、値をランダムで生成したいところです!
その際に役立つものがFakerです!
#②.Fakerを導入
#Gemfileを編集
Gemfileに以下の様に追記します!
今回はFakerをテストコードのために使用するので、これまで同様group :development, :test doの中に記述します!
“`php:Gemfile
group :developme
rails formタグについて調べてみた
## formタグににいて
button要素のタイプ指定
– `submit`は、ボタンをクリックするとフォームのデータを`
【RSpec】例外処理が発生することをテストしたいときに気をつけること
例外処理が発生することをテストするときは“`()“`ではなく
ブロック“`{}“`で捉える“`ruby
expect{ instance.method }.to raise_error(RuntimeError)
“`##参考
https://qiita.com/jiz/items/0cd302bb16ce55d231cb
【Rails】例外処理raise
##環境
Ruby 3.0.2
Rails 6.1.4.1引数にメッセージのみ指定すると初期値のRuntimeErrorが発生する
“`ruby
raise ‘error message’
“`第1引数に例外クラス、第2引数にエラメッセージを指定できる
“`ruby
raise NoMethodError, ‘error message’
“`##参考
https://mgmmy.hatenablog.com/entry/2019/12/01/232019
【初心者向け】Railsのビューでエラーが表示されない・レイアウトが崩れる
###■環境
・Windows10(64bit)
・Ruby 2.7.4
・Rails 5.2.6
・devise 4.8.0
###■Railsのビューでエラーが表示されない
####状況
Railsアプリケーションにgem「devise」をインストールし、ビューは「users」ディレクトリ内に格納するようにした。
(デフォルトの app\views\devise ではなく app\views\users に)
そして、ビューのフォームを「form_for」から「form_with」に書き換えるなどカスタマイズした後から、ユーザ情報更新時などにビューでエラーメッセージが何も表示されなくなった。
####原因
1)「form_with」内に「local: true」を追加していなかった。
2)renderメソッドでのリソース指定を修正していなかった。
####対処
1)local: trueの追加“`app\views\users\registrations\edit.html.erb
#修正前
<%= form_with(model: resource, scope: reso
FactoryBotを導入
#①.FactoryBot
インスタンスをまとめることができるGemです!
他のファイルであらかじめ各クラスのインスタンスに定める値を設定しておき、各テストコードで使用します!
FactoryBotはGemとして提供されています!
Gemの導入を行います!
#Gemfileを編集
Gemfileを以下のように編集します!
この時も、group :development, :test doの中に記述するように注意してください!
“`php:Gemfile
group :development, :test do
# Call ‘byebug’ anywhere in the code to stop execution and get a debugger console
gem ‘byebug’, platforms: [:mri, :mingw, :x64_mingw]
gem ‘rspec-rails’, ‘~> 4.0.0’
gem ‘factory_bot_rails’
end
“`記述後にbundle installを実行します!
`
to_i(num)がつまづいた件
RubySilverの勉強中疑問に思ったことがあったので備忘録として記していきます。
##to_s と to_i 使い方
to_s => 数値を文字列に変換
to_i => 文字列を数値に変換“`ruby:例
n = 8
puts n.to_s #文字列に変換
# => 8n = “8”
puts “8”.to_i # 数値に変換
# => 8
“`##to_s と to_i に引数を設定
to_s と to_i に引数を設定することで基数を変えることができます。
to_s にも使えることは少し驚きでした。
下記の1つ目の例を解説すると
**10進数**の8を**2進数**で表すという処理を行っています。2つ目は**2進数**の8を**10進数**で表すという処理を行っています。
2進数は0と1で表すので無視されます。よって、0が出力されます。3つ目は**2進数**の100を**10進数**で表すという処理を行っています。
ここで100は百ではなく100という文字列であることに注意してください“`ruby:例
n = 8
puts n.to_s(2)
rationalizeメソッドとto_rメソッドの違い
# はじめに
rationalizeメソッドとto_rメソッド、どちらもレシーバーを有理数に変換したものを返してくれる「同じ」メソッドだと勘違いしてました。(sizeメソッドとlengthメソッドみたいな)
そんな私が、rubyコミュニティーの強い人たちに質問して得た知識をまとめます。
## to_rメソッドとrationalizeメソッドとは
レシーバーを有理数に変換します。同じ結果が取得できる時もあります“`
a = 0.25a.to_r ==>(1/4)
a.rationalize ==>(1/4)
“`しかし
“`
b = 0.1b.to_r ==>(3602879701896397/36028797018963968)
b.rationalize ==>(1/10)
“`
というふうに結果が異なる時もあります。– to_rメソッド
https://docs.ruby-lang.org/ja/latest/method/Float/i/to_r.html
– rationalizeメソッド
https:/
Railsで子モデルの所有数ランキングを取得するスコープの書き方
個人開発で必要になったのですが、どこにも書いておらず調べるのが大変だったので残しておきます。
“`ruby:app/model/parent.rb
class Parent < ApplicationRecord has_many :children, dependent: :destroy scope :how_many_children, -> { joins(:children).group(“parent.name”).order(count_all: :desc).limit(3).count }
# => {“親名”=>子テーブル所有数(一位), “親名”=>子テーブル所有数(二位), “親名”=>子テーブル所有数(三位)}
end
“`今思えば[これ(Railsガイド)](https://railsguides.jp/active_record_querying.html#%E3%82%B0%E3%83%AB%E3%83%BC%E3%83%97%E5%8C%96%E3%81%95%E3%82%8C%E3%81%9F%E9%A0%85%E7%9B%AE
gem ‘date’のReDos脆弱性についての内容と対応の注意点 [CVE-2021-41817]
# 脆弱性の内容
`Date.parse`は、内部でRegexpsを使用しており、その一部は正規表現のサービス拒否に対して脆弱です。
このようなメソッドを信頼できない入力に適用するアプリケーションとライブラリが影響を受ける可能性があります。## 脆弱性に対する修正内容
この修正により、正規表現を変更する代わりにデフォルトで入力長が最大128バイトに制限されます。
これは、’date’ gemが多くの正規表現を使用しており未発見の脆弱な正規表現がまだ存在する可能性があるためです。
互換性を維持するには次のようにlimitキーワードに明示的にnilを渡すことで制限を取り除くことができますが解析に時間がかかる場合があることに注意してください。“`ruby
Date.parse(str, limit: nil)
“`
# 脆弱性への対応日付gemをバージョン3.2.1、3.1.2、3.0.2、および2.0.1以降に更新してください。
`gem update date`コマンドを実行して更新することができます。
bundlerを使用している場合は、Gemfileに以下を追加し
【Rails】seedファイルについて
## はじめに
今回Railsのアプリを作成中に多くのユーザー情報が必要となったことをきっかけに、
seedファイルを使用したので、備忘録です。
今回はuserの作成をします。devise導入済み。## seedファイルとは
開発を進めていく中で、データを一件一件登録することはとてもめんどくさいですよね。
そのようなときにseedファイルを作成することで、初期データが作成できます。
大量なユーザー情報等を一気に作成することができるので、とても便利です。## 導入してみる
簡単なものであれば特別なことは必要なく、ファイルに記述するのみです。
単体であれば“`db/seeds.rb
User.create!(
email: “test@test.com”,
name: “test1”,
passward: “111111”
)
“`
複数であれば“`db/seeds.rb
10.times do |n|
User.create!(
email: “test#{n + 1}@test.com”,
name: “test#{n + 1