Programming note」カテゴリーアーカイブ

Railsのまとめ2(Hello World!)

1から続く

RailsでHelloWorldを表示させよう!

Rubyのバージョンチェックをする
ruby -v
#Rubyをインストールする
rvm install 2.5.1
rvm install 2.6.4
rvm list

#任意のバージョンを選ぶときは(今回は2.5.1を使う)

rvm use 2.5.1

#バージョンを確認
ruby -v

#2.5.1をデフォで使いたいとき

rvm --default use 2.5.1

#Railsがインストールされているか確認
rails -v
#Gemの確認
gem -v
#Railsをインストール
gem install rails --version="5.2.3" --no-document

バージョンチェック
rails -v

ディレクトリを作成する(rails_projects)

#まずは移動する
cd environment/

mkdir rails_projects

cd rails_projects/

#rails newで作成
rails _5.2.1_ new hello
cd hello/

データベースとしてパブリックドメインの軽量なものをインストール(sqlite)

#バージョン確認
sqlite3 --version

Gemfileに以下の記述を追加

'sqlite3', '~> 1.3.6'

Gemをインストールする

bundle install
bundle update

データベースを作成する

rails db:create

pumaというwebサーバが含まれている。

railsサーバを起動する。

rails s

このような表示がされているのを確認しよう


続きを読む

Railsのまとめ1(Rails概要)

①Ruby on Railsとは?

Rubyで書かれたオープンソースのウェブアプリケーションフレームワーク

フレームワークにはウェブアプリケーション開発に必要な基本的な機能が予め用意されている。

ある程度コードを書く際のルールが決まっている。

幅広いライブラリがGemと言う形式で公開されている。

主に使われているサイト

Airbnb:民泊サイト

GitHub:ソースコードバージョン管理

Square:決済

クックパッド:料理のレシピ共有サイト

freee: 会計ソフト

追記:他にも無数にあります

②Railsの基本理念

DRY原則(同じことを繰り返さない)

Don’t Repeat Yourself:DRY

設定より規約が優先される

クラスやデータベースの名付け方などのルールを守る

③MVCアーキテクチャーとは

M:Model(主にデータベース関連を担当する)

データの管理やビジネスロジックでデータの処理を行うコードを記載する。

ECサイトの例で話すと

商品が1つ売れたら在庫を1つ減らして、

購入履歴を保存するといったような処理はモデルに書くことになる。

静的なウェブページを表示するようなケースでは、モデルは必ずしも必要ではない。

静的なウェブページとは何度見ても誰が見ても同じコンテンツを返すだけの動きのないウェブページのこと。

動的なページはその逆で、ユーザーごとに見せるページが変わったりする。

例:Youtubeなど

V:View(主にHTMLを担当)

主にHTMLを作成する部分を担当する。

Webアプリケーションなので単純なHTMLではなく、

コントローラーを経由して渡されたデータを、HTMLに埋め込んでユーザのリクエストに応じて表示内容を変えて返すことになる。

RailsではデフォルトでERBと言う形式のテンプレートを使ってHTMLを書いていく。

このテンプレートを使うことによってHTMLの中にRubyのコードを埋め込むことができる。

追記:<%%><%=%>などを埋め込めるよ!

C:Controller(モデルとビューの仲介役)

ユーザからのリクエストを受けモデルとビューの仲介役をし、

最終的にユーザにページのコンテンツを返す役割を担っている。

追記:モデルからデータをもらいビューに使うよ!

2に続く

Rubyのまとめ6(プロテクテッドメソッド、モジュール、メソッドの公開範囲)

5から続く

プロテクテッドメソッド

class User

attr_reder :name 
  def initialize(name, deposit)
      @name = name
      @deposit = deposit
  end

  def bigger_than?(person)
      person.deposit < @deposit
  end
  protected

  def deposit
    @deposit
  end
end
  
suzutuki = User.new('suzutuki', 50000)
kunugi = User.new('kunugi', 30000)

suzutuki.bigger_than?(kunugi)
kunugi.bigger_than?(suzutuki) 
#.rbで出力すると
true
false

#クラスの外では呼び出せないよ
suzutuki.deposit
NoMethodError:

モジュール

クラスのようにメソッドや定数をまとめられるが
インスタンスが作れない、継承ができない
関連するメソッドや定数などをまとめてグループ化したいだけの時に、
手軽に使える。

module モジュール名
  #モジュールの定義 (メソッドや、定数など)
end
module Driver
  
  def self.run
    puts 'Run'
  end

  def self.stop
    puts 'Stop'
  end
end

Driver.run
Driver.stop
#.rbで出力すると
Run
Stop
# driver = Driver.new         #インスタンス生成できない
#   module TaxiDriver < Driver  #継承できない
# end
モジュールはインスタンス化できないのでself.でやる

 

module SampleNumber
  NUMBER = 300

  def number
    NUMBER
  end
end

puts SampleNumber::NUMBER
include SampleNumber
puts number
puts NUMBER

#.rbで出力すると
300
300
300

inncludeすることで定数をどちらでも呼び出せるようになる
module SampleModule

  def sum(a,b)
    a + b
  end

  module_function :sum
end

puts SampleModule.sum(4, 7)
ruby.module0.rbで出力
11
module SampleModule

  def sum(a,b)
    a + b
  end
