むじんブログ ”3歩進んで2歩下がる”

37歳未経験からのエンジニア転職を目指す営業部長

学習のアウトプット(サーバーとデプロイ)

【サーバーの定義】

サーバーという言葉は2種類の意味で用いる。

 

①クライアントの要望に応じたデータを送るソフトウェア・プログラム。

Ruby on Railsで作成したWEBアプリケーションなどがこれに当たる。

 

WEBサービスなどを提供するパソコン本体。

Herokuなどがこれに当たる(レンタルして、作成したアプリを展開するパソコン)

 

【サーバーの種類】

大きく分けて4つある。

 

レンタルサーバ

インターネット上に情報を公開するためのサーバーを、業者からレンタルするもの。

自分で環境を持たなくて良いので、手軽・低コストで利用できる。

 

VPS

レンタルサーバーは1台のパソコンで複数のユーザーに環境を提供するが、

VPSでは1人に1台のパソコン環境を提供する。

これにより使用方法の自由度が増す。

 

・オンプレミス

サーバーやソフトウェアの環境を自身の管理下に置く運用形態。

 

クラウド

コンピュータの利用形態を指す言葉。

ストレージのイメージが強いが、ソフトウェアやハードウェアの提供も行なっている。

 

クラウドの種類】

SaaS(Software as a Service)

クライアント側に導入せず、サービスを提供しているサーバーに直接アクセスして利用するサービスのこと。

例)Office 365・GmailDropboxサイボウズ

 

・PaaS(Platform as a Service)

作成したアプリケーションなどを公開するための環境を提供するサービスのこと。

例)Heroku

 

・IaaS(Infrastructure as a Service)

仮想化したストレージやCPU、メモリなどをユーザーに提供するサービス。

使用するごとに料金が発生する。

例)Microsoft Azure・Google Compute Engine

 

【仮想サーバー】

通常は1台のサーバーで1つのOSを運用するが、1台で複数のサーバーを稼働させることを仮想サーバーという。

メリット:処理速度の向上・保守コストの削減

デメリット:メモリが膨大になる・高度な技術が必要・設定や管理の負荷がかかる

 

【コンテナ】

他のユーザーから隔離された実行環境のことで、ホストOS上で作成される。

使用するメモリ容量が少ないので、仮想サーバーに比べて起動速度が速く、1つのハードウェアで複数起動することができる。

実現するためにはコンテナ管理ソフトウェアが必要。

 

【Docker】

コンテナ化を用いて開発・配置・実行をするためのオープンソースのコンテナ管理ソフトウェアで、圧倒的なシェアを占めている。

 

【デプロイの手段】

大きく分けて3種類ある。

 

カナリアリリース

新しいバージョンを一部のユーザーだけに提供し、問題がないかどうかを確認する手法。

問題が発生したとしても全体のユーザーへの影響が出ないメリットがある。

 

・ブルーグリーンデプロイメント

仮想サーバーを利用して、あるバージョン(ブルー)をリリースしている間に、もう1つのバージョン(グリーン)を構築し、完成したらバージョンを切り替える手法。

問題が発生した場合はブルーに切り替えを行い、容易にロールバックできる。

ただし常に2つのサーバーの管理コストがかかる。

 

・イミュータブルデプロイメント

コンテナの技術を使った手法。

新しい環境を提供し、問題がなければ古い環境を削除する方法。

学習のアウトプット(開発の管理手法)

【開発の種類】

大きく分けて2種類。

 

アジャイル開発

一度にまとめてではなく、1〜4週間のスプリントと呼ばれるスパンで開発を行い、

作業の確認やユーザーへのリリースを実行した後、さらに次のスプリントで変更や更新を行うような手法。

アジャイルは「俊敏な」という意味。

 

ウォーターフォール開発

最初に綿密な計画を立て、その計画通りに開発を進めていく手法。

工程を上から順に流れるように行なっていくイメージ。

 

----------------------------------------------------------------------------------

【2つの開発のメリット・デメリット】

アジャイル開発

メリット:クライアントやユーザーの要望に合わせて、開発の柔軟な修正・変更ができる。

デメリット:進捗の把握がしづらい。

 

ウォーターフォール開発

メリット:進捗が把握しやすいため、多くの人数が関わる大規模な開発に向いている。

