たのしいRubyを勉強してみた

# たのしいRubyを勉強してみた　第一部
*Green_helmet@bethlehem4099 2022年6月18日*

Rubyの本、買ってきた。たのしいRuby、勉強しながらtwitterに投稿した文を加筆訂正してQiitaに投稿する。
Twitter、Green_helmet@bethlehem4099
Qiita、@dosaidon
## 参考文献
この記事は以下の情報を参考にして執筆しました。
-[たのしいRuby、高橋征義、後藤裕蔵著、 まつもとゆきひろ監修、SBクリエイティブ株式会社、第6版2019年](https://www.amazon.co.jp/%E3%81%9F%E3%81%AE%E3%81%97%E3%81%84Ruby-%E7%AC%AC6%E7%89%88-%E9%AB%98%E6%A9%8B-%E5%BE%81%E7%BE%A9-ebook/dp/B07PNN3TYF/ref=tmm_kin_swatch_0?_encoding=UTF8&qid=1671278506&sr=8-1)
-[『たのしいRuby 第6版』サポートページ、ソースコード](https://tanoshiiruby.github.io/6/index.html)


## はじめに
ここのところPythonでプログラムを書いていた。
でも、Pythonは計算は得意だがまとまったプログラムを作るのには向いてない気がしてRubyを勉強することにした。
もう一つは、Ractorと言う並列処理の機能がRubyに出来たと聞いたからだ。
そう、PythonはmacOSのプリインストールソフトから削除されてしまったがRubyは残っている。そしてGitHubとHomebrew最高。
## Rubyの実行環境とインストール

### パソコン環境
Ruby勉強の環境。二画面で実行環境と本や検索画面を表示出来て快適。でもM1 MacBook Airは接続できる外部モニターがデフォルトで1台なんだよな。だからIntel MacBook Proの出番がまだある。ただし動作は圧倒的にM1が快適。この構成に至るまでかなり試行錯誤した。

:::note
Intel MacBook Pro 2017,
M1 MacBook Air 2020,
LG 27inch monitor 4K, Sony 2k TV,
Logitech keyboard M380,
MX Anywhere 3 for Mac mouse
:::
Windowsパソコン(第11世代のCore i5)も持っているが、CPUがIntelのパソコンとApple silicon Macを比較するといわゆるM1とかを搭載したパソコンの方が圧倒的に早くて快適だった。これは1CPUの能力の差なのでCPUコアの数が多くても体感は変わらない。HomebrewがWindowsには無かったので設定が面倒でWindowsにはRubyをインストールだけして使うのをやめてしまった。
Linux、なにそれ美味しいの？
### モバイル環境
:::note
iPad 9, iPhone XR, iPhone SE2
:::
スタバでRuby、電車でRuby、寝床でRuby用。


*Green_helmet@bethlehem4099 6月21日*
### ソフトウエア

:::note
ターミナル、Command Line Tools、Homebrew、Ruby、CotEditor
:::
ここに書いたソフトがこの順番で必要だがOSのバージョンやCPUの種類によって最初から入っているソフトがあるかもしれない。自分のMacではターミナルはLaunchpadにあったが、Command Line Toolsは無かった。インストールのやり方はここに出てきた単語をブラウザで検索してそれに従う。Homebrewが使えるようになるとあとは簡単。難しいことは無いがやり方を検索しながらのダウンロード・インストールに半日くらいかかった。
最後のCotEditorはApp storeからインストールした。軽くて見た目が綺麗な無料エディタ、文字コードの変換とか強い。
Vimねぇ、esc : wq! の呪文を知らないとパーティ全滅の憂き目にあう。
VScodeは一応入れてある。

:::note
Rubyist
:::

iPhone、iPadのApp storeストアで購入、モバイル用

## でははじめよう
新しい言語を勉強しようと思うとインストールが一番の難関だったりする。ここまで来れば勉強の半分は終わっている。
さて、この本ではプログラム言語Rubyの実行環境としてコマンドラインからrubyを起動する方法とirbを紹介している。

## プリント print
MacのLaunchpadにあるターミナル```>_```アイコンをクリックして起動し、さらにプロンプト```~ %```（自分のMacBook Proではこれ）の右側にirbと呪文をタイプしてリターンを押してirbを起動する。これをコマンドラインというが実は正統派UNIXだったりする。
ふんふん、Rubyはprintで文字書くのね
```Ruby:
irb(main):001:0> print("Hello, ruby.\n")
Hello, ruby.
=> nil
```
ここで固まった。
irbは何故```=> nil```を表示するのか謎。
なんと言うか、結果を印刷するだけでは無く式の戻り値も表示しているみたいだが、最初から混乱する。これからは```=> nil```は見ないことにする。

あと```nil```って何だ？
答え、```nil```は何も無い、```NaN```と同じ。

*Green_helmet@bethlehem4099·6月22日*
## print, puts, p

つぎ。
何とRubyは印刷だけでprint, puts, pの3つもやり方がある
```Ruby:irb
~ % irb
irb(main):001:0> print("Hello, Ruby")
Hello, Ruby=> nil

irb(main):002:0>puts("Hello, Ruby")
Hello, Ruby
=> nil

irb(main):003:0> p("Hello, Ruby")
"Hello, Ruby"
=> "Hello, Ruby"
```
おまけに、()有りと無しが可能で6通り

```Ruby:irb
irb(main):004:0> print"Hello, Ruby"
Hello, Ruby=> nil

irb(main):005:0> puts"Hello, Ruby"
Hello, Ruby
=> nil

irb(main):006:0> p"Hello, Ruby"
"Hello, Ruby"
=> "Hello, Ruby"
```
さらにRubyでは文字列を囲むのにダブルクォート""とシングルクォート''を使える
この例だとどちらもダブルクォートが表示される。


```Ruby:irb
irb(main):007:0> print('Hello, Ruby')
Hello, Ruby=> nil

irb(main):008:0> puts('Hello, Ruby')
Hello, Ruby
=> nil

irb(main):009:0> p('Hello, Ruby')
"Hello, Ruby"
=> "Hello, Ruby"
```

```Ruby:irb
irb(main):010:0> print 'Hello, Ruby'
Hello, Ruby=> nil

irb(main):011:0> puts 'Hello, Ruby'
Hello, Ruby
=> nil

irb(main):012:0> p 'Hello, Ruby'
"Hello, Ruby"
=> "Hello, Ruby"
```
微妙に違う。

:::note
まあ要約すると、
()は有っても無くても良く、
printは改行が無く、
putsは改行があり、
pは\"がそのまま出力され、\'は\"に変換されて出力されている。

:::


う〜ん、これはもうRubyはあれである、あれ

### Rubyはコンピュータ言語界の一蘭
>天然とんこつラーメン専門店 一蘭 >(@ICHIRANJAPAN)/Twitter
>「とんこつラーメン発祥の地(聖地) 福岡県にて昭和35年創業」

一蘭ラーメンを知らない人のためにお伝えすると、一蘭はトッピング全てを食べる人の好みに合わせて選択可能なのである
選べるのは味の濃さ、こってり度、にんにくの量、ネギの種類と有無、チャーシュー（焼き豚）の有無、秘伝のたれの量、麺のかたさ、さらに替え玉の有無など、そしてとても美味しい

*Green_helmet@bethlehem4099·6月23日*
### Pythonは東京醤油系ラーメン言語

醤油ラーメンのトッピングはメンマとナルト、ねぎ、半熟卵、ほうれん草、チャーシュー、海苔に決まっている。オプションは無い(偏見)
これも美味しい。東京醤油系ラーメンのおすすめのお店。

>onochan.jp
>十条「玉屋」誰もが「懐かしの東京醤油ラーメン」というけど、
>そんな短略的なものじゃない。このラーメンは何気ない振りを装っているけど、
>洗練された味わいが潜んでいる。 
>- 元祖 カレー研究家 小野員裕

*Green_helmet@bethlehem4099·6月23日*
### C++はラーメン二郎系マシマシ言語

>ラーメン二郎、出典: フリー百科事典『ウィキペディア（Wikipedia）』
>ja.wikipedia.org、ラーメン二郎 - Wikipedia

*Green_helmet@bethlehem4099·6月24日*
### pの感想
Rubyのpは良いな
デバッグの時に変数aを表示するのに
```Ruby:Ruby
>p a
1
```
でいける


```Python:Python
>print(a)
1
```
```C:C
>printf("%d",a);
1
```


あと、いつも書式を書くのが面倒だと思っていたので
```Ruby:Ruby
>q a
a=1
```
とか作ってくれないだろうか。

### メソッド
ところで、自分はprintメソッドという名前に違和感があるな
メソッドはクラスの定義の時に使うのではないか？
もしかしてクラスメソッドかな、それともインスタンスメソッドでコンストラクタを隠しているのか
それにRubyには関数がないのか
*Green_helmet@bethlehem4099·6月25日*
## 「日本語の表示」
学習のスタイルとして教科書の例題を見て適当に変えて自分でタイプして実行してみることにする。あと=>がわずらしいのでirbを使うのはやめて、拡張子が.rbのテキストファイルをCotEditorで作り、コマンドラインからRubyを実行するにやり方を変えた。そう、テキストファイルを保存する場所はMacintosh HDの中のユーザの中の自分の名前のフォルダだった。

```Ruby:makurano.rb

print "春はあけぼの。やうやう白くなりゆく山際、\n"
print "少し明かりて、紫だちたる雲の細くたなびきたる。\n"
```
コマンドラインから実行する。なお、➜  ~は自分のパソコンのコマンドプロンプト。

```shell:shell
➜  ~ ruby makurano.rb
春はあけぼの。やうやう白くなりゆく山際、
少し明かりて、紫だちたる雲の細くたなびきたる。
```

最新のmacOSで文字化けしない。偉い。
M1 MacBook Air, macOS Monterey 12.4

*Green_helmet@bethlehem4099·6月25日*

## 「数学的な関数」ちゃんと動く
```Ruby:math.rb
include Math
a=cos(PI/2)
b=sin(PI/4)
c=sqrt(2)
print "cos(PI/2)=",a,"\n"
print "sin(PI/4)=",b,"\n"
print "sqrt(2)=",c,"\n\n"
```
```Ruby:
➜  ~ ruby math.rb
cos(PI/2)=6.123233995736766e-17
sin(PI/4)=0.7071067811865475
sqrt(2)=1.4142135623730951
```
*Green_helmet@bethlehem4099·6月26日*

## 「コメント」

```Ruby:comment.rb
=begin
「コメント」
「コメント」
「コメント」
=end
```
はい

## 「制御構造」
if then else end, while do endはお馴染み
3.times doは目新しい

```Ruby:jack.rb
3.times do
    puts "ジャック、食べてばかりで運動しないとチー牛になるよ。"
end
```
```zsh:
➜  ~ ruby betty.rb
ジャック、食べてばかりで運動しないとチー牛になるよ。
ジャック、食べてばかりで運動しないとチー牛になるよ。
文字数・・・

#大事な事なので3回言います
```
*Green_helmet@bethlehem4099·6月26日*
## 「便利なオブジェクト」の章に進もう

## ArrayはC言語の配列とは違ってコンテナだな
int、double、str とか何でも入れられる。

*Green_helmet@bethlehem4099·6月26日*
## シンボルは新しい。コロンはfooや"foo"から離してはいけない
```Ruby:symbol.rb
sym = :foo
sym2 = :"foo"
sym_s = sym.to_s
sym2_s = "foo".to_s
puts sym, sym2
puts sym_s, sym2_s
```
## Hashは辞書型か

```Ruby:
# hash.rb
adress={name:"松本", furigana:"マツモト"}
p adress[:name]
p adress[:furigana]
```
```Ruby:
% ruby hash.rb
"松本"
"マツモト"
```
う〜ん、混乱するな

## パターンマッチング
```Ruby:pattern.rb
p /パターン/ =~ "マッチングしたい文字列"
p /Ruby/ =~ "Yet another ruby newcomer"
p /ruby/ =~ "Yet another ruby newcomer"
p /Ruby/i =~ "Yet another ruby newcomer"
```
```Ruby:pattern.rb
 nil
 nil
 12
 12
```
何文字目で一致したかがわかる。

## コマンドラインの引数を整数計算

```Ruby:arg_arith.rb
# arg_arith.rb
num0=ARGV[0].to_i
num1=ARGV[1].to_i
puts "#{num0}+#{num1}=#{num0+num1}"
puts "#{num0}-#{num1}=#{num0-num1}"
puts "#{num0}*#{num1}=#{num0*num1}"
puts "#{num0}/#{num1}=#{num0/num1}"
```
```
➜ruby arg_arith.rb 5 3
5+3=8
5-3=2
5*3=15
5/3=1
```
*Green_helmet@bethlehem4099·7月2日*

テキストファイルも読める
まあ、C言語を使ったことがあればごく普通
```Ruby:read_text.rb
# read_text.rb
file_name=ARGV[0]
file=File.open(file_name)
text=file.read
puts text
file.close
```
*Green_helmet@bethlehem4099·7月6日*
つぎ
## GREP
関数をライブラリ化
```Ruby:simple_grep.rb
# simple_grep.rb
def simple_grep(pat, filename)
    pattern=Regexp.new(pat)
    file=File.open(filename)
    file.each_line do |line|
        if pattern =~ line
            puts line
            end
        end
    file.close
    end

```

```Ruby:use_grep.rb
# use_grep.rb
require_relative 'simple_grep'
simple_grep(ARGV[0], ARGV[1])
```

この2つのファイルを作り、ユーザの中の自分のログイン名のフォルダに保存する。

```Ruby:command line
~ % ruby use_grep.rb "line" simple_grep.rb
    file.each_line do |line|
        if pattern =~ line
            puts line
```


コマンドラインでパターン"line"とファイル名simple_grep.rbを指定して上記のように実行する。うん使いやすい。

# これで「たのしいRuby」の第一部終了
*Green_helmet@bethlehem4099·7月7日*