end

class Port
  include SampleModule

  def call_sum(a, b)
    sum(a+ b)
  end
end

port = Port.new
puts port.sum(4, 7)
puts port.call_sum(8, 7)
#.rbで出力すると
11
15

include "モジュール名" でモジュールに定義されたメソッドを呼び出せる

例外と例外処理

puts '数値を入力してください'
i = gets.to_i
begin
#例外が起きうる処理
  puts 10 / i
  puts "begin's end"
  rescue => ex
#例外が発生した場合の処理
  puts 'error!'
  puts ex.message
  puts ex.class
  ensure
# 例外が発生しても、しなくても、最後に実行したい処理
  puts '終わり'
end
#.rbで出力すると
数値を入力してください
0
error!
divided by 0
ZeroDivisionError
終わり

puts “begin’s end”はエラー時は無視される
#実務ではよく使うので特に重要

例:2
[1] pry(main)> begin
[1] pry(main)* val = 10/ 0
[1] pry(main)* puts val
[1] pry(main)* rescue => e 
[1] pry(main)* p e.full_message
[1] pry(main)* p e.message
[1] pry(main)* p e.class
[1] pry(main)* end 

 1: from (pry):2:in `__pry__'\n(pry)
:2:in `/': \e[1mdivided by 0 (\e[4;1mZeroDivisionError\e[m\e[1m)\n\e[m""divided by 0"
ZeroDivisionError
=> ZeroDivisionError

メソッドの公開範囲

・public
誰からも見える
・protected
あまりつかわれない
・private
自分からしかみえない

class User

  def initialize(name)
    @name = name
  end

private
  def hello
    puts "Hello! I am #{@name}."
  end
end

suzutuki = User.new('suzutuki')
suzutuki.hello

#.rbで出力すると
Traceback (most recent call last):
access.rb:14:in `<main>': private method `hello' called for #<User:0x00000000010c4260 @name="suzutuki"> (NoMethodError)
suzutuki:~/environment/ruby_projects $ ruby access.rb

privateによってエラーが出る
privateをコメントアウトなどすると問題ない
Hello! I am suzutuki.
class User

  def initialize(name)
    @name = name
  end

  def say
     hello
  end

  private
    def hello
      puts "Hello! I am #{@name}."
    end
end

suzutuki = User.new('suzutuki')
suzutuki.say

def say hello endにより
#.rbで出力すると
Hello! I am suzutuki.
↑が出力されたので呼び出すことができた

バリデーションなどで使うので覚えておこう!

Rubyのまとめ5(クラスから継承まで)

4から続きます

クラス

オリジナルのクラスを作成する例:箱を定義するクラス
Boxクラス
メソッド hello ・・・ helloと出力する機能

class Box
  def hello
    puts 'hello'
  end
end

box = Box.new
box.hello

hello
class Box
  def initialize(name)
    puts 'initialize'
    @name = name 
  #インスタンス変数はインスタンス内であればどこでも使える
  #↑逆にこれは他では使えない
 end   

  def hello
    puts "Hello! I am #{@name}."
  end 
end

box = Box.new('Cardboard')
box.hello

wood = Box.new('wood')
wood.hello

#.rbで出力すると
initialize
Hello! I am wood.

更にインスタンスを追加することもできる

class Box
  def initialize(name)
    puts 'initialize'
  @name = name
end
  def hello
    puts "Hello! I am #{@name}."
  end
end

box = Box.new('Cardboard')
box.hello
wood = Box.new('wood')
wood.hello

#.rbで出力すると
initialize
Hello! I am Cardboard.
initialize
Hello! I am wood.

アクセサメソッド:インスタンス変数の値を読み書きするメソッドのこと

class Box
  def initialize(name)
    @name = name
  end
  def hello
    puts "Hello! I am #{@name}."
  end

  def name
    @name
  end
end

box = Box.new('Cardboard')
puts box.name

#.rbで出力すると
initialize
hello! I am Cardboard.
Cardboard

クラスの外からnameメソッドでインスタンス変数を呼び出した

インスタンス変数の@nameの値をクラスの外から書き換えたい

class Box
  def initialize(name)
    @name = name
  end
  def hello
    puts "Hello! I am #{@name}."
  end

  def name
   @name
  end
end
box = Box.new('Cardboard')
puts box.name
#.rbで出力すると
Cardboard
box.@name = 'suzutuki'
↑Syntax error インスタンス変数は外から書き換えられない

ではどうするか?書き込み用のメソッドを作る

class Box
  def initialize(name)
    # puts 'initialize'
  @name = name
  end
  def hello
    puts "Hello! I am #{@name}."
  end

#他の言語だとゲッターメソッド
  def name
    @name
  end
#他の言語だとセッターメソッド
  def name=(value) #←ここから
    @name = value
  end
end

box = Box.new('Cardboard')
# box.hello
puts box.name
box.name = 'suzutuki'
puts box.name

#.rbで出力すると
Cardboard
suzutuki

name=のように=で終わるメソッドを定義すると
変数に代入するような形でメソッドが呼び出される。
box.name = 'suzutuki'という書き方ができるようになる
メソッドを呼び出しているけれども
値('suzutuki')を代入するような書き方ができる。

