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

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

each_with_indexを使用したプログラムを作成する問題

## 問題

以下の配列から任意の数字を探して何番目に含まれているかという結果を返すsearchメソッドを、`each_with_index`
を用いて作成するという問題。

“`
input = [3, 5, 9 ,12, 15, 21, 29, 35, 42, 51, 62, 78, 81, 87, 92, 93]
“`

**出力例**

search(5, input) → 2番目にあります

search(12, input) → 4番目にあります

search(7, input) → その数は含まれていません

まず、`each_with_index`がわからないので理解します。

### each_with_indexメソッドとは

“`ruby
配列名.each_with_index do |item, i|

end
“`

“`ruby
fruits = [“メロン”, “バナナ”, “アップル”]

fruits.each_with_index do |item, i|
puts “#{i}番目のフルーツは、#{item}です。”
end

元記事を表示

YAML unsafe_load + freeze で FrozenError が出た

## おおむね……

https://secret-garden.hatenablog.com/entry/2021/05/23/200803

この記事の追試みたいなものです.

## Psych 3.x

再帰な定義をしてみた.

“`ruby
> require ‘yaml’
=> true

” YAML.load(<<~EOL) " a: &a " b: " <<: *a > EOL
=> {“a”=>{“b”=>{}}}

” YAML.load(<<~EOL, freeze: true) " a: &a " b: " <<: *a > EOL
FrozenError: can’t modify frozen Hash: {}
from psych-3.3.2/lib/psych/visitors/to_ruby.rb:375:in `block in revive_hash’
“`

元記事を表示

RailsアプリケーションをRuby3.0系にあげるために苦労したこと3選

