give IT a try

プログラミング、リモートワーク、田舎暮らし、音楽、etc.

「プロを目指す人のためのRuby入門」で6.3.3項のサンプルコードがなぜか動いてしまう場合の対処法

このエントリは拙著「プロを目指す人のためのRuby入門(通称・チェリー本)」のサポート記事です。

6.3.3項(187〜188ページ)に載っているサンプルコードをirb上で写経していくと、書籍ではエラーになるはずのコードがエラーにならないケースがあります。

f:id:JunichiIto:20200906144357p:plain

これはirb上で連続してコードを打ち込んでいるためです。
一度irbを再起動させてからエラーになるコードを入力すると、書籍の説明通りエラー(NameError)が発生します。

f:id:JunichiIto:20200906144614p:plain

もっとくわしく

6.3.3項のサンプルコードをirb上で打ち込むと、次のコードを実行することになります。

text = '私の誕生日は1977年7月17日です。'
# キャプチャの名前がそのままローカル変数に割り当てられる
if /(?<year>\d+)(?<month>\d+)(?<day>\d+)/ =~ text
  puts "#{year}/#{month}/#{day}" #=> 1977/7/17
end

この時点でyearmonthdayという3つのローカル変数がirb内に定義されます。

その次に出てくる以下のサンプルコードは、「正規表現を使ってもローカル変数が作成されない」ということを説明するためのコードです。

text = '私の誕生日は1977年7月17日です。'
# 正規表現が右辺に来るとローカル変数が作成されない
if text =~ /(?<year>\d+)(?<month>\d+)(?<day>\d+)/
  puts "#{year}/#{month}/#{day}"
end
#=> NameError: undefined local variable or method `year' for main:Object

なのですが、1つ前のコードを実行したことにより、すでにyearmonthdayがローカル変数として定義されてしまっています。
そのため、本来であれば「yearが未定義なのでエラー(NameError)」となるべきところが、エラーにならず普通に実行できてしまうわけです。

# 本当はyearもmonthもdayもないよ!となるはずが、すでに存在するので動いてしまう
puts "#{year}/#{month}/#{day}"

irbを再起動すればローカル変数はすべてクリアされます。
ですので、再起動した直後に先ほどのコードをもう一度実行すれば、期待どおり「yearが未定義なのでエラー(NameError)」になります。

まとめ

この件はフィヨルドブートキャンプの生徒さんやSNS上の読者さんで、同じ疑問を持っていた人を見かけたので、今回ブログ記事として説明させてもらいました。
記述ミスではないとはいえ、初心者さんにとってはたしかにややこしい落とし穴になってしまっているため、改訂版を出す機会があればこの点をひとこと補足しておこうと思います。

【動画公開】RSpec初心者向けのオンライン勉強会を開いてみた (RSpecビギナーズ!! vol.1)

はじめに

先日、僕の突然の思いつきでRSpec初心者向けのオンライン勉強会を開いてみました。
題して「RSpecビギナーズ!! vol.1」です!

・・・といっても、おそらくほとんどの人が「え、いつそんな勉強会やったの?告知ページはどこ?」と思われるかと思います。
それもそのはず、だってこの勉強会は僕がTwitterで「RSpecの勉強会があったらいいな」とつぶやいている人に声をかけて開催した、個人的な勉強会だからです!

ちなみにそのツイートがこちらです↓


勉強会を開こうと思った理由

上のツイートをしてくれた「かなさん」ですが、以前から面識があったのかというと、全くありません!!
本当にたまたまツイートを見かけただけです。

じゃあ、なんでそんなことを僕がしたのかというと、以前から初心者向けのRSpec勉強会をやってみたいな〜と思っていたからです。
Twitterを見てると、よく「RSpecがわからない、動かない、難しい!!」といった嘆きの声をよく見かけます。
僕としては「いったいどこで困っているの?どのへんが難しいの??」と思って気になるのですが、ツイートだけ読んでも具体的にどういう内容で困っているのかがわかりません。
なので、「そういった人たちをつかまえて、RSpecで困っている具体的なポイントを聞き、その問題を解決してあげたいな〜」という野望(?)をここ数年ずっと持っていたのでした。

「RSpecがわからない」だけだと声をかけづらいのですが、かなさんの場合はそれに加えて「勉強会がないかな」というコメントも一緒に付いてたので、「やりましょう!!」と僕も声をかけやすかった、というわけです。
(それでも見ず知らずの人にいきなり声をかけるのは、たぶん僕ぐらいと思いますが 😅)

