Railsチュートリアル一章 学習ログ

#Railsチュートリアルをやっていきます
以前に途中までやって、ほったらかしになっていたので、復習がてら最初からやっていきます。

#演習問題

1.Ruby on Railsで使うRuby gemはどのWebサイトにありますか？

https://rubygems.org/gems/rails

2.現時点でのRailsの最新バージョンはいくつですか？

5.2.2(2018年12月4日）

(2019年春にはRails6.0がリリース予定のようですね。)

3.Ruby on Railsはこれまでに何回ダウンロードされたでしょうか？

TOTAL DOWNLOADS
156,041,921
(2019年1月6日現在)

1億５千...!?
ちなみにsinatraは、約７千万ダウンロードのようです。


#Railsインストール

学校はWin機、家ではMacで面倒くさいので、開発環境はAWS Cloud9を使っていきます。

```bash
 $ printf "install: --no-rdoc --no-ri\nupdate:  --no-rdoc --no-ri\n" >> ~/.gemrc
```
これはgemをインストールするときに、ドキュメントをインストールしないという設定を、gemの設定ファイルに追記するコマンドです。

反映されているかどうかチェックします。

```bash
 $ cat ~/.gemrc                                                                                                             
install: --no-rdoc --no-ri
update:  --no-rdoc --no-ri
```

OKですね。

ただ、下記のような記事を見ると、--no-rdoc, --no-riはどうやらdeprecated（非推奨)の書き方のようでした。
https://qiita.com/kei_q/items/d13235157fcfc435489d

今はこう書くのが正しいようです。

```
install: --no-document(又は -N)
update: --no-document(又は -N)
```

確認のため、gemの公式サイトを見たら、非推奨の欄にすら--no-rdoc, --no-riの書き方が載っていませんでした。
https://guides.rubygems.org/command-reference/#gem-install

ん？廃止されたのかな、思ったのでteratailで聞いてみましたら、
やっぱり廃止されたみたいです。（回答ありがとうございました）
https://teratail.com/questions/167348

では、正しい設定を流しこみたいと思います。

```bash
 $ printf "install: -N \nupdate: -N\n" > ~/.gemrc
```
今度は上書きしたいので、リダイレクションは>>ではなく>を使います。

```bash
 $ cat ~/.gemrc
install: -N 
update: -N
```
これで大丈夫ですかね。

ではRailsをインストールします。
バージョンはチュートリアルに合わせます。

```bash
$ gem install rails -v 5.1.6
```

#いつもの

```bash
$ rails_5.1.6_new hello_app
```
ファイル群が作成され、bundle installが実行されます。
Bundleは、gemパッケージのバージョンを管理してくれるヤツです。

そしてインストールが成功したみたいですが、色々なログが出たので少しずつ読んでいきます。

#出力されたログ

```
HEADS UP! i18n 1.1 changed fallbacks to exclude default locale.
But that may break your application.
```
change A to B　　　　　　AをBに取り換える

（雑訳）
気をつけろ！ i18n 1.1 ではデフォルトの国や地域の設定を除外するようにフォールバックが変更された。
もしかしたらあんたのアプリ壊れるかも。
（訳終わり）

