Programming from 30

自分の備忘録が、誰かの為になれば・・

Railsの開発環境でhttps接続する!

omniauthを使用し、facebook認証をする時に詰まったので備忘録

ローカルの開発環境で、facebook認証をする際にこの接続ではプライバシーが保護されませんとエラーが出た。

原因として

  • Chromeが去年リリースしたchrome58から証明書の中の項目のCN(Common Name)の利用を非推奨化し、SAN(Subject Alternative Name)の方を利用する仕様になったため。

  • 作ったオレオレ証明書が信用に値しないため

多くの方が取っている方法として、オレオレ証明書を作成する事で解決しているが、なぜかうまくいかなかった。そこで見つけたのが、
github.com

mkcert automatically creates and installs a local CA in the system root store, and generates locally-trusted certificates. mkcert does not automatically configure servers to use the certificates, though, that's up to you.

mkcertはローカルに認証局を作成し、自身で証明書を発行する。証明書を使う為にサーバーの設定が必要。

mac

まずはインストール

brew install mkcert

認証局を作成

$ mkcert -install
Created a new local CA at "/Users/ishikawatsubasa/Library/Application Support/mkcert" 💥
Password:
The local CA is now installed in the system trust store! ⚡️
Warning: "certutil" is not available, so the CA can't be automatically installed in Firefox! ⚠️
Install "certutil" with "brew install nss" and re-run "mkcert -install" 👈

証明書を作成

$ mkcert localhost
Using the local CA at "/Users/ishikawatsubasa/Library/Application Support/mkcert" ✨
Warning: the local CA is not installed in the Firefox trust store! ⚠️
Run "mkcert -install" to avoid verification errors ‼️

Created a new certificate valid for the following names 📜
 - "localhost"

The certificate is at "./localhost.pem" and the key at "./localhost-key.pem"

Pumaの設定を記述

if ENV.fetch('RAILS_ENV') { 'development' } == 'development'
  ssl_bind '0.0.0.0', '9292', {
    key: 'tmp/localhost-key.pem',
    cert: 'tmp/localhost.pem'
  }
end

これでhttps接続完了!!!https://localhost:9292/にアクセス

f:id:tsubasa0105:20190216190045p:plain
https確認

開発環境で確認をするだけなら3行のコードで準備が完了。もしオレオレ証明書を作ってうまく行かなければmkcertでサクッと時短がベターな気がします。

:参考 Railsの開発環境でHTTPSを有効にする

CSVファイルとRubyの備忘録

最近RubyのコードでCSVファイルを使う事があったのでまとめました!

CSVファイルとは

comma-separated values(略称:CSV)は、いくつかのフィールド(項目)を区切り文字であるカンマ「,」で区切ったテキストデータおよびテキストファイル。拡張子は .csvMIMEタイプは text/csvwiki

例えばこんな感じの中身 diary.csv

id,title,content
1,今日はジム,腕立て伏せと腹筋と、スクワットをしました。
2,今日はスターバックスで勉強,とても混んでいて勉強どころではなかった。
3,美術館で草間彌生展,とても素敵な絵画が多かっった。

1行目がカラムの要素、2行目からid,title,contentという風にカンマで区切られています。

用途は色々だと思いますが、エクセルの表の様にデータをまとめる事ができます。RubyにはCSVファイルを扱うライブラリがあり、とても扱いやすくなっています。その中で、いくつかのコードを忘れない様に書き記します(自分用)!

使用方法

まずはrequire 'csv'を記載

  • 読み込み
