Rails~https化~AWS+EC2+Certificate Manager+お名前ドットコム
大変久しぶりの投稿にはなりますが、
今回スクールで作った自作ポートフォリオをhttps化しました。
色々と記事を参考にしすぎたことから、整理がついていなかったので、
ブログにまとめて、記録したいと思います。
今回、特に参考にさせていただいた記事は以下の2つになります。
AWS×お名前.comで作成したサイトをSSL化【具体例あり】
AWSでWebサイトをHTTPS化 その1:ELB(+ACM発行証明書)→EC2編 | ナレコムAWSレシピ
事前準備
・AWSでEC2インスタンスを作成済み(これについても後ほど記事にまとめたいと思います)
・ドメイン取得済み(今回はお名前ドットコムです)
・EIPを紐づけている(必須ではありません)
1.ネームサーバーの変更とSSL証明書の取得
まず初めに(順番前後しても問題はないのですが)、僕はお名前ドットコムのページからネームサーバー名の変更を行いました。
手順としては、
1. Root53にてHostedZone作成(サブドメイン作成)
2. お名前ドットコムの管理者ページからネームサーバーの変更を行う
上記の2点になります。
では初めに、AWSのトップページからroute53を選択し(サービスをクリックすれば確認できるはず)、ダッシュボードの【ホストゾーン】を選択したうえで、
ホストゾーンの作成を選択します。
次に、お名前ドットコムで作成したドメイン名を入力し、【作成】を選択します。
なお、タイプは変更せず「パブリックホストゾーン」のまま、コメントは未記入のままでも特に問題はなかったです。
次に作成したホストゾーンのネームサーバーを、
後ほどお名前ドットコムのネットサーバ変更のためコピーします。
続いて、お名前ドットコムのネームサーバーを変更する前に、
SSL証明書を取得します。
今回はCertificate Managerにて証明書を発行します。
サービスから「Certificate Manager」を選択してください。
開いたページより、証明書のリクエストをクリックします。
次のページでも同じく証明書のリクエストをクリックしてください。
ここでは、お名前ドットコムで作成したドメイン名を入力します。
必須ではないようですが、
「この証明書に別の名前を追加」を押して、「*.ドメイン名」とすることで、
ワイルドカード証明書を作成できます。
必要事項を記入したら【次へ】をクリックします。
次に出てくるページでは【DNSの検証】をボタンクリックした状態で、
確定を押してください。
入力した内容が確認できるので、問題なければ【確定とリクエスト】を押してください。
次に【続行】をクリックした後、、、
表示されるドメイン名をクリックします。
(その際、ワイルドカード証明書分ではなく、ドメイン名のみのものです)
ドメイン名をクリックすることで表示される
「値」をコピーしてください。
※この値もお名前ドットコムのページで利用することになります。
※文字列は隠しています
次にAWSのページからお名前ドットコムの設定です。
ユーザーページにログイン出来たら、
ドメイン設定をクリックしたのち、
ネームサーバーの変更ページへ移動します。
続いて、ドメイン名のチェックボタンをクリックし、
初めにコピーしておいた、ネームサーバーをそれぞれ記入してください。
※記入の順番については参考にさせていただいた記事の順番にしております。
次にCNAME設定をお名前.comに設定します。
再度ドメイン設定のページに移り、次はDNS設定をクリックしてください。
続いて対象のドメイン名を選択して【次へ】をクリックしてください。
「DNSレコード設定を利用する」の【設定する】を押しましょう。
画面中段にある「A/AAAA/CNAME/MX/NS/TXT/SRV/DS/CAAレコード」を以下のように入力して、「追加」を押しましょう。
「VALUE」には、前述でコピーした「値」を貼り付けてください。
※僕は「ホスト名」に、【値】をコピーした際に一緒にあった【名前】を記載しましたが、
必ずしも必要というわけではなさそうです。
参考にさせていただいた方は、wwwをつけてたので、ワイルドカード証明書も発行していたら違うのかもしれません。
同ページのチェックも忘れずにしておく
これでお名前ドットコムでの作業は終了です。
発行が完了しているかどうかの判断ですが、
AWSのCertificate Managerより
証明書が【発行済み】となっていれば問題ありません。
※発行済みに代わるまで時間がかかる場合もあるようです。
2.ロードバランサーの設定
EC2ページの左側のナビバーの【ロードバランサー】といった表記があるので、
それをクリックすると以下のページに遷移します。
そこで「ロードバランサーの作成」を選択してください。
次のページでは一番左側の作成を選択してください。
次に名前を記入します。
特に名前の指定はないようです。
僕はドメイン名を記入しました。
ページ中部にある、リスナーの追加をクリックした後、
HTTPSを設定します。
※ここで間違えて、追加するんじゃなくHTTPをHTTPSに変えただけにしてしまっても、後から追加できるので大丈夫でした。
続いてページ下部にある、アベイラビリティーゾーンで、チェックボックスを上から2つ選択して、「次の手順:セキュリティ設定の構成」を押しましょう。
先ほど作成しておいた、SSL証明書が選択されているのを確認し、
「次の手順:セキュリティ設定の構成」をクリックします。
「新しいセキュリティグループを作成する」を選んで、「HTTP」「HTTPS」のタイプを選んで、「次の手順:ルーティングの設定」を押してください。
ここでも名前を付けるのですが、これも特に指定はありません。
なので今回もドメイン名を僕は記入しました。
次に、事前に作成したインスタンスをチェックし、登録済みに追加をクリックします。
すると登録済みターゲットに、先ほど選択したインスタンスが追加されるので、
追加されたインスタンスをチェックし、「次の手順:確認」をクリックします。
これまで設定した内容が反映されています。
特に問題なければ作成を押してください。
ロードバランサーに作成した内容が反映されているはずです。
3.Route53の設定
長くなりましたが最後の設定です!!
AWSのサービスから【Route53】を検索し選択してください。
そうすると以下のページに飛ぶと思うので、ホストゾーンをクリックします。
次のページでは作成したドメイン名をクリックしてください。
画面が切り替わったかと思います。
そこで、【レコードセットの作成】を押すと、右側にナビバーが表示されるので、【エイリアス】を【はい】に変更し、
エイリアス先を先ほど作成したロードバランサーとして選択し、作成をクリックします。
これで手続きとしては完了です!!!
単純な理解にはなりますが、ドメイン名で検索したらhttpsにリダイレクトされる。
といった認識でいます。が、更に知識を得る必要がある内奥だと思いました、、、。
分からないまま使うの怖い、、、。
実際反映まで最大72時間ほどかかるみたいなので、ご注意ください。
(僕は2時間ほどで反映されたので個人差はありそうです)
Rails フォローフォロワー機能を作る
~参考リスト~
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
・今回、以下の方の記事を拝見してフォロー・フォロワー機能を作らせていただきました。
★フォロー・フォロワー機能について
qiita.com
www.y-techmemo.work
★アソシエーションについて
web-camp.io
qiita.com
~前提~
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
■利用するテーブル
・usersテーブル
・relationshipsテーブル(中間テーブル)
■ポイント
・アソシエーション「多対多」(user対user)と「一対多」(user対relationships)の形をとる
・アソシエーションが普通の「多対多」とは違う
・Userモデル、usersテーブルは作っている前提
※僕が機能を実装する際はgemでdeviseを導入していました
~作成手順~
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
1⃣relationshipモデルを作る
2⃣relationshipのマイグレーションファイルを編集&実行(db:migrate)
3⃣userモデル(user.rb)とrelationship(relationship.rb)モデルにアソシエーション(belongs_to/has_many)を書く
4⃣userモデル(user.rb)にフォロー機能のメソッドを書く
5⃣relationshipsコントローラを作成&編集
6⃣フォローボタン(form_for)をviewに設置
1⃣~relationshipモデルを作る~
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
$ rails g model Relationship
userテーブル(テーブル名:users)同士で「多対多」の関係を作ります。何故ならフォロワーもまたuserだからです。userテーブル(テーブル名:users)同士をrelationshipsという中間テーブルでアソシエーションを組むイメージです。
そのため、初めにrelationshipモデルを作成します。
※フォロー機能の難しい部分は、多対多の関係にもかかわらず、Userモデルが一つだけの点です。
参照図引用(【rails】フォロー機能の実装方法 - わいの技術メモ)
これを実現するために、アソシエーションの工夫が必要になります。
両者でhas_many throughの関係を行うのですが、こちらは後ほど詳細を記載しようと思います。
参照図引用(第12章 ユーザーをフォローする - Railsチュートリアル)
2⃣relationshipのマイグレーションファイルを編集&実行(db:migrate)
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
◎マイグレーションファイルを以下のように編集
|db/migrate/年月日時_create_relationships.rb| class CreateRelationships < ActiveRecord::Migration[5.0] def change create_table :relationships do |t| t.references :user, foreign_key: true t.references :follow, foreign_key: { to_table: :users } t.timestamps t.index [:user_id, :follow_id], unique: true end end end
◎relationshipテーブル(テーブル名:relationships)のカラムは以下になります。
カラム | タイプ | オプション |
---|---|---|
user_id | integer | foreign_key |
follow_id | integer | foreign_key:{to_table: users} |
注意点としてはfollow_idの参照先のテーブルはuserテーブル(テーブル名:users)にする必要があるため、{to_table: :users}とすることで、存在しないfollowテーブルの参照を防ぎます。
※foreign_key: trueにすると存在しないfollowsというテーブルを参照しようとする。
「t.index [:user_id, :follow_id], unique: true」 は、 user_id と follow_id のペアで重複するものが保存されないようにするデータベースの設定です。
これは、あるユーザーがあるユーザーをフォローしたとき、フォローを解除せずに、同じユーザーを重複して何度もフォローできてしまうような事態を防いでいます。 終わったら、db:migrateを実行します。
$ rails db:migrate
3⃣userモデル(user.rb)とrelationship(relationship.rb)モデルに
アソシエーション(belongs_to/has_many)を書く
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
初めにrelationshipモデルにアソシエーションを記載していきます。
|app/models/relationship.rb| class Relationship < ApplicationRecord belongs_to :user belongs_to :follow, class_name: 'User' validates :user_id, presence: true validates :follow_id, presence: true end
class_name: ‘User’ と補足設定することで、followモデルという存在しないモデルを参照することを防ぎ、Userモデルであることを明示しています。
さらに、バリデーションも追加してどちらか一つでも無かった場合保存されないようにします!
※1
class_name:’model名’のオプションは、モデル名を指定することができるオプションである。
belongs_toの引数に任意の名称(モデル)を設定することができ、追加されるメソッド名を変更することができるが、
必ずforeign_keyオプションも設定すること(今回)
※2
railsのデフォルトでは、外部キーを表す命名規則が${model名}_idと決まっているため、
同じmodelを参照する外部キーがそのままでは設定できないことからclass_nameオプションを利用する
◎次にuserモデルにアソシエーションを記載します。
|app/models/user.rb| class User < ApplicationRecord # 能動的関係 has_many :relationships, dependent: :destroy has_many :followings, through: :relationships, source: :follow # 受動的関係 has_many :reverse_of_relationships, class_name: 'Relationship', foreign_key: 'follow_id', dependent: :destroy has_many :followers, through: :reverse_of_relationships, source: :user end # throughオプションによりrelationships経由でfollowings・followersにアクセスできるようになる # = 架空のモデルを介して、対象のモデルと多対多の関連付け => これにより情報抽出可能 # sourceオプション = has_many :through関連付けの関連付け元(従属するモデル※今回はモデルではないもの〔follow〕も含む)名を指定する # foreign_keyオプション = 関連付けるモデルを指す外部キーのカラム名を設定する。このオプションを使用しなければ、「belongs_toの引数_id」が指定される
■1行目の has_many :relationships はuserモデルとrelationshipモデルとで一対多の関係を表しています。
■2行目のhas_many :followingsですが、これはいまこのタイミングで架空で作り出された、followingクラス(モデル)です。
勿論、followingクラス(モデル)なんて存在しないため、補足を付け足す必要があります。
through: :relationships(オプション) は「中間テーブルはrelationshipsである」と設定しています。
source: :followとありますが、これは
「following配列の元はfollow_idの集合である」ということを明示的にRailsに伝えています。
結果として、user.followings と打つだけで、user が中間テーブル relationships を取得し、その1つ1つのfollow_idから、「フォローしている User 達」を取得しています。
◎次にフォロワー(フォローされているuser達)をとってくるための記述をします。
1,2行目(フォローしている側)と逆方向(フォローされている側)を記入していきます
■3行目のhas_many :reverse_of_relationshipsは、
1行目のhas_many :relaitonships がフォローしている側と仮定して、その「逆方向」:フォローされている側を仮定する意味で命名しています。
これもこのタイミングで命名したものです。勿論reverse_of_relationshipsという中間テーブルは存在しないため、これも補足を付け足す必要があります。
class_name: 'Relationship'で「reverse_of_relationshipsをrelationsipモデルの事だ」と設定しています。
■4行目は、2行目と同じく架空で作り出された、followersクラス(モデル)に対して、through: :relationships(オプション) を用いて「中間テーブルはrelationshipsである」と設定し、sourceオプションにて、「follower配列の元はuser_idの集合である」ということを明示的にRailsに伝えています。
ここで実は1行目の内容は一部省略されている内容があります。
その内容は以下になります。
has_many :relationships, foreign_key: 'user_id', dependent: :destroy
◎アソシエーションによる流れをまとめると以下になります
●1行目で、フォローしている側のUserから見て、フォローされている側のUserを(中間テーブルを介して)集める。参照するカラムは 'user_id(フォローする側)
●2行目で、中間テーブル(relationships)を介して「follow」モデルのUser(フォローされた側)「follow_id」を集めることを「followings」と定義
●3行目で、フォローされている側のUserから見て、フォローしてくる側のUserを(中間テーブルを介して)集める。参照するカラムは’follow_id’(フォローされる側)
●4行目で、中間テーブル(relationships)を介して「user」モデルのUser(フォローする側)「user_id」を集めることを「followers」と定義
4⃣userモデル(user.rb)にフォロー機能のメソッドを書く
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
※userモデルにフォロー機能のメソッドを書いておきます。
|app/models/user.rb| class User < ApplicationRecord has_many :relationships, dependent: :destroy has_many :followings, through: :relationships, source: :follow has_many :reverse_of_relationships, class_name: 'relationships', foreign_key: 'follow_id', dependent: :destroy has_many :followers, through: :reverse_of_relationships, source: :user def follow(other_user) unless self == other_user self.relationships.find_or_create_by(follow_id: other_user.id) end end def unfollow(other_user) relationship = self.relationships.find_by(follow_id: other_user.id) relationship.destroy if relationship end def following?(other_user) self.followings.include?(other_user) end end
●def follow では、unless self == other_user によって、フォローしようとしている other_user が自分自身ではないかを検証しています。
self には user.follow(other) を実行したとき user が代入されます。つまり、実行した User のインスタンスが self です(以降のコントローラーより詳細確認)
更に、self.relationships.find_or_create_by(follow_id: other_user.id) は、見つかれば Relation を返し、見つからなければ、 self.relationships.create(follow_id: other_user.id) としてフォロー関係を保存(create = new + save)することができます。これにより、既にフォローされている場合にフォローが重複して保存されることがなくなる
●def unfollow では、フォローがあればアンフォローしています。また、relationship.destroy if relationshipは、relationship が存在すれば destroy します。
if文は後置ifで記載することが可能です。
●def following? では、self.followings によりフォローしている User 達を取得し、include?(other_user) によって other_user が含まれていないかを確認しています!含まれている場合には、true を返し、含まれていない場合には、false を返します。そのため、既にフォローしているか・していないかはこれで定義されます。
※self .(user自身を表すオブジェクト) は省略可能です。
5⃣relationshipsコントローラを作成&編集
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
コントローラーは(Railsでフォロー機能を作る方法 - Qiita)を参考に若干僕のアプリに導入できるよう、訂正したものが以下になります。
コントローラーはターミナルより【relationships】と名付けて作成してください。
|app/controllers/relationships_controller.rb| class RelationshipsController < ApplicationController def create user = User.find(params[:follow_id]) following = current_user.follow(user) if following.save flash[:success] = 'ユーザーをフォローしました' redirect_to user else flash.now[:alert] = 'ユーザーのフォローに失敗しました' redirect_to user end end def destroy user = User.find(params[:follow_id]) following = current_user.unfollow(user) if following.destroy flash[:success] = 'ユーザーのフォローを解除しました' redirect_to user else flash.now[:alert] = 'ユーザーのフォロー解除に失敗しました' redirect_to user end end end
6⃣フォローボタン(form_for)をviewに設置
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
こちらもまた、(Railsでフォロー機能を作る方法 - Qiita)を参考に僕のアプリに導入できるよう、引数を若干訂正しております。
※部分テンプレートで利用する際、インスタンス変数をrenderメソッドで渡すため
|app/views/relationships/_follow_button.html.erb| <% unless current_user == @user %> <% if current_user.following?(@user) %> <%= form_for(current_user.relationships.find_by(follow_id: @user.id), html: { method: :delete }) do |f| %> <%= hidden_field_tag :follow_id, @user.id %> <%= f.submit 'Unfollow', class: 'btn btn-danger btn-block' %> <% end %> <% else %> <%= form_for(current_user.relationships.build) do |f| %> <%= hidden_field_tag :follow_id, @user.id %> <%= f.submit 'Follow', class: 'btn btn-primary btn-block' %> <% end %> <% end %> <% end %> # hidden_field_tag :follow_id, @user.id は、follow_idというパラメータに、 @user.idの情報を渡しています。 # = hidden_field_tag どのようなシンボルに(第一引数)、どの値を渡すか(第二引数)
あとは、フォロー・フォロワー機能を実装したいところに
<%= render ‘relationships/follow_button’, user: @user %>
といった形で記述をすれば問題ありません。
※route.rbへのルーティングも忘れないように
resources :relationships, only: [:create, :destroy]
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
自分への備忘録という形でブログに記載させていただきました。
先人の方たちに続けれるように頑張りたいです。
Ruby~Minitest~
スクールの1ヶ月目の課題が終わり、RailsTutorialをしながら学習をしていましたが、
テストやその自動化、その他にもそもそもRubyについての理解が足りないと思い現在’RailsTutorial’と併せて’プロを目指す人のためのRuby’を使い勉強をしています。
今回はいつものことながら、
僕自身が忘れないようにというために、書き起こしたいと思います。
まず、テストコードのひな型ですが、以下になります。
01: require 'minitest/autorun' 02: 03: class SampleTest < Minitest: :Test 04: def test_sample 05: assert_equal 'RUBY', 'ruby'.upcase 06: end 07: end
01:ライブラリ('minitest/autorun')を’require’メソッドで読み込んで、プログラム内でminitestを使えるようにする
03~07:テストコードの本体
03:クラス名は慣習として、TESTで終わる、もしくはTESTで始まることが多い。
また、テストコードが書かれたファイルのファイル名はクラス名と合わせること。
※クラス名はキャメルケース、ファイル名はスネークケースで書くこと。
04~06:実行対象となるテストメソッド
※Minitestは”test_”で始まるメソッドを探して実行するため、メソッドの定義の際は注意が必要
05:検証メソッド。ここで、Minitestが提供している'assert_equal'を使って検証している。
<<assert_equal 期待する結果, テスト対象となる値や式>>
※引数の順番を間違えないように注意が必要です。
Minitestには様々な検証メソッド用意されています。
利用例
# aがbと等しければパスをする assert_equal b, a # aが真であればパスをする assert a # aが偽であればパスをする refute a # 標準出力への出力内容を検証する assert_output #指定したエラーが発生した場合にテストをパスさせる assert_raises
検証メソッドについて教本記載の内容は以上でありましたが、
自分自身調べて使えるようになりたいと思いました。
今回は以上までです!
Deviseでemail以外の項目でログインする場合の注意点
今回、自身が作成中のアプリで
email can't be blank rails
と出てしまい、teratermを見ると、rollback transaction
と表記されてしまったこと。
それに対して、自分自身が忘れてしまうことがないように、対処した内容と注意点を記したいと思います。
そもそも、emailをログインの鍵にしたい
かつ
新規登録の場合、ユーザー名を入力したいということであれば、
#application.controller.rb devise_parameter_sanitizer.permit(:sign_up, keys: [:name])
上記記載だけでよかった
(gemでdeviseを利用しているため、emailで鍵の機能を保有していた・ユーザー名の保存機能を付け足すだけでよかった)
しかし、ユーザー名をログインの鍵にしたい場合はそうはいかない。
初めに、以下の記入を行った。
#config config.authentication_keys = [:name] config.case_insensitive_keys = [:name]・・・元々[]内はemailと記載あり config.strip_whitespace_keys = [:name]・・・元々[]内はemailと記載あり
上記記入によって、ログインの鍵をユーザー名に変更することができた。
しかし、サインイン(新規登録)の際、email can't be blank railsと出てくるようになってしまった。
これに対しては、以下の記入を行い、対処した。
#application.controller.rb devise_parameter_sanitizer.permit(:sign_up, keys: [:email])
元々、deviseの初期機能としてemailの保存機能はついていたものの、
configから設定の変更を行ったことで、保存機能が作用しなくなったようだ(詳しくは異なるかもしれません、正確な情報あればお伝え頂けると幸いです)
そのため、上記追記を行うことで、ログイン・サインインどちらもできるようになった。
インスタンス変数とローカル変数
スクールのカリキュラムの中で、
ローカル変数を利用していた、
destroy
update
これらでインスタンス変数が利用される機会があった
なぜ、利用されていたかを忘れないために本日は投稿したいと思います。
そもそも、これまで上記のメソッドを利用する際は
redirect_to url
という形で遷移していたため問題なく、アプリは動いていた。
しかし、条件分岐を利用し、
render :url
上記の処理が発生すると、これまでredirect_toでは遷移先のインスタンス変数でviewの表示ができていたものが、
renderでは遷移元でインスタンス変数の定義がされなければviewの表示ができなくなる。
そのため、ローカル変数にて定義出来るものについても、インスタンス変数で定義することもある。
個人で見返すための記載になるので、更に理解が深まった時には誰が見ても分かるように書き直したい、、。
Rails ~f.label/カラム~
今回、Railsの仕様上、labelタグを利用した際の頭文字の大文字・小文字について
教えていただいたことをまとめます。
<%= f.label :title %>
この"title"はカラムになるのですが、
この場合、"Tittle"と記載していなくても、頭文字は大文字になります。
render
を利用したとき、どうしてもCSSでerrorsが反映されない理由が不明だったのですが、
元々 :Title という表記でカラムを記入していたことが原因だったとわかりました。
また、頭文字を小文字で表記したい場合は、
<%= f.label :title ,"title" %>
という記載をすれば、頭文字は小文字にて記載されます。
Font Awesomeの利用
Font Awesomeを利用するにあたって、確実に何度も調べてしまうであろうことから、ブログの形で残そうと思います。
*Font Awesomeとは
Font Awesomeは、Webサイトで「Webフォント」を表示できるようにしてくれるサービスです。
公式サイト:Font Awesome
⁑利用方法
①公式サイトからCSSファイルのダウンロードを行い、HTMLファイル内にタグを記述してCSSファイルとリンクさせる方法
②「CDN」を利用
※CDNは利用が容易
「CDN」とは
→webコンテンツをインターネット経由で配信するために最適化されたネットワークの仕組み
CDNを利用するにあたって準備が必要となる
・HTMLファイルの
※Font Awesomeに関する記述は、style.cssの記述よりも前に記述
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.8.1/css/all.css" integrity="sha384-50oBUHEmvpQ+1lW4y57PTFmhCaXp0ML5d60M1M7uH2+nqUivzIebhndOJK28anvf" crossorigin="anonymous">
Font Awesomeを利用し、ユーザーアイコンをWebページに表示するには、
HTMLファイルの所定の場所にタグと、クラス名を
表示までの手順は3つです。
1)アイコンリストページを開く 2)アイコンをクリック 3)コードが表示されるのでコピーする
アイコンリスト
今回は取り急ぎ利用方法のまとめです。
他必要情報や知識が増えたら加筆予定になりますが、今日のところはここまで、、。