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

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

crystal の AtCoder における Deque の使用による速度改善

# はじめに
AtCoder さん、いつもお世話になっております。

私は、下記のトランスパイラを夢見ている者ですが、`Deque`の使用により実行時間の改善が見られましたので、ここに投稿いたします。

https://github.com/superrino130/crystal-on-paiza.cloud
# 003 – Longest Circular Road(★4)
https://atcoder.jp/contests/typical90/tasks/typical90_c

“`diff_crystal
n = read_line.to_i
– ab = Array.new(n + 1){ [] of Int32 }
+ ab = Deque.new(n + 1){ [] of Int32 }
– f = Array.new(n + 1, 0)
+ f = Deque.new(n + 1, 0)
(n – 1).times do
a, b = read_line.split.map(&.to_i)
ab[a] << b ab[b] << a end - q

元記事を表示

プロジェクトへテストコードを導入する(計画編)

## 今回話すこと
– [導入の経緯](https://qiita.com/iyore_eng/items/fdf57b817589383db661#導入の経緯)
– [Webアプリケーションにおけるテストとは](https://qiita.com/iyore_eng/items/fdf57b817589383db661#webアプリケーションにおけるテストとは)
– [何のためにテストをするか](https://qiita.com/iyore_eng/items/fdf57b817589383db661#何のためにテストをするか)
– [どういったものをテストするか?](ttps://qiita.com/iyore_eng/items/fdf57b817589383db661#どういったものをテストするか)
– [デメリットについて考える](https://qiita.com/iyore_eng/items/fdf57b817589383db661#デメリットについて考える)
– [使用する技術](https://qiita.com/iyore_eng/items/fdf57b817

元記事を表示

Rubyの配列に要素を追加するメソッド比較

# 配列に要素を追加するメソッド
配列に要素を追加するメソッドは主にこんな感じ(もっと色々あるかもしれない、またあれば追記する)
“`
<< push concat insert unshift + ``` ## `<<`メソッド, `push`メソッド 引数のオブジェクトを自分の末尾に追加する。 ```ruby ary = [1, 2, 3] # => [1, 2, 3]
ary << 4 # => [1, 2, 3, 4]
ary.push(5)
# => [1, 2, 3, 4, 5]
“`

## `concat`メソッド
引数の配列を自分の末尾に追加する。破壊的メソッド。
“`ruby
ary = [1,2,3]
# => [1, 2, 3]
ary.concat([4, 5])
# => [1, 2, 3, 4, 5]
ary
# => [1, 2, 3, 4, 5]
“`

## `insert`メソッド
第一引数で指定された位置に、第二引数以降のオブジェクトを挿入する。破壊的メソッド。
“`ruby
ary = [1, 2, 3]
# => [1, 2, 3]

元記事を表示

Rubyでソースコードの文字コードを設定する

# マジックコメントについて
Ruby2.0以降ならデフォルトでUTF-8が入っているので、マジックコメントで文字コードを特に指定する必要はない。

# 書き方
大文字・小文字を区別しない、`coding: エンコーディング名` が正しければ、その前後には任意の文字列を並べることができる。

“`
# encoding: 文字コード名
“`
もしくは
“`
# coding: 文字コード名
“`

## 具体的な指定例
US-ASCIIを指定する場合
“`
# coding: us-ascii
# encoding: us-ascii
# CODING: US-ASCII

“`

元記事を表示

FactoryBotでcreate(:client)時にActiveRecord::RecordNotUniqueが発生する

## コード

– spec/models/client_spec.rb
“`ruby
require ‘rails_helper’

RSpec.describe Client, type: :model do
it “is valid with default” do
client = FactoryBot.create(:client)
expect(client).to be_valid
end
end
“`

– spec/models/client_spec.rb
“`ruby
FactoryBot.define do
factory :client do
sequence(:id) { |n| n } # シーケンスを使う
sequence(:name) { |n| “クライアント#{n}” }
created_at { Time.current }
updated_at { Time.current }
end
end
“`

## 概要
タイトルの通りだが、上記のコードでrspecを実行すると以下

元記事を表示

Bootstrap,CSSを使った一覧表示

