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

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

初級者向け アルゴリズムを解説(3)

# 初級者向け アルゴリズムを解説
 これからアルゴリズムについて解説をしていきますが、こちらの解説はプログラミング初級者(「最近プログラミングを始めました!!」向けになります。また数回のシリーズに分けてプログラミングで使用されるアルゴリズムを解説していきます。なお、Rubyを使用してコーディングしています。
※このシリーズは「アルゴリズムを、はじめよう(著:伊藤静香)」を参考にしております。
[シリーズ(1): 初級者向け アルゴリズムを解説(1)はこちら](https://qiita.com/ko5uke/items/7ba4df764057c990b686)
[シリーズ(2): 初級者向け アルゴリズムを解説(2)はこちら](https://qiita.com/ko5uke/items/4fdb992f068c0581e890)

## 二分探索法(バイナリサーチ)
 それでは前回の続きから始めましょう。前回は線形探索法を説明しました。(線形探索法については上記のシリーズ(2)を確認してください。)
 今回は探索の中の二分探索法について説明していきます。

 二分探索法とは、探索

元記事を表示

RailsでFormオブジェクトを使おう

# MVCを学んだ初心者にありがちな悩み

## コントローラーに全ての処理を書くことでコードが読みづらくなる
## モデルのメソッドが複雑になりすぎてしまう(Fat Model)

# Formオブジェクトを使うメリット
## Controllerがすっきりする
## Form内で複数のモデルがあっても大丈夫

元記事を表示

初心者が手探りで Rails のタグ付機能を gem なしで実装してみる

## はじめに

ブログ記事を投稿するアプリケーションで記事を投稿する際にタグ付けする機能を実装してみました。

Rails 初心者が出来る限り自力で実装してみました。おかしい点や改善点などあればコメントで指摘していただけると嬉しいです。

Rails : 6.0.2
Ruby : 2.7.0

## 仕様

– 記事投稿フォームにユーザーが任意のタグを入力してもらう
– タグは複数設定できる
– タグを一意(ユニーク)に保ちたい
– タグをアルファベットの大文字・小文字で区別させたくないので、タグが保存される前にアルファベットを全て小文字に変換して保存する
– タグ DB に既に存在する場合と存在しない場合で処理を分ける
– タグが既に存在する場合は、タグを DB から取得して紐付ける
– タグ名が DB に存在しない場合は、タグを作成して紐付ける

## 手順

1. 各モデル(Article, Tag, 中間モデル)を作成する
2. Articles コントローラを作成
3. アソシエーションの設定
4. ルーティングを設定
5. Articles コントローラを編

元記事を表示

どうやら魅力のタイトルづけは完全無敵のようですね

## どうやら魅力のタイトルづけは完全無敵のようですね
### 概要
なろう小説のタイトルをパロった技術ブログのタイトル自動生成プログラムを作成しました。

プログラムの実行結果
キーワード: 魅力, タイトルづけ

“`text:出力
“どうやら魅力のタイトルづけは完全無敵のようですね”
“どうやら魅力の身体はタイトルづけ無敵のようですね”
“どうやら魅力の身体は完全タイトルづけのようですね”
“どうやら魅力の身体は完全無敵のタイトルづけですね”
“どうやらタイトルづけの魅力は完全無敵のようですね”
“どうやら私の魅力はタイトルづけ無敵のようですね”
“どうやら私の魅力は完全タイトルづけのようですね”
“どうやら私の魅力は完全無敵のタイトルづけですね”
“どうやらタイトルづけの身体は魅力無敵のようですね”
“どうやら私のタイトルづけは魅力無敵のようですね”
“どうやら私の身体は魅力タイトルづけのようですね”
“どうやら私の身体は魅力無敵のタイトルづけですね”
“どうやらタイトルづけの身体は完全魅力のようですね”
“どうやら私のタイトルづけは完全魅力のようですね”
“どうやら私の身体

元記事を表示

LeetCode – 191. Number of 1 Bits

# [191. Number of 1 Bits](https://leetcode.com/problems/number-of-1-bits/)
今日は超軽いやつ。

# 解答

“`ruby

# @param {Integer} n, a positive integer
# @return {Integer}
def hamming_weight(n)
n.to_s(2).scan(/1/).size
end
“`

# メモ

テストしようと思って以下のようにやってしまい、しばらく首を傾げてしまった。この入力値だと8進数だととられる

“`ruby

hamming_weight(00000000000000000000000000001011)
“`

やるなら `0b` をつけて、こうしないと。これで二進数と思ってくれる。

“`ruby

hamming_weight(0b00000000000000000000000000001011)
“`

[`sprintf` あたりが参考になる](https://docs.ruby-lang.org/ja/l

元記事を表示

Ruby基礎(繰り返し)

#繰り返し文について
今までは1つの変数に、1つの値を入れて表示させてきました。
しかし、実際のアプリを作るとき
**1つの変数に複数の値**
がはいることが多々あります。

そしてその**複数の情報を表示させる。**

といったコードがあるのでそれを今回学んでいきます

##each文
代表的なところでいうとこの**each文**になります。
これは**複数の情報1つ1つ最後まで繰り返し処理**をしてくれる文になります。

例えば1つの要素に10個の要素があれば10回繰り返し処理をしてくれます。

それでは実際にコードを書いていきましょう!

##実際に書いて動かしてみよう!

毎度のごとく新しい分野なので、**新しいファイルを作成(each.rb)**してください。

保存したら以下のコードを書いてください。

“`ruby:each.rb
integer = 1..5

integer.each do |i|
puts i
end
“`
かけましたか??
では、これを実行してみましょう!

“`ruby:ターミナル
1
2
3
4
5
“`
InOrder Traversal

“`ruby

require ‘test/unit’
require ‘pry’
class InOrderTraversal < Test::Unit::TestCase def test_run input = [1, nil, 2, 3] tree = TreeNode.new(1) tree.left = TreeNode.new(nil) tree.right = TreeNode.new(2) tree.right.left = TreeNode.new(3) assert_equal([1, 3, 2], inorder_traversal(tree)) assert_equal([], inorder_traversal(nil)) end def inorder_traversal(root, result = []) if root == nil || root.val.nil? return []

Level Order Traversal

“`ruby

require ‘test/unit’
require ‘pry’
class LevelOrderTraversal < Test::Unit::TestCase def test_run tree = TreeNode.new(3) tree.left = TreeNode.new(9) tree.right = TreeNode.new(20) tree.right.left = TreeNode.new(15) tree.right.right = TreeNode.new(7) assert_equal([ [3], [9, 20], [15, 7] ], levelorder_traversal(tree)) assert_equal([], levelorder_t

m(&->(x,y){x}) が 0 で m(&->(x,y){x*y}) が 1 だと?

Ruby の問題です。下記の記事の続編ですが,少し難しくなっています。
[m{|x| x } が 0 で m{|x, y| x * y } が 1 だと? – Qiita](https://qiita.com/scivola/items/a6a6aa2c3dda458ba209)

以下のテストをパスするメソッド `m` を定義せよ。

“`rb
require “test/unit”

class T < Test::Unit::TestCase test "" do assert_equal 0, m(&->(x, y){ x })
assert_equal 1, m(&->(x, y){ x * y })
end
end
“`

答えはここをめくってね

`def m; yield 0, “”.tap{ def _1.coerce(*); [1, 1]; end }; end`
(番号指定ブロックパラメーターを使っているので,Ruby 2.7 より前だと少し書き直す必要がある)

Ruby on Rails でのSyntax error

#はじめに
Ruby on Railsにてrails newコマンドを叩いたときに謎のSyntax errorを吐いていたのでメモ
こういう記事誰も書いてないっぽいのでなんだか得した気分。

#環境
Rails 6.0.2.1
Ruby 2.5.0
rbenv 1.1.2
#Syntax Error
最後の行にてエラーを吐いた
どうやらtest.rb.ttの10行目に文法エラーがあるらしいとのこと

“`
MacBook-Pro:Ruby on Rails Your name$ rails new asagao –skip-bundle
create
create README.md
—中略—
/Users/Your name/.rbenv/versions/2.5.0/lib/ruby/2.5.0/erb.rb:885:in `result’
/Users/Your name/.rbenv/versions/2.5.0/lib/ruby/2.5.0/erb.rb:885:in `eval’: /

N+1問題への対処

#N+1問題とは
あるテーブルへのアクセス1回に対して、関連するテーブルが呼び出した分(N回)発行されてしまう状況のことを指し、これが何万回、何十万回と呼び出された時に動作が重くなってしまう問題のこと。

# 対処法
**includes**メソッドを使用することで、あるテーブルにアクセスする際に、同時に関連するテーブルのレコードを取得し、発行するSQLを少なくすることができる。
**includes**メソッドは、1つ目のテーブルのカラムを優先して、2つ目のテーブルを結合する。その際に2つのテーブルのどちらにしか存在しないテーブルも含める。(左外部結合

ちなみに反対にテーブル同士を結合する時に両方のテーブルで結合条件がマッチするレコードのみを取得する方法が内部結合になる。

スクリーンショット 2020-01-29 20.33.20.pngRailsで短縮URL

## はじめに
みなさん、Railsライフ楽しんでいますか?
今回は短縮URLをRailsで作っていきたいと思います。
他の記事ではBitlyが使われていたりするのですが、今回はGemの[shortener](https://github.com/jpmcgrath/shortener/)を使っていきたいと思います。
では早速始めていきましょう!!!
(すごく便利です。)
## どんな感じ?

“`
http://localhost:3000/s/jsbei
“`
こんな感じになります。localhostの部分がドメインになるかと思います。なので、Bitlyに比べてサイトがわかるので、信頼性が高いと思います。
## インストール
早速インストールしていきましょう。
まずGemfileに以下のように追記してください!!!

“` Gemfile
gem ‘shortener’
“`
そして、以下をターミナルで実行しください。

“`
rails generate shortener
rails db:migrate
“`
これで、インストールは完了しました。
##ルートの設定

m{|x| x } が 0 で m{|x, y| x * y } が 1 だと?

Ruby の問題です。

以下のテストをパスするメソッド `m` を定義せよ。

“`rb
require “test/unit”

class T < Test::Unit::TestCase test "" do assert_equal 0, m{ |x| x } assert_equal 1, m{ |x, y| x * y } end end ```

答えはここをめくってね

`def m(&b); yield b.arity == 1 ? 0 : [1, 1]; end

(追記)少し難しくした続編を書きました。
[m(&->(x,y){x}) が 0 で m(&->(x,y){x*y}) が 1 だと? – Qiita](https://qiita.com/scivola/items/44a7d41d502622cbbd4d)

ruby のあれは、 node.js でどう書くんだ

js むずい

|ruby|node.js|
|:–|:–|
|“`File.read(‘file.txt’)“`|“`const fs = require(‘fs’)“`
“`fs.readFileSync(‘file.txt’, ‘UTF-8’) “`|
|“`File.write(‘file.txt’, content)“`|“`fs.writeFileSync(‘file.txt’, content) “`|

以下、つど調べたら追記

「アプリケーションが壊れているのに検知できないテストコード」を書かないようにするための、べからず集

## はじめに

テストコードを書くことは重要です。
テストコードがないアプリケーションよりもテストコードがあるアプリケーションの方が望ましいことは間違いありません。

ですが、テストコードも書き方を間違えると、アプリケーションが壊れているのに正しく検知できないテストを書いてしまう可能性があります。

この記事ではそんな「アプリケーションが壊れているのに正しく検知できないテスト」のコード例を「〜するべからず(〜してはいけない)」の形式で紹介し、その修正方法を説明していきます。

### サンプルコードはRSpecで書いてます(でも他の言語でも考え方は同じはず)
サンプルコードはRailsアプリケーションをRSpecでテストする場合はを想定したものになっていますが、基本的な考え方自体は他の言語やテスティングフレームワークでも適用可能なはずです。

RSpecのイロハについて先に学んでおきたいかたは「[使えるRSpec入門・その1「RSpecの基本的な構文や便利な機能を理解する](https://qiita.com/jnchito/items/42193d066bd61c740612)」を

選択肢の「その他」を選んだ時のテキスト入力

フォームで選択肢を実装した場合、その他項目を設けてその他が選択された時はテキスト入力を必須とする実装をしたい時がある。
割とどこにでもある実装だが、バリデーションも含めてちゃんと実装しようとすると、「あれ、どうやるんだっけ?」となったのでメモとして残す。

# 概要
例えば会員登録するユーザーの職業情報を得るために、いくつか選択肢を用意し、選択肢に当てはまらない場合はフリーテキスト入力を必須となるようにしたい。
その場合、フリーテキスト欄をその他が選択された場合だけ表示、それ以外の場合は非表示という実装をJavaScriptで行う以外に、Modelのvalidationにも記述する必要がある。
選択できる職業は、エンジニア、マーケッター、デザイナー、オペレーション、マネジメント、その他の6種類とし、その他が選択された時だけフリーテキスト欄入力を必須とする。

## Schema
テーブルのカラムには、下記の2つのカラムをつける。(カラムの追加方法などはここでは省略)
db/schema.rb

“`ruby
create_table “users”, force: :cascade

【Rails】 FullCalendar カレンダー内でのドラッグによるイベント新規作成方法

# はじめに
Rails アプリケーションにて、 FullCalendar カレンダー内でのドラッグをするとイベントを新規作成できる方法について説明します。
scaffold で Eventモデルを作成しているため、最低限の作業量でカレンダーに機能を追加する方法を実現しています。

### イメージ

赤色の矢印方向へドラッグすると、、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308256/a4c69f44-9dac-d832-a849-86af8e4fbaf9.png)

新規でイベントが作成できる方法について説明します!

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308256/91b1245b-07d6-affb-8fc9-6d215efcdf85.png)

#### 関連リンク
関連リンクを下記に載せておくので、必要であれば参考にしてください。。

* 【Rai

[git rebase] ブランチにmasterの情報を持ってきて作業するにはどうすればいいの?

**やり方や仕組みを記述したちゃんとした記事はたくさんありますのでリンクをご参照ください。**

ブランチで作業してるけど、作業中に他のメンバーがマスターにマージしてマスターの情報が
新しくなった!
という時に、作業中の自分のブランチにマスターの最新情報を追加して自分がマージ
した時のコンフリクトを最小限に抑えたい&マージされた内容をもとに実装をしたい
と言ったことを考え使うコマンドがリベースという認識でおります。
(もっと他にあると思いますが、自分なりの解釈です)

##環境
■GithubDesktop使用
■ターミナル
■プルリクはしていません(プルリクあげてるものはGithubでプルリクをcloseしています)
[プルリクエストをクローズする](https://help.github.com/ja/github/collaborating-with-issues-and-pull-requests/closing-a-pull-request)
■commitはしてます

猿とおんなじレベルの自分でも理解できるように自分なりに噛み砕いて記述します。
実行したこととエラーについて

脱Webpacker Rails

## Rails + Webpack
Rails6.0からデフォルトでWebpacker(WebpackをRailsでラップしたGem)が搭載されていますが、無駄に処理がわかりにくくなっており、使い勝手がよくありません…
脱Webpackerをして、RailsにWebpackを導入してみます。
以下にボイラーテンプレートを置いておくので、よければ参考にしてください。

https://github.com/Tak-Iwamoto/rails-webpack-boiler-template

## 1. Rails関連
– 以下のGemは使用しないので削除する。

“` Gemfile
//
gem ‘sass-rails’, ‘>= 6’
gem ‘webpacker’, ‘~> 4.0’
gem ‘turbolinks’, ‘~> 5’
//
“`

– app/assets, app/javascriptを削除する。
– asset precompileを無効にする。
config/application.rbに以下の設定を追加し、
assets precompileを

[RuboCop] UnknownEnvironment 警告の解決方法

対象 ver: rubocop (0.71.0)

## テストで Rubocop が警告を吐く [ C: Rails/UnknownEnv: Unknown environment staging?. ]
Rails アプリに staging 等の環境を追加して `Rails.env.staging?` といった処理を書くと、RuboCop に警告されます

出力されたログ ※一部を省略しています

“`
$ rails rubocop

Inspecting 50 files
…………………C……………………….

Offenses:
app/controllers/hoge_controller.rb:51:60: C: Rails/UnknownEnv: Unknown environment staging?.
if Rails.env.production? && Rails.env.staging?