具体的にどう本物のエンジニアになるかというお話 について
次のURLより
インターネット
クライアントサーバー方式
クライアントサーバーシステムは、サービスを要求するクライアントと、要求されたサービスを提供するサーバで構成される分散型システム。
クライアントサーバシステムでは、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記載の通り
OSとコンピューターサイエンス
コンピューターの起動の流れ
このくらいでいいか
基本的なシェルとシェルスクリプト
パスの通し方
SSHログイン
ターミナルのカスタマイズ
Unix系のファイルシステム
飛ばす
インターネットとWeb周辺知識
ちょっとインフラやネットワークエンジニア側の知識でもありますが,バックエンドに携わるものとしての基礎教養かなと思います.
DNSのレコード管理
Firewall
外部からの不正アクセスを検知する方法
パケットフィルタリング方式
パケットのヘッダ情報を見て、許可されたパケットだけを通過させる。
ヘッダ情報には、パケットの送信元IPアドレスと送信元ポート番号、宛先のIPアドレスと宛先ポート番号があり、あらかじめルールを決めておく。
このルールに従って通過させるかを判断する。
パケットフィルタリングは、ルータなどに実装される。
アプリケーションゲートウェイ方式
プロキシプログラムを使用することで企業内ネットワークとインターネットを切り離す方式
WAF
WAF(Web Application Firewall)は、WebサーバやWebアプリケーションに起因する脆弱性への攻撃を遮断するファイアウォール。
従来のファイアウォールは、特定のIPアドレスやポート番号で判断して制御していたが、Webアプリケーションの脆弱性を狙った攻撃を遮断できなかった。
WAFにより、クロスサイトスクリプティングやSQLインジェクションなどを防ぐことができる。
ホスティング
デザインパターンと原則 【共通】
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らしい命名規則と慣習
元ネタ
- 識別子の命名には英語を使う
- シンボル名、メソッド名、変数名はスネークケースにする
- シンボル名、メソッド名、変数名に付ける数字は文字と接すること
小文字または_で始まる識別子 |
ローカル変数(最初の代入はそのスコープに属するローカル変数の宣言になる) またはメソッド呼び出し(宣言されていない識別子の参照は引数のないメソッド呼び出しとみなされる) |
|
@で始まる変数 | インスタンス変数(特定のオブジェクトに所属し、そのクラスまたはサブクラスのメソッドから参照できる) | |
@@で始まる変数 | クラス変数(クラス定義の中で定義され、クラスの特異メソッド、インスタンスメソッドなどから参照・代入できる) | |
$で始まる変数 | グローバル変数(宣言なしでコードのどこでも利用できる) | |
アルファベット大文字 ([A-Z]) で始まる識別子 | 定数(定義と初期化は代入で行われる、メソッド内では定義できない) |
- ソースファイル名にはクラス名やモジュール名のキャメルケースをスネークケースに変えたものを使う
- その他の定数名は「スクリーミングスネークケース」にする
- Rubyでは先頭が大文字で始まると定数として扱う仕様になっている
rubocopを使ったリフォーマット
公式ドキュメント
ネットで適当に見つけた資料
データ型ごとのイコール判定,真偽判定
これかなあ