ベリー本🫐記録 - 01

環境構築


  • まずターミナルでnodeのバージョンを確認
$ node -v
// => 14.5.15
  • nvmというバージョン管理ツールを使用するので以下のgit hubからコマンドを実行

GitHub - nvm-sh/nvm: Node Version Manager - POSIX-compliant bash script to manage multiple active node.js versions

$ curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash

終わると「ターミナルを再起動するンゴ」と出てたのでターミナルを再起動する

そしたらnvm install v16.8.0を入力

$ nvm install v16.8.0  // ← このコマンド
Downloading and installing node v16.8.0...
Downloading https://nodejs.org/dist/v16.8.0/node-v16.8.0-darwin-x64.tar.xz...
################################################################################################ 100.0%
Computing checksum with shasum -a 256
Checksums matched!
Now using node v16.8.0 (npm v7.21.0)
Creating default alias: default -> v16.8.0

$ node -v  // バージョンを確認…                                                                
v16.8.0
// 16.8.0が入りました!やったね!

$ npm init --yes コマンドを打つことでpackage.jsonファイルが生成されるので以下の場所に追記

// package.json
"main": "index.js",
"type": "module", // <-この行を追加
  • $ npm install --save-dev typescript @types/node

※上のコマンドで最新版がインストールされる(今回はこのままでいく)が、 本の中ではきちんとバージョン指定しているので今後エラーが出たらその時は本に書いているよ うにバージョン指定してインストールし直します。


※もしgithubを使うときはこの辺りでリポジトリ作成しておくと良いかもしれない。

github使った場合のために.gitignoreを作成する

  • $ touch .gitignoreでファイルを作成し.gitignore/node_modulesを追記し、gitに上げないようにする

もし、git cloneしたらnode_moduleがない状態になるので

$ npm install

でnode_moduleが再度生成される。


tsconfig.json

$ npx tsc --init

コマンドでtsconfig.jsonファイルが生成されるので更に中身を書き換える

// tsconfig.json

// 以下を書き換える
"target": "es2016",
                            ↓
"target": "es2020",

-----

"module": "commonjs",
                            ↓
"module": "esnext",

------

// "moduleResolution": "node",// コメントアウト外す
"moduleResolution": "node",

------

// "outDir": "./",// コメントアウト外す
"outDir": "./",

------

{
  "compilerOptions": {
   // ...たくさんのコンパイラオプション...
}, // ← , を入れる
  "include": ["./src/**/*.ts"] // ←追記
}

TSファイルをコンパイルする


任意で作成した.tsファイルを.jsコンパイルするには以下のコマンドを入力します

$ npx tsc

そうするとdistディレクトリが作成され、コンパイルされるファイル名が.tsから.jsに書き換えられてdistディレクトリに入っています

--dist
   ∟〇〇.js // ←が出力される
--src
      ∟〇〇.ts
  • tsの型が違う場合エラーを吐きますのでコンパイルされません。

      $ npx tsc           
      src/index.ts:1:7 - error TS2322: Type 'string' is not assignable to type 'number'.
    
      1 const message: number = "Hello, world!";
              ~~~~~~~
    
      Found 1 error in src/index.ts:1
    

出力された.jsファイルを実行するときは

$ node dist/〇〇.js

と打てば実行されます。

// 例)
$ node dist/index.js
Hello, world!

Railsのdependentオプション

モデルで関連づけの記述をするときに使うdependentオプション。
中でもよく使うのはdestroyだと思う。
destroyもあるがdeleteもあるのでその違いをば。

・deleteとdestroyのちがいは?

とりあえず公式↓
dependentについて:Rails ガイド

delete・・・最小限。SQLを直接打ってるようなもの、指定のデータ1つのみを削除 destroy・・・Activerecordを介して削除する、関連付けられたモデルも削除


dependentオプションの種類:

:destroy:delete:destroy_async:nullify

ex.
親モデル parent has_many :children 子モデル child belongs_to :parent 親オブジェクト(id: 1, name:父さん) 子オブジェクト(id: 1, name:息子, parent_id: 1) があったとする

☆親モデル parent has_many :children, dependent: :delete_allにしたとき、
親モデルdestroyすると子オブジェクトにはなんら影響しない
(id: 1, name:息子, parent_id: 1 のまま)
※nullifyは↑でいうと子オブジェクトのparent_id: NULLになるイメージだが、NOTNULL制約が付いているとdestroyしようとするとNotNullViolationでROLLBACKする。そんなときは子モデルの方で belongs_to :parent, optional: trueとすることで外部キーにnullが入ることが許容されるようになる
https://qiita.com/takuyanin/items/6f6be86d1265be21bf9e
dependentオプションどれを使うかははケースバイケース(先輩談)

