Ruby on Rails・Web関連用語　初心者がまとめてみた

# プログラミング学びたてだった時に全然理解できてなかった単語やらをまとめていく

##できるだけアルファベット・50音順。徐々に更新していく



##ActiveRecord
データベースの操作にはSQLが使われる。
railsではmodelに**ActiveRecord**が使われていて、rubyでデータベースを操作することができる。
SQLの知識がなくとも**ActiveRecord**のおかげでデータベースの操作ができる



##API
クライアントではなく、プログラムが直接サービスを利用するためのものが**API**。
緯度経度がわかれば、その場所を地図に表示してくれるサービスがあったりする。


##AWS関連
https://qiita.com/ashketcham/items/ad55b24613f3cdaaf114



##bundler
どのgemをどのバージョンで利用するのかを管理してくれる。Gemfileでgemを管理。



##Cookie
セッションデータの保存先で、ユーザーのブラウザに保存される小さなテキストデータ。
あるページから別のページに移動した時にも破棄されないので、ユーザーIDなどの情報を保存できる。



##CRUD
「**C**reate（作成）・**R**ead（読み出し）・**U**pdate（更新）。**D**lete（削除）」それぞれのデータベースの基本的動作の頭文字から作られた言葉






##DBMS
データベースを管理するコンピュータシステムのことを**データベース管理システム**（Data Base Management System）、略して**DBMS**と呼ぶ。
どのデータをどのようにして欲しいのかSQL文で操作する。

##DNS
DNS システムはいわば電話帳のようなもので、名前（ドメイン）と番号（IPアドレス）のマッピングが管理されている。
DNSによって、人間が読み取れる名前 (www.example.com など) がコンピュータが相互接続に使用する数字の IP アドレス (192.0.2.1 など) に変換される。

サーバーにアクセスするには、IP アドレスを使用して相互に検索し通信する。
ウェブブラウザを開いてウェブサイトにアクセスするときは、長い番号のIPアドレスを覚えて入力する必要はない。代わりに、example.com のようなドメイン名を入力すれば、正しい場所にアクセスできる。


##Docker
OSのもつ複数の機能を組み合わせて作り出した「コンテナ」という隔離空間上でアプリケーションを実行できる仮想化技術のこと。

便利な点は以下の通り

- コマンド一発でコンテナを何度でも生成できる
    - 一度Dockerfileを作成してしまえば、簡単に用意できる。

- コンテナを共有できる
    - Dockerfile（環境構築のレシピ）の中身はソースコードだから他の人たちと共有できる。Dockerfileを共有するための**Dockerhub**というサービスがあり、他の人が生成したコンテナをいつでも使える。


##DOM
**D**ocument **O**bject **M**odelの略
HTMLドキュメント全体の要素の構成をDOM(Document Object Model)と呼ぶ。
何もしていない状態のHTMLファイルではJavaScriptがどの部分をどのようにしたらいいかわかってくれない。そこでファイルの特定の部分に目印を付けて「この部分」に「こういう事をしたい」という処理を可能にするための取り決めが**DOM**。

jsのdocumentプロパティ（windowオブジェクト）はDOMへアクセスするためのもの。

```ruby:qiita.rb
document.getElementByID("id名")
```



##E2E(End-to-End)テスト
実際にブラウザを操作して意図したとおりに表示・操作など出来るかをテストすること




##GemfileとGemfile.lock
Gemfileでは使用するのはどのgemか、どのバージョンを指定するかを指定。 Gemfile.lockはBundlerがインストールされた正確なバージョンを記録するファイル。




##Git
ファイルを書き換えた後でやっぱり元に戻したいってなっても、本来であれば戻したい箇所がすごい前だともう戻せない。そういった時にGitのバージョン管理があれば、戻したいバージョンに戻すことができる。
Gitの最大の特徴は変更履歴を自分のパソコンとインターネット上の二つで管理できること。この機能のおかげで複数の人とも作業ができちゃう。