インスタンス変数を読み書きするメソッドのことを
インスタンスメソッドと呼ぶ
設定を書き換えたいとき

アクセサメソッドattr_accessorメソッド
attrはattributeで属性のこと
インスタンスメソッドを開発者が書かなくて良くなる

class Box

attr_accessor :name
  def initialize(name)
    puts 'initialize'
    @name = name
  end
  def hello
    puts "Hello! I am #{@name}."
  end

# def name
#   @name
# end

# def name=(a)
#   @name = a
# end
end

box = Box.new('Cardboard')

puts box.name

box.name = 'suzutuki'
puts box.name

↓ruby accessor.rbで出力
Cardboard
suzutuki

class Box
  attr_accessor :name
end

box = Box.new
puts box.name
box.name = 'suzutuki'
puts box.name

#.rbで出力すると

suzutuki
※空欄はnilで初期引数を指定しないとなる

コメントアウトしているところを1行で書くことができる
定型文的なメソッドを毎回書かなくて良いので開発を効率化できる

読み込みのみしたいとき

class Box

attr_reader :name
  def initialize(name)
    @name = name
  end
  def hello
    puts "Hello! I am #{@name}."
  end

# def name
#   @name
# end

# def name=(a)
#   @name = a
# end
end

box = Box.new('Cardboard')
# box.hello
puts box.name
# box.name = 'suzutuki'書き込みをしようとするとエラーになる
puts box.name

↓ruby accessor.rb
Cardboard
Cardboard

↑書き込みがされてないので2回Cardboardが出力された
なお書き込もうとするとエラーが出る↓
accessor.rb:26:in `<main>': undefined method `name=' for #<Box:0x00000000021c7df0 @name="Cardboard"> (NoMethodError)
Did you mean? name

書き込みのみしたいとき

class Box

attr_writer :name
  def initialize(name)
    @name = name
  end
  def hello
    puts "Hello! I am #{@name}."
  end

# def name
#   @name
# end

# def name=(a)
#   @name = a
# end
end

box = Box.new('Cardboard')
# box.hello
# puts box.name
box.name = 'suzutuki'
# puts box.name

#.rbで出力すると
何も起きてないように見えるが書き込みはされている。表示はされない

クラス変数:クラス自体に値を保持できる変数

class Box

@@count = 0
  def initialize(name)
    @name = name
    @@count += 1
  end

  def hello
    puts "Hello! I am #{@name}. #{@@count} instance(s)."
  end
end

kit = Box.new('Cardboard')
kit.hello

wood = Box.new('wood')
wood.hello

suzutuki = Box.new('suzutuki')
suzutuki.hello

#.rbで出力すると
Hello! I am Cardboard. 1 instance(s).
Hello! I am wood. 2 instance(s).
Hello! I am suzutuki. 3 instance(s).

クラスメソッドinfoを定義、クラスメソッドinfoを実行すると
インスタンスの生成回数(@@count)を出力する

class Box

@@count = 0
  def initialize(name)
    @name = name
    @@count += 1
  end

  def hello
    puts "Hello! I am #{@name}. #{@@count} instance(s)."
  end

  def self.info
    puts "#{@@count} instance(s)."
  end
end

Box.info
#.rbで出力すると
0 instance(s).

↑インスタンスの生成が行われていないので0
class Box
  
@@count = 0
  def initialize(name)
    @name = name
    @@count += 1
  end
  
  def hello
    puts "Hello! I am #{@name}. #{@@count} instance(s)."
  end

  def self.info
    puts "#{@@count} instance(s)."
  end
end

kit = Box.new('Cardboard')
Box.info

wood = Box.new('wood')
Box.info

suzutuki = Box.new('suzutuki')
Box.info

#.rbで出力すると
1 instance(s)
2 instance(s)
3 instance(s)

一つのクラス変数@@countをそれぞれのインスタンスが共通して
利用していることがわかる

class FF
  def self.first_method
    puts '1'
  end

  class << self
    def second_method
     puts '2'
    end
    
    def third_method
      puts '3'
    end
   end
end

FF.first_method
FF.second_method
FF.third_method

#.rbで出力すると
'1'
'2'
'3'

FF.new.varだとエラー
オブジェクトからクラスメソッドを呼び出そうとしてもエラーになる

 

クラスと定数

class Box
REGION = 'USA'
@@count = 0
  def initialize(name)
    @name = name
    @@count += 1
  end

  def hello
    puts "Hello! I am #{@name}. #{@@count} instance(s)."
  end
  
  def self.info
    puts "#{@@count} instance(s). Region: #{REGION}"
  end
end

kit = Box.new('Cardboard')
Box.info

wood = Box.new('wood')
Box.info

suzutuki = Box.new('suzutuki')
Box.info

puts Box::REGION
クラスの外から呼び出せる

#.rbで出力すると
1 instance(s). Region: USA
2 instance(s). Region: USA
3 instance(s). Region: USA
↓putsがあるので4番目のUSAも出力されている。ないと3行まで
USA

クラスの継承

親クラスを作成することで親クラスの機能を引き継いで、
子クラスを作成することができる。
コードの再利用性や拡張性を高める仕組み

#親クラスのUserを作る
class User
  def initialize(name)
    @name = name
  end
  
  def hello
    puts "Hello! I am #{@name}"
  end
