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

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

Rubyで文字列のタイム表示を昇順に並び替える

## やりたいこと
文字列のタイム表示を昇順で並び替える。

条件

– 文字列の形式は`00:00.00` (分 : 秒 . 小数点以下2ケタ)
– 想定のタイム範囲は`05:00.00`から`10:59.99`
– 件数はおよそ250件

## 環境
– Ruby 3.1.0p0
– macOS 10.15.7

## 文字列のサンプルをつくる
`Integer#times`、`Kernel.#rand`、`Time#local`、`Time#strftime`を使って250件のサンプルをつくった。

“`ruby
array = []
250.times { array << rand(Time.local(2022,3,14,1,5,0,0,0)..Time.local(2022,3,14,1,10,59,999) ) } #Timeオブジェクトを`Time#strftime`を使って文字列に成形する samples = array.map{|t| t.strftime("%M:%S.%2N")} #=> [“10:11.12”, “05:30.87”, “09:59.53

元記事を表示

【初心者用】Rubyでバブルソート問題をやってみた

# 1.バブルソートとは?
– 大小バラバラに並んでいるデータを昇順(小さい順)、降順(大きい順)に並べる方法のひとつ。
– 具体的には、隣り合う要素の大小比較を繰り返して、並び替えを行う。

# 2.やりたいこと
– 次のような結果を得たい。
– 実は、sortメソットを使用すると、一発でソートすることも可能だが、今回は、これを使用せずに記述していきたい。
“`Ruby:
# ソート前
numbers = [10, 8, 3, 5, 2, 4, 11, 18, 20, 33]
# ソート後
numbers = [2, 3, 4, 5, 8, 10, 11, 18, 20, 33]
“`

# 3.やったこと
– メインの処理はこのように記載してみた。
“`Ruby:buble_sort.rb
# bubble_sortメソッドの作成
def bubble_sort(numbers)
# 要素数の回数分繰り返す
numbers.size.times do |i|
# 1つの要素に対して、次の要素と大小比較を繰り返す
# 例えば、numbers[0]

元記事を表示

【Railsチュートリアル】1章のHerokuデプロイでArgumentError

# 要約
HerokuでサポートされているRubyのバージョンと手元のバージョンを揃えたら解消した。

# 概要
Railsチュートリアル第4版の「1.5.2 Herokuにデプロイする (1)」でエラーが発生し、デプロイできなかった。

# 環境
チュートリアル通りの手順で環境構築。
* OS:Ubuntu18.04 (AWSのCloud9を利用)
“`bash
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=18.04
DISTRIB_CODENAME=bionic
DISTRIB_DESCRIPTION=”Ubuntu 18.04.6 LTS”
“`
* Rails:5.1.6
* Ruby:2.6.3
* Gemfile:以下の通り
“`rb:Gemfile
source ‘https://rubygems.org’

gem ‘rails’, ‘5.1.6’
gem ‘puma’, ‘3.9.1’
gem ‘sass-rails’, ‘5.0.6’
gem ‘uglifier’, ‘3.2.0’
gem ‘c

元記事を表示

【Ruby】const_missingメソッドについて

“`ruby
class Object
X = “X”
def self.const_missing a
p “#{a}”
end
end
Y

> “Y”
“`

## const.missing
const_missingは、未定義の定数を参照した場合に呼び出される。
この場合は、Yは定数として定義していないため、const_missingが呼び出され実行される。

元記事を表示

cancancanでモデル名に紐づかない制御をする方法

# はじめに

