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

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

文字列をランダムなストリームに変換する

与えられた文字列をバラバラにして、ランダムに並び替えて出力する Enumerator を返すメソッドというものを考えてみましょう、と思ったのですが…

まずは、愚直に1文字ずつ取り出す仕方を考えると、文字列を配列に変換して、`Array#delete_at`を使うかなと。こんな感じ。

“`ruby:random_stream1.rb
def random_stream1(str)
tmp = str.chars
Enumerator.new do |y|
tmp.size.times do
y << tmp.delete_at(rand(tmp.size)) end end end str = "Ruby is smart programming language!" stream1 = random_stream1(str) stream1.to_a.join #=>“rlg uin!yaR rsgansbae tugmmamrop ig”
“`

それよりも、便利メソッド`Array#shuffle`を使えば、もっと簡単か。せっ

元記事を表示

【Ruby のまずいコード】除算の落とし穴

# お題

体重と身長だけから算出されるおおざっぱな肥満度の指数として BMI(Body Mass Index)というものがありますね。
体重を $w$ kg,身長を $h$ m とすると,

“`math
\textrm{BMI} = \frac{ w }{ h^2 }
“`

と表されます。18.5 以上 25 未満が標準だそうです。

では,体重を kg で,身長を cm で与えると BMI 値を返すメソッドを定義してみましょう。上の式では身長の単位は m ですが,cm のほうが扱いやすいので,cm にしましょう。すると 10000 を掛けることになりますね。

# コード

ときどき,こういうコード(に類するもの)を目にします。

“`rb
def bmi(weight, height)
10_000 * weight / height ** 2
end
“`

# 問題点

このメソッドは,正確な値を返さないことがあります。
Ruby の除算演算子 `/` は,非除数(割られる数),除数(割る数)がいずれも Integer オブジェクトのとき,普通の商ではなく整商

元記事を表示

Railsである程度実装ができるようになったら

# はじめに
記念すべき DMM WEBCAMP Advent Calendar 2021 :christmas_tree: 1日目を担当します @SawaShuyaです!

Railsで開発を進めていると、3~4カ月ほどで設計から実装まである程度自力で開発できるようになってくると思います!
今回は、railsをある程度自力で書くことができるようになった方向けに、次にどのようなことを学んでいけばいいのかを書いていきたいと思います:shamrock:

構成は
1. rubyを学ぶ
2. railsの開発スキルを磨く
3. 周辺知識を学ぶ
となっておりますので、興味のある部分だけでも見ていただけたらと思います!

# 1. Rubyを学ぶ
railsはすべてrubyで書かれてます。rubyを深めていくことで、これまでは何気なく扱っていたclassやmodule、オブジェクトなどを理解することができ、より効率の良い開発ができるようになります!

では

元記事を表示

技術書書きたいですか?じゃあRe:View使おうね。

# はじめに
ども。僕です。

最近になって技術書を書く機会がありました。そこで、

「あーーーTexで書くのめんどくせー」

とか思ってました。Texって環境構築めんどいし。
Texっぽくてきれいに書けるやつ、ないかなーと調べてみると、

**「Re:View」**

という単語をみつけました。どうやら、同人技術書では多く使われているものっぽい。

こいつを使ってみっか!!
ということで、まとめていきます。

# Re:Viewとは

> Re:VIEWは電子書籍と紙書籍のための、簡潔かつ強力なデジタル出版ツールです。コンピュータ書等の技術書籍(紙・電子)の商業出版や同人出版に利用されています。
引用:https://reviewml.org/ja/

つまり、いろんなテンプレートあって技術書かけるぞ!!ってやつです。
出力形式も色んな種類があって、

– EPUB
– PDF (LaTeX)
– InDesign (IDGXML)
– Markdown
– plain text (TOPBuilder Text Markup Language)

があります。

主に出力するのはP

元記事を表示

点字メーカープログラム

## プルリクエストのリンク

https://github.com/JunichiIto/tenji-maker-challenge/pull/5

## ロジックの解説

– まず、ローマ字を0〜63のコード列に変換し、コード列を整形して出力する方針としました。この(codesの)整形は次で行なえます(左上の点を最上位ビットとする)。

“`rb
codes.map{|e|(‘%06b’%e).tr(’01’,’-o’).scan(/../)}.transpose.map{|e|e*’ ‘}*”\n”
“`

