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

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

Ruby-FFIのManagedStructは、ObjectSpace#define_finalizerを利用して、GCにオブジェクトが回収される際に、予め登録されたメモリを解放する関数をFFIで呼ぶ

Ruby-FFIでは、C言語の構造体と、Rubyのクラスを関連付けることができる。Rubyのクラスのインスタンスオブジェクトが作成されると、C言語の構造体用のメモリが確保される。しかし、RubyのインスタンスがGCによって回収される時に、C言語の構造体のメモリが解放されるとは限らない。

そこでRuby-FFIでは、RubyのオブジェクトがGCに回収された時に、C言語側でメモリを自動的に解放してくれるクラス`ManagedStruct`というものが用意されている。ManagedStructはC拡張でゴリゴリと難しいことをしているのかと思いきや、意外にもシンプルにRubyで実装されている。

その内容を見てみると、`ObjectSpace#define_finalizer` というものを利用している。これはオブジェクトがGCに回収される時に呼び出されるメソッドであるようだ。コレが呼ばれた時に、メモリ解放用の関数が発火するように登録しておけばいい。

この記事は以上です。

元記事を表示

【Ruby のまずいコード】素数判定

# お題

引数として与えられた正の整数が素数かどうか判定するメソッドを書いてください。
[prime](https://docs.ruby-lang.org/ja/master/library/prime.html) ライブラリーは用いず,2 以上の整数で順に割り切れるかを調べるごくごく素朴な実装としてください。

# コード

“`rb
def prime?(n)
2.upto(Math.sqrt(n)) do |k|
return false if n % k == 0
end
true
end
“`

2, 3, 4, 5, 6, … で割った剰余を求め,割り切れたら `false` を返しています。
どれでも割り切れなかったとき `true` を返しています。
4 以上の偶数は試す必要がありませんが,お題ではそういった工夫もせず素朴に実装することを求めているのでそうしています[^sbk]。

[^sbk]: この記事で伝えたい以外のことをできるだけシンプルにしたかったわけ。

ただし,効率に関わる大きな工夫が一つあります。
除数として `n` まで

元記事を表示

【 rails db:migrate実行時のエラー 】

##カラムを新しく追加し、rails db:migrateを実行したが、エラー発生
deviseを導入し、ユーザー管理機能を実装していました。
`login_id`カラムを追加しようと思い、マイグレーションファイルにカラムを追記し、
`rails db:migrate`を実行したところ、
`Mysql2::Error: Table ‘users’ already exists`と表示される。
(usersテーブルは既に存在していますよ〜)

##なぜ?
原因はよく分からないまま、エラーをもとに検索。
##結果
`rails db:dorp`で一度データベースを削除し、
`rails db:create`で再生成。

その後`rails db:migrate`を実行すると、エラーも無く、
`login_id`カラムも追加されていました。

##反省
configディレクトリ内のdatabase.ymlファイルに記してある、
`utf-8mb4`を`utf-8`に変更していなかった事が原因と考えられます。
この二つではデータの保存形式が異なるそうです。

元記事を表示

GitHub Pages の Jekyll 自動ビルドで使えるプラグインをまとめてみた

# はじめに
GitHub 上の HTML を Web ページとして公開してくれる GitHub Pages というサービスがある。作ったツールのドキュメントなどを、自分でサーバを用意することなく Web ページとして公開することができるが、サイトジェネレータを使用すればブログのようなサイトを GitHub Pages で公開することもできる。

HTML / CSS / JavaScript しか使用できない (Ruby や Go などサーバサイドの処理は行えない) ので、基本的にはブログ記事をマークダウン等で書いたら、それをローカルでビルドして HTML に変換してからその HTML を GitHub リポジトリ上にプッシュすることになるが、実は Jekyll というサイトジェネレータに限っては、自分でローカルでビルドせずとも、GitHub が自動でビルドまで行ってくれる。つまりマークダウンをそのまま GitHub リポジトリ上にプッシュすれば GitHub が自動的に HTML に変換して Web ページを作ってくれるというわけだ。

ただし、それには制限がある。自分でローカルで

元記事を表示

Rails 7.0で”DEPRECATION WARNING: image/jpg is not a valid content type”のようなエラーが出た場合

## 発生した問題
Rails 7.0にバージョンアップしてテストを実行したら以下のようなエラーメッセージが出ました。

“`
DEPRECATION WARNING: image/jpg is not a valid content type, it should not be used when creating a blob, and support for it will be removed in Rails 7.1. If you want to keep supporting this content type past Rails 7.1, add it to `config.active_storage.variable_content_types`. Dismiss this warning by setting `config.active_storage.silence_invalid_content_types_warning = true`. (called from public_send at /Users/jnito/.rbenv/versions/

元記事を表示

Rails7のlink_toでmethod: :deleteする

Rails7で

“`erb
<%= link_to t("sign_out"), sign_out_path, method: :delete %>
“`
しようとしたら動きませんでした。

代わりに

“`erb
<%= link_to t("sign_out"), sign_out_path, data: { turbo_method: :delete } %>
“`

を使えば良いようです。

元記事を表示

改訂版・チェリー本発売記念 点字メーカープログラムに挑戦してみた!(Advent Calendar 2021/Qiita主催)

[フィヨルドブートキャンプ](https://bootcamp.fjord.jp/)で学習中のはるぐちです。

伊藤淳一([@jnchito](https://twitter.com/jnchito))さん著『プロを目指す人のためのRuby超入門/技術評論社』(通称チェリー本)の改訂2版が発売されたということで[Rubyプログラミング問題にチャレンジ! -改訂版・チェリー本発売記念-](https://qiita.com/advent-calendar/2021/ruby-challenge)で出題されている「点字メーカープログラム」に挑戦してみました。アドベントカレンダー12月6日担当です。([ブログ](https://haruguchi-yuma.hatenablog.com/entry/2021/12/06/102158)からの転載です)

こういう企画に参加するのは初めてだったのですが、

– チェリー本に育てられたといっても過言ではないので発売記念イベントを是非盛り上げたい
– 自分の書いたコードを他人に見てもらうのは良い学習になる
– 他の人の書いたコードを読むのは良

元記事を表示

[Rails]オブジェクト指向とは 3行で要約

#オブジェクト指向を簡単に言うと
“`
同じようなプログラムを1か所にまとめてコードを再利用しやすくする仕組み
他のプログラムからできるだけ変更できない仕組み
継承したコードの一部を変更して利用するための仕組み
“`

下記URLに詳しく書かれています。
[オブジェクト指向とは](https://robo-done.com/blog/2021/04/doneship_object_oriented/)

元記事を表示

インスタンス変数の2つの特徴について

プログラミング学習中です。 
今回はインスタンス変数について備忘録としてまとめてみます。

#インスタンス変数とは
 まずインスタンス変数とはクラスの中で、以下のように@変数名とすることで定義することができる特殊な変数のことである。

“`ruby:qiita.rb
class book
def initialize(title)
@title = title
end
end
“`

この@で始まるインスタンス変数は大きく分けて2つの特徴があります。
1つ目は、クラス内の全メソッドで使用する事ができる。
2つ目は、インスタンス毎に違う値を持てる。
です。順番に解説します。

#クラス内の全メソッドで使用する事ができる

まずインスタンス変数の1つ目特徴である、「クラス内の全メソッドで使用できる」という事を、コードで見てみます。

“`ruby:qiita.rb
class Book
def initialize(title)
@title = title
end
 
 def output
puts “好きな本は#{@title}です”

元記事を表示

「heroku run rails db:migrate」コマンドとは・・・

##環境
– Ruby 2.6.5
– Rails 6.1.4.1

##調査の背景・目的
Herokuのデプロイ時のエラー文「We’re sorry, but something went wrong.」が出た際の対処法で、「heroku run rails db:migrate」コマンドを入力すると解消された。コマンドの詳細について記載する。

##そもそもmigrationとは・・・
– データベースの構造(テーブル、カラム)を変更するときに利用する機能

##migrationファイルとは・・・
– データベースを生成する際の設計図

##「rails db:migrate」コマンドで何をする?
– migrationファイルの内容をデータベースに反映する

##「heroku run rails db:migrate」コマンドで何をする?
– migrationファイルの内容を**herokuサーバのデータベース**に反映する

以上

元記事を表示

メモ: チェリー本の気づいたこと、印象に残ったことメモ 12/28

[プロを目指す人のためのRuby入門(通称チェリー本) 改訂2版](https://www.amazon.co.jp/%E3%83%97%E3%83%AD%E3%82%92%E7%9B%AE%E6%8C%87%E3%81%99%E4%BA%BA%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AERuby%E5%85%A5%E9%96%80-%E6%94%B9%E8%A8%822%E7%89%88-%E8%A8%80%E8%AA%9E%E4%BB%95%E6%A7%98%E3%81%8B%E3%82%89%E3%83%86%E3%82%B9%E3%83%88%E9%A7%86%E5%8B%95%E9%96%8B%E7%99%BA%E3%83%BB%E3%83%87%E3%83%90%E3%83%83%E3%82%B0%E6%8A%80%E6%B3%95%E3%81%BE%E3%81%A7-Software-Design/dp/4297124378/ref=asc_df_4297124378/?tag=jpgo-22&linkCode=df0&hvadid=52952

元記事を表示

【Rails】定数の定義方法【上書きトラブル注意】freeze

皆さんは、定数ってよく使いますか?

「Rails」も別の言語と同様で、
どこか専用の場所に定義して使うんだろうなー…ってフワッとした認識だったのですが、調べてみると色々注意点が出てきました。

Railsの定数っていうのは「定数=定まった変数」と言いながら、
実はプログラム内で値を書き換えることが可能なのですね。

チーム開発においては、その辺特にバグの原因にもなり得る箇所かなーなんて思うので、
ぜひ皆さんの今後の開発トラブル回避に繋がるなら幸いだなーと思います!

注意点の前に、
まず、Railsの定数の定義方法について3つ共有します!

# 定数を定義する方法①【カンタン】

一番カンタンな方法がこちら。
「config/initializers/constants.rb」ファイルに定数を定義する方法です。これが、アプリケーションのどこからでも定数を呼び出せる一番カンタンな方法でした。

“`config/initializers/constants.rb
module Hoge
FUGA = [“これは定数です”]
end

p Hoge::FUGA
# => “これ

元記事を表示

RJBでハマったこと

## RJBとは

Ruby Java Bridge。
簡単に言うと「Ruby から Java のライブラリを使用する」もの。

## 開発環境

* WSL2(Ubuntu 20.04LTS)
* Docker
* Ruby 1.8.7
* Rails 2.1.0
* rjb-1.4.6
* JDK1.8.9

## ハマったこと

### クラスパスの記述方法

任意のクラスパスを読み込む。
今回はExcelを扱おうとしてるのでpoi等以下のような感じ。

“`ruby
Rjb::load(“#{RAILS_ROOT}/lib/poi-3.5-FINAL-20090928.jar;#{RAILS_ROOT}/lib/poi-ooxml-3.5-FINAL-20090928.jar;#{RAILS_ROOT}/lib/ooxml-schemas-1.0.jar;#{RAILS_ROOT}/lib/poi-scratchpad-3.5-FINAL-20090928.jar;#{RAILS_ROOT}/lib/dom4j-1.6.1.jar;#{RAILS_ROOT}/lib/ger

元記事を表示

Ruby の自己代入演算子 ||= について

“`
test ||= 200
“`

この謎の記号  `||= ` についてまとめてみました

##結論

“`
test ||= 200
“`

`test = test || 200`の省略形
変数testが存在しない(nil または false)場合、変数testに200を代入する
と言う意味になります

##具体例

“`
#変数testに値を代入していない場合(変数の中身がnilまたはfalse)
test ||= 200
=> 200

#変数testに値を代入している場合(変数の中身がtrue)
test = 10
test ||= 200
=> 10
“`

変数の中身が

– nilまたは、false → 右辺の値(200)を変数に代入する
– true → 左辺の変数に代入されている値(10)を返す

irbを用いることで自分で調べることもできます
![qiiita.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/893750/7f706866-671e-6f2

元記事を表示

[py2rb] numpy array copy=False

# はじめに
移植やってます。
# numpy (Python)
“`python
import numpy as np
x = np.array(x, copy=False)
“`
`False`を`false`に替えればいいんだよね。
# false (Ruby)
“`ruby
require ‘numpy’
x = Numpy.array(x, copy=false)

# Cannot interpret ‘False’ as a data type
“`
ぐぬぬ。
# False (Ruby)
“`ruby
x = Numpy.array(x, copy=False)

uninitialized constant False (NameError)
Did you mean? FALSE
“`
`FALSE`やないわい。
# nil (ruby)
“`ruby
x = Numpy.array(x, copy=nil)
“`
どうやら`nil`が正解らしい。
# メモ
+ Python の numpy を学習した
+ 道のりは遠そう

元記事を表示

[py2rb] matplotlib

# はじめに
移植やってます。
# matplotlib (Python)
“`python
plt.figure()
plt.hist([peptide[‘m/z’] for peptide in peptides],
bins = 2000,
range=(0,4000))
plt.xlabel(‘m/z, Th’)
plt.ylabel(‘# of peptides within 2 Th bin’)

plt.show()
“`
![20211227b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538241/20710bc7-1c86-6528-b769-39c20e8b3503.png)
`range=(0,4000)`ここがタプルなので嫌な予感が。
# どうする? (Ruby)
“`ruby
require ‘matplotlib/pyplot’
plt = Matplotlib::Pyplot

plt.figure()
plt.hist(peptides.map

元記事を表示

[Rails]データベースへのアクセス負荷を軽減するために気をつけるべきこと 「3行で要約」

#3点にまとめる
“`
テーブルを正規化する
シンプルなSQLを心がけ
インデックスの張り忘れ、もしくは不正
“`
##テーブルの正規化とは
“`
データの冗長性を排除し、一貫性や効率性を保持するようなデータ形式になる形でテーブルを定義すること。
“`
##SQLとは
[SQLとは](https://hnavi.co.jp/knowledge/blog/sql/)
##インデックスとは
“`
「テーブルとは別に検索ように最適化された状態のデータ」
“`
##終わりに
アップデートしていきます。

元記事を表示

rails7から追加された`compact_blank`について

# 概要

例えば、Arrayにnilが入りうる可能性がある場合にnilを取り除きたいケースがあった場合に最小の行動で表すと`reject(&:blank?)`を使っていたがその処理のショートハンドができました。

“`ruby
> [1, 2, 3, nil].reject(&:blank?)
=> [1, 2, 3]

> [1,2,3,nil].compact_blank
=> [1, 2, 3]
“`

# 追加されたPR
https://github.com/rails/rails/pull/36412

元記事を表示

【Rails】一定期間でログファイルを削除【手動は卒業】

開発中ってログの容量食いますよね…。
みなさんは、どうしてますでしょうか?

適当なタイミングで削除はしてるのでしょうか?

実のところ私は、開発の際は、pryの方を使うことが多く、正直
ログに関してあまり理解していなかったんですよね…。

ただ、これを機に色々調査してみたので共有いたします!

# rails:ログを削除するコマンド
“`
$ rake log:clear
“`

コンソールで、上記コマンドを実行すればログファイルが消えるかと思います。

ただ、毎回毎回手動で削除するのってかなり面倒ですよね?
そこで、何かいい方法がないか調べてみました。

# ログローテーションとは?
>ログローテーションとは、システムが残す時系列の記録データ(ログ)が際限なく増えることを防ぐために、一定の容量や期間ごとに古いログを削除したり新しいログで上書きすること。また、そのような機能。
[IT用語辞典 e-Words](https://e-words.jp/w/%E3%83%AD%E3%82%B0%E3%83%AD%E3%83%BC%E3%83%86%E3%83%BC%E3%82%

元記事を表示

Minitestで「forkしたRubyのサブプロセスのIO」をテストする

## はじめに

この記事を書いている人も完全には理解していないが、一応解決したので、似たような状況で困っている人のヒントになるように記事を残す。

バインディングを作っている時に、「有る操作を行うと、バインディングのC側のグローバル変数みたいなものが変更されてしまうため、後続のテストに影響を与えないようにフォークしてテストを行いたい」というような面倒なケースがある。

Minitestには、`assert_output`という便利なメソッドがあり、stdoutやstderrのテストができる。しかし、これらはサブプロセスのIOまでは掌握してくれなかったりする。

かといって、spawn使って `bundle exec ruby -r minimap2 -e “hogefuga”` みたいなのを書くというのも嫌な感じがする。なにしろこの場合、bundlerを使わないとテストが成功しない。それはどうなのか。

## capture_subprocess_io を使う

うまい解決策はないだろうか? 実は Minitestの `assert_output` のドキュメントを見ると

> NO

元記事を表示

OTHERカテゴリの最新記事