この記事は学習中に実装した内容をアウトプットし、更に理解を深めるための記録用投稿になります。
投稿している内容と同じ箇所で躓いている方に少しでもお力添えできれば幸いです。

## 実装した内容
ユーザーの詳細画面でユーザーの詳細内容、投稿した記事の一覧を4つ表示して折り返す内容になります。

## 今までの考え
・今までHtml,Css,Ruby,Ruby on Railsの順番で学習を進めてきて、直近で学習していた課題ではCssを使わずにレイアウトをBootstrapだけを行い実装してきました。
そのこともあり、今回もBootstrapだけで行こうと進めていましたが思ったようなレイアウトにならず色々調べているとCssも並行して使えることを書いてある記事を見つけました。(今更何を言っているんだと思う方もいるかもしれませんが、初心者の脳内なのでどうかお許しください、、。)
そのことを踏まえて読んでいただけると嬉しいです。

## 前提条件
・Bootstrap導入済み。(今回はBootstrap4です。)
## 参考ページ
自分のページを曝け出すのは恥ずかしくて大変恐れ多いですが

元記事を表示

100日後くらいに個人開発するぞ!day001

# まずはこれをやってみる!

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2632394/280cff78-08ee-40f8-c0c2-f8e062e7eca1.png)

https://prog-8.com/paths/rails

# 今日はHTMLに触れてみた!
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2632394/e1c53435-3698-911c-7fd2-3f8eff89c0d6.png)

“`

* 開始タグと終了タグ
* 開始タグ
*
終了タグ
* 見出しをつける
* 見出し
* hはheadingの頭文字
*

,

,

,,,

,,,と数字が大きくなるについれて見出しは小さくなる
* 段落をつける
*

タイトル

元記事を表示

Enumが定義されたインスタンス変数を更新する

仕事のコードを読んでいたところ次の記述に遭遇しました。

“`ruby:sample.rb
(~)? (モデル).accept! : (モデル).refuse!
“`
(~)が真ならば(モデル).accept!、偽ならば(モデル).refuse!を実行するという記述です。

「ほう、`accept!`なんてメソッドがあるのか」と思い調べましたが、何も出てきません。
そこでコードに戻ったところ次の記述がありました。
“`ruby:models/sample.rb
enum status: { refuse: 0, accept: 1 }
“`
「`enum`は属性に対応する値をDBに保存するんだったよな…」

Railsガイドには次の記述がありました。

https://railsguides.jp/active_record_querying.html#enum

> 以下の!付きインスタンスメソッドは自動で作成されます。最初にstatusの値を更新し、次にstatusがその値に設定されたかどうかをtrue/falseで返します。
“`ruby:railsguide.rb

元記事を表示

【初学者】ログイン機構のまとめ【Webアプリ開発の道~その3~】

# はじめに
こんにちは。しばらく投稿の間が空いてしまいました…。
言い訳をしておきますと、(また後で記事にできたらいいなと思っているのですが…)「要件定義」や「基本設計」について、深掘りして勉強しながら、実際にオリジナルアプリの設計をしていたからです。
暫定的な成果物はできたのですが、おそらく、アプリ開発の中で、見直しされていくと思いますので、最終的にアプリが形になってから、記事にしたいと思います。

今回は、どのWebアプリでも必ず実装するであろう「ログイン機構」について、学んだことをまとめていきたいと思います。

# 何を書いたか
Ruby on rails チュートリアルの第8章、第9章の内容をベースに、自分なりに咀嚼したものを描いていきます。

# なぜ書いたか
学習記録です。特に自分が理解しにくかった部分は、自分なりの解釈を加えています。(間違っている部分はご指摘いただけると幸いです。)

# 本題

## 基本的なログイン機構
### ログインの基本的な仕組み
→ブラウザがログインしている状態を保持し、ユーザーによってブラウザが閉じられたら状態を破棄するといった仕組み

元記事を表示

カラムの合計値を出す方法

カラムの合計値を出す方法

controller↓
@任意の変数名 = テーブル名.all.sum(:合計を出したいカラム名)

元記事を表示

【Rails】画像と動画、どちらかを表示する方法