パソコンが熱くてファンが止まらない[Ruby]

PCのescキー上辺りが熱を持ってファンが回りCPUが100%近くなる問題があったので解消方法の1つとして書きます

作業ディレクトリに移動して、
コマンドで$ bin/spring statusで状態を確認 Spring is running:

となっていれば

$ bin/spring stopを入力 Spring stopped.

となっているのを確認

一応もう一回

$ bin/spring statusを打って Spring is not running.

となっていればよし。

アクティビティモニタでCPUを確認するとプロセス名の上位に来てたrubyが消える。 ファンファンも静かになる。熱はちょっとある。

springが原因っぽかったのでgemを確認すると良いかも。

【図解入門 TCP/IP】を読む - その11

IoT

Internet of Things の略 で、身の回りにある色々なモノ(Things)がインターネットにつながる仕組みのことです。

IaaS

Infrastructure as a Service の略で、サーバーやネットワークなどのインフラを、インターネット上で構築するクラウドサービスのひとつです。

chapter 2 物理層

有線LANの場合は会社や学校で見かけるLANケーブルを物理層と考え、無線LANの場合は、駅やカフェで飛び交っているWi-Fiの電波を物理層と考えます。

Wi-Fiの電波も物理層と考える点が驚きましたが

送信端末と受信端末を繋いでいるのは物理層だけなので、繋いでいるのがケーブルであろうが電波であろうが、どちらも物理層のものだと言えるわけです。

  • コンピュータは全てのデータを0か1で表現します。
  • この二つの数字のことをビットといい、ビットが連続したデータをビット列といいます。

物理層データリンク層から受け取ったビット列をケーブルや電波に流せるアナログに変換するためのルールを定義しています。

有線LAN(IEEE802.3)

イーサネットに関する技術を標準化しています。今、家庭やオフィスなどで、有線LANがのネットワーク環境であれば、ほぼ間違いなくイーサネットが使用されていると考えて良いでしょう。「有線LANといえば、イーサネットだよね」とするほどに標準化を推進しています。

ひとこと

現段階で一つ一つと向き合うよりも流れを把握することを優先するべきだと感じだしたので、明日から読み進め方を変えていきます。

参照

本書のみ

【パーフェクト Ruby on Rails】を読む - その17

3-3-4 あらかじめ用意したデータを読み込む(seed.rb)

seedデータを投入の際は、!付きメソッドを利用し、エラー発生にすぐに気づけるようにすると良いです。

Blog.create!(name: 'cool blog')

batch処理とは

バッチ処理とはコンピュータでひとまとまりのデータを一括して処理する方式です。水をバケツですくうイメージをしてもらって、指定する量によってコップなのかバケツなのか容量の大きさが決まってくるといったイメージです。


・seedに書いたデータを反映させる

bin/rails db:seedコマンドでseed.ebファイルを読み込んで、中に記載されているあらかじめ記入しておいたものを初期データとしてDBに登録できます。
※ 重複は無視されるのでコマンドを入力した回数だけDBにはデータが増えていきます。

% bin/rails db:seed
% bin/rails db:seed
% bin/rails db:seed
% bin/rails runner "p Hoge.count" # p ってなんだっけ🤔?
=> 3 # 3回seedしたので3件ある
# 本書にはrunnerで書いてますがrails cでも確認できるのでrunner使う意味があまりわからないです
  • db:seed:replantを実行すると一度レコードを削除して、改めてdb:seedを実行します。
% bin/rails db:seed:replant
% bin/rails runner 'p Blog.count'
=> 1

rubyのpメソッドとputsメソッドの違いについて復習しました

どちらも画面に表示するメソッドですが、どのように使い分ければ良いのかというと、pは原則、デバッグの道具として使用します。putsはプログラムの機能として意図して表示するときに使用します。


rails db:setupの挙動について

db:dropでデータベースを削除して、db:setupを実行すると、
db:create, db:schema:load, db:seedを一括で行ってくれます。

db:resetの挙動について

db:drop, db:setupまでを一気に実行します。

db:migrate:resetの挙動について

db:drop→db:create→db:migrateの順で実行されます。

db:resetとdb:migrate:resetの挙動の違いまとめ

コマンド db:reset db:migrate:reset
db:drop
db:create
db:migrate x
db:schema:load x
db:seed x

一度消して、再作成した空のデータベースに対してデータを取り込むアプローチが違います。
db:resetはschemaからで、db:migrate:resetは migrationファイルから取り込みます。
db:resetではseedまで行いますが、db:migrate:resetではseedは行いません。

参照

