REST APIについて

RESTとは

REpresentational State Transferの略で、分散型システムにおける設計ルールのこと。

RESTfulとは

RESTで求められる原則に従っていること。

REST原則

  1. クライアント/サーバ

  2. 階層化システム 3層構成(多層アーキテクチャ構成)のWEB→AP→DBのことそのもの。

    メリット:各コンポーネントに役割を決めて独立させ進化と再利用が促進できる
    デメリット:データ処理にオーバーヘッドが発生。応答が悪くなる

  3. コードオンデマンド
クライアントコードをダウンロードして実行できる。
リリース後にクライアントコードを変更できる。

    メリット:リリース済みのクライアントに対して機能追加可能、クライアントに処理が移譲されサーバの負荷が下がる
    デメリット:評価環境が複雑になる

  4. 統一インターフェース

    1. リソースの識別:URIを用いてサーバに保存されたデータを識別する
    2. 表現を用いたリソース操作
    3. 自己記述メッセージ
    4. アプリケーション状態エンジンとしてのハイパーメディア
  5. ステートレス

    通信のたびに状態(ステート)を保持しない サーバはリクエストだけでコンテキストを理解できる

  6. キャッシュ制御

REST APIの設計レベル

LEVEL3→2に加えてレスポンスにリソース間のつながりがある
LEVEL2→1に加えてHTTPメソッドを活用(一般的に使用される)
LEVEL1→リソースごとにURLが分割
LEVEL0→REST APIの基本レベル

CRUD操作のURIとHTTPメソッド

movieをリソースにして、CRUD操作のURI、HTTPメソッドを定義しました。

URI HTTP method リソースごとの操作一覧
/movies GET ムービー情報一覧取得
/movies POST ムービーの新規登録
/movies/12345 GET 特定ムービーの取得
/movies/12345 PUT ムービーの更新
/movies/12345 DELETE ムービーの削除

「達人に学ぶDB設計 徹底指南書 初学者で終わりたくないあなたへ」を読んで

はじめに

「達人に学ぶDB設計 徹底指南書 初学者で終わりたくないあなたへ」を読了したのでその感想をまとめます。

良かったところ

  • 図の解説が適切なタイミングで挿入されていたので理解の助けになると同時に、初学者の私にとってわかりやすく感じる部分が多々ありました。
  • 設計のバッドノウハウアンチパターンに関する記載は、非常に参考になりました。自分が避けるべき落とし穴や注意点を学ぶことができました。

学んだこと

学んだことをNotionにてまとめています。

mammoth-penalty-977.notion.site

難しかったこと

  • 「初学者で終わりたくない」という表題通り、SQLの基礎をすでに習得している人を対象としている印象を受けました。初学者にとっては、少し難解な内容かもしれないと感じました。
  • 最終章で取り上げられている木構造については、正直なところ、一読しても理解するのが難しかったです。ただし、将来的に必要になる可能性もあるため、参考になると思いました。
  • 筆者が非正規化に関して原則的に許容しないスタンスを取っている一方で、切羽詰まった時には最後の手段として非正規化も辞さないと記載されている点について、少し困惑しました。

以上が、感想になります。本書を1日で読破したというコメントを見かけましたが、私自身は1週間ほどかかってしまいました。技術書の読み方についてもう少し考えていきたいと思います。

スッキリわかるSQL入門を読んで

はじめに

「スッキリわかるSQL入門」を読了したのでその感想をまとめます。

良かったところ

  • Web上で環境が提供されているため、実際に手を動かしながら学習することが容易でした。これは非常に良い点だと感じました。
  • SQLに関する内容だけでなく、正規化やER図についても軽く触れられており、基礎的な知識を増やすことができました。
  • 各章には小さな演習問題もあり、学んだ知識を振り返るのに役立ちました。

学んだこと

学んだことをNotionにてまとめています。

mammoth-penalty-977.notion.site

難しかったこと

  • ドリルとして200問以上の問題が用意されているのはとても良いと感じました。ただ、解答にはSQL文が羅列されているだけであり、学習者にとっては理解しにくい部分もありました。解き方や考え方などが記載されていると、より理解力が高まると思います。
  • 第12章の正規化については、私の理解力の限界もあって、一通り読み進めるだけの感じになりました。正規化は重要な要素だと感じていますが、自分が実際にテーブル設計に取り組むとなると、まだまだ十分に使いこなせないため、他の学習書を使ってさらに理解を深めたいと思っています。