– さてコード列ですが、訓令式ということは(ヂとヅとヲは厳密には訓令式と異なる形となるが)母音と子音を分離できるということです。そこでまず母音と子音の辞書を作成しました。複数の(点字)文字を使う子音もあるので、子音の辞書の値は配列としました。そのうえで、子音の最後の要素の値と母音の値についてビット和を取ったものを(その音素の)コード列としました。子音がYおよびWの場合は別の母音の辞書を使うようにしました。母音を一番下まで下ろす際に、母音によってシフト数が異なるためです。

元記事を表示

Rubyで長文を変数に入れるあれ

いろんな言語扱っていると細かい書き方忘れがちですよね。

`if`ひとつとっても、「`if (…) {…}`だっけ?」、「`if … then … end`だっけ?」、「あれ?`then`いらないんだっけ?」、「最後は`end if`だっけ?」となって、1年ぶりに書く言語でNo資料、NoGoogleで書ける自信がありません。

なので久々に書く言語では、過去に書いたソースを流し見したりして、なんとなくの勘を取り戻したりします。

その時に**「こういうことができた気がするけど、書き方完全に忘れた」**ってのがよく出てきて、rubyでよく忘れるのが**ヒアドキュメント**の書き方です。

“`konnayatsu.rb
json = <<'EOS' { "language": "Ruby" } EOS ``` **ヒアドキュメント**って単語を覚えていればそれでググれば済む話なんですが、この単語が忘れがち。 **<<**を使うことだけは覚えているので**「ruby <<」**とかでググると ```korejanai.rb ary = [1] ary << 2

元記事を表示

gem を作って公開してみた 〜準備編〜

# 0. はじめに
Ruby や Railsの開発を行なっているとアプリケーションの機能拡充をしたりする上でgemを使う方はいるがご自身でgemの開発、公開をしたことがある方もいらっしゃらないかと思います。
その方向けにgemの開発〜公開までのフローについてまとめました。
記事としては以下の3つに分けて説明していこうと思います。 今回は準備編です。

1. 準備編
1. 開発編
1. 公開編

今回は私が公開した以下のgemをベースにお話しします。

https://rubygems.org/gems/ruby_calendar

## 開発環境

私が上記の開発、公開を行った環境は以下の通りとなります。

– OS: Mac
– ruby: 2.5.8
– bundler: 2.2.27

# 1. 準備編
今回の記事では、gemの開発に必要なものについての紹介とgemのビルド(雛形の作成)までを解説していきます。

# 2. gemの開発、公開に必要なもの
開発〜公開に必要なものは以下の通りとなります。

– メールアドレス
– 後述するRubyGems.org(gemの公開して

元記事を表示

Apple silicon (M1 Max)でMailCatcherをインストールする

M1 MacでMailCatcher( https://mailcatcher.me/ )をインストールしようとした際にちょっとつまづいたので、解決策を備忘録的に。

# 環境

* MacBook Pro (2021)
* M1 Max
* macOS Monterey v12.0.1
* ruby 2.6.8p205 (2021-07-07 revision 67951) [universal.arm64e-darwin21]

# うまくいかなかった時

普通にMailCatcherのサイトにあるように

“`
% gem install mailcatcher
“`

を叩いたら

“`
ERROR: While executing gem … (Gem::FilePermissionError)
You don’t have write permissions for the /Library/Ruby/Gems/2.6.0 directory.
“`

とパーミッションエラーが出たので、「あちゃ、ヤベヤベ……」と`sudo`つけて再度`gem inst

元記事を表示

AWS IoT1-Clickで家族へ「帰ります」通知を送信できるようにしてみました

# はじめに
先日、AWSを使ってインフラの構築作業を行ったのですが、AWSにとても興味を持てたので、実際に生活で使えそうな何かを作成しようと思い、色々と考えてみました。
私の友人に**「Lambda王」**というあだ名の人がおり、私はlambdaを触ったことがなかったので、どんな感じで使えるのかを確かめようと思い、今回はLambdaを取り入れることにしました。
私はいつも仕事から帰る時に奥さんに「今から帰ります」と通知をしているので、これを簡単に実行してくれるものを作ってみました。Lambda関数を実行するトリガーとして「AWS iot-1-click」で関数が実行される仕組みにしています。
すでに、色々な情報が溢れており、今さら感が否めませんが、自分の勉強も兼ねてやってみました。

# システム構成図
システム構成は以下の通りです

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/938100/d6b97586-0fba-cea0-15be-e9b66593e1aa.png)

**l

元記事を表示

【オブジェクト指向】カプセル化

