---
# System prepended metadata

title: 若手向け技術基礎
tags: [ICD, ルーキーズ]

---

---
tags: ICD,ルーキーズ
---

# 若手向け技術基礎

## 計算機基礎
- ノイマン型コンピュータの基礎構造
    - 中央処理装置(CPU)
    - 記憶装置(メモリ)
    - 外部入出力装置(I/O)
    - レジスタ

- コンピュータの基本動作
http://schweigi.github.io/assembler-simulator/
    - メモリにはアドレス(番地)が割り振られる
    - レジスタはメモリの値を読み書きできる
    - レジスタは値を格納できる.メモリアドレスも格納できる
    - スタックポインタはメモリを保持する
    - レジスタには限りがあるので、一時的に保存しておき、仕事が終わったらもとに戻す(PUSH/POP)

- 2進数/16進数/10進数
    - コンピュータは基本2進数
    - 1Byte=8Bit
    - 1Byteは0x00～0xFFの範囲を表現できる
    - 2進数と16進数は親和性が高いが、人間は10進数が好き

- 文字コード
    - ASCIIコード
    - JIS/EBCDIC/EUC/ShiftJISコード
    - UTF-8とUnicode
    - 文字を表現するコードと特別な意味のコードがある
        - 改行コード
        - 制御コード

- 改行コード
    - Windows(DOS)はCRLF(0x0D 0x0A)
    - UNIXはLF(0x0A)
    - MacはCR(0x0D)
    - 改行コードに歴史あり(元はタイプライター)

- コンパイラとインタプリタ
    - 最初は16進数でプログラムを書いていた
    - アセンブラ
    - コンパイラ
    - インタプリタ
    - コンパイラとインタプリタのメリデメ

- 構造化プログラミング
    - ソフトウエア危機
    - 大勢でプログラムを書くとカオスになる
        - グローバル変数地獄/GOTO地獄
    - モジュールの誕生(内部は密結合/外部は疎結合)

- OSとライブラリ
    - OSの生まれた理由
        - 面倒くさいことは一か所にまとめる
        - 抽象化してわかりやすくする
    - ライブラリ
        - なんでもかんでもOSに寄せるわけにも行かない
        - 考え方はOSと同じだが、担う範囲が異なる
        - 言語ごとにライブラリあり

- オブジェクト指向
    - 最初はプログラムが主導的だった
    - データを勝手に触らせない
        - 隠ぺい/カプセル化
    - 継承/多態性/インターフェース/オーバーライド
        - やりすぎ注意
    - 公開範囲(public/private)
    - クラスメソッドとインスタンスメソッド
    - 例外処理(オブジェクト指向関係ないけどね)

- インターネットワーキング
    - OSI7階層モデル
        - 上位層にはIFを開示/下位層の実装は気にしない、という考え方
    - 物理とデータリンクはあんまり気にしなくてよい
    - IP層
        - IPアドレス(SourceとDestination)
        - サブネット/ネットワークアドレス
        - デフォルトゲートウェイ
        - ルーティング
        - アドレス解決(ローカル定義/DNS/NetBIOS)
    - TCP層
        - ポート(SourceとDestination)
        - ソケット
        - コネクションの状態(LISTENとESTABLISHED)
        - Well Known PortとEphemeralPort
    - よく使われる上位層プロトコル
        - HTTP
        - TLS
        - POPS3/SMTP/IMAP
        - SSH
    - プログラム間の通信例
        - ブラウザとWebサーバ

- Linux基礎
    - アカウント(ユーザ/グループ)
    - ファイルシステム
    - オーナーとパーミッション
    - Shellの位置づけ
    - プロセスと子プロセス
    - フォアグラウンドとバックグランド
    - 環境変数
    - なぜGUIではなくCUI(CLI)なのか
        - 再利用性
        - 自動化
        - エビデンス
    - 主なコマンド
        - ログイン/ログアウト
        - ディレクトリ移動/操作
        - ファイル閲覧/操作/検索
        - ファイル編集
        - 文字列処理
            - 文字の出力
            - 検索/置換/分割
        - ネットワーク状態確認
        - プロセス状態確認
        - ヘルプ表示
    - UNIXプロセス基本構造とShellでの操作方法
        - 標準入力/標準出力/標準エラー
        - リダイレクトによる出力
        - リダイレクトによる入力
        - パイプによる標準入出力の連結
        - 環境変数とShell変数
    - ShellScripting
        - 基本構文
            - 外部コマンドの呼び出し
            - 変数の代入と参照
            - 変数のスコープ
            - 外部コマンドの変数代入
            - 判定と分岐
            - ループ
            - 起動引数の取得
            - クォートの使い分け
            - 外部コマンドの実行結果の取得
        - デバッグ

- 正規表現
    - 正規表現の用途
    - 基本的な正規表現パターン
    - 検索で活用してみる
        - grep/sed
        - SakuraEditor
    - 置換で活用してみる
        - 普通の置換
        - 後方参照の威力

- ダイアグラム基礎
    - シーケンス図
    - 状態遷移図
    - マトリックス

- RDB基礎
    - データベースとスキーマ
    - テーブルとカラム
    - カラムの属性
    - PKとFK
    - 基本的なクエリ
        - select
        - insert
        - update
        - delete
    - 論理削除の考え方
    - 制約
    - マスタと明細
    - JOINあれこれ
        - CROSS JOIN
        - OUTER JOIN
        - INNTER JOIN
    - where句条件あれこれ
        - 一致/不一致
        - IN(使い方要注意)
    - 正規化/非正規化
    - トランザクション制御と排他
    - テーブル設計アンチパターン
        - カラム名が不適切
        - NOT NULL制約が適当
        - 横持ち地獄
        - 属性が不適切(数値と文字列)
        - 数値がオーバーフロー
        - 一意性制約やりすぎ
        - PK/FKを使いすぎると環境間ポーティングが大変
        - 業務キーが複数テーブルに散在

- テスト基礎
    - テストの考え方
    - テスト工程と各工程での観点
        - Unitテスト
        - 単独動作テスト
        - 内部結合テスト
        - 外部結合テスト
        - システムテスト
        - 業務/運用テスト
    - 機能と非機能の違いを知る
    - テスト対象に関連する登場人物を把握する
    - テスタは開発者以上に仕様を把握している必要あり
    - 手動テストと自動テスト
    - テストの着目点
        - 境界値にバグは生まれる
        - 組み合わせると生まれる不具合がある
        - 後半のテストほど要件や仕様レベルの不具合に起因する
        - 前半のテストに漏れがあると、後半で死ぬ
    - エビデンスの重要性
    - シミュレータ/ドライバ
    - カバレッジが取れるなら取るべし