##HTML
**H**yper **T**ext **M**arkup **L**anguageの略
プログラミング言語ではなくてマークアップ言語で、文章のどこが見出しで、どこが本文なのかを示すもの



##HTTP
Webページが表示される時はブラウザからリクエストを出して、サーバーがそのリクエストに答えてあげるという流れになっている。このやりとりの手順を**HTTP**という。略さずに書くと**H**yper **T**ext **T**ransfer **P**rotcolとなる。
HTTPはTCP/IP通信のアプリケーション層にあるプロトコルの１つで、Webページを呼び出すためのプロトコル




##HTTPメソッド
HTMLを取得するときは**GET**。データをサーバーに送る時は**POST**などがある。
GETでもデータを送れるが、なぜあかんのか。それがGETだと送るデータがURLに表示されてしまってセキュリティー面がガバガバやから。
POSTやとメッセージボディってとこに組み込まれて送られるから、GETみたいに丸見えにならない。


##HTTPS
情報を盗聴されたり、改善されるなどの脅威から守ってくれるのが**HTTPS**。
###どう安全なのか
- 盗聴を防ぐ
    - データを暗号化してから送ることによって、盗聴しても暗号化されているから何のデータなのか分からないようにしてくれる。

- 改ざんを防ぐ
    - 送信するデータのハッシュ値を計算してデータと一緒に送る。もし途中でデータが改ざんされてサーバーに届くと、サーバーは受け取ったデータからハッシュ値を計算し、送られてきたハッシュ値と異なっていれば改竄されたことが分かる。

- なりすましを防ぐ
    - SSLサーバー証明書によって、信頼できるかどうかブラウザが判断して警告を出してくれる。



### 個人情報やクレジットカードを登録するときには、そのWebサイトでHTTPSが使われているか必ず確認すること！！！！



##LINUX関連
LINUXはWindowsとかMacと同じOSの１種。オープンソースであり、誰でも自由に無償で利用できる画期的なOS。


###カーネル
LINUXの本体。メモリの管理やコマンドの実行を処理してくれる。



###シェル
カーネルとユーザの橋渡しをしてくれる。
シェルが「cd」といったコマンドを受け取って、シェルはcdという文字列が指すコマンドを探してきてくれる。見つけたコマンドをカーネルに実行を依頼するようにしてくれる。カーネルが実行を終了するとシェルがその結果を受け取って、画面に表示してくれる。


###シェルスクリプト
コマンドをまとめて実行できる。
先頭の行にある「**#!**」をシバンと呼ぶ。これでどのシェルで動作するかを明示する。

```ruby:qiita.rb
#!/bin/bash

echo "HANSHIN TIGERS"
```




##MVC
railsは「**M**odel」・「**V**iew」・「**C**ontroller」という考えで構成されている。
アプリケーションは多くの処理によって構成されているが、それらが全てゴチャゴチャとしていると管理が大変になってまう。そこでUIに関わる**View**、データの処理をする**Model**、その２つを統制する**Controller**に分けて管理しやすくしましょう、というのが**MVC**の目的



##NULL
NULLは無記入を意味する。
**NOT NULL**は無記入を許可せず、必ずデータが入ってないといけない。










##Nginx
Webサーバーの１種。
速くて高負荷に強くて、リバースプロキシやロードバランサの機能がある。


##Node.js
Node.jsはサーバサイドでJavaScriptを実行できるようにしてくれるもの。



##ORM
**O**bject **R**elational **M**apping の略称。直接SQL文を書かなくても短いコードで、データベースの読み書きを行える便利やけど、このせいでSQLのおかげでデータベース操作をできてるってことを知らんかった

```ruby:qiita.rb
#ORMの場合
User.all

#SQLの場合
SELECT * FROM User;
```



##puma
Railsを動かすためのアプリケージョンサーバ。
Rails6はデフォルトでpumaが採用されている。


##resources
CRUDのルーティング一式を一発で定義してくれる。
詳細・一覧・投稿などの７つのよくある機能のアクションに対応するルーティングを定義する。

```ruby:qiita.rb
resources :users
```