# content_typeはどうなっているのか?
前提として、今回はcarrierwaveやuploaderを使用していません。今回はactive_storageで画像や動画を保存しているので、今回はactive_storageとcontent_typeを使って画像と動画、どちらかの表示をしていきます。
Sequel Proでは以下のようになっています
[![Image from Gyazo](https://i.gyazo.com/3a1d810fddb0ffbd30b4e929495e8f1f.png)](https://gyazo.com/3a1d810fddb0ffbd30b4e929495e8f1f)
content_typeに注目してください。ファイルの拡張子がjpgにはimage/ 、mp4にはvideo/ と記載されているのがわかるかと思います。
画像を表示するか、または動画を表示するかはこれを使ってコードを記述していきます。

# どうやって分けて表示するのか?
結論としては以下のようなコードになります。
“`ruby:diary/index.html.erb
<

元記事を表示

【Ruby】初心者がRuby on Railsをやる!

# :star:概要:star:

`Ruby`初心者の僕が`Ruby on Rails`までやってみた!

# :star:初期セットアップ的な:star:

“`shell
rails new
cd
bundle install
bundle update
“`

`bundle install`をする場所は1つ下の階層でやらなきゃいけない!
エラーが出た際の対処法は、下に掲載しています。

# :star:サーバーの起動:star:

“`shell
ubuntu@ubuntuv:~/デスクトップ/projectX/sample$ rails s
“`

ブラウザの`127.0.0.1:3000`に行って、これが出ればおっけ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1523062/98f5bfda-d4c1-f09a-a1fa-b5829f09f278.png)

コンソールで`Ctrl + c`を押して、サーバーを終了

元記事を表示

鋸の使い方 🪚

# 概要
https://github.com/sparklemotion/nokogiri

> Nokogiri (鋸) makes it easy and painless to work with XML and HTML from Ruby. It provides a sensible, easy-to-understand API for reading, writing, modifying, and querying documents. It is fast and standards-compliant by relying on native parsers like libxml2 (CRuby) and xerces (JRuby).

Ruby で XML とか HTML をいい感じに扱えるライブラリ

# サンプル

こんなHTMLドキュメントがあったとして、

“`html


Lightweight language

元記事を表示

GemfileでグローバルインストールするGemを管理する

普段プロジェクトごとにGemfileを管理していますが、システム全体で使うGemもGemfileで管理したいと思い方法を調べました。

## 環境
Mac OS Big Sur 11.6
Bundler 2.2.32
Ruby 3.0.2
Gem 3.2.22

## 結論

好きな場所にGemfileを作成して

“`ruby
bundle install –system
“`

これだけでシステム全体でGemが使えるようになります。

## 保存場所

自分の場合は[rbenv](https://github.com/rbenv/rbenv)を使いバージョン管理をしています。

そこで、 `Gemfiles` というフォルダを作り、その下でバージョンごとに管理することにしました。

“`ruby: 好きな場所
Gemfiles
├── 2.6.3
│   └── Gemfile
│   └── Gemfile.lock
├── 2.6.6
│   └── Gemfile
│   └── Gemfile.lock
└── 3.0.2
└── Gemfile
 

元記事を表示

DockerでRuby on Railsの環境を構築する際のentrypoint.shのコマンド及びコード理解

## なぜ記事を書こうと思ったか
前回の記事のRails用のDockerfileを作成する際にentrypoint.shを指定していますが、今回そのentrypoint.shのコマンド及びコードの理解を備忘録として残すため。

– [DockerでRuby on Railsの環境を構築する際のDockerfileのコマンド及びコード理解](https://qiita.com/zakino123/items/5e7ddf96096156ef814f)

## entrypoint.shのコマンド説明
entrypoint.sh
“`
#!/bin/bash
set -e

# Remove a potentially pre-existing server.pid for Rails.
rm -f /app/tmp/pids/server.pid

# Then exec the container’s main process (what’s set as CMD in the Dockerfile).
exec “$@”
“`

以下にコマンド及びコードの解説を致しま

元記事を表示

Rails お気に入りランキング実装

この記事は学習中に実装した内容をアウトプットし、更に理解を深めるための記録用投稿になります。
投稿している内容と同じ箇所で躓いている方に少しでもお力添えできれば幸いです。

## 実装した内容
今回はユーザーが投稿した内容に複数のユーザーがお気に入り(いいね)をし、そのいいね数の多い順番にランキング形式で表示する内容になります。

## 前提条件
・投稿した記事のテーブル名はdishesとします。
・いいね機能のテーブル名はfavoritsとします。
・いいね機能を実装済み

## モデル
コントローラで使用するためのメソッドをモデルに記述します。
コントローラの記述を長くしないようにするためのようです。モデルの使い方を再確認!

*/app/models/dish.rb
“`ruby
def self.create_all_ranks
Dish.find(Favorit.group(:dish_id).where(created_at: Time.current.all_week).order(‘count(dish_id) desc’).limit(10).pluck(:di

元記事を表示

今日からWEB開発 1日目

はじめまして。エンジニアを目指しているPIROSHKIです。

今日からWEB開発ということで、勉強しながら1つWEBアプリの開発を目指していきます。
超初心者なので長い道のりですが、皆さんの記事を見ながら頑張ります。

少し前に学校で学んだRubu Railsを使って開発をしようと思っています。

早速RubyとRailsのインストールから

①Rubyのインストール
https://www.ruby-lang.org/ja/downloads/
色々なバージョンがあってよくわからないので最新の3.1.1-1をダウンロード

②Rlaisのインストール
  コマンドプロンプトで
  gem install rails 
  を実行。

③作成するアプリ名のフォルダを作成
 rails new アプリ名

 ・・・・
 とここで、

 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2607524/8c4cfd31-bb9e-e5eb-3143-dba7ada7e94f.png)

元記事を表示

Ruby と crystal で解く AtCoder ABC248 C-D

# はじめに
AtCoder さん、ありがとうございます。
# C – Dice Sum
https://atcoder.jp/contests/abc248/tasks/abc248_c

動的計画法を応用して解きました。
## Ruby
“`rb
n, m, k = gets.split.map(&:to_i)
MOD = 998244353
dp = Hash.new(0)
dp[0] = 1
n.times do |i|
dp2 = Hash.new(0)
(1..m).each do |x|
dp.keys.each do |key|
if key + x <= k dp2[key + x] += dp[key] dp2[key + x] %= MOD end end end dp = dp2 end puts dp.values.sum % MOD ``` 動的計画法では、配列をコピーしたりしますが、`Hash#keys`でコピーしている様な感じです。 ## crystal ```cr

元記事を表示

fileterメソッドを使用してN+1問題を解決した

次の状況でN+1問題が発生しておりました。その解決方法になります。

“`ruby:model/model1.rb
class:Model1
has_many :model3s,
has_many :model2s, through: :model3s
“`

“`ruby:model/model2.rb
class:Model2
has_many :model3s,
has_many :model1s, through: :model3s
“`

“`ruby:model/model3.rb
class:Model3(Modle1とModle2の中間テーブル)
belongs :model1
belongs :model2
“`

“`ruby:controllers/sample_controller.rb
@model1 = Model1.eager_load(:model3s)
“`

“`ruby:views/sample.html.erb
# model2_idはループで回される値
   @model1.where(model3s: { [

元記事を表示

【Rails】cocoonを用いたデータを表示する方法

# cocoonとは?
cocoonとはフォームの追加や削除の実装を行う時とても便利なgemです。
個人的には以下の記事が大変参考になったのでこちらをご参照していただければと思います。

https://qiita.com/kmjooh/items/a1613531873a22fa7862

# cocoonで保存したデータをどうやって表示するのか?
ここからはオリジナルアプリの制作時に実装した方法を紹介します。オリジナルアプリは筋トレ日記です。

## ゴールは?
ゴールとしては以下のような表示です
[![Image from Gyazo](https://i.gyazo.com/7a0c1f8fbfaa0a9bbd415f3201442012.png)](https://gyazo.com/7a0c1f8fbfaa0a9bbd415f3201442012)
これはオリジナルアプリの一覧表示の一部ですが、種目・重量・回数・セット数はcocoonを用いてフォームを追加・削除したりして複数のデータを保存できるようにしています。

## まず日記の一覧表示はどのように実装されているのか?

元記事を表示

OTHERカテゴリの最新記事