20201127のRubyに関する記事は30件です。

Rails RSpec による画像添付結合テスト

はじめに

RSpecによるオリジナルアプリの結合テストを行っています。画像投稿機能において、「テスト用の画像を添付する」、「添付したテスト用の画像が画面上にあるか」の2つを忘れていたので、備忘録として書き記します。

#目次
1.テスト用の画像を添付する
2.添付したテスト用の画像が画面上にあるかテストする

1.テスト用の画像を添付する

ここではimage_pathという変数にテスト用画像(test_image.jpg)を添付する。この時相対パスで指定する。
attach_fileメソッドはアップロードのinput要素にテスト用画像を添付することができる。第一引数にアップロードするinput要素のname属性の値、第二引数にアップロードする画像のパス、第三引数にオプション(ここではmake_visible: trueで一時的に表示)を設定する。

spec/system/◯◯_spec.rb
# 添付する画像を定義する
image_path = Rails.root.join('public/images/test_image.jpg')

# 画像選択フォームに画像を添付する
attach_file('desk[image]', image_path, make_visible: true)

2.添付したテスト用の画像が画面上にあるかテストする

画像を投稿すると、画像一覧ページに遷移する。遷移先で投稿した画像があるかの確認は下記コードに記す。have_selectorで要素があるか判断する。ちなみにhave_content()で文字列があるかのマッチャになる。

spec/system/◯◯_spec.rb
expect(page).to have_selector("img[src$='test_image.jpg']")

以上

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Rails】Ajaxでいいねの数を表示する方法

概要

前回の続きでいいねカウントの実装をしていいねの数を表示していきたいと思います。

APIの作成

まずJavaScriptからリクエストが来たときに返したいデータを定義していきます。
JavaScriptでリクエストを送ったら現在のいいね数をresponseで返すことができれば、実装できると思いました。

いいねの数を取得するために、LikesControllerのshowアクション内でlike_countを定義しました。

app/controllers/likes_controller.rb
def show
  like_count = @team.likes.count
  render json: { likeCount: like_count }
end

ただ、私が実装したいことは

現在のいいね数をDOMContentLoadedイベント時に取得することだけでなく、POSTとDELETEのリクエストの時にも取得したいと考えています。
そのため、showアクション内にだけ定義するのではなくcreate, destroyにも定義していく必要があります。createdestroyでもrender jsonlikeCountを入れないとJavaScriptからのリクエストに対応するデータがないのでundefinedになって返ってきてしまいます。

前回と重複するところもありますが、LikesControllerの記述はこのようになると思いました。before_action :like_countsでアクションの最初に読み込むようにしています。

LikesController

app/controllers/likes_controller.rb
class LikesController < ApplicationController
  before_action :authenticate_user!
  before_action :set_like
  before_action :like_counts

  def show
    like_status = current_user.has_liked?(@team)

    render json: { hasLiked: like_status, likeCount: like_counts }.to_json
  end

  def create
    @team.likes.create!(user_id: current_user.id)

    render json: { status: 'ok', likeCount: like_counts }.to_json
  end

  def destroy
    like = @team.likes.find_by!(user_id: current_user.id)
    like.destroy!

    render json: { status: 'ok', likeCount: like_counts }.to_json
  end

  private

  def set_like
    @team = Team.find(params[:team_id])
  end

  def like_counts
    @like_count = @team.likes.count
  end
end

どこにいいねの数を表示するのか

show.html.haml
.star_counter
  現在
  %span
  がいいねをしています。

今回、star_counterクラス内のspanタグ内にいいねの数を入れていこうかと思います。spanを入れた理由はいいねの数をscssでスタイルを調整しようと考えているからです。たとえば、以下のようにすればいいねの数だけ文字が赤く太くなります。

SCSS

scss
.star_counter {
  span {
    color: red; // 好きな色
    font-weight: bold; // 線を太くして強調
  }
}

いいねの数を取得(GET)

JavaScriptで実装したいこととしてはまず、GETリクエストで現在のいいねの数を取得することです。
そのため、GETリクエストが成功したらいいねの数を表示させていきます。

コードにするとこのようになると思いました。 ※前回と重複するところは省略しております。

jQuery
// GET, POST, DELETEリクエストで使うので処理をまとめています。
const likeCountCalculation = (likeCount) => {
// いいねの数を表示させたいところを取得。今回はstar_counterクラス内のspan要素を取得しています。その後appendで追加していくという処理です。
  $('.star_counter > span').append(
    `${likeCount}`
  )
}

// axiosでGETリクエスト成功
.then((response) => {
// response内に先程Controllerで書いたlikeCountがjson形式で返されるので取得。
  const likeCount = response.data.likeCount
// 上で定義してあるlikeCountCalculation()が呼び出されて、span要素内に現在のいいねの数が表示されるようになります。現在のいいねの数はlikeCountに入っているので関数を呼び出すときにを引数にいれています。
  likeCountCalculation(likeCount)
})

いいねの数の増減 (POST, DELETE)

はじめは、likeのcountを+1, -1することで実装すればと思っていたのですが、それよりもGETの処理と同じ考え方で現在のいいねの数を取得すれば良いのでは?と考えました。現在のというのは+1や-1されたあとのいいねの数のことです。要するに、POSTやDELETEリクエストが成功すればいいねの数は増減しているのでその値を取得することで実装できると思いました。
コードにするとこのようになると思います。POSTもDELETEも同じ記述なのでまとめて書かせていただきます。GETの処理と違う点は、リクエストが成功したらspan要素の中身を空にするということです。これをしないとリクエストの度に要素が追加されていってしまいます。

jQuery
// axiosでリクエスト(POST or DELETE)成功
.then((response) => {
  // responseに入ってくるいいねの数を取得
  const likeCount = response.data.likeCount
  // star_counterクラス内のspan要素の中身を空にする。
  $('.star_counter > span').html('')
  // 現在いいねの数を表示する。
  likeCountCalculation(likeCount)
})

まとめ

  • 前回同様やりかたは一つではないこと。
  • 親要素内の子要素を取得する方法もひとつではなく選択肢がたくさんあり、わかりやすいものを使う。(読みやすいコードだったり状況に応じて判断)
  • jsonで複数の値を返すには記述を変える必要がある。

最後に

自分の実装したいことをどうやって実現していくのか、ここの言語化が大事だと感じました。実装したいことに対して、いくつもの方法があるということは、簡単に書けるものだったり逆に複雑になってしまったりすることがあると思います。こういったところもたくさんコードを書いたり技術書を読んだり、記事を見たりして学習していくことで力をつけていきます。

参考文献

前回書いた記事です。いいねの実装をこちらでしているのでよろしければご覧ください!
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Python学習 基礎編 ~数値と計算~

こちらではPython学習の備忘録と、Ruby、JavaScriptとの比較も含め記載していきたいと思います。
プログラミング初心者や他の言語にも興味、関心をお持ちの方の参考になれば幸いです。

数値とは?

プログラミングでは、数値を扱うこともでき、文字列とは違いクォーテーションで囲む必要がない。
クォーテーションをつけると、文字列と解釈されるため、文字列と数値は明確に違うものであることを意識しよう。

計算について

数値は、足し算「+」、引き算「-」、掛け算「*」(アスタリスク)、割り算「/」(スラッシュ)、余剰(割り算の余り)「%」の計算が可能です。
また数値や記号はすべて半角で記述する。

※記号の前後の半角スペースはなくても構わないですが、入れた方がコードが見やすいと思います。

以上は、Python、Ruby、JavaScriptで共通となります。
各言語の記述を下記に記載します。

Python

script.py
print(3)  # 数値のみ
print(3 + 5)  # 対し算
print(6 - 5)  # 引き算
print(3 * 5)  # 掛け算
print(20 / 5)  # 割り算
print(8 % 5)  # 余剰(割り算の余り) 

# コンソール
3
8
1
15
4
3  # 8割る5は、1余り3

Ruby

index.rb
puts 3
puts 3 + 5
puts 6 - 5
puts 3 * 5
puts 20 / 5
puts 8 % 5

JavaScript

script.js
console.log(3);
console.log(3 + 5);
console.log(6 - 5);
console.log(3 * 5);
console.log(20 / 5);
console.log(8 % 5);

おわりに

数値に関しては、各言語ともに共通する部分が多いので覚えやすいですね。次回は文字列の連結などをやろうかな...では!

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Ruby on Railsでdeviseとscaffoldを組み合わせた際に調べたことをまとめてみた。

はじめに

Ruby on Railsでdeviseとscaffoldを使って簡易アプリを作っているときに分からないコードなど、調べたことを自分用にまとめてみました。

環境


MacOS Catalina version 10.15.7
Rails 6.0.3.4
devise 4.7.3

前提


$ rails new アプリ名でアプリができている状態

deviseの導入


以下のurlのページを参考にdeviseでログイン機能等を作成する。
rails g devise:installでファイルの作成を終えた後、下のコードを記述する。
config/environments/development.rb
config.action_mailer.default_url_options = { host: 'localhost', port: 3000 }