Rails: db:reset よりも db:migrate:reset を使うべき理由 (とその違い)
現場で使える Ruby on Rails 5速習実践ガイド

【パーフェクト Ruby on Rails】を読む - その16

3-3-2 テーブルの定義を反映させる

マイグレーションファイル内ではデフォルトではchangeメソッドが使用されています。 bin/rails db:migrateを実行したら、upになり、bin/rails db:rollbackを行うとdownになります。
remove_columnはupになる事でテーブルが削除されるもので、普段通りにコードを書くと、rollbackで削除されたものを復元できませんが、Railsガイドにこのような記述がありました。

remove_columnは、3番目の引数でカラムの型を指定すればロールバック可能になります。元々のカラムオプションも指定しておかないと、ロールバック時にRailsがカラムを再作成できなくなります。

remove_column :posts, :slug, :string, null: false, default: ''  

この例でいうと、:stringが該当します。カラムの型は文字列だと指定することで、rollbackによる復元が可能になります。

bin/rails db:rollbackの挙動についてあやふやだったので調べました

% rails db:rollback コマンドを使うと、% rails db:migrateしてup状態の1個前のマイグレーションファイルをdownにしてくれます。2個前ならSTEP=2というオプションを付与します。

upメソッドとdownメソッドについて

正直、changeメソッド以外のupメソッドの時とdownメソッドの時でマイグレーションの中の挙動を変えるのを書く場合に遭遇した事がないので、使う時にはまた読み返したいと思いました。

データベース周りの全体像がイメージできていなかったので調べました

画像引用
とてもわかりやすい図をありがとうございます。

  • DBをCREATEした時にデータベースに情報を入れるには、1回目の作成時にはschemaファイルはないのでマイグレーションファイルから取り込む必要があります。
  • 作成したマイグレーションファイルをrails db:migrateするとdb:schema:dumpも実行されschema.rbが出来上がります。
  • rails db:schema:loadを使うとき
    • 例えば、一度 何かしらで DBが空で、schema.rbが残っている状態でrails db:createをして空のDBを作成後、データを入れるときにマイグレーションファイルから読み込むときよりも、 rails db:schema:loadスキーマファイルを読み込む方が、高速かつエラーが起きにくい傾向があります。Railsガイド

個人的に興味深かったところ

rails db:migrateとrails db:rollbackを行うと同時にrails db:schemaも実行されているから、schema.rbの内容が書き変わるというところが、点と点が線になった感覚がありました。
(´・ω・`) (´-ω-`)

参照

bin/rails db:rollbackの挙動
schema.rbとmigrationファイルの関係をまとめてみたよ

【図解入門 TCP/IP】を読む - その10

新しいネットワークのカタチ

SDN

SDNは"Software Defined Network"の略で、ソフトウェアによって管理・制御される仮想的なネットワーク、あるいはそれを構成するための技術のことです。

コントロールプレーン - ネットワーク全体を制御 ・データプレーン - パケットを転送する の2種類に分けられます。

コントロールプレーンにあるSDNコントローラー(ソフトウェア)は、データプレーンにある物理的なネットワーク(ハードウェア)に設定を送り込み、仮想的なネットワークを作ります。

オーバーレイ型

VXLAN

パケットを入れるカプセル💊であり、ヘッダーをつけて行き先🏠を明示することで、両者をつなぐトンネルができる。VXLANはプロトコルです。🏩

ブォン🤽 = 💊 = 🏠 <届いた!

  • ホップバイホップ型

スイッチ一つ一つに対して、経路の情報の(フロートリ)を配布し、その情報を元にパケットを転送する方式です。
現在は(ほぼ)使われておりません。使い物になりません。

CDN

CDNは"Content Delivery Network"の略で、画像や動画、HTMLやCSSなど、Webコンテンツで使用される、いろいろなファイルを大量配信するために最適化されたインターネット上のサーバーネットワークのことです。

  • オリジンサーバー(お頭)
    オリジナルのwebコンテンツを持っている
  • エッジサーバー(子分)
    オリジンサーバーのキャッシュ(一度アクセスしたサイトのデータを一時的に保存した)を持つユーザーから近い場所にあるサーバー

    ↓アプリを作ったことがある人ならイメージがつくかも↓
    CDN

ひとこと

今までの勉強はFF7で言えば、背景のストーリーもわからないまま、目の前の敵をひたすら倒し、気づいたら理由もわからないままセフィロスを倒していたという感じでしたが
今やっとストーリーを理解し、どうしてセフィロスを倒さなくてはいけないのかわかり、勉強が楽しくなってきた…。というのが現時点での感覚です。
🧝‍♀️🧚‍♂️🤴 ⚔️ 🐉 🏰 🦭

参照

CDN