現場Rails 7章 CSV出力機能実装時のSyntaxErrorの解決方法
現場で使える Ruby on Rails 5速習実践ガイドを進めている最中に遭遇した、SyntaxErrorの解決方法についてメモします。
起きた事
Chapter 7-6における「CSVファイルのインポート/エクスポート」の項でお手本の通り写経すると、SyntaxErrorを吐く状態となりました。タスクモデル(task.rb)にto_csvというクラスメソッドを追加し、コントローラーを実装し、ビューファイルであるindex.html.slimの末尾にエクスポートボタンのリンクを設置して動作確認を行うと失敗してしまいます。
やった事
SyntaxErrorとは基本的文法ミスなので、(これまでの経験からも)ほぼ間違いなく自分のタイプミスと考えました。記述したファイルを確認し間違いがないか見ますが、書籍との差異は発見できません。続いてエラーのログを確認して、間違っている箇所を特定する事にします。
ログでは「最後の行にミスがある」と出ていましたが末尾は単なるENDで、途中のロジックが間違っていると判断し調べますが、エラー箇所が特定できませんでした。
解決方法
書籍に乗っているコードが(恐らく)間違っていて、endの個数を末尾に一つ増やすと正常に動作しました。
def self.csv_attributes ["name", "description", "created_at", "updated_at"] end def self.generate_csv CSV.generate(headers: true) do |csv| csv << csv_attributes all.each do |task| csv << csv_attributes.map{|attr| task.send(attr) } end end end private def validate_name_not_including_comma errors.add(:name, 'にカンマを含めることはできません') if name&.include?(',') end end
とすると恐らく正常に動作すると思われます。
まとめ
単純な間違いですが、ロジックにミスがあるという固定観念があると気づきにくいのだなと感じました。エラーはまず簡単な事から疑ってみるのが早そうですね。
現場Rails RSpecを使う際のWebDriver::Errorの解決方法
現場RailsのChapter5において、テスト用ライブラリRSpecを使う際に遭遇したエラーの解決方法についてメモします。
結論から言うとクロームのバージョンを上げる(合わせる)事で簡単に解決できました。
起きた事
RSpecを導入し、テストコードを書き「bundle exec rspec spec/system/tasks_spec.rb」を走らせると
Selenium::WebDriver::Error::SessionNotCreatedError:
session not created: This version of ChromeDriver only supports Chrome version 77
とエラーが表示されました。
やった事
エラーメッセージで「ChromeDriverのバージョンが違うよ!77にしてください」と言われているのは分かりましたが、そもそもChromeDriverがどこにあり、何なのかも分からないので修正するポイントが見つけられず、無駄に苦労しました。とりあえず
・Gemfileに記述ミスがないか確認
・bundle installし直す
・chromedriver-helperが悪さしている可能性があるので別のものにする
と試しましたが解決せず。
解決方法
色々とググった結果良さげな情報が見つかったので、これをヒントにしてChromeブラウザ本体のバージョンを上げてみると上手くいきました。
Chrome右上をクリック→ヘルプ→Google Chromeについて をクリックするとバージョンの確認ができるので、これでDriverのバージョンを合わせてあげます。
その後テストを走らせると無事に通過することができました。
まとめ
Chromeを使ってテストを走らせているので、本体のバージョンの確認も重要だと理解しました。書籍は読むだけではなく、自分の環境で実行すると予測できないエラーが出てきて学びが深まると感じました。
プログラミング学習の集中力を維持するための施策
初学者としてプログラミング学習をしていると、どうしてもブチ当たる壁の一つが集中力が維持できないという事です。
しかし、約二ヶ月近く引きこもって独学していると、自分なりに安定して集中するコツのようなモノが見えてきたので、メモとして書き留めておこうと思います。
やる気を出しすぎない
プログラムを勉強するぞ!と思い立って学習を始めたとすると、最初の数日は順調に進みます。最もやる気が出ているのがその「やり始めの時期」だからです。
ただ時間が過ぎると、最初のようなやる気が出ないという事態は必ず発生します。そんな時に無理にやる気を出そうとすると自己嫌悪に陥ってしまい、かえって減速します(経験済み)
「やる気」のような根拠のないものを当てにするのではなく、習慣に頼るのがおすすめです。
注意は逸れても構わないが戻すようにする
一日十時間集中して毎日プログラミング出来るなら一番ですが、それはあくまで理想です。やはり人間なので息抜きにyoutube見たいな〜とかはある訳です。
息抜きなんて必要ない!とあらゆる娯楽を拒絶してストイックにコードを書いていくとかもアリですが、私のおすすめは「見たくてたまらなくなったら、思い切って見てしまう」事です。
ただし、二つの条件は必ず守ります。一つは時間など区切りを決める事。もう一つは必ずプログラミングに戻ってくる事です。この「戻る」という行動が大事です。
人間の集中や注意は必ず逸れるようになっていて、長くは持続しませんが戻る力は鍛える事ができます。面白いもので「戻ってくる」力が強くなってくると、戻る間隔も短くなります。
意思の力に頼らない
やる気を出しすぎないの項と被っていますが、自分の意思や気力に頼るのではなく毎日やる「習慣」に頼りましょう。
私の中で一番効果的だったのは条件付けで、「朝起きて顔を洗って水を飲んだら、即座にmacbookを開いてプログラミングする」という風にしています。仮に仕事しているなら「帰宅したら真っ直ぐにmacbookを開いてプログラミングする」とかにします。
環境に金を使う
自宅で学習しているなら、大きいディスプレイや快適な椅子など「少しでも楽に作業出来る可能性があるもの」は費用対効果が高いので出来るだけ買います。仮に私が自宅で学習できない状況ならば、コワーキングスペースや喫茶店に行っていたと思います。
私は金銭的な問題があったため、プログラミングスクールの類は通っていませんが、お金があれば通っていたと思います。もちろん「周りがプログラミング学習をしている」という環境を手に入れるためです。
始めるハードルを低くする
始める際の心理的障壁も可能な限り小さくします。どういう事かと言うと、「プログラミングを始めるまでのアクション数」を可能なまで少なくします。要するにmacbookは出しっ放し、エディタは開きっぱなし、充電しっ放し、ブラウザも開きっ放し、何なら画面も付けっ放しにします。
私は部屋のスタンディングデスクにmacbookを置いておいて「プログラミングしよう」と思ったら5秒以内に開始できるようにしています。VScodeも開きっぱなしなので、右上の電源ボタンを押したら即座に始める事ができます。
どうしても勉強したくない日は、足で技術書を開いて暇な時間に見るとかでも、やらないよりは絶対にいいと思います。
まとめ
参考になるかは分かりませんが、自分の中で効果があった方法を挙げてみました。仮に私が二ヶ月前に戻ったなら、これらの施策を初日から実施したと思います。引き続き学習していって気づいた事をメモします。
プログラミング初学者が学習1ヶ月でやったこと
はじめに
隙間時間で学習していたものを含めれば、正確には2ヶ月くらいですが
twitterを開設して、本格的にプログラミング学習を開始してから大体1ヶ月以上経ったので、備忘録変わりに今までやった事と、必要と感じた今後の課題をメモしておこうと思います。
学習開始前の私のレベル感は
- ブラインドタッチが出来ない
- IT関連の職務経験はゼロ
- プログラミング経験もゼロ
- macを持っていないし、使った事もない
- pc自体は遊びでヘビーに使っていた
という感じです。pcを使う事自体に抵抗がないくらいで、ほぼゼロからのスタートです。ちなみに金銭や貯蓄的な関係もあり、プログラミングスクール、オンラインサロンの類は参加していません。
Progate
最初にプログラミングを学習しようと思った時に始めたのがProgateです。
初学者的には、(よく分からない)環境構築を一切行わずにいきなりコードを書けるのは、大変有り難かったです。
HTML、CSS、Javascript(ES5)、jQuery、Ruby、Rails、Git、コマンドライン、SQLコースを一通りやりました。
分からない所は何度かやりましたが、それほど深追いせずレベルが200を超えた辺りで一旦終了しました。
当時は仕事を行いながらの学習だったため、学習が間延びしてしまったのが反省点です。二週間くらいで概要だけ抑えて、すぐに実践的な学習に入るべきだったかもしれません。
Progateを軽く終えたくらいでは、何かをゼロから作れるというわけではなく、プログラミングがどういった物なのか概要だけ理解した...という感じです、
[書籍]ゼロからわかるRuby超入門
「書籍から入ると挫折するよ」という意見も見ましたが「やってみてから判断しても遅くはない」という事で簡単な書籍を一冊やりました。
読むだけではなく、基本的にはエディタやターミナルでコード書く「写経」で進めていきました。結果的には挫折せず、一応は演習問題も含め最後までやりきる事が出来ました(本が良かったのかもしれません)
最後の方の章でSinatraで簡単なアプリを実装するのですが、これが後の学習にも繋がりました。
paiza Rubyコース
Progate、書籍とこなしたものの「まだまだ理解したとは到底思えないし、webアプリは作れない」という事は分かっていたので、評判も良さそうなPaizaで引き続き基礎学習を進めました。しかしこれは今考えると失敗だったと思います。
paiza自体は教材そのものは高品質ですが、如何せん私にとっては、基礎学習の期間が長すぎました。
自分はこんなwebアプリをつくってみたい!こんなサービスがあったら楽しいだろう!というのが最初にあり、基礎的な学習はいかにも受験勉強的であまり楽しいものではありませんでした。
エンジニアとして職を得ている有識者の方も良く指摘するように、「基礎学習が長すぎる→モチベーションを維持するのが難しくなる」という負の現象に見事にハマっていたような気がします。
paizaのRubyコースはなんとか終わらせましたが、終わりの見えない基礎学習で、一体いつになったらwebアプリを作れるようになるんだろう...と感じていました。
Udemy Rails入門:基礎をSinatraで理解しRailsで作れるようになる
このままだといつまでたっても作る力が身につかないと感じたので、ハンズオン形式の教材で実際に作り始める事にしました。そのために活用したのがudemyです。
この教材は今までで一番手応えがありました。Sinatraから入り、Railsに繋げて学習する事でRailsの利便性が実感できたというのもありましたが、何より実際に業務でプログラミングを使っている先生の手元を見ながら一緒に開発していくので、プロの人間が普段どういう思考でどういう風に調べたりコードを書くのかが鮮明になりました*1
コピーに近いですが、最終的には一番それっぽいアプリを完成させる事が出来ました。
【day48/100】
— Takuya Kou (@takuya_prog) August 5, 2019
Udemy Rails入門: セクション13
Udemy終了。Kaminariでページネーション機能を追加して
Todoアプリがひとまず完成した。#100DaysOfCode pic.twitter.com/Xnrhkdl9xY
CSSとかも適当なので、到底人に見せられるレベルではないですが、まず何か作れたという達成感で嬉しかったです。
タイピング
プログラミングを学習しているのに、人差し指でキーボードと睨めっこでタイピングしているのは流石に効率が悪すぎると思ったので、同時期くらいにブラインドタッチも練習し始めました。
練習と言っても大したものではなく、毎日10分程度寿司打やmytypingなどのサイトで息抜きに学習していたくらいです。ただプログラミングと同じく基本は毎日やっていました。
寿司打の高級コース初めてクリアした。
— Takuya Kou (@takuya_prog) July 28, 2019
1ヶ月前は人差し指でタイプしてた事を考えると成長を感じ取れて嬉しい。 pic.twitter.com/eWmjcadfCq
高級コースの普通をなんとかクリアできるくらいなので、はっきり言って遅いですが、コードを書く際、違和感なくタイプできるようになったので「使える」レベルには達したと思います。
今後の方針
今後の大きな目標や方針としては
- 自分の作りたいwebアプリをrailsで実装する
- webエンジニアとして転職する
としています。そのためにやっていく事は
でしょうか。やはりこの程度の学習量では理解したと言い難いので、引き続き学習を進めて、自作アプリをデプロイしようと思います。こんな感じのやつを作ってみたいというのはあるので。
また独学しているよりも、現場にジョインした方がやはり学べる総量は違うと思っているので、未経験でもアルバイトを問わず雇って下さる方がいらっしゃるなら、いつでもお気軽にtwitterまでDMしていただけると有難いです。
*1:物凄いエンジニアならまた違うのかもしれませんが、予想の3倍くらいググってるんだなあと思いました