こちらのページ⇨ https://qiita.com/Orangina1050/items/a16e655519a60f35b394

scaffoldの導入

既に作ってあるアプリにディレクトリを移動した後、以下の形式でscaffoldを実行する。

$ rails g scaffold モデル名 カラム1:データ型1 カラム2:データ型2

自分は自己紹介をする簡易アプリなので以下のカラムを持たせた。

$ rails g scaffold intro name:string hometown:string text:content

scaffold実行後以下を行う。

$ rails db:migrate

カラムをつけ忘れて追加したい場合

rails g migration 行なう処理Toテーブル名 カラム名:データ型の形式で実行する。カラムを加えるなら、AddColumnToテーブル名というように書く。

自分は、user_idのカラムをつけ忘れたため、

$ rails g migration AddColumnToIntros user_id:integer

を行った。rails db:migrateも忘れずに。

コントローラーに設定を加える

scaffoldによってできたコントローラー(intros_controller.rb)の一番上に、
before_action :authenticate_user!を記入する。

before_action :authenticate_user!とは

authenticate_user!はdeviseを入れる事で使えるようになるヘルパーの一つで、
コントローラーに設定してログイン済ユーザーのみにアクセスを許可する。
参考 https://qiita.com/ryuuuuuuuuuu/items/bf7e2ea18ef29254b3dd

次に、newアクション内に下記を追加する。

app/controllers/intros_controller.rb
@intro = Intro.find_or_create_by(:user_id => current_user.id)

find_or_create_byとは

は引数の条件に該当するデータがあればそれを返しfind_by(attributes)、なければ新規作成create(attributes, &block)します。今回は、user_idがcurrent_user.idの場合、それを取得、なければ作成を行っている。
参考 https://qiita.com/taimuzu/items/0a21738d018f475d63ae

自己紹介を既に作成しているユーザーが新規作成のボタンを押したときに編集ページにとんでほしいのでnewアクションに

app/controllers/intros_controller.rb
redirect_to edit_intro_url(@intro)

を追記する。これはredirect_to edit_intro_url(@user.id)と同じことをやっている。
参考 https://qiita.com/Kawanji01/items/96fff507ed2f75403ecb

redirect_toのパス確認

さっき指定したリダイレクト先は、以下のコマンドを打つと様々なパスが出てくるので、そこから対象のものを探す。edit_intro_urlの部分。

$ rails routes

最後に、editアクションにidがcurrent_user.idかそうでないか分岐する処理を書く。

app/controllers/intros_controller.rb
 if @intro.user_id != current_user.id 
    flash[:notice] = "他のユーザーの編集はできません。"
    redirect_to intros_path
 end

その際に、もとからindex.html.erbとshow.html.erbに書かれている、<p id="notice"><%= notice %></p>をコメントアウトすることで、flash[:notice]の内容を表示することができる。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Ruby on Railsでdeviseとscaffoldを組み合わせた際に調べたところをまとめてみた。

はじめに

Ruby on Railsでdeviseとscaffoldを使って簡易アプリを作っているときに分からないコードなど、調べたことを自分用にまとめてみました。

環境


MacOS Catalina version 10.15.7
Rails 6.0.3.4
devise 4.7.3

前提


$ rails new アプリ名でアプリができている状態

deviseの導入


以下のurlのページを参考にdeviseでログイン機能等を作成する。
rails g devise:installでファイルの作成を終えた後、下のコードを記述する。
config/environments/development.rb
config.action_mailer.default_url_options = { host: 'localhost', port: 3000 }

こちらのページ⇨ https://qiita.com/Orangina1050/items/a16e655519a60f35b394

scaffoldの導入

既に作ってあるアプリにディレクトリを移動した後、以下の形式でscaffoldを実行する。

$ rails g scaffold モデル名 カラム1:データ型1 カラム2:データ型2

自分は自己紹介をする簡易アプリなので以下のカラムを持たせた。

$ rails g scaffold intro name:string hometown:string text:content

scaffold実行後以下を行う。

$ rails db:migrate

カラムをつけ忘れて追加したい場合

rails g migration 行なう処理Toテーブル名 カラム名:データ型の形式で実行する。カラムを加えるなら、AddColumnToテーブル名というように書く。

自分は、user_idのカラムをつけ忘れたため、

$ rails g migration AddColumnToIntros user_id:integer

を行った。rails db:migrateも忘れずに。

コントローラーに設定を加える

scaffoldによってできたコントローラー(intros_controller.rb)の一番上に、
before_action :authenticate_user!を記入する。

before_action :authenticate_user!とは

authenticate_user!はdeviseを入れる事で使えるようになるヘルパーの一つで、
コントローラーに設定してログイン済ユーザーのみにアクセスを許可する。
参考 https://qiita.com/ryuuuuuuuuuu/items/bf7e2ea18ef29254b3dd

次に、newアクション内に下記を追加する。

app/controllers/intros_controller.rb
@intro = Intro.find_or_create_by(:user_id => current_user.id)

find_or_create_byとは

は引数の条件に該当するデータがあればそれを返しfind_by(attributes)、なければ新規作成create(attributes, &block)します。今回は、user_idがcurrent_user.idの場合、それを取得、なければ作成を行っている。
参考 https://qiita.com/taimuzu/items/0a21738d018f475d63ae

自己紹介を既に作成しているユーザーが新規作成のボタンを押したときに編集ページにとんでほしいのでnewアクションに

app/controllers/intros_controller.rb
redirect_to edit_intro_url(@intro)

を追記する。これはredirect_to edit_intro_url(@user.id)と同じことをやっている。
参考 https://qiita.com/Kawanji01/items/96fff507ed2f75403ecb

redirect_toのパス確認

さっき指定したリダイレクト先は、以下のコマンドを打つと様々なパスが出てくるので、そこから対象のものを探す。edit_intro_urlの部分。

$ rails routes

最後に、editアクションにidがcurrent_user.idかそうでないか分岐する処理を書く。

app/controllers/intros_controller.rb
 if @intro.user_id != current_user.id 
    flash[:notice] = "他のユーザーの編集はできません。"
    redirect_to intros_path
 end

その際に、もとからindex.html.erbとshow.html.erbに書かれている、<p id="notice"><%= notice %></p>をコメントアウトすることで、flash[:notice]の内容を表示することができる。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

README.org

Mac OS-11.0.1 ruby-2.6.6p146

第9回 <2020-11-18 水>

assert_equal

第8回 <2020-11-11 水>

条件分岐

第7回 <2020-11-04 水>

条件分岐

第6回 <2020-10-28 水>

変数とかメソッドとか

第5回 <2020-10-21 水>

第1回目から第4回目までは環境構築だったり、gitだったりでした。今回の第5回からようやく本格スタート

README_links <2020-10-14 水>

README.org

equation <2020-10-28 水>

$$\frac{1}{4}$$


  • source ~/Library/Mobile Documents/com~apple~CloudDocs/KG/class/M1/multi_scale_sim/grad_members_20f/members/ryomichi56/README.org
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

第8回

Mac OS-11.0.1 ruby-2.6.6p146

Rake

本記事は大学院前期過程の講義[マルチスケールシミュレーション特論]に関する記事です

自動化

rake とは?

make とかのRuby版。Rakefile の記述に沿って、自動で処理を行ってくれる。うん、単純。講義で扱った例を見てみる。

task :default do
  system 'rake -T'
  exit
end

desc 'hello NAME'
task :hello do
  name = ARGV[1]
  puts "Hello #{name}!"
  exit
end

意味解説

上記例を読み解いていく。まず、これの実行は

$ rake

すると、このような出力を得る。

rake hello  # hello NAME

これは、引数なしで実行した時の動作(default)が rake -T を実行するようにRakefileで記述されているからである。 rake -T はRakefileに記述されているタスク一覧を表示するコマンドである。詳しい記述法は以下である。

  • descの後にはrake -Tとした時の説明文(description)
  • :defaultはrakeが引数なしで呼ばれた時の動作
  • それ以外はoptionで呼ばれるtaskの名前
  • taskの中には標準のruby言語で,動作を記述

いざ、実践!

desc 'git push'
task :push do
  ["git pull origin main",
    "git add -A",
    "git commit -m \'hoge\'",
    "git pull origin main",
    "git push origin main"].each do |comm|
    puts comm.green
    system comm
  end
  exit
end

かなり罪深い。gitの一連の流れを自動化してしまった。コミットのコメントなんて、毎回同じやし。まぁいいか。本番環境ではダメ、ゼッタイ。いや、こうしよう。

desc 'git push'
task :push do
  com = ARGV[1]
  ["git pull origin main",
    "git add -A",
    "git commit -m \'"+com+"\'",
    "git pull origin main",
    "git push origin main"].each do |comm|
    puts comm.green
    system comm
  end
  exit
end

これによって、

rake push "mod"

