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

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

[py2rb] type クラスの動的定義

# はじめに
移植やってます。
( from python 3.7 to ruby 2.7 )
# type (Python)
“`python
@classmethod
def _make_chain(cls, sequence_maker):
if isinstance(sequence_maker, type):
tp = type(‘%sChain’ % sequence_maker.__class__.__name__, (cls,), {
‘sequence_maker’: sequence_maker
})
else:
tp = type(‘FunctionChain’, (cls,), {
‘sequence_maker’: staticmethod(sequence_maker)
})
return tp
“`
https://www.shoe

元記事を表示

[py2rb] itertools.islice

# はじめに
移植やってます。
( from python 3.7 to ruby 2.7 )
# islice (Python)
“`python
def _get_by_slice(self, slc):
self.reset()
value = list(islice(self, slc.start, slc.stop, slc.step))
return value
“`
https://qiita.com/shihono/items/1613f7c6c1b096256bd3

分かりやすい記事。
# どうする (Ruby)
“`ruby
def islice(iterable, *args)
start = args[0] || 0
stop = args[1] || Float::INFINITY
step = args[2] || 1
cnt = 0
if iterable.is_a?(String)
it = iterable.split(”).to_enum
else

元記事を表示

rubocop で inheritance を利用しルールや設定が重複してしまった際に設定を統合する方法

## これはなに

– `rubocop` には Inheritance というオプションがあり、設定を複数ファイルに記述またはリモートのファイルを参照し、読み込むことができる
– Inheritance の設定をしても、ルールが重複している場合、意図したルールが適用されなかったため対応した際のメモを記事にしました

## Inheritance とは

Rubocop のルールは `rubocop.yml` に設定を記載することが多いが、共通の設定を読み込む場合 remote URL を指定したり、 Gemfile 等に定義している gem の中から定義を参照できます
`rubocop –auto-gen-config` のコマンドを実行して生成する `.rubocop_todo.yml` も `inherit_from` で読み込むため、自然に利用している人も多いはずです

`inherit_from` の詳細については、以下URLの「Inheriting configuration from a remote URL」を確認してください

https://docs.ruboco

元記事を表示

M1 Mac の Docker で gem install grpc に失敗するときの対策

docker-compose で bundle install したり、ビルドしようとするとエラーが発生。

色々試していたところ、grpc をインストールするステップで必ず失敗していること確認。

“`bash
docker-compose run web gem install grpc

#=>
Installing grpc 1.43.1 with native extensions
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

省略

ERROR: 137
“`

alpine Linuxが悪さをしている?という記事を見てビルドイメージを変更するが改善せず。

結論、docker-compose.yml で platform を明示することで動作するようになった。

以下、実行時のファイル内容を残しておきます。

“`shell
# ディレクトリ構成
root/
├ Gemfile
├ Gemfile.lock
├ Dockerfile
└ docker-com

元記事を表示

RailsとVue.js3のSPAアプリにDeepL apiを導入する

ポートフォリオ作りの過程でRails×Vue.js3のSPAアプリにDeepL apiを導入したので過程を初学者視点で紹介します。
開発環境にはdockerを使用しています。

“`
#version
Ruby 3.0.2
Rails 6.0.4
Vue.js3

#開発環境
Docker
docker-compose
“`

# APIで実現したいこと

![スクリーンショット 2022-01-27 20.19.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1640672/fe122651-feb6-82c8-f52e-2918314ab842.png)

上記の画像の「AI翻訳の結果を表示する」ボタンを押すと上部に表示された日本語文を英訳して表示する。

# DeepL apiの登録

https://www.deepl.com/ja/pro-api?cta=header-pro-api/

こちらから登録します。
50,000文字/1ヶ月の制約はありますが無料プランもあります。

登録す

元記事を表示

splitメソッドとそれに関連するメソッドの解説

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2485775/e4ed46f9-e4fd-b20f-7f62-cffe9617a99c.png)

ruby silverの勉強をしていく中で間違えたところがあったのでその解説記事を挙げていきます。

#splitメソッド
指定した文字列で分割し、それを配列で返すメソッドです。
基本構文は、
“`
“文字列”.split(区切り文字, 分割数)
“`
論より証拠ということで、実際にコードを見ていきましょう

“`
‘Yamada, Satou, Itou, Suzuki’.split(‘,’)
=> [“Yamada”, ” Satou”, ” Itou”, ” Suzuki”]

‘Yamada, Satou, Itou, Suzuki’.split(‘u’)
=> [“Yamada, Sato”, “, Ito”, “, S”, “z”, “ki”]
“`
1個目の例でいえば、対象の文字列には、「,」があるので、,を目印に区

元記事を表示

Rails7でspring起因でrails consoleが立ち上がらなかった問題の解決方法

# はじめに

現在個人プロジェクトで

– M1 Mac
– Ruby3.1.0
– Rails7.0.1

という環境での開発を試しています。今までは

