社内ruby勉強会資料 #1

# 始めに

この記事は社内で行うruby勉強会資料です。
目標は、ruby初めましてな参加者が[ruby認定](https://www.ruby.or.jp/ja/certification/examination/)シルバーレベルの知識をつけるまで。

結構フランクに会話しながら勉強会を開くためのアジェンダ的立ち位置なので、一般の方が記事をご覧になって歯抜けとなることは否めません。
必要であれば、コメントいただければ追記補足しますので、ご遠慮なくご覧ください。

# インストール

## rbenv使おう

### rbenvって？

複数のバージョンのrubyをインストールして、必要に応じて利用を切り替えられるもの。

### なんでそんなの使うの？

rubyは後方互換性を結構犠牲にします。

- メリット
    - その時点で最適と考えられる言語仕様、標準ライブラリを提供できる
    - 主たる動作が変わらなければ、速度や使いやすさを考慮して、ガラリと内部実装を変更できる
- デメリット
    - 過去のコードが時々動かなくなる
    - deplecated・・・

なので、既存コードを活かすためにrubyの各バージョンを保持しておく。
バージョンマネージャには[rvm](https://rvm.io/)もあるけど、色々ハマリポイントがあったり設定が面倒くさかったりしてた。
今はrbenvが主流だと思います。

### インストール！（他力本願）

[rbenv を利用した Ruby 環境の構築](https://dev.classmethod.jp/server-side/language/build-ruby-environment-by-rbenv/)

バージョンは最新を使いたいので

```sh
$ rbenv install 2.5.3
$ rbenv global 2.5.3
```

で。

### Windows？

Windows上のrubyはちょっとつらいので、[WSL](https://qiita.com/Aruneko/items/c79810b0b015bebf30bb)使って、その上でrbenv使うほうがいい気がする。
（完全に個人の主観）

#### Windows + rubyのつらみ

- devkitが頑張ってるけど、時々ネイティブコンパイル失敗するgemもあった
    - 今はどうだろう・・・
- gemによってはUnix系のファイルシステムを前提としたものがあった
    - 今はどうだろう・・・
- 権限周りでたまにハマる
- ActiveRecordにモンキーパッチ当てないとコケた思い出
    - 流石にいまはそんなことないと思うけど

## rubyの構成

まずは[リファレンスマニュアル](https://docs.ruby-lang.org/ja/2.5.0/doc/index.html)を見てみよう。

- 言語仕様
    - 文法とか、本当に基礎的なもの
- [組み込みライブラリ](https://docs.ruby-lang.org/ja/2.5.0/library/_builtin.html)
    - プログラムを作る上で大体必要になるクラス群
    - String/Array/Hash/File ...
- [標準添付ライブラリ](https://docs.ruby-lang.org/ja/2.5.0/library/index.html)
    - 特定の用途に役に立つが、常に使うわけではないものを別添してる
    - 常に組み込んでおくとロードに時間かかったり、メモリくったりするからエコだよ、エコ
    - CSV/JSON/Matrix ...
    - 利用するときには`require`する

## やってみよう

rubyの標準インタラクティブシェル(REPL)

```sh
$ irb
```

```ruby:irb
puts "hello, world!"
```

## pry

irbでももちろんいいんだけど、pryのほうが使いやすいよ
[Rubyistよ、irbを捨ててPryを使おう](http://labs.timedia.co.jp/2011/12/rubyist-should-use-pry.html)

じゃあ、インストールしよう。

## gem

### gemとは

rubyの拡張ライブラリパッケージ。
第三者が作った便利機能を、rbファイルだけじゃなくて依存関係を解決しながら管理できるパッケージマネージャ、およびそのパッケージ。

### pryのインストール

```sh
$ gem install pry
```

### ここにも落とし穴が！

本番リリースするとき、どのgemが必要なのかとか、どうやって管理するの？
インストールし忘れでコケるとかダサい。
それにgemは、rubyの思想を受け継いで（？）、後方互換性を捨ててでも機能拡張するものが増えてきた。
バージョン依存怖い。
やっぱり自分のアプリケーションに必要なgemの種類とバージョンを管理しなくちゃいけないんじゃないの？

## Bundler

そこでBundler。
特定のアプリケーションに必要なgemを管理して、そのアプリケーションのポータビリティを上げたり、バージョン依存も明記・管理してくれる、今や必須ツール。

### インストール

```sh
$ gem install bundler
```

### 使い方

[他力本願](https://medium.com/@kazunorikamiya/bundler%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9-3403ab27dc81)

### 今回は

こういうものがあるよ、程度で十分。
アプリケーションらしいものには至らない。

## 実は

ここまでのバージョン管理とかは[こちら](https://qiita.com/anfangd/items/3f35fb98b0f9e023475c)に綺麗にまとまっているので、ここに書く必要ない。

# 改めて

## 主なオブジェクトとリテラル[^litter]の話

[^litter]: プリミティブ型を持つ言語なら、それらであったり主たるデータを簡易的に示すための文法。文字列は `""` とか。rubyはプリミティブ型を持っていないが、だいたいの開発者が望むオブジェクトにリテラルがある。
   
- 文字列
    - シングルクォートは式展開しない
    - ダブルクォートは式展開する
- 配列
    - []
    - どんなオブジェクトも入る
- ハッシュ
    - {key => value}
    - 連想配列
- シンボル
    - コロン
    - 文字列みたいなもん
    - キーワード的に使うときに使いやすい
    - 内部的にはハッシュ化した値（のはず）
- 正規表現
    - //
    - 正規表現にリテラルがあるので、コンパイルが不要。便利だねー。
- [%記法](https://docs.ruby-lang.org/ja/2.5.0/doc/spec=2fliteral.html#percent)
    - リテラルに使う記号を値に持ちたいときにダルい人用

## 文字種の話

rubyでは、参照するものが何かをわかりやすくするため、リテラル以外の最初の文字で区別をつけている。

- クラス
    - 大文字始まり
    - パスカルケース（慣習）
- メソッド
    - 小文字始まり
    - スネークケース（慣習）
- 変数
    - ローカル変数
        - 小文字始まり
        - スネークケース（慣習）
    - インスタンス変数
        - `@` 始まり
        - スネークケース（慣習）
    - クラス変数
        - `@@` 始まり
        - スネークケース（慣習）
    - グローバル変数
        - `$` 始まり
        - 使うな
- 定数
    - 大文字始まり
    - 全大文字、`_` つなぎ（慣習）
- モジュール
    - クラスと一緒
    - 用途は別途

### クラスと定数とモジュールの関係（脱線）

なぜ同じ記法なのか。
クラス、モジュールはそれぞれClass/Moduleクラスのインスタンス。
生成して定数にバインドしているので、これらは同じ記法（大文字始まり）で示されている。

## やってみよう

```ruby:pry
num_value = 1
puts num_value + 1

HELLO = 'hello'
puts HELLO + ' world'
puts "#{HELLO}, 式展開"

require 'tempfile'
contents = ["#{HELLO}, file", "end!"]
tf = Tempfile.open('ruby-learning')
tf.puts contents
tf.close
file_path = tf.path
puts File.read(file_path)
```

## クラス・メソッド定義

https://www.ruby-lang.org/ja/documentation/quickstart/2/
https://www.ruby-lang.org/ja/documentation/quickstart/3/

Greeterの実装とお試しまで。
MegaGreeterは気合次第！