```
Please check your Rails app for 'config.i18n.fallbacks = true'.
If you're using I18n (>= 1.1.0) and Rails (< 5.2.2), this should be
'config.i18n.fallbacks = [I18n.default_locale]'.
If not, fallbacks will be broken in your app by I18n 1.1.x.
For more info see:
https://github.com/svenfuchs/i18n/releases/tag/v1.1.0
```
（雑訳）
Railsアプリの'config.i18n.fallbacks = true'.
の部分をチェックしろ.
もしyouがI18n1.1.0以上を使っていて、Rails5.2.2以下を使っているなら、(~略~）に変更にしろ、そうじゃないなら、あんたのアプリはI18n 1.1.xによってフォールバック動作が上手く行かなくなる。
（訳終わり）

今回はチュートリアルに合わせて、Rails5.1.6を使っているので、指摘された通りに直しておきます。
該当するコードは、config/environments/production.rbにあるようです。

```ruby:config/environments/production.rb
#config.i18n.fallbacks = true
config.i18n.fallbacks = [I18n.default_locale]
```
これでいいですかね。

参考URL
http://midnight-engineering.hatenadiary.jp/entry/2019/01/02/181645


#i18nとは何か？

>
RubyのI18n (国際化・多言語化を意味する internationalization を短縮したもの) gemはRuby on Rails 2.2以降からRailsに同梱されています。このgemは、アプリケーションの文言を英語以外の 別の1つの言語に翻訳 する機能や 多言語サポート 機能を簡単かつ拡張可能な方式で導入するためのフレームワークを提供します。
RailsGuide https://railsguides.jp/i18n.html

色々な言語に対応してくれるgemのようです。


#Sassについても何かメッセージが出ていた

```
Post-install message from sass:

Ruby Sass is deprecated and will be unmaintained as of 26 March 2019.

* If you use Sass as a command-line tool, we recommend using Dart Sass, the new
  primary implementation: https://sass-lang.com/install

* If you use Sass as a plug-in for a Ruby web framework, we recommend using the
  sassc gem: https://github.com/sass/sassc-ruby#readme

* For more details, please refer to the Sass blog:
  http://sass.logdown.com/posts/7081811
```

(語句）
Post-install　　インストール後
deprecate　とがめる、軽視する、見下す


(雑訳）
sassからインストール後のメッセージ

Ruby Sassは非推奨で、2019年３月26日にサポートが打ち切られる
もし、コマンドラインで使っているなら、Dart Sassを推奨
もし、プラグインで使っているなら、sassc gemを推奨
詳細はSassのblogを参照してね

（訳終わり）

多分、gemとして使っていると思うので、sassc gemを代わりに入れておきます。
という訳で、gemfileを編集します。

```ruby:gemfile
#gem 'sass-rails',   '5.0.6'
gem 'sassc-rails'
```


```bash
$ bundle update
```

#サーバー起動

```bash
$ rails s
```

AWS Cloud9でアプリケーションを確認する時は、Previewタブから、Preview Running Applicationをクリックします。
そうすると、IDE内でタブが開かれますが、なぜかここではエラーとなるので、ブラウザの新規タブで開くボタンをクリックします。

![スクリーンショット 2019-02-10 16.22.07.png](https://qiita-image-store.s3.amazonaws.com/0/83177/f9671011-8e98-9196-bbd4-577d99f50d44.png)

そして、いつもの

![スクリーンショット 2019-02-10 16.27.27.png](https://qiita-image-store.s3.amazonaws.com/0/83177/ae92213b-a42a-7861-6c85-e6ecd0566fe4.png)

#演習問題

>
1.デフォルトのRailsページに表示されているものと比べて、今の自分のコンピュータにあるRubyのバージョンはいくつになっていますか? コマンドラインでruby -vを実行することで簡単に確認できます。
>

◯Railsページ
Ruby version: 2.4.1 (x86_64-linux)

◯Cloud9のrubyバージョン
ruby 2.4.1p111 (2017-03-22 revision 58053) [x86_64-linux]


>
2.同様にして、Railsのバージョンも調べてみましょう。調べたバージョンはリスト 1.1でインストールしたバージョンと一致しているでしょうか?
>

◯Railsページ
Rails version: 5.1.6

◯Cloud9のrubyバージョン
Rails 5.1.6

=> 一致を確認。


#MVCについて、とてもテキトーな説明

Railsアプリでは、Controllerがブラウザからのリクエストを受け取り、データベースとのやりとりを担うModelと対話したりして、ブラウザにViewを返します。

#Hello worldアプリ


```ruby:application_controller.rb
class ApplicationController < ActionController::Base
  protect_from_forgery with: :exception

  def hello
    render html: "hello, world!"
  end
end
```

>
renderで:htmlオプションを使用すると、HTML文字列を直接ブラウザに送信することができます。
https://railsguides.jp/layouts_and_rendering.html#html%E3%82%92%E5%87%BA%E5%8A%9B%E3%81%99%E3%82%8B
>


```ruby:routes.rb
Rails.application.routes.draw do
  # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html
  root 'application#hello'
end
```

ルーターは、ブラウザから受け取ったURLを識別し、コントローラに振りわける機能をもちます。
/(root）が指定された時、先ほど定義したapplicationコントローラのhelloアクションを呼び出すようにします。

これで画面上にhello,worldを表示させるだけのしょぼいアプリケーションができました。

#演習問題

（省略）

#Gitによるバージョン管理

（省略）

```bash
$ git checkout -f
```

すべてのファイルを強制的に元の状態に戻す

#GitHubへアップロード

GitHubへはSSHで接続します。

>
Using the SSH protocol, you can connect and authenticate to remote servers and services. With SSH keys, you can connect to GitHub without supplying your username or password at each visit.
https://help.github.com/articles/about-ssh/
>

(語句）
authenticate 認証する

(雑訳）
SSHプロトコルを使うと、リモートサーバに接続や認証ができます。SSHキーを使うことで、ユーザー名やパスワードの入力なしにGithubへ接続できます。
(訳終わり）



#公開鍵を作成します。
鍵を入れるフォルダへ移動

```bash
$ cd ~/.ssh
```

鍵を生成します。

```bash
$ ssh-keygen -t rsa -b 4096 -C "hoge@hoge.com"
```
各オプションの説明

-t 鍵の種類
rsaは桁がでかい数の素因数分解が困難であることを利用した公開鍵暗号方式。

-b ビット数
基本的には2048bit以上が推奨されますが、GitHub公式ヘルプは、より強度の高い4096bitを推奨しているため、こちらに合わせます。

-C コメント
GitHubに登録してあるEmailアドレスに置き換えてくれ、とのことでした。

参考
https://help.github.com/articles/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent/#generating-a-new-ssh-key

上記を実行すると、公開鍵と秘密鍵のセットが作成され、鍵ファイルの名前とパスフレーズを聞いてきます。

```bash
Enter file in which to save the key (/home/ec2-user/.ssh/id_rsa): id_git_rsa
Enter passphrase (empty for no passphrase): 
```

何も押さずにEnter三回連打で、id_rsaとid_rsa.pubを作ることもできますが、ここではわかりやすい名前をつけて見ました。パスフレーズは、公式が、"type a secure passphrase. "とおっしゃっているので、入れておきます。

強度のある鍵が作られているか確認します。

```bash
$  ssh-keygen -l -f ~/.ssh/id_git_rsa
4096 SHA256: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx  hoge@hoge.com (RSA)
```

(オプション）
-l 鍵の情報を確認する
-f 鍵ファイル指定


#公開鍵をGitHubへアップ

まず作成した公開鍵をクリップボードにコピーします。

```bash
#Mac
#$  pbcopy < ~/.ssh/id_rsa.pub

$  cat ~/.ssh/id_git_rsa.pub
```

ただ、pbcopyはMacしか使えないコマンドです。
しょうがないので、catで画面に出力し、コピペすることにします。

これを、GitHubの設定画面のSSH keysへ登録します。


#GitHubへ接続テスト

GitHubへ接続する際、先ほど指定した鍵を用いるように指定します。

```bash
$  vim config
```

vimを使って、configファイルを作ります。

```bash
Host github github.com
  HostName github.com
  IdentityFile ~/.ssh/id_git_rsa 
  User git
```

これで、GitHubへ接続して見ます。

```bash
$ ssh -T git@github.com
Bad owner or permissions on /home/ec2-user/.ssh/config
```

すると、configに対する権限がない、と怒られてしまいました。
では、権限について確認して見ます。

```bash
 $ ls -la
-rw-rw-r--  1 ec2-user ec2-user   86 Feb 10 09:23 config
```

権限の設定の読み方がわからないので、調べます。
http://www.tku.ac.jp/~densan/local/permission/permission.html

```bash
-rw-rw-r--
```

=> これは、
所有者が、-rwの権限を持ち、
所有グループが、-rwの権限を持ち
他人が、r--がrの権限を持つという意味のようです。

rは読み、wは書き、xは実行を表します。(-は権限なし）
また
所有者とはディレクトリを持つ自分自身、
所有グループとは、同じサーバをもつユーザー全体、
他人とは、第三者を指します。

この./ssh/configについては、所有者（自分自身）に読み書きの権限(-rw)がついているため、一見問題がないように見えます。

ただし、セキュリティの関係上、自分以外の他者に権限を付与している場合は接続ができないようです。
http://d.hatena.ne.jp/someone620/20140406/1396758308

そこで、パーミッションを変更するコマンド[chmod　パーミッション　付与したいファイル名]を用いて、自分以外の所有グループ、他者の権限を無くします。
数値で指定するので、r(4),w(2),x(1),-(0)で計算します。
-rw --- ---を指定すれば良いので、2+4+0, 0+0+0, 0+0+0と計算し、600となります。

```bash
 $ chmod 600 ~/.ssh/config
 $ ls -la
　-rw-------  1 ec2-user ec2-user   86 Feb 10 09:23 config
```

これで良さそうですね。
では、GitHubへ再び接続を試みてみます。

```bash
$ ssh -T git@github.com
Enter passphrase for key '/home/ec2-user/.ssh/id_git_rsa': 
Hi Hoge! You've successfully authenticated, but GitHub does not provide shell access.
```

上手くいったみたいです。

#GitHubへPush

https://github.com/shocci1214/railsTutorial

再びpushするときに警告が出てきてしまいました。

```bash
Warning: Permanently added the RSA host key for IP address 'xxx.xxx.xxx.xxx' to the list of known hosts.
```
(語句）
permanently　 永久的に、恒久的に

(google訳)
警告: IPアドレス 'xxx.xxx.xxx.xxx'のRSAホストキーを既知のホストのリストに恒久的に追加しました。
(訳終わり）

known hostsは、接続したことのある各ホストの情報を保持しているファイルです。
どうやらGitHub.comの違うIPアドレスに接続するたびに設定を保存しているようです。

この問題の解決法は以下で質問し、解決しました。（回答ありがとうございました）
https://teratail.com/questions/173702?whotofollow=

このように、github.comに関する全てのサーバの公開鍵情報を一旦削除してリセットします。

```bash
$ ssh-keygen -R github.com
```

#Herokuへのデプロイ

(省略)

###Herokuコマンドラインクライアントのインストール

```bash
$  source <(curl -sL https://cdn.learnenough.com/heroku_install)
```

sourceコマンド
ファイルに書かれたコマンドを現在のシェルで実行する

< 入力元ファイルを指定する

curlコマンド
HTTPやFTPを使って、ファイルをダウンロードしたりアップロードしたりする

-s
進捗状況やエラーを表示しない

-L
リダイレクトに対応する
（指定したページが遷移したら、それを追いかける）


###Heroku用の公開鍵作成

GitHubの例に習い、4096ビットの鍵を作成し、「id_heroku_rsa」のようなわかりやすい名前をつけておきます。

```bash
$ ssh-keygen -t rsa -b 4096 -C "hoge@hoge.com"
Generating public/private rsa key pair.
Enter file in which to save the key (/home/ec2-user/.ssh/id_rsa): id_heroku_rsa
Enter passphrase (empty for no passphrase): 
```

そして、configファイルを編集します。

```bash:ssh/config
Host github github.com
        HostName github.com
        IdentityFile ~/.ssh/id_git_rsa
        User git

Host heroku.com
        HostName heroku.com
        IdentityFile ~/.ssh/id_heroku_rsa
        IdentitiesOnly yes
```

この設定は以下の公式リンクを参考にしました。
https://devcenter.heroku.com/articles/keys#fixing-problems-with-keys

```bash
$ heroku keys:add ~/.ssh/id_heroku_rsa.pub
Uploading /home/ec2-user/.ssh/id_heroku_rsa.pub SSH key... done
```

add の後に今作った鍵のパスを指定します。何も書かないと、デフォルトで「id_rsa_pub」が検索されます。

登録した鍵を確認します。

```bash
$ heroku keys
=== hoge@hoge.com keys
ssh-rsa XXXXXXXXXXXXXXXX
```

上手くいったようです。

###Herokuへの接続を検証

以下のコマンドを叩きます。
https://devcenter.heroku.com/articles/keys#validate-the-connection

```bash
$ ssh -v git@heroku.com
```
大量のログが出力されますが、以下のログが出ていたので、
接続は上手くいったようです。

```
Authenticated to heroku.com 
```

###デプロイ
デプロイ...作成したアプリをサーバにアップロードし、利用できる状態にすること

```bash
$ heroku create
$ git push heroku master
```

https://powerful-island-95849.herokuapp.com/



#続きます