##SQL
データベースを操作する専門言語。MySQLやPostgreSQLなどがある。
以下のような感じでデータを取ってきてくれたりする。

```ruby:qiita.rb
SELECT name, position_area
FROM Tigers
WHERE position_area = "outfield"

#name・position_areaのデータをTigersテーブルから選択して、
#その中でもposition_areaが"outfield"という条件でデータを取得する
```



##TCP/IPプロコトル（この知識は働いてからも重要）
###プロコトルとは
２つの間でどのようにして対話（通信）をすればいいのかを定めた規則のこと。
どの言語で話すか、どういったマナーでやるかなど、インターネットの世界でも規則がある。
どんな形式でデータを送って、どのようにして受け取って、どのようにして応答するかが決められている





###インターネット界のプロコトル
インターネットに接続できるスマホやPCは全て**TCP/IP**というプロコトルに対応している。
TCP/IPは１つのプロコトルではなく、TCPとIPの**２つのプロコトルのこと（実際には他のも含んでる）**を表している。




###TCPとは
Transmission Control Protocolの略。
データを細切れに分割して通信を行う。この分割されたデータのことを**パケット**と呼ぶ。
このパケットが届いたかどうかを確認して、届いてなかったらパケットを再送するなどをしてくれる。





###IPとは
Internet Procotolの略。
IPはネットワーク上の住所を表し、パケットが送られるネットワーク経路の制御を行う。



その住所を32ビットの長さで表されるが、人間からするとわかりづらいから、8ビットずつ区切って「.」で繋いだ10進数で表す。

```
11000000101010000001000000000011   2進数
↓↓↓↓↓↓↓↓↓
192.168.0.1　　　10進数
```

TCP/IPには役割ごとに以下の４つの層があり、それぞれの層が処理を行って通信ができている。

- アプリケーション層
- トランスポート層
- インターネット層
- ネットワークインターフェイス層





##SaaS、PaaS、IaaS

###SaaS
「Software as a Service（サービスとしてのソフトウェア）」の略。
クラウドで提供されるソフトウェアのこと。ユーザー側でソフトウェアをインストールするのではなく、ベンダー（側でソフトウェアを稼働させ、ユーザーはネットワーク経由でソフトウェアを使用する。
Gmailなどがこれに当たる。


###PaaS
PaaSとは、「Platform as a Service（サービスとしてのプラットフォーム）」の略。
アプリケーションソフトが稼働するためのデータベースやプログラム実行環境などが提供されるサービスのこと。プログラムだけを用意すればよいというメリットがある一方、データベースの設定やプログラムの実行環境に制限があるので、開発の自由度は下がります。インフラから開発する手間を省きたいけれど、ある程度カスタマイズしたいというときに利用するのが良い。

###IaaS
aaSは「Infrastructure as a Service（サービスとしてのインフラ）」の略。
情報システムの稼働に必要な仮想サーバやハードディスク、ファイアウォールなどのインフラを、インターネット上のサービスとして提供する形態。SaaSやPaaSなどと違って自由度が高く、ハードウェアのスペックやOSを好きなように選無事ができる。その分、OSやハードウェア、ネットワークの知識が必要になります。セキュリティ対策も考流必要がある。

##SSH
**S**ecure **S****H**ellの略。
ネットワークを経由してサーバに通信途中の情報は全部暗号化して接続し、遠隔操作するための仕組み。
認証方式には２つある（自分が知ってるのは２つだけ）

- パスワード認証方式
    - パスワードで正規のユーザか確かめる方法だが、パスワード流出のリスクあり。

- 公開鍵認証方式
    - 公開鍵と秘密鍵という２つの鍵を使って安全に通信を行う。公開鍵で情報を暗号化し、秘密鍵で情報を複合化して情報の中身を確認できるよーな感じ



##turbolinks
遷移先のページをAjaxで取得してきてくれて、title要素・body要素を入れ替えるだけやから処理が早くなる。



