技術質問準備まとめ

#技術質問準備まとめ

面接の技術質問ですぐ回答できるよう**とにかく短文に**まとめた自分用のメモです。

作成理由
①Twitterに少しずつ書いていた自分用の理解メモが溜まってきた
②新たにメモしたい内容が長文でTwitterの字数に入りきらない

自分がわかりやすくなるよう要約することに重きをおきました。
あまり信用せずお読みください。誤りがあったら是非ご指摘お願いします。

　
#Twitterに書き溜めていたもの＋α

##Activeレコード
RubyとSQLの変換機みたいなもの。これのおかげでRubyでSQL操作できるしどのDBもRubyで操作できるようになる。モデルと関係が深い。CRUD（Create:生成、Read:参照、Update:更新、Detele:削除）あたりがよく使ってるメソッド。

##O/Rマッピング
OとRの対応付け、割り当て。「オブジェクト」と「リレーショナルデータベース」の頭文字。オブジェクトとはデータと機能セットの存在であり「何か」を指し示すもの。対象は概念の場合も具体の場合もあり。リレーショナルデータベースとは行と列から成る、関連モデルを使ったDBのこと。

##オブジェクト指向プログラミング
処理効率より人間側の理解を目的としたプログラミング。漫然とした手順ではなく「物の作成」「操作」で考える。自身の操作として重複を防げるだけでなく、複数人数での共同作業でも可読性を高めることができ作業量や余計な不具合を削減可能。非手続き型プログラミング。
（※手続き型プログラミングでは処理は基本的に上からおりてくる。処理効率をどうしたら上られるか考えるプログラミング。）

##オブジェクト指向設計
システムの中で動作の対象となる「もの」すなわちオブジェクトについて、お互いの関係ややりとりを定義することによってシステム全体を設計するもの。同プログラミングより一歩引いて、ものの定義をすること、定義されたものの操作方法を公開することが主軸。

##オブジェクト指向3大要素「継承」
抽象側から具体側へ特徴を共有・継承すること。（例：生物→哺乳類→人間→Aさん、の場合全てが生物の特徴である「食べる」「寝る」を継承している。）これのおかげで冗長なコードを避け、重複を回避し、コード再利用もできるようになる。

##オブジェクト指向3大要素「カプセル化」
他のプログラムと干渉する部分と独立した部分を切り分け、独立した部分にカバーして外部から干渉できない様にする。直接データを操作させずに、一度関数を通す状況を作るのもこれ。クラスの外から干渉できないのもこれ。不正アクセスや意図しないバグを防ぐ。

##オブジェクト指向3大要素「ポリモーフィズム」
中に入るものによって、同じ関数でも違う処理を行えること。「鳴く」という同じ処理でも、あてこむ主語によって鳴き声が変わるイメージ。コードを簡略化でき、かつプログラムの変更に強くなる。each文等も多分この考え方が当てはまる。

##Ruby
国産言語。オブジェクト指向。1993年生まれ。記述量が少ない。実行中に随時コードの解釈を行うスクリプト言語なので、実行前のコンパイルが不要。Pearlを参考にしている部分がある。フレームワークを使っての販売サイト・SNSが得意分野。

##フレームワーク
Webアプリやシステムを開発するために必要な機能が予め用意された便利な物。効率よく開発を進められるメリットはあるものの、言語自体の学習とは別に学習が必要となる、言語やシステム自体への理解が浅くなるというデメリットも。代表例：RubyのRails、JSのReact、CSSのBootstrapなど。

##クラス
プログラミングのためにコードを部品化する仕組み。オブジェクトを作る設計図のこと。例：たこ焼き機がクラス、たこやきがインスタンス、たこ焼きを作ることをインスタンス化と呼ぶ。インスタンスや変数をクラスという枠で括ることで、変数同士の結び付きが強まり、目的が明確になる。

##メソッドのオーバーライド
スーパークラスで定義されたメソッドを、同名のメソッドの定義をサブクラス（継承先）で行い上書きする事。内容を変更したい場合は該当するメソッドのみ再定義できるため、記述量を減らすことが出来る。実行時にメソッドの定義が子クラスにない場合は親クラスに拾いに行く。

##コンストラクタ
インスタンスが生成された時に自動で生成されるメソッドの事。対象のオブジェクトを初期化（初期値を設定）できる。Rubyで言うinitialize。ちなみにinitializeはprivateメソッドの扱いになるので、引数を渡しての動作としてのpublicメソッドとしては使えない。

##多重継承
複数の親クラスから子クラスに継承する事。読解が複雑になるので好ましくないとされる。（例：親の親が共通クラスの場合でも、子クラスはあくまで直接の親クラスから継承を受ける為、その要素がどちらの親から継承された物かわかりにくい）Rubyでは基本後から記載した物がオーバーライドする。

##トランザクション
関連する複数の処理を一つの処理として扱う事。（例：味噌汁椀を持つ＋口をつける＝味噌汁を飲む）独立した処理ではなく、関連する分離できない処理同士を結びつける。結果は成功／失敗のどちらかとなる。うまくいかなければトランザクション処理の実行前の状態にロールバックする。

##仮想化
実在するIT資源の数を増やしたり減らしたりした様見せかける事。中の情報を分割・結合する。資源の有効利用、リスク分散、コスト削減可能。1サーバー→複数の論理的なサーバー環境作成や複数サーバー→1つの高処理サーバーへの統合等。対象：サーバー、デスクトップ、ストレージ、デスクトップ等。