としたらコミットメッセージも変更できる。便利。


  • source ~/Library/Mobile Documents/com~apple~CloudDocs/KG/class/M1/multi_scale_sim/grad_members_20f/members/ryomichi56/./qiita/no8.org
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

第8回、Rakeで作業自動化

Mac OS-11.0.1 ruby-2.6.6p146

Rake

本記事は大学院前期過程の講義[マルチスケールシミュレーション特論]に関する記事です

自動化

rake とは?

make とかのRuby版。Rakefile の記述に沿って、自動で処理を行ってくれる。うん、単純。講義で扱った例を見てみる。

task :default do
  system 'rake -T'
  exit
end

desc 'hello NAME'
task :hello do
  name = ARGV[1]
  puts "Hello #{name}!"
  exit
end

意味解説

上記例を読み解いていく。まず、これの実行は

$ rake

すると、このような出力を得る。

rake hello  # hello NAME

これは、引数なしで実行した時の動作(default)が rake -T を実行するようにRakefileで記述されているからである。 rake -T はRakefileに記述されているタスク一覧を表示するコマンドである。詳しい記述法は以下である。

  • descの後にはrake -Tとした時の説明文(description)
  • :defaultはrakeが引数なしで呼ばれた時の動作
  • それ以外はoptionで呼ばれるtaskの名前
  • taskの中には標準のruby言語で,動作を記述

いざ、実践!

desc 'git push'
task :push do
  ["git pull origin main",
    "git add -A",
    "git commit -m \'hoge\'",
    "git pull origin main",
    "git push origin main"].each do |comm|
    puts comm.green
    system comm
  end
  exit
end

かなり罪深い。gitの一連の流れを自動化してしまった。コミットのコメントなんて、毎回同じやし。まぁいいか。本番環境ではダメ、ゼッタイ。いや、こうしよう。

desc 'git push'
task :push do
  com = ARGV[1]
  ["git pull origin main",
    "git add -A",
    "git commit -m \'"+com+"\'",
    "git pull origin main",
    "git push origin main"].each do |comm|
    puts comm.green
    system comm
  end
  exit
end

これによって、

rake push "mod"

としたらコミットメッセージも変更できる。便利。


  • source ~/Library/Mobile Documents/com~apple~CloudDocs/KG/class/M1/multi_scale_sim/grad_members_20f/members/ryomichi56/./qiita/no8.org
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

第7回

Mac OS-11.0.1 ruby-2.6.6p146

条件分岐

本記事は大学院前期過程の講義[マルチスケールシミュレーション特論]に関する記事です

if-elsif-else-end

お題

閏年の判定。テストする年は 2004, 1999, 1900, 2000 この4つで。

Ruby での条件分岐

Ruby のリファレンシャルマニュアルにはこう書かれている。

if  [then]
   ...
[elsif  [then]
   ... ]
...
[else
   ... ]
end

[]は省略可能を意味する。注意すべきは else if でなく elif でもなく elsif であることくらいで、そんなに目新しいことはない。 then も省略できるし簡単そう。けど上のマニュアルの記述はわかりずらいので例を出していく.

類題を解く

  • 2004年は?

A. 閏年である。4で割り切れるから。その条件分岐を書くには?

p year = ARGV[0].to_i
if year % 4 == 0
  p true
end

上のコードは実行時に引数を受け取って実行すると、引数をIntegerに変換して4で割った余りが0かどうかを判断して、そうであれば true を返す。

  • 1999 はfalse
p year = ARGV[0].to_i
if year % 4 == 0
  p true
else
  p false
end

簡単!

  • 1900年は?

A. Not 閏年。100で割り切れるから。

p year = ARGV[0].to_i
if year % 100 == 0
  p false
elsif year % 4 == 0
  p true
else
  p false
end
  • 2000年は?

A. 閏年。400で割り切れるから。

p year = ARGV[0].to_i
if yeay % 400 == 0
  p true
elsif year % 100 == 0
  p false
elsif year % 4 == 0
  p true
else
  p false
end

テストするのに引数だと面倒臭い

配列に年を入れてループで回す。

[1900,2004,1999,2000].each do |year|
  p year
  if yeay % 400 == 0
    p true
  elsif year % 100 == 0
    p false
  elsif year % 4 == 0
    p true
  else
    p false
  end
end

メソッド化しよう

def leap?(year)
  if yeay % 400 == 0
    p true
  elsif year % 100 == 0
    p false
  elsif year % 4 == 0
    p true
  else
    p false
  end
end
[1900,2004,1999,2000].each do |year|
  p year
  leap?(year)
end

ぽいことになってきたー。

case

case を使うと綺麗になる?

さっきも出てきた、リファレンシャルマニュアルをみると、こう書かれている。

