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

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

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アドベントカレンダー2の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**と呼ぶ。

元記事を表示

Rails 7にOmniAuthでTwitterログイン機能を搭載

# はじめに

10年ほど前にOmniAuthでTwitterログインをするという機能をいくつかのシステムで実装したのですが、久しぶりに同じことをやってみようとすると時間がかかってしまったので、今回実施した内容をまとめておくことにしました。

以下のバージョンで動作を確認しています。deviseとは連携しないでOmniAuth単体でユーザー認証をします。

– Ruby 3.1.2
– Rails 7.0.4
– OmniAuth 2.1.0
– OmniAuth::Twitter2 0.1.0

# ライブラリのインストール

TwitterのAPIがv2になっていたので、それに対応したStrategyのライブラリを利用します。

https://github.com/unasuke/omniauth-twitter2

“`ruby:Gemfile
gem “omniauth-twitter2”
gem “omniauth-rails_csrf_protection”
“`

“`bash
% bundle
“`

# Client ID, Client Secretの取得

元記事を表示

【Ruby】Fizzbuzzプログラムを作成しよう!

Rubyから少し離れていたので復習がてらFizzbuzzプログラムを作りました。
# Fizzbuzzプログラムとは?
Fizz Buzzとは、英語圏で行われている言葉遊びです。
プレイヤーが円状に座り、最初のプレイヤーは「1」と数字を発言し、次のプレイヤーは、直前のプレイヤーの次の数字を発言していきます。
ただし、発言する数字が3で割り切れる場合は「**Fizz**」、5で割り切れる場合は「**Buzz**」、15で割り切れる場合は「**Fizz Buzz**」を数字の代わりに発言しなければなりません。
このFizzBuzzを、プログラムコードとして画面上に出力できるかどうかでプログラマーの技術力がわかるため、コーディング面接の題材としてよく使われています。

FizzBuzzプログラムは、以下のような挙動をするプログラムです。
– 3で割り切れる数値を引数に渡すと、「Fizz」を返す
– 5で割り切れる数値を引数に渡すと、「Buzz」を返す
– 3と5の両方で割り切れる数値を引数に渡すと、「FizzBuzz」を返す
– それ以外の数値は、その数値を文字列に変えて返す

# 要件

元記事を表示

[Rails]ページの閲覧数をカウントする方法

## 考え方
ER図はこちら
作成するモデルは**ReadCount**のみです
![ER図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2950107/aadc0815-d6f2-038d-d652-fae30956ded3.png)

各Bookのshowページにアクセスした時に以下の処理を行う
・本のidと訪れたユーザーのidをReadCountに登録する

閲覧数を表示するには
・該当するBookを探す Book.find(params[:id])等
・アソシエーションを用いて該当するbook_idを持つReadCountのデータを数える
例:book_idが1の場合
book.find(1).read_counts.count

前提条件
ruby 3.1.2
Rails 6.1.7
device、bootstrap導入済み(bootstrapは見た目の問題なので機能には関係なし)
User及びBookモデル作成済み

# 1.モデルの作成

integer型か、既存のテーブルを参照するr

元記事を表示

Rubocop導入

### Rubocop導入
“`Ruby:Gemfile
group :development do
gem ‘rubocop’, require: false
end
“`
“`Terminal:ターミナル
bundle install
touch .rubocop.yml
“`

