Ruby関連のことを調べてみた2019年11月28日

Ruby関連のことを調べてみた2019年11月28日

Rubyでブラックジャックのアプリを作った

プログラミング初学者がたどり着く定番のブラックジャックを作ってみました。

ちょっと雑感もあるし、いかにも初学者らしい感じのコーディングになっている気がするので、もう少しクラスを意識したり、可読性を良くしたり、効率の良い感じを検討して改修しようかな。

##仕様要件
・ジョーカーなしの1〜13×4種の構成。
・相手が先に山札から引き、17以上になるまで引く。但し、1枚目しか数字がプレイヤーには見えない。
・プレイヤーは初期に2枚引き、ヒットがスタンドを選択する。ヒットならば1枚引き、スタンドならば現在の手札で勝負する。
・JQKは10として扱い、Aは1もしくは11として扱う。
・手札の合計値が21で勝利した場合はブラックジャックという結果が出る。

##実際に書いてみた

“`ruby:blackjack.rb
# Card judgement
def card_judge(i)
# mark judgement
mark_no = (i % 13 == 0) ? (i / 13) – 1 : i / 13

# Mark no: 0 SPADE / 1 HEART / 2 D

元記事を表示

Railsで開発環境のURLをlocalhost:3000ではなくa.example.comとかにする方法

`/etc/hosts` ファイルをsudoで編集します。Linuxでも同様に動きます。

“`
127.0.1.1 a.example.com
127.0.1.1 b.example.com
“`
これで、アプリを起動させて、ブラウザーをそれらのいずれかに向けると、動作するはずです。次に、Railsアプリのサーバーを起動します。

“`
rails s
rails s -p 3001
“`
最後に、ブラウザで次を指定します。

“`
foo.example.com:3000
bar.example.com:3001
“`

## 3000番とかを消したい場合
80番ポートで起動させてください

“`
sudo rails server –port=80
“`

## 参考

[local Rails with domain name? [duplicate]](https://stackoverflow.com/questions/13367585/local-rails-with-domain-name)

元記事を表示

【Rails】モデルの関連付けを行う

##関連付けとは
Railsでは、モデルやテーブル同士の関係を設定することができます。
例えばUserモデルとTaskモデルの関係などを定義します。
(この場合、1人のユーザーが複数のタスクを持っている)

##何がうれしいのか
必要な記述が少なく、シンプルになります。
TODOアプリを例に説明すると、以下のように記述が簡素化します。
###タスク作成時
“`ruby
Task.create(title: “パンを買う”, user_id: @user.id)
“`

“`ruby
@user.tasks.create(title: “パンを買う”)
“`
###ユーザー削除時
“`ruby
@tasks = Task.where(user_id: @user.id)
@tasks.each do |task|
task.destroy
end
@user.destroy
“`

“`ruby
@user.destroy
“`

その他、以下のようなメソッドが使えるようになります。

| メソッド | 用途 |
|:–|:–|
| task.user |

元記事を表示

カレンダーを表示する (たのしいRuby 練習問題)

# はじめに
以下の問題を解いている記事を読んで、自分もやってみようと思いました。

> [たのしいRuby 第5版](https://www.sbcr.jp/product/4797386295/)から引用
>[第20章 TimeクラスとDateクラス 練習問題]
>Date クラスを使って、今月の1日と月末の日付と曜日を求め、次のような形式でカレンダーを表示させてください
>

      April 2015
Su Mo Tu We Th Fr Sa
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30

私の場合は以下のように回答しました。

```ruby:
require "date"

today = Date.today