end

akina = User.new('akina')
akina.hello
#.rbで出力すると
Hello! I am akina
class AdminUser < User
#子クラスまたはサブクラスを作った
  def hello_admin
    puts "Hello! I am #{@name} from AdminUser."
  end
end
suzutuki = AdminUser.new('suzutuki')
suzutuki.hello
suzutuki.hello_admin

#.rbで出力すると
Hello! I am akina
Hello! I am suzutuki
Hello! I am suzutuki from AdminUser.

 

class User
  def initialize(name)
    @name = name
  end

  def hello
    puts "Hello! I am #{@name}"
  end
end

#子クラスまたはサブクラスを作った
class AdminUser < User
  def hello_admin
    puts "Hello! I am #{@name} from AdminUser."
  end
#↓helloメソッドをAdminUserの方でオーバーライドする
  def hello
    puts 'Admin!!'
  end
end

suzutuki = AdminUser.new('suzutuki')
suzutuki.hello
suzutuki.hello_admin

#.rbで出力すると
Admin!!
Hello! I am suzutuki from AdminUser.

親クラスから小クラスのメソッドは呼び出せないのに注意!

子クラスを編集することにより親クラスに変更を加えることなく
子クラスに機能を追加したり上書き(オーバーライド)することができる!

class User
 def initialize(name)
   @name = name
 end
 def hello
   puts "Hello! I am #{@name}"
 end
end

class AdminUser < User
 def hello_admin
   puts "Hello! I am #{@name} from AdminUser."
 end
 #↓helloメソッドをAdminUserの方でオーバーライドする
 def hello
   super
   puts 'Admin!!'
 end
end

suzutuki = AdminUser.new('suzutuki')
suzutuki.hello
akane = AdminUser.new('akane')
akane.hello

#.rbで出力すると

Hello! I am suzutuki
Admin!!
Hello! I am akane
Admin!!

親クラスのUserクラスのhelloも呼び出されている!

Integerの継承関係から継承関係を見ることができる

BasicObject
↑
Object
↑
Numeric
↑
Integer
#superclassで親クラスを知ることができる
Integer.superclass
=> Numeric
2.5.1 :002 > Numeric.superclass
=> Object
2.5.1 :003 > Object.superclass
=> BasicObject
2.5.1 :004 > BasicObject.superclass
=> nil

6に続く

Rubyのまとめ4(繰り返しからnext, whileまで)

3から続く

繰り返し処理 Each for

配列やハッシュ.each do |変数|
  #繰り返し実行したい処理
end

例1

#1:配列 numbersを作成(1,2,3,4,5)
numbers = [1, 2, 3, 4, 5]
#2:配列の要素を一つずつ取り出して実行
numbers.each do |number|
  puts number
end

別解1
numbers.each {|number|
  puts number
}
#一行でもかける
numbers.each {|number| puts number }

↑配列が入っている要素は複数形||の中の変数は
単数で書くことが多いらしい

配列 colors を作成
‘red’, ’green’ ’blue’

配列の要素を一つずつ取り出して出力

colors = ['red', 'green', 'blue']

colors.each do |color|
    puts color
end

red
green
blue
=> ["red", "green", "blue"]
#繰返処理 for構文

for 変数 in 配列やハッシュ do
 #繰り返し実行したい処理
end

1:配列 numbersを作成(1,2,3,4,5)
2:配列の要素を一つずつ取り出して実行

numbers = [1, 2, 3, 4, 5]

for number in numbers do
  puts number
end

forは原則使わないらしい

each (ハッシュ利用)

1:ハッシュで生徒ごとの点数scoresを用意
{luke: 100, ben: 90, alan: 70 }
配列の要素を一つずつ取り出して出力

scores = {luke: 100, ben: 90, alan: 70}

scores.each do |k, v|
  puts v
end

#出力されるもの
100
90
70

両方取り出したいとき↓

scores = {luke: 100, ben: 90, alan: 70}

scores.each do |k, v|
  puts "#{k}, #{v}"
end

#出力されるもの
luke, 100
ben, 90
alan, 70

80点以上を取り出したいとき↓ifをeachに追加

scores = {luke: 100, ben: 90, alan: 70}

scores.each do |k, v|
  if v >= 80
    puts "#{k}, #{v}"
  end
end

luke, 100
ben, 90

繰り返し処理 times

繰り返し回数.times do |i|
  繰り返し実行したい処理
end
|i|は省略可能
5.times do
  puts 'Hello'
end

Hello
Hello
Hello
Hello
Hello

ダブルクオートで囲んだとき

5.times do |i|
  puts "#{i}: Hello"
end

0: Hello
1: Hello
2: Hello
3: Hello
4: Hello

上も下も同じ意味
5.times { |i| puts "#{i}: Hello" }

繰り返し処理(while)

while 条件式 do
  繰り返し実行したい処理
end

数字を0から9まで、10個出力するプログラム。whileを使って書く

i = 0

while i < 10
  puts "#{i}:hello"
    i += 1 #i = i + 1
end
#出力されるもの
0:hello
1:hello
2:hello
3:hello
4:hello
5:hello
6:hello
7:hello
8:hello
9:hello

無限ループが起きることがあるので気をつけよう

uptoとdownto

開始値.upto(終了値){繰り返し実行したい処理}