以上が、「スッキリわかるSQL入門」に対する私の感想です。
この本を通じて、SQLの基礎知識を習得することができましたが、まだまだ学ぶべき点も多いと感じています。
今後もSQLの学習を継続し、実践的なスキルを身につけていきたいと思います。

【Ruby】optparseについて

optparseとは

optparseは、コマンドラインのオプションを取り扱うためのライブラリです。
コマンドを実行するとき、”-a”(任意の文字)のようにオプションを指定することができる。
また、Ruby標準ライブラリの一部のため、インストールなどは不要で簡単に利用できます。

基本的な使用例

1 optpaseをrequireする

require 'optparse'

2 OptionParserオブジェクトoptを生成する

opt = OptionParser.new

3 オプションを取り扱うブロックをoptに登録する

opt.on('-a') {|v| p v }

onメソッドはオプションを定義し、引数が指定されたときの処理をブロックで記述する。
ブロックの引数にはオプションが指定されたことを示す true が渡される。
onメソッドが呼ばれた時点ではブロックは実行されず、登録のみが行われる。

4 opt.parse(ARGV) でコマンドラインを実際にparseする

opt.parse!(ARGV)

parseメソッドが呼ばれた際に、コマンドラインにオプションが指定されていればブロックが実行される。

require 'optparse'
opt = OptionParser.new

opt.on('-a') {|v| p v }
opt.on('-b') {|v| p v }

opt.parse!(ARGV)
p ARGV


$ ruby sample.rb -a foo bar -b baz
# => true
     true
     ["foo", "bar", "baz"]

オプション

OptionParser自体は、どのオプションが指定されたかを記憶しないため、その後の処理でオプションによる条件を使用する場合は、別にコンテナ格納する必要がある。

require 'optparse'

# OptionParser インスタンスの生成
opt = OptionParser.new

# オプションに対するパラメータを格納するハッシュ
params = {}

# -a オプションの処理
opt.on('-a') { |v| params[:a] = v }

# -b オプションの処理
opt.on('-b') { |v| params[:b] = v }

# コマンドライン引数の解析
opt.parse!(ARGV)

# 解析結果の表示
p ARGV
p params


$ ruby sample.rb -a foo bar -b baz
# => ["foo", "bar", "baz"]
     {:a=>true, :b=>true}

ロングオプション

ショートオプションの他にロングオプションも定義できる。 onメソッドでオプション定義するときにショートオプションと一緒にロングオプションとして渡したい値を指定する。

require 'optparse'
opt = OptionParser.new

opt.on('-a', '--foo') {|v| p v }
opt.on('--bar') {|v| p v }

opt.parse!(ARGV)
p ARGV

$ ruby sample.rb -a foo bar --bar baz
# => true
     true
     ["foo", "bar", "baz"]

プロを目指す人のためのRuby入門を読んで

はじめに

Rubyの有名な技術書「プロを目指す人のためのRuby入門」を読了したのでその感想を書きます。

良かったところ

解説が丁寧でわかりやすいです。
各章で例題が配置されている点、現場目線で注意書きがされているのがありがたいなと感じました。 (例えば、現場ではXXは滅多に使わず、XXXをよく使います。といった感じで記載してくれている。)
筆者の人柄や気遣いが伝わる書籍でした。

学んだこと

6章

  • ハッシュの展開(**)
    • **をハッシュの前につけるとハッシュリテラル内で他のハッシュの要素を展開できる
h = { us: 'dollar', india: 'rupee' }
{ japan: 'yen', **h } #=> {:japan=>"yen", :us=>"dollar", :india=>"rupee"}

mergeメソッドも同じ働き

h = { us: 'dollar', india: 'rupee' }
{ japan: 'yen' }.merge(h) #=> {:japan=>"yen", :us=>"dollar", :india=>"rupee"}
  • ハッシュの擬似キーワード引数

ハッシュを受け取ってキーワード引数のように見せる

def buy_burger(menu, options = {})
  drink = options[:drink]
  potato = options[:potato]
  # 省略
