Amazon Web Services 基礎からのネットワーク&サーバー構築 メモ
2章
やること VPC領域にネットワークを構築する
- IPアドレスとはインターネット上の住所
- 2進数32ビットで表現される 例: 11000000101010000000000100010100
- 2進数だと人間にとってわかりにくいので、8bit区切りで10進数に変換して表現する 192.168.1.20
- IPアドレスはネットワーク部とホスト部に分割される
- 同じネットワークに属するホストA, Bのネットワーク部の値は同じになる
- ホストに割り当てるIPアドレスの範囲は2のN乗の値にするルールがある
192.168.1.0~192.168.1.255の場合、192.168.1がネットワーク部、0~255がホスト部となる
.で区切られた値は0~255のいずれかの値になるので、IPアドレスは256種類となる
CIDR表記 ネットワーク部をprefixとし、prefixが何ビットかを明記する
- 例 192.168.1.0~192.168.1.255の場合、192.168.1がネットワーク部になる
- 8ビットづつ区切られているので、8 x 3で24ビット
- 192.168.1.0/24
- サブネットマスク表記はプレフィックス(ネットワーク部の)のビット数だけ2進数の1を並べ、ホスト部は0とする
以下3つは同じ
- 192.168.1.0 ~ 192.168.1.255
- 192.168.1.0/24
- 192.168.1.0/255.255.255.0
CIDR表記とサブネット表記の違いはビット数で表すか、ビット数を255で表現するか
VPC領域には10.0.0.0/16を割り当てる
10.0.0.0/16をさらに分割する
- 256のサブネットに分割する(実際に使うのは256のサブネットのうち2つ)
- aaaa.bbbb.cccc.dddd
- 10.0.0.0/16だと10.0までがネットワーク部だったが、10.0.0をサブネットとする
- 256個のサブネットが作成され、各サブネットはddddを256個持つ
- 10.0.1.0/24 をパブリックサブネットとする
- 1は0~256の値を選べる
- aaaa.bbbb.cccc.dddd
- 256のサブネットに分割する(実際に使うのは256のサブネットのうち2つ)
パブリックサブネット10.0.1.0/24をインターネットに接続する
- インターネットゲートウェイを通じてインターネットを通信する
- インターネットゲートウェイ → パブリックサブネット
- インターネットゲートウェイを作成してVPCに紐づける
- ネットワークにデータを流すにはルーティングを設定する
サブネットが作成された時にデフォルトでルーティングが設定されている
デフォルトゲートウェイが、インターネットゲートウェイなルートテーブルをもつサブネットのことを、パブリックサブネットと呼ぶ
- インターネットゲートウェイを通じてインターネットを通信する
3章
- EC2インスタンスにはプライベートIPを割り当てSSHで接続する
- ルーター同士が通信してルートテーブルの情報をやりとりしてくれる
- セキュリティグループでIPアドレス、ポート番号制限などのパケットフィルタリングを行う
4章
- インバウンドルールにポート80へのアクセス許可を追加し、HTTP通信でブラウザからapacheの画面が開くことを確認する
- ↑のオープンアドレスをクリックするとhttps:グローバルIPとなるので、httpに直してブラウザに入力する必要がある。
- nslookupコマンドでDNSサーバーがどのように名前解決しているか調べる
5章
- 特になし
6章
- DBサーバーはインターネットから隔離したプライベートサブネットにおく
- インターネットから隔離するので、パブリックIPアドレスは持たない
- 同じネットワークに所属しているため、WEBサーバーを置いたパブリックサブネットからDBサーバーを置いたプライベートサブネットに通信できる
- pingコマンドを返すようにするには、セイキュリティグループにすべての ICMP - IPv4を追加する
- Webサーバーを踏み台とすることで、DBサーバーに接続する
7章
- プライベートサブネットはインターネットと繋がっていないためMariaDBをインストールできない
- NATを使うとプライベートサブネット → インターネットの向きの通信ができるようになる(逆は不可)
- プライベートサブネットとインターネットの間にNAT(Network Adress Translation)を挟む
- NATゲートウェイはインターネットから接続可能な場所である「パブリックサブネット」に配置する
- プライベートサブネットのデフォルトゲートウェイがNATゲートウェイを経由するように
8章
- WordPress動いた〜
9章
感想
- 2章が個人的に一番重かったが、ちゃんと読めば後の章はスラスラ読める
- 9章のTCPあたりの話は別の本で補完したい
Vuetifyのv-slot:activator="{ on, attrs }"についてメモ
v-slot:activator="{ on, attrs }"
が何をやっているのか理解できなかったのでメモ。
<v-tooltip bottom> <template v-slot:activator="{ on, attrs }"> <v-btn color="primary"dark v-bind="attrs"v-on="on"> Button </v-btn> </template> <span>Tooltip</span> </v-tooltip>
以下の記事を読めば解決しましたが理解を深めるため自分の言葉でまとめます。
https://qiita.com/aotoriii/items/06ae49c135061a12b75
slotとは
Vuetify云々の前にslot
についておさらい。
slot
は親コンポーネントから子供コンポーネントで使うコンポーネントを渡せるVueの機能。
シンプルなスロット
<!-- parent-component.vue --> <div> <child-component> Hello World </child-component> </div> <!-- child-component.vue --> <div> message: <slot></slot> </div>
message: Hello World
が表示される。
スコープ付きスロット
子コンポーネントが持っているプロパティを、親コンポーネントのslot
の箇所で参照できるようになる。
<!-- parent-component.vue --> <template> <div> <MyCom v-slot:bind-user="parentComponentUser"> {{ parentComponentUser.user.name }} </MyCom> </div> </template> <script> import MyCom from '../components/MyCom.vue' export default { components: { ChildComponet } } </script> <!-- child-component.vue --> <template> <div class="mycom"> <p>name:<slot v-bind:bind-user="user">{{ user.age }}</slot></p> </div> </template> <script> export default { name: 'MyCom', data () { return { user: { name: 'sano', age: 100 } } } } </script>
child-component
でuser
というslot
を定義している。またbind-user
にリアクティブなオブジェクトuser
をバインドしている。
親コンポーネントでは、bind-user
がparentComponentUser
に渡され最終的にsano
が表示される。
上記のslot
の例と同様に、Vuetifyのコンポーネントはそのコンポーネントにイベントが発生した時に表示するコンテンツをslot
を使って渡すことができる。
<v-tooltip bottom> <!-- slot開始--> <template v-slot:activator="{ on, attrs }"> <v-btn color="primary"dark v-bind="attrs"v-on="on"> Button </v-btn> </template> <!-- slot終了--> <span>Tooltip</span> </v-tooltip>
toolchip
のサンプルコードからは以下のことがわかる。
on
とは
https://vuetifyjs.com/ja/api/v-tooltip/#slots
ドキュメントにはイベントハンドラーを持つオブジェクトとある。
on: { [eventName]: eventHandler },
実際に試してみる。
<v-tooltip bottom> <template #activator="{ on, attrs }"> <v-btn color="primary" dark v-bind="attrs" v-on="on" @click="clickOn(on)"> Button </v-btn> </template> <span>Tooltip</span> </v-tooltip> <script> export default defineComponent({ setup() { const clickOn = (on: any) => { console.log(on) } return {clickOn} } }) </script>
Buttonをクリックするとconsoleにイベントハンドラーを持つオブジェクトが表示される。
v-on="on"
とは
https://qiita.com/aotoriii/items/06ae49c135061a12b75e#v-ononとは で全て解説されているので詳細をこちらを確認してください。
結論を書くとv-on="{ [eventName]: eventHandler }”
のようにイベント名とイベントハンドラをかける、ということです。先のconsole.logで確認したVuetifyが提供するイベントハンドラーが登録されます。ホバーしたときにthipを表示するといったコンポーネントの挙動を決めてくれています。
v-bind="attrs"
attrsはアクセシビリティ関連のオブジェクト。
以下の記事に詳しくまとまっていた。
https://qiita.com/Gedyra/items/9d05e10329808367396f
value: boolean
https://vuetifyjs.com/ja/api/v-tooltip/#slots
ドキュメントには明確に記載されていないがイベントハンドラが呼ばれたかの情報と思われる。
valueとonを利用するとiconにホバーした時にtooltipを出し、且つiconの色をかえるといったことができる。
<v-tooltip bottom> <template #activator="{ on, attrs, value }"> <v-icon medium class="ml-1" :color="value ? '#0068B7' : '#757575'" v-bind="attrs" v-on="on" > mdi-help-circle </v-icon> </template> thipに出るテキスト </v-tooltip>
まとめ
Vuetifyのコンポーネントは、slot
でコンポーネントの中身をカスタマイズでき、そのカスタマイズする内容にコンポーネントの状態を含めることができる。Vuetifyすげ〜。
docker-compose run web bundle installでGemをインストールした後に再度buildが必要な理由
前提
https://docs.docker.com/samples/rails/ を参考にDocker環境でRailsを起動
問題
fakerをGemfileに追記後、docker compose run web bundle install
, docker compose up
すると以下のエラーが出る。
docker-rails-sample-web-1 | /usr/local/lib/ruby/3.1.0/bundler/definition.rb:481:in `materialize': Could not find faker-2.19.0 in any of the sources (Bundler::GemNotFound)
https://docs.docker.com/samples/rails/#rebuild-the-application を読むとgemをGemfileに追記した後にdocker compose run web bundle install
,docker compose up --build
する必要がある。
なぜbuildする必要があるのか理解できなかったので整理する。
メモ
イメージとは -> コンテナの土台となる動作環境テンプレート
Dockerfileとは -> カスタムイメージを作るためのファイル
Buildとは -> Dockerファイルからイメージを作ること
docker compose run web bundle install
runコマンドについて
1 つのサービスに対して、1 コマンドだけ実行します。
run
によって指定したコマンドは、定義されたサービス設定に基づいて生成された新たなコンテナー内において実行されます。
https://matsuand.github.io/docs.docker.jp.onthefly/compose/reference/run/
ポイントは新たなコンテナー内において実行されるということ。
bundle installでgemが追加される環境はrunコマンドによって作成されたコンテナーに限定される。
docker compose up
コンテナの作成、起動を行う
docker compose build
DockerFileを元にサービスのビルドを実行する。
DockerホストのGemfile, Gemfile.lockを元にbundle installを実行する
# 一部抜粋 COPY Gemfile /myapp/Gemfile COPY Gemfile.lock /myapp/Gemfile.lock RUN bundle install
エラーが起きるまでの流れ
- Dockerホスト(Mac)のGemfileに追記すると、ボリューム先のGemfileも更新される
docker compose run web bundle install
を実行すると、コンテナが新たに作成され、そのコンテナでbundle install
が実行され、faker gemがインストールされる。 またコンテナー、Dockerホスト のGemfile.lockが更新されるdocker compose up
を実行すると、fakerをインストールしていないイメージを元にコンテナが作成されるが、Gemfile, Gemfile.lockにはfakerの記述あるので、エラーになる
結論
再度buildしイメージを更新しないとdocker compose up
で作成されるcontainerの環境にgemがインストールされない。
回避策としてgem用のvolumeを作って永続化すれば、再buildしなくて済みそうです。
https://qiita.com/neko-neko/items/abe912eba9c113fd527e
おまけ buildした時に必ずbundle installが走るわけではない
docker compose build
- 再度
docker compose build
するがgemのinstallのログは吐かれていない - コンテナのgemのフォルダに移動して作成日時を確認すると、1回目のbuildの時刻と一致する
キャッシュしていることが原因。docker compose build -no-cache
とすると上記手順の2でもgemがinstallされる。(インストールされるgemは変わらないので意味はないです。)
2021年の振り返りと2022年の目標
大分出遅れた感がありますが、2021年の振り返りと2022年の目標を書きます。
2021年
2021年は変化の多い年でした。
- 2月 エンジニアのアルバイト開始
- 5月 エンペイに入社、フィヨルドブートキャンプ卒業
- 11月 成人
- 12月 独り暮らし開始
こうして見ると一年前に書いた2021年の目標は3/4は達成したことになります。
最後の都内のラーメン二郎制覇は無念ながら達成できませんでした。
原因としては、実家の近所にある二郎系ラーメンに通いつめたことです。
ここの豚マシラーメンは絶品です。トッピングのオーダーが食券に丸をつけるスタイルなので、二郎特有の意味不明なコールをする必要がないのもおすすめポイントです。
経堂の近くに訪れた際には是非足を運んでみてください。
エンジニアとして
楽しく働いています。
フロント、サーバーサイドどちらも浅く広く触りました。
やったタスクをざっとまとめると以下のような感じです。
少なくともマイナスの戦力ではなく、プラスの戦力になっているかな、、と思います。
僕の考える、Railsエンジニアとして就職できる最低レベルは、 「少しでもプラスの戦力として計算できる」 というものです。 「Issueを一人でこなせる」 といっても良いかもしれません。
Railsエンジニアとして就職できるレベルとは - komagataのブログ
2022年の目標
上にも書いた通り一年目はすぐに着手できるような具体的なタスクを進めました。
来年は「この機能は自分が作った!」いえるような大きめなタスクを完遂させたいです。
技術力向上の面でいうと足踏みした一年だったと反省しています。
Githubの草を見ると分かるのですが、土日は勉強しない日が多かったので、今年はもっと貪欲に学んでいきたいです。
とりあえず1月は土日も草を生やします。
以下の分野に興味があるので、たくさん本を読んで手を動かして学んでいきます!
- Rails
- サーバーサイド非同期
- DB回り(設計、チューニング)
実務とプライベートの勉強のサイクルをいい感じに回していきたいです。
気負わずにマイペースにやっていきます〜
チェリー本 改訂2版 を読みました🍒
プロを目指す人のためのRuby入門[改訂2版] 言語仕様からテスト駆動開発・デバッグ技法まで のプレゼント企画に当選しました。ありがとうございます! 本の到着から時間が経ってしまいましたが、読んだ感想をポエミーに書いていきます。
印象に残った内容
正規表現
実務で正規表現を使ったコードをあまり書いていないので苦手意識がありましたが、本の内容に沿って考えるとそこまで難しくないことが分かりました。 正規表現を使うステップは大きく分けて以下の2つに分類できると考えています。
- 文字列の規則性を見つける
- 規則を正規表現に変換する
この両方を同時にこなすのではなく、段階を追って考えて行けば適切な正規表現を書けることに気付いたので積極的に使っていきたいです。
パターンマッチ
パターンマッチを使ったコードを実務で見かけどのようなルールで動いているのか非常に興味がありました。
データの構造に合わせて処理を分岐させることでより直感的なコードを書けることが分かりました。
データの実態ではなくあくまで構造にフォーカスを当てたパターンマッチのロジックは、型を厳密に定義する機能と相性が良さそうな印象を持ちました。
将来挙動が変わる可能性のある書き方もあるので、どこまで使うかチームで認識を合わせられると良さそうです!
クラス
第1版を読んでいたとき、「あるクラスのメソッドの中で別のクラスのメソッドを呼び、データをやりとりし、ひとつのプログラムとして動かせるんだ!」と感銘を受けたことを思い出しました。
本の中で一番重いと思われる内容ですが、例題を解くための最低限の知識 -> 例題 -> 深堀 の順で構成されているので、初学者の方でも読み進められるようになっています。
例外処理
例外処理との向き合い方が簡潔にまとまっており、個人的に一番好きな章です。 なんでも例外処理に渡すのではなく、そもそも例外を発生させることを未然に防ぐことはできないか?Rails, Rubyの機能で補足できないか?を検討してから使うようにしたいです。 以下の記事、動画でさらに例外処理への理解を深めたいと思います。
本の全体の感想
挫折を防ぐポイントが各章で散りばめられており、絶対に初学者を挫折させない強い意志を感じました。
- サンプルコードの解説、コメントが丁寧
- 言語の慣習と規約を明確に分けて解説している
- 書面の都合で載せられない内容は、伊藤さんのQiita, Zennの記事で解説されている
初学者ではない方でも、Ruby3.0で追加された機能の把握、既存のメソッドの復習、例題を本のコードを写経せずに自分で解くことで更に理解を深めることができます。
初学者の方、第一版を読んだ方、お仕事でRubyを使っている方全員におすすめできる内容となっています! チェリー本を片手にプロになるため精進します。伊藤さん、ありがとうございました!