require 'csv'
csv  = CSV.read("/path/to/file.csv")
readメソッドで
csv = CSV.read("diary.csv")
=> [["id", "title", "content"],
 ["1", "今日はジム", "腕立て伏せと腹筋と、スクワットをしました。"],
 ["2", "今日はスターバックスで勉強", "とても混んでいて勉強どころではなかった。"],
 ["3", "美術館で草間彌生展", "とても素敵な絵画が多かっった。"]
  • foreachを使って1行ずつ読み込むこともできる
require 'csv'
CSV.foreach("diary.csv") do |row|
  p row
end

["id", "title", "content"]
["1", "今日はジム", "腕立て伏せと腹筋と、スクワットをしました。"]
["2", "今日はスターバックスで勉強", "とても混んでいて勉強どころではなかった。"]
["3", "美術館で草間彌生展", "とても素敵な絵画が多かっった。"]
  • 書き込む時
require 'csv'
CSV.open("dairy.csv", "wb") do |csv|
  csv << ["4", "Yokohama.rbにいく", "プログラミングが好きな人が多かった!"]
  csv << ["5", "ハッカーの映画を見る", "聞いたことのある言語が英語で聞けた!なんか感動!"]
end

<#CSV io_type:File io_path:"diary.csv" encoding:UTF-8 lineno:2 col_sep:"," row_sep:"\n" quote_char:"\"" headers:["4", "Yokohama.rbにいく", "プログラミングが好きな人が多かった!"]>

これでもいける!!

CSV.open("diary.csv", "a") do |csv|
  csv.puts ["6","今日は門前仲町に行きました","行ったらイベントが休みだった!メールで来てた!"]
end

dairy.csvを見ると

id,title,content
1,今日はジム,腕立て伏せと腹筋と、スクワットをしました。
2,今日はスターバックスで勉強,とても混んでいて勉強どころではなかった。
3,美術館で草間彌生展,とても素敵な絵画が多かっった。
4,Yokohama.rbにいく,プログラミングが好きな人が多かった!
5,ハッカーの映画を見る,聞いたことのある言語が英語で聞けた!なんか感動!

4と5がちゃんと増えています。

また面白いと思ったのは、CSV::tableを使って、データベースのテーブルの様に扱うことができる点

require 'csv'

table = CSV.table("diary.csv")
=> #<CSV::Table mode:col_or_row row_count:6> #header含め6行

table.headers
=> [:id, :title, :content] # headerを確認できる
table.class
=> CSV::Table  #インスタンスはcsv.tableクラス
table[0]
=> #<CSV::Row id:1 title:"今日はジム" content:"腕立て伏せと腹筋と、スクワットをしました。">  #インデックスで取得できる
table[1]
=> #<CSV::Row id:2 title:"今日はスターバックスで勉強" content:"とても混んでいて勉強どころではなかった。">
table.first
=> #<CSV::Row id:1 title:"今日はジム" content:"腕立て伏せと腹筋と、スクワットをしました。">
able[:id]
=> [1, 2, 3, 4, 5] #headerでも取得可能
table[:title]
=> ["今日はジム", "今日はスターバックスで勉強", "美術館で草間彌生展", "Yokohama.rbにいく", "ハッカーの映画を見る"]
  • ループでも回せる
table.each do |row|
   puts "#{row[0]} #{row[1]} #{row[2]}"
end
#=>
1 今日はジム 腕立て伏せと腹筋と、スクワットをしました。
2 今日はスターバックスで勉強 とても混んでいて勉強どころではなかった。
3 美術館で草間彌生展 とても素敵な絵画が多かっった。
4 Yokohama.rbにいく プログラミングが好きな人が多かった!
5 ハッカーの映画を見る 聞いたことのある言語が英語で聞けた!なんか感動!
=> #<CSV::Table mode:col_or_row row_count:6>
  • 消したい行がある時
  csv_table = CSV.table("diary.csv", headers: true)
  csv_table.by_row!
  csv_table.delete_if { |row| row.field?("今日はジム") }

結構値の取得方法があり、まさにデータベース!さすがRubyのライブラリですね!

【Ouraring】と【ヘルシープログラマ】

はじめに
この記事ははじめてのアドベントカレンダーの17日目の記事です。前日はいづさんのJoy,Inc ひとり読書会 #4 - 会話、儀式、道具 -でした。 Joy,lnc 役職も部署もない全員主役のマネジメントという本について書いてあり、本からの学びを実践され変化もあったようです!是非、一読を!

テーマについて

さてさて、 アドベントカレンダーに参加させて頂き、何についてブログを書こうかとずっと考えていました!プログラミングの記事をずっと載せていたのですが、今回は少し外して,

【トラッキングディバイスと健康】について書きます!

私は若干の健康オタクのため、日々健康に気を使っています! プログラマーとして長きに渡り仕事をしていくためには、健康第一。心身の健康あってのお仕事だと思います!
そんなの気にしなくても・・と声が聞こえて聞こえてきそうですが、天敵である【腰痛や痔、睡眠障害】にはならないように最近はOuraringヘルシープログラマで健康管理しています!

Ouraringとは

まずはOuraring ouraring.com
私にお金が入るわけではないですが、

  • 赤外線光パルス測定、3D加速度計、ジャイロスコープ、体温センサーが内蔵
  • 活動量・睡眠の質・ストレスレベルなどを計測してくれる
  • "心拍変動" を測定してくれる
  • 勿論防水

一週間ちょっと使っていますが結構なデータが取れます

f:id:tsubasa0105:20181216225704p:plain
一週間の私のデータ

こんな感じでトラッキングしてくれて、アドバイスもくれます!赤字があまり良くないポイントで改善すべき点。もう少しすると、適切な睡眠時間とかも教えてくれるらしいです。
睡眠はストレスと密接に関わっているため、自分の睡眠状態と疲労回復度がわかるとコントロールしやすいですよね!そんなことを言っても大変な環境に身を置かれる方もいますが、数値化されるとアクションを起こしやすいのではないかと思います!

また結構嬉しい機能として長時間椅子に座っていると、

f:id:tsubasa0105:20181216230439p:plain
休憩を知らせてくれる!

指輪自体が振動してくれるともっといいんですが。

座っている事が害だと考えられている

座っていることによって寿命の期待値が減少するということには、多くの科学的根拠があるのです。 2009年に、ルイジアナのペニントン生物医学研究センターの研究者は、あらゆる研究理由による死亡率について、座っている時間の長さが直接関係することを示唆する研究結果を公表しました。(中略)
最終的に判明したのは、最も座って過ごしていた被験者たちは、若年死する確率が50%以上高かったということでした。
参考:ヘルシープログラマ

最近は長時間座ることが体に良くないことが浸透しつつあり、気を遣う方もいると思いますが、意識しようと思ってても忘れてしまいます。

そんな時に休む時間を知らせてくれると「態勢を変えてないな」や「呼吸が浅いな」など自分の状態に気づく事ができるのでは?

改善策として、

British Journal of Sports Medicineにおける最近の研究結果は、1時間あたりわずか5分の運動で、座ることの悪影響のほとんどを十分打ち消せることを示唆しています

と疾病リスクを減らすようアドバイスポモドーロテクニックを勧めています。

  • ちなみに健康的なポモドーロブレイク
    • 25分タイマーをセットする
    • 1つのタスクの作業を始める
    • タイマーが終わったら作業を止める。(タスクが完了していなくても止める)
    • 5分間の休憩を取り、1に戻る

まとめ

簡単に睡眠改善と仕事時に意識する事について書いてみました。プログラマになろうと思った時から多くの友人に「過酷な業界だぞ!」「30からなる仕事じゃない」「体を壊すぞ!」と言われました。

ただ今は話を聞いてると、そんな事もなく、プログラマの健康を気遣う会社も増えています。自分でなると決めたからにはいかに自身の健康を管理していくかだと思います!

良く寝て、適度に休憩して楽しくコードを書いていきましょう!かなり冷え込んできたので、風邪には気をつけてください!

”Rails Developers Meetup 2018 Day 4”にいってきました!!【雰囲気と感想】

初めてRails Developers Meetupに行ってきたので、行こうか行くまいかを悩んでる方向けに簡単に雰囲気と感想を書きます!

Rails Developers Meetup とは

第一線で活躍する開発者・導入企業から、RubyRailsに関する 発想・アプローチ・成功体験・失敗体験を学ぶ、非営利技術カンファレンスです。
参考:

railsdm.github.io

初心者だと「Meetupって知り合いがいないからなあ」「行ってもわからない」などあって若干敷居が高い感じがします。

なぜ初心者の僕が行ったのか?

僕自身もRailsチュートリアルくらいしかやったことがなくRubyも絶賛勉強中!知り合いも数人・・・きっとぼっちになる。何を話しているかわからないだろう!!と思っていました。

  • ん?でもこれって裏を返すと、全て参加する理由になるのでは?!
    • 勉強中ならどう勉強して良いか聞いてみては?
    • 知り合いがいないなら増やして、楽しい情報をゲット
    • 1つくらいは理解できる。きっと面白い話もある

と思い、思い切って参加してみる事にしました! ただ、申し込みぺージを見るとキャンセル待ち!?かなり人気です!ただこのキャプチャは最近のもので、僕が申し込んだのは、ボランティア枠が9人だったのでチャンスと思って申し込みました。

f:id:tsubasa0105:20181209105332p:plain
参加申し込みページ

スタッフとして参加したのは後述しますが大正解でした!!

  • 当日の流れですが
    • 9:00 会場受付に集合
    • 9:00 - 10:00 会場準備
    • 10:00 - 11:00 自由もしくは受付近辺で待機
    • 11:00 - 18:00 1人30分11:00 - 18:00までの1枠を担当。それ以外は自由
    • 18:00頃から懇談会準備
    • 22:30 懇談会後片付けして終了

初心者向けの内容

皆さん素晴らしいお話をされていたのですが、僕の知識と理解が足りていない為、「いろいろ大変な事もあるのかあ」と難しい事が多かったですが、わからない用語を調べたりと勉強になる面も多かったです。
その中でも、初心者向けの内容として
【プログラミング初心者に教えるときは「身近な比喩」が重要なのだ!】 という題で話をされたブロガーの吉田 慶章さんのお話しです!kakkuさんと呼ばれていて、今回は新人にプログラミングを教える時のティップスを話されていました。登壇後も周りでは「わかりやすくてただ楽しかった」といった意見が多く、プログラミングをわからない人でも理解できます。

kakakakakku.hatenablog.com
また、【エンジニア視点で語る、人生のX軸の広げ方】というテーマで話されたストリートアカデミー株式会社 北川 徹さん。
自身の生い立ちから、いかに横の関係を広げる事で仕事もプライベートも充実させていくかといった内容を話されていて、プログランミングの話はゼロ!最後にツッコミがありましたが、とても楽しい内容でした。
なので、初心者の方でもとっつきやすい話はいくつかあります!
ぼっちにならないか心配の方に関しては、スタッフで参加していれば、人と話し自己紹介するタイミングしかないので、自然とぼっちにはなりません!勉強中ですとお話しすると、励ましの言葉やできるようになったら弊社を受けてみてね!などありがたい言葉をかけてくださる方ばかり!
なんと言っても、twitterでフォローしている方がどういった方で、どういう事を考えているのかを知る事ができたのが収穫でした!
初めてRuby/Rails コミッター 松田さんに会い、お話を聞きました!主にRubyconfとRubyKaigiの違いや、今後のRubyKaigiの方向性を話されていて、会場全員が話にのめり込んでるいたのが印象的でした!

f:id:tsubasa0105:20181209115555j:plain
松田さんの登壇

といった形でメリットばかりのRailsDMでした!

  • メリット
    • スタッフとして参加する事で、ぼっち回避し人間関係が広がる
    • 採用担当の方の話が生で聴ける
    • 現場の雰囲気がわかる
    • 顔を覚えてもらえる
    • 敷居なんて最初からない

次回もスタッフとして参加したいと思います!ちなみに話した方で初心者の方はいらっしゃいませんでしたが、Rubyistの方皆さんから優しくして頂き、モチベーションが更に上がりました!勉強頑張ります!

【Ruby】bundle install と bundle updateの際に出るエラー解消!!

なぜかわからないけど、以下のエラーが出るようになりました😅インストールはできているけど、いつか大きなバグに繋がるので解決しておきました!

$ bundle install 
Ignoring bindex-0.5.0 because its extensions are not built.  Try: gem pristine bindex --version 0.5.0
Ignoring byebug-10.0.0 because its extensions are not built.  Try: gem pristine byebug --version 10.0.0
Ignoring byebug-9.0.6 because its extensions are not built.  Try: gem pristine byebug --version 9.0.6
Ignoring ffi-1.9.23 because its extensions are not built.  Try: gem pristine ffi --version 1.9.23
Ignoring nio4r-2.2.0 because its extensions are not built.  Try: gem pristine nio4r --version 2.2.0
Ignoring nokogiri-1.8.2 because its extensions are not built.  Try: gem pristine nokogiri --version 1.8.2
Ignoring puma-3.11.3 because its extensions are not built.  Try: gem pristine puma --version 3.11.3
Ignoring puma-3.9.1 because its extensions are not built.  Try: gem pristine puma --version 3.9.1
Ignoring sqlite3-1.3.13 because its extensions are not built.  Try: gem pristine sqlite3 --version 1.3.13
Ignoring websocket-driver-0.6.5 because its extensions are not built.  Try: gem pristine websocket-driver --version 0.6.5
(省略)
Using rails 5.2.1
Using tilt 2.0.8
Using sinatra 2.0.4
Bundle complete! 3 Gemfile dependencies, 49 gems now installed.
Bundled gems are installed into `./vendor/bundle`

上記のエラーで検索をかけると結構同じ症状に悩まされる方が多いようです。

Ignoring gems because its extensions are not built [duplicate]

rails test で nokogiri のエラーが発生するときの対処

ruby関係のコマンドを入力すると常にエラー?警告?が出る

他にも多数解決策が挙げられているが、私の症状を解消するものはなく、メンターの駒形さんに相談!「rbenvrubyの再インストール。ダメならクリーンインストール!」というアドバイスを頂き実行!

まずはrbenvruby_buildの入っている~/.rbenvを削除

rm -rf ~/.rbenv

次にrbenvruby_buildの再インストール

# rbenvをgitからクローン
git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
# rbenvげのパスの設定
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
exec $SHELL -l
# rbenvが入っているか確認
rbenv --version
# ruby_buildのインストール
git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
# rubyのインストールするリストを確認
rbenv install --list 2.5.1をインストール
rbenv install 2.5.1
# rubyのバージョン確認
ruby -v
# 2.5.1を使用する
rbenv global 2.5.1
# rbenvのrubyを使っているか確認
which ruby -> ok!!!

bundlerもインストール

gem install bundler
# 確認
bundler -v
# ~/.rbenv/versions/2.x.y/bin/ 以下に置いてあるコマンド群を ~/.rbenv/shims/以下に置いて使えるようにする

rbenv rehash

#インストールパスを指定
 bundle install --path vendor/bundle

最後のコマンドを叩くと再度エラー発生

Retrying fetcher due to error (2/4): Bundler::Fetcher::CertificateFailureError Could not verify the SSL certificate for https://rubygems.org/.
There is a chance you are experiencing a man-in-the-middle attack, but most likely your system doesn't have the CA certificates needed for verification. For information about OpenSSL certificates, see http://bit.ly/ruby-ssl. To connect without using SSL, edit your Gemfile sources and change 'https' to 'http'.
Retrying fetcher due to error (3/4): Bundler::Fetcher::CertificateFailureError Could not verify the SSL certificate for https://rubygems.org/.
There is a chance you are experiencing a man-in-the-middle attack, but most likely your system doesn't have the CA certificates needed for verification. For information about OpenSSL certificates, see http://bit.ly/ruby-ssl. To connect without using SSL, edit your Gemfile sources and change 'https' to 'http'.
Retrying fetcher due to error (4/4): Bundler::Fetcher::CertificateFailureError Could not verify the SSL certificate for https://rubygems.org/.
There is a chance you are experiencing a man-in-the-middle attack, but most likely your system doesn't have the CA certificates needed for verification. For information about OpenSSL certificates, see http://bit.ly/ruby-ssl. To connect without using SSL, edit your Gemfile sources and change 'https' to 'http'.
Could not verify the SSL certificate for https://rubygems.org/.
There is a chance you are experiencing a man-in-the-middle attack, but most likely your system doesn't have the CA certificates needed for verification. For information
about OpenSSL certificates, see http://bit.ly/ruby-ssl. To connect without using SSL, edit your Gemfile sources and change 'https' to 'http'

このエラーはbundle installの実行時にhttps:// rubygems.org/.に対してhttps接続したんだけど、SSL証明書がきちんと確認できてませんよというときに発生する。このときに確認した手順としては、 1,OpenSSLがきちんと入っているか? 2,証明書が有効なものになっているのか? の二点。詳しい手順は以下に記載します。

参考:rails の bundle install が 「Could not verify the SSL certificate for https://rubygems.org/.」で失敗するとき こちらの方に助けて頂きました!

その後bundle install --path vendor/bundleを叩く!

Fetching gem metadata from https://rubygems.org/..........
Fetching gem metadata from https://rubygems.org/.
Resolving dependencies...
Fetching rake 12.3.1
Installing rake 12.3.1
(中略)
Bundle complete! 3 Gemfile dependencies, 49 gems now installed.
Bundled gems are installed into `./vendor/bundle`
Post-install message from yard:
--------------------------------------------------------------------------------
As of YARD v0.9.2:

RubyGems "--document=yri,yard" hooks are now supported. You can auto-configure
YARD to automatically build the yri index for installed gems by typing:

    $ yard config --gem-install-yri

See `yard config --help` for more information on RubyGems install hooks.

You can also add the following to your .gemspec to have YARD document your gem
on install:

    spec.metadata["yard.run"] = "yri" # use "yard" to build full HTML docs.

--------------------------------------------------------------------------------

できました!

結構ここまで来るのにかなり時間を費やしてしまいました!最後の選択肢のクリーンインストールまでいかなくて良かったです。原因としてはOS Mojaveをインストールした事からの権限異常の確率が高いそう。OSインストールのタイミングは考えたいものです。
今後は関連していそうなものを再インストールを選択肢としていきます!駒形さんには毎度感謝しかございません!ありがとうございます!

初心者が【ゼロからわかる Ruby 超入門】をやり終えて・・

本日11月22日発売のゼロからわかる Ruby 超入門 gihyo.jp

やり終えての感想をこれからRubyを学ぶ初心者の方へ!

《私のスペック》

  • FjordBootCamp受講生 最近Rubyの学習開始
  • 文系初心者 通常の人より理解が低め
  • Ruby入門サイトを学習
  • 🍒本 7章くらいまで

《この本を学習した経緯》

🍒本の7章くらいまでいくも私のレベルでは難しく、一旦ストップ😱

自身の基礎レベルの低さに気づき、メンターの駒形さんに相談

ゼロからわかる Ruby 超入門を勧めていただく!

やり終えた!

《 まず始めに感じた事をドンッと箇条書き!》

①見やすいデザインと図解で理解が捗る
②練習問題が多いので、インプットからアプトプットまでできる
③エラーが起きた時の対応が優しくわかりやすく書いてある
④ドキュメントの読み方の説明がある
⑤理解のためにあえて簡単な例で教えてから、実用的な使い方まで教えてくれる
⑥コードの解説はこれでもか!というくらい初心者の事を考え解説
⑦イラストがなんともかわいらしい
⑧使いこなす為の発展した知識も得られる

結構あります!

《ぼやっとからイメージを掴む》

Rubyを簡単に学習し、ぼやっとした状態で参考書に目を通してみると結構難しい。まずは図解をしてから頭に入れる学習方法を取っている私にとっては、分厚い技術書はかなりの曲者!!だからドキュメントをなかなか解読できないのかも・・・
ただ、Ruby超入門は文字も大きく絵が多い!更に、難しそうなメソッドやクラス、WEBアプリの仕組みあたりはわかりやすい図解が入っています!頭の中で絵が浮かぶというのは、「こういう事かあ」というくらい懇切丁寧な説明付き!!
コードの説明においては、こんなところもわからないのか!というところがわからないのが初心者🤔で、通常は省かれるであろうコードが処理される流れを最後まで説明してくれる。自分の頭がぼやっとしている点から、イメージが湧いて線で繋がる。そういう事か!!が増えると楽しくなる😋
また各章の終わりに練習問題が結構ついていて、インプットだけでは終わらず、自身の理解度もチェックできる!手頃な練習問題をウェブ上で探しても、レベルに合ったものがないので、アウトプットをその場で段階的にできるのは自信に繋がる!

《超入門であるということ》

表紙の若葉マークが示している通り始まったばかり。これからいかに技術を発展させるかは自分次第。メンターの駒形さんからは手当たり次第Ruby本を読みなさいとアドバイスを頂いているので、これから自己投資を惜しまず技術書を買い漁ります!そしてWelcome back to 🍒本!!頑張ります!難しい本で勉強をされてきた諸先輩方に追いつく気持ちで突き進みます💪

《結びに》

簡単にしか感想を書けませんでしたが、今からRubyを学ぶフィヨルドインターン生又は、これからプログラミングを勉強する方にはRuby超入門をお勧めします!技術書はその人のレベル知らないとお勧めしづらいですが、特に私みたいな基礎のない初心者へ。
またTwitterに「当時の自分に渡してあげられれば...と悶絶するくらい素晴らしい本」 pupupopo88.hatenablog.com と書かれている方の記事も是非参考に。
この本を読んで良かった事は、初心者の私が今欲しい説明をドンピシャのタイミングで受け取る事ができた事。これに尽きます。献本の段階から本書を貸して頂いたメンターの駒形さん、著者の五十嵐さん、松岡さん(面識はございませんが勝手に)に感謝申し上げます!

引き続き勉強を進めます!

Ruby hashクラス 【 hash[hoge] += 数値 】の謎

hashの勉強をしていて、ん????なんだこれ??見た事あるけど、いまいち頭に入ってこない😩!!となったので、手を動かして理解まで進めてみた!
よくわからなかったのはこんなコード!

hash = Hash.new(0)

array = "Mississippi".chars

array.each do |j|
  hash[j] += 1
end

p hash

#=> {"M"=>1, "i"=>4, "s"=>4, "p"=>2}

こういったコードを見た時、戻り値の表示が腑に落ちず、なぜこのように返ってくるのかとても疑問でした。
問題は

hash[j]  += 1

の部分!array.each で"Mississippi"の一字ずつ変数jに入れ、hash[j] += 1の処理をする・・・ん?わからない・・。どうしてhashの形で合計されて出力されるのか。
初心者だからか、sum += 1なら見慣れているけど、hash[j] += 1ということは
hash[j] = hash[j] + 1という事。最初の"M"を入れるとhash[M] = hash[M] + 1になる。この結果が{"M" => 1}となる事が見慣れてないせいか、理解に苦しんだ。+= 数字をする事で、なぜvalueが1になるのか。sは"Mississippi"の中に4回も現れ、結果として"s" => 4と出力されているが、hash[:s] => 1 = hash[s] + 1を繰り返して、加算されている。どうせならhash[j] +=> 1こんな感じにしてくれると、記号でしっくりくる。でも、やっぱりわからないので、コンソールで色々といじってみたらなんとなく理解できた!

# まずはhash.new(0)でデフォルト値を設定!しないと計算ができない。
h = Hash.new(0)
# 今のところ当然中身は何もなし
p h     #=>  {}
h.keys    #=> []
h.values   #=> []
# hのkeyをsに設定するとデフォルトの0がvalueとして入る
h[:s]   #=> 0 

# ここでh[:s]に + 1をしてみる
h[:s] +=  1    =>  1
# ↑増えました!!という事は
h[:s] += 1     =>  2
h[:s] += 1     =>  3
h[:s] += 1     =>  4
# ↑ちゃんと1ずつ増えます!
ここでp hをすると
p h
=>   {:s  =>   4}
となりました!👍

コードと出力の結果の間を細かく確かめながらいくと、どう処理が行われて結果として出力されているのかがわかりました!違和感のあるコードは分解していこうと肝に命じて一件落着😄