What one likes, one will do well 〜好きこそ物の上手なれ〜

寄り道しながらも、最後は昔から好きな物理とプログラミングに戻ってくる。そんな男の思いをつづるブログです。

RailsTutorialで、Ruby on Railsを学びました。

はじめに

Ruby on Railsを勉強するときに有名なRailsTutorialに挑戦しました。

日本語のページもあるようですが、英語の勉強をかねて、英語のまま実施したので、なかなかハードでした。

しかしRuby on Railsのすごさを知るとともに、Tutorialで色んな事を学べてとても楽しかったです。最後までやると簡単なtwitterのサイトを作成できます。Tutorialでここまでやれるのが驚きです。

どのような形で実施し、どんなことを学んだかをまとめます。

実施したエディション

3rd editionで、Rails4.2を使ったTutorialを実施しました。やっている途中にRails5がリリースされ内容が変わったので、3rd editionを最後までやりました。

エディションが違っても内容はほぼ変わらないと思いますが、当然Railsのバージョンの違いを吸収しており、Tutorialの内容も改善しているようです。

基礎知識

Tutorialの中で色んな知識が必要となりますが、詳しく説明してあるので、仕事でプログラミングや環境構築をしたことがある人なら問題なく学べると思います。初心者では知識量が多く難しいかもしれませんが、Tutorialには必要な知識が詰まっていますので、Tutorialの内容を理解できれば、プログラミングを仕事にできると思います。

私は仕事でプログラミングをしているので、知識はある程度あったと思います。以下の基礎知識がありました。

データベース

データベースは仕事で普通に使っています。

Linuxコマンド

仕事でCUIでコマンド打ってLinuxを操作することは普通にやっています。

プログラミング

JavaC++などのプログラミング言語は仕事で使っていて、RubyもTutorialを実施する前に、ドットインストールで基本は学びました。またCodeIqなどでRubyで解答して、実際に使ってみた状態でした。

MVC

基本的な考え方は知っていましたが、実際に適用したことはなかったので、本で学んだレベルでした。RESTについては、Tutorialで初めて学びました。

TDD(テスト駆動開発)

