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

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

klassってなんやねんってお話

pythonやrubyで、ライブラリのソースコードとか眺めてるとちょいちょいでてくる、
`klass`というキーワード。

感覚的に「英語でこんな単語はないよな・・・」と思いながらも一昔前までスルーしてたのですが、最近またとあるrubyのライブラリの中身をハックじみたことしてたらまたでてきたので調べたのです。

## classって名前がつけられないのでklass

何言ってるかわからないかもしれませんが、例えば

“`ruby
def inspect_class(class)
puts class.class
end

inspect_class(‘a’)
“`

というコードを書きたいとき。
これはシンタックスエラーになってしまいます。
なぜなら`class`というキーワードはrubyでは予約後としてすでに定義されているため。

そういうときに、

“`ruby
def inspect_class(klass)
puts klass.class
end

inspect_class(‘a’)
“`

こうかくとちゃんと通ります。

イメージ的に、

* クラス名の

元記事を表示

jQuery割と理解したから一通り使えるようになるコツまとめ(Rails)

RailsでWEBアプリを作ってます。Ruby on Railsの経験値は9月でちょうど1年くらいです。
なんか割と色々な機能を作れるようになったのでちょっとまとめていきます。
こんな機能はどうやって作るの?みたいなのがあればコメントください。考えます。

# jQueryとは?