– Intel Core i7
– Ruby2.x
– Rails6.x

という環境だったので、やはり動くところ、動かないところが出てきます。
(特に、Docker周りは変なバグを踏まないか戦々恐々としています)

今回はRails7のプロジェクトにて、springのバージョンのせいでrails consoleの実行が失敗した件についてです。

# 事象

発生したエラーはこんな感じで、 `bundle exec rails c` を実行した時に発生しました。

“`
/usr/local/bundle/gems/spring-2.1.1/lib/spring/application.rb:103:in `block in preload’: undefined method `mechanism=’ for ActiveSupport::Dependencies:Module

元記事を表示

【Jbuilder】部分テンプレートでハッシュのオブジェクトを使いたい

##前提
@book_managerが配列ではなくハッシュのため、“`json.array!“`が使えない。

##今まで
ファイル名とインスタンス変数名が同じだと
Railsが部分テンプレートを自動的に予測してレンダリングしてくれていたので、
ファイル名など指定しなくても機能していた。

“`api/v1/book_managers/show.json.jbuilder
json.book_manager do
json.partial! @book_manager
end
“`

##訳あってファイル名変更
ファイル名を変更した際、下記の様に部分テンプレートを指定してみたがうまく行かない…

“`api/v1/book_infos/show.json.jbuilder
json.book_info do
json.partial! ‘api/v1/book_infos/book_info’, collection: @book_manager, as: :book_info
end
“`

##うまく行った例

ローカル変数“`book_info“

元記事を表示

Hamlの基本

# はじめに
RailsでWebアプリにPay.jpを用いた決済機能を実装しようとしていました。
実装フローを検索していたところ、Hamlを使ってビューが実装されているドキュメントが多く、興味本位で学習しました。
これから学習しようとしている方の参考になればと学習したことをまとめてみました。

# TL;DL
・RubyをベースとしたHTMLのテンプレートエンジンのこと
・HTMLよりもシンプルに記述できる
・Ruby / Ruby on Railsでも使われている

# 前提知識
・HTML
・Ruby(Rubyがベースになった記法だから)
・Ruby on Rails(Railsで使いたい場合)

# 大枠の使い方
① 拡張子がhamlのファイルを作成する(Ex.index.haml)
② 作成した①をhamlコマンドに通す(Ex. haml index.haml index.html )
③ htmlファイルが生成される(Ex.index.html)

※ hamlのコマンドオプション(よく使うもの)
-f format → アウトプットのフォーマットを指定(html5)

元記事を表示

rails 7.00における “cannot load such file –sassc”の解決法

rails7.0.0の影響によるcssの読み込みができなくなるというエラーに遭遇したので、同じ症状で悩まされている方のためになるかと思い、この記事を執筆しています。

railsの7.0.0が昨年に公開されましたが、以前のようにcssを適用させようとすると書き画像のようなエラーが出ることがあります。
![Inkedエラー画面_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2230776/8799d448-a136-a3fc-ce92-0207c09e080a.jpeg)

このエラーの解決方法は

“`ruby:Gemfile
46 # gem “sassc-rails”
“`

のコメントアウトを削除して、bundle installをすることで解決することができます。
rails7.00以前はこのgemが環境構築の際に自動でinstallされていましたが、7.00以降では標準でインストールされないようです.

元記事を表示

[py2rb] 多重継承の3

# はじめに
移植やってます。
( from python 3.7 to ruby 2.7 )
# 多重継承 (Python)
https://qiita.com/superrino130/items/364d856e08cff0e501d3

https://qiita.com/superrino130/items/41f18544f92857ed0228

移植するにあたり、多重継承は`Ruby`の`ミックスイン`で行こうと思っていました。
`__init__`のないクラスをモジュールにする予定でしたが、これでは避けられないようですので、委譲により多重継承を表現できればと思います。
# forwardable (Ruby)
“`ruby
require ‘forwardable’

class A
def initialize(s)
@s = s
end

def putsa(o)
puts “#{@s}は#{o}です”
end

def putsd()
puts “呼び出されたクラスは#{self.class}です”
end
en

元記事を表示

[py2rb] 辞書クラスの拡張2

# はじめに
移植やってます。
( from python 3.7 to ruby 2.7 )
# 辞書クラスの拡張 (Python)
“`python
from collections import defaultdict

class BasicComposition(defaultdict):
def __init__(self, *args, **kwargs):
defaultdict.__init__(self, int)
for k, v in list(self.items()):
if not v:
del self[k]

def __missing__(self, key):
return ‘nil’

def __setitem__(self, key, value):
if isinstance(value, float):
value = int(round(value))

元記事を表示

大量データ加工処理の高速化

## はじめに

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

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

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

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

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

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

– Ruby on Rails

元記事を表示

binding.pryが止まらない!

railsのデバッグのために `binding.pry` を使ったが、ループの中に入れてしまったので `exit` をしてもずっと止まらない!
こんな時に使えるコマンドがこちらです!↓

