月別アーカイブ: 2021年10月

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(トラブったときに使えるコマンド集)

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

その8から続きます

1:余計なファイルをコミットしてしまってignoreしたい時

秘密ファイルをコミットしてしまった場合とかに使える

Gitの管理から削除するなら

git rm --cached ファイル名

echo 'ファイル名' >> .gitignore

ファイルを履歴とも消すなら

秘密ファイルを過去にコミットしてしまった場合とかに使える

git filter-branch --index-filter 'git rm --cached --ignore-unmatch ファイル名' HEAD

2:修正ミスってたので直前のコメントをなしにしたいとき

続きを読む

GitHub8(ブランチの削除)

その7から続きます。

現在のリモートブランチを確認

git branch –remote

origin/HEAD -> origin/master
origin/feature-hello ←このブランチを削除したい
origin/master

リモートブランチの削除

git push –delete origin feature-hello

パスフレーズを尋ねられるのでコマンドする
git branch –remote

ローカルブランチを削除

続きを読む

GitHub7(プルリクエスト、git pull)

その6から続きます。

リモートリポジトリからクローン

cd ~/environment/git_repositories/
git clone git@github.com:******/githubflow.git
パスフレーズをコマンド
ls
githubflow tutorial tutorial_2
↑のようになればOK
cd githubflow/
ls
README.md
↑のようになればOK

ブランチを生成してソースコードの記述

続きを読む

GitHub6(GitHub Flowの導入部)

その5から続きます。

ワークフローの例

・Git Flow Gitを最大限に活用できるが複雑
・GitHub Flow シンプル。1日に何度もデプロイするチームで使いやすい

GitHub Flowが行っているGitHubFlowのルール(要約)

1.マスターブランチは即座にデプロイ可能な状態を保つ

2.ブランチ上で必ず作業し、その生存期間をできるだけ短かくすること

3.(変更したら、)すぐにPull Requestを作り、フィードバックやサインオフを求める

4.マージしたらすぐにデプロイをすること

ワークフロー

続きを読む

GitHub5(push,pull)

その4から続きます。

リモートリポジトリへプッシュ1

git push -u origin master
パスフレーズを尋ねられるのでコマンドする

GitHubのtutorialのところでリロードするとリポジトリがアップロードされている!!

リモートリポジトリへプッシュ2

マスターブランチ以外にpushすることもできる。feature-Zを作成

git checkout -b feature-Z

このローカルリポジトリをリモートリポジトリ(tutorial)へ同じ名前のブランチ名でプッシュするには

git push -u origin feature-Z

続きを読む