case []
[when  [, ] ...[, `*' 式] [then]
  式..]..
[when `*'  [then]
  ..]..
[else
  ..]
end

これはわかりずらい。マニュアルにある例を借りてくるとわかりやすい。

case age
when 0 .. 2
  "baby"
when 3 .. 6
  "little child"
when 7 .. 12
  "child"
when 13 .. 18
  "youth"
else
  "adult"
end

これを使ってさっきの閏年の判定を綺麗にしよう。

def leap?(year)
  return case
    when year % 400 ==0
      true
    when year % 100 ==0
      false
    when year % 4 ==0
      true
    else
      false
  end
end
[1900,2004,1999,2000].each do |year|
  p year
  leap?(year)
end

実行結果の確認。

$ ruby leap_year.rb
1900
false
2004
true
1999
false
2000
true

おおーいい感じ。以上。


  • source ~/Library/Mobile Documents/com~apple~CloudDocs/KG/class/M1/multi_scale_sim/grad_members_20f/members/ryomichi56/./qiita/no7.org
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

第7回、Rubyの条件分岐

Mac OS-11.0.1 ruby-2.6.6p146

条件分岐

本記事は大学院前期過程の講義[マルチスケールシミュレーション特論]に関する記事です

if-elsif-else-end

お題

閏年の判定。テストする年は 2004, 1999, 1900, 2000 この4つで。

Ruby での条件分岐

Ruby のリファレンシャルマニュアルにはこう書かれている。

if  [then]
   ...
[elsif  [then]
   ... ]
...
[else
   ... ]
end

[]は省略可能を意味する。注意すべきは else if でなく elif でもなく elsif であることくらいで、そんなに目新しいことはない。 then も省略できるし簡単そう。けど上のマニュアルの記述はわかりずらいので例を出していく.

類題を解く

  • 2004年は?

A. 閏年である。4で割り切れるから。その条件分岐を書くには?

p year = ARGV[0].to_i
if year % 4 == 0
  p true
end

上のコードは実行時に引数を受け取って実行すると、引数をIntegerに変換して4で割った余りが0かどうかを判断して、そうであれば true を返す。

  • 1999 はfalse
p year = ARGV[0].to_i
if year % 4 == 0
  p true
else
  p false
end

簡単!

  • 1900年は?

A. Not 閏年。100で割り切れるから。

p year = ARGV[0].to_i
if year % 100 == 0
  p false
elsif year % 4 == 0
  p true
else
  p false
end
  • 2000年は?

A. 閏年。400で割り切れるから。

p year = ARGV[0].to_i
if yeay % 400 == 0
  p true
elsif year % 100 == 0
  p false
elsif year % 4 == 0
  p true
else
  p false
end

テストするのに引数だと面倒臭い

配列に年を入れてループで回す。

[1900,2004,1999,2000].each do |year|
  p year
  if yeay % 400 == 0
    p true
  elsif year % 100 == 0
    p false
  elsif year % 4 == 0
    p true
  else
    p false
  end
end

メソッド化しよう

def leap?(year)
  if yeay % 400 == 0
    p true
  elsif year % 100 == 0
    p false
  elsif year % 4 == 0
    p true
  else
    p false
  end
end
[1900,2004,1999,2000].each do |year|
  p year
  leap?(year)
end

ぽいことになってきたー。

case

case を使うと綺麗になる?

さっきも出てきた、リファレンシャルマニュアルをみると、こう書かれている。

case []
[when  [, ] ...[, `*' 式] [then]
  式..]..
[when `*'  [then]
  ..]..
[else
  ..]
end

これはわかりずらい。マニュアルにある例を借りてくるとわかりやすい。

case age
when 0 .. 2
  "baby"
when 3 .. 6
  "little child"
when 7 .. 12
  "child"
when 13 .. 18
  "youth"
else
  "adult"
end

これを使ってさっきの閏年の判定を綺麗にしよう。

def leap?(year)
  return case
    when year % 400 ==0
      true
    when year % 100 ==0
      false
    when year % 4 ==0
      true
    else
      false
  end
end
[1900,2004,1999,2000].each do |year|
  p year
  leap?(year)
end

実行結果の確認。

$ ruby leap_year.rb
1900
false
2004
true
1999
false
2000
true

おおーいい感じ。以上。


  • source ~/Library/Mobile Documents/com~apple~CloudDocs/KG/class/M1/multi_scale_sim/grad_members_20f/members/ryomichi56/./qiita/no7.org
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

第6回

Mac OS-11.0.1 ruby-2.6.6p146

変数とメソッド

本記事は大学院前期過程の講義[マルチスケールシミュレーション特論]に関する記事です

変数(variable)

お題

受け取った引数ARGV[0]をnameという変数に代入してそれを出力する

Rudy

Ruby での変数

ruby には型宣言の必要がなく、いい感じに型を決めてくれる。代入はいつものようにできる。

name = 'Rudy'

類題を解く

  • name に代入して Ruby と出力
name = 'Ruby'

puts "hello #{name}."
  • ARGV[0] を受け取って, 自分の名前を返す。
name = ARGV[0]

puts "hello #{name}."

メソッド(method)

お題

$ ruby hello\_method.rb RudyHell Rudy.

となる hello method を作る。

Ruby のmethod

Ruby での関数は method を定義する。method は 0 個以上の引数を受け取ることができる。例として、以下。

def hello(name)
  p name
end

類題を解く

def hello(name)
  p "hello #{name}"
end

name = ARGV[0]
hello(name)

おまけ

最終はこうした。

def hello(name)
  puts "hello #{name}"
end

def gets_name
  name = ARGV[0]
  if name == nil
    puts "What\'s your name? "
    name = gets.chomp
  end
  return name
end

hello gets_name

  • source ~/Library/Mobile Documents/com~apple~CloudDocs/KG/class/M1/multi_scale_sim/grad_members_20f/members/ryomichi56/./qiita/no6.org
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

第6回、Rubyの変数とメソッド

Mac OS-11.0.1 ruby-2.6.6p146

変数とメソッド

本記事は大学院前期過程の講義[マルチスケールシミュレーション特論]に関する記事です

変数(variable)

お題

受け取った引数ARGV[0]をnameという変数に代入してそれを出力する

Rudy

Ruby での変数

ruby には型宣言の必要がなく、いい感じに型を決めてくれる。代入はいつものようにできる。

name = 'Rudy'

類題を解く

  • name に代入して Ruby と出力
name = 'Ruby'

puts "hello #{name}."
  • ARGV[0] を受け取って, 自分の名前を返す。
name = ARGV[0]

puts "hello #{name}."

メソッド(method)

お題

$ ruby hello\_method.rb RudyHell Rudy.

となる hello method を作る。

Ruby のmethod

Ruby での関数は method を定義する。method は 0 個以上の引数を受け取ることができる。例として、以下。

def hello(name)
  p name
end

類題を解く

def hello(name)
  p "hello #{name}"
end

name = ARGV[0]
hello(name)

おまけ

最終はこうした。

def hello(name)
  puts "hello #{name}"
end

def gets_name
  name = ARGV[0]
  if name == nil
    puts "What\'s your name? "
    name = gets.chomp
  end
  return name
end

hello gets_name

  • source ~/Library/Mobile Documents/com~apple~CloudDocs/KG/class/M1/multi_scale_sim/grad_members_20f/members/ryomichi56/./qiita/no6.org
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

第5回

Mac OS-11.0.1 ruby-2.6.6p146

Ruby で標準出力

本記事は大学院前期過程の講義[マルチスケールシミュレーション特論]に関する記事です

puts hello_world

お題

Hello world.

これを出力してみる

Ruby の文字出力

method 使いどき
print 基本はこれ、改行はセルフ
puts まぁ普通に使う、改行は自動
p これは debug で使うらしい。
pp pのpretty print で,require 'pp' が必要らしい。
printf C のこれも使える。formatを指定できるから便利な時もある。

やってみよ

  • puts
puts 'hello world'

をファイル puts_hello_world.rb に記述して

$ ruby puts_hello_world.rb

でた。

hello world

類題

  • pとかprintとか
# coding: utf-8
# start here for print, p and pp

# print は改行なしで文字列が出力される。
print 'hello world'

# p は改行込みで出力されるが、文字列はダブルクォーテーションで囲まれる
p 'hello world'

## pp も p と見かけは同じである。
pp 'hello world'

gets もあるけど今回はARGV[0]

お題

$ ruby hello_name.rb Rudy

このコマンドに対して

Hello Rudy.

と出力されるようにする。

Ruby の文字入力

まぁ順当にいけばputsしたしgetsだけど、この講義はCLIの引数から拾ってくる。ファイル hello_name.rb に以下を記述して

puts ARGV[0]

からのコマンド

$ ruby hello_name.rb Rudy

出る。

Ruby

この辺はまぁ普通かな。Hello Rudy. とさせるのはいろんな方法があって、

puts puts "Hello " + ARGV[0]
puts puts "Hello #{ARGV[0]}"
print print "Hello #{ARGV[0]}\n"
print print "Hello " + ARGV[0] + "\n"

だそうです。

やってみよ

これを用いてさっきの hello_name.rb を書き換える。

puts "hello #{ARGV[0]}."

それから

$ ruby hello_name.rb Rudy

出る。

hello Ruby.

リダイレクト(redirect)

標準出力をファイルに書き込む

Bash等にはファイルディスクリプタを変更する機能が備わっている。まぁゆうたら標準出力をターミナル画面に表示するんじゃなくてファイルに書き込める。

# ruby hello_name.rb bob > hello_name.txt

ってやったら、~hello_name.txt~ に出力結果が出力される(追記じゃなくて上書き)

# cat hello_name.txt

をしてみると中身を見れる。

hello bob.

ちなみにファイル最後尾に追記したいときは

# ruby hello_name.rb bob >> hello_name.txt

みたいに >> ってする。両方とも、ファイルが無かったら新規に作成してくれる。


  • source ~/Library/Mobile Documents/com~apple~CloudDocs/KG/class/M1/multi_scale_sim/grad_members_20f/members/ryomichi56/./qiita/no5_1.org
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

第5回、Rubyに触れる

Mac OS-11.0.1 ruby-2.6.6p146

Ruby で標準出力

本記事は大学院前期過程の講義[マルチスケールシミュレーション特論]に関する記事です

puts hello_world

お題

Hello world.

これを出力してみる

Ruby の文字出力

method 使いどき
print 基本はこれ、改行はセルフ
puts まぁ普通に使う、改行は自動
p これは debug で使うらしい。
pp pのpretty print で,require 'pp' が必要らしい。
printf C のこれも使える。formatを指定できるから便利な時もある。

やってみよ

  • puts
puts 'hello world'

をファイル puts_hello_world.rb に記述して

$ ruby puts_hello_world.rb

でた。

hello world

類題

  • pとかprintとか
# coding: utf-8
# start here for print, p and pp

# print は改行なしで文字列が出力される。
print 'hello world'

# p は改行込みで出力されるが、文字列はダブルクォーテーションで囲まれる
p 'hello world'

## pp も p と見かけは同じである。
pp 'hello world'

gets もあるけど今回はARGV[0]

お題

$ ruby hello_name.rb Rudy

このコマンドに対して

Hello Rudy.

と出力されるようにする。

Ruby の文字入力

まぁ順当にいけばputsしたしgetsだけど、この講義はCLIの引数から拾ってくる。ファイル hello_name.rb に以下を記述して

puts ARGV[0]

からのコマンド

$ ruby hello_name.rb Rudy

出る。

Ruby

この辺はまぁ普通かな。Hello Rudy. とさせるのはいろんな方法があって、

puts puts "Hello " + ARGV[0]
puts puts "Hello #{ARGV[0]}"
print print "Hello #{ARGV[0]}\n"
print print "Hello " + ARGV[0] + "\n"

だそうです。

やってみよ

これを用いてさっきの hello_name.rb を書き換える。

puts "hello #{ARGV[0]}."

それから

$ ruby hello_name.rb Rudy

出る。

hello Ruby.

リダイレクト(redirect)

標準出力をファイルに書き込む

Bash等にはファイルディスクリプタを変更する機能が備わっている。まぁゆうたら標準出力をターミナル画面に表示するんじゃなくてファイルに書き込める。

# ruby hello_name.rb bob > hello_name.txt

ってやったら、~hello_name.txt~ に出力結果が出力される(追記じゃなくて上書き)

# cat hello_name.txt

をしてみると中身を見れる。

hello bob.

ちなみにファイル最後尾に追記したいときは

# ruby hello_name.rb bob >> hello_name.txt

みたいに >> ってする。両方とも、ファイルが無かったら新規に作成してくれる。


  • source ~/Library/Mobile Documents/com~apple~CloudDocs/KG/class/M1/multi_scale_sim/grad_members_20f/members/ryomichi56/./qiita/no5_1.org
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

第5回...の前に

Mac OS-11.0.1 ruby-2.6.6p146

Ruby … その前に

本記事は大学院前期過程の講義[マルチスケールシミュレーション特論]に関する記事です

CUI

CUI はとても便利。しかし時には GUI の方が便利な時もある。だから CUI vs GUI ではなく、CUI × GUI で両方のいいところを用いて生産性を爆上げしよう。

ここで、生産性を左右するのはキーバインドが使えるかどうか。GUI でも CUI でも、キーバインドが左右する。

  • (ex.) cmd+c, cmd+v, ctrl+a, ctrl+e

Shell

shell に命令を渡してやりとり。命令はコマンドと呼ばれる。

command は

  • $command [options] [arg0] [arg1] ...

が基本。 [] は省略可能を意味し、options は - あるいは -- の後ろに適宜入力。

Directory

ディレクトリ(Direry) は Linux でコマンドを扱う上で理解が必須。

絶対パス

  • /Users/ryo/Documents/hogehoge.txt
    • フルパスと呼ばれることもある。
    • ルートディレクトリからの目的地までの経路を示す。

相対パス

  • ./Documents/hogehoge.txt
    • これはユーザーが作業中の位置をスタート地点として目的地までの経路を示す。
    • 上記例ではユーザーが /Users/ryo で作業中であることを前提に hogehoge.txt を示すことができる。

コマンド

超基本的だから説明は無しで羅列します。

  • open <- Mac Only
  • mkdir
  • pwd
  • cd [dir|..]
  • ls

emacs

emacs はターミナル上で動作する高機能なeditor。

  • 端末上で遠隔のファイル ( ssh サーバ等) を編集するのに向いている。(今は)
  • マウスを使う前提で設計されてないのでキーバインドは必須。

  • source ~/Library/Mobile Documents/com~apple~CloudDocs/KG/class/M1/multi_scale_sim/grad_members_20f/members/ryomichi56/./qiita/no5_0.org
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

第5回...の前に、CUIと仲良くなりたい

Mac OS-11.0.1 ruby-2.6.6p146

Ruby … その前に

本記事は大学院前期過程の講義[マルチスケールシミュレーション特論]に関する記事です

CUI

CUI はとても便利。しかし時には GUI の方が便利な時もある。だから CUI vs GUI ではなく、CUI × GUI で両方のいいところを用いて生産性を爆上げしよう。

ここで、生産性を左右するのはキーバインドが使えるかどうか。GUI でも CUI でも、キーバインドが左右する。

  • (ex.) cmd+c, cmd+v, ctrl+a, ctrl+e

Shell

shell に命令を渡してやりとり。命令はコマンドと呼ばれる。

command は

  • $command [options] [arg0] [arg1] ...

が基本。 [] は省略可能を意味し、options は - あるいは -- の後ろに適宜入力。

Directory

ディレクトリ(Direry) は Linux でコマンドを扱う上で理解が必須。

絶対パス

  • /Users/ryo/Documents/hogehoge.txt
    • フルパスと呼ばれることもある。
    • ルートディレクトリからの目的地までの経路を示す。

相対パス

  • ./Documents/hogehoge.txt
    • これはユーザーが作業中の位置をスタート地点として目的地までの経路を示す。
    • 上記例ではユーザーが /Users/ryo で作業中であることを前提に hogehoge.txt を示すことができる。

コマンド

超基本的だから説明は無しで羅列します。

  • open <- Mac Only
  • mkdir
  • pwd
  • cd [dir|..]
  • ls

emacs

emacs はターミナル上で動作する高機能なeditor。

  • 端末上で遠隔のファイル ( ssh サーバ等) を編集するのに向いている。(今は)
  • マウスを使う前提で設計されてないのでキーバインドは必須。

  • source ~/Library/Mobile Documents/com~apple~CloudDocs/KG/class/M1/multi_scale_sim/grad_members_20f/members/ryomichi56/./qiita/no5_0.org
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

第9回

Mac OS-11.0.1 ruby-2.6.6p146

assert_equal

本記事は大学院前期過程の講義[マルチスケールシミュレーション特論]に関する記事です
assert_equal は、イコール(両者が等しい)かどうかを確かめる関数。これを作っていく。

とりあえず

思いつく範囲でとりあえず書いてみる。

def assert_equal(expected, result)
  return expected == result
end

p assert_equal(1, 1)

これを実行する。

$ ruby assert_equal.rb
true

よし。

色、つけてみる?

$ gem install colorize

してから、

require 'colorize'

def assert_equal(expected, result)
  if expected == result
    puts 'true'.green
  else
    puts 'false'.red
  end
end
assert_equal(1, 1)
assert_equal(1, 2)

みたいなプログラムを実行!

$ ruby assert_equal.rb
true
false

truefalse になった!

出力を豪華にしてみる?

require 'colorize'

def assert_equal(expected, result)
  puts "expected :: #{expected}"
  puts "result   :: #{result}"
  if expected == result
    puts 'succeeded in assert_equal.'.green
  else
    puts 'failed in assert_equal.'.red
  end
end

assert_equal(1, 1)
assert_equal(1, 2)

実行!

$ ruby assert_equal_richer_output.rb
expected :: 1
result   :: 1
succeeded in assert_equal.
expected :: 1
result   :: 2
failed in assert_equal.

qiitaでは色変わらないけど、ターミナル上では変わってます。

まぁNot Equal もやるか〜

require 'colorize'

def assert_not_equal(expected, result)
  puts "expected :: #{expected}"
  puts "result   :: #{result}"
  if expected != result
    puts 'succeeded in assert_not_equal.'.green
  else
    puts 'failed in assert_not_equal.'.red
  end
end

assert_not_equal(1, 1)
assert_not_equal(1, 2)

簡単。

$ ruby assert_not_equal_richer_output.rb
expected :: 1
result   :: 1
failed in assert_not_equal.
expected :: 1
result   :: 2
succeeded in assert_not_equal.

ファイルをまとめて汎用化

上の、イコールとノットイコールをまとめて、重複してる部分はまとめて、さらに外部からも呼び出します。まずは重複部分の整理

require 'colorize'

def puts_vals(expected, result)
  puts "expected :: #{expected}"
  puts "result   :: #{result}"
end

def assert_equal(expected, result)
  puts_vals(expected, result)
  print  expected = result ?
    "succeeded in #{__method__}.\n".green :
    "failed in #{__method__}.\n".red
end

def assert_not_equal(expected, result)
  puts_vals(expected, result)
  print expected != result ?
    "succeeded in #{__method__}.\n".green :
    "failed in #{__method__}.\n".red
end

assert_equal(1, 1)
assert_equal(1, 2)
assert_not_equal(1, 2)
assert_not_equal(1, 1)

これを外部ファイルからも呼び出したい。

require './assert_equal'

assert_equal(2, 1*2)
assert_not_equal('bob', 'bob2')

みたいな感じ。けど、外部から呼び出したら、tail の4行も実行されてしまう。これを避ける方法がある。

これはもう覚えるしかない。

if $PROGRAM_NAME == __FILE__
  assert_equal(1, 1)
  assert_equal(1, 2)
  assert_not_equal(1, 2)
  assert_not_equal(1, 1)
end

これは、実行中のプログラムのファイル名と、記述されているファイル名が一致したら、という構文である。例えば、上記コードが A.rb に記述されていて、 B.rb から呼び出されても実行されない。最終はこうなった。

require 'colorize'

def puts_vals(expected, result)
  puts "expected :: #{expected}"
  puts "result   :: #{result}"
end

def assert_equal(expected, result)
  puts_vals(expected, result)
  print  expected = result ?
    "succeeded in #{__method__}.\n".green :
    "failed in #{__method__}.\n".red
end

def assert_not_equal(expected, result)
  puts_vals(expected, result)
  print expected != result ?
    "succeeded in #{__method__}.\n".green :
    "failed in #{__method__}.\n".red
end

if $PROGRAM_NAME == __FILE__
  assert_equal(1, 1)
  assert_equal(1, 2)
  assert_not_equal(1, 2)
  assert_not_equal(1, 1)
end

いい感じ!!今後の講義でもこのメソッドは活用するらしい。


  • source ~/Library/Mobile Documents/com~apple~CloudDocs/KG/class/M1/multi_scale_sim/grad_members_20f/members/ryomichi56/./qiita/no9.org
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

第9回、Rubyでassert_equal

Mac OS-11.0.1 ruby-2.6.6p146

assert_equal

本記事は大学院前期過程の講義[マルチスケールシミュレーション特論]に関する記事です
assert_equal は、イコール(両者が等しい)かどうかを確かめる関数。これを作っていく。

とりあえず

思いつく範囲でとりあえず書いてみる。

def assert_equal(expected, result)
  return expected == result
end

p assert_equal(1, 1)

これを実行する。

$ ruby assert_equal.rb
true

よし。

色、つけてみる?

$ gem install colorize

してから、

require 'colorize'

def assert_equal(expected, result)
  if expected == result
    puts 'true'.green
  else
    puts 'false'.red
  end
end
assert_equal(1, 1)
assert_equal(1, 2)

みたいなプログラムを実行!

$ ruby assert_equal.rb
true
false

truefalse になった!

出力を豪華にしてみる?

require 'colorize'

def assert_equal(expected, result)
  puts "expected :: #{expected}"
  puts "result   :: #{result}"
  if expected == result
    puts 'succeeded in assert_equal.'.green
  else
    puts 'failed in assert_equal.'.red
  end
end

assert_equal(1, 1)
assert_equal(1, 2)

実行!

$ ruby assert_equal_richer_output.rb
expected :: 1
result   :: 1
succeeded in assert_equal.
expected :: 1
result   :: 2
failed in assert_equal.

qiitaでは色変わらないけど、ターミナル上では変わってます。

まぁNot Equal もやるか〜

require 'colorize'

def assert_not_equal(expected, result)
  puts "expected :: #{expected}"
  puts "result   :: #{result}"
  if expected != result
    puts 'succeeded in assert_not_equal.'.green
  else
    puts 'failed in assert_not_equal.'.red
  end
end

assert_not_equal(1, 1)
assert_not_equal(1, 2)

簡単。

$ ruby assert_not_equal_richer_output.rb
expected :: 1
result   :: 1
failed in assert_not_equal.
expected :: 1
result   :: 2
succeeded in assert_not_equal.

ファイルをまとめて汎用化

上の、イコールとノットイコールをまとめて、重複してる部分はまとめて、さらに外部からも呼び出します。まずは重複部分の整理

require 'colorize'

def puts_vals(expected, result)
  puts "expected :: #{expected}"
  puts "result   :: #{result}"
end

def assert_equal(expected, result)
  puts_vals(expected, result)
  print  expected = result ?
    "succeeded in #{__method__}.\n".green :
    "failed in #{__method__}.\n".red
end

def assert_not_equal(expected, result)
  puts_vals(expected, result)
  print expected != result ?
    "succeeded in #{__method__}.\n".green :
    "failed in #{__method__}.\n".red
end

assert_equal(1, 1)
assert_equal(1, 2)
assert_not_equal(1, 2)
assert_not_equal(1, 1)

これを外部ファイルからも呼び出したい。

require './assert_equal'

assert_equal(2, 1*2)
assert_not_equal('bob', 'bob2')

みたいな感じ。けど、外部から呼び出したら、tail の4行も実行されてしまう。これを避ける方法がある。

これはもう覚えるしかない。

if $PROGRAM_NAME == __FILE__
  assert_equal(1, 1)
  assert_equal(1, 2)
  assert_not_equal(1, 2)
  assert_not_equal(1, 1)
end

これは、実行中のプログラムのファイル名と、記述されているファイル名が一致したら、という構文である。例えば、上記コードが A.rb に記述されていて、 B.rb から呼び出されても実行されない。最終はこうなった。

require 'colorize'

def puts_vals(expected, result)
  puts "expected :: #{expected}"
  puts "result   :: #{result}"
end

def assert_equal(expected, result)
  puts_vals(expected, result)
  print  expected = result ?
    "succeeded in #{__method__}.\n".green :
    "failed in #{__method__}.\n".red
end

def assert_not_equal(expected, result)
  puts_vals(expected, result)
  print expected != result ?
    "succeeded in #{__method__}.\n".green :
    "failed in #{__method__}.\n".red
end

if $PROGRAM_NAME == __FILE__
  assert_equal(1, 1)
  assert_equal(1, 2)
  assert_not_equal(1, 2)
  assert_not_equal(1, 1)
end

いい感じ!!今後の講義でもこのメソッドは活用するらしい。


  • source ~/Library/Mobile Documents/com~apple~CloudDocs/KG/class/M1/multi_scale_sim/grad_members_20f/members/ryomichi56/./qiita/no9.org
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Ruby 技術者認定試験 Gold に合格しました

はじめに

Ruby技術者認定試験 Silver 合格から半年たちましたが、
2020-11-27 に Ruby技術者認定試験 Gold に合格しました。
20201127a.png

この記事が受験を考えている方の参考になれば幸いです。

勉強方法

勉強は次の4つを行いました。

  • AtCoder
  • 試験対策本
  • 模擬試験
  • web上の体験談

AtCoder

AtCoder さんの問題を引き続き解いております。
AtCoderの問題でクラスを使用する機会は少ないのですが、他の競技者のコードを読んだりすることにより、コードの読解力が深まると思います。

使用頻度:中

試験対策本

試験対策本はSilverに引き続き次の本を使用しました。
Ruby技術者認定試験合格教本 Silver/Gold対応 Ruby公式資格教科書
サポートページ
第4章 オブジェクト指向と第5章 組み込みクラスを中心に読み返しました。
第8章 Ruby技術者認定試験Gold演習問題はさらさらっと見ただけで、もう少しやっておけば点数が取れたと思います。

評判のメタプログラミングRuby 第2版 は図書館で2回借りましたが、合わなかったようでほとんど読まなかったです。

使用頻度:中

模擬試験

模擬試験問題は次のページを使用しました。
+ スマホでRuby試験勉強 | Ruby1問1答
+ REx - Ruby Examination

上の2つは繰返し解くことができますので、学習効果が高いと思います。
Ruby1問1答 は本番より易し目、REx - Ruby Examinationは本番より難し目と思います。
お薦めは、Ruby1問1答を覚えない程度に毎日やることだと思います。

使用頻度:高

web上の体験記

やはり頻繫に出題される問題や引っ掛かりやすい問題もあるようですので、体験記が役立ちます。
気軽に楽しくプログラムと遊ぶ
資格取得に40代後半からチャレンジ
Qiita にも沢山あります。

使用頻度:特高

まとめ

試験勉強に一番のお薦めは、Ruby1問1答 です。REx は難しいので心が折れる
毎日、少しずつやる事が定着につながると思います。
但し、問題数に限りもあり幅が狭くなると思われますので、試験対策本で補う必要はあると思います。
ある程度自信が付いたところで、体験記を参考に仕上げをやるといいと思います。

最後に、Qiitaの記事にコメントをいただいた皆様に感謝を申し上げます。

ruby.rb
begin
  puts "Ruby Gold" + "を受験しょう".to_str
rescue
  p "StandardErrorとそのサブクラス".inspect
ensure
  print "Happy Programming".to_s
end
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Rails seedファイルによる初期データの設定

HerokuでRailsアプリをデプロイした際に自身のアプリケーションでは管理権限のあるユーザーしかユーザーを作成出来ない仕様のアプリケーションなのですが、root画面がログイン画面なので操作出来ないと思い色々考えていたらseedファイルという便利なものがあるのを知り導入しました。

seedファイルとは

初期データを記述できるファイルです。これがある事で上の件であったり、データベースを作り直す度にテストユーザーの作成時間を短縮する事が出来ます。

db/seeds.rbに記述します。

User.create!(
   name: 'テスト',
   email: 'test@test.com',
   password: 'xxxxxx',
   admin: true
)

開発環境に反映する

$rails db:seed

Heroku: 本番環境に反映する

heroku run rake db:seed

↑がないと本番環境に反映されません。

ちなみになんですが恥ずかしながら、HerokuでもRails cが使えるのを知らなかったです。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[Rails]deleteメソッドとdestroyメソッドの違いについて!![初心者]

はじめに

先日、とあるアプリケーションを作成していて、deleteメソッドdestroyメソッドのどちらを使うべきか、分からなくなってしまったので、備忘録も兼ねてアウトプットします!!

deleteメソッドについて

指定した条件のレコードを、SQLを直接実行することで削除します。
ActiveRecordを介さないということなので、モデルを経由しません。
また、モデルで関連付けされているレコードがあったとしても、そちらは削除されません。

User.find(id: 1).delete

destroyメソッドについて

ActiveRecordを介して、指定した条件のレコードを削除するメソッドです。
モデル内で、dependent: :destoryが設定されていれば、関連付けされているデータも併せて削除されます。
ActiveRecordを介しているので、callbackメソッドやバリデーションを機能させることもできます。

メソッドの実行時にエラーが発生し、削除ができなかった場合は、falseを返すだけで、例外は返却されません。
なので、「とりあえずデータを削除したいが、失敗した場合はエラーを返却してほしいな...」という場合は、destroy!メソッドを使用すれば大丈夫です。

User.find(id: 1).destroy

例えば、Userモデルに多数のBookモデルが関連付けされている場合、id: 1のユーザーが投稿したbookに関しても、同時に削除がされることになります。

ActiveRecordって何なん??

ActiveRecordとは、RubyとSQLの翻訳機のようなイメージです。

本来、DBで使用されるDB言語には、SQLが使用されています。
しかし、Railsが開発してくれているActiveRecordのおかげで、我々はRubyを使用して、DBからデータを探したり、持って来れたり出来るというわけなのです!!
非常に便利な機能ですね。

delete_allとdestroy_allについて

まとめて紹介しますが、こっちを使用すると、条件に合致する複数のレコードを同時に削除することが可能です。
whereメソッドと同時に使われることが多いです!!

Book.where(user_id: 1).delete_all
Book.where(user_id: 1).destroy_all

おわりに

Railsには、似通っている機能が多数存在するので、混乱することも多いですが、一つ一つ丁寧に理解していくことが、上達への近道になりそうですね。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

railsでマイグレーションファイルを編集する際に行う事(rails db:rollback)

マイグレーションファイルを編集したい

マイグレーションファイルの記述を間違えてしまった、コードを付け加えたいと思った時は、行う手順があります。

まずはマイグレーションファイルの状態を確認します。
% rails db:migrate:status

 Status   Migration ID    Migration Name
--------------------------------------------------
   up     20201119073257  Devise create users
   up     20201120031505  Create coordinations
   up     20201120032421  Create active storage tablesactive storage
今回はusersのマイグレーションファイルを編集を行いますので次のコマンドを実行します。
rails db:rollback
再度statusコマンドでマイグレーションファイルの状態を確認します。
% rails db:migrate:status

 Status   Migration ID    Migration Name
--------------------------------------------------
   up     20201119073257  Devise create users
   up     20201120031505  Create coordinations
  down    20201120032421  Create active storage tablesactive storage
これではusersのマイグレーションファイルがdownになっていないので編集出来ません。

ロールバックコマンドを行うと直近のマイグレーションファイルのみがdownになり編集出来る状態になります。
今回のusersマイグレーションファイルのように、最後から3つ目のマイグレーションファイルを編集、変更したい場合は

rails db:rollback STEP=3 

とSTEP=○を追記すると一度でusersマイグレーションファイルまでdownにすることが出来ます。

rails db:migrate:status

 Status   Migration ID    Migration Name
--------------------------------------------------
  down    20201119073257  Devise create users
  down    20201120031505  Create coordinations
  down    20201120032421  Create active storage tablesactive storage

STEP=○ ←○の中には最後に行ったマイグレーションファイルからrollbackを行いたいマイグレーションファイルまでいくつのマイグレーションファイルが含まれているか数えてその数字を入れてあげればうまくいきます。
最後を含め3つ目ならrails db:rollback STEP=3
4つ目ならrails db:rollback STEP=4

最後に

これでマイグレーションファイルの変更を行うことが出来ます。

変更が完了したらマイグレーションを実行をお忘れずに!

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Cygwin環境のRubyからExcelファイルを読み書きする(rubyXLの環境構築)

はじめに

RubyからExcelファイルを読み書きするにはrubyXLがよさげです。

https://github.com/weshatheleopard/rubyXL

このgemをインストールするには

gem install rubyXL

でいけると書いてあるが、実際にはrubyXLはnokogiriというgemに依存している。
更にnokogiriはlibxml2等様々なライブラリに依存しており、
インストールするには gcc や make なども必要になりやや複雑です。

今回はCygwin環境で rubyXL をインストールする方法をご紹介いたします。

Cyginのパッケージを入れる。

setup-x86_64.exeで以下のパッケージを入れておきます。

  • ruby
  • ruby-devel
  • libxml2-devel
  • libiconv-devel
  • libxslt
  • libxslt-devel
  • gcc-core
  • make

インストール

gem install nokogiri -r -- --use-system-libraries
gem install rubyXL -r

これで cygwinで rubyXL が使えるようになります。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Rails】AWSデプロイ中にCould not find aws-eventstream-1.1.0 in any of the sources Run `bundle install` to install missing gems.

EC2内でDBを作成しようとしたところエラーが出て詰まったので忘備録として書きます

EC2内でデータベースを作成しようと下記のコマンドを実行したところ
ターミナル(EC2内で実行)
[ec2-user@ip-172-31-23-189 <リポジトリ名>]$ rails db:create RAILS_ENV=production
Could not find aws-eventstream-1.1.0 in any of the sources
Run `bundle install` to install missing gems.

とエラー
どうやらどのソースでもaws-eventstream-1.1.0が見つかりませんでしたbundle installを実行して、不足しているgemをインストールします。と言われているよう...
まずGemfileをのぞくが
Gemfile
gem "aws-sdk-s3", require: false

一番下に記述はしっかりあることを確認。

Gemfile.lockをのぞきにいくが
63行目に以下の記述は入っている
Gemfile.lock
aws-eventstream (1.1.0)

bundleinstallのし忘れかと思い履歴を見るがしっかりEC2内にて参考資料通り実行済み、
作業を一度ふり返るが特にミスした形跡も見当たらずもちろんググってみるがあまり参考になる記事も見つけられず。
どうやら開発環境ではaws-eventstream (1.1.0)は存在するが本番環境では適用されてないのだとあたりをつけて

念のためもう一度bundle install
ターミナル(EC2内)
[ec2-user@ip-10-0-0-25 <リポジトリ名>]$ bundle install
Using actionmailer 6.0.3.3
Using actiontext 6.0.3.3
Using public_suffix 4.0.6
Using addressable 2.7.0
Using ast 2.4.1
Fetching aws-eventstream 1.1.0
Installing aws-eventstream 1.1.0
Fetching aws-partitions 1.399.0
Installing aws-partitions 1.399.0
Fetching aws-sigv4 1.2.2
Installing aws-sigv4 1.2.2
Fetching jmespath 1.4.0
Installing jmespath 1.4.0
Fetching aws-sdk-core 3.109.3
Installing aws-sdk-core 3.109.3
Fetching aws-sdk-kms 1.39.0
Installing aws-sdk-kms 1.39.0
Fetching aws-sdk-s3 1.85.0
Installing aws-sdk-s3 1.85.0

と、どうやらinstall されていなかったようです。
再度
ターミナル(EC2内)
[ec2-user@ip-172-31-23-189 <リポジトリ名>]$ rails db:create RAILS_ENV=production
Created database '<データベース名>'

と成功!!
今回原因はbundleinstallし忘れだったようだが、他のgemはしっかり反映されてたのでそれが原因突き止められなかったがしっかり一つ一つ検証していき可能性を消していく作業が大事だと感じた。
同じような症状で悩まれるかたに是非参考になればと思い書かせていただきました。最後まで読んでいただきありがとうございました。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Railsのrouting設定について

本投稿の目的

・Rails学習の議事録です。


学習に使った教材

Udemyの以下2つの教材を参考にまとめました。
"はじめてのRuby on Rails入門-RubyとRailsを基礎から学びWebアプリケーションをネットに公開しよう"
"フルスタックエンジニアが教える 即戦力Railsエンジニア養成講座"


○RESTfull

・HTTPメソッドにそってWebのリソースを設計する設計思想
・RailsのRouting設定はこの思想を表現したようなもの

【HTTPメソッド】
・GET  リソースの取得
・POST リソースの作成
・PATCH/PUT リソースの更新
・DELTE リソースの削除

○Routingとは?

以下の①~④を指定する設定

①どのHTTPメソッドで
②どのurlへアクセスした際に
③どのcontrollerの
④どのアクションを実行するか

○Routing設定方法

・/config/routes.rb を開く
・このファイルを編集することでrouting変更が可能
*(rails g controller アクション名で記述したroutingが自動記述済み)

【rootの設定】

・urlに"/"でアクセスした際のrouting設定
・以下を記述 (*アクション名は"#"で記載することに注意)

qiita.rb
root 'controller名#アクション名''

【例:rootでquestions controllerのindexアクションを実行したい場合】

qiita.rb
root 'questions#index'

【書き方①】

・HTTPメソッドでPrefix_pathのurlへアクセスするとtoo以降のcontrollerでアクションを実行
・という設定を意味する
・以下を記述 (Prefixの部分は _pathを除くことに注意)

qiita.rb
HTTPメソッド 'Prefix(_pathは除く)', too: 'controller名#アクション名'

【例:boards controllerのnewアクションを想定】

qiita.rb
get 'boards/new', too: 'boards#new'

【書き方②】

【基本的な記述】
・Railsでdefaultで設定された分のroutingが自動で設定可能
・以下を記述

qiita.rb
resources :controller

【応用的な記述】
・指定したアクション名のみをroutingで設定可能
・以下を記述

qiita.rb
resources :controller, only: [:アクション名1, :アクション名2]

【例:questions controller を想定】
・questions controller のindex,create,new,showに関連するroutingのみ自動設定

qiita.rb
resources :questions, only:[:index :create :new :show]

○Routing確認方法

【確認方法①(ターミナル)】
・ターミナルに以下を記述

rails routes

*【出力結果】
・今回は 【例:questions controller を想定】 の条件下での場合の出力結果

      Prefix  Verb   URI Pattern                      Controller#Action                                                                                      
    questions GET    /questions(.:format)             questions#index
              POST   /questions(.:format)             questions#create
 new_question GET    /questions/new(.:format)         questions#new
     question GET    /questions/:id(.:format)         questions#show

【解説】
・Prefix_pathで定義されたurlへアクセスした際に,それぞれのcontrollerのアクションを実行する
・これらは,routes.rbで設定したため作成された設定である

【確認方法②(Webブラウザ)】
・/rails/info/routes のpathにアクセス
・設定済みのルート情報を確認

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Ruby】FizzBuzzの問題

こんにちは、あおい( https://twitter.com/aoi_programming )です。
今回はRubyのFizzBuzz問題を解いていきます!

いくらRuby on RailsでWebアプリケーションを開発できるようになっても、それはRubyのフレームワークに過ぎないので、プログラミングの本質を磨くには生のRubyを勉強する他ないと思いまして、これからは、Ruby本体も毎日コツコツ勉強していこうかと。

そこで、今回は初心者プログラマーがまずぶち当たる壁「FizzBuzz」の問題に挑戦してみます。
もっと良いコードがあればご提示していただけると嬉しいです!

RubyのFizzBuzz問題

  • 3で割り切れる数値を引数に渡すと「Fizz」と返す
  • 5で割り切れる数値を引数に渡すと「Buzz」と返す
  • 15で割り切れる数値を引数に渡すと「FizzBuzz」と返す
  • それ以外の数値はその数値を文字列に変えて返す
  • 改行はしない
  • ひとつの数字につき、間に「,(カンマ)」をいれる

問題は上記の通りです。
実行方法は以下の通りです。

実行方法

% ruby test.rb
数字を入力してください。 # 31の場合
1,2,Fizz,4,Buzz,Fizz,7,8,Fizz,Buzz,11,Fizz,13,14,FizzBuzz,16,17,Fizz,19,Buzz,Fizz,22,23,Fizz,Buzz,26,Fizz,28,29,FizzBuzz,31

それでは実装していきましょう。
※これより下は答えとなります。

回答

test.rb
def fizzbuzz(nums)
  nums.times do |num|
   num += 1
   if num % 15 == 0
    print "FizzBuzz"
   elsif num % 3 == 0
    print "Fizz"
   elsif num % 5 == 0
    print "Buzz"
   else
    print num
   end
  if num == nums
   print ""
  else
   print ","
  end
 end
end

 puts "数字を入力してください"
 n = gets.to_i
 fizzbuzz(n)

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Ruby】puts / printの違い

Rubyで使うputsとprintの違い

結論、改行がされるかされないか。
printは改行されず、putsは改行される。

記述方法

first.rb
puts "Hello World" #改行あり
puts "Hello World" #改行あり

実行結果

% ruby first.rb
Hello World
Hello World

printの記述方法

second.rb
print "Hello World" #改行なし
print "Hello World" #改行なし

実行結果

% ruby second.rb
Hello WorldHello World
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Sorceryで複数モデルを扱う

Sorcery

https://github.com/Sorcery/sorcery

How

例: AdminモデルとUserモデルが存在して、両方でSorceryを使いたい場合
前提として、AdminかUserのどちらかでSorceryの導入が完了している

users_controller
def current_user
  User.find_by(id: session[:user_id])
end
config/initializer/sorcery.rb
config.user_class = 'Admin'

こうすると指定したcontroller内だけでcurrent_userの中身がuserになり、それ以外ではadminになる
上記のuserとadminを逆にしてもいいので、あまり使わない方をcontrollerに指定するとよさそう

current_userがセットされているので、before_action :require_loginも普通に動く

Single Table Inheritanceを使うやり方もあるらしいがこっちがシンプル

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Ruby ~条件分離~】勉強メモ2

Rubyの復習。
ほぼ自分の勉強メモです。
過度な期待はしないでください。

変数展開

変数展開とは、変数を代入している値に置き換えて、文字列に含めること
書き方:#{変数名}

length = 9
width = 8
area = length * width

puts "面積は#{area}です"
出力結果
面積は72です

 
※変数展開の注意点
シングルクォーテーションを使った場合は、変数展開が行われず、
そのまま文字列として出力されてしまうので注意。

length = 9
width = 8
area = length * width

# シングルクォーテーションを使った場合
puts '面積は#{area}です'
出力結果
面積は#{area}です


条件分岐

条件分岐処理とは、条件を満たしているかどうかで実行内容を分岐する処理。
「もし〇〇だったら△△をする」と処理を分けることが出来る。

  • 書き方は下記の通り
書き方
if 条件式
  処理
end
score = 92

if score > 80
  puts "値は正です"
end
出力結果
値は正です

 

  • elseの書き方

ifにelseを組み合わせると「もし〇〇なら●●を行う、そうでなければ■■を行う」という処理が出来るようになる。

書き方
if 条件式
  # 条件式が真(true)のときに実行する処理
else
  # 条件式が偽(false)のときに実行する処理
end
score = 60

if score > 80
  puts "値は正です"
else
  puts "値は負です"
end
出力結果
値は負です


  • elsif (条件を追加する)

ifとelseだけでなく、さらに条件を追加したい場合使用する。

書き方
if 条件式1
  # 条件式1が真(true)のときに実行する処理
elsif 条件式2
  # 条件式1が偽(false)のとき、かつ
  # 条件式2が真(true)のときに実行する処理
else
  # 条件式1と条件式2がどちらとも偽(false)のときに実行する処理
end
value = gets.to_i

if value > 0
  puts "値は正です"
elsif value < 0
  puts "値は負です"
else
  puts "値は0です"
end

 

  • 条件を組み合わせ

-「かつ」
かつは、「&&」で表す。
「条件1 && 条件2」は「条件1かつ条件2」という意味で、複数の条件がすべてtrueならtrueになる。


-「または」
「または」は、「||」で表す。
「条件1 || 条件2」は「条件1または条件2」という意味で、この場合は、複数の条件のうち1つでもtrueならtrueになる。

score = 96

# 「95以上かつ99以下」の場合のif文
if score>=95 && score<=99
  puts "高得点です。"
end
出力結果
高得点です。




今迄の応用
number = gets.to_i

if number%3==0 && number%5==0
  puts "15の倍数です"
elsif number%5==0
  puts "5の倍数です"
elsif number%3==0
  puts "3の倍数です"
else
  puts "3の倍数でも5の倍数でもありません"
end


過去投稿記事

【Ruby ~基本(コマンド/メソッド)~】勉強メモ

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Ruby ~条件分岐~】勉強メモ2

Rubyの復習。
ほぼ自分の勉強メモです。
過度な期待はしないでください。

変数展開

変数展開とは、変数を代入している値に置き換えて、文字列に含めること
書き方:#{変数名}

length = 9
width = 8
area = length * width

puts "面積は#{area}です"
出力結果
面積は72です

 
※変数展開の注意点
シングルクォーテーションを使った場合は、変数展開が行われず、
そのまま文字列として出力されてしまうので注意。

length = 9
width = 8
area = length * width

# シングルクォーテーションを使った場合
puts '面積は#{area}です'
出力結果
面積は#{area}です


条件分岐

条件分岐処理とは、条件を満たしているかどうかで実行内容を分岐する処理。
「もし〇〇だったら△△をする」と処理を分けることが出来る。

  • 書き方は下記の通り
書き方
if 条件式
  処理
end
score = 92

if score > 80
  puts "値は正です"
end
出力結果
値は正です

 

  • elseの書き方

ifにelseを組み合わせると「もし〇〇なら●●を行う、そうでなければ■■を行う」という処理が出来るようになる。

書き方
if 条件式
  # 条件式が真(true)のときに実行する処理
else
  # 条件式が偽(false)のときに実行する処理
end
score = 60

if score > 80
  puts "値は正です"
else
  puts "値は負です"
end
出力結果
値は負です


  • elsif (条件を追加する)

ifとelseだけでなく、さらに条件を追加したい場合使用する。

書き方
if 条件式1
  # 条件式1が真(true)のときに実行する処理
elsif 条件式2
  # 条件式1が偽(false)のとき、かつ
  # 条件式2が真(true)のときに実行する処理
else
  # 条件式1と条件式2がどちらとも偽(false)のときに実行する処理
end
value = gets.to_i

if value > 0
  puts "値は正です"
elsif value < 0
  puts "値は負です"
else
  puts "値は0です"
end

 

  • 条件を組み合わせ

-「かつ」
かつは、「&&」で表す。
「条件1 && 条件2」は「条件1かつ条件2」という意味で、複数の条件がすべてtrueならtrueになる。


-「または」
「または」は、「||」で表す。
「条件1 || 条件2」は「条件1または条件2」という意味で、この場合は、複数の条件のうち1つでもtrueならtrueになる。

score = 96

# 「95以上かつ99以下」の場合のif文
if score>=95 && score<=99
  puts "高得点です。"
end
出力結果
高得点です。




今迄の応用
number = gets.to_i

if number%3==0 && number%5==0
  puts "15の倍数です"
elsif number%5==0
  puts "5の倍数です"
elsif number%3==0
  puts "3の倍数です"
else
  puts "3の倍数でも5の倍数でもありません"
end


過去投稿記事

【Ruby ~基本(コマンド/メソッド)~】勉強メモ

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む