10.upto(14) {|n| puts n }
14.downto(10) {|n| puts n }


10
11
12
13
14

14
13
12
11
10

繰り返し処理step

開始式.step(上限値,一度に増減する大きさ){}

1.step(10, 2) { |n| puts n }

1
3
5
7
9
減らすときはマイナスで
10.step(1, -2) { |n| puts n }

10
8
6
4
2

繰り返し処理(loop)

loop do
 繰り返し実行したい処理
end

loopメソッドを使って、変数の値を0から1ずつ増やして出力

i = 0

loop do
  puts i
  i += 1
 #breakがないと無限ループに突入するので注意!
  break if i == 10 
end
0
1
2
3
4
5
6
7
8
9

whileの場合

n = 0

while true
 puts ncf
 n += 1
end

応用)配列[1,2,3,4,5,]の値が、奇数の場合のみ、画面に出力する処理。

eachとnextを利用

numbers = [1, 2, 3, 4, 5]

numbers.each do |n|
 next if n % 2 == 0 
#もしnが偶数だったらループをスキップするという意味

#上と下は同じ意味だで
next if n.even?

#奇数の時はodd
next if n.odd? 
  puts n
end

#出力されるもの
1
3
5

5に続きます。

Route53

Route53とは?

AWSのDNSサービス。ネームサーバーの役割を果たします。

高可用性、SLA100%(稼働率100%)

高速。エッジロケーションの中で最も近いロケーションから応答を返します。

フルマネージドサービス。DNSサーバーの設計・構築・維持管理が不要です。

関連用語

ホストゾーン:DNSのリソースレコードの集合、ゾーンファイルのようなものです。

レコードセット:リソースレコードのことです。

ルーティングポリシー:Route53がレコードセットに対してどのようにルーティングを行うかを決めます。

ヘルスチェック:サーバーの稼働状況をチェックします。

ルーティングポリシーについて

シンプル

レコードセットで事前に設定された値に基づいて、ドメインへの問い合わせに応答します。

加重

複数エンドポイントごとに設定された重み付けに基づいて、

ドメインへの問い合わせに応答する提供リソースに差がある場合や、ABテスト時に使用します。

レイテンシー

リージョン間の遅延が少ない方のリソースルーティングするマルチレーションにリソースが存在する場合に使用します。

位置情報

クライアントの位置情報に基づいて、ドメインへの問い合わせに落としますコンテンツのローカライズや、地域限定配信時に主に使用されます。

フェイルオーバー

ヘルスチェックの結果に基づいて、利用可能なリソースルーティングします。障害発生時にSorryサーバーに簡単に切り替えられます。

ドメインのネームサーバーお名前ドットコムからをRoute53に変更

ドメインに紐づくIPアドレスを登録

ーRoute53でレコードセットを作成

Route53で検索して「Route53」をクリックします。

DNS管理の「ホストゾーン作成」をクリックします。

ドメイン名:購入したドメイン名

タイプ:パブリックホストゾーン

「ホストゾーンの作成」をクリックします。

NSレコードとSOAレコードが作成されたのを確認します。

「EC2」で検索→「EC2」をクリックします。

ElasticIPとパブリックIPが同じであることを確認します。

同じでない場合は↓からまたElastic IPアドレスの関連付けをします。

https://suzutukiblog.com/index.php/2021/05/02/aws6/

ここから前に無料で購入した他のドメイン名で撮影しているので、表示が少しおかしいですがスルーしてください。

ターミナルを起動

Launchpadをクリックして、ターミナルを起動します。

ssh -i ~/Desktop/my-portfolio-ssh-key.pem ec2-user@IPアドレス

yesを選択      自分で作成した秘密鍵↑          ↑EC2のElastic IPアドレス

各自ドメイン名↓

dig sample.site NS +short

dns2.onamae.com

dns1.onamae.com

上記のようにネームサーバーがお名前.comになっているはずです。

お名前.comにてネームサーバーをRoute53に変更します。

①お名前.com上のタブのドメインを選択します。

②ネームサーバーのリンクをクリックします。

2:ネームサーバーの選択のその他を選択します。

3:別タブでRoute53のタイプNSの4つをそれぞれコピーします。(AとCNAMEがあるのはスルーしてください。)

4:お名前.comにてコピーしたものを貼り付けて「確認」をクリックします。

5:ターミナルにてdigコマンドで確かめます。

dig ドメイン名 NS +short

   ↑お名前.comで取得したドメイン名

dnsv.jv(お名前.comのネームサーバー)から先程自分で設定したネームサーバー(awsdns)に変わっているのを確認します。

設定が反映されるまで24h〜72hかかるので、Aレコードの登録をします。

Aレコードの登録

Route53で検索して「Route53」をクリックします。

DNS管理の「ホストゾーン」をクリックします。

各自ドメイン名をクリックします。

「レコードを作成」をクリックします。

レコードセット名:そのまま

レコードタイプ:Aタイプ

値:各自のElastic IPアドレスを入力

TTL:そのまま

ルーティングポリシー:シンプル

上記の設定にして「レコードを作成」をクリックします。

このようにAタイプの値がElastic IPアドレスになっていればOKです。

dig ドメイン名 NS +shortで確認して変わっていることを確認