公式:[https://jquery.com/:title]

この記事を見ていたら特に必要ないとは思いますが、一応Wikipediaから引用

>jQuery(ジェイクエリー)は、ウェブブラウザ用のJavaScriptコードをより容易に記述できるようにするために設計されたJavaScriptライブラリである。ジョン・レシグが、2006年1月に開催された BarCamp NYC でリリースした。様々な場面で活用されており、JavaScriptライブラリのデファクトスタンダードと呼ぶ者もいる[2]。ロゴの下に表記されているキャッチコピーは「write less, do more」(「少ない記述で、もっと多くのことをする」の意)。
>出典:[https://ja.wikipedia.org/wiki

元記事を表示

Railsアプリでログ情報などの大量のcsvエクスポート(出力)をWEBアプリ上で行う

# 出力データが大量すぎて時間がかかる
クライアントからログ情報を分析したいとのことでログ情報をDBから出力するような機能を作ったが
実際に実運用が始まってからログを出力した結果、1, 2日くらいのログであれば時間はかかるがcsv出力できた。しかし、全期間になると時間がかかりすぎて使い物にならない。というような事態に陥った。実際に試してみると15分たっても出力されず、「確かにこれは使えないなぁ。。。」という状態だったので、直接SQLを叩いてログ出力をするようにした。

### それまでに使っていた方法

[RailsでDBのデータをCSV出力しよう|已むに已まれぬ雑記帳|note](https://note.com/shinryyy/n/nbd2c1d466676)
このような感じでよくあるcsv出力をCSVライブラリを使用して出力していた。(これかな。。
[library csv (Ruby 2.7.0 リファレンスマニュアル)](https://docs.ruby-lang.org/ja/latest/library/csv.html)

今回、生SQLで

元記事を表示

terminalから英単語を検索する

# はじめに
terminalから全ての動作を完結させたいというのは,どんなプログラマーでも思っていることと信じたい.
(emacsは使えないのでvscode派なのは内緒)

ということで,rubyでterminalから英単語の意味を調べる.

# プログラム本体

“`ruby:dic.rb
system “curl -s https://ejje.weblio.jp/content/#{ARGV[0]} | grep 主な > ~/dic/tmp.txt”

File.open(“#{Dir.home}/dic/tmp.txt”, “r”) do |f|
f.readlines[0].match(/.*

(.*)<\/td>.*/)
puts $1
end

system “rm ~/dic/tmp.txt”

“`

1行目:システムコールでcurlを使用.[Weblio英和辞典](https://ejje.weblio.jp/)を使用させていただいている.引数をurl内で展開して,grepで絞り込

元記事を表示

windowsでrubyが使えるようになるまで…

Windows10でRubyを使うために、`rbenv install 2.7.1`ができるようになるまでが長い道のりだったのでまとめました。

#環境
* Windows10
* Ubuntu

#概要
実施することは以下になります。

1. 初期化設定:`echo ‘eval “$(rbenv init -)”‘ >> ~/.bash_profile`
2. 設定の保存:`source ~/.bash_profile`
3. rbenvのインストール:`brew install rbenv ruby-build`
4. バージョンを指定してインストール:`rbenv install 2.7.1`
5. 使用するrbenvのバージョンを設定:`rbenv global 2.7.1`
6. rubyのインストール:`sudo apt install ruby`

これらのコマンドがエラーを出さずに全部通れば、以降の話は何も関係ありません。
初めてのセッティング故に環境が整っておらず、発生したエラーとその対処を記していきます。同じエラーがあれば参考にしていただければと思います。
上から

元記事を表示

もう迷わない!RSpec導入の流れ

#RSpecとは
 Railsにおいて、単体テストコードを記述するときに用いるGemのこと。
##テストコードを記述する直前までの大まかな流れ
1. Gemfileに追記
2. Gemをインストール
3. rspecをインストール
4. テストコードをターミナル上で可視化できるようにする
5. FactoryBotとFakerのGemをGemfileに追記
6. Gemのインストール
7. (テスト用の画像を用意)

###1. Gemfileに追記

gem ‘rspec-rails’と記述する。
必ず、group :development, :test do ~ endのグループ内に

“`Ruby:Gemfile
group :development, :test do
# Call ‘byebug’ anywhere in the code to stop execution and get a debugger console
gem ‘byebug’, platforms: [:mri, :mingw, :x64_

元記事を表示

Ruby で解く AtCoder ACL Beginner Contest C UnionFind(DSU)

# はじめに
*[AtCoder Problems](https://kenkoooo.com/atcoder/#/)* の Recommendation を利用して、過去の問題を解いています。
AtCoder さん、AtCoder Problems さん、ありがとうございます。

# 今回のお題
*[AtCoder Beginner Contest C – Connect Cities](https://atcoder.jp/contests/abl/tasks/abl_c)*
Difficulty: 363

今回のテーマ、UnionFind

つい最近、[同様の問題](https://atcoder.jp/contests/abc177/tasks/abc177_d) があったり、[AtCoder Library Practice Contest](https://atcoder.jp/contests/practice2) があったりとは言え、灰レートは凄いです。
ちなみに、前回はDif

【Ruby on Rails】deviseの不要なルートを作らない方法

# 目標
deviseで自動的に作成される不要なルートを作らない。
→新たな新規adminの作成を防ぐ。
※管理者(admin)情報はseedにて記述する場合。

# 開発環境
ruby 2.5.7
Rails 5.2.4.3
OS: macOS Catalina

# 前提
※ ▶◯◯ を選択すると、説明等が出てきますので、
  よくわからない場合の参考にしていただければと思います。

– [deviseでログイン環境構築](https://qiita.com/japwork/items/275110b810965fbdf72f)

# seedに記述
seedに管理者の情報を記述。

“`rb:db/seeds.rb

Admin.create!(
email: ‘aa@aa.com’,
password: ‘aaaaaa’,
)
“`
“`:ターミナル
$ rails db:seed
“`
これで管理者ページにログインできます。
※seedに関しては開発環境と本番環境で分ける必要があります。
詳しくは[こちら](https://blog.cloud-ac

【Ruby on Rails】ajaxを使ってタグの追加と削除、(成功・エラー)メッセージの表示を行う。

## 環境
Ruby 2.5.7
Rails 5.2.4

### ライブラリ
jQuery 1.12.4

### 前提
今回はTagテーブルを使って解説していきます。

まずはajaxを使わなくてもタグの追加と削除ができることを事前にご確認ください。

エラーメッセージの日本語化やアソシエーションについては触れませんので必要な方はご自身でお願い致します。

turbolinksは無効にしています。(有効時の動作は確認していません。)

## 手順
タイトルにもある通り、次の手順でajaxを利用してタグの追加・削除・エラーメッセージの表示を実装していきます。

1.tag.rbにバリデーションの設定
2.部分テンプレートの用意(`views/layouts/_error_messages.html.erb`, `views/layouts/_flash_messages.html.erb`, `views/tags/_tag.html.erb`)
3.タグの一覧画面、兼新規作成フォームを作成(views/tags/index.html.erb)
4.アクションごとのjs.erbを用意

Rack::Timeout でパスごとにタイムアウトを指定する

[rack-timeout](https://github.com/sharpstone/rack-timeout) を使用しておりパスごとにタイムアウトの指定を変更するため以前(rails 5.2.3、 rack-timeout 0.5.1 まで)は以下のように指定していました(多少簡略化してあります)。

“`Gemfile:Gemfile
gem ‘rack-timeout’, require: ‘rack/timeout/base’
“`

“`ruby:config/initializers/rack_timeout.rb
module Rack
class DynamicTimeout < Rack::Timeout def call(env) # URL が /admin から始まる場合は 30 秒、それ以外は 10 秒となるように @service_timeout = env['REQUEST_URI'].start_with?('/admin') ? 30 : 10 super(env) end en

Rubyにおける日時の扱い。DateとTimeの使い分け。

# はじめに
Rubyにおける日付や時刻の操作にはDateクラス、Timeクラスを使います。
Dateクラスは年月日だけを扱い、Timeクラスは年月日時分秒を扱います。
Timeクラスだけ使っておけばいいような気がしますが、Dateクラスにも得意分野があるので、その使い分けについて解説していきます。

# 目次
1.Dateは年月日、Timeは年月日時分秒
2.Dateクラスは日付処理が得意
3.結論

# 1.Dateは年月日、Timeは年月日時分秒
まず、時分秒まで表示したい、つまり、日時を扱いたい場合はTimeを使います。DateクラスのサブクラスであるDateTimeクラスも使えますが、require ‘date’しないといけないことや、サマータイム、うるう秒を扱えないことなどを考慮すると、Timeクラスを使っておくのが無難だと思われます。

# 2.Dateクラスは日付処理が得意
日付や年単位での処理はDateクラスを使うと便利です。

“`pry

[1]pry(main)> Date.today.next_month # 来月の同日
=> #

DevContainer で Ruby 開発する際に厄介な BUNDLE_APP_CONFIG

## TL;DR

– Docker 公式の ruby イメージでセットされている環境変数 `BUNDLE_APP_CONFIG` は DevContainer 内での開発において邪魔になることがある
– `BUNDLE_APP_CONFIG` の影響を無くしたい場合は `devcontainer.json` に以下を記述すると良い

“`json:.devcontainer/devcontainer.json
{
// …
“remoteEnv”: {
“BUNDLE_APP_CONFIG”: null
},
// …
}
“`

## 厄介な BUNDLE_APP_CONFIG

VSCode Remote – Containers での Ruby 開発では大抵の場合、[Docker 公式の ruby イメージ](https://hub.docker.com/_/ruby) をベースイメージにして DevContainer を作ることになる[^1]かと思いますが、このイメージには厄介な問題があります。

それが環境変数 `BUNDLE_APP_C

ルーティングのネストによって起きていること

動作環境
Ruby 2.6.5
Rails 6.0.3.2

ルーティングのネストによって何が起きているのかがわかりづらかったので、自分の確認を兼ねて投稿してみました。

##ルーティングのネストをした場合
“`ruby:routes.rb
Rails.application.routes.draw do
resources :hoges do
resources :fugas, only: [:index]
end
end
“`
上記のコードでは、hogesに対してfugasがネストされており、ターミナル上でrails routesを実行すると、以下のようになります。

Prefix ➡︎ hoge_fugas
Verb ➡︎ GET
URI Pattern ➡︎ /hoges/:hoge_id/fugas(.:format)
Controller#Action ➡︎ fugas#index

もちろん、上記以外も表示されますが今回はネストの箇所のみを扱います。
これだけだといまいちわかりづらいので、ルーティングのネストをしていない場合と比較していきます。

##

Rails6でHTMLとCSSのみを使ってシンプルにフォームをつくるメモ

## はじめに
Railsで bootstrapなどのCSSフレームワークを使わない、素のコードが意外とみつかないので、そのメモ

## 前提
Receptionモデルがあり、カラムは名前と目的。

## 目標
このようなシンプルなフォームをHTMLとCSSのみをつかってシンプルに書く
![スクリーンショット 2020-09-29 13.14.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/476857/1ab46176-9201-644e-0960-e23cd189bca9.png)

##HTML
* フィールドはtext_field,select_field,submitの3つ

“`:html
<%= form_with model: @reception do |f| %>

  • <%= f.label :name, "名前" %>

Homebrew, rbenvの組み合わせでRuby 3.0.0 Preview 1 をインストールする

## 背景
Ruby 3.0.0 Preview 1 がリリースされました。
https://www.ruby-lang.org/en/news/2020/09/25/ruby-3-0-0-preview1-released/

## インストールしてみる

### 最初にやったこと
以下を参考
https://github.com/rbenv/ruby-build#upgrading

“`sh
brew update && brew upgrade ruby-build
“`

### インストール可能なRubyを確認
“`sh
$ rbenv install –list
2.5.8
2.6.6
2.7.1
jruby-9.2.13.0
maglev-1.0.0
mruby-2.1.2
rbx-5.0
truffleruby-20.2.0
truffleruby+graalvm-20.2.0

Only latest stable releases for each Ruby implementation are shown.
Use ‘rbenv install –li

Rails+JavaScript(jQuery)でタイムレスな検索を

## 記事で扱う検索機能
こんな感じの検索機能です。
今回は、shopsというテーブルからnameというカラムを抽出してビューに表示していきます。
※店舗情報を複数登録済み。そこから任意の店舗を任意のカラムで検索します。

![edc53a4c67fcde418466da618219084f.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/503967/1d114bb9-991c-acda-3aa6-c7ef8d490341.gif)

– 非同期で行う
– 文字を打つごとに検索を行い、描画する
– 検索結果をクリックで該当のページにリンクする

おそらくですが、初学者のプログラミングにおける知識レベルや常識レベルって経験者の方が考えるそれよりもずっと低い水準にあると思うんです。
なので、自身にできる範囲内で「そんな事まで説明する必要あるの?」という事も書いて行こうかと思います。

## 開発環境

mac
Ruby 2.5.1
Rails 5.2.3
jQuery

## 必要なファイル
まず、実装に必

Rubyで、TSVファイルからCSVファイル(BOM付き)への変換

# はじめに
Rubyにおけるタブ区切りのファイル(TSVファイル)から、BOM付きのCSVファイルへの変換方法です。

# 目次
0.完成コード
1.BOMを付けたCSVファイルの作成
2.TSVファイル内データの読み込み
3.CSVに1行づつ読んでは書いていく
4.プログラムを実行

# 0.完成コード
“`ruby:tsv_to_csv.rb

require ‘csv’

# CSVファイルを作成し、bomを付ける。
File.write(“meibo.csv”, “\uFEFF”)

# ‘meibo2.txt’の情報を1行毎に読み込み、splitで配列にして、CSVファイルに1行ずつ入れていく。
CSV.open(“meibo.csv”, “a”, force_quotes: true ) do |meibocsv|
File.foreach(‘meibo.txt’) do |student|
meibocsv << student.chomp.split("\t", -1) end end ``` # 1.BOMを付けたCSVファイルの作成 BOM(

[Rails]カスタムフォントの設定

# はじめに
アプリ開発でフリーフォントを使用してデザインを変えたのでその使用方法をまとめました。

# 目次
1 フリーフォントの準備
2 フォントの読み込み

# 1 フリーフォントの準備
まず、フリーフォントサイトから自分が使用したいものをダウンロードします。
その後、ダウンロードしたファイル(拡張子ttfまたはotf)をapp/assets/fonts下に配置します。

### 注意事項
フォントはそれぞれ利用条件が異なります。商用可能であっても利用できる範囲に制限があったり、使用時に報告が必要なものもありますので、ご利用の際には必ず配布ページをご確認ください。

# 2 フォントの読み込み
CSSファイルに以下を記述します。

“`css

@font-face {
font-family: “abcdefg”;
src: url(‘/assets/abcdefg.ttf’) format(“truetype”);
font-weight: normal;
font-style: normal;
}
“`

フォントを適用したい箇所にfont-family

「もっとRust脳を鍛える数学パズル」の試み。

[「もっとプログラマ脳を鍛える数学パズル」](https://www.shoeisha.co.jp/book/detail/9784798153612)をRustで書き直すのは、ボケ防止にちょうど良いかもしれない、と思った。

# P.13 例題1 : メモ化と動的計画法

元のRubyコード(p.015)。

“`ruby:pre1_2.rb
M, N = 10, 100

@memo = {}
def check(remain, pre)
return @memo[[remain, pre]] if @memo[[remain,pre]]

return 0 if remain < 0 return 1 if remain == 0 cnt = 0 pre.upto(M) do |i| cnt += check(remain - i, i) end @memo[[remain, pre]] = cnt end puts check(N, 2) ``` Rustベタ移植。 ```rust:main.rs

Rubyのメソッド内で引数に再代入してから `super` と呼び出した場合 → 再代入したものが使われる

* 「たしか `super` を引数なしで呼び出したら、現在のメソッドの引数と同じものが渡されるんだっけ」
* 「あれ? 引数に**代入**して上書きした場合[^assign]、元のと新しいののどっちが使われるんだろう?」

[^assign]: 代入でなく破壊的メソッドを作用させただけの場合は、元のも新しいのもオブジェクトとしては同一なので今回の疑問の対象外

と分からなくなったので、実験してみた。

“`ruby
class Foo
def mtd(str)
puts “[Foo:1] str => %p (%#08x)” % [str, str.__id__]
end
end

class Bar < Foo def mtd(str) puts "[Bar:1] str => %p (%#08x)” % [str, str.__id__]
str *= 2
puts “[Bar:2] str => %p (%#08x)” % [str, str.__id__]
super
end
end

Bar.new.mtd(“abc”)
“`

“`tex