ソニックの部屋

主にプログラミングに関する記事を投稿します

「機械学習&ディープラーニングのしくみと技術がしっかりわかる教科書」を読む

気になった用語等をまとめる

第1章_人工知能基礎知識

学んだこと

  • 人工知能とは人と同じような知的処理を行うことができる機械のこと
  • 機械学習人工知能の一つで入力されたデータを元に数値を予測したりすること
  • 機械学習のプロセスは、
    • ①期待される出力データと学習モデルが計算した結果を比較
    • ②期待される出力データに近づくように学習モデルを修正
  • 機械学習の問題は分類と回帰に分けられる
    • ①分類はどのデータがどの種類に属するかを見る(=離散値)
    • ②回帰はデータの傾向を見る(=連続値)
  • 深層学習は脳の神経回路を模したニューラルネットワークと呼ばれる学習モデルを用いる 機械学習のこと
  • 機械学習との違いは深層学習は学習モデルが自動的に「特徴量」(ex. 音声データの「声の高さ」、「大きさ」など)を抽出すること

第2章_機械学習の基礎知識

学んだこと

  • 教師あり学習とは答え(ラベル)が含まれたデータをモデルに学習させる方法のこと
    • モデルとは人工知能の脳にあたる部分のこと
    • 最終的な目標は「ラベルのないデータ(テストデータ)を正解させる」こと
  • 教師なし学習とは答え(ラベル)が含まれないデータ(学習データのみ)をモデルに学習させる方法のこと
    • 最終的な目標は「データの特徴をとらえる」こと
    • クラスタリング(データの中から特徴の似ているデータをグループ毎に分ける)が可能
    • 次元削減(データから重要な情報だけを抽出し重要でない情報を削減する)が可能
  • 強化学習とは正解を与えなくても試行錯誤を繰り返しながら最適な行動をするように学習する手法のこと
    • 報酬が高くなるように行動するように仕向ける
  • データを説明するのが統計、データを予測するのが機械学習

第3章_機械学習のプロセスとコア学習

学んだこと

  • モデルは箱であり関数にあたる
  • アルゴリズムは関数の計算をしている
  • バッチ学習は一括学習、オンライン学習は逐次学習
  • 未知のデータに対する予測の精度のことを汎化性能という
  • 汎化性能を検証する上で重要なのは学習データを検証に使わないこと(学習データとテストデータは分ける)
  • 学習データとテストデータの分け方は色々あるが、K-分割交差検証(K-fold, クロスバリデーション)が良く使われる
  • 学習結果に対する評価基準
    • 回帰モデルは予測値と正答値の差である予測誤差を集計する(RMSE(平方平均二乗誤差)など)
    • 分類モデルは混同行列で集計する(F値(f-score)など)
  • パラメータは直線の傾きなどモデルの具体的な値、ハイパーパラメータは何次式にするかモデルの大枠の値
  • 未学習は学習が十分に行われておらず性能が低い
  • 過学習は学習データに対する精度向上を重視することでテストデータに対する精度が下がる
  • ハイパーパラメータを自動で決める手法をオートチューニングという
  • 機械学習ではモデルの中身がブラックボックスとなるため振る舞いの監視が重要

第4章_機械学習アルゴリズム

学んだこと

  • 回帰とは「データに最もフィットする線を引くこと」
  • 回帰分析には単回帰、重回帰、多項式回帰などがある
  • 外れ値の多いデータにはロバスト回帰が有効
  • 正則化過学習を抑える(リッジ回帰、ラッソ回帰)
  • サポートベクターマシン(SVM)はデータを最も引き離す境界線を引くための手法
  • サポートベクター(ベクトル)は境界に最も近いデータのこと
  • マージンはサポートベクターと境界の距離のこと
  • SVMはこのマージンを最大化する
  • 決定木はYES or NOの条件によって予測を行う方法
  • アンサンブル学習は精度の低いモデルを複数合体させ高精度のモデルを作る
  • ロジスティック回帰(シグモイド関数)はYES or NOの確率を計算し予測する(教師あり学習・分類)
  • ベイズ推定は不確実性を考慮し予測だけでなくデータの発生構造にも関心がある
  • 機械学習の区分
  • k
  • 主成分分析は次元削減による情報損失量が小さくなる軸を選び情報の損失を最小限にすること
  • 最適化はある関数(目的関数)の最大または最小となる解を求めること

第5章_ディープラーニングの基礎知識

学んだこと

第6章_ディープラーニングのプロセスとコア技術

学んだこと

  • 順伝播は入力から出力へと情報が伝わっていく流れ
  • 遡って正解と出力値の誤差を小さくしていく(各ノードの重みやバイアスを修正)のが誤差逆伝播
  • 誤差の和である損失関数(目的関数)の値が小さくなるように各ノードの重みを修正する(=学習ないし最適化)
  • 最適化の有名なものに勾配降下法がある
  • 縦軸に「損失関数」、横軸に「重み・バイアス」とし、「下に凸のグラフ」の最小値が最適解とする(=勾配を下っていき平になったら終了)
  • つまり最適化には関数を微分した値(勾配)を使う
  • 勾配は出力側から入力側に伝わっていき(誤差逆伝播法)、層を通過するたびに通過層の勾配が掛けられる
  • 勾配消失問題は「小さな勾配が掛け合わされて最終的に入力側でゼロになる問題」のこと
  • 転移学習は既存モデルの知見を新モデルに移して学習する方法

第7章_ディープラーニングアルゴリズム

学んだこと

  • 畳み込みニューラルネットワーク(CNN)
    • 多次元配列のピクセル同士の位置関係を保持して処理が可能
    • 入力層で位置関係を保持したままデータを取り込むため後段の層で位置関係を生かした処理が可能
    • 画像認識で良く使われる
    • 畳み込み層、プーリング層、全結合層の3つから構成
    • 畳み込み層は特徴マップを生成
    • プーリング層はデータを圧縮
    • 全結合層は特徴量を抽出
  • 再帰ニューラルネットワーク(RNN)
    • データの順番を考慮して予測を行うことが可能
    • テキストデータで良く使われる
    • 色々なアルゴリズムあり
  • 強化学習について
    • モデルベースとモデルフローに大別
    • 前者は環境を考慮し後者は考慮しない
    • 色々なアルゴリズムあり
  • オートエンコーダ
    • 入力データと出力データが同じになるように学習させるNNW
    • 教師なし学習
    • データの次元削減を行うことができる
  • GAN
    • 存在しないデータを生成する
    • 教師なし学習
    • 2つのNNW(生成器と識別器)が競い合うことで学習する
  • 物体検出
    • 画像の中に何が写っているかを認識する技術