##webpack
CSS、JavaScript、画像などを１つのファイルとしてまとめるためのモジュールバンドラーで、Node.jsのモジュールの1つ。




## yarn
Facebookが開発した、jsのパッケージマネージャー。
npmよりも早く動作するらしく、セキュリティも高いとか。
ruby でいうところのbundlerで、ライブラリを管理してくれるNode.jsのツールのこと。




##アセット
Javascript・CSS・画像、これらをアセットと呼ぶ




##アセットパイプライン
JavaScript・css・画像といったHTMLに付随する細々としたファイルたち（アセットファイル）を連結したり圧縮したりすることで効率的にアクセスすることができるrailsの機能のこと。




##オブジェクト（インスタンス）
これがrubyやrailsの一番の基礎。
rubyの世界では全てのデータはオブジェクト。数字・文字列・ハッシュ・配列、全てがオブジェクト。railsを使いこなすには、フレームワークで予め用意されたオブジェクト達を理解した上でやっていくことが大切。
オブジェクトはクラス（設計図）から生み出される。

```ruby:qiita.rb
#「tigers、osaka、baseball」というTeamのオブジェクトを作成
team = Team.new('tigers', 'osaka', 'baseball')
```

ちなみにオブジェクト指向とは「開発を効率化するために作られた概念」らしい







##疑似変数
true,false,nilのことを指す。
疑似変数に値を代入することはできない。




##公開鍵暗号方式
通信経路には危険がいっぱいで、誰かに覗かれたり改竄される恐れがあるから情報を覗かれても大丈夫なように情報に鍵をかけて安全に通信する仕組みのこと。

秘密鍵と公開鍵がペアとなっている。
- 秘密鍵で複合化（暗号を解く）
- 公開鍵で暗号化

公開鍵で暗号化されたデータは、ペアとなる秘密鍵でしか複合することはできない。公開鍵をいくらばら撒いても暗号化しかできないから、途中でデータを盗聴されたりしない。


##キャッシュ
リクエストに対するレスポンスの記憶のこと。
何度もくるリクエストに対して何度もページを全て読み込むのは負担になるから、リクエストに対するレスポンスを覚えてくれるのがキャッシュ。


##クラス
オブジェクトの設計図と呼ばれている。
Rubyのオブジェクトは何らかのクラスに属している。

```ruby:qiita.rb
"Tigers".class => String
[].class => Array
```



##コンソール
プログラムを実行して、実行した結果を表示してくれるのがコンソール。
プログラムのエラー内容もお表示してくれる。



##シンボル
シンボルは文字列と似ているが、stringクラスではなくsymbolクラス。文字列と違うのは同じシンボルであれば同じオブジェクトであること。
ハッシュにシンボルが使われているのは、内部的には整数で文字列よりも早くに値を取り出せるから、らしい。。。

```ruby:qiita.rb
:tigers
```


##ステートレス・ステートフル
###ステートフル
クライアントのアプリケーションの状態をサーバで**管理すること**
つまり**前回のやりとりを記憶して、次の処理結果にその記憶を反映させる。**

###ステートレス
クライアントのアプリケーションの状態をサーバで**管理しないこと。**
つまり**前回のやりとりを記憶せず、次の処理結果にその記憶を反映させない。**

```
◆ステートフルの場合
クライアント：玉ねぎを買ってきて
サーバー：分かりました。
クライアント：人参を買ってきて
サーバー：分かりました。
クライアント：牛肉を買ってきて
サーバー：分かりました。
クライアント：ネギを買ってきて
サーバー：分かりました。
クライアント：白菜を買ってきて
サーバー：分かりました。
サーバー：玉ねぎ・人参・牛肉・ネギ・白菜を買ってきます。



◆ステートレスの場合
クライアント：玉ねぎを買ってきて
サーバー：分かりました。
クライアント：人参を買ってきて
サーバー：分かりました。
クライアント：牛肉を買ってきて
サーバー：分かりました。
クライアント：ネギを買ってきて
サーバー：分かりました。
クライアント：白菜を買ってきて
サーバー：分かりました。
サーバー：結局何を買ってきたらいいのですか？？？？？？？？


```


