Open4

具体的にどう本物のエンジニアになるかというお話 について

次のURLより

https://qiita.com/mackeee-orange/items/afbed5ec3816d4af2e58

インターネット

クライアントサーバー方式

クライアントサーバーシステムは、サービスを要求するクライアントと、要求されたサービスを提供するサーバで構成される分散型システム。
クライアントサーバシステムでは、1つのサーバに複数の機能を持たせることも、また1つの機能を複数のサーバに分散して専用化することもできる。
また、サーバは必要に応じて処理の一部をさらに別のサーバに要求するためのクライアント機能を持つこともできる。

3層クライアントサーバシステム

3層クライアントサーバシステムはプレセンテーション層、ファンクション層、データベース層の3層構造からなる。
このシステムではそれまでクライアントが行っていた「データの加工」をサーバに行わせ、クライアントでは「入力や表示」のみを担当させる仕組みとなっている。
海藻間の依存度が少ないので、階層ごとに並行して開発しやすいという特徴を持ち、アプリケーションの修正が頻繁なシステムに適している。

ドメインとIPアドレス

IPアドレスは、マシンの所在地を特定する住所のようなもの
例)182.48.49.53

ドメインは分かりやすい名称のようなもの
例)www.yoheim.net

DNSサーバは、ドメイン名やホスト名などとIPアドレスの対応づけを行う

TCP/IP

ネットワーク上でコンピュータ同士が通信するときの使用する手順や約束事をプロトコルという
OSI基本参照モデルにおいて、ネットワークアーキテクチャが標準化されているが、実際にはTCP/IPがRFCで規定され、デファクトスタンダードとなっている。

TCP/IP 4階層モデル
TCP/IP 役割 主なプロトコル
アプリケーション層 アプリケーション間のやり取り HTTP,FTP,TELNET,SMTP,POP
トランスポート層 プログラム間の通信、通信の制御 TCP,UDP
インターネット層 インターネットワークでの通信 IP
ネットワークインターフェイス層 同一ネットワーク上での通信、ハードウェア仕様など イーサネット,PPP,PPPoE

プロトコル

ブラウザにURLが入力され、サーバーに到達するまで

アプリケーション層
  • HTTPリクエストメッセージを作成する
    HTTPはクライアントとサーバーで1往復が1つの通信。
  • DNSサーバーへ問い合わせ、送信先のIPアドレスを入手する
    URL欄に入力されたドメイン名を、送信先のIPアドレスに変換
  • 下位レイヤーへ送信依頼をする
    HTTPリクエストメッセージ(=送信内容)と IPアドレス(=送信先)を 下位レイヤーに渡して送信を依頼します。
トランスポート層
  • サーバーに接続する
  • サーバーにデータを送信する
  • サーバーとの接続を切る
    トランスポート層には、TCPとUDPの2つのプロトコルが存在する
    TCPはコネクションを利用してデータを確実に届ける。
    ブラウザやメールなど通常アプリケーションが使う。

UDPはコネクションを使わずとりあえず送信する。届く/受信できるかはわからない
DNS問い合わせなど短いデータの送受信に使う

TCPでは、3wayハンドシェイクを用いて接続を確立する
送信可能なデータ量に分割して、データを送る
受信が終わったら、FINを送信して接続を切断する

TCPでは、TCPヘッダーをデータに付与して送る

IPアドレスによって通信相手のホストは特定できる。しかし、1台のホスト上で複数のアプリケーションが動作している場合が考えられる。アプリケーションを識別する番号にはポート番号が用いられる。

送信データ(TCPヘッダとアプリデータ)をIPに渡して送信してもらう。

サブネット

ネットワークの中を、グルーピングしたものがサブネット
サブネット間は、ルーターで接続
IPアドレスのうち、ネットワーク部を表すのがサブネットマスク

IPアドレスとサブネットマスク

IPアドレスは、ネットワーク部とホスト部に分けることができる
何番目までがネットワーク番号かをサブネットマスクで表現する
サブネットは、IPアドレスとサブネットマスクで表現される。

インターネット層

IPでは送信先のMACアドレスを調べて、ネットワークIF層に転送を依頼する

  • IPヘッダの作成
    IPでもTCPと同じように、ヘッダ(=制御情報)を付与する
  • 転送先MACアドレス(ネットワーク上で一意に機器を特定するための番号。LANボードやLANカードなどのNICにあらかじめ割り当てられている)を入手
  • ネットワークIF層に転送を依頼

HTTPについて

HTTPメソッドで使われるのは次の5つ

メソッド 使い方 Path Parameters Query Parameters Request Body
GET データの取得 ×
POST データの追加
PUT データの更新
PATCH データの更新
DELETE データの削除 ×

Path Parameters :http://philosophynote.net/users/1 の 1
Query Parameters:http://philosophynote.net/users?name=taro の name=taro
Request Body :送信するデータ

HTTPレスポンス
ステータスコードの大枠は次のURL記載の通り

https://developer.mozilla.org/ja/docs/Web/HTTP/Status

OSとコンピューターサイエンス

コンピューターの起動の流れ

https://zenn.dev/okuma/articles/83d5ee9d0baa63002136

このくらいでいいか

基本的なシェルとシェルスクリプト

パスの通し方

SSHログイン

ターミナルのカスタマイズ

Unix系のファイルシステム

飛ばす

インターネットとWeb周辺知識

ちょっとインフラやネットワークエンジニア側の知識でもありますが,バックエンドに携わるものとしての基礎教養かなと思います.

DNSのレコード管理

Firewall

外部からの不正アクセスを検知する方法

