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

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

脆弱性から学ぶRubyの仕組み(CVE-2022-28739編)

# 脆弱性から学ぶRubyの仕組み(CVE-2022-28739編)
最近業務でRubyを使うようになったのだが、これまで業務で使ったことのない言語だったので日々言語仕様などを勉強している。
加えて、業務上の別件でセキュリティ周りも勉強しておきたく、良い機会なので「**脆弱性の側面からRubyの仕組みについて学ぶ**」という暴挙に出てみようと思う。

# Ruby
言わずとしれたプログラミング言語の一種。日本発の言語。
「`Ruby`ってなんぞ。石か?」という方は[Wikipedia](https://ja.wikipedia.org/wiki/Ruby)参照。

# 脆弱性
コンピュータ上のバグや仕様の不具合から生じる、**セキュリティ上の欠陥**の総称。
予期せぬ挙動のうち、セキュリティ的によろしくない挙動を起こすものとも言える?
いろんな書籍やWebサイトでいろんな説明がされているため、抽象的なニュアンスはなんとなくわかるような気がするが、どのように言語化すればより正確な説明になるのか未だにわからない。
[Wikipedia](https://ja.wikipedia.org/w

元記事を表示

[ActiveRecord]throughアソシエーションのjoinsとthroughを使わないアソシエーションのjoinsを同時にチェーンした場合、同じものと判定してくれないので注意

ActiveRecordには同じjoinsを何度チェーンしても1回しかJOINしないという便利機能が備わっています。
例えば下記のように同じjoinsを3回書いても、実際に発行されるSQLでは1回しかJOINされていません。
この機能は複雑なSQLを作る時にすでにJOINされているかを意識せずに実装できるのでとても便利です。

“`irb
irb(main):016:0> User.joins(:user_books).joins(:user_books).joins(:user_books)
User Load (9.6ms) SELECT `users`.* FROM `users` INNER JOIN `user_books` ON `user_books`.`user_id` = `users`.`id`
“`

次に多対多のモデルをJOINする場合を考えます。
下記のモデルではUserとBookは多対多の関係です。UserモデルにBookモデルをJOINする実装を考えます。

“`ruby
class User < ApplicationRecord has

元記事を表示

Rubyで配列文字列をパースしたかった話

## 概要
`”[{‘a’: 1}]”`みたいな配列の中にjsonが入っている文字列をパースしたかっただけのお話。

## きっかけ
日頃よくスクレイピングをしているんですけど、そのときに上記のような配列にデータが入っている事がありまして、パースするのに少し苦戦したので今後同じ悲しみを産まないために…

## だめだったやり方
僕はRubyの標準ライブラリを信じています。
だから今回もきっと`require ‘json’`くんがすべてを解決できると信じていた、そうあの日までは。。。

ぼく「よし、配列の文字列でデータ引っ張って来れたしこれを`JSON.parse`してっと…」
システム「`unexpected token at ”a’:1]’ (JSON::ParserError)`」
ぼく「Why???」

僕の信じていた`JSON.parse`は配列の中にjsonが入っているようなパターンは解析してくれませんでした。
まぁ、当たり前といえば当たり前なのかもですけど….

## できたやり方
いろいろ文献を漁ってみて
「Ruby 配列文字列 パース」とかで調べてもRu

元記事を表示

N+1問題を理解する

## N+1問題とは
N+1問題とは必要以上にクエリを発行することによりパフォーマンスを低下させてしまうことです。

例えば“`User : Post = 1 : 多“`の場合を考えます。
Railsで実行すると以下のようになります。
“`ruby
[16] pry(main)> users = User.all
User Load (1.3ms) SELECT “users”.* FROM “users”
[17] pry(main)> users.each do |user|
[17] pry(main)* puts user.posts
[17] pry(main)* end
#
#
Post Load (1.8ms) SELECT “posts”.* FROM “posts” WHERE “posts”.”user_id” = $1 [[“user_id”, 2]]
Po

元記事を表示

Ruby3.2で追加されるDataクラスのお話

## はじめに
この記事は [SmartHR Advent Calendar 2022](https://qiita.com/advent-calendar/2022/smarthr) の6日目の記事です。

この記事で説明するDataクラスは、**Ruby2.9まで存在し、Ruby3.0でなくなったDataクラスではなく、Ruby3.2で新たに導入される予定のDataクラスです。**
Ruby3.2は(おそらく)今月のクリスマス頃にリリースされます。
この記事では以下のバージョンのRubyを使用しています。
`ruby 3.2.0preview3 (2022-12-05) [arm64-darwin21]`

## 参考リンク
なるべく一次ソースに近い情報を見たい!という方は以下のリンクをご覧ください。

Ruby自体の開発におけるDataクラスのFeatureチケット
https://bugs.ruby-lang.org/issues/16122
Github上のPR
https://github.com/ruby/ruby/pull/6353
Ruby3.2.0.preview3

元記事を表示

Base64を実装して理解する

# Base64とは

あらゆるデータ:テキストデータ、バイナリデータ(画像、音声など)から**64文字**をを用いてエンコードする方式です。

“`
– [A-Z]: 26文字
– [a-z]: 26文字
– [0-9]: 10文字
– [+ /]: 2文字

ABCDEFGHIJKLMNOPQRSTUVWXYZ
abcdefghijklmnopqrstuvwxyz
0123456789
+/
“`
Base64が誕生した理由は上記以外の文字を扱うことの出来ない通信環境にて**マルチバイト文字(漢字など)**や**バイナリデータ**を扱うためです。**7ビットのデータしか扱うことの出来ない電子メール**にて広く利用されています。

バイナリデータなどをやりとりするには、文字列に変換する必要があるので、文字列を変換した時に**4文字**グループごとにまとめ、足りない部分は`=`で埋めるため、厳密に言えば`=`も含めて**65文字**が使用されています。

URLや正規表現の中でBase64を用いると`+`や`/`は特別な意味を持つので、`+`は`-`、`/`は`_`に変換する場合

元記事を表示

コメントアウト雑まとめ(HTML,CSS,JavaSprict,Ruby,Rails)

# はじめに
言語ごとのコメントアウトをその都度、ggることを卒業したいと思いました。
アウトプット兼備忘録として簡素にまとめます。

## HTML
“`index.html

“`
## CSS
“`.css

/* 記述内容 */

/*
改行記述パターン
*/
“`

## JavaScript
“`main.js

//記述内容

/*
改行
記述パターン
*/
//CSSと同じ

“`

## Ruby
“`main.rb
#記述内容

=begin

改行記述パターン

=end

#こっちでも
#大丈夫 個人的にこちらの方がすっきりしてよいと感じます。
“`
## Rails
“`main.html.erb
<%の直後に#を付ける。 <% コード %>であれば<%# コード %>
<%= コード %>であれば<%#= コード %>

私としてはHTMLで親しみのある

.erbでも、こちらでコメントアウトするのが好きだ

元記事を表示

こんなMR(PR)出しちゃダメなんだZ!!

# [転職して半年経ちました](#-転職して半年経ちました)

未経験からエンジニア転職して早くも半年が経ちました。
界隈では未経験転職から1年半〜経って転職ドラフトとかで年収アップしてる方が散見されてきましたが私は今の所、全くそんな兆しは見えません。

今回はそんな自分の恥を晒します。
今までに出してきたMR(マージリクエスト)で
先輩エンジニアの方々にご指摘を頂き、先輩の貴重なリソースを奪ってきた数々の
クソコードのうち、選りすぐりの指摘をランキング形式でお届けします!

ちなみにマージリクエスト(MR)やプルリクエスト(PR)というのは自分のコードを
実際に動いている本番環境やその手前のステージング環境に混ぜてもらう為に
権限を持ったエンジニアに確認してもらう事です。

とても大事な行為ですね!
Github使ってるかGitlab使ってるかで呼び方変わりますがやってることは変わりません。

しょーもない事でパイセン達の時間を割かないように是非この記事を反面教師にして気をつけてください!

では早速見ていきましょう!

## 第

元記事を表示

if,else練習問題

# 問題
Aさんは普段土日が休みの仕事に就いており、
休みの日は遅くまで寝ていたいと考えています。
そこでAさんのために「その日が遅くまで寝ていられるかどうか」
を判断する、sleep_inメソッドを実装しよう。

第一引数の値では「平日かどうか」
第二引数の値では「休暇かどうか」
をtrueまたはfalseを用いて以下のように表します。

第一引数がtrue(平日である)または、
第二引数がtrue(休暇である)の場合はtrue

第一引数がfalse(平日でない)または、
第二引数がtrue(休暇である)の場合はtrue

第一引数がtrue(平日である)または、
第二引数がfalse(休暇でない)の場合はfalse

第一引数がfalse(平日でない)または、
第二引数がfalse(休暇でない)の場合はtrue

#### 雛形
“`
def sleep_in(is_weekday, is_vacation)
# ここに条件式を実装する
end
“`

呼び出し例
sleep_in(false, false)
sleep_in(true, false) → false
s

元記事を表示

Railsアプリケーションの認証をdeviseからAuth0にリプレースした話

# はじめに
先日、弊社プロダクトのモチベーションクラウドのマイクロサービス化(認証基盤との接続)に成功しました!

今回は既存のRailsアプリケーションをマイクロサービス化するに当たってdeviseをリプレースした手順を記して、
是非みなさまのRailsアプリケーションのマイクロサービス化の助けになればと思います。

# deviseの削除
Railsのログイン機能といえばRailsチュートリアルにも出てくるdeviseを利用しているプロダクトが多いと思います。
https://github.com/heartcombo/devise

このdeviseはcookieで認証情報を保持して、都度認証を行っています。
そしてdeviseは幾つかヘルパーメソッドがあり、これらの置き換えがメインになると思います。
https://github.com/heartcombo/devise#controller-filters-and-helpers

まずはこのヘルパーメソッドが使われている箇所がないか?を確認して、それらの置き換えを検討しました。
その結果、主に大変だった以下3つの代替方法

元記事を表示

RubyでRot13問題

# 前提
ROT13は、暗号の一種です。
仮に文字列`test`を暗号化すると、13個先のアルファベットである`grfg`に変換されるものです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264678/ea7d5d7a-5701-764a-c4c0-da707d963a3b.png)

# ROT13をRubyで実装
最初ソースコードを書いた際は、ROT13の変換パターンをhashでまとめて、文章の頭文字だけが大文字という条件下だったため、下記のコードのように大文字の場合だけ`capitalize`を最後当てるようにしてました。

“`ruby
ALPHABET_HASH =
{“a”=>”n”,
“b”=>”o”,
“c”=>”p”,
“d”=>”q”,
“e”=>”r”,
“f”=>”s”,
“g”=>”t”,
“h”=>”u”,
“i”=>”v”,
“j”=>”w”,
“k”=>”x”,
“l”=>”y”,
“m”=>”

元記事を表示

graphql-rubyを2.0.14より前のバージョンでinstallしている場合、validate_max_errorsを設定しよう!

バージョン2.0.14から`rails generate graphql:install`した時に生成される`app_schema.rb`に`validate_max_errors(100)`が追加されるようになりました。

下記がその時のCHANGELOGです。
![スクリーンショット 2022-11-24 22.34.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83424/2b413c02-dc47-8ec4-0af9-43236cd364c6.png)
関連する差分は下記です。[[プルリク](https://github.com/rmosolgo/graphql-ruby/pull/4179/files#diff-d3a195a6075da040bb95d191bce5ec24d2d26b24949e858ce09d1c3754e59e60R28)]

“`diff:lib/generators/graphql/templates/schema.erb
+
+ # Stop valid

元記事を表示

飲食店検索サイトの情報をとってきてみよう -GoogleMap編-

## 概要

久々にスクレイピングで情報を取得するスクリプトを組みたくなったので組む

## 言語
– ruby

## 使うライブラリ
– nokogiri
– selenium-webdriver

nokogiriはHTMLをパースする上では欠かせない子です。
GoogleMapはJSゴリゴリに動いていて通信取得が厳しいのでseleniumをつかいます。

## 本題

seleniumの準備に関しては今回はしてあるものとして話をすすめます。

これで準備ができたので実際のrubyのコードを書いてみましょう。

ファイル名は何でもいいのですが、crawler.rbとかにしましょうか

“`rb
require ‘net/http’
require ‘uri’
require ‘nokogiri’
require ‘kconv’
require ‘selenium-webdriver’

driver = Selenium::WebDriver.for :chrome

area = ‘横浜’
keyword = ‘たこ焼き’
driver.navigate.to “https:

元記事を表示

ActiveRecordにおけるattributeの参照

## そもそもActiveRecordとは
Railsが使っているORマッパーです。
これによって、RailsのモデルクラスとDBのテーブルが結び付けられます。
Railsアプリケーション内ではSQL文を書く必要はなく、ActiveRecordに則った書き方をすればいい感じにSQL文が発行されます。

## instance.attributeの形でなぜ参照することができるのか?
例えばfirst_name, last_name, email, password, age属性を持つUserクラスがあるとすると, Railsでは下記のように簡単にattributeを参照することができます。

“`.rb
user = User.last
user.first_name # <= これ user.email # <= これ user.password # <= これ ``` なぜActiveRecordでは、このような参照の仕方ができるのでしょうか。 => ActiveRecordがいい感じにattributeの値を返すインスタンスメソッドを自動で定義して

元記事を表示

【超簡単】Rails 公開・非公開投稿 実装方法

# はじめに
Twitterライクのようなアプリを作成してみたが、投稿を公開・非公開できるようにしたい・・・!という人に向けて執筆します!

# 完成形
下記の写真のように、公開非公開ボタンを作成し、公開を押して投稿すると全員にその投稿が表示され、非公開を押して投稿すると全体には表示されないが、マイページに自分だけが見れる投稿が作成される仕組みを作ります!

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1081227/5130136f-2606-005c-a98a-9632b959b850.png)

# 公開か非公開かを判定するためのカラムを追加しよう!
“`ターミナル
rails g migration AddreleaseToテーブル名 release:integer
“`

“`ターミナル
rails db:migrate
“`
該当するコントローラーの最後の方の行にparams〜とあると思います!
そこに,:releaseをつけたそう!
“`rb:コントローラー

元記事を表示

iTerm2のサーバーログにあるRailsのファイルパスをクリックした時にRubyMineで開けるように設定する

# 概要
Ruby on Railsで開発する時、エラーが発生したらターミナルにエラーの原因の場所をちゃんと出力してくれます。
そういう時には、ファイルパスをCommand+クリックして、RubyMineでファイルが開けるようになれば便利ですね。

![スクリーンショット 2022-12-04 22.58.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35605/3122c5be-925c-a0f8-2703-236120adeb6f.png)

# 設定方法

`iTerm2 の Preferences > Profiles > Advanced > Semantic History >
Run Command`の右のフィールドに
“`
/Applications/RubyMine.app/Contents/MacOS/rubymine \5 –line \2 \1
“`
を入れる。

![スクリーンショット 2022-12-04 22.51.18.png](https://qiita-

元記事を表示

Rubyの組み込みライブラリのみを使用してWebサーバーを自作する

# はじめに

本記事では、gemなどを一切使わず、Rubyの組み込みライブラリのみを使用して、Webサーバーを自作します。
この記事の内容は下記の「Webサーバーを作りながら学ぶ 基礎からのWebアプリケーション開発入門」を参考にしています。
この書籍自体は、Javaで書かれていますが、どの言語にも通じる根本の部分が分かりやすく書かれているのでとてもおすすめです。

https://www.amazon.co.jp/Web%E3%82%B5%E3%83%BC%E3%83%90%E3%82%92%E4%BD%9C%E3%82%8A%E3%81%AA%E3%81%8C%E3%82%89%E5%AD%A6%E3%81%B6-%E5%9F%BA%E7%A4%8E%E3%81%8B%E3%82%89%E3%81%AEWeb%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E9%96%8B%E7%99%BA%E5%85%A5%E9%96%80-Software-Design-plus/dp/47741

元記事を表示

gem install mecab を実行する時に「fatal error: ‘mecab.h’ file not found」エラーの対処

# 概要
M1 MaxのMacBookを買ってから環境構築をした時、`bundle install`を実行したら`mecab_wrap.cpp:1855:10: fatal error: ‘mecab.h’ file not found`エラーが出ました。今まではずっとIntelチップのMacを使っていたが、このエラーはありませんでした。

– Mac OS X Ventura
– ruby 3.1.3p185 (rbenv)
– mecab of 0.996 (homebrewによるインストール済み)

# 解決策
“`
gem i mecab — –with-cppflags=-I/opt/homebrew/Cellar/mecab/0.996/include
“`

元記事を表示

[Ruby] ハッシュでぼっち演算子が使いたい

変数にオブジェクトまたは nil が入ってる場合、ぼっち演算子(Safe Navigation Operator)を使うと安全にメソッドを呼び出せます。

“`ruby
irb(main):017:0> str = “abc”
irb(main):018:0> str.size
=> 3
irb(main):019:0> str = nil
irb(main):020:0> str.size
Traceback (most recent call last):
4: from /usr/bin/irb:23:in `


3: from /usr/bin/irb:23:in `load’
2: from /usr/lib/ruby/gems/2.7.0/gems/irb-1.2.1/exe/irb:11:in `
1: from (irb):20
NoMethodError (undefined method `size’ for nil:NilClass)
irb(main)

元記事を表示

RedAmber – Rubyのデータフレームライブラリ

Rubyアドベントカレンダー2022の4日目の記事です。

https://qiita.com/advent-calendar/2022/ruby

鈴木弘一(@heronshoes)と申します。
Rubyの新しいデータフレームライブラリであるRedAmberをご紹介します。

https://github.com/heronshoes/red_amber

RedAmberとは、Rubyでデータフレームを扱うためのライブラリです。
とってもざっくりいうと、Pythonにおけるpandas、Rにおけるdata.frame, dplyr/tidyrがやるようなことをRubyでできるようにするライブラリです。

[2022年度Rubyアソシエーション開発助成](https://www.ruby.or.jp/ja/news/20221027)に採択されたプロジェクトとして開発を進めています。

## RedAmberのデータフレームとは

RedAmberでは次のようなものをデータフレームと決めています。

– **同じ型**のデータを1次元に並べたものを、**Vector**と呼ぶ。

元記事を表示

OTHERカテゴリの最新記事