デメリット:開発中に修正・変更が行いにくい。

 

----------------------------------------------------------------------------------

アジャイル開発の詳細】

アジャイル開発では、スクラムを組んで進めることが多い。

スクラムでは、以下の役割分担がある。

 

プロダクトオーナー:プロダクトの期限内の実行に責任を持つ管理者。

スクラムリーダー:スクラム内における、開発者間での摩擦を防止する役割を持つ。

開発メンバー:計画に沿って開発を進めるメンバーで、上下関係はない。相互で話し合い、必要であれば計画の修正などの上申を行う。

 

----------------------------------------------------------------------------------

【開発に寄与するツール】

開発において、なるべく人が関わる工程を少なくすることで、ミスや漏れを防ぐことが重要。(特に関わる人数が増える場合など)

そのために、下記のようなツールがある。

 

・Sider

インデントの整理や、開発者が設定したルールに沿っているかなど、コードレビューを自動で行なってくれるツール。

GitHubでプルリクエストされたコードに対して動作する。

 

・CircleCI

アプリケーションのテストや、問題がなかった場合のデプロイなどを自動で行なってくれるクラウドサービス。

 

・CI

開発したコードのテストを定期的に自動で行なってくれる仕組みのこと。

Continuous Integrationの略。

 

・CD

書いたコードを、自動でデプロイ準備を行なってくれる仕組みのこと。

Continuous Deliveryの略。

 

学習のアウトプット(SQL文の基礎)

SQL

RDBを動かすための言語。

ターミナルで操作・シークエルプロで操作のいずれも可能。

簡単な操作はGUIで行えるが、複雑な操作はコマンドで行う。

 

SQLの命令は、DDLDML・DCLの3つに大きく分かれる。

(以前のカリキュラムで少し学んだ内容)

 

--------------------------------------------------------------------------------

SQLの書き方】

SQL文をコマンド入力する際、大文字で記載するのが一般的。

(小文字でも動くが、他の文章との区別のために大文字で書く)

 

また、SQLは最後に;を入れて実行する。

もし忘れた場合はまだ文章が続くと見なされて→が出てくるので、;を入力して実行すればよい。

 

--------------------------------------------------------------------------------

DDL

Data Definition Languageの略。

データを定義するSQLで、DBの作成(CREATE)・更新(ALTER)・削除(DROP)などを行う。

 

・CREATE DATABASE データベース名;

→データベース作成

・SHOW DATABASES

→データベースの一覧表示

DROP DATABASE データベース名;

→作成されたデータベースの削除

 

-------------------------------------------------------------------------------- 

SQLによるテーブルの操作】

SQLでテーブル操作を行う場合、該当のテーブルがあるDBを指定する。

USE データベース名;

→用いるデータベースの指定

 

--------------------------------------------------------------------------------

【テーブルの作成】

CREATE TABLE テーブル名(カラム名1 カラム形式,カラム名2 カラム形式,・・・)

→テーブルを作成

Ruby on Railsでは、モデル作成後にrails db:migrateを実行した時に、SQLによるCREATE TABLEが裏で行われていた。

 

カラム形式は

Ralisでintegerとしていたもの(数字)→INT

Railsでstringとしていたもの(文字)→VARCHAR(最大文字数)

として入力する。

※VARCHARの最大文字数は255文字

 

例)

CREATE TABLE goods (id INT,name VARCHAR(255));

→SHOW TABLES;を実行すると、テーブルとして表示される。

さらにSHOW columns FROM goods;を実行するとカラムが表示される。

(FROM句は対象のテーブルを指定する時に用いる)

 

--------------------------------------------------------------------------------

【カラムの追加】

データベースを更新する際は、ALTER文を用いる。

ALTER TABLE goods ADD (price INT, zaiko INT);

→goodsテーブルにpriceとzaikoカラムがinteger型で追加される。

 

--------------------------------------------------------------------------------

【カラムの変更】

同様にALTER文を用いる。

ALTER TABLE goods CHANGE zaiko stock INT;

→カラムのzaikoがstockに変更される。

変更の際、カラム形式は同じであっても都度記載が必要である点に注意。

 

--------------------------------------------------------------------------------

【カラムの削除】

ALTER文のDROPを用いる。

ALTER TABLE goods DROP stock;

→goodsテーブルのstockカラムが削除される。

 