どんな勉強会だったの?

開催方式について

最初は普通の勉強会みたいに告知ページを用意して、参加者を募ろうかと思っていたのですが、告知ページを作るのが面倒だったのと、告知ページを作って募集をかけるとそれだけで日数が経過するので、さくっと開催するために参加者は「かなさんの知り合い」に限定させてもらいました。

ただし、完全にクローズドな勉強会にして、僕の知見がかなさんとその知り合いの人たちだけに閉じてしまうのはもったいないと思ったので、勉強会の様子を動画で撮って無料公開することを開催の条件とさせてもらいました。

また、コロナ禍ということもあり、直接会いに行くわけにもいかないので(そもそも地理的にも遠い)、Zoomを使ったオンライン勉強会としました。
開催時間は1時間半です。

f:id:JunichiIto:20200829164757j:plain
Zoomで画面共有しながら勉強会を開きました
当日の内容について

参加者のみなさんに事前にRSpecに関する質問を考えてきてもらい、それに僕がその場で回答する、という勉強会にしました。
なお、対象レベルは「RSpecの完全な初心者」です。

具体的に以下のような質問に順に答えていきました。

  • Q1. 関連モデルのテストについて
  • Q2. type: :model って必要?
  • Q3. Docker で save_and_open_page
  • Q4. モデルのテストがうまく動かない
  • Q5. テスト駆動開発の回し方について
  • Q6. 現場にシステムスペックを導入したい
  • Q7. テストの優先順位について
  • Q8. 他の spec を require する?しない?

動画はこちらです!

前述のとおり、勉強会の様子は録画してYouTubeに公開しています。(約30分 x 3本)
いろいろと初心者の方に役立つお話があると思うので、RSpec初心者の方はぜひチェックしてみてください!

なお、動画の解像度の関係で、動画を見る場合はスマホよりもPCやタブレットのような大きな画面で見ることを推奨します。

1/3「関連モデルのテストについて」「type: :modelって必要?」「Dockerでsave_and_open_page?」

  • 05:18 関連モデルのテストについて
  • 12:55 type: :model って必要?
  • 18:28 Docker で save_and_open_page?
2/3 「モデルのテストがうまく動かない」「テスト駆動開発の回し方について」

  • 00:00 モデルのテストがうまく動かない
  • 20:40 テスト駆動開発の回し方について
3/3 「現場にシステムスペックを導入したい」「テストの優先順位について」「他のspecをrequireする?しない?」

  • 00:00 現場にシステムスペックを導入したい
  • 11:03 テストの優先順位について
  • 20:37 他の spec を require する?しない?

声をかけてもらったらvol.2も開催するかも?

今回開催した「RSpecビギナーズ!!」ですが、タイトルに"vol.1"と入れているので、今後もニーズがあれば続けてみようかな〜と思っています。

開催の条件はこんな感じ(=vol.1の条件と同じ)です。

  • 勉強会の様子を動画に撮って公開しても大丈夫なこと
  • 時間は1時間から1時間半程度
  • なるべく実際のコードを見せてもらうこと(コードがないと空中戦になってしまい、実のある議論にならないため)
  • 参加者は1人〜5人程度(僕が顔と名前が覚えられるぐらいの人数で)
  • 初歩的な質問を歓迎します(あまり高度な内容だと僕も答えられないかもしれないので、事前にご相談ください)

上記の条件に合致する場合は無料で開催します!
もし「自分のお悩み相談も聞いてほしい!」という人がいたら、TwitterのDM等で気軽にお声がけください😃

なお、「会社のコードを見せるので動画は公開しないでほしい」「丸1日使って教えてほしい」といった場合は「お仕事」として有料で対応しますので、ご相談ください。

まとめ

というわけで、今回のエントリでは先日開催したRSpec初心者向けのオンライン勉強会について紹介してみました。

RSpec、というかRSpecに限らずMinitestで書くときもそうなのですが、テストコードの書き方は慣れるとサクサク書けるようになるのですが、意外と変な落とし穴やツールのクセみたいなものも多いので、最初の頃はたくさんハマって無駄に時間を溶かしてしまうことも多いと思います。

