ベリー本🫐記録 - 01
環境構築
- まずターミナルでnodeのバージョンを確認
$ node -v // => 14.5.15
- nvmというバージョン管理ツールを使用するので以下のgit hubからコマンドを実行
$ 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
:destroy
関連したやつ全部消える 無理心中。まじメンヘラ:delete
(has_manyだと:delete_all?) SQL操作のみてきな挙動。関連したやつ消えない。指定したやつのみが消える。みなしご。親の名前はのこる。:destroy_async
非同期で削除する →{何か色々手順あるっぽいけど、めちゃくちゃ削除処理が重い時はこれ使うのを検討すれば良いとかじゃないかな(先輩談)}- :nullify 指定されたモデルは消え、関連しているモデルの外部キーにNULLがはいる(NOTNULL制約ついてるとROLLBACKする)。みなしご。親の記憶は抹消される。
参考:
https://dorarep.page/articles/rails-dependent https://railsguides.jp/association_basics.html#has-one%E3%81%AE%E3%82%AA%E3%83%97%E3%82%B7%E3%83%A7%E3%83%B3-dependent
https://qiita.com/takayuu276/items/b86ac6b620d2b15c0164
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の電波を物理層と考えます。
送信端末と受信端末を繋いでいるのは物理層だけなので、繋いでいるのがケーブルであろうが電波であろうが、どちらも物理層のものだと言えるわけです。
- コンピュータは全てのデータを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
を使うとき
個人的に興味深かったところ
rails db:migrateとrails db:rollbackを行うと同時にrails db:schemaも実行されているから、schema.rbの内容が書き変わるというところが、点と点が線になった感覚がありました。
(´・ω・`)
(´-ω-`)
参照
【図解入門 TCP/IP】を読む - その10
新しいネットワークのカタチ
SDN
SDNは"Software Defined Network"の略で、ソフトウェアによって管理・制御される仮想的なネットワーク、あるいはそれを構成するための技術のことです。
・コントロールプレーン - ネットワーク全体を制御 ・データプレーン - パケットを転送する の2種類に分けられます。
コントロールプレーンにあるSDNコントローラー(ソフトウェア)は、データプレーンにある物理的なネットワーク(ハードウェア)に設定を送り込み、仮想的なネットワークを作ります。
オーバーレイ型
VXLAN
パケットを入れるカプセル💊であり、ヘッダーをつけて行き先🏠を明示することで、両者をつなぐトンネルができる。VXLANはプロトコルです。🏩
ブォン🤽 = 💊 = 🏠 <届いた!
- ホップバイホップ型
スイッチ一つ一つに対して、経路の情報の(フロートリ)を配布し、その情報を元にパケットを転送する方式です。
現在は(ほぼ)使われておりません。使い物になりません。
CDN
CDNは"Content Delivery Network"の略で、画像や動画、HTMLやCSSなど、Webコンテンツで使用される、いろいろなファイルを大量配信するために最適化されたインターネット上のサーバーネットワークのことです。
- オリジンサーバー(お頭)
オリジナルのwebコンテンツを持っている - エッジサーバー(子分)
オリジンサーバーのキャッシュ(一度アクセスしたサイトのデータを一時的に保存した)を持つユーザーから近い場所にあるサーバー↓アプリを作ったことがある人ならイメージがつくかも↓
CDN
ひとこと
今までの勉強はFF7で言えば、背景のストーリーもわからないまま、目の前の敵をひたすら倒し、気づいたら理由もわからないままセフィロスを倒していたという感じでしたが
今やっとストーリーを理解し、どうしてセフィロスを倒さなくてはいけないのかわかり、勉強が楽しくなってきた…。というのが現時点での感覚です。
🧝♀️🧚♂️🤴 ⚔️ 🐉 🏰 🦭