--------------------------------------------------------------------------------

DML

Data Manipulation Languageの略。

データの登録(INSERT)・更新(UPDATE)・削除(DELETE)・検索(SELECT)の操作を行う。

 

--------------------------------------------------------------------------------

【SELECT】

データの検索(取得)を行う命令。

 

SELECT カラム名 FROM テーブル名

→テーブルから特定のカラムを確認する。

SELECT * FROM テーブル名

→テーブルから全てのカラムを確認する。

(*のことをワイルドカードと呼び、文字の代わりに使うことができ、全てのパターンのような意味で用いられる)

 

--------------------------------------------------------------------------------

【INSERT】

データの登録を行う命令。

INTO句とセットで用いる。また、登録する値の前にはVALUEという句をつける。

 

INSERT INTO テーブル名 VALUE (値1,値2,値3・・・)

→テーブルの全カラムに値を登録する。

INSERT INTO テーブル名 (カラム1,カラム2) VALUE (値1,値2)

→テーブルのカラム1・2に値を登録する。

 

--------------------------------------------------------------------------------

【UPDATE】

データの内容を更新する命令。

UPDATE テーブル名 SET カラム名 = 値 WHERE id = id値

→指定のテーブル・id・カラムの値を更新する。

 

--------------------------------------------------------------------------------

【DELETE】

データの内容を削除する命令。

DELETE FROM テーブル名 WHERE id = id値

→指定のテーブル・idを削除する。

 

--------------------------------------------------------------------------------

【Sequel Proを使ったSQL文】

Sequel Proのクエリの項目をターミナルのように使ってSQL文を記述することもできる。

メリットとして下記がある。

タイプミスの修正が容易

・記述したSQL文が流れていかないので分かりやすい

・文末にセミコロンをつける必要がない

 

--------------------------------------------------------------------------------

【WHERE句】

レコードの取得をする際に用いる句。

idや文字列を指定したり、比較演算子などを用いることもできる。

WHERE句だけではレコードの取得はできないので、SELECTなどど組み合わせる。

 

--------------------------------------------------------------------------------

【LIKE句】

WHERE句と組み合わせることで、文字を指定して検索することができる。

%○○とすると、曖昧語句検索を行うことができる。

(%都とすることで「東京都」のように「都」の含まれた文字を検索できる)

 

--------------------------------------------------------------------------------

【AND演算子

a AND bのように記述する。

Rubyの&&と同じく、複数の条件が正の時にtrueになるイメージ。

WHERE age <= 22 AND prefecture = "神奈川県"

のように用いる。

 

--------------------------------------------------------------------------------

【OR演算子

上記のANDをORに置き換えたもの。

どちらかの条件が満たされていれば対象となる。

 

--------------------------------------------------------------------------------

【NOT演算子

WHERE NOT ○○で、○○に当てはまらないレコードを全て取得する。

 

--------------------------------------------------------------------------------

【BETWEEN演算子

WHERE カラム名 ○○ BETWEEN △△

で、○○〜△△の間に当てはまるもの全てを取得する。

 

--------------------------------------------------------------------------------

【IN演算子

WHERE カラム名 IN (○○,△△)

で、○○と△△というリストをカラムに対して指定し、

そのリストに該当するレコードを取得する。

 

--------------------------------------------------------------------------------

【JOIN句】

テーブルとテーブルを結合させる語句。

aテーブルとbテーブルで共通のユーザーIDを持つレコードを結合させて、1つのレコードにして取得することができる。

 

SELECT * FROM JOIN shifts s users u ON user_id = u.id

→シフトテーブルのuser_idとユーザーテーブルのuser idで一致しているものを結合するという意味になる。

なお、テーブル名の後に別名をつけて、記述の視認性を向上させることが可能。

(sやuがこれに当たり、テーブル名の頭文字を取るのが一般的)

 

--------------------------------------------------------------------------------

【CONCAT句】

複数のカラムを結合し、新たなカラムのようにする句。

下記例では、last_nameとfirst_nameを結合して「名前」というカラムにしている。

CONCAT(文字列1, 文字列2,・・・)

※連結させる句の中にNULLがあると、結果もNULLになる。

 

--------------------------------------------------------------------------------

【GROUP BY句】

ある特定のデータごとに、平均値や総量などを集計する際に用いる句。