パケットフィルタリング方式

パケットのヘッダ情報を見て、許可されたパケットだけを通過させる。
ヘッダ情報には、パケットの送信元IPアドレスと送信元ポート番号、宛先のIPアドレスと宛先ポート番号があり、あらかじめルールを決めておく。
このルールに従って通過させるかを判断する。
パケットフィルタリングは、ルータなどに実装される。

アプリケーションゲートウェイ方式

プロキシプログラムを使用することで企業内ネットワークとインターネットを切り離す方式

WAF

WAF(Web Application Firewall)は、WebサーバやWebアプリケーションに起因する脆弱性への攻撃を遮断するファイアウォール。
従来のファイアウォールは、特定のIPアドレスやポート番号で判断して制御していたが、Webアプリケーションの脆弱性を狙った攻撃を遮断できなかった。
WAFにより、クロスサイトスクリプティングやSQLインジェクションなどを防ぐことができる。

ホスティング

https://wa3.i-3-i.info/word1335.html

デザインパターンと原則 【共通】

DRY原則

似たものに「dryなコードを書きましょう」.という文脈もあるので違いに気をつけましょう.そっちの概念もめちゃ重要なので合わせて調べましょう.

Don't Repeat Yourselfの略。ソフトウェアの構成や構築手法についての原則の一つで、同じ意味や機能を持つ情報を複数の場所に重複して置くことをなるべく避けるべきとする考え方。

次のコードを考える

class ObscuringReferences
  attr_reader :data
  def initialize(data)
       @data = data
  end

  def diameters
        #0はリム、1はタイヤ
        data.collect{ |cell| cell[0] + (cell[1] * 2)}
  end
end

このクラスを初期化(イニシャライズ)するには、リムとタイヤサイズから成る2次元配列が必要となる。

@data = [[622,20],[622,23],[559,30],[559,40]]

このコードの問題点は次の通り

  • @dataは複雑なデータ構造を含んでいるおり、dataメッセージの送り手それぞれが、何のデータが配列のどのインデックスにあるかを完全に知っていなければならない
  • diametersメソッドはリムが[0]にあって、タイヤが[1]にあるということを明示的に知っていることを要求している
    →配列の構造が変わった時にコードまで変更する必要がある

次のように修正する

class RevealingReferences
  attr_reader :wheels
  def initialize(data)
       @wheels = wheelify(data)
  end

  def diameters
        wheels.collect{ |wheel| wheel.rlm + (wheel.tire * 2)}
  end

  Wheel = Struct.new(:rim, :tire)
  def wheelify(data)
         data.collect{|cell| Wheel.new(cell[0], cell[1])}
  end
end

この時diametersメソッドは、配列の内部構造について何も知らない。

(書きかけ)

SOLID原則

  • 単一責任の原則(Single Responsibility)
  • オープン・クローズド(OpenClosed)
  • リスコフの置換(LiskovSubstitution)
  • インターフェース分離(InterfaceSegregation)
  • 依存性逆転(DependencyInversion)

KISS原則(知りたければ程度)

“Keep it simple, stupid.”(簡潔にしておけ、この間抜け!)という格言の頭文字を取ったもの。人工物の設計などに際して可能な限りシンプルさを保つべきであるとする原則を表している。

YAGNI原則(知りたければ程度)

YAGNI原則とは、ソフトウェア開発における原則を表した標語の一つで、実際に必要になった機能だけを追加すべきとする考え方。
もとはエクストリームプログラミング(XP:Extreme Programming)において提唱された原則で、今現在具体的な必要性がないのに、将来必要になるかもしれないとか、あれば便利かもしれないなどといった見込みや思い込みで機能や要素を追加することは戒めるべきであるとする考え方を表している。

Ruby

Rubyらしい命名規則と慣習

元ネタ

https://techracho.bpsinc.jp/hachi8833/2017_02_13/35364
  • 識別子の命名には英語を使う
  • シンボル名、メソッド名、変数名はスネークケースにする
  • シンボル名、メソッド名、変数名に付ける数字は文字と接すること
小文字または_で始まる識別子 ローカル変数(最初の代入はそのスコープに属するローカル変数の宣言になる)
またはメソッド呼び出し(宣言されていない識別子の参照は引数のないメソッド呼び出しとみなされる)
@で始まる変数 インスタンス変数(特定のオブジェクトに所属し、そのクラスまたはサブクラスのメソッドから参照できる)
@@で始まる変数 クラス変数(クラス定義の中で定義され、クラスの特異メソッド、インスタンスメソッドなどから参照・代入できる)
$で始まる変数 グローバル変数(宣言なしでコードのどこでも利用できる)
アルファベット大文字 ([A-Z]) で始まる識別子 定数(定義と初期化は代入で行われる、メソッド内では定義できない)
  • ソースファイル名にはクラス名やモジュール名のキャメルケースをスネークケースに変えたものを使う
  • その他の定数名は「スクリーミングスネークケース」にする
  • Rubyでは先頭が大文字で始まると定数として扱う仕様になっている

rubocopを使ったリフォーマット

公式ドキュメント

https://docs.rubocop.org/rubocop/index.html

ネットで適当に見つけた資料

https://kitsune.blog/rails-rubocop

データ型ごとのイコール判定,真偽判定

これかなあ

https://moneyforward.com/engineers_blog/2019/03/15/ruby-code-4/

名前空間

ダックタイピング

ガード構文の早期リターン

rubocopの設定のカスタマイズ

適切なclassの継承とMix-inパターンの使い分け

作成者以外のコメントは許可されていません