“`terminal
$ exit!
$ !!!
“`

上記のどちらかで止まります!
試してみてください^^

元記事を表示

Ruby: Splat Operator と Double Splat Operator

## はじめに

Ruby には `Splat Operator` と `Double Splat Operator` の2つの文法があることを知りました。以前より何回か見たことはあったが、ちゃんと理解できていなあった点もあるので、改めてその違いと特徴をまとめてみます。

## 前提
– Ruby 2.7.5

## Splat Operator

### どんなもの?

メソッドの仮引数にある `*` を使用して定義した引数のことです。

“`ruby
def method(*args)

end
“`

要は可変長引数で配列として受けることができます。

“`ruby
def method(*args)
args
end

p method(‘Ruby’, name: ‘yamada’) # => [“Ruby”, {:name=>”yamada”}]
“`

配列として受けることができるので、引数には文字列やキーワード引数などが渡すことができます。

## Double Splat Operator

### どんなもの?

メソッドの仮引数にある `**`

元記事を表示

Dirクラスを解説

ruby silverの勉強をしていく中で間違えたところがあったのでその解説記事を挙げていきます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2485775/5d1866cb-e2ee-9696-2a44-6e410ffa3447.png)

今回の記事では、詳しい説明は省略させていただきます。[公式ドキュメント](https://docs.ruby-lang.org/ja/latest/doc/spec=2fdef.html#singleton_method)を読んでみてください。

結論からいうと、正解は、Dir.pwd以外の選択肢すべてです。
1つ1つの選択肢を調べましたので、ぜひ参考にしてください!

##そもそもDirクラスとは
めちゃザックリいうと、ディレクトリを色々操作できる、というクラスです。
今回問題で使われているpwdメソッド、globメソッドを例に紹介していきます。

###pwdメソッド
現在のディレクトリを出力するメソッドなんですね。
pwd(print w

元記事を表示

【N+1問題】ループ処理の中でクエリを実行しない!

##N+1問題

ループ処理の中でクエリを実行しない!
大量のクエリが発行されるのでめちゃくちゃ重くなるので、
ループを実行する前にあらかじめデータ取得しておく。

####良くない例

“`ruby
books = Book.all

book_names = []
books.each do |book|
book_names << BookSynopsis.find_by(book_id: book.id).name end ``` ####良い例 ```ruby book_synopsis = Book.includes(:book_synopsis) book_names = [] book_synopsis.each do |book_synopsis| book_names << book_synopsis.name end ``` ##参考 https://qiita.com/shizen-shin/items/fffdf57feda979efb5d9

元記事を表示

任意のタイムゾーンを持ったActiveSupport::TimeWithZoneオブジェクトを生成する

# お題

“`ruby
Time.zone_default
# => #, @utc_offset=nil>
Time.zone
# => #, @utc_offset=nil>
Time.zone.now.zone
# => “UTC”
“`

(戻すのが面倒だったり忘れたりするから)`Time.zone_default` や `Time.zone` は変更せずに、なんか好きな `ActiveSupport::TimeZone` オブジェクトをしょった `ActiveSupport::TimeWithZone` オブジェクトがほしい。

*activesupport-7.0.1/lib/activ

元記事を表示

[rails]いいねが削除できない? →ネスト時には引数が2つ必要

#はじめに
この記事はプログラミング学習の備忘録です。
今回はrailsでいいね機能の削除ができず、時間を使ってしまったのでまとめます。

今回分かったこととしては、**「ネストしている場合は引数を2つ指定する必要がある」**ということです。

#エラー内容
以下今回の記事の前提です。
・散歩習慣アプリを作っている
・投稿機能には、「walks」というモデルを使っている。
・いいね機能には、「likes」というモデルを使っている。

いいねを削除するために以下のように実装しました。

“`index.html.erb
<%= link_to "いいねを解除" ,walk_like_path(walk),method: :delete %>
“`

walk_like_path(walk)で投稿に紐づくいいねを指定、
method: :deleteも付けているので問題なさそうです。
しかし表示してみると、

[![Image from Gyazo](https://i.gyazo.com/eecd8e9a208e0ed922f9d335780693c8.png)](http

元記事を表示

[py2rb] multiprocessing

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

try:
_NPROC = mp.cpu_count()
except NotImplementedError:
_NPROC = 4
“`
https://docs.python.org/ja/3.7/library/multiprocessing.html

`並列処理`を移植するって、完全に力不足。
# どうする (Ruby)
“`ruby
require ‘etc’
p Etc.nprocessors #=> 4
“`
いや、cpuのコア数を数えるくらいならできますけど。

https://docs.ruby-lang.org/ja/latest/method/Etc/m/nprocessors.html
# メモ
+ Python の multiprocessing を学習した
+ 百里を行く者は九十里を半ばとす

元記事を表示

OTHERカテゴリの最新記事