GROUP BY カラム名

カラム名をグループ化すると表現する。

下記の例ではuser_idごとにシフトに入った時間の総量を求めたいので、GROUP BY GROUP BY user_idとしている。

 

--------------------------------------------------------------------------------

【COUNT関数】

グループ化されたデータに対して用いることができる関数で、特定のカラムの行数を集計できる句。

SELECT COUNT カラム名とする。

※カラムの値がNULLだとエラーになる。

 

--------------------------------------------------------------------------------

【JOIN・CONCAT・GROUP BY・COUNTを用いた例】

SELECT
  CONCAT(last_name, first_name) "名前",
  COUNT(*) "コマ数"
FROM shifts s
JOIN users u ON s.user_id = u.id
WHERE date = "2015-07-01"
GROUP BY user_id

 

→ユーザーテーブルとシフトテーブルを結合。

名前(last_nameとfirst_nameを結合)とコマ数(user_idをグループ化したデータのうち、user_idの行数)を一覧で表示させる。

→7月1日に誰が何コマシフトに入ったかが分かる。

 

--------------------------------------------------------------------------------

【サブクエリ】

あるSQL文の結果をもとに、別のSQL文を実行する仕組みのこと。

SQL入れ子構造のようになっている。

 

SELECT *
FROM users
WHERE id NOT IN (
  SELECT user_id
  FROM shifts
  WHERE date = "2015-07-01"
)

→7月1日に出勤した以外のスタッフを表示するSQL文。

 

学習のアウトプット(インターネット・Webの基礎)

【Webの知識】

WebはWorld Wide Webの略で、コンピュータを使って文書と文書を結びつける仕組みのこと。

この文書はHTMLで記述されたハイパーテキストと呼ばれる。

 

ハイパーテキストには、他の文書に遷移させる記述を行うことができ、

これをハイパーリンクという。

文書と文書が、世界中にクモの巣のように張り巡らされたものをイメージして名付けられている。

 

つまりWebとは、

ページにリンクを埋め込んで、別のページ(画像・動画なども含む)に遷移するという繋がりを広げて結びつけているシステムを指している。

 

-----------------------------------------------------------------------------------

 

【インターネット】

インターネットは、世界中のコンピュータや情報機器がつながった環境のことをいう。

 

【インターネットとWebの違い】

インターネットは通信網で、Webはそれを使って音楽やページなどをやりとりする仕組みのこと。

インターネットはルールが定められた道路で、Webが新幹線、メールが船、IP電話は電車・・・というように、運ぶ媒体が違うイメージ。

 

-----------------------------------------------------------------------------------

プロトコル

インターネットに接続する通信機器同士が接続をする際の共通のルールや手順。

 

TCP/IP

Trancemission Controll Protocol/Internet Protocol

インターネットプロトコルの種類。

TCPやIPが現在のインターネットではプロトコルの主流となっている。

 

インターネット通信は複数のプロトコルから構成され、下記のように階層構造になっている。

https://tech-master.s3.amazonaws.com/uploads/curriculums//052a9cb0a854c0cbd5e5fab4c54977ea.png

上記のアプリケーション層では、WebサイトやWebアプリケーション、メールソフトなどに関連するルールが定義されている。

そのうち、WebサイトやWebアプリケーションで用いられるプロトコルがHTTPである。

 

-----------------------------------------------------------------------------------

【HTTP】

Hypertext Transfar Protocolの略。

リクエストやレスポンスに用いられるプロトコル

 

HTTPの通信内容を暗号化したより安全なプロトコルとして、

HTTPS(Hypertext Transfar Protocol Secure)もある。

 

-----------------------------------------------------------------------------------

IPアドレス

コンピュータやサーバーを特定する住所。

数字とドットで構成されており、IPアドレスは各コンピュータやサーバーでそれぞれ異なる。

 

IPアドレスを入力することで、接続したいサーバーを特定してそのページを開くことができる。

(例えばGoogleトップページなら172.217.26.99を検索バーに直接入力すると開ける)

 

-----------------------------------------------------------------------------------

【URLとドメイン

IPアドレスを、人間が覚えやすいように文字列に変換し直したもの。

https://www.google.com

上記では、全体が「URL」でgoogle.comが「ドメイン」となる。

 

IPアドレスドメインを紐づけることで、