テスト駆動開発入門の本を読んで写経したことがありました。(ケントベックのテスト駆動開発入門を読みました。

逆に知らなかった知識としては、Rails、Heroku、Gitです。Tutorialで初めて触りました。

前提知識があればその部分は読み飛ばせるので、効率的に学べると思います。

実施した期間

リポジトリを確認すると3章以降は、6月から始めています。12月末までかかったので、6ヶ月かかった計算になります。途中休みしていた期間もあるので実質4カ月ほどでしょうか。

1章と2章はその前にやっているのですが、それほど時間はかからなかったと思います。

1日の学習時間としては、仕事の昼休みに毎日45分程度週4日ほど行っていました。4ヶ月週4回45分でざっくり計算すると50時間程度になります。

毎日朝から晩まで集中してやれば、1週間かからず終われそうです。

実施方法

Tutorialのやり方としてはいわゆる写経をしました。各章の最後のexercisesはせずに、本編のみ進めていきました。

英語でやっていたので、最初は通勤電車の中で内容を読みました。その後昼休みを使って、もう一度読みながら手を動かして写経しました。

全体像を最初に理解したので、読んでいる箇所のコードに集中することができました。やはり一度手を動かすことが一番大切だと思います。

私は飛ばしましたが、exercisesはやった方が本当の理解につながると思います。

Tutorialの内容

Tutorialの内容を簡単にまとめておきます。

1章

Railsの環境構築を行い、静的なページを表示させることができます。

クラウド統合開発環境のCloud9を使って、Rails環境を構築して、HelloWorldの表示、Gitの使い方、Herokuへのデプロイと盛りだくさんです。

しかしそれぞれクラウドで提供されているサービスを利用するので、登録して簡単に使え始めます。

特にCloud9は環境構築が楽で、どこでも同じ環境を使えるので、普通に使うようになりました。GitやHerokuも利用するようになりました。

2章

Railsで最初に驚かされたScaffoldの使い方とMVCの基礎知識を学べます。

コマンド一つでデータを登録・更新・削除できるWebアプリが作成できるのが、すごいです。

3章

動的なページを作成できます。同時にテストとテスト駆動開発を学べます。

Tutorialの中でテストもしっかりと書いており、テストの重要性を感じる事ができます。

4章

Rubyの基礎を学べます。他でRubyを勉強していれば簡単に読み進められます。

ただRubyの特徴的な使い方なども紹介しており、学ぶことは多いので1度目を通す方がよいと思います。

5章

CSSやBootstrapでWebのデザインを学べます。Bootstrapは簡単にかっこいいページを作ることができて驚きました。

6章

Railsでのデータベースの扱いやデータのチェック、パスワードの扱いなどを学べます。

Railsを使えばデータベースを簡単に使える事が分かります。また数行のコードでデータのチェックやパスワードを扱えるようになるのがわかり、Railsのすごさを知りました。

7章、8章、9章

Sign up、Log in、Log out、ユーザデータの表示・更新・削除などの機能を追加します。

機能追加の話と同時に、セキュリティやテスト駆動開発をコードともに学べます。

10章

アカウントのアクティベーションやパスワードリセットの機能を追加します。

メールを使ってのアクティベーションやパスワードリセットの機能を追加しており、本物のサービスに近いものを作成できます。

11章、12章

twitterのツイートやフォローの機能を追加します。

おわりに

Rails Tutorialは完成度が高く、網羅的に学べるようになっています。最後に出来上がる簡易twitterもここまで作れるのかとびっくりします。

一度写経しただけでは、自分のものになっていませんが、これをきっかけにRailsでWebアプリを作りたいと思います。

ボリュームがすごいですが、最後までやりきれば多くの知識がつくと思いますので、ぜひ挑戦してみてください。

 

 

「リファクタリング」を読んでリファクタリングの重要性を理解し、実践してみました。

はじめに

リファクタリングを読みました。一番最初に具体的なコードとともにリファクタリングの詳しい解説があり、リファクタリングの重要性とすごさを感じました。
この本を読んだ後、実際にリファクタリングしてみて感じたことをキーワードと共にまとめます。

リファクタリングは外部からの振る舞いを変えず内部構造を変えること

リファクタリングの定義として記載されています。「外部からの振る舞いを変えない」ということが重要で、それがリファクタリングを確実に実施する方法です。内部構造を変えてきれいなコードにすることで、品質を上げていくことになります。

リファクタリングには自動化したテストが必要

「外部からの振る舞いを変えない」ということで、リファクタリングする上で自動化したテストが重要です。

OKとなるテストがあれば、そのテストが常にパスすることを確認しながら、内部構造を変えることで、自信を持ってリファクタリングを実施できます。リファクタリングは一気にやるのではなく、少しずつ内部構造を変更して、テストを繰り返すことで実施します。テストを何度も何度も実行するので自動化したテストは必須になってきます。

自動化したテストの重要性ややり方を知るためにはテスト駆動開発入門がおすすめです。

2つの帽子をかぶり分ける

リファクタリングは「外部からの振る舞いを変えず内部構造を変えること」ですので、「リファクタリングするとき」と「機能追加するとき」の2つの帽子をかぶり分けることが大切です。

リファクタリングしている時に思いついて機能追加したくなることが多々あるのですが、そうするとテストが失敗したときにリファクタリングで失敗したのか、機能追加で失敗したのかわからなくなります。

他にも機能追加でバグがあるためにテストが成功して、リファクタリングも機能追加もバグということもありました。機能追加時にはテストの追加も必要になるので、テスト自体のバグもあり得ます。

リファクタリングの定義の通り、「外部からの振る舞いを変えず」に実施することで、テストによる裏付けをもって、確実にリファクタリングできます。「2つの帽子をかぶり分ける」のを常に意識して、リファクタリングをすることが重要です。

 プログラムに新規機能を追加するときは機能追加が簡単になるようにリファクタリングしてから追加を行う

機能追加するときに「構造を変えてから追加した方がよいかな」と思うことがあると思います。しかし「構造を変えるのは面倒」「このままでも何とか機能追加できそう」といった気持から、まず機能追加したくなります。そして結果的に構造を変更することになったり、汚いコードになりながら「最初に構造を変えておけばよかった」と思うことがあります。

機能追加の前にリファクタリングを行うことで、機能追加時のストレスが違います。リファクタリングしながら追加する機能のことを考えるため、機能追加時はスムーズに開発できます。リファクタリングに時間をかけて、機能追加は一瞬ということもありました。

追加する機能を思いついたときは早く追加したくてウズウズしてしまうのですが、そこをグッとこらえてリファクタリング。その後の機能追加。その過程がストレスフリーで爽快感を感じます。それを実感した後でも「すぐに機能追加」の誘惑に負けてしまうことがあるですが、先にリファクタリングを基本動作にしたいと感じます。

いつリファクタリングをすべきか

3度目の法則

2度同じことをやったら重複や無駄があるなと感じながら、3度目はリファクタリングをします。重複や無駄を除くということです。

機能追加の前

上で解説した通り機能追加の前にリファクタリングです。

バグフィックスの時

コードを理解するために行います。バグを埋め込むということは、コードを理解していなかったり、バグを見つけにくい構造になっていたりしていたためです。

リファクタリングをすることでコードを理解して、バグを埋め込みにくい構造にします。

コードレビューの時

コードレビューの時にリファクタリングをすることで、コードを理解し、さらにアイディアも生まれてきます。この究極的な形がエクストリーム・プログラミングのペア・プログラミングになります。

変数名の変更は人間にとってわかりやすいコードになるため大切

一番簡単なリファクタリングである変数名の変更です。

有名な書籍「リーダブルコード」にも書いてありますが、コードがわかりやすいように変数名を決めることは重要です。コードが読みやすい=理解しやすい=バグが埋め込まれにくいだと思います。

switch文をポリモーフィズムを使って置き換えできる

デザインパターンのState/Strategyパターンです。この本を読むまではポリモーフィズムの利点がわかっていませんでしたが、「switch文をポリモーフィズムを使って置き換える」のは目から鱗でした。

保守性、拡張性ともにサブクラスのみの変更や追加で行えるのは素晴らしいです。

コードの不吉な臭い

リファクタリングすべき時の「コードの不吉な臭い」です。たくさんあるのですべてを理解するのは難しいのですが、理解しやすいのは「重複したコード」「長すぎるメソッド」「巨大なクラス」「長すぎるパラメータリスト(多すぎる引数)」「スイッチ文」でしょうか。

後は変更時に必ず影響を受けるコード「変更の偏り」やある変更で影響範囲が広くなってしまう「変更の分散」はリファクタリングすべきコードです。

一時的に見逃せばその時に機能追加はできるのですが、その後のことを考えるとリファクタリングしておいた方がよいです。「コードの不吉な臭い」を感じたらリファクタリングをするようにしたいです。

おわりに

この本を読んでリファクタリングの具体的な例を学ぶとともに、その重要性を理解できました。リファクタリングは機能追加しないために、実施するには重い腰を上げる必要があるのですが、実施するとその効果は目を見張るものがあります。特に開発時にストレスフリーになるのが、一番の効果だと感じます。

またリファクタリングを実際に行ってみると、間違い探しのようにゲーム感覚で楽しめます。コードがきれいになった後に機能追加することで、ストレスフリーで開発できます。継続的にリファクタリングをしていきたいです。

 

新装版 リファクタリング―既存のコードを安全に改善する― (OBJECT TECHNOLOGY SERIES)

新装版 リファクタリング―既存のコードを安全に改善する― (OBJECT TECHNOLOGY SERIES)

 

 

2016年12月のつぶやき

 

2017年に実現したいこと

はじめに

昨年8月からブログをはじめてまだ半年もたっていません。ずいぶん時間がたった気がします。昨年は一年間ありがとうございました。今年もよろしくお願いします。

1年の始まりということで、昨年の振り返りと今年の目標を設定したいと思います。

はてなブログ今週のお題「2017年にやりたいこと」でもあります。

 

2016年の振り返り

昨年は大きく変化のあった年でした。

 

育休を2年間とってみて~職場復帰~ - What one likes, one will do well 〜好きこそ物の上手なれ〜

育休から仕事に復帰した出来事は大きな変化でした。育休を取らせてくれ、温かく迎えてくれた会社には感謝の気持ちしかありません。会社に対する愛社精神が増し、会社に貢献して恩返しをしたいという気持ちになりました。今はその気持ちで頑張っています。

また育児に対する考え方や見方も大きく変わりました。育児の大変さを痛感するとともに、男性が育児に参加することが夫婦や子ども、社会にとって大切だと思います。育児は誰かに任せておけばよいものではなく、夫婦を中心にみなで協力していかなければいけない大プロジェクトだと思います。それくらい簡単なものではないと思います。

子どもは放っておいても育つものですが、やっぱり日々悩み、考えながら試行錯誤しながらやっていくものだと思います。

ただ悩みすぎてノイローゼになってはいけません。子どもは放っておいても育つのですから。バランスの難しさを感じますが、子育てというプロジェクトをやりきることが人生の一つの目標ではないでしょうか。

 

積極的に学ぶ機会を作るようにしました

2015年末CodeIQの忘年会に参加したのをきっかけに、自分の視野の狭さや知識のなさを痛感して、積極的に学ぶ機会をつくるようにしました。

新しいことを学ぶことが自分の刺激になり、さらなる学習意欲を生みよい循環になっていると感じます。

 

いろいろな本を読みました。

読んだことのない本を読んで新しい知識を入れることはとても大切だと感じます。世界が広がりました。

また7つの習慣やケントベックのテスト駆動開発入門は何度か読んでいるのですが、一度感銘を受けた本を再度読むことは理解が深まり、それも新しい気付きを得ます。

 

ドットインストールを利用してプログラムの勉強をしました。

ブログにはアップしていませんが、他にもRubyやRなどもドットインストールを利用して学びました。はじめて使う場合はとても便利だと思います。

 

Rails Tutorialに挑戦しました。

まだブログにアップできていませんが、年末ぎりぎりで何とかやりきって、今度記事をアップしようと思っています。とても楽しいので、Ruby on Railsを学びたい人にとっては本当におすすめです。

 

機械学習を学び始めました。

 まだ勉強途中ですが、自分で試行錯誤しながら使いこなせるよう奮闘している最中です。私の好きな数式がたくさんありますし、それを理解していくプロセスを楽しんでいます。今話題の技術でもありますし、自分のものにしていきたいです。

 

アウトプットを重視するようにしました

インプットは大切ですが、アウトプットすることでさらに理解が深まるため、アウトプットを重視するようしました。

このブログもしかり、QiitaGitHubにも記事の投稿や成果物のアップをするようにしています。なかなか大変ですが、その分学びも多いです。自分の成果として一つずつ残していきたいと思います。

  

数学ガールに出会いました

 別枠にしましたが、本を読んだ中で数学ガールの出会いは衝撃的でした。とても面白く、自分の中にある数学や物理を好きな気持ちが再燃しました。

高校生レベルで理解できる内容ですが、大学以上のレベルの数学を扱っています。それでいてわかりやすいです。数学が好きな人には本当におすすめです。その気持ちが回りまわって、持っていた物理の本を取り出して物理の勉強も再開しました。

最後の数の悪魔は小学生でも読める算数が楽しくなる本です。小学生におすすめです。 

 

育休を2年間とってみて~おやじの会~ - What one likes, one will do well 〜好きこそ物の上手なれ〜

子どもの小学校でおやじの会をはじめました。育休を通じて子どもとの関わりの大切さを感じ、学校に対してできることからやっています。

昔遊びのコマ回しを教えたり、運動会の片づけを手伝ったり、子どもの安全のため旗振りの検討をしたり、まだまだ少しのことしかできていませんが、できることからやっていきたいと思います。

 

2017年に実現したいこと

2016年は大きな変化があった年でした。そして主にインプット、そしてまずやり始めた年だったと思います。

2017年はその結果を残すため、アウトプットを重視する年にしたいと思っています。

 

ブログ、Qiita、Github

学んだり、実践したりしたことは引き続きブログやQiita、Githubに残していきたいと思います。3か月に1回それなりにまとまったものを成果として残していきたいと思います。大変だと思いますが、それを目標に頑張っていきたいと思います。

またアップしてある記事や成果物の見直しも行っていきたいと思います。荒削りな部分も多く、改善していくことが大切なことだと感じています。

 

Ruby on Railsでサイト構築

Rails Tutorialで学んだことを使って、サイト構築したいです。世の中に役立つサイトを構築できたらと思っています。交通安全マップ的なものを考えています。

 

機械学習で遊ぶ

Python、TensorFlowを学び、機械学習の勉強をしているので、その知識を利用して実際に何か作りたいと思っています。まだアイディアはないのですが、遊び感覚でやっていきたいと思っています。

 

おやじの会の活動を広げる

立ち上げたおやじの会の活動を広げていきたいと思います。もっと見える形で活動をして、実績を残していくことが大切だと感じています。活動の範囲を広げるとともに、アピールして、認知度を高めていくことが目標です。

 

物理・数学を深める

まずは今持っている物理の本を理解したいと思います。次のステップとして、ミレニアム懸賞問題の問題の意味を理解したいと思っています。

「ヤン-ミルズ方程式と質量ギャップ問題」の問題の意味を理解して、自分で考えられるようになることが今年の目標だと思っています。

 

おわりに

振り返ってみると以前に思っていたことが思い返され、新たな原動力になりました。今年の目標はアウトプットということで、難しいと感じます。しかしこれができるとできないのが大きな分かれ目になると思っています。自分自身の意欲は続いているので、それをアウトプットにすべく、一年頑張っていきたいと思います。

今年もよろしくお願いいたします。

 

小学生でも読める算数が楽しくなる本「数の悪魔」を読みました。

はじめに

数の悪魔を読みました。小学生でも読めて、算数や数学の不思議な話が書いてあり、算数や数学を好きになるそうです。

私も楽しく読みましたし、うちの子(小学3年生)も楽しく読んでいます。

扱っている内容

  • 指数。ホップすると言うらしい。
  • 素数。エラトステネスのふるいを扱っていた。
  • 素数の面白い性質。2より大きい偶数は2つの素数の和、5より大きい奇数は3つの素数の和で表すことができる。
  • ルート。大根と言うらしい。ルートを取るときは、大根を抜くと言うらしい。
  • 1から順に足していくときの和。
  • フィボナッチ数。
  • パスカルの三角形。
  • 組合せ。
  • 階乗。びっくりと言うらしい。
  • 級数
  • 無理数

おわりに

内容は高校レベルなのに分かりやすく、小学生でも楽しく読める内容です。中学受験する子は知っている内容かなと言う印象です。

とにかく面白いのでお子さんにオススメです。おまけに算数、数学好きになってくれれば言うことなしですね。 

 

数の悪魔―算数・数学が楽しくなる12夜

数の悪魔―算数・数学が楽しくなる12夜

 

 

数学ガール 乱択アルゴリズムを読みました。

はじめに

数学ガール乱択アルゴリズムを読みました。仕事や趣味でプログラム書くから、他の数学ガールより簡単に読めるかと思いきや、なかなか難しい内容でした。前にアルゴリズムの本を読んで最後まで読みきれなかったことがあるのですが、やはり私にはアルゴリズムが難しいようです。

それでも数学ガールはわかりやすく、順序立てて書かれているので、理解が深まりました。

読んだ感想をまとめます。

リニアサーチ

アルゴリズムと言えばソートというイメージがあったのですが、最初に検索から入っていました。その方が理解しやすいなと感じました。

少しの工夫で実行ステップ数が改善するのが、面白かったです。今まであまり考えたことがなかったのですが、小さな積み重ねが大きな差になるので、これから気をつけないとと思いました。

確率の公理

確率の公理は初めて知りました。高校で習う数学と大学以上の数学での違いは厳密に定義される点だと感じます。

少しの公理に確率の考えが詰まっていると思うと不思議です。

ソート

検索のアルゴリズムは比較的簡単ですが、ソートになると急に難しくなります。前にアルゴリズムの本を読んだときもたくさんのソートアルゴリズムを読んで途中で断念しました。じっくり読むと理解できるのですが、すっとは入ってこないですね。コードを何度も読んだり、実装するのがよいだと思いつつやってないですね。。。

考え方が理解しやすいバブルソートとよく使われているクイックソートが出てきました。

対角行列

私は行列苦手で、特に対角行列がよくわかってなかったのですが、乱択アルゴリズムに対角行列が出てきて理解が深まりました。

対角化することで計算が楽になります。その計算結果を元の行列の計算結果に戻すのも楽なんですね。

P≠NP予想

P問題は多項式時間で解を発見できる問題。

NP問題は多項式時間で正しい解かを判定できる問題。

PならばNPで、その逆は違いそうという雰囲気はわかりますが、証明できてなくて、ミレニアム懸賞問題にもなっています。簡単そうに見えてとても難しい問題なのですね。

乱択アルゴリズム

ランダム性を取り入れて問題を解く方法で、以下のものが紹介されていました。

  • 全体を把握するための乱択アルゴリズム。ランダムサンプリングによって少ない手間で全体を見渡す。
  • 最悪を避けるための乱択アルゴリズム。固定的な選択によって最悪のケースになりうるとき乱択することによって回避する。
  • 多数の証拠を得るための乱択アルゴリズム。おそらくそうであるという解を得る。

失敗確率がいくら以下かという評価を行うことで乱択アルゴリズムの信頼性がきまってくるので、それをしっかり認識していれば、とても実用的な方法だと思いました。

おわりに

乱択アルゴリズムを読んだのをきっかけにアルゴリズムの勉強をもう一度してみようと思いました。

ミレニアム懸賞問題であるP≠NP予想が出てきたことでミレニアム懸賞問題にも興味が出てきました。

本を読むことで興味の幅が広がりますね。でも何でもやりたくなるから、何をやるかの選択が今の課題だと思っています。

 

 

数学ガール/乱択アルゴリズム (数学ガールシリーズ 4)

数学ガール/乱択アルゴリズム (数学ガールシリーズ 4)

 

 

2016年11月のつぶやき