irodimazak

!= '主に日々学んだ事を書き留めます。'

ソリューションアーキテクト講座

メモ書きをまとめていく。

AMI
OSのイメージの事 Dockerでもイメージという言葉が出てくるが概念は同じ物だと思う、OSがインストールされた状態のハードディスクの内容を丸ごと写した物
Ubuntu LinuxCentOs, Windows Severなど様々な種類から選択できる。

SSD
ソリッドステートドライブHDDと同様の記憶装置の事、
半導体素子メモリを使ったドライブの事

ポート番号
ポート: ネットワークでデータを通信する為の扉のような物、
IPアドレスが建物の住所に例えるなら、ポート番号は「部屋の何号室か?」という例えになる。

プロトコルIPアドレス、ポート番号はどのうような方法で、どこの何号室に通信をとるのか?

という事になる。

IAM
AWSのサービスやリソースへのアクセスを安全に管理できる、IAMを使用すると、AWSのユーザーとグループを作成及び管理し、アクセス権を使用してAWSリソースへのアクセスを許可及び拒否できる。

CloudTrail
インフラストラチャ全体でアカウントアクティビティをログに記録し、継続的に監視し、保持できる。
アカウントアクティビティのイベント履歴を把握できる。
このイベント履歴により、セキュリティ分析、リソース変更の追跡、トラブルシューティングをより簡単にできる。
S3にログを保存したりもできる。

CloudWatch
AWSのサービスのモニタリングを行う。
alermの設定はバージニア北部リージョンでしかできない。

ELB
AWSクラウド上で使用できるロードバランシングサービス

ロードバランサ
負荷(load)を 分散(Balance)させる。
負荷分散装置の事

すごくわかりやすい例だったので拝借

閑話休題。 ここは駐車場である。駐車場は3エリア(Webサーバ)ありそれぞれに駐車場管理者がおり、またどこの駐車場が空いているかチェックしている振り分け担当者(ロードバランサ)がいる。日曜日になると、大混雑する(アクセス過多)。

振り分け担当者は3つの駐車場がどれくらい空いているかを駐車場管理者と連絡を取って空き具合を確認し、駐車場に来た新しい車を振り分ける役割をしている。 振り分け方法として一番簡単なのは、各駐車場に対して順繰りに車を振り分ける方法だ(ラウンドロビン方式)。駐車場のサイズが全部一緒であれば、このやり方は一定確率でうまくいくだろう。しかし、駐車場のサイズが違う場合は、このやり方ではうまくいかない。適宜駐車場の管理人と連絡し、各々の駐車スペースの占有率等を確認する必要がある(ヘルスチェック)。

...という風に、考えると理解しやすいかもしれない。

Route53
AWSドメインネームシステム(DNS)サービス

DNS
インターネット上でドメイン名を管理・運用するために開発されたシステム

AWS Lamdaについて

AWSのLamdaについて調べていこうと思う。
そもそもLamdaとは何か?
あるブログの筆者からの引用です。

Lamdaとはサーバレスを実現する為のサービスである。
サーバレスとはプログラムを実行する為のサーバーがいらないと言う事らしい。前半はまあ良しとしても後半は絶対違う!😤

まずこのような概念を理解する事が大事なのでもう少し丁寧に調べる、

qiita.com

この方の記事はわかりやすかった。

サーバレスアーキテクチャーの概念

  • サーバーを常時起動しない
  • 何らかのトリガー=イベントの発生により動的にリソースが割り当てられ、事前に登録しておいたコードが実行される

ここで言う、事前に登録しておいたコード、この部分がLamdaにあたるのではないかなと私は思っている。 つまり

Lamdaとはサーバレスアーキテクチャーの構成の一部であり、何らかのトリガーが発火した時に実行される関数の事

であると自分は解釈しました。
脱線しますが、サーバレスって以下のようなメリット、デメリットがあるみたいです。

メリット

Functionごとの粒度による分割統治と、
ステートレスな設計(そうせざるを得ない)により、必然的に機能間の依存関係が極少化されます。
したがって、上手く設計できれば、変更に対して非常に柔軟な構造になります。

デメリット

コード実行後はインスタンスが消滅するため、ステートレスで機能間の依存性がない設計が必要となります。

Railsのようなフレームワークをばらした物を組み合わせてアプリケーションを作るからそうなるんだろうな🤔

以下はAWSからの引用です。