検索欄にドメイン入力→裏でIPアドレスが呼ばれる→目的のサーバーに接続できる

という流れになる。

 

-----------------------------------------------------------------------------------

DNS

Domain Name Systemの略。

IPアドレスドメインを紐づけるシステムのこと。

 

DNSは電話帳のようなイメージを持つとわかりやすい。

数字の羅列である電話番号(IPアドレス)を覚えるのは大変なので、電話帳で番号を名前に紐づけて管理するようなもの。

DNSを管理するサーバーを「DNSサーバー」と呼び、入力されたドメインに対してIPアドレスを返す役割をしている。

 

-----------------------------------------------------------------------------------

【一連の流れ】

ブラウザからドメインを入力

DNSサーバーでドメインに紐づいたIPアドレスを確認

DNSサーバーが該当のIPアドレスをブラウザに返す

→ブラウザでIPアドレスを指定し、通信したいサーバーを特定

→特定したサーバーに接続

 

-----------------------------------------------------------------------------------

【ポート番号】

同じサーバー内で複数のアプリケーションがある場合など、どのアプリケーションに接続するかを特定するための番号。

各アプリケーションごとに割り当てられている。

 

IPアドレスは住所の番地までで、ポート番号は部屋番号のようなもの。

 

学習のアウトプット(Railsのフロントエンド開発)

今日の内容は少し難解。

 

【ブラウザの表示】

ブラウザの表示で使える言語は下記の4つのみ。

・HTML

CSS

JavaScript

・WebAssembly

 

サーバーサイド側ではERBなど様々な言語が使えるが、最終的にブラウザに表示させる段階では上記の4つだけにしなければ反映できない。

 

------------------------------------------------------------------------------------ 

高級言語

機械よりも人間が理解しやすく作られている言語。

対義語は低級言語で、例えば0と1の羅列のような言語のことをいう。

 

CSS→SCSSやSASS

JavaScript→TypeScriptやCoffeeScript

高級言語にあたる。

高級言語は開発には便利だが、機械が理解しやすいようにより多くの翻訳が必要になる。(そのままではブラウザが認識できない)

 

------------------------------------------------------------------------------------

コンパイル

高級言語を機械に認識されるように翻訳すること。

コンパイラというプログラムを用いて行われる。

コンパイラでもコンパイルできない言語はプリコンパイルが必要となる。

 

【プリコンパイル

コンパイラコンパイルできない言語を事前翻訳し、コンパイル可能な状態にすること。

 

------------------------------------------------------------------------------------

【アセットパイプライン】

CSSJavaScriptなどの静的ファイル(アセット)を小さくまとめる

高級言語のプリコンパイルを行う機能も追加できる

 

複数の静的ファイルをプリコンパイルし連結

→まとめて圧縮し軽量化

→publicディレクトリへ配置

→ブラウザへ渡す

 

------------------------------------------------------------------------------------

【モジュールパンドラ】

各モジュールをまとめ、かつ依存関係の問題が生じないように管理するツール。

 

例)

JavaScriptは各ファイルを連結させると、読み込み順の問題でエラーが生じる

→各ファイルを独立してモジュールにすれば解決するが、依存関係となる

→モジュールパンドラを活用すればクリアできる

(モジュールを一括で束ねる役目)

 

近年では、モジュールの中でもwebpackが主流となっている。

 

【webpack】

JavaScriptやそれ以外の言語の変換・圧縮したり、好きな場所に配置したりできる。

Ruby on Railsでもwebpackは使用できるが、設定ファイルの記述がやや難解なので、簡易化するためにwebpackerというGemを用いる。

 

 

 

 

学習のアウトプット(書きやすいコードについて・コマンドの仕組みと管理ツールについて)

コマンドの仕組みと管理ツールの項目は少し理解に時間がかかった。 

 

リファクタリングを行う理由】

・個人やチームの可読性を向上させる

・保守を行いやすくする

・柔軟な開発体制が構築できる

 

これまでのカリキュラムでは意識していなかったが、

今後は他の人に見てもらう前提で分かりやすいコードを書くように努める。

 

リファクタリングの具体例】

・ネストの中にネストがあるような記入(ifの中にifがあるなど)

→論理演算子を用いてなるべく1つにまとめる、早いタイミングで戻り値を返す

 