# header
puts "#{Date::MONTHNAMES[today.month]} #{today.year}".center 21
puts ["Su", "Mo", "Tu", "

元記事を表示

Ruby で平仮名を打つとエラーが発生した!!

rubyで平仮名を打つとエラーが発生していろんなことをしてみたが解決できなくて、

which ruby

をしてみると、

/usr/bin/ruby

とのことだった。

echo $PATH

をした後に

open ~/.bash_profile

をしまして、

下記2つのがあれば良いらしいが、よくないことに、全然違うことが書いてあった。
①export PATH="$HOME/.rbenv/bin:$PATH"
②eval "$(rbenv init -)"

.bash_profileの中身を削除して上記のものを書いて保存をした後に、

$ source ~/.bash_profile

をして反映させる。

which ruby

をしてみると、

/Users/自分の名前/.rbenv/shims/ruby

と言う感じでいけた。

ruby --version

をするとしっかりと反映されていた。

参考にした記事
https://qiita.com/SAYJOY/items/be06302ae8a2fac7f0c4

めちゃくちゃわかりやすかったです、ありがとうご

元記事を表示

1-100までのカードをn-1枚置きに裏返す(Ruby)

1-100までの数字が書かれたカードが裏返しで横に並んでいます。(1, 2, 3, 4, 5... 99, 100)
①初めは2番目のカードから1枚置きにカードを裏返して行きます。
②次に3番目のカードから2枚置きにカードを裏返して行きます。
③次に4番目のカードから3枚置きにカードを裏返して行きます。



このようにn番目のカードからn-1枚置きにカードを裏返していって、これ以上カードの向きが変わらなくなるまで続けます。
#####その時に裏返っているカードは何番かを調べていきます。

##考え方
カードを左から順に裏返す処理を書いていきます。カードが表か裏かはTrue(表), またはFalse(裏)で表すことが出来ます。

### まずはカードを100枚用意します。

```ruby:qiita.rb
n = 100
cards = Array.new(n, false)
```
配列はArray.newで作成することが出来ます。
また、その時に第2引数を指定すると、新しい配列をそのオブジェクトで埋めます。
ここでは100枚全てfalse(裏)にして配列を作成しました。

元記事を表示

IBM Watson "Personality Insights" を利用した性格分析(夏目漱石「こころ」を例に)

## IBM Watson とは
> 日々の業務から生まれるデータをナレッジに変え、業務プロセスに組み込んで活用することで、プロセスの効率化や高付加価値化を実現できます。たとえば、人間には読みきれないような大量のデータの中からすばやく知見や洞察を見出したり、顧客に対してさまざまな場面で一貫した質の高い応対をすることを可能にします。また、情報と知見に基づく意思決定を支援したり、ビジネスのさまざまな業務や場面であなたをサポートします。
(引用 - IBM Watsonとは? - Japan)
https://www.ibm.com/watson/jp-ja/what-is-watson.html

- クレジットカードを登録せずに利用可能

## Personality Insights とは
- IBM Watsonが提供しているAPIの1つ。
- メール・ツイート・メッセージを分析して、個人のパーソナリティ特性を推論

**パーソナリティ特性**
ビッグ・ファイブ(big5)
- 個人が世界とどのように関与しているかを示す
- 協調性、誠実性、外向性、情緒不安定性、開放性の5つディメン

元記事を表示

ABC088B - Card Game for Two

#問題
https://atcoder.jp/contests/abs/tasks/abc088_b
スクリーンショット 2019-11-27 23.04.25.png

#1回目
##回答
```ruby
N = gets.to_i
A = gets.split.map &:to_i

for i in 0..N-2 do
for j in 0..N-2-i do
if A[j] < A[j+1] hoji = A[j] A[j] = A[j+1] A[j+1] = hoji end end end i = 0 aliceSum = 0 bobSum = 0 while i < N aliceSum += A[i] if i+1 < N

元記事を表示

Ruby学習ログ:その2【class, attr_accessor】

ハマりかけてます。
とりあえず整理するため書いていく!

[【Ruby】クラスとかインスタンスについて改めて学習してみた]
(https://qiita.com/ksk_diffeasy/items/734b4961e9e6c7480d33)

  **クラス**
=  **初期処理** + **インスタンス生成** + **インスタンスメソッド定義・実行**

ちなみにクラスの中は *初期処理* と *インスタンスメソッド定義* が含まれていれば大丈夫!
...と思ったが~~*attr_accessor*というメソッドがないとクラスの外でインスタンス生成ができないらしい~~
(scivolaさんがコメントにて間違いを指摘してくださりました。
`attr_accessor `は**メソッドを定義するメソッド**とのこと)

[attr_accessor (Module)]
(https://ref.xaio.jp/ruby/classes/module/attr_accessor)
より引用↓

```ruby
class Book
attr_accessor :title,

元記事を表示

Railsチュートリアル 第10章 - 「div.paginationが無い」と言われてテストが失敗する場合

# 何が起こったか

Railsチュートリアルも第10章まで進み、[ユーザー一覧のテスト](https://railstutorial.jp/chapters/updating_and_deleting_users?version=5.1#sec-users_index_test)を一通り書き終えました。しかし、以下のように「`div.pagination`が無い」と言われてテストが通りません。

```
# rails test test/integration/users_index_test.rb
Running via Spring preloader in process 12045
Started with run options --seed 11902

FAIL["test_index_including_pagination", UsersIndexTest, 2.137264299992239]
test_index_including_pagination#UsersIndexTest (2.14s)
Expected at least 1

元記事を表示

【Rails】ユーザーと投稿を関連づける

※この記事は[Progate Railsコース](https://prog-8.com/languages/rails5)をやってみて開発する際使えそうなおおまかな手順をメモしただけです。

# 投稿にユーザの名前と画像を表示

+ 投稿を管理しているテーブルに「どのユーザが投稿したのか」という情報を管理するためのカラム(user_id)を追加
+ 「新規投稿の際にどのユーザーが投稿したのか」という情報を(user_id)に追加
+ あとは表示するときに使うアクションでuser_idを使ってユーザ情報を集めてビューで表示

# ユーザ詳細にそのユーザの投稿一覧を作る

+ ユーザ詳細アクションでそのユーザと一致するuser_idの投稿をwhereメソッドで集めてビューで表示

# 投稿の編集と削除の制限

+ 投稿詳細表示のアクションででログインしているユーザのidと投稿のuser_idが一致したら「編集」と「削除」のリンクを表示
+ 投稿編集表示メソッド・投稿編集メソッド・投稿削除メソッドなどで現在ログインしているユーザのidと投稿のユーザidが一致しなければ投稿一覧へリダイレクト

元記事を表示

Rubyで長い文字列を書く時の備忘録

Rubyで複数行に渡る長い文字列を作成する際の備忘録です。

文字列を作成する際、シングル(or ダブル)クオーテーションで囲う書き方が一般的です。

```ruby:ダブルクオーテーション
a = "長い文字列です。
複数行にわたる文字列は
読みにくいですね。"
```

こう書けばもっと読みやすいよ。

```ruby:ヒアドキュメント
a = <

元記事を表示

特定パス以下のActionController::RoutingErrorでJSONを返却する

## 環境
Ruby 2.5.7
Rails 5.2 (ActionPack 5.2)

## コード

```lib/middleware/routing_error_response_json.rb
module YourNameSpace::Middleware
class RoutingErrorResponseJson
RESPONSE_JSON_PATHS = %w[/api/v1]

def initialize(app)
@app = app
end

def call(env)
request = ActionDispatch::Request.new(env)
status, headers, response = @app.call(env)
# NOTE: ActionController::RoutingError時に設定されるパラメータ
# See https://github.com/rails/rails/blob/5-2-stable/actionpack/

元記事を表示

Rubyのreturn備忘録

Rubyでメソッドを定義する際、他の言語経験者だと戻り値を返すためにreturnを使うことが多いかと思うのですが、
Rubyの場合はreturnを使わない書き方の方が主流です。

```ruby:メソッド定義(return版)
def add(a, b)
return a + b
end

add(1, 2)
```

```ruby:メソッド定義(主流版)
def add(a, b)
a + b
end

add(1, 2)
```

returnはメソッドを途中で脱出する場合に使われることが多い。
以下の例は、引数がnilの場合はgreetingメソッドを抜けるようreturnを使っています。

```ruby:returnの書き方
def greeting(country)
return 'countryを入力してください' if country.nil?

if country == 'japan'
・・・
end
```

以上、備忘録でした!

元記事を表示

クイズ:なぜバリデーションエラーになるでしょう

### 要約
- railsのcallbackで中間テーブルを生成する方法をミスるとvalidationエラーになるアンチパターン

### 詳細
- モデル構成

```ruby
class User < ApplicationRecord has_many :notification_settings, dependent: :destroy has_many :notifications, through: :notification_settings, dependent: :destroy after_create :create_default_notifications end class NotificationSetting < ApplicationRecord belongs_to :user belongs_to :notification validates :user_id, uniqueness: { scope: [:notification_id] } end class Notification < Applicati

元記事を表示

Rubyの丸め誤差備忘録

小数点での計算の際、思わぬバグが生じたりする。

例えば0.1かける3が0.3にならない。

```ruby:丸め誤差発生
0.1 * 3.0

=> 0.30000000000000004
```

これはPCが10進数ではなく2進数で計算していることが原因なのですが、
上記コードから、以下のような場合が発生します。

```ruby:思わぬバグ
0.1 * 3.0 == 0.3 #-> false
0.1 * 3.0 <= 0.3 #-> false
```

そのため、Rubyで小数点の計算を行うときは、Rationalクラスを使う!
数字の後ろに『r』をつけることで利用できる!

```ruby:Rationalクラス利用
0.1r * 3.0r #->3/10

# 上記を利用すると・・・
0.1r * 3.0r == 0.3 #-> true
0.1r * 3.0r <= 0.3 #-> true
```

変数に小数点が入っている場合は、rationalizeメソッドを呼び出すことでRationalクラスの数値に変換することができる!

```ruby:rational

元記事を表示

eachメソッドとifメソッドの組み合わせの例

#はじめに
この記事では、個人的に感動したeachメソッドとifメソッドを組み合わせについて解説します。
#実行
最初に今回使用するコードを提示します。

```ruby
users = ["田中", "鈴木", "佐藤", "山田", "藤本"]

puts "誰をさがしますか?"
name = gets.chomp.to_s

num = 0

users.each do |user|
if name == user
num += 1
end
end

if num > 0
puts "発見しました"
else
puts "いませんでした"
end

```

このコードは`配列users内に、入力した人名があった時に"発見しました"、無かった時に"いませんでした"と表示するプログラム`を表しています。

まず最初に配列を定義します。

```ruby
users = ["田中", "鈴木", "佐藤", "山田", "藤本"]
```
次に、文字を入力して`name`に代入するようにします。

```ruby
puts "誰をさがしますか?"
name = ge

元記事を表示

みんな大好き @mattn_jp さんのホクイモRuby ver.の解説

# 概要
@mattn さんの[ホクイモ](https://qiita.com/mattn/items/d447a43ad12fada71663)、Rubyでわからないところがあったので調べました。

# 説明
コード再掲

```ruby
puts '%1$s%1$sの%2$s'%((%w[ホイクモ]*2).map{|x|x.chars.sample(2).join})
```

`'%1$s%1$sの%2$s'%`の最後の%は[`String#%`](https://ruby-doc.org/core-2.6.5/String.html#method-i-25)で、Stringクラスのメソッドで、フォーマットに対して呼び出すと引数を適用した文字列を返してくれるそうです。

フォーマットの詳細は[`Kernel::sprintf`](https://ruby-doc.org/core-2.6.5/Kernel.html#method-i-sprintf)を見ろというので、見に行きます。

見てみると、`%`、`s`、`$`を使っているとわかります。
下記の事例などがわかりやすいですね

元記事を表示

Mac環境でRails内で別プロセスが立ち上がる処理をすると落ちてしまうとき

## 概要
Railsで`task runner`を実行しようとすると以下のエラーが起こり、途中で処理が止まってしまいました。

```
$ bundle exec rails runner -e development [タスク]
objc[13178]: +[__NSPlaceholderDictionary initialize] may have been in progress in another thread when fork() was called.
objc[13178]: +[__NSPlaceholderDictionary initialize] may have been in progress in another thread when fork() was called. We cannot safely call it or ignore it in the fork() child process. Crashing instead. Set a breakpoint on objc_initializeAfterForkError to deb

元記事を表示

Rails6 のちょい足しな新機能を試す108(multi-db abort_if_pending_migrations編)

# はじめに

Rails 6 に追加された新機能を試す第108段。 今回は、 multi-db abort_if_pending_migrations 編です。
Rails 6 では、 `rails db:abort_if_pending_migrations` が multi database に対応しました。

Ruby 2.6.5, Rails 6.0.0 で確認しました。 (Rails 6.0.1 がリリースされていますが、確認した時点ではリリースされていませんでした。)

```shell
$ rails --version
Rails 6.0.0
```

今回は、簡単なスクリプトを作って確認します。

# Rails プロジェクトを作成する

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

今回は複数のDBを作って、それぞれ、 User と Book のCRUD を作ってから、 `rails db:abort_if_pending_migrations` を実行して確認します。

# config/d

元記事を表示

OTHERカテゴリの最新記事