end

buy_burger('cheese', drink: true, potato: true)
# buy_burger('cheese', { drink: true, potato: true })と同じ
# 最後の引数が {}の時だけ省略可能

’擬似’キーワード引数だと、未定義のキーワードでもエラーにならない。

buy_burger('fish', salad: true)

ただし未定義の’キーワード引数’だとエラーになる。

def buy_burger(menu, drink: true, potato: true)
  # 省略
end

# saladとchickenは無効なキーワード引数なのでエラーになる
buy_burger('fish', drink: true, potato: false, salad: true, chicken: false)
#=> ArgumentError: unknown keywords: salad, chicken

エラー回避(任意のキーワード引数が必要の場合)は**を使う

**引数

def buy_burger(menu, drink: true, potato: true, **others)
  # othersはハッシュとして渡される
  puts others
  # 省略
end
#=> {:salad=>true, :chicken=>false}

呼び出し元の引数で設定する例

params = {drink: true, potato: true}
buy_burger('fish', params)
#=>エラー

# **を使う
buy_burger('fish', **params)

7章

  • self.nameと@nameを基本的に同じという理解
  • privateメソッドになるのはインスタンスメソッドのみでクラスメソッドはprivateにならない
  • .freezeは、オブジェクトを変更不可能にするメソッドで、対象のオブジェクトは後からの変更が禁止される(エラー)。文字列や配列などのミュータブルなオブジェクトに対して使用され、不用意な変更を防ぐのに役立つ。
  • ダックタイピングとはオブジェクトの型やクラスよりも、その振る舞いや機能が重要であるプログラミングスタイルのこと

8章

  • モジュールの用途
    • 名前空間の作成
    • ミックスイン
    • 特異メソッドの追加
    • モジュール関数の提供
  • Enumerable モジュールは、配列やハッシュなど繰り返し処理を行うクラスにincludeされるモジュール
  • Comparable モジュールは、クラスに対して比較演算子<, <=, ==, >=, >)を可能にするモジュール

9章

  • 例外処理の構文
begin
 # 例外が起きうる処理
rescue
 # 例外が発生した場合の処理
end
  • 例外自身もオブジェクトとなる
    • 例えばmessageメソッド、backtraceメソッドなどがある
  • 情報を取得したい場合の構文
begin
 # 例外が起きうる処理
rescue => 例外オブジェクトを格納する変数
 # 例外が発生した場合の処理
end

例文

begin
  1 / 0
rescue => e
  puts "エラークラス: #{e.class}"
  puts "エラーメッセージ: #{e.message}"
  puts "バックトレース -----"
  puts e.backtrace
  puts "-----"
end

省略形としてeやexを使用することが多い

  • クラスを指定して補足する例外を限定させることも可能
begin
 # 例外が起きうる処理
rescue 補足したい例外クラス
 # 例外が発生した場合の処理
end

例文

0で徐算した場合に発生するZeroDivisionError

begin
  1 / 0
rescue ZeroDivisionError
  puts "0で除算しました"
end
#=> 0で除算しました

ZeroDivisionError以外のエラーが発生した場合はどうなるかと言うと例外は捕捉されない=プログラムが以上終了する

以下は、ZeroDivisionErrorを記載しているコードで存在しないメソッドを呼び出した例

begin
  # NoMethodErrorを発生させる
  'abc'.foo
rescue ZeroDivisionError
  puts "0で除算しました"
end
#=> NoMethodError: undefined method `foo' for "abc":String
  • 例外クラスにも継承関係がある
    • 全ての例外クラスはExceptionを継承している
  • rescue節に指定しない場合はStandardErrorとそのサブクラスが捕捉される。 その場合特殊なエラー(Nomemory ErrorやSystemExit)などは捕捉されない
  • 例外処理よりも条件分岐を使うべし
  • 例外が発生してもしなくても必ず実行したい処理がある場合はensureに記載
begin
 # 例外が発生するかもしれない処理
rescue #(※rescueは任意なので書かなくても問題ない)
 # 例外発生時の処理
ensure
 # 例外の有無に関わらず実行する処理
end
  • 例外が発生しなかった場合の処理はelseに記載
  • 例外処理にも戻り値があり、正常処理の場合はbegin内の最後、例外発生時はrescueの最後が戻り値になる

