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

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

テスト駆動開発から始めるRuby入門 ~アルゴリズムのパフォーマンスチューニングとベンチマークを実践する~

# 外伝

[![Open in Gitpod](https://gitpod.io/button/open-in-gitpod.svg)](https://gitpod.io/#https://github.com/hiroshima-arc/tdd_rb/tree/episode-x)

## 初めに

この記事は [テスト駆動開発から始めるRuby入門 ~2時間でTDDとリファクタリングのエッセンスを体験する~](https://qiita.com/k2works/items/83741e3e2d2579d748d6) の外伝エピソードです。ちなみに前半の元ネタは _テスト駆動開発_の_付録B フィボナッチ_をRubyで実装したものです。後半はオリジナルエピソードでは言及できなかったアルゴリズムの **プロファイリング** と **ベンチマーク** の実施に関して解説しています。

前提として、[テスト駆動開発から始めるRuby入門 ~ソフトウェア開発の三種の神器を準備する~](https://qiita.com/k2works/items/385dc16333e065d69bd

元記事を表示

S3バケットを空にするRubyスクリプト

APIなどでバケットを削除する際、空にしてからでないと削除できません。バケットを空にするプログラムを作るのは、けっこうな手間なのですが、Rubyだと一発でいけます。

“`ruby:clear-bucket.rb
require ‘aws-sdk-s3’
bucket = Aws::S3::Bucket.new(‘<バケット名>‘)
bucket.clear!
“`

元記事を表示

敢えてRubyで学ぶ「ゼロから作るDeep Learning」第4章 数値微分/勾配

Rubyだとちょっと数値微分に一工夫必要。

Pythonだと

“`python
def numerical_diff(f,x):
h = 1e-4
return (f(x+h) – f(x-h)) / (2*h)
“`

と引数に関数を渡せてしまうが、Rubyで同じことはできない。
Proc(lambda)を定義し、ブロック化して関数を渡すことで実行可能。

## 数値微分

“`ruby:numerical_diff.rb
def numerical_diff(f,x)
h = 1e-4
return (f.call(x+h) – f.call(x-h)) / (2*h)
end

def function_1(x)
0.01*x**2 + 0.1*x
end

# 実行
f = lambda {|arg| function_1(arg)}
numerical_diff(f,5) # => 0.1999999999990898
numerical_diff(f,10) # => 0.2999999999986347
“`

## 勾配

“`ruby

元記事を表示

postgresで任意のid順にorder by

# 任意のid順にorder by
例えば手元にこのようなidsがあり、このidsの順番でuserを取得したいとき

“`ruby
ids = [2,3,1,10,9]
“`

これでうまくいくかも

“`ruby
users = User.order(“COALESCE(array_position(ARRAY[#{ids.join(“,”)}], id), 0) asc”)
“`

たまにこういうこと並び順が必要になること
ありますよね

元記事を表示

引数、スコープについて

変数はメソッドの中で定義するとそのメソッド内でしか基本使えません。
これをスコープといいます
ある変数を利用できる範囲のことです。スコープの範囲外の変数を使おうとすると、エラーが起こります。

その場合どうするかというと引数を使います。
引数はメソッドの外にある変数(スコープ外の変数)をメソッドの中で使うことができます。

postに入っているハッシュのデータを配列オブジェクトの中に入れたい場合

“`ruby

def example
post = {}
post[:name] = “太郎”
post[:age] = “25”
post[:gender] = “男性”
 posts << post end #配列オブジェクト posts = [] ``` こちらはエラーになってしまいます。 変数postsはexampleメソッドの外にあるためです。 そこで引数を使うと ```ruby def example(a_posts) #ハッシュオブジェクト post = {} post[:name] = "太郎" post[:age] = "25

元記事を表示

LeetCode – 56. Merge Intervals

# 問題
[56. Merge Intervals](https://leetcode.com/problems/merge-intervals/)

# 解答

1. とりあえず `interval` を `merged_intervals` にほりこむ
2. `merged_intervals` の最後の要素 `[a, b]` を取り出して、次の `interval` の `[x, y]` と重なっているか判定
3. `interval` が重なってなかったら、`[a, b]`, `[X, Y]` をそのまま`merged_intervals` にほりこむ
4. 重なってたら、`[a, b]`, `[X, Y]` をマージしてほりこむ

– `intervals` は事前にソートされていないとうまくいかない
– `O(n^2)` を避けるため、ソートして、都度マージする

“`ruby

# @param {Integer[][]} intervals
# @return {Integer[][]}
def merge(intervals)
merged_intervals

元記事を表示

【備忘録】Ruby : クラス変数の使い方

“`ruby:sample.rb

class Num
@@num = 1
#クラス変数
#インスタンスメソッドからでもクラスメソッドからでもアクセス可能
#異なるオブジェクトでも同じクラスであれば値は共有可能
#あまり使われることはないらしい
def increment
@@num += 1
end

def decrement
@@num -= 1
end

def num
puts @@num
end

def self.num
puts @@num
end
end

foo = Num.new
foo.num #=> 1
foo.increment #+1
foo.num #=> 2
foo.decrement #-1
foo.num #=>1
foo.decrement #-1

fuga = Num.new
fuga.num #=>0
#新しいオブジェクトを作ったのにも関わらず、fooオブジェクトでの処理を引き継いでいる。
#引き継がない場合は 1 からスタートするはず。

“`

元記事を表示

【Rails】flashメッセージをフェードアウトで消す方法【JavaScript】

#はじめに
この記事では、flashメッセージを表示したあと一定時間後にフェードアウトさせる方法を解説します。

flashメッセージ系の記事はたくさんあるのですが、
どれも`bootstrap`を使用してたり
何やら複雑な方法だったり(Hamlハムル??とかrenderとかややこしい!)。。

もっと簡単な記事はないのか!とモヤモヤしたので、自分まとめます。
自分と同じような人の為に!!(自分用のメモですすみませんw)

#flashメッセージの表示方法
それではレッツ実装!!

まずはコントローラーから。
#コントローラー

“`ruby

def destroy
@review = Review.find(params[:id])
@review.destroy
if review.destroy
redirect_to root_path, notice: “︎レビューを削除しました!”
end
end

“`

メッセージを表示させる記述は4行目の`if`文からです。

レビューが削除された後、`root_path`(ホーム画面)に戻

元記事を表示

【備忘録】Ruby : クラスメソッド、インスタンスメソッド使い方

“`ruby:sample.rb

class Person
attr_accessor :from

def self.lefty(name,age)
#メソッド名の頭に self. をつけるとクラスメソッドになる。
new(name,age,”左”)
#newすることでinitializeメソッド呼び出し
end

class << self #複数のメソッドをクラスメソッドにする方法 def second_method puts "second" end def third_method puts "third" end end def initialize (name,age,foot) #new メソッド使った時に使用 @name = name @age = age @foot = foot end def sayHello puts "私は #{@name}です。 #{@age}歳です。 利き足は #{@foot}です。" #ここで使っている@name,@age,@sexはiniti

元記事を表示

Mohoから出力したSVGを制御したい妄想の話

現在、実際に作ってる最中のブツがこちら。
適当なタイミングで更新をしてるので、ここで書いてる内容から構成が変わってる可能性あり。

【GitHub】SourceOf0-HTML/path_control: SVGを制御したい願望
https://github.com/SourceOf0-HTML/path_control

【GitHub Pages】ベクターデータをいじり倒したい気持ち
https://sourceof0-html.github.io/path_control/

さて。
妄想話の前に、そもそもの話から。

#Mohoとは
2Dアニメーションソフトウェアのこと。
昔はAnime Studioという名前だったらしい。
自分が使用しているのはMohoPro12。

2Dアニメーションソフトウェア – Moho (Anime Studio): イーフロンティア
https://www.e-frontier.com/smithmicro/moho/

初めて使ってみたときに調べたことを解説動画として雑にまとめたこともある。

MohoPro12使ってみたので自己流解説 –

元記事を表示

【備忘録】Ruby : 基本的なclass作成、定数の扱い方

“`ruby:sample.rb

class SampleClass
attr_accessor :name,:greet
# attr_accessor:name,:greetはinitializeメソッド内の
# @name,@greetに関連
def initialize(name,greet)
# initializeメソッド => classをnewした時に必ず呼び出される。
# メソッドの引数で受け取った値をインスタンス変数
# にセットしている。
@name=name
@greet=greet
end
end

sample = SampleClass.new(“Tanaka”,”挨拶”)
# newメソッドでクラスの定数に引数を渡したので
# sampleオブジェクトではname=”Tanaka”,greet=”挨拶”が入っている。

“`

元記事を表示

ローカル環境にて、nokogiriが原因(?)でbundle installできないときの解決策

ローカル環境にrailsの開発環境を作ろうと以下の記事[Ruby初学者のRuby On Rails 環境構築【Mac】](https://qiita.com/TAByasu/items/47c6cfbeeafad39eda07)
を参考に進めていると、以下のエラーに遭遇した。

“`ターミナル
$bundle install

#以下が実行結果

Fetching gem metadata from https://rubygems.org/………….
Fetching gem metadata from https://rubygems.org/.
Resolving dependencies…
Using rake 13.0.1
Using concurrent-ruby 1.1.6
Using i18n 1.8.2
Using minitest 5.14.0
Using thread_safe 0.3.6
Using tzinfo 1.2.6
Using zeitwerk 2.2.2
Using activesupport 6.0.2.1
Using bui

元記事を表示

Railsで検索機能を実装する場合の4つのパターン

## パターン
– Ransackを使う
– コントローラーに書く
– Concernに書く
– Formオブジェクトを使う

## Ransackを使う
Ransack使うとソートも楽に書けそうだけど、
追々カスタマイズが面倒そうなのもあり最初から自分で書くことが多い。
あまり使ったこと無いので、ケースによっては触ってみたい。

## コントローラーに書く
“`ruby
comments = Comment.where(post_id: params[:post_id]) if params[:post_id].present?
“`

こんな感じでコントローラーに直接where文を書くケース。
何も考えずに書くとこうなることが多いと思う。
条件式が増えてくると複雑度上がってrubocopに怒られる。

## Concernに書く
“`ruby
module Comments
module SearchModule
extend ActiveSupport::Concern

def self.do_search(params)
comments

元記事を表示

Ruby の型関連の情報まとめ

Ruby のバージョン3.0から型定義・型検査ができるようになる予定なのでそのまとめ。(2020年2月12日時点)

#### 用語一言解説
– 型シグネチャ:型定義ファイル
– 型プロファイラ:型推論 + 型シグネチャのプロトタイプ生成
– 型検査器:型シグネチャを用いた静的型検査ツール

## 型シグネチャ
– 型情報を定義したファイル
– Ruby3 では Ruby ソースコード本体に型情報を書かない
– 拡張子は `.rbs`
– ⇨記述のための言語は Ruby ではない
– 型シグネチャをもとに後述の型検査を実行する
– Ruby3 に同梱される

#### レポジトリ
ruby-signature: https://github.com/ruby/ruby-signature

## 型プロファイラ
– 型シグネチャ無しで型検査する(レベル1型検査)
– 型エラーの可能性を指摘
– 型の推論結果を用いて型シグネチャのプロトタイプを生成する
– 型プロファイラも Ruby3 本体に同梱される予定

#### レポジトリ
ruby-type-profiler: ht

元記事を表示

【Rails】Pinterest APIで自分のアカウントのピン一覧を取得し、JSONを返すサンプルコード

## はじめに
**Pinterest API**を使ってみたので自分用に備忘録を残します。

今回対象とする機能は、**「自分のアカウントのピン一覧を取得する」**です。
[公式ドキュメントはこちら](https://developers.pinterest.com/docs/api/pins/)

※利用制限等についてはご注意下さい。

> (著作権所有者の許可を得ている場合を除いて)画像を保存または改変しないこと、また Pinterest にある画像をユーザーが印刷できるようにしないこと

> ピン以外のデータを保存しないこと

などなど、制限があります。
[デベロッパー向けガイドライン | Pinterest Policy](https://policy.pinterest.com/ja/developer-guidelines)

## 環境
“`yaml
OS: macOS Catalina 10.15.3
Ruby: 2.6.5
Rails: 6.0.2.1
“`
## 前提
– Access Tokenの取得方法
– `rails new`など最低限の下準備

元記事を表示

【Rails】deviseユーザーの登録日を表示する【めちゃ簡単】

Deviseのユーザー登録日を表示することに成功しました。めちゃ簡単なので、ぜひ実装してみてください。

| rubyのバージョン | 2.5.1 |
|:—————–|——————:|
| Railsのバージョン | 5.2.3 |

手順は以下のような感じになります。

> ・❶:コントローラーにTime_zoneの記述
・❷:ビューにcreated_atの記述

##手順1:コントローラーにTime_zoneの記述

まずは表示したいビューのコントローラーに以下の記述を行います。

“`
class UsersController < ApplicationController before_action :set_zone 〜〜〜〜省略〜〜〜〜 private def set_zone Time.zone='Tokyo'  end ``` こんな感じで、日本語表記を綺麗なものに変更します。 僕の場合だと、usersコントローラーのmember.html.erbにユーザー登

元記事を表示

ruby,実引数、仮引数学び

– 実引数を定義し、それに答える仮引数の値はどんなものでも構わないが、

仮引数で受け取ったメソッド内では仮引数で使った値を用いてプログラムを組み立てる。

どういう事かというと、

“`
def aaa(input)
input ** 2
end

bbb_input = 3
puts aaa(bbb_input)

9
“`

大概の例題はこのような形でinputに似通ったものを使っていたりするので、

実引数、仮引数の関係がとてもわかりづらい。
なので、無茶苦茶にしてみる事にした。

“`
def aaa(szxdcrftvgbsdfghdfghjdxfghldcfvgkml)
bbb_input ** 2
end

bbb_input = 3
puts aaa(bbb_input)

111.rb:2:in `aaa’: undefined local variable or method `input’ for main:Object (NameError)
“`
しかしこのままではエラーが出てしまう。

何故エラーが出るかというと、puts aaaはd

元記事を表示

rubyメモ

– 文字列を繋ぎ合わせる場合、+を使うことで繋ぎ合わせることが出来る。

“`
input = “aaa” + “bbb” + “ccc”
puts input

“aaabbbccc”
“`
– “”内で特定の記号で区切られた文字列を配列にし分割する。

“`
input = “aaa;bbb;ccc;”
a = input.split(‘;’);
a.each do |a|
puts a
end

aaa
bbb
ccc
“`
– 最初の文字を大文字にし、後の文字は小文字にする。

“`
input = “aaabbbccc”.capitalize
puts input

Aaabbbccc
“`
– 文字列の順番を逆に並べ替える

“`
input = “abcde”.reverse
puts input

edcba
“`
– 全ての文字列を大文字で返す。

“`
input = “abcde”.upcase
puts input

ABCDE
“`
– 引数で渡された文字列の二乗の数を返す。

“`
def aaa(input)
input **

元記事を表示

自動デプロイ後ローカルでいろいろ変更してデプロイしたらmigrationとunicornで詰まりデプロイできなかったので解決までの備忘録

#自動デプロイでかなり詰まったので備忘録として残します。

– 初学者のため理解が不足しているところがあり、解決の過程で必要のない工程をしている可能性があります。
– もし他の改善策などご指摘いただけることがあればよろしくお願いしたします。

# エラー過程①

– 自動デプロイ完了後ローカルでデータベース構成などを変更
– 変更後自動デプロイ実行する。
– 途中でmigrationの実行で止る。

# 解決までの流れ①

– 原因の仮説としてはローカルでデータベースのテーブルやカラムの変更を行いrails db:migrate:resetを行ったためだと仮定し本番のデータベースもリセットすることにした。

– 関連の記事を探し、こちらで書かれているコードを参照、一度データベースを消してしまうという方法を取ってみたhttps://qiita.com/wacker8818/items/72d933f036ca0b75d124

– 無事データベースは削除され、改めてデータベースの作成とマイグレーションを実行したが落とし穴に会う。
– ローカルに戻りアプリケーションのディレク

元記事を表示

Rails6 のちょい足しな新機能を試す 120(Rails.logger in Fiber編)

# はじめに

Rails 6 に追加された新機能を試す第120段。 今回は、`Rails.logger in Fiber` 編です。
Rails 6 (と Rails 5.2.4.1) では、Fiber の中で `Rails.logger.local_level` でログレベルを変更しても、それが親(Fiber の親)に影響を与えないようになっています。

Ruby 2.6.5, Rails 6.0.2.1, Rails 5.2.4.1, Rails 5.2.3 で確認しました。 (Rails 6.0.0 でこの修正が入っています。)

“`shell
$ rails –version
Rails 6.0.2.1
“`

今回は、適切な利用例を思いつきませんでした。controller を1つ作って、 `index` の中で、 Fiber を使って確認します。

# Rails プロジェクトを作る

Rails プロジェクトを新たに作成します。

“`shell
$ rails new rails_sandbox
$ cd rails_sandbox
“`

# Home

元記事を表示

OTHERカテゴリの最新記事