ステートレスとステートフルを比較すると、どうしてもステートレスの方がポンコツのポンちゃんに見えてしまうが、**ステートフルだとクライアントとのやりとりをサーバが全て記憶しないといけないから、サーバへの負担が大きくなるというデメリットも**あったりする。





##セッション
HTTPはステートレス（状態を保持しない）プロコトルやから、１往復のリクエスト/レスポンスでやりとりが完結されて複数の処理を並行して行えない。
そこでWebアプリケーションはサーバに**セッション**という仕組みを用意して、**ステートフル（状態を保持する）**にしている。

つまり、前のリクエストの情報を次のリクエストでも利用できるよう小さなデータを保存することができる仕組み。

※セッションデータの保存先には幾つか種類があるが、デフォルトではクライアント側のブラウザCoockieに保存する方法


## ::（ダブルコロン）
クラスやモジュール内に定義された**モジュール、クラス、定数**にアクセスするために使用される。
つまりはスコープを表してくれている演算子

```ruby
user = user.new(name: "taro", email: "abc@example.com".....)
=> => #<User id: 1, name: "taro", email: "abc@example.com"...>
user.class
=> User(id: integer, name: string....)
user.class.superclass
=> ApplicationRecord
user.class.superclass.superclass
=> ActiveRecord::Base   <<<<<<< #この::は何者？？？
```


```ruby
# ActiveRecordモジュールのBaseクラス、定数にアクセスする
ActiveRecord::Base
ActiveRecord::FOO #=> 1

============================

module ActiveRecord
  class Base
  end
  FOO=1
end
```



##テスト
- 単体テスト
 - 主にモデルが正しく動作するかチェックするテスト。

- 統合テスト
 - 複数のコントローラにまたがってユーザーの操作を追跡して、それぞれのステップが期待通りに動くかをチェックするテスト。



##動的型付け・静的型付け
- **動的型付け**
    - 変数や関数に何が入ってくるかというのが特に決まっていない形を指す。変数や関数には文字列、整数、小数点など、どのデータの型が入ってもOK。メリットは変数や関数の入れ物の大きさを気にする必要が無いところ。

- **静的型付け**
    - 変数や関数に型をあらかじめ定義しておき、その定義した型以外のデータを変数では使えない形を指す。この変数は「整数値を扱う」・「負の数はあかん」・「小数点で扱えよ」「数値の配列」などで扱えよ！ということをあらかじめ定義する。メリットはこの程度の値しか入らないといことが事前に想定されているから、無駄な値を入れられたり無駄に容量をとられることがなくなる。


**つまり、Rubyは変数の型をいつでも変更できるから動的型付けである！！！！**





##トランザクション
データベースではひとかたまりの処理をトランザクションとよび、トランザクション単位で処理を行う。
排他制御という技で処理中のデータはロックして、他の人が割り込んでデータを操作できないようにしてデータの不具合性を生じさせないようにさせることができる。





##配列
複数のデータをまとめて格納できる。

```ruby:qiita.rb
["tigers", "giants", "yankees"]
```



##ハッシュ
配列に似てるが、大きく違うのがデータとキーの組み合わせで格納する。
配列だけだと何のデータ化わかりづらいけど、ハッシュだとキーのおかげで何のデータか分かりやすくなる。

```ruby:qiita.rb
#キーだけがハッシュの場合
{:osaka => "tigers", :tokyo => "giants", :newyork => "yankees"}

##キーと値がハッシュの場合
{osaka: :tigers, tokyo: :giants, newyork: :yankees}
```



##非同期通信
Webブラウザの代わりにJavaScriptが代わりにサーバーと通信をして、HTMLを更新してくれる。
同期通信だとサーバーが処理している間は待たないといけないから、送信するデータも多くてサーバーに負担がかかってしまう。



##プロキシサーバ
LANと外のインターネットの間に立って、外部とのやりとりを代理して行う機能。
外のコンピューターからはプロキシサーバしか見えたないから、LAN内のコンピューターが不正アクセスの標的になるのを防ぐ役割を持つ。