“`Ruby:.rubocop.yml
AllCops:
# 除外するディレクトリ(自動生成されたファイル)
# デフォルト設定にある”vendor/**/*”が無効化されないように記述
Exclude:
– “vendor/**/*” # rubocop config/default.yml
– “db/**/*”
– “config/**/*”
– “bin/*”
– “node_modules/**/*”
– “Gemfile”

# 1行あたりの文字数をチェックする
Layout/LineLength:
Max: 130
# 下記ファイルはチェックの対象から外す
Exclude:
– “Rakefile”
– “spec/rai

元記事を表示

相互フォロー間のユーザー同士でDMを送る方法

忘備録、並びに考え方の整理として投稿します
初学者なので効率的なコードの書き方などは出来ていないかと思います。

今回の目的
相互フォローをしているユーザー間でDMを送り合いたい

前提条件
ruby 3.1.2
Rails 6.1.7
device、bootstrap導入済み(bootstrapは見た目の問題なので機能には関係なし)
User及びフォロー・フォロワー機能作成済み

ER図は下記のようになります
作成するのはこの内**UserRoom**, **Room**, **Chat**の3つ
ER図_8a.png

# 1.モデルの作成
integer型か、既存のテーブルを参照するreferences型のどちらかで記述
references型では若干書き方が違う( 〜_idが不要になる)ので注意

元記事を表示

Ruby・Node.js・Goのライブラリバージョン管理比較

## 対応表

| | Ruby | Node.js | Go |
|:-:|:-:|:-:|:-:|
| 言語バージョン管理 | rvm, rbenv

<例>
rbenv install 3.0.0 && rbenv local 3.0.0 #=> 3.0.0 (set by /Users/yokoto/.rbenv/version)| nvm, nodenv, n

<例>
nvm install 19.2.0 && nvm use 19.2.0 #=> Now using node v19.2.0 (npm v8.19.3) | go, goenv

<例>
go install golang.org/dl/go1.18.8 && go1.18.8 download #=> go version go1.18.8 darwin/arm64 |
| パッケージ管理ツール | Bundler

<例>
gem install bundler && bundler -v #=> Bundler v

元記事を表示

ruby/railsをdocker環境で立ち上げてみる。

# はじめに

[naritomo](https://twitter.com/naritomo08)と申します。

本職はインフラエンジニアを行っています。
最近扱ったruby系について、開発環境構築方法について投稿したいと思います。

いろいろアドバイスいただけると嬉しいです。

## 立ち上げ概要

windows11を使用してwsl2+Ubuntu+vscode+git環境を作り、
docker-composeを使用して立ち上げるものになります。

必要なソースは以下にまとめてあります。

https://github.com/naritomo08/railspostgres

## 参考URL
[Windows10のWSL2(Ubuntu)でDockerを使ったRails環境構築](https://qiita.com/na-777/items/fcccb48b4f3b549abe61)

[Elixirをdocker環境で立ち上げてみる。](https://qiita.com/naritomo08/items/fecf4ace7b9ca9078102)

## 事前準備

wi

元記事を表示

特定の数値を検知するプログラムの実装

# 問題
以下の要件を満たすarray123メソッドを実装しましょう

・配列内に1,2,3が全て入っている場合は、「True」と出力すること
・配列内に1,2,3の全てが入っていない場合は、「false」と出力すること

雛形
“`
def array123(nums)
# 処理を記述
end

# 呼び出し例
array123([1, 1, 2, 3, 1])
“`

出力例
array123([1, 1, 2, 3, 1]) → True
array123([1, 2, 4, ]) → False
array123([1, 1, 2, 1, 4, 3]) → True

# 解答
“`
def array123(nums)
if nums.include?(1) && nums.include?(2) && nums.include?(3)
puts “True”
else
puts “False”
end
end

# 呼び出し例
array123([1, 1, 2, 3, 1])
“`

# 解説
仮引数numsには、配列[1, 1,

元記事を表示

【Ruby】カッコつけたコードを書いてみよう

※ 本記事はDMM WEBCAMP mentor Advent Calendar 2022 4日目のエントリーです。

## カッコつけたコードとは

* 可読性を度外視した、知識をひけらかしてスキルをアピールするためのコードです
* 実用面は微妙ですが、自分用のアプリや競プロなんかではちゃんと役に立つかも
* 何より、Rubyの記法の自由度の高さを楽しむことを第一にやっていきます

普通のコードを書き換えていくハンズオン形式なので、是非手を動かしながらやってみてください。

## 今回書き換えるコード

入力された文字列を、所謂「Leet」表記の文字列に置換して出力するプログラムです。

> leet(リート、1337、l33t)は、主に英語圏においてインターネット上で使われるアルファベットの表記法である。(Wikipediaより)

つまり、「HELLO」を「H3LL0」と書くような表記で、名前の被りを避けるためにたまにライブラリ名等でも採用されています。

Leetにも色々ありますが、今回は単純に以下のように、英語大文字→数字のみの置換を考えます。

|対象|置換先|
|:—

元記事を表示

OTHERカテゴリの最新記事