第8章_システム開発と開発環境

学んだこと

  • 機械学習は「データ取得」→「前処理」→「機械学習」の手順となり各々でのライブラリ(NumPyなど)の使用が重要
  • ディープラーニングフレームワーク(TensorFlowなど)を使って処理できることが重要
  • 機械学習は並列処理が苦手なCPUでなく得意なGPUにやらせる(Google Colaboratoryなどの仮想環境を使う)
  • 「データ取得」と「前処理」はユーザ側でやり「機械学習」は外部サービスを利用する手もあり

参考文献
機械学習&ディープラーニングのしくみと技術がしっかりわかる教科書
株式会社アイデミー (著), 山口 達輝 (著), 松田 洋之 (著)/技術評論社/2022

REST APIまとめ

気になった用語をまとめた

Webサービスの基本

  • WebAPIとは、HTTPなどのインターネット関連技術を利用してプログラムが読み書きしやすい形でメッセージ送受信を行えるよう定義した規約、または規約を実装して展開されるサービスのこと
  • リクエストの中でCRUDに相当するメソッド(POST、GET、PUT、DELETE)が重要
メソッド 意味
GET リソースの取得
POST リソースの新規登録(データ作成時にリソース名が決まっていない、決まっていればPUTになる)
PUT リソースの更新
DELETE リソースの削除
  • 冪等(べきとう)とは何度実行しても同じ状態が再現されること
  • データ登録(POST)は冪等ではない

REST制約

  • RESTとは設計ルールのこと
  • REST原則は6種類
原則 内容
クライアント/サーバー ・画面(クライアント)とデータ(サーバー)を分離
・トリガー(クライアント)と受け身(サーバー)
階層化システム WEB, AP, DBサーバーの多層アーキテクチャ構成
コードオンデマンド サーバー側を更新してもクライアント側で勝手にDLして新しい環境を手に入れる
統一インターフェース 4つの制約、例えばURIでリソース(サーバーに保存されたデータ)を識別する
ステートレス ・前の状態を保存せず単独で成り立つこと
・サーバーはリクエストだけでコンテキストを理解できる
キャッシュ機能 クライアントはレスポンスをキャッシュできる
  • REST API成熟モデルとは設計レベル4段階のこと(レベル0~3)
レベル 内容
3 レスポンスにリソース間のつながり(ハイパーリンク)を含める
2 一般的なREST。HTTPメソッドを活用。CRUD操作が可能
1 リソースごとにURLを分割。GET, POSTのみ使用
0 基本レベル。HTTPを使っている

REST WebAPIサービス設計(基本)

  • URIはリソースを表現するもの
  • URIは短く、人が読んで理解できる、全て小文字、単語はハイフンでつなげる、単語は複数形にする
ex.
GET http://api.example.com/users-tables/12345
  • URIエンコードを必要とする文字を使わない、サーバー側のアーキテクチャを反映しない、改造しやすい、ルールが統一されている
  • HTTPメソッドをURIに適用するとは、URIは同じでHTTPメソッドを変えることで操作を変えること
ユーザー情報の取得:GET          http://api.example.com/users
ユーザーの新規登録:POST       http://api.example.com/users
  • リソースを特定するパラメータは2つ
クエリパラメーター:URLの末尾に?に続くキーバリュー
GET    http://api.example.com/users?**page=3**

パスパラメーター:URLの中に埋め込まれるパラメーター
GET    http://api.example.com/users/**123**
ステータスコード 意味
100 情報
200 成功
300 リダイレクト
400 クライアントサイドに起因するエラー
500 サーバーサイドに起因するエラー
  • レスポンスのデータフォーマットは3種類
レスポンス 特徴
XML タグ付きのテキスト形式
JSON ・キーバリューのテキスト形式
XMLに比べてデータ量が減らせる
JSONP javascriptのテキスト形式
  • データフォーマットの指定方法
フォーマット 形式
クエリパラメータ http://~users?format=json
拡張子 http://~users.json
リクエストヘッダー GET http://~
Host: api.sample.com
Accept: application/json
設計上はおすすめ
  • データの内部構造について

    • エンベロープ(レスポンスボディ内のメタ情報)は使わない(ヘッダー情報と被るため)
    • オブジェクトはフラットにする(ネストさせない)
    • ページネーションをサポートする情報を返す(キーとなる情報を返す)
    • プロパティの命名規則は統一する(キャメルケースで統一するなど)
    • 日付はRFC3339形式を使う(インターネットでの標準形式)
    • 大きな数値は文字列で返す
  • エラーの詳細はレスポンスボディに入れる

  • エラーの際にHTMLが返らないようにする(application/jsonで返す)
  • サービス閉塞時は「503 + Retry-After」で返す

REST WebAPIサービス設計(応用)

  • 広く公開するサービスであればAPIバージョンを含めたURL設計を行う
  • バージョンを入れる箇所は3箇所
場所
パス http://~/v1/users/
クエリ http://~users?version=1
ヘッダー GET http://~
GData-Version(サービス固有の接頭辞をつける)
設計上はおすすめ
  • バージョンの付け方はセマンティックバージョニングとなる
  • バージョン:1(メジャー). 2(マイナー). 3(パッチ)
  • メジャーは後方互換しない修正
  • マイナーは後方互換する機能追加
  • パッチは後方互換するバグ修正
  • APIはメジャーのみ付けるのがおすすめ
  • 認証は「本人特定」、認可は「アクセス制御」
  • OAuthもOpenID Connectも認可の仕組み
  • OpenID ConnectはOAuthに本人情報取得を加えた仕組み
  • JSON Web Token(JWT)(ジョットと読む)、RFC7519で標準化、データの中身がJSON形式、認証結果をクライアントサイドで保持
  • JWTはセッションに保存するデータ
  • JWTは認証で利用するヘッダーであるAuthorizationヘッダーに埋め込んで利用する
  • WebアプリをAPI化すると簡単に大量アクセスするプログラムが書け、意図しない大量アクセスが発生する可能性がある
  • 対策としては時間あたりのアクセス制限をかける(=レートリミット)
  • レートリミットの主要なアルゴリズムは3種類
  • キャッシュ制御に利用するヘッダーは2分類3パターン
Expires: Sun, 03 May 2020 12:30:00 GMT
・キャッシュとしていつまで利用可能かの期限を指定
Cashe-Control: public, max-age=604800
Date: Sun, 03 May 2020 12:30:00 GMT
・キャッシュの可否、期限を指定
・publicはどこでも保存できる
・max-ageはキャッシュ期限
Last-Modified: Sun, 03 May 2020 12:30:00 GMT
ETag: "4324k23h5h3j2g5hl3h53kj2h5"
・リソースの最終更新日時を指定
・特定バージョンを示す文字列を指定
  • APIスマホアプリ、Webページ、バッチ(外部システム)などから呼ばれる
  • よってセキュリティ対策が必要