・流れがわかりづらい→コメントを入れて分かりやすくする

(コメントは1行で簡潔に書き、コメントの補足コメントなどは用いない)

 

・1つの条件式が長い→いくつかのifに分ける、あらかじめ条件式を関数化しておく

 

・関数名は一見して何を示しているのかいるのか分かる名称にする

(名詞+動詞の順で命名する)

 

・真偽を問う関数は関数名の終わりに?をつける

 

上記以外にも、(絶対的な正解はないが)考え方によって様々なリファクタリングがある。

 

------------------------------------------------------------------------------------

【シェル】

ターミナルとOSの間に入るもの。

ターミナルに入力したコマンドをOSに指示し、OSの動作をターミナル上で返す役割がある。

zshbashもシェルの1つ。

 

------------------------------------------------------------------------------------

【PATH】

環境変数と呼ばれるOS用の変数のこと。

この中には様々なディレクトリへの絶対パスが記載されており、PATHに絶対パスの定義をすることを「PATHを通す」という。

シェルは、コマンドから指示があった際にこのPATHからアプリケーションのディレクトリを参照する。

 

------------------------------------------------------------------------------------

コマンドラインツール】

コマンド指示を受けてOSが動かすアプリのうち、初期からOSに入っておらず使用頻度の高いものをまとめたパックのようなツール。

macではCommand Line Toolsがあり、インストールすることでLinux以外のコマンド指示を行いOS・アプリケーションを動作させることができるようになる。

(インストールしなくてもLinuxコマンドに対応している動作は使用可能)

 

------------------------------------------------------------------------------------

【依存関係】

あるファイルやライブラリが正常に動作するためには、他のファイルやライブラリも併せて必要であるという状態のこと。

他のファイルやライブラリのバージョンなどが変わることで動作に支障が出る「依存関係の問題」が生じることがある。

 

防止のためには、片方のバージョンを上げ過ぎないようにしたり、お互いのバージョンを共に更新していくなどの対応を行う。

しかし、これを人が管理していくのは負荷が高いので、パッケージ管理を使って便利に管理している。

 

------------------------------------------------------------------------------------

【パッケージ管理】

依存関係にあるそれぞれのファイルやプログラムをまとめてインストールし、処理や管理を行っていくこと。

 

例)

GemFileとbundler→Ruby on Railsのパッケージ

Homebrew→macOSのパッケージ

Yarn→Node.jsのパッケージ

(Node.jsはJavaScriptをサーバーサイドで動かすためのツール)

 

------------------------------------------------------------------------------------

【バージョン管理】

Gitのリポジトリのように、バージョンを段階ごとに記録して、必要に応じてバージョン変更などを行う管理方法のこと。

 

例)

rbenv(アールベンブ)→Rubyのバージョンを切り替えるためのバージョン管理ツール

 

rbenvがあれば、使用するディレクトリごとにRubyのバージョンを切り替えたりすることも可能。

逆に無ければ、PC内でRubyのバージョンが共通となるので、依存関係の問題が生じることがある。

RubymacOSで初期から使えるが、rbenvを使ってRubyを新たにインストールし直すのはそのため)

学習のアウトプット(Issueについて)

今日はIssueの解消、レビュアーへのプルリクエストを行なった。

実際の現場でも頻出する工程になるだろう。

 

【Issue】

Gitの機能の1つで、今後の課題や行うこと、コードの履歴などをリストアップしてまとめておくことができる。

アプリケーションの保守などにおいて現状を分かりやすく整理するのに用いる。

 

--------------------------------------------------------------------------------------

リファクタリング

アプリケーションの仕様はそのままに、コードを最新のものにしたり簡素化したりなどの書き直しを行うこと。

将来的な保守を行いやすくするなどの目的で行う。

 

--------------------------------------------------------------------------------------

命名規則

以前のカリキュラムで学んだ内容。

メソッド名は小文字のスネークケースで書くと以前も出てきたが、

「動詞_名詞」で書くのが好ましいらしい。

(名詞部分は、何の処理をするかが分かる記載をする)

 

--------------------------------------------------------------------------------------

【countメソッド(Rubyドリル)】

配列の中に指定した数字がいくつあるかを数えるメソッド。

 

ary = [1, 2, 2, 2, 3]

puts ary.count(2)

結果は3と出力される。