##カプセル化
オブジェクト同士の紐付き(関係性)を薄くし、独立性を高め、再利用や交換といった保守性を高める効率の考え方。

“`ruby
class Foo
def initialize(foo=’foo’, bar=’bar’)
@foo = foo
@bar = bar
end
end

f = Foo.new
f.foo
#=> NoMethodError: undefined method `foo’ for #
“`

– “`attr_accessor :foo, :bar“`と書くだけでインスタンス変数“`@foo“`と“`@bar“`にアクセスできるように

“`ruby
class Foo
attr_accessor :foo, :bar
def initialize(foo=’foo’, bar=’bar’)
@foo = foo
@bar = bar
end
end

元記事を表示

【Ruby】メソッドのオーバーライド

##メソッドのオーバーライド

親クラスを継承した子クラスで同じメソッドを定義するとメソッドがオーバーライドされる。

“`ruby
class Parent
def talk
puts ‘早く寝なさい’
end
end

class Child < Parent def talk puts '眠い' end end p = Parent.new p.talk #=> 早く寝なさい

p = Child.new
p.talk
#=> 眠い
“`

##super
オーバーライドされる前のメソッドを呼び出すことができるメソッド。
“`super“`で親クラスの“`talk“`メソッドを呼び出している。

“`ruby
class Parent
def talk
puts ‘早く寝なさい’
end
end

class Child < Parent def talk super puts '眠い' end end p.talk #=> 早く寝なさい
#=> 眠い
“`

##参考

https:

元記事を表示

【RSpec】APIのリクエストテストでgemはあまり使われていないらしい

APIのリクエストテストをやる際、
jsonが期待通りに取れているかをもっとわかりやすく書けないかと思ったときにいくつかgemを発見した。