10章

  • yieldを使うと渡されたブロックを実行する ブロックに引数を渡したり、ブロックの戻り値を受け取ったりができる
  • yieldとブロックでやり取りする引数は個数の過不足に寛容
  • ブロックを引数として受け取る場合は引数名の前に&をつける ブロックを実行するときは.callを使う
def メソッド(&引数)
    引数.call
end
  • Procオブジェクトを作る方法
    • Proc.new
    • procメソッド
    • 構文 - >
    • lambdaメソッド

11章

  • パターンマッチとは「データ構造による条件分岐」「構成要素の取り出し」という要素を備えた機能とのこと。 条件分岐などの用途で使われる。
case 式
in パターン1
  パターン1にマッチした時の処理
in パターン2
  パターン1にマッチせず、パターン2にマッチした時の処理
else
  パターン1,2にマッチしなかったとき
end
  • ver3.0から正式に導入された

12章

  • エラーが発生するとバックトレースが出力される
    • 実行環境によって表示形式が変化する
    • 下に行くほどエラーが古い(上のエラーが新しい呼び出し)
  • よく発生する例外
    • NameError
      • 未定義のローカル変数や定義を呼び出したとき
    • NoMethodError
      • 存在しないメソッドを呼び出そうとしたとき
        • メソッド名違い
        • privateメソッドをクラス外から呼び出したとき
        • レシーバの型が想定していた型と異なるとき
        • レシーバが想定と違いnilのとき
    • ArgumentError
      • 引数の数が違ったとき、期待値ではなかったとき
    • SyntaxError
      • 構文エラー、endやカンマに過不足がある時など
  • デバッグでプログラムの途中経過を確認
    • printデバッグ
      • printメソッドをプログラムに埋め込んで、プログラムを実行し、ターミナルに出力される値を確認して不具合の原因を探る
    • logger.debugでデバッグ情報をログに出力する
    • デバッガ(debug.gem)を使う
      • プログラムを1行ずつ実行しながら変数の中身を確認したり、実行される条件分岐を確認したりできる
  • その他トラブルシューティング
    • irb上で簡単なコードを動かす
    • ログを調べる
    • 公式ドキュメントやリファレンスを読む
    • issueを検索する
    • ライブラリのコードを読む
    • テストコードを書く
    • (警戒しながら)ネット情報を参考にする
    • パソコンの前から離れる
    • 誰かに聞く

13章

  • 日付、時刻
    • Timeクラス
      • 組み込みライブラリのためrequireの必要なし
    • Dateクラス
      • require必須
  • ファイルやディレクト
    • Fileクラス、Dirクラス
      • 組み込みライブラリのためrequireの必要なし
  • Rake
    • Rubyで作られているビルドツール、「何かしらのまとまった処理」を簡単に実行するためのツールとして使われる
task :hello_world do
  # ブロックの中がタスクとして実行される処理になる
  puts 'Helloc'
end
$ rake hello_world
Hello, world!
  • gemとBundler
    • Rubyのライブラリはgemという形式でパッケージングされる 作成したgemはRuby.Gems.orgにてアップロード、インストールできる
      # fakerというgemをインストールする場合
      $ gem install faker
      $ gem install faker -v 2.16.0
    
    • Bundlerを使うと1つのコマンドで大量のgemをどの環境でも同一のバージョンでインストールすることができ、PJでgemが統一される
    • Gemfile.lock
      • Bundlerで管理すべきgemとそのバージョン番号が記載されている
      • Bundle installすると自動的に作成される

難しかった所

初心者向けではないと本に記述されている通り、全体的に私には難しい技術書でした。
6章まではわかりやすく、理解も大丈夫そうでしたが、7章以降どんどん難しくなってきたので「無理に全部理解しようとせず、頭の中にインデックスを作る読書スタイルに切り替えてもOKです」という筆者の言葉通りに読み進めました。
正直、読了後の自身の理解度は5割に満たないように思いますが、今後課題などを進めていく時にまたこの本を振り返れるようにしたいと思います。

GitHub Pagesを使ってWebページを公開する方法

GitHub Pages

