りゅうじのRails学習のアウトプットblog

初学者による初学者の為の記事です。

転職の思考法

今回は技術のアウトプットではなく、転職に関する書籍を読んだものをアウトプットします。

自分のマーケットバリューを知る

  1. 技術資産 例:どんな会社からも必要とされる高い技術力を持った人 ひとことで言うと、専門性
  2. 人的資産 例:どんな人とも仲良くなり、可愛がられる力を持った人 ひとことで言うと、人脈
  3. 業界の生産性 例:特に才能がなくても高い給与を貰い続けられる人 ひとことで言うと、一人当たりの粗利

伸びている業界で働いた経験には価値がある(マーケットバリューを高められる)

これは簡単に言うと一度ブームが来て爆発的に伸びた業界での経験が、そのブームの後追いの会社が経験者を求めるためです。

また、衰退していっている業界で働くことは、熱量を持って仕事をしていたとしても、マーケットバリューを高めることはできません。

衰退業界であるかの見極めの仕方

同業他社の動向を見ると良いです。自社だけでなく、競合を含めた全体が利益を落としているのは、マーケットが縮小している証だからです。

どの業界に身をおくか?がマーケットバリューを高めるという視点においては最重要だと言えそうです。

やりたいことはなくてもいい

まず、人には2種類のタイプがあります。

①to do型 何をするかに重きをおくタイプ 世の中に変革を起こす、会社を大きくするなどと、仕事の楽しみを語ります。

②being型 どんな人でありたいか、どんな状態でありたいかに重きをおくタイプ 尊敬できる人の元で働く、プライベートも充実させる、周囲に喜んでもらうなどを語ります。

①は何をするかにこだわり、明確な夢や目標をもち、やりたいことを見つけて突進していきます。例として、心からやりたいことを見つけろとか、無理だと思ってもチャレンジしろというような成功哲学を唱える人の多くがこのタイプです。

②の人は①を目指す必要は全くありません。

②の人が意識するべきは以下の二つです。

条件1・マーケットバリューを高めること

条件2・自分を信頼すること

条件1は前述した通りです。

条件2は②の人は仕事していく中で自分に嘘をついてしまいがちです。内心では価値がないと思っているものを売ったり、賛同できない周囲の意見に流されたり、これら全て、自分に対する嘘です。

嘘をゼロにすることは無理かもしれませんが、小さくしていくことは可能なので、ここを意識すると自分への信頼が高められます。

大事なのは転職よりも転職できるというカード

何がなんでも転職すべきだというわけではなく、選択肢を持つことが重要だと本書では説いています。

自分の棚卸しをしよう

やり方①

目的は自分自身を発見することです。

  • 自分はどんなことをしてきたのか?
  • 自分は何ができるのか?
  • 自分は何が得意で、何を好むのか?

やり方②再現性を見つける

ポイント

  • 客観的な事実(=数字)で語られているか
  • それがうまくいった理由が、その人のどういう頑張りなのか

転職するための5つのチャネル

チャネル

  1. ヘッドハンティングを受ける
  2. 転職エージェントに登録し紹介を受ける
  3. ダイレクトリクルーティング型のサービスを使う
  4. SNSなどのマッチングサービスを使う
  5. 直接応募、または友人から紹介してもらう

転職エージェントのビジネスモデルを知る

端的に言うと、エージェントさんも仕事で自分の成果報酬を得る目的があるので、その立場で利益を取りに行くのは当然のことなので、そこを理解しつつ付き合い方を考える事が大切だと説いています。

良いエージェント、ダメなエージェントを見分ける方法

前述の理由から決断を急かすようなことをエージェントが言う事もあるでしょう。

このとき一度立ち止まり、良いエージェントか自身の成果のみばかりを見ているダメなエージェントかを見分ける五箇条があります。

  1. 面接時、どこがよかったかだけでなく、入社する上での『懸念点』は何処かまでフィードバックしてくれる。こちらから『自分の懸念点はどこですか?』と問うこと。(エージェントに企業側の評価を聞いてもらい、人を大事にしている会社なら誰にでも当てはまる褒め言葉ではなく、納得できる答えを返してもらえるでしょう。懸念点を尋ねると、企業とエージェントの本音が透けて見えてきます。)
  2. 案件ベースでの『いい、悪い』ではなく、自分のキャリアにとってどういう価値があるかという視点でアドバイスをくれる
  3. 企業に、回答期限の延長や年収の交渉をしてくれる
  4. 『他にいい求人案件は、ないですか?』という質問に粘り強く付き合ってくれる(こちらのキャリアを考えていくれているのか売り物と考えているのかを見極めるためです。いい案件と悪い案件というのがエージェントにとっての利益が見込めるか否かであっては困るからです。)
  5. 社長や役員、人事責任者との面接を自由にセットできる(そのエージェントが企業の内部に精通し、人事や役員に信頼されて採用活動を支援しているかがわかります。)

