目次
背景
最近Rubyだったり、TypeScriptだったりを実務で触って、いろんな概念がごっちゃになっているなと感じたので、とりあえずRubyを復習しました。
Rubyで知ったこと
コマンドライン引数
lsコマンドに渡す -lやcpコマンドに渡すファイル名などは、コマンドライン引数と呼ばれます。Rubyでは、コマンドライン引数をARGVという配列変数が保持しています。
puts "count = #{ARGV.count}" // => 3 ARGV.each do |i| puts i end # => ruby1 # => ruby2 # => -l
上記のコードをコマンドライン引数を渡して実行すると、コマンドライン引数が出力されていることが確認できます。
initializeメソッド
initializeメソッドは、クラスからオブジェクトを作成するnewメソッドを呼び出した際に呼ばれるメソッドです。initializeメソッドは、クラスの中に定義します。initializeメソッドはコンストラクタの役割を担います。
class User attr_accessor :name attr_accessor :age def initialize(name:, age:) @name = name @age = age end end user = User.new(name: "yuki", age: 26) # userのゲッターが呼び出されてる p user.name # => "yuki" p user.age # => 26
インスタンス変数とローカル変数の違い
インスタンス変数とは、クラスの内部で定義できる変数のことです。インスタンス変数は、インスタンス(オブジェクト)のデータを保持するための変数です。インスタンスの内部で共有できる変数なので、インスタンスが呼び出せるメソッドで利用することができます。インスタンス(オブジェクト)が破棄された時に、インスタンス変数も破棄されます。インスタンス変数の変数名には、先頭に@をつけます。
ローカル変数とは、メソッドやブロックの内部で作成される変数です。ローカル変数はメソッドやブロックの内部でのみ有効であり、メソッドやブロックの実行が終了すると破棄されます。メソッドやブロックを呼び出すたびに毎回作り直されます。ローカル変数の変数名には、アルファベットの小文字または、アンダースコアで始めます。
末尾がイコールで終わるメソッドは、半角スペースを開けることができる
name=メソッドのような末尾が=で終わるメソッドは、eと=の間に半角スペースを開けることができます。
class User def initialize(name:, age:) @name = name @age = age end def name @name end def name=(name) @name = name end end user = User.new(name: "yuki", age: 26) p user.name # => "yuki" user.name=("hoge") p user.name # => "hoge" # 括弧は省略できる(特殊なケースを除いて本来括弧を省略するのは良くない) user.name= "huga" p user.name # => "huga" user.name = "yuki" p user.name # => "yuki"
オブジェクトについて
Rubyは全てのデータがオブジェクトです。そもそもプログラミングにおけるオブジェクトとは、「データと手続き(処理手順)を1つのまとまりとして定義したもの」です。オブジェクトは何かしらのクラスから生成されているので、クラスに定義してあるメソッドや、そのクラスの継承元のクラスに定義してあるメソッドを使用することができます。このデータ型だから、このメソッドが使えるという認識は違っていて、このオブジェクトはこのクラスに属しているから、このメソッドが使えるという認識が正しいです。これはJSのようなオブジェクト指向言語でも同じです。
余談ですが、JSには広義のオブジェクトと狭義のオブジェクトがあります。広義のオブジェクトとは、プリミティブ型の値以外の全てです。もっと具体的にいうと、最終的な継承元がObject(標準組み込みオブジェクト)であるような値のことです。狭義のオブジェクトとは、プロパティの集まりのことです。JSでは、プログラミングにおけるオブジェクトのことか、広義、狭義のオブジェクトなのかを文脈で判断する必要があるので注意しましょう。
データ型について
Rubyにはデータ型という概念は存在しません。「~は〇〇型である」という表現もしません。データ型はデータの種類を表しているので、Rubyの場合、オブジェクトが属すクラスがある意味データ型のように、データの種類を表していると考えることができます。Rubyは動的型付け言語なので実行時に型が決まりますが、このようなクラスが型の変わりをしていると考えることができます。
ちなみにJSのデータ型はプリミティブ型とオブジェクト型です。プリミティブ型は7種類存在していて、Boolean型、Number型、BigInt型、String型、Symbol型、Null型、Undefined型です。オブジェクト型の値はオブジェクトなので、メソッドを使うことができます。プリミティブ型の値はオブジェクトではないので、メソッドを使うことはできません。しかし、undefinedとnull以外のプリミティブ型の値はメソッド呼び出し時にラッパーオブジェクトに変換されるので、メソッドを呼び出すことができます。
つまり、JSは全てがオブジェクトというわけではなく、「全てがオブジェクトのよう見える」というのが正しい認識です。そう考えるとRubyは全てがオブジェクトなので、すごいなと感じます。
擬似変数
擬似変数とは、代入ができない参照専用の変数です。オブジェクト自身を表すselfや、現在のソースファイル名を表すFILEなどが擬似変数です。
組み込みライブラリ、標準ライブラリ、gemの違いについて
Rubyでは多くのクラスやモジュールが標準ライブラリとして最初から用意されています。標準ライブラリの中でもよく使うクラスやモジュールは、組み込みライブラリとして提供されています。この組み込みライブラリは、requireを書かなくても利用できます。
組み込みライブラリ以外の標準ライブラリを使用したい場合、requireでインポートする必要があります。以下の例では、Dateクラスを利用するために、dateライブラリをインポートしています。dateライブラリ内にはDateクラスや様々なクラスが定義されていて、それらをdateライブラリをインポートすることで利用することができます。
require "date" day = Date.new() p day # => #<Date: -4712-01-01 ((0j,0s,0n),+0s,2299161j)>
有志の開発者が作成した外部ライブラリは、Rubyではgemという形式でパッケージングされます。gemと呼ばれたら、Rubyの外部ライブラリのことを指していると思っておけば大丈夫です。gemを利用する場合、別途インストールが必要です。gemも利用する場合は、requireでインポートします。Railsではデフォルトの設定のおかげでgemをrequireしなくても使うことができます。
Railsにおいてrequireがなぜ要らないのかを追ってみた(Gemfile編)
gem install と bundle installの違い
gem installコマンドでgemをインストールすることができます。インストール先は、gem environment gemdir
で確認することができます。
# インストール先 /home/ubuntu/.rbenv/versions/3.0.5/lib/ruby/gems/3.0.0
この3.0.0というディレクトリの配下にgemsというディレクトリがあって、そこにgem installでどんなgemをインストールしたのかを確認できます。3.00ディレクトリ配下にインストールされたgemは、グローバルインストールされたという意味であり、gemが開発マシン内のどこでも使えることを意味します。gem install時に依存しているgemもインストールしてくれます
例として、aというgemをgem installすると、gemsディレクトリでaを確認できるので、aがグローバルにインストールされたことが分かります。
../ ./ abbrev-0.1.0/ abbrev-0.1.1/ base64-0.1.0/ base64-0.1.1/ benchmark-0.1.1/ benchmark-0.2.1/ bigdecimal-3.0.0/ bigdecimal-3.1.3/ bundler-2.2.33/ bundler-2.4.3/
../ ./ a-0.2.8/ abbrev-0.1.0/ abbrev-0.1.1/ base64-0.1.0/ base64-0.1.1/ benchmark-0.1.1/ benchmark-0.2.1/ bigdecimal-3.0.0/ bigdecimal-3.1.3/ bundler-2.2.33/ bundler-2.4.3/
bundle installでも同様にgemをインストールすることができます。bundle installのインストール先は、デフォルトではgem installのインストール先と同じです。bundlerの設定でインストール先をvendor/bundleにしたりできるそうです。しかし、グローバルにインストールしてもBundlerがgem同士の依存関係をハンドリングしてくれるので、Bundlerを使っているプロジェクトでgemをbundler経由でインストールする場合、bundle config set pathでわざわざvendor/bundle
のようなパスを指定しなくても良いそうです。gem installでgemをインストールするよりも、bundlerを利用した方がメリットが多いです。
bundlerでgemをインストールするメリットは、
- Gemfileにインストールしたいgemを指定してbundle installを実行するので、何回もgem installコマンドを実行しなくて良い
Gemfileを見れば、どんなgemをインストールするかを確認できる。Gemfileのようなファイルがないと、このプロジェクトではどんなgemがインストールされているかが分かりづらい
依存関係を解決した結果がGemfile.lockに書いている。gem installでgemをインストールした場合、gemのバージョンを指定してても、依存gemはある範囲のバージョンを満たしていれば良いため、正常に動いている環境で使われている依存gemよりバージョンアップした依存gemがインストールされることがある。その結果、依存関係が原因でアプリが正常に動かなくなったりする。また、人間がそれらの依存関係を調べて解決しないといけないのが辛い
bundle installを実行することで、Gemfile内に指定されたgemを依存先も込みでインストールします(gem installでも依存先込みでインストールします)。インストール後、パッケージごとの依存関係やどのバージョンを使用しているかが書かれているGemfile.lockが作成されます。Gemfile.lockが存在している場合、Gemfile.lockの内容から必要なgemをインストールします。Gemfile.lockにないgemをGemfileから見つけた場合、そのgemもインストールします。そのため、Gemfile.lockを共有することで、他の人の環境でも簡単に同じgem(依存gemも同じ)で開発することができます。
Bundlerとは何か
Bundlerとは、gem同士の依存関係やどのバージョンのgemがインストールされたかを管理するためのgemです。Bundler自体は、gem installでインストールします。以降は、以下のような手順でBundler経由でgemをインストールします。
- Bundler経由でgemをインストールしたいプロジェクトに移動する
- Bundlerでgemを管理するためには、Gemfileを作成する必要があるので、bundle initコマンドを実行してGemfileを作成する
- Gemfileにインストールしたいgemを書いてbundle installでgemをインストールする
- Gemfile.lockが作成される。Gemfile.lockにはbundlerがインストールしたgemの依存関係だったりどのバージョンのgemをインストールしたのかが書いてあるので、依存関係やインストールされたバージョンを簡単に管理できる
余談ですが、bundle exec コマンド名
を実行するとBundlerでインストールされているgemを利用してコマンドを実行します。
ちなみに rails newを実行する前に、プロジェクトでGemfileが存在していた場合、rails newを実行するタイミングでGemfileを上書きしていいかを聞かれるそうです。こちらは未検証なので、rails newをするタイミングで調べてみます。
rbenvとは何か
rbenvとは、1つのマシン上で複数のバージョンのRubyを扱うためのツールです。アプリケーションごとに適切なRubyバージョンに切り替えることができます。rbenvがあることによって、1つのマシンでプロジェクトごとに異なるRubyで開発することができます。rbenvがない場合、プロジェクトを切り替えるごとにRubyを都度インストールし直すか仮想マシンを使うかなどの必要性が出てきます。
rbenvを利用するためには、GitHubリポジトリからインストールしてきます。インストールしたrbenvは~/.rbenvに格納します。
git clone https://github.com/rbenv/rbenv.git ~/.rbenv
その後、rbenv initをしたり、ruby-buildをインストールすれば基本的な設定は完了です。
ruby-buildとは何か
ruby-buildとは、rbenvのプラグインです。ruby-buildをインストールすることによって、rbenv installなどのコマンドを利用することができます。rbenv installコマンドを実行することで、特定のバージョンのRubyを ~/.rbenv/versions
配下にインストールすることができます。
git clone https://github.com/rbenv/ruby-build.git ~/.rbenv/plugins/ruby-build
ruby-buildは、rbenvをインストールしたディレクトリ配下のプラグイン用のディレクトリ(plugins)に配置します。
rbenvでどのRubyバージョンがインストール可能かは以下のコマンドで確認できます。
# --list オプションでは各Ruby実装の最新安定版しか表示されない rbenv install --list # より網羅的にインストールできるバージョンを確認したい場合 rbenv install --list-all
その後、バージョンを指定してRubyをインストールします。
rbenv install 3.2.0
rbenv versionsでインストールしたRubyのバージョンを一覧で確認できます。
# この*がついているバージョンが現在有効なRubyバージョン rbenv versions 2.7.7 * 3.0.5 (set by /home/ubuntu/.rbenv/version)
rbenv versionでも現在有効なRubyのバージョンを確認できます。
rbenv version 3.0.5 (set by /home/ubuntu/.rbenv/version)
rbenvでどのRubyバージョンを使うかを指定しない場合、デフォルトでグローバルなRubyバージョンが指定されます。グローバルなRubyバージョンとしてバージョンを指定すると、Rubyをインストールしたマシン全体でそのバージョンをデフォルトのバージョンとして利用することができます。グローバルでRubyバージョンを指定する場合、以下のコマンドを実行します。
rbenv global 2.7.7
グローバル単位でバージョンが指定されていることが確認できました。
# ~/.rbenv/version => グローバルなRubyバージョン # ~/.rbenv/version ファイルにバージョン情報を書き込む rbenv version 2.7.7 (set by /home/ubuntu/.rbenv/version)
ディレクトリ単位でRubyバージョンを指定したい場合、指定したディレクトリに移動して、以下のコマンドを実行します。
rbenv local 3.0.5
ディレクトリ単位で指定されていることが確認できました。
# .ruby-version => ローカルなRubyバージョン # .ruby-version ファイルにバージョン情報を書き込む rbenv version 3.0.5 (set by /home/ubuntu/repos/practice1/ruby-version/.ruby-version)
ruby -vでも同様に確認できますが、グローバルで指定されているバージョンなのか、ローカルで指定されているバージョンなのかを確認することはできません。rbenv versionを使うことで、グローバルで指定されているバージョンなのか、ローカルで指定されているバージョンなのかを知ることができます。
ruby -v ruby 3.0.5p211 (2022-11-24 revision ba5cf0f7c5) [x86_64-linux]
基本的には、rbenv、ruby-build、bundlerがあればRubyの環境構築は完了です。
Gemfileの~> について
Gemfileの ~>には、基本的にパッチバージョンまで指定します。 ~> 1.0.0は、マイナーバージョンを維持しつつ、指定したパッチバージョン以上の最新版を入れるという意味です。 つまり、~> 1.0.0は、1.1.0 > x >= 1.0.0という意味になります。
ちなみにマイナーバージョンとかパッチバージョンを忘れていたので、以下にまとめます。
バージョン | 意味 |
---|---|
パッチバージョン | バージョン番号の一番右側のナンバー。後方互換性を伴うバグ修正をした場合にこちらのバージョンを上げる。 |
マイナーバージョン | バージョン番号の中央のナンバー。後方互換性があり機能性を追加した場合にこちらのバージョンを上げる。マイナーアップデートを行った際は、パッチバージョンを0にリセットする。 |
メジャーバージョン | バージョン番号の一番左のナンバー。APIの変更に互換性のない場合、一つ以上の破壊的な変更を含む場合にこちらのバージョンを上げる。メジャーアップデートを行った際は、マイナーバージョンとパッチバージョンを0にリセットする。 |
HTMLで知ったこと
HTMLのformタグで指定できるHTTPメソッドは、GETとPOSTの2つのみ
HTMLのformタグで指定できるHTTPメソッドは、GETとPOSTの2つのみです。あくまでHTMLのformタグに指定できるHTTPメソッドが2種類なだけであって、ブラウザはその他のHTTPメソッドにも対応しています。featch APIとかで、patchリクエストをしたりできます。formタグにmethodを指定しなかった場合、デフォルトではgetを指定したことになります。actionには送信先を指定します。
<form method="post" action="/users"> <label for="name">name</label> <input type="text" id="name"> <button type="submit">送信</button> </form>
reactのformの場合、onSubmitでサブミット時に便乗して実行する関数を指定します。この関数内に送信処理を書きます。
HTMLのformタグでputリクエストやdeleteリクエストをしたい場合
HTMLのformタグでputリクエストやdeleteリクエストをしたい場合、postを指定しつつ以下の2つの方法のどちらかを使います。この方法を用いてpostリクエストを行うことで、postリクエストをサーバー側にしているが、サーバー側でdeleteリクエストとして扱うことができます。どちらの方法もサーバー側でリクエストを判別する処理が実装されている必要があるので、その点を注意しましょう。RailsやSinatraではデフォルトで_methodを採用しています。
- _methodパラメータを使う
- X-HTTP-Method-Overrideヘッダーを使う
個人的にはRailsでも採用されている1番のやり方が簡単です。 以下が実装例です。type="hidden"は、ユーザーが見たり編集したりできないデータをフォームに含めたい時に使用します。nameはmethod、valueにはHTTPメソッドを指定します。サーバー側でmethodパラメータを見て、postリクエストをdeleteリクエストとして扱ってくれます。Railsのform_withなどでは最初から実装されています。
<form method="post" action="/users"> <label for="name">name</label> <input type="text" id="name"> <button type="submit">送信</button> <input type="hidden" name="_method" value="delete"> </form>
ReactだとonSubmitで送信処理を指定できるので、このような方法を使うことはありません。
JSを使わずにHTMLのみでDELETEリクエストのボタンを作るにはフォームを使う
aタグはhrefで指定したURLにGETリクエストを出します。GETリクエストしか出せないので、もしReactなどのフロントエンドライブラリを使っていないHTMLの場合、formを使うことでDELETEリクエストを発行するボタンを作成できます。
<div> <form method="post" action="/users/1"> <input type="hidden" name="id" value="1"> <input type="hidden" name="_method" value="delete"> <button type="submit">delete</button> </form> </div>
ただし、同期的にリクエストが行われるので、画面がリロードされるのがデメリットです(Reactでは非同期リクエストを出すのでそのようなことが起きない)。
input type="button"と、buttonタグの違い
input type="button"には、valueにボタンのラベルを指定します。buttonタグの場合、buttonタグで囲った要素がラベルになります。buttonタグの方がラベルの自由度が高いので、buttonタグを使うことがMDNでも推奨されています。
Rails
database.ymlとは
database.ymlとは、Rubyプログラムからデータベースにアクセスする際の設定を書くファイルのことです。一番簡単に使うためにはadapterとdatabaseを指定します。adapterにはデータベースの種類、databaseにはデータベース名を指定します。&defaultの部分はアンカーと呼びdefaultの設定を他の部分でも利用することができます。アンカーを呼び出すには、*をつけます。<<:は、右側にあるものを該当部にまとめるという意味です。
↓ database.yml
default: &default adapter: sqlite3 development: <<: *default database: development.db
Rubyのyamlライブラリを使えば、このアンカーがちゃんと該当部にまとめられていることを確認できます。
require 'yaml' d = YAML.load_file("database.yml") puts d
bundle exec ruby app2.rb {"default"=>{"adapter"=>"sqlite3"}, "development"=>{"adapter"=>"sqlite3", "database"=>"development.db"}}
ActiveRecord::Base.table_name= で、使用するテーブル名を指定できる
クラス名が単数形のProductの場合、テーブル名は複数形のproductsになります。もし、テーブル名をクラス名の複数形にしたくない場合、ActiveRecord::Base.table_name=を使用します。
class Product < ApplicationRecord self.table_name = "my_products" end
Web関係で知ったこと
クッキーについて
■そもそもクッキーとは
クッキーには2つの意味があります
- HTTP通信をステートフルにするための通信プロトコル
- サーバーから送られてきてブラウザ上に一定期間保存されるデータ
一般的には、2番の意味でクッキーという言葉が使われることが多いと感じます。
■クッキーの仕組み
以下のような手順でクッキーは利用されます。
- クッキーはHTTPレスポンスヘッダを利用して、サーバー側からブラウザに送られます。
- ブラウザはクッキーを指定された期間だけ保持します。
- 以後、クッキーを送ってきたサーバーにリクエストを送るときは、すべてのHTTPリクエストでHTTPリクエストヘッダにクッキー情報を含めます。
■クッキーでどのような値を管理しているのか
多くの場合、クッキーではセッションidなどのセッション情報を保持するための値を管理しています。また、クッキーがいつまで有効かの期限なども管理しています。
■クッキーは何を解決したのか
クッキーという仕組みができたことで、HTTP通信でリクエスト元を特定できて、ステートフルな通信をすることができます。
■クッキーの問題点
セッションidをクッキーに管理すると、そのセッションidが盗まれたらセッションハイジャックなどの攻撃を受ける可能性があります。これを防ぐためにはCookieにsecure属性を追加して、HTTPS通信の時にしかクッキーを送らないように設定します。
POSTリクエストのリクエストボディのフォーマットについて
POSTリクエストを送る際は、リクエストボディのフォーマットを指定する必要があります。リクエストボディのフォーマットを示すContent-TypeというヘッダーとMIMEタイプ(リソースの種類を表す)をリクエストに含めることで、リクエストボディのフォーマットを指定することができます。 以下はPOSTリクエストのリクエストボディの代表的なフォーマット(MIMEタイプ)です。
- application/x-www-form-urlencoded
<form>
タグのenctype属性を指定しなかった場合に使われるデフォルトのフォーマットです。 - multipart/form-data
<form>
タグのenctype属性に指定します。バイナリデータを送りたい場合やバイナリデータとテキストデータを混在して送りたい場合に利用します。 - application/json
publicディレクトリについて
(Railsアプリケーションのルート)/publicディレクトリ配下に画像等の静的なコンテンツを置いた場合、外部からアクセスすることができます。ブラウザからは、「http://ドメイン/静的コンテンツのファイル名」でアクセスできます。
Homebrewとは何か? Homebrewでインストールしたパッケージはどこに格納されるのか
HomebrewはmacOS上で動作するパッケージ管理ツールです。Homebrewを使ってパッケージをインストールすることで、公式サイトに行ってダウンロードをクリック → zipファイルを解凍 → 開いてインストールしなくても、コマンド一つでインストールできます。また、アンインストールやアップグレードもコマンドで簡単に行うことができます。
Homebrewのパッケージは、以下のディレクトリ配下にインストールされます。
- コマンド実体は、/usr/local/Cellar
- コマンドのエイリアスは、/usr/local/bin
PATHを通すとは
PATHを通すとは、PATHという環境変数にコマンドのパスを登録することです。環境変数とはPC環境についての変数のことです。ターミナルでenvを実行すると、設定されているすべての環境変数が表示されます。PATHという環境変数には、さまざまなパスが代入されています。それぞれのパスはコロンで区切られています。コンピュータはファイルパスを指定されなかった場合、PATHという環境変数に代入したパスの配下にファイルがあるかを確認していきます。この確認作業はコロンで区切ったパスごとに行われます。そのため、PATHを通すことで、コマンドを実行する際にフルパスを指定しなくてもファイル名でコマンドを実行することができます。
認証周りで知ったこと
認証方法の種類
以下の認証方法がメジャーです。
社内向けのサービスで、セキュリティリスクそこまで考えてなくて、いち早く認証機能を実装したい場合、Basic認証でも良いと思います。 今後toB向けのサービスとして展開していくなら、セッションベースか、トークンか、OAuthが良いです。
ウェブサイトのさまざまな「認証方式」をまとめて比較した結果がコレ - GIGAZINE
ソルトとは
以下の説明がわかりやすかったので、引用させていただきます。
ソルトとは、認証システムがパスワードなどを保存する際に付け加えるランダムな符号列のこと。“salt” の原義は「塩」。
ソルトとは - 意味をわかりやすく - IT用語辞典 e-Words
つまり、パスワード保存時に付け加えるランダムな文字列のことをソルトと言います。ソルトとパスワードを合体させた文字列をハッシュ関数で変換します。変換した値(ハッシュ値)とソルトをDBに保存します。パスワードのみをハッシュ化して保存していると、パスワードを複数システムで利用している場合に、一回でもパスワードがバレると他のシステムでも簡単にアクセスできてしまう恐れがあります。。ソルトはパスワード保存ごとに毎回ランダムに生成されます。そのため、同じパスワードを保存してもハッシュ値は毎回異なるため、仮にパスワードがバレても簡単に解読できないようになっています。
Authorizationヘッダー
Authorizationヘッダーは認証時にクライアントからサーバーに対して送るヘッダーのことです。このヘッダーに認証情報を含めます。Basic認証、Digest認証、トークン認証(Bearer認証)等のHTTP認証で利用します。
参考記事
Ruby用語集 (Ruby 3.0 リファレンスマニュアル)
オブジェクトとは - 意味をわかりやすく - IT用語辞典 e-Words
ラッパーオブジェクト · JavaScript Primer #jsprimer
Primitive (プリミティブ) - MDN Web Docs 用語集: ウェブ関連用語の定義 | MDN
コンストラクタとは|「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典
ruby - How to find where gem files are installed - Stack Overflow
gem installしたgemのパスを知りたい - Eggshell
bundlerのpathを指定しない場合のインストール先 - コード日進月歩
bundle install時に--path vendor/bundleを付ける必要性は本当にあるのか、もう一度よく考えてみよう - Qiita
【Ruby】 gemの仕組みを図解形式で学ぼう | Pikawaka
【Rails】 結局bundlerって何?bundlerの仕組みを図解形式で徹底解説 | Pikawaka
【Rails】 rails newの使い方とは? | Pikawaka
Ruby 歴 10 年の私が【絶対に】 gem install rails コマンドを実行しない理由 - Qiita
rbenv+ruby-buildをインストールする手順 (CentOS/RedHat) |
バージョン表記の各数字の意味をイラストで理解する | DevelopersIO
ruby-build | rbenv日本語リファレンス | Ruby STUDIO
GitHub - rbenv/rbenv: Manage your app's Ruby environment
<form>: フォーム要素 - HTML: HyperText Markup Language | MDN
なぜリンクをクリックすると自動的にGETメソッドになるのですか?
<input type="button"> - HTML: HyperText Markup Language | MDN
【YAML】Railsのdatabase.ymlについてなんとなく分かった気になっていた記法・意味まとめ - Qiita
MySQL用のデータベース設定ファイル(database.yml) - Ruby on Rails入門
POSTパラメータを扱えるようにする|伸び悩んでいる3年目Webエンジニアのための、Python Webアプリケーション自作入門
MIME タイプ (IANA メディアタイプ) - HTTP | MDN