– [jsonapi-rspec](https://github.com/jsonapi-rb/jsonapi-rspec/)
– [rspec-json_matcher](https://github.com/r7kamura/rspec-json_matcher)

最後のコミットが何年も前だったこと、starの数もあまり多くなかったこと、実際に使ってみて使いづらかったことを踏まえてgemは使わずやることにした。

gemを使ったAPIのリクエストテストの方法をあまり記事で見かけなかったので、みんなそもそもgemを使わないのかなーとも思った。

“`spec.rb

it ‘自分の本の情報が昇順に返ること’ do
json = JSON.parse(response.body)
expect(response.status).to eq 200
expect(json[‘books’]).to eq([
{“id

元記事を表示

slimを使うとき

## slimの書き方

サンプル

“`slim
/ SLIM
doctype html
css:
h3{color:blue}
h3 何かしら入力
p 表示できる
“`

ターミナルでの実行の仕方

“`ターミナル
rake

slimrb -p 1115.slim > 1115.html
“`

もしくは、エクスプローラーの窓に

“`
cmd /c rake
“`

と入力すると一発で出来る。

これはrakeをインストールしてたり、簡単に作成できるrakefileを作っている前提での話。

元記事を表示

バイナリーサーチを利用して要素を検索する

調べたことを整理して落とし込めるためにまとめます。
Rubyを使用しています。

## バイナリーサーチとは
データの検索をする際に用いられる手法のことを言います。

* ソート済みのデータ
* 同一の値が存在しない配列に入ったデータ

などが対象です。

検索したい値 = A
リストの中央に位置する値 = B 
を用意し、AがBより大きければリストの左側にある値を検索対象から除外します。
これを繰り返すことで検索にかかるコストを減らすことができます。

## 実際に書いたコード
“`ruby
def binary_search(array, num)
first = 0
last = array.length – 1

while first <= last center = (first + last) / 2 if num == array[center] return puts "#{num}は配列の#{center}番目に存在します" elsif num > array[center]
first = cen

元記事を表示

個人ブログのスパム対策に関して(Rails)

## 概要
先日、Railsで開発した個人ブログを公開しました。
– [Niken log](https://nikenlog.com/)
– [サービス概要](https://nikenlog.com/blogs/16)

その公開に伴いGoogleのサーチコンソールに登録したは良いものの、問い合わせフォームに、RichardcenceさんやGeorgewetさんなど知らない外国人から「登録したら〇〇ドルもらえる!」というスパムが大量に届いたため、その対策として行ったことを簡単にまとめます。

![スクリーンショット 2021-11-19 14.57.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/425582/6b198bfc-f1cd-8099-7a1c-7647633ca775.png)

## 1. URLのバリデーション
早急にbot等でのスパムメールを送れないようにするため、まず初めに問い合わせフォームの本文にURLのバリデーションを設定しました。

“`model.rb

## U

元記事を表示

新規Railsアプリケーションの雛形作成〜データベース作成まで

# 新規Railsアプリケーション雛形作成
railsをPCにインストールしている前提で説明していきます。
今回、Railsのバージョンは6.0.0を使用。
データベース管理システムはmysqlを使用します。

ターミナル

“`
# アプリケーションを入れたいディレクトリに移動
% cd ~/〇〇〇〇(ディレクトリ名)

# Railsアプリケーションで用いる仕組みの一部を設定するコマンドを実行
% bundle config –global build.mysql2 –with-opt-dir=”$(brew –prefix openssl@1.1)”

# Railsのバージョン6.0.0を用いて、新しいAppを作成(〇の箇所には好きなアプリ名を入れる
% rails _6.0.0_ new 〇〇〇〇_app -d mysql

# 「〇〇〇〇_app」ディレクトリに移動
% cd 〇〇〇〇_app

“`

上記の操作を行って、
/Users/ユーザー名/指定したディレクトリ名/指定したアプリ名
と表示されれば作成完了です。

# データベース作成
ターミナル

元記事を表示

スクールを卒業してrails tutorialをやると大体テストでつまづく(Minitest)

はじめましてプログラミングスクールを卒業して現在転職活動中の27歳です。
スクールのカリキュラムが終了して復習のつもりでrails tutorialをやり出したらなんだか初めてみることが結構出てきて困惑している27歳です。

前置きは半分冗談で半分本音なところもございまして、スクールではテストの書き方をほとんど教わっていなかったのでrails tutorialで初めて見るテストコードに結構苦戦しました。僕みたいな人が他にいるような気がすると思い初qiita投稿はrails tutorialに出てきたテストコードをピックアップして解説していけたらなと思っております。

#読んで欲しい人
・Railsはある程度わかるけどテストを書いたことがない人
・テストの文法がいまいち分からない人
・スクール卒でポートフォリオにテストを追加したい人

##現時点で自分が思っているテストの書き方

①とりあえずテストしたい場所にアクセスする or テストしたい値を記述する(変数に代入する)

②その場所、その値で検証したいことをassert ~~~~で検証する

##基本のテスト(テストしたい場所にアク

元記事を表示

【RSpec】APIテストでformat: :json

##環境
Ruby 3.0.2
Rails 6.1.4.1

“`routes.rb“`で“`format: :json“`指定しておくと、
APIテストの方で省略できる。

“`config/routes.rb
Rails.application.routes.draw do
namespace :api, format: ‘json’ do
resources :users
end
end
“`

“`spec.rb
get api_v1_abc_path(format: :json)

#↓

get ‘/api/v1/abc’
“`

##参考

https://qiita.com/kat0/items/be6114fb4694b9576304

元記事を表示

【RSpec】Doorkeeperを使用したAPIのリクエストテスト

doorkeeperのgemを使用していて、リクエストテストでアクセストークンが必要な場合のやり方

##環境
Ruby 3.0.2
Rails 6.1.4.1

##Factoryの作成
アクセストークンをFactoryで擬似的に作成。
factories下に“`applications.rb“`と“`access_tokens.rb“`を作成

“`spec/factories/doorkeeper/applications.rb
FactoryBot.define do
factory :doorkeeper_application, class: ‘Doorkeeper::Application’ do
sequence(:name) { |n| “Application #{n}” }
redirect_uri { ‘https://アプリのURI/callback’ }
end
end
“`

“`spec/factories/doorkeeper/access_tokens.rb
FactoryBot.define do
fac

元記事を表示

FactoryBot のまとめ

## **FactoryBot とは**

factory_bot_rails といった gem を導入することで使える。

→ model のデータに紐づいたテストデータを簡単に作るためのもの。

spec 配下の factories の中に定義する。

各モデルのファイルを作成して、カラムに基づくデータを Faker を使って定義する。

> Faker とは… ダミーデータを作るのに便利な gem のこと。
>

**定義したデータをテストの際などで呼び出すことが可能になる!**

## **FactoryBot の定義の仕方**

`FactoryBot.define`を`do 〜 end` の中で定義するような書き方をする。

作成例)

“`ruby
FactoryBot.define do
factory :article do
title { Faker::Lorem.word }
body { Faker::Lorem.sentence }
end
end
“`

上記のような書き方だと、
title カラムでは、`Faker::Lor

元記事を表示

OTHERカテゴリの最新記事