dnsv.jv(お名前.comのネームサーバー)から自分で設定したネームサーバー(awsdns)に変わっているのを確認します。

ドメイン名でアクセスしてテストページが表示されたらOKです。

Rubyのまとめ3(配列からハッシュDate,Timeまで)

2から続く

配列(Array)

複数のデータをまとめて格納できるオブジェクトのこと

配列内のデータ(要素)は順番に並んでいて添字(インデックス)
を指定することでデータを取り出せる

配列の作成

空の配列を作る[]

3つの要素が格納された配列を作る
[要素1,要素2,要素3]

arr = []
=> []
arr
=> []

a = [1, 2, 3, 'aa', [1, 2, 3]]
=> [1, 2, 3, "aa", [1, 2, 3]]
2.5.1 :006 > a[0]
=> 1
2.5.1 :007 > a[1]
=> 2
2.5.1 :008 > puts a
1
2
3
aa
1
2
3
=> nil

小文字のwはシングルクォートとおなじで
%w(a b)
=> ["a", "b"]
大文字のWはダブルクォートとおなじで式展開できる
a = 1
=> 1
b = 2
=> 2

%W(あ#{a} い#{b})
=> ["あ1", "い2"]

シンボルに変換もできる
%i[ a b c ]
=> [:a, :b, :c]

繰り返し処理をする時
%w[a b c].each do |abc|
   puts abc
 end 
a
b
c
=> ["a", "b", "c"]

breakは指定したものまで繰り返す
%w[a b c].each do |abc|
   break if abc == 'c'
   puts abc
 end 
a
b
=> nil

nextは指定したものをスキップする
%w[a b c].each do |abc|
    next if abc == 'b' 
      puts abc 
    end 
a
c
=> ["a", "b", "c"]

mapを使って配列内に()を付加
%w[a b c].map { |abc| "(#{abc})" }
=> ["(a)", "(b)", "(c)"]

aは空か?(.empty)

a.empty?
=> false
2.5.1 :010 > b = []
=> []
2.5.1 :011 > b.empty?
=> true

変数aに’aa’はふくまれている?(.include)

2.5.1 :012 > a.include?('aa')
=> true
2.5.1 :013 > a.include?('b')
=> false
a = [[1, 2, 3], "aa", 3, 2, 1]
2.5.1 :014 > a.reverse
=> [[1, 2, 3], "aa", 3, 2, 1]
2.5.1 :015 > a
=> [1, 2, 3, "aa", [1, 2, 3]]
2.5.1 :016 > a.reverse!
=> [[1, 2, 3], "aa", 3, 2, 1]
2.5.1 :017 > a
=> [[1, 2, 3], "aa", 3, 2, 1]

配列をランダムにする(.shuffle)

2.5.1 :018 > a.shuffle
=> [3, 2, "aa", 1, [1, 2, 3]]

(0..25).to_a
=> [0, 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]
2.5.1 :026 > (0..99).to_a.shuffle!
=> [96, 92, 23, 49, 27, 60, 20, 72, 8,
50, 70, 64, 41, 75, 88, 26, 82, 14, 6,
78, 10, 55, 74, 48, 17, 52, 24, 16, 95,
63, 36, 19, 91, 93, 57, 85, 56, 67, 2,
15, 89, 44, 31, 43, 98, 3, 38, 28, 12,
86, 35, 65, 83, 94, 47, 0, 81, 4, 62,
77, 84, 13, 90, 33, 45, 21, 99, 39, 22,
71, 46, 61, 66, 87, 25, 30, 29, 34, 51,
73, 68, 18, 69, 37, 80, 11, 7, 9, 58, 5,
53, 42, 1, 40, 79, 59, 32, 54, 76, 97]

配列に新しく入れる(.push)(<<)

z = (0..10).to_a

=> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

2.5.1 :028 > z << 20

=> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 20]

2.5.1 :029 > z

=> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 20]

2.5.1 :030 > z.push(30)

=> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 20, 30]

2.5.1 :031 > z

=> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 20, 30]

配列の最後を取り出す(.pop)

2.5.1 :032 > z.pop
=> 30
2.5.1 :033 > z
=> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 20]

最初の配列を取り出す(.shift)

z.shift
=> 0
z
=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 20]

2.5.1 :038 > z << 3

=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 20, 3]

2.5.1 :039 > z << 6

=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 20, 3, 6]

重複したものがなくなり一つにまとまる(.uniq)

2.5.1 :040 > z.uniq
=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 20]
2.5.1 :041 > z
=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 20, 3, 6]
2.5.1 :042 > z.uniq!
=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 20]
2.5.1 :043 > z
=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 20]

配列の文字列を結合する(.join)並び替える(.sort)

s = ['my' 'name' 'is' 'suzutuki']

s

=> ["my", "name", "is", "suzutuki"]

2.5.1 :048 > s.join

=> "mynameissuzutuki"

2.5.1 :049 > s.join(' ')

=> "my name is suzutuki"

2.5.1 :050 > s.join('_')

=> "my_name_is_suzutuki"

s.sort.reverse

=> ["suzutuki", "name", "my", "is"]

2.5.1 :053 > s.sort.reverse!

=> ["suzutuki", "name", "my", "is"]

2.5.1 :054 > s