##ホスト型仮想化
リソース的にオーバーヘッド多く動作に時間かかる。仮想マシンごとにミドルウェア等インストールが必要なので環境による動作不良の可能性有。複数の仮想マシン上で任意のOSを選択利用できる。ハードウェアレベルの仮想化なのでホストOSや仮想マシン間の分離レベルが高く影響受けにくい。

##コンテナ型仮想化
ゲストOSでなくホストOSのカーネル使用のため動作速い。Dockerイメージに必要な物を纏めるので環境変わってもOK。カーネル共有できないOSでは動かせない。ホストOSの1プロセスとして起動するため分離レベルが低くセキュリティレベルの目線によっては懸念点に。

##OS
オペレーティングシステム。ハードウェア（PCとか）とソフトウェア（アプリケーションとか）の仲介。これがないとキーボードもマウスも使えないしイヤホンで音楽聴けない。OSからプログラムに命令が送信されている。OSもプログラミング言語でできている。細かく書かなくても他アプリと同じ挙動をするならそれはアプリでなくOSの仕事。

##プロセッサ
別名CPU。PCの1パーツでありPCのブレイン。コンピューター内の各パーツ（マウス、キーボード、ハードディスク、メモリなど）をコントロールしたりメモリを読み書きしたりする。周辺機器はこぞってここにデータを送る。

##ソフトウェアの分類
- システムソフトウェア
    - 基本ソフトウェア　：OSや言語プロセッサ、各種サービスプログラムなど
    - ミドルウェア　　　：特定の要素に特化し、基本ソフトウェアと応用ソフトウェアの橋渡し
- 応用ソフトウェア　：アプリケーション

##基本ソフトウェアの分類
- 制御プログラム（＝カーネル）
- 言語処理プログラム（＝言語プロセッサ）
- サービスプログラム（＝ユーティリティ）

##制御プログラム（＝カーネル）
OSの中核。ハードウェアとソフトウェアの仲介担当。ハードウェアを管理して、応用ソフトウェアやミドルウェアからコンピューターが効率的に動くように働く。ジョブ管理、タスク管理、記憶管理、データ（ファイル）管理を行う。これのおかげで各ソフトウェアはメモリやCPUをあまり意識せず動ける。

##言語処理プログラム（＝言語プロセッサ）
C言語やJavaなど、特定のプログラミング言語で書かれたプログラムを、コンピューターが理解できるよう機械が認識できる機械語に変換する。

##サービスプログラム（＝ユーティリティ）
コンピューターの機能を補う、補助的なプログラム。サーバーとしての機能を提供。OSとは違いコンピューターの動作自体には必要ない。サービスプログラムはシステムプロセス（システムが自動的に動作させるプログラム）、アプリケーションプログラムはユーザープロセス（使用者が動作させるプログラム）。

　
#ここからはメモ

##allメソッド使う時はよく考える

```ruby
user = User.all
```
よく使うこれは無駄が多いので**好ましくない。**発行されているSQLはこちら

```sql
SELECT `users`.* FROM `users`
```
不要なデータごとまるっと持ってきている。持ってくるのは必要なデータのみでよいので

```ruby
user = User.select(:nickname)
```
この形の方が良いようだ。allメソッドに限らず全てのアクションに共通する考えだと思った。無駄なことはしない。


##SQLインジェクションとは
アプリケーション開発者が想定していない挙動のSQL文を発行させDBを攻撃すること。
例えば以下の生のSQL

```sql
SELECT * FROM users WHERE nickname = '（入力値）';
```
ここに **"t' OR 't' = 't"** という文字列を入力すると

```sql
SELECT * FROM users WHERE nickname = 't' OR 't' = 't';
```
このようになる。't' = 't'は常に正のため、全レコードを持ってくることができるようになってしまう。
不正操作を防ぐためには入力値をこんな感じでエスケープする必要がある。

```ruby
User.where(nickname: params[:nickname])
User.where("nickname = ?", params[:nickname])
```


##アルゴリズム
###フィボナッチ数列

フィボナッチ数列とは
>1, 1, 2, 3, 5, 8, 13, 21, 34, 55,,,,

のように **第n+2項 ＝ 第n項 ＋ 第n+1項** となる数列のこと。
要するに隣り合う数値を足すとひとつ右の数値となる。

問． 第n項の数値を求めるには？

```ruby
def fib(n)
  if n == 0 || n == 1
    puts 1
  end
  puts fib(n - 2) + fib(n - 1)
end

puts "nを入力してください"
int = gets.chomp.to_i
fib(int)
```
初学者が書きやすい書き方。nが大きくなるほど処理が重くなるので別の方法の方がよいみたい。ここでは割愛。
数列は1ではなく0からスタートする場合もあるようなので見落とし注意。


　
~~全部書ききれなかったので、また追々追記していきます。~~
志望していた企業から内定をいただけたので今後編集はしません。
必要な方はコピペでも改変でもなんでもご自由にお使いください。ご自分の学習用に内容追加してQiitaに投稿しなおしていただいても構いません。この記事へのリンクも必要ありません。
私が書いた文章なので、著作権も放棄しますが情報の正確さを保証もしません。使えそうな方はご自身の判断で使ってください。