AWS Lambda はイベント発生時にお客様のコードを実行し、基盤となるコンピューティングリソースをお客様に代わって管理する、サーバーレスコンピューティングサービスです。AWS Lambda を使用すると、カスタムロジックを使って AWS の他のサービスを拡張することや、AWS の規模、パフォーマンス、セキュリティを活用して運用する自社のバックエンドサービスを作成することができます。AWS Lambda では、複数のイベント (Amazon API Gateway 経由の HTTP リクエスト、Amazon S3 バケット内のオブジェクト変更、Amazon DynamoDB 内のテーブル更新、AWS Step Functions 内の状態遷移など) に応答して、自動的にコードが実行されます。

概念がわかってくると読みづらい公式の説明も理解しやすくなってくるよね!
これからはこういったPaasやFaasなどのサービスを使ってWebアプリケーションを作って行く事が主流になっていくと思うので少しづつ進めていかなくては。

SystemSpecについて

Rspecでテストを書くに当たって今回はSystemSpecを使って書いていく事にしました。

SystemSpecとは

Rspecの機能の名称である。
featurespecは書いた事あるんだけど、その時からテストは書けるけどRspecとfeaturespecの違いって何だろうぐらいに思ってました。
ここでまとめてみようと思う、featurespecもRspecの機能の名前である。
なんかこの辺検索してもいい感じの表現で書いてある記事がヒットしない、
きっとみんな何となく使ってるんだろうな。
Rspecとはテスティングフレームワークでtest版Railsみたいな物だと思う。
その中で使える機能って事です。
話は戻って、SystemSpecはfeaturespecと何が変わったかと言うと、

  • デフォルトでselnium-webdriver + Chrome上でテストが実行される。

    selnium-webdriver
    ブラウザの操作を自動化するためのツールだったり、ライブラリだったりする物

  • DatabaseCleanerやDatabaseRewinderを使ってトランザクション管理をする必要がない。
    今まではgem 'database_cleaner'などを入れないとどんどんデータベースにテスト用のデータが作成されてしまうが、SystemSpecより不要になった。

  • テストが失敗すると自動的にtmp/screenshotsディレクトリにスクリーンショットを保存してくれる。
    これはcapybaraを書いていくと内部的な処理を考えながら書いていくので、失敗した時に視覚的にどのページで作業が止まったのか確認し安くなったのは良い事だと思う。

現役のエンジニアさんが、『今ではfeaturespecは使っていなくてsystemspecになっている。』と言っていたので現場レベルでも主流になって行ってるんだな、実際便利だしね。
テストはcapybaraを使って書くことは慣れてきたし、これからはテスト構文、describeやcontentとか意識して何のテストかしっかり定義できるように書いていく事も覚えて行かなくてはいけないな。

JavaScript プロトタイプ

いつも思うけど、自分の中で言葉の定義が曖昧だと学習の効率がよく無いと思う。🤔
1 + 1 が 1.9 でも 2.1 でもいけないように、そこがはっきりしないと進めて行くうちに、
わからなくなってくるから大事な事ははっきりさせたいと思う。

そこで今日はこれ Prototype;

JavaScriptでは全てのオブジェクトはObjectオブジェクトを継承しているらしい。
このあたりはrubyのクラスの関係に似てるよね🙂
正確に言うとほぼ全てのオブジェクトはObject.prototypeプロパティに定義されたprototypeオブジェクトを継承しているって言う事。
prototypeオブジェクトは、全てのオブジェクトの作成時に自動的に追加される特殊なオブジェクトだよ。
物凄くわかりづらいよね、具体的にみていくよ。
まずは空の変数を定義してみる。

const obj = {};
console.log(obj.toString()); //"[object Object]

空のオブジェクトでもtoStringメソッドが呼び出せたよ、これはtoStringメソッドはObjectのprototypeオブジェクトに定義があるから使えるんだ。
このようなprototypeオブジェクトに組み込まれているメソッドはプロトタイプメソッドと呼びます。 これすごく大事な事、Objectのインスタンスは、このObject.prototypeオブジェクトに定義されたメソッドやプロパティをインスタンス化時に継承します。 つまり、オブジェクトリテラルコンストラクターインスタンス化したオブジェクトは、Object.prototypeに定義されたものが利用できるということです。

const obj = {
    "key" : "value"
};
// `obj`インスタンスは`Object.prototype`に定義されたものを継承する
// `obj.toString`は継承した`Object.prototype.toString`を参照している
console.log(obj.toString === Object.prototype.toString); // => true
// インスタンスからプロトタイプメソッドを呼び出せる
console.log(obj.toString()); // => "[object Object]"