実際僕もたくさんハマった結果、今のスキルが身に付いたわけですが、完全に自力でがんばるよりも、誰かの助けを借りながら習得した方が絶対効率が良いです。
変にハマりまくると「テストなんて大嫌い!!」といったマイナスの感情を持ってしまうかもしれません。

テスト大好きな僕としては、できるだけ「テスト嫌い」の人を減らし、「テスト好き」な人を増やしていきたいと思っているので、今後もこういう活動をやっていけたら嬉しいな〜と思っています。

「RSpecでハマりまくっててテストが嫌いになりそう😢」という初心者の方は、ぜひ僕と一緒にお勉強しましょう😘

あわせて読みたい

過去の公開したテストコード関連のブログ記事やスライド、訳書のリンク集です。
初心者の方はこちらもぜひ参考にしてみてください。
blog.jnito.com
blog.jnito.com
qiita.com
leanpub.com

最近のMacとiOSデバイスのバックアップ環境を紹介してみる

はじめに

もはや僕の仕事と生活においては欠かすことができなくなってしまったMacとiPhone。
いや、僕だけでなく、僕の家族もほぼ同様です。たぶんみんなスマホなしでは生きていけないはず。

ふだん当たり前のように使っているMacやiPhoneですが、これがある日突然壊れてデータが全部吹っ飛んでしまったら大変です。
データがなくなること自体が大損害ですし、精神的なダメージも大きくなります。

なので、万が一の事態に備えてしっかりとバックアップを取っておくことが重要だと思います。
そこで今回のエントリでは、我が家のMacとiPhoneのバックアップ環境を紹介します。

【もくじ】

仕事用のMac = 外付けSSD + TimeMachine

仕事で使っているMacは外付けSSDにバックアップを取っています。
バックアップツールはmacOS標準のTimeMachineです。

外付けSSDは直接Macにつながず、EIZOの27インチモニタをUSBハブとして使っています。

f:id:JunichiIto:20200830092359p:plain

EIZOのEV2785はUSB-CポートからMacに給電もできるので、Mac本体に接続するUSBケーブルは1本だけで済みます。

f:id:JunichiIto:20200830092628j:plain
blog.jnito.com

外付けSSDはコンパクトのなので、ケーブルボックスの中に入れています。
電源ケーブルも接続する必要がないので、デスク周りもスッキリです。

f:id:JunichiIto:20200830093147j:plain

実は紆余曲折あった外付けSSDまでの道のり

もともと仕事用のMacは、このあと紹介する家庭用のMacと同様、無線ルーター経由のNASにバックアップを取っていました。
しかし、macOSをCatalinaにアップグレードした影響なのか、最近頻繁に「Time Machine でのバックアップの検証が完了しました。信頼性を向上するために、Time Machineは新規バックアップを作成する必要があります。」というような警告が出るようになってしまいました。

f:id:JunichiIto:20200830104345p:plain:w400
この警告が出るとゼロからバックアップをやり直すことになります😣

ネットの情報をあれこれ調べ回って試行錯誤したのですが、どうしてもこの警告を消すことができず、泣く泣く外付けSSDに乗り換えました。

【参考にしたが解決に至らなかった情報源あれこれ】

下のページではセキュリティ対策ソフトが影響しているのではないかという情報が載っています。
弊社ではFalconというセキュリティ対策ソフトを使っていて、もしかしてその影響かな?と思ったのですが、サポートセンターに相談したりしても結局解決できずじまいでした。

ほかにも「Acronis True Image」や「Carbon Copy Cloner」など、サードパーティー製のバックアップツールも試してみましたが、こうしたソフトも数日使うとエラーが出たり、TimeMachineと比較するといくつか不満が出てきたりしたので、採用には至りませんでした。

そんなこんなで、この3ヶ月ぐらい、ひたすらバックアップツールに関する試行錯誤をしていたのですが、最終的には「USB接続したHDDやSSDが一番安定する」という結論になり、この方式に至ったのでした。

外付けにするとFinder上の取り外し操作がちょっと面倒

この方式の難点は、「MacからUSBケーブルを外す前にSSDの取り外し操作をしないとMacに怒られる」という点です。
雑に外してバックアップデータが壊れても困るので、いちおう取り外し操作をするのですが、ちょっと面倒ですね・・・😣

f:id:JunichiIto:20200830094938p:plain

家庭用のMac = BuffaloのNAS + TimeMachine