権限制御のgemとして、[cancancan](https://github.com/CanCanCommunity/cancancan)があると思います。
基本的な使い方はいろいろなところで記事になっていますが、「コントローラ名通りのモデルがないとき」の権限制御方法について記載します。

# 例

コントローラで次のように記載

“`rb
class ProfilesController
authorize_resource class: :profile # ここではコントローラ名と同じprofileにしていますが、コントローラと名前を揃える必要もないです

def new

end

def edit

end

end
“`

シンボルの形で描くことで、モデルがなくても権限管理することができます。
あとは通常の使い方と同じで、abilityクラスで定義していきます。

“`rb
class Ability
include CanCan::Ability

def initialize(user

元記事を表示

devise でグループ登録機能を追加してみた

今回初めての試み。
ユーザー登録機能とは別にdeviseを使ってグループ登録機能の実装をしてみた。

### やりたい事
* deviseを使用してグループ登録機能(新規登録、ログイン)を実装
* 新規登録にはグループ名とパスワードが必要(今回emailは必要なしとする)

### 前提
* 既にdeviseを使用してユーザー機能は実装済み

### グループのモデル作成
まず初めに、ユーザーとグループのログイン画面を別々にしたいので、下記を入力。

“`ruby:config/initializers/devise.rb
# ==> Scopes configuration
# Turn scoped views on. Before rendering “sessions/new”, it will first check for
# “users/sessions/new”. It’s turned off by default because it’s slower if you
# are using only default views.
config.

元記事を表示

Ruby Goldに合格したので、そのおぼえ書き

Ruby技術者認定試験の Ruby Association Certified Ruby Programmer Gold version 2.1
(通称 Ruby Gold)

https://www.ruby.or.jp/ja/certification/examination/

に合格しましたのでそのメモです。
受験時期は2022/1です。

## 感想
– 学び直しの良い機会となった
– メタプログラミングという魔術に出会えた
– 周りの強いエンジニアに一歩近づけた
– 試験は96/100で意外と点数取れた

## 勉強方法
以下の方法で勉強しました。
1. 合格教本の問題を解く
1. CTCテクノロジーの問題を解く
1. 体験記系の記事を読む

要点としては、**体験記系の記事を読む**作業です。
確認すると実感できると思いますが、重箱の隅をつつくのような問題も出題されていることがわかります。
体験記系の記事を通して微妙に理解していなかった内容を確認する時間にすると良いと思います。

以下、私が参考にした記事です。
ググるとたくさんヒットしますがこの3つで十分網羅できると思

元記事を表示

【Ruby on Rails】rubocopのローカル実行コマンド

Bundlerを利用している場合
“`
bundle exec rubocop
“`

ファイル指定も可能
“`
bundle exec rubocop 実行ファイルパス
“`
例えば
“`
bundle exec rubocop spec/XXXXX/XXXX/XXspec.rb
“`

元記事を表示

Rails×Dockerを使ってアプリケーション作成時に「Error response from daemon: Ports are not available: listen tcp 0.0.0.0:3306: bind: Only one usage of each socket address (protocol/network address/port) is normally permitted.」が出た時の対策

タイトル通りですが、Rails×Dockerを使って

“`
docker-compose run web rails new . –force –no-deps –database=mysql
“`

を実行した際に

“`
Error response from daemon: Ports are not available: listen tcp 0.0.0.0:3306:
bind: Only one usage of each socket address (protocol/network address/port) is normally permitted.
“`

が起きてつまづいてしまったので備忘録としてつけておきます。

versionに関しては
“`
ruby: 2.7.5
docker:20.10.12
“`

# 解決策

deeplで翻訳してみる。
“`
デーモンからのエラー応答。listen tcp 0.0.0.0:3306:
bind: 通常、各ソケットアドレス(プロトコル/ネットワークアドレス/ポート)は1回のみ使用可能です。
`

元記事を表示

【個人開発】人生を振り返ることができるアプリを作りました。

# はじめに
![ogp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307408/6dd00f62-29cc-3aa2-9d53-a8853001a41e.png)
この度「人生を可視化できるアプリ【つづる自分史】」をリリースしました!!
このサービスの**概要**や**思い**など色々書きましたので良ければ最後までご覧ください!!

【Twitterアカウント】

【今回作ったサービス】
https://www.tsuzuru-jibunshi.com/

【GitHub】
https://github.com/shiramizu-junya/personal_history

# アプリを作ったキッカケ
誰しも長い人生を生きていると、失敗したり、挫折することは多々あると思います。
私も失敗してきました。
しかし、そこから立ちあがろうと思っても、自分の経歴に自信がなく、人生を人に見せることに対して恥ずかしい感情がありました。
そんな感情か

元記事を表示

【Rspec】turbo_streamを使っているときのrequest specの書き方

# はじめに

Rails7 からはバリデーションの失敗時は `status: :unprocessable_entity` をつける必要があります。
しかし request spec で書いている時、バリデーション失敗時でにリクエストのステータスが `200` で帰ってきてしまう

## やりたい事

バリデーション失敗時のレスポンスのステータスが `422`になるようにする

## 環境

– Rails 7.0.22
– Ruby 3.1.1
– rspec-rails 5.1.0

# request spec

Rails7 から form の送信はデフォルトで Turbo_stream を利用するようになりました。
turbo_stream 利用時はレスポンスのヘッダーに `Accept: ‘text/vnd.turbo-stream.html’` が追加されるので、spec の送信時にもヘッダーを追加する必要があります。

“`ruby:rails/spec/request/user.rb
require ‘rails_helper’

RSpec.describe ‘

元記事を表示

本日の基礎練習問題(22/3/14)

**問題**
以下の要件を満たすend_otherメソッドを実装しましょう。

メソッドの引数に、任意の2つの文字列を指定する。
引数に指定された2つの文字列のうち、どちらかがもう一方の文字列の末尾にある場合は、Trueを出力する
上記を満たせていない場合は、Falseを出力する
入力された文字が大文字でも小文字でも、同一の文字として処理を行う
“`雛形.
def end_other(a, b)
# 処理を記述
end
“`

*呼び出し例
end_other(‘Hiabc’, ‘abc’)
*出力例
end_other(‘Hiabc’, ‘abc’) → True
end_other(‘AbC’, ‘HiaBc’) → True
end_other(‘abc’, ‘HaIoBc’) → False

# 私の回答
未回答(処理方法がわからず時間制限がきたため断念)

# 模範回答
“`ruby
def end_other(a, b)
a_down = a.downcase
b_down = b.downcase
a_len = a_down.length

元記事を表示

rails db:migrateしたのにDBに反映されなかった時の話①

# はじめに

1月〜プログラミングスクールで学習しています。
これから平日は~3/25まで毎日何かしらアウトプットのため投稿を続ける予定です。
今回は rails db:migrateコマンドを実行した際にDBに反映されなかったことについて書きます。
長くなるので2つの記事に分けます。
まずは”NO FILE”というマイグレーションファイルができてしまったことについて書きました。
※Ruby2.6.5の環境を使用し学習しています。

# 事象

rails db:migrateを実行すると下記のようにエラーになりました。
“`:ターミナル
% rails db:migrate
== 20220310073337 CreateDietrecords: migrating ================================
— create_table(:dietrecords)
-> 0.0140s
== 20220310073337 CreateDietrecords: migrated (0.0141s) ==================

元記事を表示

一覧表示を最新の10件を表示する方法

# users/index.html.erbの一覧表示を最新10件にするコード

“`users_controller.eb
def index
@resolutions = Resolution.includes(:user).order(‘created_at DESC’).limit(10)
@articles = Article.includes(:user).order(‘created_at DESC’).limit(10)
end
“`
## 解説
– `order(‘created_at DESC’)`
 一覧表示を最新から表示になります
– `limit(10)`
表示10件までになります。

元記事を表示

Rubyのブロックを解説してみた

メタプログラミングRubyの4章を読んでアウトプットがてら解説記事を書いてみようとおもいます。

## まずは基本から
まずはブロックとは何かという基本的なものを確認しましょう。
“`do ~ end“`や“`{}“`で定義されたもので、メソッドが呼び出されたときのみブロックを定義できます。
そして、ブロックはどこでも存在できるコードではないんです。ローカル変数やselfといったものが必要になるんです。
これらはオブジェクトと関連性をもったもので**束縛**と呼ばれることもあります。
実際にコードを見ていきましょう
“`
def ex_method
yield
end

var = 1

ex_method do
var += 1
local_var = 0
end

var #=> 2
local_var #=> NameError (undefined local variable or method `local_var’ for main:Object)
“`
上記のコードのように、ブロック内で新しく束縛を定義したとき、ブロックが終了した時点でその束縛は

元記事を表示

Numo::NArray でワーシャル–フロイド法の多重ループを記述削減

多次元配列[NArray](https://ruby-numo.github.io/narray/)の機能を利用すれば、[ワーシャル–フロイド法](https://ja.wikipedia.org/wiki/ワーシャル–フロイド法)の3重ループのうち**内側2つを書かなくてよくなる**。Rubyレベルの記述が減ることで計算速度も向上する。

(AtCoderのコンテストでスラスラ書けず、NArray不使用で提出してTLEに苦しんだので、きちんと纏めておくことにした。)

## コード

“`ruby
# n頂点m辺の重み付き有向グラフを標準入力から読み込み
n, m = gets.split.map!(&:to_i)
edges = Array.new(m) { gets.split.map!(&:to_i) }

# 隣接行列を作成
d = Numo::Int64.new(n, n).fill(Numo::Int64::MAX >> 1)
d.diagonal[true] = 0
edges.each do |i, j, dist|
d[i, j] = dist if d[i,

元記事を表示

気象庁の過去気象データを Ruby でスクレイピング

このページで Python でやっているのと同じことを、Ruby でやってみたものです。

https://qiita.com/Cyber_Hacnosuke/items/122cec35d299c4d01f10

元ページは簡単な HTML の読み方についても解説されてあります。

# やること
気象庁のサイト(例えば[こんな感じ](https://www.data.jma.go.jp/obd/stats/etrn/view/daily_s1.php?prec_no=14&block_no=47412&year=2007&month=1&day=&view=))から、

“`
札幌, 室蘭, 函館, 青森, 秋田, 盛岡, 山形, 仙台, 福島, 新潟, 金沢, 富山, 長野, 宇都宮, 福井, 前橋, 熊谷, 水戸, 岐阜, 名古屋, 甲府, 銚子, 津, 静岡, 横浜, 松江, 鳥取, 京都, 彦根, 広島, 岡山, 神戸, 和歌山, 奈良, 松山, 高松, 高知, 徳島, 下関, 福岡, 佐賀, 大分, 長崎, 熊本, 鹿児島, 宮崎
“`

の都市の、

“`
年月

元記事を表示

git push heroku master時のエラー!Precompiling assets failed.

git push heroku master時に以下のエラーが発生した際の解決策を記録

**新規アプリケーションをherokuへ反映する際にエラーが発生した。**

“`ターミナル上のエラー文.
! [remote rejected] master -> master (pre-receive hook declined)
error: failed to push some refs to ‘https://git.heroku.com/アプリ名.git’
“`

原因を調査してみると、ターミナル上に
“`ターミナル上のエラー文.
Precompiling assets failed.
“`
という文があった。

**これは「アセットのプリコンパイルに失敗しました」という意味だった。**

しっかりと上までターミナルを見てみると
ModuleNotFoundError: Module not found: Error: Can’t resolve ‘../tweets’ in ‘/tmp/build_259621bf/app/javascript/packs’というメソッ

元記事を表示

[初学者/At_Corder] A.Cookie_Exchangesを解いてみた

# [初学者/At_Corder] A.Cookie_Exchangesを解いてみた
## 目次
– 概要
– 解答と説明
– まとめ

## 概要
A.Cookie_Exchangeの問題です。
[2022/03/14] @scivola 様からのコメント内容にて、ご教示いただいた内容を解答に反映しております。

## 解答と説明
問題文は下記のサイトにて、ご覧いただけます。

https://atcoder.jp/contests/agc014/tasks/agc014_a

##### 解答
“`ruby:cokkie_exchange.rb
a,b,c = gets.split.map(&:to_i)

arr = [a,b,c]
count = 0

if arr.uniq.one? && arr.all?(&:even?)
puts -1
else
while arr.all?(&:even?)
arr = arr.rotate.zip(arr.rotate(2)).map{ |i| i.sum / 2 }
count += 1
end
pu

元記事を表示

自作アプリを作る マイクロポスト

## マイクロポストコントローラのアクションを指定する
### config/routes.rb
“`rb
Rails.application.routes.draw do
get ‘password_resets/new’
get ‘password_resets/edit’
get ‘sessions/new’
root ‘static_pages#home’
get ‘/signup’, to: ‘users#new’
post ‘/login’, to: ‘sessions#create’
delete ‘/logout’, to: ‘sessions#destroy’
resources :users
resources :account_activations, only: [:edit]
resources :password_resets, only: [:new, :create, :edit, :update]
resources :microposts, only: [:crea

元記事を表示

OTHERカテゴリの最新記事