会社選びの3つの基準

①マーケットバリュー(市場価値)

その会社で働くことによって、自分のマーケットバリューが高められるかを再確認します。他社でも通用する知識と経験を得られるか、さらには、その業界が今後も伸びていくか(業界の生産性)をしっかり見通します。

②働きやすさ

これはその人によって変わります。厳しくてもとことん成果を出すことに拘りたいのか、チームで協力して日々の業務を進めたいという人もいるわけで、自己を知り、会社での仕事の進め方や雰囲気が自分の求めているものであるかを見極めます。

③活躍の可能性

判断材料として、面接で人事担当者に次の質問をしてみると、その会社の実情が見えてきます。

  1. どんな人物を求めていて、どんな活躍を期待しているのか?
  2. 今一番社内で活躍し、評価されている人はどんな人物か?なぜ活躍しているのか?
  3. 自分と同じように中途で入った人物で、今活躍している人はどんな部署を経て、どんな業務を担当しているのか?

この質問の答えを聞いて、自分が活躍できるイメージを持てたなら、実際に活躍できる可能性は高いです。

逆に、中途入社で活躍している人物の名前がパッと出てこなかったり、重要な仕事が新卒社員に独占されている様子が伺えたら、思うように活躍できない可能性もあります。

20代、30代の現段階でマーケットバリューが低い人は、この『活躍の可能性』を重視する事をおすすめしています。

迷ったときは、未来のマーケットバリューをとる

会社選びで次の二つで迷った場合

  1. 給料が高く成熟している会社
  2. 今の給料は低いけれど、この先の自分のマーケットバリューを高められる会社

この場合、一時的に給料が下がったとしても、未来のマーケットバリューを最優先に考えた方がいいです。

それは、マーケットバリューと給料は時間差で一致するものだからです。

もし会社から引き止めにあったら

いくつかのケースが書かれていましたが、個人で判断すれば良いかと思います。

退職するときに気をつけたい3つの事

3つのNG行為

  1. 最後に会社の不満をぶちまける
  2. 退職理由は、言っても言わなくてもよい
  3. 引き継ぎ、その後の人間関係にも配慮する

転職で活躍できる人、できない人の違い

前職の知識や文化を忘れる事です。

新たな業界の文化を溶け込める人が活躍できます。

最後に

感覚で物事を選んできた自分にとっては学べるところが多かった書籍でした。

勧めて頂いた事がきっかけで読んだので、紹介してくれた方に感謝しています。

 

2021年9月23日パーフェクト Ruby on Rails

複数のデータベースを扱う

Webアプリケーションの規模が大きくなるとしばしば応答速度の低下が問題になる事があり、ボトルネックになりやすいのはDBアクセスに関する部分という事がよくあります。
そういった問題を解決し、複数のDBを利用するgemパッケージとしてOctopusswitch_pointなどがありましたが、Rails6.0からはRails標準機能として複数DBに対応しました。

複数DB対応で提供している機能

  • 複数のprimaryデータベースと、それぞれに対応する1つのreplica
  • モデルでのコネクション自動切り替え
  • HTTP verbや直近の書き込みに応じたprimaryとreplicaの自動スワップ
  • マルチブルデータベースの作成、削除、マイグレーション、やり取りを行うRailsタスク

これらの機能がユースケースと合致しない場合はOctopusswitch_pointの使用を検討すると良いです。

2つのDBへ接続するには

config/database.ymlを記述する

default: $default
  adapter: sqlite3
  pool: <%= ENV.fetch("RAILS_MAX_THREADS"){5} %>
  timeout: 5000
development:
  primary:
    <<: *default
    database: db/development.sqlite3
  sub:
    <<: *default
    database: db/development_sub.sqlite3
    migrations_paths: db/sub_migrate
test:
  略
production:
  略

database.yml内のdevelopmentといった環境変数の下の階層として、各種DBの名称(どういう用途のDBかわかりやすい名称にする)を記述し、その中に接続情報を記述します。

そして、片方のDBにだけマイグレーションパスを指定します。これで異なるテーブルの定義を反映させられます。

この段階でdb:createを実行するとそれぞれのデータベースを作成可能です。