脆弱性 内容
XSS 悪意あるユーザーが正規のサイトに不正なスクリプトを挿入することで、正規ユーザーの情報を不正に引き出したり操作できてしまう問題
対策:レスポンスヘッダーの追加
CSRF 本来拒否しなければいけないアクセス元からくるリクエストを処理してしまう問題
対策:攻撃者に推測されにくいトークンの発行と照合処理を実装
HTTP 通信経路が暗号化されていないので盗聴されやすい
対策:HTTPSを利用する
HTTPSSSL+TLSSSL(2015年に廃止)、TLS(後継)は安全に通信を行うためのプロトコル
JWT クライアント側で内容の確認・編集が簡単にできるため、サーバー側の検証が不十分だと改ざんされた情報を正規として受け入れてしまう
対策:ヘッダーのalgに"none"以外を指定して署名を暗号化する

参考:課題

  • REST APIについて自分の言葉でまとめて提出すること
    • REST APIとは、RESTと呼ばれる設計ルールに基づいたインターネット通信の規約または規約を実装して展開されるサービスのこと
  • movieをリソースとして CRUD操作のURI、HTTPメソッドを定義して提出すること
URI HTTP method
GET http://api.example.com/movies GET
POST http://api.example.com/movies POST
PUT http://api.example.com/movies PUT
DELETE http://api.example.com/movies DELETE