と言う事、 Object.prototypeに定義されているプロトタイプメソッドはインスタンス作成時に継承される為使える、だから最初に書いたオブジェクトリテラルで作られた空のインスタンスでもtoStringが使えるって事😤

やっぱり言語化するって大事な事だな、
頭の中でイメージした事を追っていくので学習効果が高いのかな。
to be continued

git stash

アプリ開発中、間違えてmasterで作業していた。
developブランチでの作業にする為に'stash'を使う。
まずstashとは、

ブランチを切り替えてちょっとだけ別の作業をしたくなることがあります。中途半端な状態をコミットしてしまうのはいやなので、できればコミットせずにしておいて後でその状態から作業を再開したいものです。そんなときに使うのが git stash コマンドです。

さすが公式すごいわかりやすい🤔

$ git stash

と打てば作業した内容が保存される、ただしここで気をつけてほしいのが、
保存される内容はステージにあげたものだけになります。 ☝🏻
ラッキングされていないファイルつまりaddされていないファイルは保存されません。
そこは注意してください。
stashを行ったら作業を行いたいブランチに移動して、

$ git stash list #を入力
stash@{0}: WIP on master: 049d078 added the index file
stash@{1}: WIP on master: c264051 Revert "added file_size"
stash@{2}: WIP on master: 21d80a5 added number to log

そうすると保存されたstashのリストが表示されますので差分を適用させたいリストを。

$ stash apply stash@{n}

これで保存した、差分が適用される 適用されても、以前ステージしていたファイルはステージされていない状態になるのでもう一度上げる必要がある。
ただし、

$ stash apply stash@{n} --index

とオプションをつけると一緒にしてくれるみたいです。🙆‍♂️

JavaScriptについて

JavaScriptの勉強を進める中で気になった言葉をまとめる。

ブラケット構文

[]を使ってプロパティにアクセスする構文

get = object[property_name];
object[property_name] = set;
//propety_nameはシンボルまたは文字列で、任意の値でも構わないらしい。
//例えば'!んん'でも'1foo'でも良い "_"空白があっても良い。
document.createElement('pre');  
//ドット記法の以上のリテラルと以下のリテラルは同一である。
document['createElement']('pre');

『...』演算子

console.log(Math.max([15, -3, 78, 1]));
// 配列に対して個々の値にすることができるのでMath.maxメソッドを使うことができる。

returnで複数の戻り値を得ることはできない。

この場合は配列/オブジェクトとして値を一つにまとめた上で返す必要がある。

function getMathMin(...nums) {
  return[Math.max(...nums),Math.min(...nums)];
}

再帰関数

ある関数が自分自信を呼び出すこと、またそのような関数の事、再帰関数を利用する事で同種の手続きをなんども呼び出す処理をコンパクトにすることができる。

function factorial(n) {
  if (n! = 0) { return n * factional(n-1); }
  return 1;
}
console.log(factorial(5));

JavaScriptの関数はデータ型の一種である。 関数を引数、戻り値として扱う関数を高階関数という。

font-awesomeについて

font-awesomeって何だろう?
以前シェルをbashからzshに変更した時に、 oh-my-zshというプラグインを導入した、
その中のテーマを利用する為にfont-awesomeをインストールしてね❤️
と出てきたりしていたのだが、その時は気にしなかった。(解らなかった)
この度アプリを開発している中で使用する機会があったので、せっかくだから調べてみようと思う。

Font AwesomeとはBootstrapで使用できるように開発された、フォントとアイコンのツールキットらしい。
サードパーティで使用されているフォントスクリプトの約20%も使用されているみたいです。
ちなみに第一位はGoogle fontsだそうです。
公式を見に行ったら以下のようなものがありました。

f:id:takashi_take:20190927200651p:plain
公式のアイコンなんかもあるみたい!

プランが2通りあって、freeプランとproプランproは有料で年間$99で使えるみたいです。(普通に高い)
railsで使用するにはgem 'font-awesome-rails'を使えば使用できます。

<%= fa_icon("user lg") %>

ビューでこのような記述をすると、
f:id:takashi_take:20190927201547p:plain
こんなアイコンが表示されたりします。

f:id:takashi_take:20190927201942p:plain
可愛い🤔

色を変えたりもできるみたい、githubから確認できます。

github.com 一応リンク貼っときますね。
デザインを凝りだしたらキリがないね。
おしゃれなアプリを作りたい方は使ってみてください。