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

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

マークスイープガベージコレクションを実装してみた

これは、[GLOBISアドベントカレンダー](https://qiita.com/advent-calendar/2022/globis)16日目の記事です。前回は、@chrojuさんの[Docker build を GitHub Actions に最適化する](https://qiita.com/chroju/items/d98ea757f906a9b5d683)という記事でした。

# はじめに

弊社ではRuby内部実装を知ることを目的に、@_ko1さんがWEB+DB PRESSで連載されていた「[Rubyのウラガワ ─⁠─ Rubyインタプリタに学ぶデータ構造とアルゴリズム](https://gihyo.jp/magazine/wdpress/archive/2019/vol110)」の社内勉強会を開いています。
社内勉強会を通してガベージコレクション(以降、GCと呼ぶ)に興味を持ち、マークスイープGCを実装しました。
本記事は、RubyのベースGCアルゴリズムであるマークスイープGCについて紹介をしようと思います。

# 前提知識
## オブジェクト
アプリケーションによって

元記事を表示

Railsでメモ化を使ってパフォーマンスを向上させる

# TL;DR

Railsでメモ化というテクニックを使えば一度のリクエストに対して同じ処理が複数走る箇所のパフォーマンスを改善できます。
“`ruby
@hoge ||= #重い処理
“`
このようにインスタンス変数の自己代入を使ってメモ化すれば、2回目以降の呼び出しはインスタンス変数に格納された値を使ってその後の処理を実行できます。

# 解決したい課題

次のようなProductモデルを考えてみます。
“`ruby:product.rb
# == Schema Information
# id :bigint not null, primary key
# name :string(255) not null
#
class Product < ApplicationRecord has_many :shops, through: :malls has_many :malls def has_shops? # 内容は省略 # 要件を満たしたshopかどうかを判定して真偽値を返す

元記事を表示

【エラー解決】Ruby on Rails いいね機能 〜まさかそこ!?ってなる落とし穴を解決する方法〜

# はじめに
Ruby on Railsを使っていいね機能を実装しているが、教材や記事通り実装しても謎のエラーに苦しめられる・・・という経験をしたことがある人を何度も目にしてきました。

今回がそういった人に向けて、よく見落とされがちなエラー解決の方法を伝授します!

# エラー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1081227/da3c7de6-fa50-af17-1759-2981f97097c7.png)

# 解決方法
ルートもコントローラーの記述も全部あっているはずなのに上記のようにNo route matches と怒られる方は一度viewページを確認してみてください!
いいねボタンがlink_toになっていませんか???
“`rb:index.html.erb(変更前)
<% if @post.favorite?(current_user) %>
<%= link_to post_favorite_path(@post.id), method: :de

元記事を表示

Rubyの動的メソッド呼び出しと動的メソッド定義と ~send, define_method~

# はじめに
最近「メタプログラミングRuby」という本を読んで、動的メソッド呼び出しと動的メソッド定義について学習しました。
そこで、実際に2つ使って簡単なコードを書き本記事を作成しました。
# 前提
動的ではないメソッド定義とメソッド呼び出しは以下のようなものです。
“`ruby
class Hoge
attr_accessor :name

def print_name
puts “name: #{@name}”
end
end

hoge = Hoge.new
hoge.name = “Alice”

hoge.print_name
#=> name: Alice
“`
特徴はそれぞれ次の通りです。
– 固定の名前でメソッドを定義する
– 固定の名前でメソッド呼び出しをする

# 動的メソット呼び出し
“`ruby
hoge.print_name
hoge.print_type
hoge.print_age
“`
上のように`print_○○`という命名のメソッドを連続して呼び出す場合について考えます。

そこで、変化する部分を配列で持ちsendメソ

元記事を表示

Rack CORS

## CORSとは

CORSとは“`Cross Origin Resource Sharing“`の略語で、日本語で表すと“`オリジン間リソース共有“`です。
ブラウザでは、セキュリティの観点から異なるオリジンを持つクライアント側からのHTTPリクエストを制限しています。
これを“`同一オリジンポリシー“`と言います。

https://qiita.com/att55/items/2154a8aad8bf1409db2b

例えば、“`http://localhost:3001“`でapiサーバーが立ち上がっており、“`http://localhost:3000“`でクライアント側のサーバーが立ち上がっている場合に、クライアント側からapi側にリクエストをすると、オリジンが異なるため以下のようなエラーが出力されます。

“`
Access to XMLHttpRequest at ‘http://localhost:3001/api/v1/posts’ from origin ‘http://localhost:3000’ has
been b

元記事を表示

Stimulus 6: 外部リソースの操作

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

https://stimulus.hotwired.dev/handbook/working-with-external-resources

前の章では値を使用してコントローラーの内部状態をロードして永続化する方法を学びました。

コントローラーは外部リソースの状態を追跡する必要がある場合があります。外部とはDOMまたはStimulusの一部にないものを意味します。たとえばHTTPリクエストを発行し、リクエストの状態が変化したときに応答する必要がある場合があります。またはタイマーを開始してコントローラーが接続されなくなったときに停止することもできます。この章ではこれらの両方を行う方法を見ていきます。

# HTMLの非同期読み込み

HTMLのリモートフラグメントを読み込んで挿入することにより、ページの一部を非同期的に設定する方法を学びましょう。Basecampでこの手法を使用して最初のページの読み込みを高速に保ち、ビューをユーザー固有

元記事を表示

Rails 一覧画面でコメント機能

Railsを使って、●イッターみたく一覧画面でコメントしてみたいなーと
思ったので作りました!!

# 前提
:::note warn
以下の項目を既に実施している前提として話を進めます!
:::
1. 投稿機能の実装
1. deviseを用いたユーザー機能の実装

# Viewの編集
HTML・Rails側で主に実施することは以下の通りです。
1. 投稿毎にコメントを表示する
1. コメントの表示・非表示用のボタンを作る
1. 各投稿を見分けるために、投稿のIDをつけておく
1. コメントのフォームを作る
1. 投稿毎にコメントできるように、各フォームでインスタンスを生成

“`diff_erb:index.html.erb

Posts

<% @posts.each do |post| %>

<%= image_tag post.image_url, class: '

元記事を表示

GitHub Actionsでsetup-rubyが失敗するようになった

GitHub Actions で `actions/setup-ruby` というアクションを利用していたのですが、ここ最近、必ず失敗するようになりました。

エラーメッセージはこんなかんじです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221845/40676d58-4cd5-1fc9-0146-b45064a24c5b.png)

“`
Run actions/setup-ruby@v1
————————
NOTE: This action is deprecated and is no longer maintained.
Please, migrate to https://github.com/ruby/setup-ruby, which is being actively maintained.
————————
Error: Version 2.6.x not found
“`

どうやら `acti

元記事を表示

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

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

**使用ツール** :
AWS Cloud9
## ルートの設定方法
**Railsのルーティングファイル**を開き、controller_name(コントローラ名)と、action_name(アクション名)を記載する。
※Railsのルーティングファイル=config/routes.rb

↓↓↓ルーティングの文法形式
root “controller_name#action_name”

実際に当てはめると、
`app/controllers/application_controller.rb`
なので、controller_name(コントローラ名)は**application**

“`ruby:qiita.rb
class ApplicationController < ActionController::Base def hello render html: "hello

元記事を表示

イメージレイヤーを意識したDockerfileにしてRails&Webpackerのビルドスピードを上げる

# はじめに
本記事は、[エムスリーキャリア Advent Calendar 2022](https://qiita.com/advent-calendar/2022/m3c)の15日目の記事です。

# イメージレイヤーを意識しない`Dockerfile`の例
Rails&Webpackerなプロジェクトの本番環境を構築する際、おおまかに以下のような工程になります。
1. Ruby・Node.js・Yarnのインストール
1. `bundle install` & `yarn install`で依存関係のインストール
1. `rails assets:precompile`でアセットプリコンパイル
1. `rails server`でRailsを起動

これをイメージレイヤーを意識せずに`Dockerfile`に落とし込むと以下のような構成になります。
※各ミドルウェアのバージョンは以下の想定
* Ruby 2.7.7
* Node.js 14.x

“`dockerfile:Dockerfile
# Ruby 2.7のイメージからビルドする
FROM ruby:2.7.7

#

元記事を表示

MiniTestランナーを作りました。

https://github.com/takkii/minitest-runner

https://rubygems.org/gems/minitest-runners

> [Rubyアドベントカレンダー2022](https://qiita.com/advent-calendar/2022/ruby)をもう少し盛り上げるために、
カレンダー2の12/3に記事を追加します。
今回で、2つ目の記事です。

想えば、UnitTestのAutoRunnerのように作りたかったので、2021年4月頃に制作したのですが、仕様などを決めていなかったため特定のフォルダを探索するだけのランナーでした。最近、もう少しだけ作り直しました。

https://github.com/takkii/minitest-runner/wiki/manual

> wikiに書いたのですが、v1.1.3.1ではPATHをセットできますが、v1.1.4ではホームフォルダを探索するようにしました。v1.1.3.1、余分な空白を調整してあります。※ v1.1.3はyankしました。コンソールレイアウトが崩れているためで

元記事を表示

ViewComponentを使ってRubyでコンポーネント開発

はじめに

この記事はCODEBASE OKINAWA Advent Calendar 2022 15日目の記事です。
今回は自分が今プロジェクトで書いている Ruby on Rails のライブラリViewComponent の導入の仕方やメリットについて書いていきます

ViewComponent とは

Rails 6.1 からデフォルトでサポートされるようになったgithub製のgem
render partialという部分テンプレートが使用できるライブラリのより便利になったもので
Componentベースで開発するのでコードの再利用が簡単でテストもしやすいです
公式ドキュメント
https://github.com/github/view_component

始め方

まずはgemを追加します。

“`

元記事を表示

GraphQLでRailsのスキーマからフロント(TS, urql)の型生成までできるようにしてみた

## GraphQLとは何か

> GraphQL is a query language for APIs and a runtime for fulfilling those queries with your existing data. GraphQL provides a complete and understandable description of the data in your API, gives clients the power to ask for exactly what they need and nothing more, makes it easier to evolve APIs over time, and enables powerful developer tools.

*GraphQLは、APIのクエリ言語であり、既存のデータを使用してこれらのクエリを実行するためのランタイムです。GraphQLは、API内のデータの完全でわかりやすい説明を提供し、クライアントが必要なものだけを正確に要求できるようにし、時間をかけてAPIを進化させやす

元記事を表示

NESエミュレータを作る-CPUちょっと理解編

[PONOS Advent Calendar 2022](https://qiita.com/advent-calendar/2022/ponos) 15日目です。
昨日は[@honeniq](https://qiita.com/honeniq)さんの[git cat-fileでGitとちょっと仲良くなる
](https://qiita.com/honeniq/items/18644bb08601260b1ea4)でした。

[NESエミュレータそ作る-準備編](https://qiita.com/ackyla/items/76a33198c077fc0093ee)の続きです。
今回は[こちらのサイト](http://hp.vector.co.jp/authors/VA042397/nes/sample.html)で配布されているサンプルROM「Hello, World!」を使ってプログラムがCPU上でどのように処理されていくかを追っていきます。

# この記事の目標
いきなりファミコンはこう動いている!のようなデカイ部分を見ると大変なので
この記事ではサンプルROMをどう動かすかの部

元記事を表示

Rubyではpという変数名をなるべく避ける

Rubyプログラミングの小ネタです。

Rubyに限らずプログラミング全般の慣習として、寿命の短い変数の場合、意図的にそのオブジェクトを表す名前の頭文字1文字だけにすることがよくあります。

“`ruby
books.map { |b| b.title }
“`

しかし、Rubyではその場合でも`p`だけはなるべく使わない方が良いです。

“`ruby
# 問題なく動くがあまり望ましくない
people.map { |p| p.name }
“`

それはなぜか?`Kernel.#p`メソッドと名前が被ってしまうからです。

https://docs.ruby-lang.org/ja/latest/method/Kernel/m/p.html

もしデバッグで`p`メソッドを使いたくなったりすると、途端にコードがわかりにくくなります。

“`ruby
# pメソッドでp.nameをターミナルに表示する(?)
people.map { |p| p p.name }
“`

Rubyは懐が深い言語なので、実は上のコードもちゃんと動きます。
気になる方は以下のコードをir

元記事を表示

【プログラミング初心者向け】配列の二人三脚を避けよう

[フィヨルドブートキャンプ](https://bootcamp.fjord.jp/)のコードレビューでよく指摘してるシリーズです。

コードレビューをしていると、次のように2つ(もしくは2つ以上)の配列を作って、それらをシンクロさせながらループ処理するロジックをよく見かけます。

“`ruby
# 配列を2つ用意する
names = [‘Alice’, ‘Bob’, ‘Carol’]
points = [90, 98, 85]

# 2つの配列から同じindexの要素を取得しながらループさせる
names.size.times do |i|
name = names[i]
point = points[i]
puts “#{name}さんは#{point}点です”
end
#=> Aliceさんは90点です
# Bobさんは98点です
# Carolさんは85点です
“`

しかし、このロジックは2つの配列の要素数と並ぶ順番に大きく依存します。たとえば次のように片方の要素が増えたり、片方の要素がソートされたりすると、おかしな内容を表示することになります。

元記事を表示

better_errors 導入で Rails のデバッグを快適に!

# 概要

皆さんは `Rails` での開発の際にどのようにデバッグを行っていますか?
`puts` コマンドで確認、`byebug`、`pry` などのデバッグツールを利用する等々、方法があると思います。

今回は上記と並んでデバッグの効率を上げてくれる `better_errors` という `gem` をご紹介します。

# better_errors とは?

## どんな gem ?

`Rails` のスタンダードのエラー画面をもっと見やすく、便利なエラー画面へと変更してくれる機能になります。

https://github.com/BetterErrors/better_errors

## 動作サンプル

`Rails` のデフォルトエラー画面を見てみましょう。

– **Before**

![a4b09b13-d04e-ac35-7e50-227b9dda9139.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2952780/928e3995-33c7-7ab5-e22c-1

元記事を表示

自分で書いたレガシーコードを自分で改善する

# はじめに
リンクアンドモチベーションでソフトウェアエンジニアをしているkoboriです。
つい最近、研修でコード改善の講義を受けたので、その復習も兼ね、なるべく読みにくいレガシーコードを自分で書き、自分で改善をして、その過程を記事にすることにしました。

# レガシーコードを用意する
まず初めになるべく読みにくいレガシーコードを作成していきます。ここでいう レガシーコードとは、 テストがないコードを指しています。
ただ、自分で書いたテストがないコードを自分で改善するのでは、少し改善の難易度が低いと思ったので、下記の4点に留意して可読性を大幅に下げました。

– テストは絶対に書かない
– 変数はなるべく短く、省略する
– マジックナンバーを積極的に多用する
– クラスとメソッドはなるべく大きくする
– このコードを書いてから改善するまで3日以上の間隔を開ける

その結果書かれたコードがこちらです。

“`minesweeper.rb
class Minesweeper
def self.start
x1 = [{ d: “■”, n: 0, m: fal

元記事を表示

あれあれ? CPU 増やしたのに速くならないぞ?

この記事は [モチベーションクラウドシリーズ Advent Calendar 2022](https://qiita.com/advent-calendar/2022/mcs) 15 日目の投稿です。

:::note
弊社ではテックブログもやっておりますので、宜しければこちらもどうぞ!
https://link-and-motivation.hatenablog.com/
:::

## はじめに

Web アプリケーションを開発している皆さん! 日夜性能問題に悩まされていると思います?
本記事では性能問題における **「CPU 使用率の見方」** に焦点をおいて話そうかと思います!

## CPU あるある

CPU にまつわる謎? は大体次の2ケースかな〜、と思います。

:::note
Amazon RDS (MySQL DB) の例で挙げてみます。
:::

### ① クエリ応答が遅いからスケールアップ! → あれ?変わらないぞ?

Web アプリ開発していると、API 応答が遅い → 原因は重いクエリ (SQL) というケースはよくあるかと思います。当然速度改善したいです

元記事を表示

リポジトリ内の古いブランチを issue にリストアップするスクリプトを GitHub Actions で動かす

この記事は、[Supershipグループ Advent Calendar 2022](https://qiita.com/advent-calendar/2022/supership) の15日目の記事になります。

「ちょっとしたスクリプトの置き場として GitHub Actions を活用してみた」という感じの内容になっています。

## はじめに

私が開発に参加しているプロダクトはもう10年以上開発が続いています。そのリポジトリにあるリモートブランチのうち、一部はもう使われないまま放置されてしまっています。これだと、CI 実行時の checkout 等で全ブランチの情報を取得するのに余計な時間がかかってしまいます。一方で、作業のバックアップ等で置いておきたいブランチもあり、その判断はブランチを作成した本人にしかできないはずです。
というわけで、ある程度古いブランチを人ごとに分類してリストアップし、それを個人ごとに確認してもらうとよさそう、と考え、そのリストアップを自動でやってみました。

## どこにリストアップするか

色々考えて、GitHub の issue が一番よさそう

元記事を表示

OTHERカテゴリの最新記事