参考文献
津郷 晶也, 2023, 「REST WebAPI サービス 設計」, udemy, (2023/9/19取得,https://www.udemy.com/).

「達人に学ぶDB設計徹底指南書」を読む

気になった用語等をまとめる(細かい所はきる)

第1章_データベースを制する者はシステムを制す

学んだこと

システム開発の設計工程 内容
要件定義 必要な機能を決める
設計 実際に作る前に図面を引く
※本書はここがターゲット
開発 プログラムに落とし込む
テスト テストする
3層スキーマモデル 説明
外部スキーマ ユーザーから見てどのようなインターフェースを持っているかを定義(ビュー)
概念スキーマ 開発者から見てデータ同士の関係を定義(テーブル)
概念スキーマの設計を論理設計
内部スキーマ DBから見てデータをどのように格納するかを定義(ファイル)
内部スキーマの設計を物理設計
  • 概念スキーマは外部と内部スキーマの中間にあり両者の変更が影響し合わないように緩衝材の役割

第2章_論理設計と物理設計

学んだこと

  • DB設計は原則論理設計が物理設計に先立つ
論理設計のステップ 説明
エンティティの抽出 どのようなデータが必要か抽出(要件定義の中で決める)
エンティティの定義 どのような属性(列)を持つかを定義
正規化 エンティティ(テーブル)を整理
ER図の作成 エンティティ同士の関係を定義
物理設計のステップ 説明
テーブル定義
インデックス定義
ハードウェアのサイジング サイジングとは大きさを決めること
ストレージの冗長構成決定 冗長とは同じものを複数の場所に持つこと(耐障害性)
ファイルの物理配置決定 ファイルの配置は基本的にはDBMSが自動化
  • バックアップはフル+差分(前回バックアップからのデータを累積的に保持)、フル+増分(前回バックアップからの増分データのみを保持)が基本
  • バックアップファイルをDBに戻す作業をリストア、そのファイルにトランザクションログを適用して変更分を反映する作業をリカバリ
  • 障害復旧の手順は①リストア、②リカバリ

第3章_論理設計と正規化

学んだこと

  • 主キーや外部キーには固定長文字列を用いる
  • テーブルや列名に日本語はNG
  • 主キーは一行に特定するもの
  • 正規化の目的はデータの整合性を保つため
  • 正規化は分割、逆は結合SQL

第4章_ER図

学んだこと

  • テーブル間の関係を表現する
  • IE表記法がわかりやすくておすすめ
  • 多対多の中間にエンティティ(関連実体)を設けて多対一の関係を作る

第5章_論理設計とパフォーマンス

学んだこと

  • 正規化すると結合が必要になりSQLが遅くなるデメリットがある
  • 裏を返すと非正規化ならばSQLで結合を使わなくても済む
  • データの整合性と検索パフォーマンスはトレードオフの関係

第6章_データベースとパフォーマンス

学んだこと

  • データ量が少ない場合はインデックスの効果はない
  • カーディナリティ(列の値の種類の多さ)が高い列ほどインデックスの効果が高い
  • インデックスは検索条件に裸で用いる
  • 主キーは自動的にインデックスになる

第7章_論理設計のバッドノウハウ

学んだこと

  • 情報は意味が取れる範囲で可能な限り分割して保持する
  • 列は一度意味を決めたら変更不可
  • キーは固定長文字列

第8章_論理設計のグレーノウハウ

学んだこと

  • オートナンバリングをアプリケーション側で実装するのはNG
  • 列持ちでなく行持ちテーブルとする

第9章_一歩進んだ論理設計

学んだこと

  • RDB木構造の表現が苦手
  • 色々なモデルが研究されている

最後に

良かったところ

  • DB設計のポイントが示されている点

悪かったところ(もしあれば)

  • なし

学んだこと

  • DB設計のポイントが少しわかった

難しかったこと

  • 全体的に実務で経験しないと腹落ちしない感があった

参考文献
達人に学ぶDB設計徹底指南書
ミック/株式会社 翔泳社/2023

「スッキリわかるSQL入門」を読む(導入は別教材を参照)

気になった用語等をまとめる(第Ⅲ部以降を中心に、細かい所はきる)

導入

学んだこと

select xxx
from xxx
where xxx ~ 正規表現  # ~がポイント

0章

学んだこと

  • 特になし

第Ⅰ部 SQLを始めよう

1章 はじめてのSQL

学んだこと

3命令 意味
select その行の内容を取得する
update その行の内容を更新する
delete その行を削除する
insert その行のデータを追加する

2章 基本文法と4大命令

学んだこと

  • 1章参照

3章 操作する行の絞り込み

学んだこと

  • where句には条件を書く(TRUEとなる行だけが選ばれる)
  • nullとは何も格納されていないもの(ゼロや空白とは異なる)

4章 検索結果の加工

学んだこと

  • distinctは必ずselect文の最初に書く
  • unionなどを使う際は必ず対象テーブルの列数とデータ型を一致させる

第Ⅱ部 SQLを使いこなそう

5章 式と関数

学んだこと

  • ストアドプロシージャとは複数のSQL文をまとめたもの
  • 関数は()を付けるのがポイント
  • coalesceはnullの代替値を決定できる
select coalesce(メモ, 'メモはNULLです') as メモ
from ...

6章 集計とグループ化

学んだこと

  • 集計関数の結果は必ず一行
  • 集計関数はselectかhavingで書く
  • nullを含む計算や比較は基本的に結果はnull、一方で集計関数はnullは無視される
  • groupbyの際にselectに書けるのはgroupbyで指定したカラムか集計関数のみ

7章 副問い合わせ

学んだこと

  • 一行一列、多行一列、多行多列の三パターン
  • 多行一列はinでよく使う
  • inは列挙されたいずれかの値と等しければTRUE(nullを無視する)
  • not inは列挙された値のどれとも一致しなければTRUE(nullがあれば全体の結果がnullとなる)
  • fromのサブクエリはasで別名を付けると速度が早くなる可能性あり
  • 相関サブクエリとはサブクエリからメインクエリの表や列を利用するもの
-- 他のテーブルの値が登場する行のみ抽出(existsを使った典型的なパターン)
-- 繰り返しサブクエリを実行するため負荷大
select *
from A
where exists
(select *
from B
where A.列 = B.列)

8章 複数テーブルの結合

学んだこと

  • 繋ぐべき右表の行が複数ある時左表の行を複製して結合する
  • 自己結合により行間比較を可能にする

第Ⅲ部 データベースの知識を深めよう

9章 トランザクション

学んだこと

トランザクションの指示(これで一つのトランザクションを表す)
begin
xxx
commit -- 変更を確定
xxx
------------
begin
xxx
rollback -- 変更を取り消し
xxx
  • ②はロックにより成り立つ
  • 正確なデータ操作とパフォーマンスは相反するため許容できる分離レベルを決定する
  • ロックの対象は行だけでなくテーブルやDBまで及ぶ
  • デットロックとはトランザクションの処理が途中で永久に止まること

10章 テーブルの作成

学んだこと

  • テーブルへの権限を付与するgrant文、剥奪するrevoke文
  • 人為的ミスを避けるためにはcreate table文に様々な制約を付ける(一貫性)
  • 主キーが果たす二つの責任は「非null、重複なし」

11章 さまざまな支援機能

学んだこと

  • 検索を早くするには指定列にインデックスを張る
  • ビューはselect文を保存する
  • バックアップ(永続性)

第Ⅳ部 データベースの知識を深めよう

12章 テーブルの設計

学んだこと

  • 概念設計での情報の塊をエンティティと言い複数の属性を持つ
  • エンティティはテーブル、属性はカラムのイメージ
  • 概念設計はER図で表す(エンティティ、属性、リレーションを俯瞰して見る)
  • 論理設計では正規化(矛盾したデータを格納できないようにテーブルを分割する)を行う
ステップ 要件
第1正規形 テーブルの全ての行の全ての列に一つずつ値が入っているべきである。よって「繰り返しの列」や「セルの結合」が現れてはならない
第2正規形 複合主キーを持つテーブルの場合、非キー列は複合主キーの全体に関数従属すべきである。よって「複合主キーの一部の列に対してのみ関数従属する列」が含まれてはならない
第3正規形 テーブルの非キー列は主キーに直接関数従属すべきである。よって「主キーに関数従属する列にさらに関数従属する列」は存在してはならない
  • 物理設計ではDBMSの選定、テーブルや列名、型等を決定する

最後に

良かったところ

わかりやすい

悪かったところ(もしあれば)

なし

学んだこと

基本的なSQLの文法や考え方

難しかったこと

なし

参考文献
スッキリわかるSQL入門
中山 清喬, 飯田 理恵子/株式会社インプレス/2018


キノコード / プログラミング学習チャンネル, SQL超入門コース 合併版|SQLの超基本的な部分をたった2時間半で学べます【SQL初心者向け入門講座】(2023/9/14取得).

プロを目指す人のためのRuby入門を読む(一部他教材を参照)

気になった用語や感想をまとめる(使用頻度が高くないもの等細かい所はきる)

導入(下記参考文献2より)

  • putsはpと省略可(微妙に挙動が違う)
  • オブジェクトを操作するのがメソッド「オブジェクト.メソッド」
  • オブジェクトは何らかのクラスに所属する
  • オブジェクト(インスタンス)はクラスから作られる「オブジェクト=クラス.new」
  • 1列は一次元配列、2列以上は多次元配列
  • インスタンス変数はオブジェクトのメソッドからのみ参照できる
  • ただしアクセサを使うとオブジェクトの外から参照できる(ex. attr_accessor :xxx)

第1章_本書を読み進める前に

  • ローカルで環境構築した

第2章_Rubyの基礎を理解する

良かったところ

  • Rubyは変数の型を指定しなくて良いので楽と感じた

学んだこと

  • メソッドの呼び出しは引数のカッコなしでも可だが基本的に省略しない「オブジェクト.引数」
  • 文字列はダブルクオートでないと式展開#{xxx}が使えないため基本的にはダブルクオートを使う
  • 数値の_は無視されるのでコンマ代わりに使うと便利「1_000_000」
  • 整数同士の割り算は整数になる点注意「1 / 2 #=> 0」
  • false又は nilであれば偽
  • if文で条件に合致しない場合はnilが返る
  • 最後に評価された式がメソッドの戻り値になるためreturnは不要
  • 式全体が真又は偽であることを決定するまで左から順に式を評価し式全体の真偽が確定したタイミングで式の評価を終了し最後に評価した式の値を返す「1 && 2 && 3 #=> 3」
  • and, orは優先順位がないので基本的には&&, ||を使う
  • unless, caseはifでも表現可なので基本的にはifを使う
  • ?で終わるメソッドは慣習として真偽値を返す
  • 破壊的メソッドとはオブジェクトの状態を変更してしまうメソッド
  • 破壊的メソッドは慣習として!で終わるメソッドとして表現されることが多い
  • ガベージコレクションとは使用されなくなったオブジェクトを回収し自動的にメモリを解放すること
  • エイリアスメソッドとは同じ実装で名前だけ異なるメソッドのこと
  • gemとは外部ライブラリのこと
  • 自作ライブラリを読み込む場合はrequireでなくrequire_relativeを必ず使う「require_relative "ファイルの相対パス"」
  • ヒアドキュメントとは複数行にわたる長い文字列を作成する際の便利な記法のこと
a = <<TEXT
これはヒアドキュメントです。
複数行にわたる長い文字列を作成するのに便利です。
TEXT
p a
#=> これはヒアドキュメントです。
複数行にわたる長い文字列を作成するのに便利です。

第3章_テストを自動化する

学んだこと

  • テストのクラス名は慣習としてTestで終わる又は始まる名前を付ける
  • テストファイル名はクラス名と合わせる
  • テストはtestで始まるメソッド名に基づき実行されるためテストクラスのメソッド名はtestで始めることが必須
# 基本形
require "minitest/autorun"

class SampleTest < Minitest::Test
  def test_sample
    assert_equal "RUBY", "ruby".upcase # 基本はassert_equal "期待値", "テスト対象"
  end
end

第4章_配列や繰り返し処理を理解する

学んだこと

  • 配列 << 要素で配列の最後に要素を追加「a << 1」
  • pushメソッドの方が複数の要素を一度に追加できるので便利「配列.push(2, 3)」
  • ブロックはメソッドの引数として渡せる処理のかたまり
  • 繰り返しはeachを使う
# 配列の要素を順番に取り出すのはeachが行い、その要素をどうするかはブロック(do~endまで)に記述する
# nはブロックパラメータ
# do endを省略して簡潔に{}とする場合もある
numbers = [1, 2, 3, 4]
sum = 0
numbers.each do |n|
  sum += n
end
sum #=> 10
# 繰り返しの中でsum使用
def to_hex(r, g, b)
  [r, g, b].sum("#") do |n|  # "#"は初期値
    n.to_s(16).rjust(2, "0")  # to_s(16)は整数を16進数に変換
  end
end
  • mapメソッドで各要素に対してブロックを評価した結果を新しい配列で返す
# 繰り返しの中でmap使用
def to_ints(n)
  r = n[1..2]
  g = n[3..4]
  b = n[5..6]
  [r, g, b].map do |s|
    s.hex  # 16進数を10進数に変換
  end
end
  • 配列の連結は+を用いる「a=[1], b=[2,3], a + b #=> [1, 2, 3]」
  • pushを用いて配列の要素を展開して別の配列に追加する場合はを付ける「a=[1], b=[2,3], a.push(b) #=> [1, 2, 3]」
  • メソッドの可変長引数は呼び出される側で*引数とする
  • 文字列.split("区切り文字")で指定した区切り文字で文字列を配列に変換する「"r, j, p".split(",") #=> ["r", "j", "p"]」
  • 添字付きの繰り返しはwith_indexメソッドを使う
# eachの時はeach_with_index 、mapなどはmap.with_index
f = ["a", "b", "c"]
f.each_with_index(1) {|f, i|  # with_index(1)の1は初期値(デフォは0)
  p "#{i}: "{f}"
}
#=> 1: a
#=> 2: b
#=> 3: c
  • 繰り返し処理の入れ子中のbreakは内側の繰り返し処理を抜ける
  • 外側の繰り返し処理も抜ける場合はthrow, catchメソッドを使う
# タグは:doneなど
catch タグ do
  # 繰り返し処理
  throw タグ
end

難しかったこと

  • Rubyは結果が同じ色々な書き方がありわかりずらい(以下同様)

第5章_ハッシュやシンボルを理解する

学んだこと

  • ブロックパラメータが1つだとキーと値が配列に格納される
c = {"japan" => "yen", "us" => "dollar"}
c.each do |key_value|  # パラメータが2つだとkeyとvalueに分かれる
  key = key_value[0]
  value = key_value[1]
  p "#{key}: #{value}"
end
# japan: yen
# us: dollar
  • シンボルとは文字列のようなもので処理効率が良い「:xxx」
  • シンボルをハッシュのキーとして使用する場合は{キー: 値}となりコロンの位置が右になる
  • **でハッシュを展開させる
h = {us: "dolar", india: "rupee"}
p {japan: "yen", **h}
#=> {:japan=>"yen", :us=>"dolar", :india=>"rupee"}
  • ハッシュをキーワード引数としてメソッドに渡す場合は呼び出し側で**ハッシュとする
  • ハッシュから配列への変換はto_aメソッド、配列からハッシュへの変換はto_hメソッドを使う
  • メソッドの引数は種類ごとに並ぶ順番が決まっている

第6章_導入(下記参考文献3-1~4より)

正規表現につき学んだこと

メタ文字 内容 使用例・備考
/正規表現/ Rubyでの正規表現は//の中に記述する よって文中に/を使う場合は\によりエスケープする
\d 1個の半角数字 [0-9]と同じ意味
{n,m} 直前の文字が n 個以上、m 個以下 \d{2,5}
{n} ちょうどn文字
[AB] AまたはBのいずれか1文字 内の文字数制限なし
[a-z] aからzまでのいずれか1文字 -が文中にある場合は範囲を表し-自体を表すのは文頭・文末のみ
? 区切りなし [  ・]?
区切り文字が1文字、 もしくは区切り無し
(ABC)?
文字列 ABC があり、または無し(2文字以上の場合は()でくくる)
. 任意の1文字
+ 直前の文字が 1文字以上 [a-z0-9_]+
(正規表現) 正規表現に ( ) を使うと、正規表現部分がキャプチャ(捕捉)され、連番が付けられる キャプチャする必要がない ( ) は (?: ) のように、?: をつける
? は ( ) の後ろに置くと、「カッコに囲まれた文字列が1個、またはゼロ」を表す
(エディタ上で)$1,$2 キャプチャによりマッチした文字列を xxx, xxx の文字列に置換
* 直前の文字が0文字以上 .*
\w 英単語を構成する文字 [a-z\d_]+とほぼ同じ意味
[^A] A以外の任意の1文字
*? *? や +? にすると最長ではなく、最短のマッチを結果として返す
^ 行頭 ^ +
行頭からスペースが1文字以上続く
の中の先頭で使われる時は否定、の中の文末で使われる時は^それ自身
$ 行末 ^ +$
行頭から行末までスペースが1文字以上続く
\t タブ ^[ \t]+$
\s 空白文字全般 改行文字(\n)も含まれる点注意
ABC|DEF 文字列ABC、または文字列DEF
\r\n Windows環境の改行コード
\b 単語の境界 \bear\b
earと検索
(?<=abc) その文字列の「直後の位置」(abc であれば c の直後)にマッチ
(?=abc) その文字列の「直前の位置」(abc であれば a の直前)にマッチ
(?<!abc) "abc" という文字列 以外 の「直後の位置」にマッチ
(?!abc) "abc" という文字列 以外 の「直前の位置」にマッチ
\1 ( ) でキャプチャされた1番目の文字列 <\a href="(.+?)">\1<\/a>
(.+?) と \1 は同じ文字列を指す

第6章_正規表現を理解する

良かったところ

  • 今まで意味不明な正規表現だったが理解できるようになった

学んだこと

  • 正規表現とはパターンを指定して文字列を効率良く検索、置換するためのミニ言語
  • 文字列と正規表現のマッチには=~を使う
  • マッチした結果は組み込み変数$に代入されるため$&(全体を取得), $1(1番目のキャプチャを取得)のように使用可
  • 正規表現はStringクラスのメソッド(scan, , split, gsub)がよく使われるため使い方留意
# gsubは第1引数の正規表現にマッチした文字列を第2引数の文字列で置き換える
# 基本形
text = "123,456-789"
text.gsub(",", ":") #=> 123:456-789
# 第2引数をブロックの戻り値に置き換え可

第7章_クラスの作成を理解する

学んだこと

  • クラス名は必ず大文字から始める
  • initializeメソッドはデフォルトでprivateメソッドなので外部から呼び出し不可(initialize以外のメソッドはデフォルトでpublic)
  • 値を読み出すメソッドをゲッターメソッド
  • 値を書き込むメソッドをセッターメソッド(下記(def name=(v)のような))
  • インスタンス変数は外部から参照・変更不可、参照・変更する場合は専用にメソッドを作る
  • 変更用のメソッドは=で終わる(使用しない、次のアクセサメソッドを使う)
def name=(v)
  @name = v
end

user = User.new("Alice")
user.name = "Bob"  #=>"Bob"
  • 参照・変更用のメソッドはattr_accessorメソッドが使われることが多い
class User
  attr_accessor :name
# いちいち専用のメソッド(def name=(v)のような)を用意する必要がない
  • 読み取り専用はattr_reader 、書き込み専用はattr_writerメソッドを使う
  • 一つ一つのインスタンスに含まれるデータ(インスタンス変数)は使わない時はクラスメソッドを使った方が便利
class クラス名
  def self.クラスメソッド  # selfがポイント
    # 処理
  end
end
  • Minitestではsetupメソッドを定義するとテストメソッドの実行前に毎回setupメソッドが呼ばれるので共通のオブジェクトはsetupに定義する
  • Rubyの継承は基本的には単一継承(サブクラス < スーパークラス
  • privateの記述より下がプライベートとなるためprivateはクラス内の最後に書くことが多い
  • privateメソッドはサブクラスからも呼び出せる
  • クラスメソッドをprivateにしたい場合はclass << selfの中にprivateと記述する
class User
  class << self
    private

    def hello
      # 処理
  • 定数は必ず大文字から始め、全て大文字が慣習
  • 定数はクラスの外部から参照可能で参照する場合は「クラス名::定数名」
  • 定数はメソッド内で定義不可なので必ずクラス直下又はトップレベルで定義する
  • Rubyの定数は変更しようと思えばできてしまうのでそれを防ぐには工夫が必要
  • グローバル変数はクラス内外どこからでも参照可能で$xxxと記述する

第8章_モジュールを理解する

学んだこと

  • モジュールとは
# クラスと似ているが以下が違う
# ・モジュールからインスタンスの作成不可
# ・他のモジュールやクラスの継承不可

module Loggable
  def log("text")
    puts xxx
  end
end

class Product
  include Loggable # ここがポイント

  log "title is called."
end

# クラスでモジュールをincludeするとモジュールで定義したメソッドがインスタンスメソッドとして呼び出し可
# これをミックスインといい、共通機能をモジュールに持たせることで、多重継承に似た仕組みを実現する
  • モジュールの中にクラスを書くことで同名のクラスがあっても外側のモジュール名で区別できる
  • モジュールに属するクラスを参照する際は「モジュール名::クラス名」

第9章_例外処理を理解する

学んだこと

  • 基本形
begin
  # 例外が起きうる処理
  1 / 0
rescue 捕捉したい例外クラス => e # 慣習でe
  # 例外が発生した場合の処理
  puts e.full_message  # エラーメッセージなどを表示
  retry xxx  # retryでbeginからやり直すことが可能
  raise "#{変数}"  # raiseで意図的に例外を発生させる
end
  • 捕捉したい例外クラスはStandardErrorとなり特殊なエラーは捕捉されない点注意
  • 例外処理は例外が発生しても原則rescueしない、又はrailsの例外処理に任せる
  • 例外処理よりも条件分岐を使った方が可読性やパフォーマンスの面で有利
  • 入力を受け付けるgetsメソッドについて
input = gets.chomp
# chompメソッドで改行を除く
  • printメソッドは文字列を表示した後に改行しない
  • rescueの中でraiseを使うことでログに残しつつ終了させる
  • 独自例外の作成
class NoCountry < StandardError
end

raise NoCountry, "無効な国名です。#{country}"

第10章_yieldとProcを理解する

学んだこと

  • yieldはブロックとメソッドのやり取りの際に利用する
def greet
  # ブロックに引数を渡し戻り値を受け取る
  text = yield "こんにちは"
  puts text  # こんにちはこんにちは
end

greet do |text|
  # yieldで渡された”こんにちは”を2回繰り返す
  text * 2
end
  • ブロックをメソッドの引数として明示的に受け取る時は引数の前に&、ブロックを実行する時はcallメソッドを使う
def greet(&block)
  text = block.call("こんにちは")
  puts text  # こんにちはこんにちは
end

greet do |text|
  text * 2
end
  • Procクラスはブロック(処理のかたまり)をオブジェクト化する
def greet(&block)
  text = block.call("こんにちは")
  puts text  # こんにちはこんにちは
end

repeat_proc = Proc.new { |text|  # Procオブジェクトを作成
                                   text * 2 }
greet(&repeat_proc)  # greetに渡す

第11章_パターンマッチを理解する

学んだこと

  • 3.0verから導入されたため2.0ver代のものはエラーとなる点注意
  • パターンマッチは配列やハッシュの構造をパターン化して条件分岐させる
  • inで=を使わずにローカル変数の宣言と代入を行う
  • case文に似ている
records = [[2021], [2019, 5], [2017, 11, 25]]

records.map do |record|
  case record  # ここからendまでがパターンマッチ
  in [y]  # 1要素のみの配列にマッチ
    Date.new(y, 1, 1)
  in [y, m]  # 2要素のみの配列にマッチ
    Date.new(y, m, 1)
  in [y, m, d]  # 3要素のみの配列にマッチ
    Date.new(y, m, d)
  end
end
# 上記はarrayパターンとなり他にも色々なパターンあり
  • パターンマッチは変数スコープを作らない点注意

第12章_Rubyデバッグ技法を身につける

学んだこと

  • 基本的にはprintデバッグだが原因がつかめず時間がかかりそうな場合はデバッガを使う
require "debug"  # デバッグ用のライブラリ

def fizz_buzz(n)
  binding.break  # ブログラムが停止する箇所(ブレークポイント)
  ・・・
コマンド 説明
s 実行を1行進めて停止する。メソッドがあればメソッドの中に入って停止する(ステップイン)
n 実行を1行進めて停止する。メソッドがあればメソッドを実行してから次の行で停止する(ステップアプト)
f メソッドを最後まで実行し呼び出し元に戻ってきた所で停止する
c 再開する。ブレークポイントがなければ最後まで実行する
p pメソッドのように指定された値を表示する

第13章_Rubyに関するその他のトピック

学んだこと

  • Bundlerは1つのコマンドで大量のgemをどの環境でも同一のバージョンでインストール可
  • 素のRubyなのかRailsRubyなのかを意識して使う(Rails特有のRubyの使い方があるため)

その他(下記参考文献4より)

自己学習(課題)の中で気になった文法をまとめる

  • %w[A B C]
    • カンマでなく空白文字、クオートなしで配列を作る
  • 配列.sample
    • ランダムに要素を一つ取得する
  • rand(2..3)

    • 2, 3からの整数を返す
  • optparseの使い方について

    • OptionParser オブジェクト opt を生成する
    • オプションを取り扱うブロックを opt に登録する
    • opt.parse(ARGV) でコマンドラインを実際に parse する
# parse!実行後にはオプション(-m)が配列から削除
opt = OptionParser.new
opt.on('-m') { |v| p v }  #=> ["-m", "12"]
p ARGV  #=> true
opt.parse!(ARGV)
p ARGV  #=> ["12"]
  • (1..12).to_a
    • 1から12の配列を作る
  • 配列.include?(値)
    • 配列に値が含まれていればtrueを返す
  • Date
    • require 'date'を読み込み日付等を扱うDateクラスが使える
  • if文は戻り値を返す
  • 文字列.center(20)
    • 空白文字で中央寄せ
  • rjust
  • ""の使い方について
    • "\n"ではなく'\n'とするとエスケープ処理となってしまうため注意
    • 式展開#{}を使う際は""が必須
  • 末尾のprint "\n"について

    • ⚫︎
  • puts, print, p, ppについて |用語|説明| |---|---| |puts|・改行あり
    ・クオーテーションなし表示| |print|・改行なし
    ・クオーテーションなし表示| |p|・改行あり
    ・ダブルクオートで表示| |pp|整形して表示|

参考文献
1. プロを目指す人のためのRuby入門[改訂2版] 言語仕様からテスト駆動開発・デバッグ技法まで
伊藤 淳一/ Software Design plus/2022

2-1. キノコード / プログラミング学習チャンネル, 【たった1時間で学べる】Rubyのプログラミング初心者向けの超入門講座【文字書き起こし、ソースコードも完全無料!】 (2023/8/21取得,https://youtu.be/0DO5bsQB5So).

3-1. 伊藤 淳一 / 初心者歓迎!手と目で覚える正規表現入門・その1「さまざまな形式の電話番号を検索しよう」 (2023/8/23取得,https://qiita.com/jnchito/items/893c887fbf19e17d3ff9).

3-2. 伊藤 淳一 / 初心者歓迎!手と目で覚える正規表現入門・その2「微妙な違いを許容しつつ置換しよう」 (2023/8/23取得,https://qiita.com/jnchito/items/64c3fdc53766ac6f2008).

3-3. 伊藤 淳一 / 初心者歓迎!手と目で覚える正規表現入門・その3「空白文字を自由自在に操ろう」 (2023/8/23取得,
https://qiita.com/jnchito/items/6f0c885c1c4929092578).

3-4. 伊藤 淳一 / 初心者歓迎!手と目で覚える正規表現入門・その4(最終回)「中級者テクニックをマスターしよう」」 (2023/8/23取得,https://qiita.com/jnchito/items/b0839f4f4651c29da408).

4-1. Ruby 3.2 リファレンスマニュアル(2023/8/27取得,
https://docs.ruby-lang.org/ja/latest/library/optparse.html).

dockerとdocker composeでwebアプリをdocker化する方法

webアプリをdocker化する目的

  • webアプリの作成には色々なパッケージやツールの設定が必要なため環境構築が大変
  • 環境構築を簡単にしてwebアプリの作成に注力するためにdockerのコンテナを用いる
  • コンテナにパッケージやツールの設定を行いコンテナ上でwebアプリを作成する

webアプリをdocker化する方法

環境構築方法

1. リポジトリrails-dockerを以下コマンドよりローカルにcloneする
git clone https://github.com/sousou1216/rails-docker.git

2. 以下サイトよりDockerのインストールを行う(インストール済みの方はスキップ)
https://docs.docker.com/engine/install/

3. 以下コマンドよりコンテナを作成・起動する
docker-compose up -d

4. ブラウザ上で以下URLを打ち込みアプリが起動していることを確認する
http://localhost:3000/

5. 以下コマンドよりコンテナを終了する
docker-compose stop

6. コンテナを再起動する場合は3のupコマンドを実行する

7. タスクを初期化したい場合は以下コマンドよりコンテナを削除後3のupコマンドを実行する
docker-compose down

参考文献
Docker-docs-ja, 2023, (2023/8/21取得,https://docs.docker.jp/compose/rails.html).
かめ れおん, 2023, 「米国AI開発者がゼロから教えるDocker講座」, udemy, (2023/8/19取得,https://www.udemy.com/).

Dockerまとめ

気になった用語をまとめた

Linuxについて

  • Linuxのコンテナ技術を使用するためLinuxの知識が必要
  • shell(bash, zsh...)を仲介してkernelにアクセスする
  • ターミナルはshellを動かすためのアプリ(shellとは別の概念)
  • 環境変数とはOS上で動くプロセスが情報を共有するための変数
  • echo $SHELLでshellのpathを表示
  • export AGE=20などで環境変数を作成
  • export $AGEなどで環境変数を表示

Dockerについて-基礎

  • 基礎コマンド

    • docker login
    • docker pull image名→pullする前に対象のイメージがローカルにある場合は削除が必要
    • docker images
    • docker run image名→create(コンテナの作成) + start(デフォルトコマンドの実行と exit )
    • docker ps -a
    • docker run -it image名 bash→コンテナの中のbashを操作する
    • exit→コンテナから出る(基本的にはこちらを使う)
    • ctrl+p+q→コンテナから出るがプロセス起動(up)のまま(デタッチという)
    • docker restart コンテナ名→コンテナ起動
    • docker exec -it コンテナ名 bash→(コンテナ起動後)コンテナへ入る
    • docker attach コンテナ名→ (元のプロセスの) コンテナへ入る
    • docker commit コンテナ名 新image名:tag名→コンテナから新イメージを作る
    • docker tag 旧イメージ名 新イメージ名→イメージ名の変更
    • docker push Hub上のユーザ名/ イメージ名→pushするイメージはHub上のリポジトリ名と同じ必要がある
    • docker rmi イメージ名→イメージの削除
    • docker image prune -a→全てのイメージの削除(コンテナ削除後に実行)
    • docker stop コンテナ
    • docker rm コンテナ名→stopしてから実行(-fで停止+削除)
    • docker system prune→コンテナ全削除
    • docker inspect コンテナ名→コンテナの詳細(CPU, メモリの上限等)を表示
  • runのオプション

    • -itは-i:インプット可能(ホストからコンテナへ接続)、-t:出力を綺麗に表示、を組み合わせたもの
    • 起動させ続ける、共有サーバを使うときは run --name 名前 でコンテナに名前を付けるのがよい
    • -dはコンテナ起動後にupとなりバックグラウンドで動かす
    • -rmはコンテナExit後に削除する(一回きりのコンテナ)
    • -v hostの絶対path:containerのpath はホストのファイルシステムをコンテナにマウントする
    • -u $(id -u):$(id -g)は所有者とグループ権限を設定する
    • -p host_port:container_portはホストのポートをコンテナのポートにつなげる
    • runは対象のイメージがなければHubから自動でpullをする
  • Dockerfile

    • imageの設計図のこと(imageからでは詳細がわからない)
    • テキストファイル形式
    • docker build -t name . →(dockerfileがあるディレクトリで)dockerfileからイメージを作成
    • FROM ベースとなるイメージを決定、FROMから書き始める、大半がOSを指定
    • RUN Linuxコマンドを実行し必要なパッケージをインストールする等、 イメージレイヤーを作る(書きすぎるとimageが大きくなるので最小限にする)、コンテナ内のroot直下で実行される(実行場所を変える場合は&&でつなぐかWORKDIRを記述する)
    • 最小限にするにはコマンドを&&でつなげ、\で改行し、一行にまとめる
    • ただし、Dockerfileをメンテする際はRUNを複数行に分けて書くことでcacheを利用し、うまくインストールすることが確認できたら最後に&&で一行で書くのがよい
    • CMD デフォルトコマンドを指定する([""]を記述)、 最後に記述する、 イメージレイヤーを作らない(イメージレイヤーがないためimageを起動する際に初めて実行する)
    • COPY(ADD) ファイル 移動先ディレクト
    • docker build -f Dockerfilename build contextでbuild contextにDcokerfileがない場合のビルドの方法
    • ENTRYPOINTを設定するとCMDの上書き不可(参考程度でよい)
    • ENV key value環境変数を設定する
    • WORKDIR /optで他のユーザが作業しやすいように/optとするのが一般的
    • コンテナ上でインストールが可能なコマンドを確認してそれをDockerfileに記述していくのが実務の流れ
  • 全般

    • コンテナ上で環境構築していく
    • Docker起動時はデフォルトでroot権限となるため注意
    • Docker Hub上のリポジトリ名について二単語以上は-でつなぐ
    • Dockerレジストリはイメージを保管する所でその一つがDocker Hub
    • イメージはtagでバージョン管理
    • コンテナを実行した際のデフォルトコマンドが何か、デフォルトコマンドを上書き出来る点が重要(run image名 デフォルトコマンド名)
    • 同じ名前のコンテナを作成することは不可
    • ホスト、コンテナ間の独立性があるのが重要
    • Docker daemonはイメージやコンテナを管理する
    • build contextとはDcokerfileがあるディレクトリのこと
    • buildすることでbuild contextがdaemonに渡される
    • ADDやCOPYでbuild contextの中にあるファイルをimageに持っていける
    • 単純にファイルやフォルダをコピーする場合はCOPYを使う
    • tar圧縮ファイルをコピーして解答する場合はADDを使う
    • コンテナをwebサーバーとすることはよくある
    • その際ホストのportとコンテナのportをつなげることをパブリッシュという
    • sh -x shファイル でshファイルのオプションを確認
    • command+pでファイルを開くショートカット

PATHを通すとは

  • 環境変数$PATHにパスを追加することでPCがプログラムをそのパスから探してきてくれるようになる
  • echo $PATHで今どこにパスが通っているか確認する
  • export PATH=/path/to/something:$PATHでパスを追加する

Dockerについて-応用

  • AWS関連

    • インスタンス作成時にキーペアを設定するとpemファイルが作成DLされ、AWSSSH接続する際の鍵として使用する
    • pemファイルはchmod 400 file で権限を設定する(詳細はググる
    • ssh -i pemファイル username@hostnameでSSHAWSへ接続する、hostnameはインスタンスのパブリック IPv4 DNSを指定
    • ローカルからホストのAWSへ接続する
    • ホスト(AWS)にDockerをインストールしコンテナをたてる
    • docker save イメージ > xxx.tar でイメージをtarファイルに圧縮する
    • sftp -i pemファイル username@hostnameでSFTPでtarファイルをAWSへアップする
    • sftp接続後、put ローカルのtarファイルのパス でAWSへファイルをアップする
    • sftp接続後、get リモートのtarファイルのパス でローカルへファイルをDLする
    • ssh接続後、docker load < tarファイル でイメージを解凍
    • GPUとはグラフィックのことで計算が得意
  • Docker compose

    • コンテナを複数使う場合又はdocker runコマンドが長くなる時に有用
    • 1コンテナ1サービスが原則
    • コンテナをどのように起動するかを記述するファイル(runコマンドのオプションに該当)
    • docker-compose up (--build) →build+runを実行(imageを更新した時は--buildを付ける)
    • docker-compose ps
    • docker-compose down →stop+rmを実行
    • docker-compose exec web(サービス名) bash →コンテナに入る
    • rails s -b 0.0.0.0 →コンテナ上で実行するとrailsサーバが立ち上がる(0.0.0.0とはローカルホストのこと)

CICD

  • Travis CIはCIツール(テスト・デプロイツール)の一つ
  • .travis.ymlファイルにテストの流れを記述し Githubにpushした時に(mainでなくとも) その通りに自動でテストが実行される
  • Herokuはアプリケーション実行環境の一つ
  • HerokuとGitHubを連携させ、 GitHubのmainにプッシュした時に テスト後に自動で本番環境に新しいバージョンのアプリがデプロイされる
  • デプロイコードは.travis.ymlファイルに記述する

参考文献
かめ れおん, 2023, 「米国AI開発者がゼロから教えるDocker講座」, udemy, (2023/8/19取得,https://www.udemy.com/).