=> ["my", "name", "is", "suzutuki"]
↓配列の数がわかる
s.size
=> 4

シンボル

ソースコード上では文字列のように見えるが内部では整数として扱われる。

シンボルを使った形の方が文字列をきれいに使う場合に比べて、ハッシュのアクセスは速いとされる

オブジェクトIDを確認すると、String オブジェクト で は 同じ 文字列であっても別のオブジェクトが生成されるのに対してシンボルでは同じシンボル名であれば同一のシンボルを指している。

ハッシュとは?

キー(key)と値(Value)の組み合わせでデータを管理するオブジェクト

連想配列、ディクショナリー、マップと言う場合も

ハッシュの作成

空のハッシュを作成{}(中かっこと読む)

キーと値の組み合わせを3つ格納するハッシュを作成

{キー1 => 値1, キー2 => 値2, キー3 => 値3 }

suzutuki = {'name' => 'suzutuki', 'birthplace' => 'Gihu'}

=> {"name"=>"suzutuki", "birthplace"=>"Gihu"}

2.5.1 :058 > puts suzutuki['name']

suzutuki
=> nil

2.5.1 :059 > puts suzutuki['birthplace']

Gihu
=> nil

2.5.1 :060 > suzutuki['age'] = 18
=> 18

2.5.1 :061 > puts suzutuki
{"name"=>"suzutuki", "birthplace"=>"Gihu", "age"=>18}
=> nil

↓ageを20に変更したいとき
suzutuki['age'] = 20
=> 20

2.5.1 :063 > puts suzutuki
{"name"=>"suzutuki", "birthplace"=>"Gihu", "age"=>20}
=> nil

suzutuki.delete('age')
=> 20

puts suzutuki
{"name"=>"suzutuki", "birthplace"=>"Gihu"}
=> nil
ota = {name: 'ota', birthplace: 'tokyo'}
=> {:name=>"ota", :birthplace=>"tokyo"}
2.5.1 :067 > puts ota[:name]
ota
=> nil
2.5.1 :068 > ota[:age] = 20
=> 20
2.5.1 :070 > ota[:age] = 21
=> 21
2.5.1 :072 > puts ota
{:name=>"ota", :birthplace=>"tokyo", :age=>21}
=> nil
2.5.1 :073 > ota.delete(:age)
=> 21
puts ota
{:name=>"ota", :birthplace=>"tokyo"}
=> nil

キーの確認.keys

ota.keys
=> [:name, :birthplace]

値の確認.values

2.5.1 :075 > ota.values
=> ["ota", "tokyo"]
2.5.1 :076 > ota.has_key?(:name)
=> true
2.5.1 :077 > ota.has_key?(:address)
=> false
2.5.1 :078 > ota.size
=> 2

Time,Dateオブジェクト

 Time.now
=> 2021-010-02 12:06:55 +0900
[6] pry(main)> Time.now.zone
=> "JST"
[7] pry(main)> datetime = Time.new(2021, 10, 2, 12, 45)
=> 2021-01-02 12:45:00 +0900
[8] pry(main)> datetime.strftime('%Y年 %m月 %d日 %H時 %M分')
=> "2021年 10月 02日 12時 45分"

