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

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

[py2rb] zip

# はじめに
移植やってます。
( from python 3.7 to ruby 2.7 )
# zip (Python)
“`python
import numpy as np

x = np.array([1, 2, 3])
y = np.array([4, 5, 6])

for a, b in zip(x, y):
print(a, b)

# output
1 4
2 5
3 6
“`
何の変哲もないように思われますが、pythonとnumpyの親密さが伺い知れます。
# 失敗(Ruby)
“`ruby
require ‘numpy’

x = Numpy.array([1, 2, 3])
y = Numpy.array([4, 5, 6])

x.zip(y).each do |a, b|
p [a, b]
end

# output
undefined method `zip’ for array([1, 2, 3]):Numpy::NDArray (NoMethodError)
“`
`PyCall`経由とはいえエラーになります。
# 成功(Rub

元記事を表示

命名規則(スネークケースとアッパーキャメルケース)でエラーになった経験

# 命名規則(スネークケースとアッパーキャメルケース)でエラーになった経験

## スネークケース
1.単語の区切りをアンダースコア「_」表す。
 admin_user_comment_creator
2.命名の対象
 メソッド名、変数名

## アッパーキャメルケース
1.キャメルケースの一つで先頭から単語の区切りを大文字で表す。
 AdminUserCommentCreator
2.命名の対象
 クラス名

### 結論
 命名規則を間違えるとうまくコードを読み込んでもらえないので注意が必要。
 また、仮説・検証して解決しなければ命名規則誤り等のスペルミスを疑う。発見しづらいのでスペルミスの可能性も頭の片隅に入れてく。

元記事を表示

【個人開発】フードデリバリー配達員の情報交換サイトを作りました。

# サービスの概要
【サイト名】
Fodeli Online

https://fodelionline.site/

![スクリーンショット 0004-02-24 4.27.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1794066/80a8464a-0909-adfe-eb2d-8039be9f72fb.png)

【コンセプト】
フードデリバリー配達員の情報交換や交流を目的としたサービス

【サービスの開発に至るまでの背景】
私自身、2社フードデリバリーで働いていた経験があり、出来高制ということもあり、注文が来なくて稼げない時期がありました。
一般的な会社だったら上司に仕事のコツを教えて貰えたりすると思いますが、完全個人のこの仕事では基本的には自分でコツを見つけていくしかありません。
そんな中で、配達員同士がもっと気軽に情報交換ができるサービスがあったらいいなと考え、このサービスを開発することにしました。

# アプリケーションの機能

ユーザー登録機能
 ■ ログイン機能
 ■ ログ

元記事を表示

バドゥーギにおけるコンボ数の分布、及びそのブロッカーによる影響

## 概要
– プリドローにおけるBadugi, Triの確率を計算した
– Badugiが成立している場合の各役のコンボ数を計算し、分布を確かめた
– blockerによってコンボ数にどのような影響を及ぼすか確かめた

## 環境
ruby 2.6.3p62
Google Spreadsheet
Badugiのルール説明に関しては割愛します。

## プリドローにおけるBadugiの成立確率

まず、プリドローの段階でBadugiが成立している確率を求めます。
同時に、主なバリューハンドである8-badugiの確率、及びtriハンドが配られる確率を求めます。
この確率の感覚を掴み、ゲームにおける敵のアクションの頻度と照らし合わせることが目的です。

“`ruby
ranks = [‘K’, ‘Q’, ‘J’, ‘T’, ‘9’, ‘8’, ‘7’, ‘6’, ‘5’, ‘4’, ‘3’, ‘2’, ‘A’]
suits = [‘s’, ‘h’, ‘d’, ‘c’]
# トランプ1セットを下準備
decks = ranks.flat_map{ |rank| suits.map {

元記事を表示

Rails list値の差分比較

## TL;DR

list – listで差分がでる

## なぜ、Rails list値の差分比較を書くことになったか

2つのケースで利用した

### 1. WebClient -> RailsAPI -> 外部APIの時のvalidationで利用

現状の実装でRailsApiServerから外部のAPIを叩く実装があり、外部APIもまだvalidation条件がふわっとしていたため、ApiServer側でvalidationを担保しようと思っての実装(Model継承してService層ににがしているので、あまり本質的じゃない)。

### 2. RSpecのresponse bodyの情報チェックの時に利用した

あまりないケースだが、credential情報をちゃんと消しているかなどの簡易チェックに結構有用だった。
また、ResponseBodyの型情報あっております!!って時のチェックでも利用した。

## 例

“`sample.rb
list_a = [1, 2, 3]
list_b = [1, 2]
a – b # [3]

obj.keys – obj_wi

元記事を表示

【Ruby on Rails】HerokuとDBの紐付け方法

前提として

・HerokuはPostgreSQLを使用しているため、もし”gemfil”の”group :development do”配下でPostgreSQL以外を設定している場合はDBが使用出来ないので、注意下さい。
※例えば、”gemfil”の”group :development do” 配下に ”sqlite” を設定しまっている場合など。この場合は、”group :development, :test do”配下に移動するなど設定変更が必要。”gemfil”を変更したら、忘れず `bundle install` か `bundle update` を実行して下さい。

## 参考にした記事

## 1. まず、HerokuとGitリポジトリを紐付ける
https://blog.tanebox.com/archives/630/

## 2. Heroku PostgresをRailsアプリで利用する手順(Rails)
https://qiita.com/NaokiIshimura/items/550ca82e8e57aaea5582

## 1. まず

元記事を表示

Rails c でテーブル情報を取得するには

テーブル情報取得
ActiveRecord::Base.connection.tables
結果
=> [“schema_migrations”, “ar_internal_metadata”, “contacts”]

列の名前取得
【テーブル名】.column_names
=> [“id”, “name”, “email”, “content”]

列の情報取得
【テーブル名】.columns
結果
=>
[#

元記事を表示

Ruby で 数独 の2

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

前回の記事から一年近くたっていますが、`Numo::NArray`の学習を含めて、久々に取り組みたいと思います。

https://github.com/ruby-numo/numo-narray

# Numo::NArray
“`require.rb
require ‘numo/narray’
include Numo
“`
“`new.rb
@banmen = UInt32.zeros(h, w)
“`
`XXX.zeros`で、初期値`0` `h`行`w`列の行列を生成します。

“`cast.rb
@uramen = NArray.cast(Array.new(h){ Array.new(w){ (1..9).to_a } })
“`
`NArray.cast`を使用すると`Ruby`の配列から行列を生成することができます。
ここでは、3次元の行列をイメージします。

![20220301a.png](https://qiita-im

元記事を表示

lambdaについて

## はじめに

has_manyで使われるクエリをカスタマイズしたかったので、その方法を調べたところ、初めて見る記述だったので、調べてみました。
以下に例を示します。Postに関連するlikeを作られた逆順(新しい順)で取得するための記述です。

~~~ruby:author.rb
class Post < ApplicationRecord has_many :likes, -> { order(created_at: :desc) }
end
~~~

## has_manyのスコープ
Railsガイドでは、次のように説明されています。

>has_manyで使われるクエリをカスタマイズしたい場合があります。スコープブロックを用いてこのようなカスタマイズを行えます。

引用:[has_manyのスコープについて](https://railsguides.jp/association_basics.html#has-many%E3%81%AE%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%97%E3%81%AB%E3%81%A4%E3%81%84%E3%81%

元記事を表示

N+1問題の解決方法(初心者向け)

## 環境

Ruby 2.7.3

Rails 6.1.4

## N+1問題とは

**必要以上にSQLが発行されてしまい、パフォーマンスが悪くなる問題のこと**。

実際にN+1問題の例を以下に示す。
シンプルに`Userカラム`と`Groupカラム`が中間テーブル`GroupUser`を跨いで多対多の関係になっている。

![Database ER diagram (crow’s foot) – Database ER diagram (crow’s foot).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2508607/125dc7d0-9a5e-1cfd-b963-9c9c3c3ea46b.png)

N+1問題について考えず、各GroupのUserに対してある処理をしたい。
以下のようにUserデータを取得するために、随所随所でSQLが発行されておりパフォーマンスが悪い。

問題のあるコード

“`ruby
Groups.each do |group|
group.users.

元記事を表示

ActiveStorageでRspec実行時に生成された画像データをテスト終了後自動で削除する方法

## 概要
`ActiveStorage`で`Rspec`実行時に生成した画像ファイルをテスト終了後に自動で削除する方法をメモとして残しておきます。
`Rails`で`Rspec`を用いてテストする際に画像を生成する場合があると思います。
その際に生成されたテスト用画像データは下記のように`config/storage.yml`に設定された保存先に保存されます。

“`ruby
test: # ‘root’にテスト時に生成された画像を保存する場所を指定している
service: Disk
root: <%= Rails.root.join("tmp/storage") %>
“`
テストを行っていくとどんどんと保存先のストレージが生成された画像で圧迫されてしまいます。
しかし、ある設定をすることでテスト終了後はストレージをクリーンアップすることができます。

## 方法
_*spec/rails_helper.rb*_

“`ruby
RSpec.configure do |config|
config.after(:all) do
FileUtils.rm_

元記事を表示

slimの使い方

# slimとは
***Rubyのテンプレートエンジン***のことです。
erbとかあると思いますが、slimを使うと書く手間が省けて、
htmlより簡潔に書くことができます。

# erbとの書き方の違い
slimの書き方の特徴を表にして行きます。

|<>|これは使わない|
|–|–|
|<% %>|= |
|<% %>| – |
|コメント| / |
|id指定|#|
|class指定|.|

このように表記して行きます。

コードで表すと下のようになります。

“`.html

slim練習

slimテスト

“`
slimにするとこうなります。

“`.slim
h2 slim練習
.content
p slimテスト
“`
書き方としてはかなりシンプルになります。

具体的に表にしてみます。

|html(erb)|slim|
|–|–|
||/|
|class=”content”|.content|
|id=”content”|#content|

元記事を表示

link_to 〜 doの役割

実務でタイトルにあるような書き方を見たので、まとめようと思います

link_toの使い方は、ご存知かと思います。もし分からないという方がいらっしゃいましたら、[公式ドキュメント](https://railsdoc.com/page/link_to)を読んでみてくださいね!

## link_to doはいつ使われるのか
下記のコードのようなときにこのメソッドは使われます
“`
<%= link_to root_path, class: "btn btn-link" do %>

メッセージ
<% end %>
“`
このように、画像を押すと指定したパスに遷移するような実装をしたいときに使えるかとおもいます。
公式ドキュメントを見ると分かるとおもいますが、link_toの引数に画像を指定することはできないんですね。
そこで、画像を押したときに指定したパスやURLに遷移するような実装をしたい時に、このメソッドが使えるんです。

短いですが、以上です

元記事を表示

cannot load such file — gemname (LoadError)

# Gemfileに無いgemをrequire

Gemfileに書いていないGemをrequireしていた。

“`
gem list
“`

でlocal gemにあるからと言って、大丈夫と思ったのですが違ったみたい。

もし、Gemfileにないが、localにあるgemを使いたいなら、
pathを$LOAD_PATHに書く必要がある様です。
(多分Qiitaでどなたかが書かれた記事を見たがURLを失念。)

今回はGemfileに入れたいgemだったので、
Gemfileに記入して完了。

元記事を表示

三項演算子

# 三項演算子とは

if ~ else ~ を1つの文で書くときの演算子。
Rubyなどでコンパクトな表現に置き換えられる。
ternary operatorともいうので3つのものを1組にして動かすってイメージ。

“`
論理値(条件式) ? 何かをする(条件式a) : 別のことをする(条件式式b)
“`

論理値(条件式)を評価して結果が真なら 何かをする(条件式a), 偽なら 別のことをする(条件式式b)を評価してその結果を値とする。

# 少し細かく

“`
# 普通に書くとき
if 論理値(条件式)
何かをする(条件式a)
else
別のことをする(条件式式b)
end

# 三項演算子のとき
論理値(条件式) ? 何かをする(条件式a) : 別のことをする(条件式式b)

“`

“`rb
if boolean?
var = foo
else
var = bar
end
“`

“`rb
var = boolean? ? foo : bar
“`

それとメソッドの戻り値として使うこともよくあるみたい。

“`rb

元記事を表示

【令和最新版】Array#sample と Random#rand ってどっちが速いんかな

## 背景
以前に `sample` と `rand` についてベンチマークを比較した[記事](https://qiita.com/kurashita/items/e1ef4604cb0a4f5e5a85)を書きましたが、いくつか見直すべき点があったため改めて投稿したいと思います。

## 検証
### `Kernel.#rand` より `Random.rand`

前記事では `Random.rand` と言いながら `Kernel.#rand`(つまり単に `rand`) を混同して使っていました。
なので改めて以下のように `Kernel.#rand` と `Random.rand` を比較してみます。

“`ruby
num = 10000
count = 1000000

Benchmark.bm 20 do |r|
r.report ‘Kernel.#rand’ do
count.times do
rand(num)
end
end

r.report ‘Random.rand’ do
count.times do

元記事を表示

Ruby on Rails Zeitwerkについて

## はじめに
通常のRubyでは、親要素を継承した子要素を定義する(依存関係のある)場合はファイルをrequireして、明示的に読み込む必要があります。しかし、Railsでは、親要素のファイルをrequireせずに継承しているものがあることに気づいたので、そのことについて調べてみました。

~~~ruby
#rubyでは、本来以下のような記述が必要だが、rails では不要。
#require ‘/application_controller.rb’
class UsersCotroller < ApplicationController ・・・ end ~~~ ## 結論 Rails 6.0以降は、Zeitwerkモードでの自動読み込み(オートロード)および再読み込みの仕組みにより、requireせずとも、ファイルが自動読み込みされている。 ## Zeitwerkとは Ruby用に作成されたコードローダーの仕組み プロジェクトで定義されたクラスやモジュールを必要な時(autoloding)もしくは、事前に一括で(eager loading)読み込みます。 #### フ

元記事を表示

devise ユーザー情報変更をcurrent_passwordなしで行う。

## はじめに

Deviseのデフォルトの状態だと、ユーザーのアカウントをアップデートするには、current_passwordが必要です。
ただ名前やメールアドレスといった基本情報の編集のたびにパスワードを入力させるのは、UIの面を考慮するとあまりよろしくないです。そこで、現在のパスワードを入力しなくてもプロフィールの情報を編集できるように実装します。また、パスワードを変更する場合は、現在のパスワードを入力するような仕様にします。
![スクリーンショット 2022-02-28 0.13.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653944/e7349a0b-db4c-19ba-3d73-97123bc62ca0.png)

## Devise::RegistrationsController#updateの実装について
Devise::RegistrationsController#updateでは、以下のとおり、Devise::RegistrationsController#upda

元記事を表示

mysql5.7での所有権エラーを直そう!!

# rails でmysqlを使ったらエラー出た。。

“`
Mysql2::Error::ConnectionError (Can’t connect to local MySQL server through socket ‘/tmp/mysql.sock’ (2)):
ERROR! The server quit without updating PID file (/usr/local/var/mysql/**.local.pid)
“`
# 環境
MySQL : 5.7.37
macOS : 10.14.6
ruby : 2.7.2
rails : 6.0.3

![mysql.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1385887/c415ecdf-9903-8e9e-7e07-4d1b44601273.png)

調べると、所有権に問題があるというので、ログインするため下のコマンドを試してみました。

## まずは、ログイン
“`console
mysql –

元記事を表示

画面遷移するとjQueryが動かないときはTurbolinksが悪さをしているかもしれない

**環境:**
Ruby 2.7.3
Rails 6.1.4.4
# **問題**
jQueryを使って、例えば「ボタンをクリックしたらモーダルウィンドウが表示される」といったアクションを実装したとする。すると、最初にページに訪れたときは正常に動くのに、ページ遷移を挟んだら動かなくなり、ページをリロードするとまた動き出す…といった不具合が発生する。

サンプルはこんな形↓(「open」というIDを持つオブジェクトをクリックすると、モーダルウィンドウが表示されるような処理)

“`jsx
$(function () {

$(“#open”).click(function(){
—–処理——
});

});
“`

# **原因**

**Turbolinksがjsの読み込みを邪魔している。**

まず、

“`jsx
$(function() {});
“`

1行目のこれはコードの省略形で、正確に書くと以下のようになる。

“`jsx
$(document).ready(function {

//処理

});
“`

元記事を表示

OTHERカテゴリの最新記事