一方、家庭用のMacは無線ルーター経由で接続したNASにTimeMachineでバックアップを取っています。
仕事用のMacとは異なり、こちらは安定してバックアップが取れています。

f:id:JunichiIto:20200830095540p:plain

この方式については以下のブログ記事で詳しく説明しています。
blog.jnito.com

iOSデバイス(iPhone、iPad)= iCloudストレージ

我が家にはiPhone 4台、iPad 2台の合計6台のiOSデバイスがあります。
ちょっと前までは家庭用Macに接続して、Mac本体のSSDにバックアップを取っていました。

ただ、このやり方だと、「いちいち6台のiOSデバイスを抜き差しするのが面倒くさい」「Mac本体のストレージ容量がバックアップデータだけで食い潰される」という問題がありました。

とくに、バックアップが面倒くさくなってくると、バックアップの間隔が何ヶ月も空いてしまい、いざというときにバックアップデータが古すぎて大事なデータが失われてしまった、という問題が起きかねません。

そこでつい最近、iOSデバイスのバックアップはすべてiCloudストレージに保存することにしました。
こうすれば、電源につないでいる間に勝手にiOSデバイスが毎日バックアップを取ってくれます。
これで「バックアップの間隔が何ヶ月も空いてしまう」という問題は解決です!

f:id:JunichiIto:20200830101029p:plain

意外と安い?iCloudストレージ

以前からiCloudストレージの存在は知っていたのですが、iCloudストレージは値段が高い、というイメージでした。
しかし、改めて価格を見てみると、2TBでも月額1300円で「意外とそこまで高くないやん」と思いました。

f:id:JunichiIto:20200830103645p:plain
https://www.apple.com/jp/icloud/ から抜粋

我が家は6台のiOSデバイスがあり、ストレージ容量を合計すると700GBぐらいありました。
なので、2TBを契約するしかないのかな?と思ったのですが、実際にバックアップを取ってみると6台合わせても76GB程度でした。
というわけで、現在は200GB(月額400円)のプランを選択しています。

月額400円で6台ぶんのバックアップの面倒さから解放されるなら、全然ありなのでは?というのが僕の見解です。

写真 = Googleフォト(無料プラン)

写真や動画はどんどん増えてMacやiPhoneのストレージを食い潰してしまうので、すべてGoogleフォトにアップロードし、MacやiPhoneからは定期的に削除するようにしています。

f:id:JunichiIto:20200830103423p:plain:w350

Googleフォトは圧縮ありの無料プランで使用しています。
僕は圧縮されても画質の劣化が全然わからないので、特に問題視していません。

Googleフォトに写真をバックアップ(?)するリスク

MacやiPhoneから写真データを消してしまうとGoogleフォトのデータが唯一のマスターになってしまうので、厳密に言うと、これはバックアップではないんですよね。
なので、何らかの原因でGoogleフォトのデータが消えてしまうと、写真データがすべて消失してしまうというリスクがあります。

普通に使っていれば消えることはないと思うのですが、僕が何かやらかしてアカウントがBANされてしまったり、僕が突然死んで家族にログイン情報を引き継げなかったりしたら、写真にアクセスできなくなるかもしれません。

弊社ソニックガーデンのメンバーとこのあたりの話をしたところ、「GoogleフォトとAmazon Photosを併用している」とか「Dropboxのストレージも意外と安いので、そこに放り込んでいる」という意見がありました。

あと、自分が突然死んだときにそなえて「アカウント無効化管理ツールを設定しておくといいよ」という話もありました。

ただ、このツールはG Suiteアカウントでは使えないみたいです。
僕はG SuiteアカウントでGoogleフォトを利用しているため、この方法は使えません。

とりあえず、妻のGmailアカウントを共有アカウントに設定しているので、僕が死んだときはこれを使えばなんとかなるかな?
これに加えて僕もAmazon Photosを併用した方がいいかもしれませんね。

追記:iCloudストレージにそのままバックアップする方法もあるようです

Twitterで以下のリプライをいただきました。情報ありがとうございます!


まとめ

というわけでこのエントリでは我が家の最近のMacとiOSデバイスのバックアップ環境を紹介してみました。
バックアップは「よし、バックアップするぞー」とこちらが意識することなく、勝手にバックアップを取ってくれるのが一番ですね。
iOSデバイスも自動的にバックアップされるようになったので、これでバックアップに関するストレスからは解放されたことになります。

みなさんもよかったら参考にしてみてください!