いきなりDateクラスは使えない
[9] pry(main)> Date
NameError: uninitialized constant Date
Did you mean? Data
from (pry):12:in `__pry__'
requireをすることで使えるようになる
[10] pry(main)> require 'date'
=> true
[11] pry(main)> Date
=> Date
Date.today
=> #<Date: 2021-01-02 ((2459317j,0s,0n),+0s,2299161j)>
[15] pry(main)> Date.new(2021, 10, 2)
=> #<Date: 2021-01-02 ((2459217j,0s,0n),+0s,2299161j)>

[17] pry(main)> Date.new(2021, 10, 2).strftime('%Y年 %m月 %d日 %H時 %M分')
=> "2021年 10月 02日 00時 00分"

4に続く

Rubyのまとめ2(真偽値からFizzBuzzまで)

1から続く

真偽値と論理演算子(&&||)

真(true)となる例

trueそのもの すべての数値1,0,−1
すべての文字列’abc’ ’true’ ’false’

論理積(and)

・a && b
aとbがともに真の場合に真

論理和(or)

a||b
aかbの少なくとも1つが真の場合に真

and, or, not
↑↓似ているがand, or, notは、&&, ||, !,と比べて優先順位が低い
&&, ||, !

基本的には混在させない

t1 = true
=> true

t2 = true
=> true

fi = false
=> false

1 = false
=> false

f2 = false
=> false

t1 && t2
=> true

t1 and t2
=> true

t1 && f1
=> false

t1 and f2
=> false

t1 || t2
=> true

t1 or t2
=> true

t1 || f2
=> true

t1 or f2
=> true

f1 || f2
=> false

!t1
=> false

not(t1)
=> false

!f1
=> true

not(f1)
=> true

優先順位で変わってしまうため

!t1 || t1
=> true

↓ ||が先に処理されtrueだったものがnotで反転した
not t1 || t1
=> false

↓&&が先に処理されfalseになり||でtrueになった
t1 || t2 && f1
=> true

andは最後なのでfalse
t1 or t2 and f1
=> false

そんなときはカッコを使って明示的に優先順位を指定しよう!

(t1 || t2) && f1
=> false

条件分岐if

if 条件式1
条件式1が真の時に実行する処理
elsif 条件式2
条件式1が偽で条件式2が真の時に実行する処理
elsif 条件式3
条件式1及び条件式2が偽で条件式3が真の時に実行する処理
else
全ての条件式が偽の時に実行する処理
end

例1:テストの結果によって通知表の成績をコンソールに出力する

# 90点以上A
# 80点以上B
# 60点以上C
# 60点未満D

score = 90
  if score >= 90
    puts 'A'
  elsif score >= 80
    puts 'B'
  elsif score >= 60
    puts 'C'
  else
    puts 'D'
  end

Aが出力される

例2:商品の内容を出力

その他 : ‘Not found’

product = 'fish'
  if product == 'meat'
    puts 'meat'
  elsif product == 'fish'
    puts 'fish'
  elsif product == 'vegetable'
    puts 'vegetable'
  else
    puts 'Not found'
end

fishが出力される

==でないとエラーが生じる

応用) 入場料金の計算

大人18歳以上10,000円
中人6歳以上18歳未満5,000円
小人6歳未満1,000円

age = 19
  if age >= 18
    puts '10,000'
  elsif age >= 6
    puts '5000'
  else puts '1,000'
end

unless 条件式
条件式が偽(false)の時に実行する処理
end

例3: 変数nの値が0でなければ、”Not zero.”
と出力するプログラムをifをつかって記述
※ヒント:値が0か判定するには、zero?メソッドが使える

# n = 0
# if !n.zero?
# puts ‘Not zero.’
# end

# unlessを使おう

n = 0
  unless n.zero?
    puts 'Not zero.'
    puts 'This is zero'
end

This is zeroが出力される。
※無理にunlessを使う必要はない。読みやすいと思う場合はifでOK

Case文

case 対象オブジェクト
when 値1
値1と一致する場合に行う処理
when 値2
値2と一致する場合に行う処理
when 値3
値3と一致する場合に行う処理
else
どの値にも一致しない場合に行う処理
end

例4:商品の内容を出力

if文だと

product = 'fish'
  if product == 'meat'
    puts 'meat'
  elsif product == 'fish'
    puts 'fish'
  elsif product == 'vegetable'
    puts 'vegetable'
  else
    puts 'Not found'
end

#case文の場合

product = 'tuna' 
  case product
    when 'pork'
      puts 'meat'
    when 'tuna'
      puts 'fish'
    when 'tomato'
      puts 'vegetabale'
    else
    puts 'Not Found'
end

fishが出力される。

caseのほうがよりシンプルになるがifとの違いに注意!

メソッドとは?

複数の処理を1つにまとめて扱いやすくしたもの
・クラス内に定義する≒クラス内に定義する関数

def メソッド名(引数1, 引数2, …)
実行する処理
実行する処理
end

例4:Hello,World!と出力するメソッドを記述

メソッドを実行する。メソッド名は、hello_worldとする

def hello_world
  puts 'Hello,World!'
end

hello_world

‘Hello,World!’が出力される
続きを読む

Rubyのまとめ1( 概要から演算子,インクリメントまで)

Rubyの特徴(概要)

インタプリタ型言語

日本人のまつもとゆきひろさんが作った言語

オブジェクト指向言語

構文の自由度が高い

Ruby on Railsというフレームワークがある

irbを使うと双方向的なやり取りができる
2.5.1 :001 > s = 'hello, World!'
=> "hello, World!"
2.5.1 :002 > puts s
hello, World!
=> nil
2.5.1 :003 > n = 10 * 2
=> 20
2.5.1 :004 > puts n
20
=> nil

pryを使ってもできる

↓変数に初期値を入れないとエラーになる
2.5.1 :005 > i
Traceback (most recent call last):
2: from /home/ec2-user/.rvm/rubies/ruby-2.5.1/bin/irb:11:in `<main>'
1: from (irb):5
NameError (undefined local variable or method `i' for main:Object)

変数にnilを入れることもできる

2.5.1 :006 > i = nil
=> nil

予約語は使えないので注意 if elsif など

良くない変数の使い方
変数に複数入れる
続きを読む

GitHub-Cheatsheet

1:GitHubの概要git add, commit, diffについて知りたい時

https://suzutukiblog.com/index.php/2020/12/18/github1/

2:任意のコミットの取り消し方や削除について知りたい時

https://suzutukiblog.com/index.php/2020/12/19/github2/

3:ブランチやgit merge競合が発生した時について知りたい時

https://suzutukiblog.com/index.php/2020/12/20/github3/

4:GitHubアカウントの作成方法、SSH接続について知りたい時

https://suzutukiblog.com/index.php/2020/12/21/github4/

5:git push git pullについて知りたい時

https://suzutukiblog.com/index.php/2020/12/22/github5/

6:GitHub Flowの概要について知りたい時

https://suzutukiblog.com/index.php/2020/12/23/github6/

7:プルリクエスト、git pullについて知りたい時

https://suzutukiblog.com/index.php/2020/12/24/github7/

8:ブランチの削除について知りたい時

https://suzutukiblog.com/index.php/2020/12/25/github8/

9:Gitでトラぶったときに見るやつ

GitHub9(トラブったときに使えるコマンド集)