##プロセス
プログラムは通常、ファイルの形でハードディスク上に保存されている。
そのプログラムが実行されると、メモリ上に読み込まれてCPUによって実行される。**メモリ上で実行中のプログラムをプロセス**と呼ぶ。

プロセスを起動するとプロセスごとにIDが割り当てられ、そのIDを**プロセスID（PID）**と呼ぶ。


##ポート
サービスの窓口。
IPアドレスがマンションの住所、ポートがマンションの部屋番号によく例えられている。
HTTP通信をするためには80番の部屋を開けてあげないと、HTTP通信が使えない。
他に、SSHを使うためには22番の部屋の開けてあげる。HTTPSであれば443番の部屋を開けてあげるといった具合。





##マイグレーション
データベースにテーブルを追加・変更をしてくれる。
歴史を辿って、必要なところまでデータベースの状態を戻すこともできたりする。


##マークアップ言語
Webページを表示する文字などはHTMLという**マークアップ言語**で書かれている。
マークアップ言語はプログラミング言語ではなく、文章のどこが見出しで、どこが文書かを表す言語。


##メソッド
オブジェクトの仕事は何らかの作業をしてもらうことにある。
その何らかの作業を**メソッド**として記述する

```ruby:qiita.rb

class 野球
 def 打ち勝つ（対戦相手）
  puts "打ちまくって、#{対戦相手}に打ち勝つ"
 end
end


阪神 = 野球.new
阪神.打ち勝つ(巨人) => 打ちまくって巨人に打ち勝つ

#阪神に打ち勝つというメソッドを与えている。
#打ち勝つメソッド内に何をやるかを記述
```





##メソッドのアクセス権（private・protectedの違い）
- **private** 
    - クラスの外側からは呼び出せず、クラスの内部からだけ呼び出せる。必要のない変更操作などを防いで安全性が高まって重要な情報に対するアクセスを制限するのに役に立つ。
- **protected** 
    - 同じクラスのオブジェクトからならコール可能。


```ruby:qiita.rb
class Tigers
  protected
  def protected_method
  end

  private
  def private_method
  end
end

class Giants < Tigers
  def call
    t = Test.new
    t.protected_method
    t.private_method
  end
end

Test.new.call
 ========
t.protected_method > OK!!!
t.private_method > Error...  #privateはレシーバを指定できないのでエラー
```



##モジュールバンドラー
モジュールを束ねるもの。つまりjsファイルをひとつにまとめること。モジュールにはアプリケーションに必要な機能が管理されており、必要な時にそれらを呼び出して別のファイルでそれらの機能を使う。

jsのモジュールハンドラーでは、**Webpack**や**Browserify**がある。




##ライブラリ
単体で動くプログラムではなく、他のプログラムから利用されるプログラム部品のこと。
ライブラリの一つ一つをrubyではgemと呼んでいて、bundle installやらで使いたいライブラリを使えるようになる。




##リテラル
プログラム中に直接記述した値のこと。
文字列リテラル、整数リテラル、少数リテラルなどがある。


##ルーティング
リクエストをアクションへと道案内してくれる。URLからどのコントローラーからどのアクションで処理させるか指示をしてくれる。

##%記法
%記法を使うことで記述する文字量を少し減らすことができ、可読性が上がる。

###%w
全ての要素が文字列である配列は**%w**を使って書くことができる

```ruby:qiita.rb
#通常の配列
["tigers", "carps", "swallows", "giants"]

#%記法を用いた配列
%w(tigers carps swallows giants)
```

###%i
全ての要素がシンボルである配列は、**%i**キーワードで書くことができる。
記述する文字数を減らして可読性が上がる。

```ruby:qiita.rb
#通常の配列
[:tigers, :giants, :yankees]
resources :posts, only: [:index, :new, :create]

#%記法を用いた配列
%i[tigers giants yankees]
resources :posts, only: %i[show new create]
```