現在Qiitaでは [graphql-rubyアップデートで引っかかった点(1.8->1.12) – Qiita](https://qiita.com/WakameSun/items/eab39302b9580b51b7a2) でも触れた通り、Ruby3.0へのアップデートを進めています。
基本的に自分1人がエイヤエイヤと進めて、ほぼほぼ動く(Rspecは全部通ったが、まだ実際に動かす検証が足りない状態)のものが完成しておりどんなに遅くなっても1月末には出せるだろうという状態です。
そこで、早計ではありますがここに苦労したよという部分を何個か選んで書いてみることにしました。
もしかしたら、今後何かにはまって増えるかもしれません。

## 1. 破壊的変更に付いていけず放置されたGem対応
若干主旨からは外れそうな気もしますが、一番苦労したのはこれです。
基本的にはDependabotなどにより可能な限り新しい状態を保とうとしていますが、 **破壊的変更多すぎ!今は余裕ないから後で!** 放置されてしまうGemや、そもそもDependabotが作るPR数を絞っているとなかなかPRが作られ

元記事を表示

IRBの補完にRBSを組み合わせてみる

カタカタッ ターンッ! RubyのIRBめっちゃ便利ですよね。
IRBは補完機能もすごく便利なんですが、ちょっと気になるところもあります。
– メソッドチェーンすると正しく補完できずありとあらゆるメソッド名が候補に出てしまう
– 正規表現で実装されてるので時々誤作動を起こす
– `array[i].` `%s[symbol].` 配列のメソッドが候補に出る
– `array.map{}.` `%w{words}.` HashとProcのメソッドが候補に出る

なので、型情報(RBS)とかも使ってもうちょっといい補完候補を出せないかなと 、gem `katakata_irb` を試しに作っています。

https://github.com/tompng/katakata_irb

gemをインストールすると`kirb`コマンドが使えるようになります。
メソッドチェーンしてても、ブロック引数・変数などを使ってても、ある程度正しく型を推測して補完候補を出せたり出せなかったりします。

![katakata0.png](https://qiita-image-store.s3.ap-n

元記事を表示

ransack使用時の注意点

# はじめに

ransackは検索機能を楽に実装することができるgemです。
https://github.com/activerecord-hackery/ransack

スター数は執筆時現在5.3kで、今なお開発が続けられており、人気のgemと言って差し支えないでしょう。
しかし、そのセキュリティ上の問題点についてはあまり注目されていないように感じます。
実際、執筆時現在Googleで「ransack」と検索するとセキュリティについて触れられていない記事が散見されます。
この記事ではransackのセキュリティ上の問題点とその対策について紹介します。

# セキュリティ上の問題点

**デフォルトで任意のカラムに対して検索ができてしまいます。**[^1]
後述の手順によってカラムの中身を特定可能です。

## 具体例

usersテーブルにはカラムsecret_tokenが存在するとします。
以下のような実装で、後述する対策をしていない場合に情報漏洩が起きます。

“`ruby
class UsersController
# GET /users
def index

元記事を表示

Ruby on RailsでCloud Spannerエミュレータを使ってみる

[PONOS Advent Calendar 2022](https://qiita.com/advent-calendar/2022/ponos) の20日目の記事です。
昨日は@tequila0725さんの[BitbucketでPR作成時に表示されるコミットメッセージリストをPR説明テンプレート有りでも表示する](https://qiita.com/tequila0725/items/2074958ee693dc58bac6)でした。

# はじめに

Cloud Spannerは計画的ダウンタイムがなく、無制限のスケーリングなど、他のデータベースにはない特徴を持ったデータベースです。

https://cloud.google.com/spanner?hl=ja

標準のActiveRecordはSpannerには対応していませんが、Googleからactiverecord-spanner-adapterが提供されていますので、そのGemを使って「Ruby on Rails」 + 「Cloud Spanner」の開発することできます。
この記事では、Cloud Spannerエミ

元記事を表示

APIの負荷試験でNew RelicのAPMを活用する

## はじめに
この記事は[New Relic Advent Calendar 2022](https://qiita.com/advent-calendar/2022/newrelic)の20日目の記事となります。

Rubyで構築されたAPIのパフォーマンスチューニングに挑んでいる者です。
先日負荷試験を実施し、試験結果の分析にNew RelicのAPMを活用するためにNew Relicさんと面会させていただきました。
そこで教えていただいたことや学んだことをこの記事にて共有します。

### 対象者
– これからNew Relicを使い始めようと思っている人
– New Relicを使ってサーバーサイドの処理を見たい人
– サーバーサイドのパフォーマンスチューニングにNew Relicを活用したい人

## Distributed Tracing
各項目を説明していきます。
### Trace groups
– trace_duration
– レスポンスタイム
– span
– DBへのクエリ実行・他サービスの呼び出し・関数の呼び出しをおこなった回数
– 多すぎる場

元記事を表示

App Store Connectの審査情報をキャッチして通知する仕組み

こんにちは。[CYBIRD Advent Calendar 2022](https://qiita.com/advent-calendar/2022/cybird)、20日目担当の@yuki_utsumiです。
普段は品質管理部エンジニアとして業務の自動化などをしています。
アドベントカレンダー19日目の記事は@namikoroさんの[「現場エンジニアが担当するカジュアル面談のいろは」](https://qiita.com/namikoro/items/786bf0f65cf8494c81aa)でした。私もカジュアル面談の際はかな〜り参考にさせてもらいました。ぜひ読んでみてください。

今回は、私が社内で運用しているApp Store Connectの情報を取得してくる仕組みについて紹介します。

# どんな仕組み?
現在、社内ではAppleアプリの審査内容に変更があると、その内容がslackに通知されるbotを運用しています。
![スクリーンショット 2022-12-12 2.34.22.png](https://qiita-image-store.s3.ap-northeast-

元記事を表示

Stimulus リファレンス: アクション

:::note
この記事は[Google翻訳](https://translate.google.co.jp/)の結果を編集したものです。
:::

https://stimulus.hotwired.dev/reference/actions

アクションはコントローラーでDOMイベントを処理する方法です。

“`html

元記事を表示

ActiveRecordを継承しなくたって動的でネストしたフォームオブジェクトを使いたい!

この記事は[エムスリーキャリア FY22 AdventCalendar](https://qiita.com/advent-calendar/2022/m3c)20日目の記事です。

# はじめに
突然ですが、RailsエンジニアをしているとActiveRecordモデルを継承しないフォームオブジェクトで一対多、しかも子要素をクライアント上で動的に追加・削除するようなフォームを実装したい時もあるかと思います(あるのかな?)
調べてみた所そのような事例が見当たらなかったので(やっぱりなさそう)、自分が見つけた実装方法を記事に残したいと思います。

# 要件
1. クライアント(ブラウザ上)で子要素となるフォーム部分を動的に追加削除できること。
2. フォームオブジェクトはActiveRecordのモデルを継承しないこと。
3. バリデーションをフォームオブジェクトで実施して、入力値がバリデーションに引っかかった場合は子要素ごとにバリデーションエラーのメッセージが表示できること。(子要素ごとに状態を保持できること)
4. フォームの登録時にコントローラーでストロングパラメーターを使用できる

元記事を表示

RubyKaigi 2022 セッション紹介「Method-based JIT compilation by transpiling to Julia」

## はじめに

RubyKaigi2022に初参加してきましたので、そのセッションの中で面白かった内容を紹介しようと思います。

今回紹介するのは、KentaMurata氏のメソッドベースのJust-In-Timeコンパイルへの新しいアプローチとして、RubyのインフラストラクチャにJulia言語を使用した背景と仕組み、特徴についてになります。

## スライドリンク

## 本題

現在Rubyでは数値計算が高速ではなく、Numo::NArrayやRed Arrowを使えば大きな数値計算が出来つつありますが、MJITやYJITが利用できてもあまり高速ではないという問題があるとのことでした。

理由として、これらのJITコンパイラがRubyの全てのセマンティクスを保持するためです。Rubyでは全てのメソッドが再定義可能で、再定義されたメソッドは直ちにコード実行に影響を与えます。例えば、以下のようなループの途中でも、inj

元記事を表示

rubyの検索問題 バイナリーリサーチ

# 問題
– 以下の配列に任意の値が存在するかどうか、そして何番目に存在するのか、検索するコードを作成する。

– 添字が0の要素、つまり以下の配列における「1」は「配列の0番目に存在する」と表現します。

~~~ruby
array=[1,3,5,6,9,10,13,20,26,31]
~~~

– 任意の値が配列内に存在しない場合は、「値は配列内に存在しません」と出力する。
– 存在する場合は、配列の何番目に存在するのか表示する。

検索にはバイナリーリサーチ(2分割検索)を使用して行う。

# 補足(バイナリーリサーチとは?)

ソート済みのリストや配列に入ったデータに対する
検索を行う時に用いられる手法のこと
まず中央の値を確認し、検索したい値との大小関係を用いて
検索したい値が中央の右にあるか左にあるかを判断する。
それを繰り返し、片側に存在しない事を確認しながら検索する方法。
![スクリーンショット 2022-12-19 21.30.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/292

元記事を表示

Ruby on Rails をcloud9上に環境構築してアプリケーションを立ち上げるまでの手引書

# Ruby on Rails とCloud9
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2388259/0e420644-1c9e-0259-8891-7961767d1d80.png)

Ruby on Rails は、RubyでWebサービスを簡単に開発するためのフレームワークです。

またAWSのCloud9(クラウドナイン)での開発というのは、ネット上のもう一つのパソコンでプログラミングをするようなイメージです。

Cloud9のメリットは複数人でプログラミングができるとか、サーバーさえあればどこでもプログラミングができるとかいろいろあります。

個人的に思ったメリットとして、環境構築がとても簡単に終わるので初心者の方にもおすすめです。

この記事ではクラウド9の環境を新たに作成するところから、Ruby on Rials の環境構築までの手順を簡潔にまとめましたので、細かい説明はいらないから手順だけ知りたいという方はご覧ください。

筆者は備忘録として使っていこうと思います

元記事を表示

【Rails6】formヘルパー内で、submitボタンにCSSをつけたい場合・button_tag要素を使ってtypeにsubmitを指定する場合

# やりたいこと
* font awesomeを利用して以下の表示4のようになボタンを設置したい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710373/362a96d9-3c83-e8a3-a1d3-4e441e48ad60.png)

# 困ったこと
* どうもうまく反映されない。以下それぞれすべてやってみたが、どれも正常にCSSが反映されなかったり、ちゃんと送信がされなかったり。
* <% f.submit>
* <%=button_tag>
* \

CSPをわかりやすく説明したい

## CSPとは

Content Security Policy の略。

CSPを用いることにより、ブラウザが読み込み可能なリソース(JavaScript, CSS, Imgなど)をホワイトリストで制限することができ、XSS攻撃 (Webアプリケーションにスクリプトを保存させ、該当するページを閲覧するたびに不正なスクリプトが実行されるなど) といった脆弱性に対する攻撃のを抑止することができます。

ホワイトリスト:許可リストのこと。逆にブラックリストとは禁止リストのこと。

## CSP が必要になったきっかけ

別ドメインの Webサイトに iframe として埋め込む際に、CSPの frame-ancestors というディレクティブで、埋め込み先のドメインを指定する必要がありました。

frame-ancestorsを指定しリリースしたもののコンソールに以下のエラーが返されていました。

“`ruby
Refused to load the script ‘https://www.googletagmanager.com/gtm.js?id=GTM-XXXXX…
bec

RubyonRailsチュートリアル:実践メモ【第三章】

Ruby on Rails チュートリアル(Webサービス開発が学べる学習サービス)に従って、MVCフレームワークアプリケーションを作成していく。

**使用ツール** :
AWS Cloud9
## コントローラの新規作成
コントローラの新規作成には、generateスクリプトを使用する。
“`
$ rails generate controller ControllerName アクション名(省略可)
“`
※rails generateはrails gという短縮形でもOK

Railsのアクションは、コントローラの中に配置する。

rails generate実行時にキャメルケースで記述を行うと、ファイルのコントローラ名がスネークケースで自動生成で登録される。
↓↓↓
**StaticPages** → **static_pages_controller.rb**

Rubynにはクラス名にキャメルケースを使う慣習と、ファイル名をスネークケースで記述する慣習がある。

参照:RubyonRailsチュートリアル

devise.rbで記述されている内容について

# はじめに

deviseを触ることになったのですが、この便利なgemが何をしているのかわからなかったため、設定ファイルの中(英文)を翻訳して何をしているのか書いてみました。
一部日本語におかしな点があると思いますが、これからdeviseを触る方がいましたら設定ファイルを眺めてみるのもよいかもしれません。

早速以下が内容となります。

# devise.rbの内容

このファイルを変更していなくても、各設定オプションはデフォルト値に設定されています。コメントアウトされているものとされていないものがあることに注意してください。コメントアウトされていない行は、アップグレードの際に設定が壊れないようにするためです(Deviseの将来のバージョンがこれらのオプションのデフォルト値を変更した場合)

このフックを使って、devise mailer や warden フックなどの設定を行ないます。
これらの設定オプションの多くは、あなたのモデルでそのまま設定することができます。

## config.secret_key
Deviseが使用するシークレットキーです。Deviseはこのキーを使っ

Web server one-liner by Ruby

# RubyによるWebサーバ・ワンライナー

“`shell
ruby -e “require ‘webrick’; WEBrick::HTTPServer.new({ DocumentRoot: ‘./’, BindAddress: ‘127.0.0.1’, Port: 8000 }).start”
“`

##### 参考にしたページ
– [【Ruby標準ライブラリ】WEBrickでWEBサーバーを作る手順 – shin>>media](https://shinmedia20.com/webrick-web-server)

rails_helper.rb に require ‘capybara/rails’ と require ‘capybara/rspec’ は書かなくていい

[capybara](https://github.com/teamcapybara/capybara) gem の README の [Setup](https://github.com/teamcapybara/capybara/blob/5c8674713fa964211de43138180edfab1cc041ce/README.md#setup) と [Using Capybara with RSpec](https://github.com/teamcapybara/capybara/blob/5c8674713fa964211de43138180edfab1cc041ce/README.md#using-capybara-with-rspec) の段落には次のように、`require ‘capybara/rails’` と `require ‘capybara/rspec’` を追記してねと書かれています。

> If the application that you are testing is a Rails app, add this line to your te