GitHub Pagesは、GitHubが提供する無料のホスティングサービスでユーザが簡単に無料で(静的な)Webページをインターネット上に公開できるサービスです。

ページ公開の流れ

  1. GitHubで新規アカウント作成
  2. GitHubで新規リポジトリ作成
  3. ウェブサイトのファイルを作成しアップロード(プッシュ)
  4. GitHub Pagesの設定
  5. ウェブサイトの確認

手順

1 . GitHubで新規アカウント作成

初めに、GitHubアカウントを作成します。 既にアカウントを持っている場合は、次に進んでください。

2 .新しいリポジトリを作成

GitHubで自分のページへ遷移。
右上にあるプラスボタンからNew repositoryをクリック

new_repo

Create a new repository画面で、Repository nameを任意名称で入力します。
無料プランではPublicにしないとGitHub Pagesの設定ができないため、Publicのままにします。

create_repo

ページ下部にある、Create repositoryボタン(緑色)を押して、リポジトリを作成します。

その後、以下の画面へ遷移します。
赤枠で囲ってある部分のURLを後ほど使用します。

3 . ローカルで任意のフォルダを作成する。

$ mkdir test_web_dir

# 作成したフォルダ内に移動
$ cd test_web_dir

#リポジトリの初期セットアップ
$ git init

# git initの実行後に、.gitフォルダが作成される

4 . 新しくファイルを作成する

htmlファイルやcssファイルなどを作成する

5 . 作成したファイルをリポジトリにコミットする

$ git add .

$ git commit -m "first commit"

6 . リモートリポジトリにプッシュする

# 現在のローカルリポジトリに指定したリモートリポジトリを追加
# originの部分は好きな名称をつけて問題ない
$ git remote add origin https://github.com/ユーザ名/test_web.git

# masterブランチからmainへ名称変更
$ git branch -M main

$ git push -u origin main

7 . GitHubへアクセスして設定する

当該リポジトリでSettingsをクリックする

Pagesをクリック

mainブランチに変更し、Saveボタンをクリック

数分待ち、ページリロードするとアドレスが表示される

GitHub Pagesへアクセスして確認する
※エラーが出てページが見れない場合はURLにフォルダ名、htmlファイル名を指定すると確認可能になる。
ex) https://ユーザ名.github.io/test_web/index.html

9月のプログラミング学習振り返り

8/27からHappinessChainというプログラミングスクールで勉強中です。

9月の振り返りを行いました。

9月の合計学習時間

125h

学習内容

  • Progate
    • 合計8コース完了
  • ブログ開設
  • Web技術の基本
    • 書籍1冊読了
    • 記事作成
  • Vim
    • 動画教材1本視聴完了
    • 記事作成
  • Linux
    • 動画教材1本視聴完了
    • 教材読了
    • 記事作成
  • Git&Github
    • 動画教材1本視聴完了
    • 基本操作の確認完了
  • HTML&CSS

    • 動画教材1本視聴中
  • その他

    • SNSで毎日勉強内容を投稿

KPT

振り返り手法の一つ、KPTで毎月の学習振り返りをしたいと思います。

Keep = 継続 = 良かったこと

Problem = 問題点 = 改善が必要なこと

Try = 挑戦 = 次に取り組むこと

Keep

  • 毎日勉強時間を作った
  • GithubSNSでデイリーレポートを毎日投稿
  • コード記載時はvimを使用していて慣れてきている

Problem

  • Progateは一度やっているにも関わらず、完了させるのにスピードが遅かった(だれていた)
  • 圧倒的に学習時間が足りていない
  • gitのまとめ記事を書きたかったが時間がなく書けていない
  • 英語の勉強をスタートできなかった

Try

  • 10月からは英語学習にも取り組む
  • 10月の学習時間は155時間に設定
  • カリキュラム外で技術書を購入してインプットする

所感

Problemが多い1ヶ月となった印象です。

毎日スクールのロードマップに沿って勉強を進めてきましたが、まだまだ時間を費やして学習できると考えています。

10月はHTLM/CSS、Docker、Rubyまでカリキュラムを進める目標で頑張っていく。

とにかく、時間をかけてコツコツ頑張るしかないと思ってます。

10月の目標合計時間

  • 毎日5h × 31日で155hを目指します!