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

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

Ruby 正規表現「先読み」

正規表現で「先読み」というものについて最近知ったので自分の言葉でまとめてみようと思う。

## Onigmoとは

Ruby2.0以降では[Onigmo](https://github.com/k-takata/Onigmo)という正規表現エンジンが使用されています。
Onigmoは[鬼車](https://github.com/kkos/oniguruma)のフォークバージョンであり、鬼車はRubyのバージョン1.9やバージョン5以降のPHPの正規表現エンジンとして採用されています。

## ?= 先読み Look-ahead

「先を読む」とはなんだろう。
「look ahead」には「先のことを考える」「将来に備える」という意味がある。

先読みの正規表現とは、“`A(?=B)“`のようにかき、以下のようにマッチします。

“`ruby:Ruby
p “When we look at global environmental issues, we have to look ahead to the future”.scan(/look (?=ahead)/)
#=>[“lo

元記事を表示

Railsのバージョンアップ時にCSRFトークンに悩まされた話

Railsを使用していると、普段何気なく運用しているCSRFという仕組み。
このCSRFについて、Railsのバージョンアップ時に苦戦した経緯がありましたのでシェアしたいと思います。
そもそもCSRFとは?という方については、下記に分かりやすく解説してくれている記事がありますのでそちらを参考にして頂ければと思います。
[RailsのCSRF対策について](https://qiita.com/eshow/items/915f8e8ad317aa8e49a6)

### Railsのバージョンによって生成されるCSRFトークンが異なる
今回のバージョンアップではRailsを6.1→7.0に上げたのですが、この旧バージョンと新バージョンで生成されるCSRFトークンが異なります。どのような違いかというと、旧バージョンでは通常のBase64でトークンがエンコードされるのに対し、新バージョンではURLセーフなBase64でエンコードするようになりました。
そしてこのトークンが異なる状態で、ページ遷移するとArgumentErrorを引き起こします。(この時は旧バージョンから新バージョン、新バージョ

元記事を表示

RubyのHashでキーと値を入れ替える

# 組み込みメソッド invert を使う
キーと値を入れ替えた新しいハッシュを作成して返す。
元のハッシュで値が重複していた場合、最後に定義されている値のみ残る。
“`ruby
hash1 = {main: “hamburger”, side: “potato”, drink: “cola”}
hash1.invert
#=> {“hamburger”=>:main, “potato”=>:side, “cola”=>:drink}

hash2 = {main: “hamburger”, side: “hamburger”, drink: “cola”}
hash2.invert
#=> {“hamburger”=>:side, “cola”=>:drink}
“`

詳しくはこちら
https://docs.ruby-lang.org/ja/latest/method/Hash/i/invert.html

# invert を使わない方法
あまり需要はないかもしれないが、`Hash#each_with_object` でも表現できる。

“`ruby
hash.each

元記事を表示

vimからdocker-compose上のrspecを実行する

# 結論

`Vim`で開いている`rspec`ファイルのカーソル位置にあるテストを、自分の開発環境の`docker compose`上の`rspec`で、気軽に実行出来る様にしました。

– 結果は[vim-dispatch](https://github.com/tpope/vim-dispatch)を使って`quickfix`に表示。
– あとは温かみのある手作り。
– `rspec`に渡すパスは、`docker-compose`のパスに合うように、`rspec`の絶対パスから切り出して作成
– カーソル行を取得してテスト対象を指定

“`vim
” docker-composeでのテスト用定義。環境が変わったら書き換える
function! RunLineSpec() abort
let absolute_path = expand(“%:p”)
let relation_path = absolute_path[stridx(absolute_path, “spec/”):]
let rspec_cmd = ‘docker compose run {do

元記事を表示

Ruby を Crystal にトランスパイル して競プロ典型90問_001: Yokan Party(★4)を解いてみた

# はじめに
https://qiita.com/superrino130/items/55d602f64360d55c51e8

前回記事のview数の伸びに驚きました。~~普段の記事の10倍くらい~~

それはさておき、少しずつマッシュアップしたいものです。
# Yokan Party
https://atcoder.jp/contests/typical90/tasks/typical90_a

ご存知、競プロ典型90問の1問目。
二分探索を行います。
# Ruby 元コード(最適化前)
“`rb:before.rb
def check(mid)
cnt = 0
cut = 0
@a.each do |x|
if x – cut >= mid
cut = x
cnt += 1
end
end
cnt >= K + 1
end

N, L = gets.split.map(&:to_i)
K = gets.to_i
@a = gets.split.map(&:to_i)
@a << L @a.unshift 0 puts

元記事を表示

RSpecのディレクトリ

# アウトプット
RSpecのディレクトリは下記の通り。

– spec
– factories `(FactoryBot)`
– models `(モデル単体テストコード)`
– requests `(コントローラー単体テストコード [Request Spec])`
– system `(結合テストコード [System Spec])`

# 学んだこと
(factoriesは除く)テストコードの実行時にコマンド入力するのは、
`bundle exec rspec spec/ディレクトリ名/ファイル名`
と共通している。

`何に対するテストを行おうとしているか`を把握しておけば、
ファイルの場所やコマンド入力に苦労しにくくなる。

元記事を表示

Ruby-Graphviz でサブグラフを描く

# ゴール
[Ruby-Graphviz](https://github.com/glejeune/Ruby-Graphviz) で[サブグラフ](https://graphviz.org/Gallery/directed/cluster.html) を描きたい

# まずは、dot 言語で書いてみる
[Graphviz 解説記事](https://qiita.com/rubytomato@github/items/51779135bc4b77c8c20d#%E3%82%B5%E3%83%96%E3%82%B0%E3%83%A9%E3%83%95%E3%81%AE%E5%AE%9A%E7%BE%A9)を参考にして

“`dot
digraph node_sample {

subgraph cluster_1 {
label = “clu1”;
labelloc = “t”;
labeljust = “l”;
fillcolor = “#888888”;

nu [label = “nu”, shape = “trapezium”];

元記事を表示

rails cでの記述map,ppについて

## 残しておきたい内容
メンターの方に質問した際にrails cをしている際に気になる記述をしていたので調べて自分の記録用として残しておこうと思います。

## map
each文のようにモデルの内容を順番に表示できる
配列変数.map {|変数名| 具体的な処理 }
“`
2.6.3 :002 > Dish.all.map{|d|d.dish_image}
“`
“`
2.6.3 :002 > Dish.all.map{|d|d.dish_image}
Dish Load (0.2ms) SELECT “dishes”.* FROM “dishes”
=> [#

元記事を表示

新規投稿時にundefined method `upload’ for nil:NilClassエラーについて

## 解決したいこと
料理投稿サイトで新規投稿画面にてタイトル、紹介文、画像の情報を入力し新規投稿したところundefined method `upload’ for nil:NilClassエラーが出て解決をしたい。
前提・・・Active Strage導入済

## 試して見たこと
データの流れを確認するためにテーブル、モデル、コントローラの記述を一通り確認。
=>これといった間違いはないような感じが。モデルにも has_one_attachedの記述があり問題はなさそう。
コントローラもストロングパラメータは大丈夫。

*/CookOP/app/models/dish.rb
“`ruby
class Dish < ApplicationRecord has_one_attached :dish_image belongs_to :user#, optional: true has_many :comments, dependent: :destroy has_many :favorits, dependent: :destroy end ``` */Cook

元記事を表示

rollback transactionの原因の解決方法

## 解決したいこと

ユーザーが写真付きの記事を投稿した際にターミナルでrollback transactionのエラーが表示され、DBに保存ができない状態を解決したいです。
 
## 解決するために試したこと
1、  rollback transactionのエラーについて気になったので調べました。
簡単にいうと保存するためのカラムの培養が不足しておりsaveができない状態とのこと。

2、 コントローラのcreateアクションにある@dish.saveの記述を@dish.save!にすることでエラーの内容が表示されるとのことでそちらも試して見たところ「Validation failed: User must exist」エラーが出ました。直訳すると「バリデーションに失敗しました。ユーザーは存在しなければなりません」となりました。Userモデルに値が入っていないためバリデーションで弾かれていた様子。

3、 2で出てきたエラー「Validation failed: User must exist」を調べると解決の鍵となる内容の記事に出会いました。

## 解決方法

optiona

元記事を表示

7-8億レコードを加工処理してS3へ連携した

## はじめに

今まで一般的なWeb開発はしてきたけど高速化についてあまり考慮せずに実装してきたエンジニアの方に向けて、筆者の加工処理 ( **7億-8億レコード** ) 高速化の経験を基に、本番実行で何を目指すかということと、それまでに実際にどのようなアプローチがあるのかを提案できればと思います。
あくまで提案なので、「こうしたらもっと高速になるよ」的な箇所は多々あるかと思います。
コメントなどでご指摘いただければ幸いです。

## 本記事における前提条件

本記事における前提条件を筆者の経験した環境を参考に記載します。

### 本プロジェクトの背景及び要件

– 既存サービスで蓄積されたデータを外部のシステムに連携して有用活用するにあたってのPoVを実施する。
– 既存サービスで蓄積されたデータの一部を匿名化 (ハッシュ化) したものをCSVに書き出し、外部のシステムにPOSTする。
– 本番実行までの実装及び検証は短期間 (2-4週間程度) である。
– **加工処理はできるだけ早くする完了させる**

### 採用したテクノロジー

– Ruby on Rails API

元記事を表示

M1 Mac Homebrew環境のcabocha gemで `ld: library not found for -lcrfpp` が発生する

# 概要

cabochaをhomebrewでインストールしたらcabocha gemのインストールに失敗する。

# 対応
以下でインストールできた。

“`
brew install cabocha
bundle config –global build.cabocha –with-opt-dir=”$(brew –prefix)”
bundle
“`

もしくは以下。

“`
brew install cabocha
gem install cabocha — –with-opt-dir=”$(brew –prefix)”
“`

# NOTE
– 僕の環境は `$ echo $(brew –prefix)` => `/opt/homebrew`
– Homebrewでインストールしたライブラリのパスを共通で通す設定がどこかにあるのかもしれないが見つけられなかった。

元記事を表示

【個人開発】正規表現を学ぶ狩りに出ませんか?モンスターを倒しながら正規表現が学べるゲーム「Regex Hunting」を作りました

## はじめに
はじめまして!
個人開発者の[ハガユウキ](https://twitter.com/KvOKJo6SH85w2Q8)と申します。

突然ですが、皆さん正規表現はお好きですか?
私は好きです。「複数の文字列を一つのパターンで表現できる」部分にすごく面白味を感じています。
もっといろんな方に正規表現を知っていただきたい、好きになってほしいと思っています。

しかし、現状では2つの課題があると感じています。
– 正規表現の勉強自体がそもそも面白くない。
– 正規表現を勉強しても、しばらく使わないと忘れる。

この2つの課題を突破できるサービスは、現状存在しません。
そのため、楽しみながら正規表現を学べるサービスがあれば良いなと思いました。

**作りました。**

▼スライド型正規表現学習ゲーム【Regex Hunting】
https://www.regex-hunting.com/
(※) 端末はPC、ブラウザはChromeが推奨です。
![ogp.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.co

元記事を表示

【開発未経験】Railsでサ活(サウナ活動)を管理できるアプリを作成しました。

# 1.はじめに
本記事を閲覧いただきありがとうございます!
転職活動用のポートフォリオとしてRailsでサ活(サウナ活動)の記録を管理するためのアプリを作りました。この記事はアプリの紹介や作成した経緯をまとめたものです。

## 自己紹介
– メーカー勤務の24歳。4月で新卒3年目になりました
– 働きながら毎日プログラミング学習中
– サウナとサッカーが大好き

# 2.作成したアプリについて
サウナ好きがサ活(サウナ・水風呂・外気浴の時間)を記録して管理するためのアプリです。
– アプリ名: **『ととのい』**

– アプリURL: https://totonoi.org/
– GithubURL: https://github.com/matsuken314/onsen_app

ホーム画面からゲストログインできます。(その他、新規登録画面からも可能です。)
![guestlogin.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1584967/bd92403f-750e-2f50-3801

元記事を表示

単体テストコードの種類

# アウトプット
単体テストコードの種類は、主にモデルとコントローラーに分かれる。
方針は下記のように異なる。

| 種類 | 方針 |
| ———- | ————————————————— |
| モデル | バリデーションが正しく働くか |
| コントローラー | アクションにリクエストを送ったとき、想定通りのレスポンスが生成されるか |

# 学んだこと
それぞれテストコードは異なるが、`exampleの整理をして、expectation構文で挙動を確認する`、という流れは共通している。

元記事を表示

Ruby から classify text API を叩く

# ゴール
以下を Ruby から叩く。

https://cloud.google.com/natural-language/docs/classifying-text?hl=ja:embed:cite

# 事前準備
上記 API は Natural Language API の一つなので、https://qiita.com/tommy-012/items/e0ad2a7c985fad5e59dd の準備ができてれば OK

# API 仕様
https://cloud.google.com/natural-language/docs/reference/rest/v1/documents/classifyText?hl=ja:title

↑には明記されていないが、Gme を使った際に分かったこととして、対象の英語文に最低限 20 個の単語が含まれている必要がある

カテゴリ一覧は、https://cloud.google.com/natural-language/docs/categories
現状は、最上位カテゴリは 27 個(結構多い)
また、より詳しいカテゴリがわ

元記事を表示

deviseを使用時に名前を表示できない時の解決方法

## 困っていたこと

以下のコントローラ、ビューの記述でサインイン後ユーザのnameが表示されると思っていましたが表示されません。
rails cなどで調べるとそもそも新規登録時に名前が保存できていませんでした。

*users_controller.rb
“`ruby
def show
@user = User.find(params[:id])

end
“`
*/users/show.html.erb
“`ruby

Users#show

<%= @user.name %>
“`

userテーブルにもnameの記述をしているしどこが原因を調べていました。

“`ruby
create_table “users”, force: :cascade do |t|
t.string “email”, default: “”, null: false
t.string “encrypted_password”, default: “”, null: false
t.string “reset_password_

元記事を表示

【超簡単】RubyonRails 投稿時間をInstagramのようにする 〜 ◯日前,◯時間前,◯分前 〜

# はじめに
とっても雑な記事ですが、少しでも誰かに役に立てばと思い記事にしました。

## 前提
簡単な投稿機能が実装済みであること
Railsの基礎的な知識を身につけていること

## 実装方法

### コントローラー
投稿時間を計算するために、コントローラーで今日の日付や、現在時刻を取得します。

“`tweets_controller.rb
class TweetsController < ApplicationController def index @today = Date.today #今日の日付を取得 @now = Time.now #現在時刻を取得 @tweets = Tweet.all #tweeetsテーブルの全レコードを取得 end (略) ・ ・ ・ end ``` ### ビュー 投稿時間に関するところの解説は下に記載しております。 ```erb:tweets/index.html.erb

<% @tweets.each do |t| %>

元記事を表示

Ruby から Google Custom Search API を叩く

# ゴール
以下を Ruby から叩く

https://developers.google.com/custom-search/v1/overview

# まず REST API を呼ぶまで
– [参考記事](https://webbigdata.jp/what-is-bigdata/google-custom-search-api)を確認しながら事前準備
– プロジェクトの作成
– `https://console.cloud.google.com/home/dashboard?project=[プロジェクト名]`にアクセス出来れば OK
– [該当 API の有効化](https://console.cloud.google.com/apis/library?project=oldnews-natural-language-api)
– [API キーの発行](https://cloud.google.com/docs/authentication/api-keys?hl=ja)
– [Custom Search Engine の

元記事を表示

Ruby で Natural Language API を叩く

# ゴール
以下を Ruby から叩く。

https://cloud.google.com/natural-language?hl=ja

# API 呼び出すための準備
[ドキュメント](https://cloud.google.com/natural-language/docs/setup?hl=ja)見ながら「SDK と認証をテストする」をやってみる

基本的には、Google Cloud Console からポチポチするだけ
Cloud SDK のインストールで pyenv を入れるところ少しハマった
個人記事ではなく[ドキュメント](https://github.com/pyenv/pyenv#installation)見ましょう(自戒)

# Gem から API を叩く
– 前提
– [エンティティ分析で試す](https://cloud.google.com/natural-language/docs/analyzing-entities?hl=ja)
– [リクエスト・レスポンス仕様](https://cloud.google.com/natural

元記事を表示

OTHERカテゴリの最新記事