またdb:create:subとすると、subの方だけのデータベースを作成する事もできます。
この時点ではモデルを操作しても片方のDBしか参照できないので、特定のモデルと特定のDBを接続させたい場合は各モデルクラスでestablish_connectionを利用します。(establishは設立するという意味です)
役割を明確にするためにestablish_connectionを指定productionちあ抽象クラスを作成し、そのクラスを継承したモデルクラスを利用すると良いです。

# app/models/sub_base.rb
class SubBase < ApplicationRecord
  self.abstract_class = true
  establish_connection :sub
end

# app/models/author.rb
class Author < SubBase
end

これでAuthorモデルを通じてレコードを作成した場合、subデータベースへ書き込みを行うようになりました。

self.abstract_class = trueが何かわからなかったので調べました。

ActiveRecord::Base を継承したクラスをモデルとして作成すると、Rails はそのクラス名に対応したデータベースのテーブルを自動的に探そうとします。対応するデータベースのテーブルを用意しない場合は、self.abstract_class = true を書く必要があります。ActiveRecord::Base を継承したクラスを作成し、さらにそのクラスを継承させたい場合に self.abstract_class = true が書かれるようです。

今回の場合Author.createでデータを入れようとした場合に通常ではエラーが起きてしまうため、self.abstract_class = trueを記述する必要があります。

ひとこと

複数のデータベースを作成することはしたことがないのですが、いずれ使うときのためにひとつひとつ踏みしめて学んでいきます。

参照

[Rails] self.abstract_class = true の意味と挙動

2021年9月22日 図解入門 TCP/IP

IoT

Internet of Things の略 で、身の回りにある色々なモノ(Things)がインターネットにつながる仕組みのことです。 - CoAP トランスポート層UDPを使用したクライアントサーバー型プロトコルです。 - MQTT TCP上で動作するブローカー型プロトコルです。

IaaS

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

chapter 2 物理層

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

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

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

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

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

有線LAN(IEEE802.3)

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

ひとこと

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

参照

本書のみ

2021年9月22日パーフェクト Ruby on Rails

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" 
=> 3 # 3回seedしたので3件ある
  • 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速習実践ガイド

2021年9月21日 パーフェクト Ruby on Rails 第3章押さえておきたいRailsの基本機能

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するとrails 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:dumpも実行されているから、schema.rbの内容が書き変わるというところが、点と点が線になった感覚がありました。

参照

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

2021年9月18日 図解入門 TCP/IP

SDN

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

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

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

オーバーレイ型

VXLAN

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

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

  • ホップバイホップ型

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

CDN

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

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

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

ひとこと

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

🧝‍♀️🧚‍♂️🤴 ⚔️ 🐉 🏰 🦭

参照

CDN

2021年9月18日 パーフェクト Ruby on Rails 第3章押さえておきたいRailsの基本機能

DBを管理する

railsコマンドで利用できる主なコマンド

コマンド 概要
rails db:create データベースを作成する(SQLite3の場合は不要)
rails db:drop データベースを削除(SQLite3の場合は「.sqlite3」ファイル自体を削除)
rails db:migrate マイグレーションの内容をDBに反映させる
rails db:migrate:status 現在のマイグレーション状態を表示する
rails db:prepare DBが存在すればマイグレーションを、存在しなければデータベースのセットアップを実行する
rails db:reset データベースをdropし、db:setupを実行する
rails db:rollback 実行したマイグレーションを取り消す
rails db:schema:dump DBの構成をdb/schema.rbへ出力する
rails db:schema:load db/schema.rbの内容をDBへ反映する
rails db:seed db/seeds.rbの内容を実行する
rails db:seed:replant DBの内容をTRUNCATE(切り捨て)し、db:seedを実行する
rails db:setup データベースを作成し、スキーマの読み込みとシードデータの読み込みを行う
rails db:version 現在適用しているマイグレーションのバージョンを表示する

データベースについての曖昧だった知識を記述していきます

- リレーショナルデータベースについて

リレーショナルデーベースは表です。 数学の演算に基づいてデータを取り扱う事ができます。
一件のデータをレコード、各項目をフィールドと呼びます。

- 外部キーとは

他の表の列を参照しているキーを外部キーと呼びます。

作成されたmigrationファイルに変更を加えたものをDBに反映させたい時はrails db:migrateする

一度、migrateしたものを取り消したい場合はrails db:rollbackを使います (何があったかを残しておくためにロールバックは現場ではあまり使わないと聞きました)

ひとこと

進捗より、そもそもの部分がわかっておらず、根本的なところの復習と議論が中心でした。今日でデータベースに対する理解が深まりました。🤦‍♀️

参照 

rails db:reset rails db:magrate reset