おぴよの気まぐれ日記

おぴよの気まぐれ日記

岡山やプログラミング、ファッションのこと、子育てや人生、生き方についての備忘録。

仕事に楽しさを求めてはいけないのだろうか

仕事が楽しくて楽しくてしょうがないんだよな~


僕の周りにはこんな奴はいない。

最近色々な人と話すきっかけがあって本当に良い刺激を頂いているしネットの世界では楽しそうに生きている人がいっぱいから、この感覚が全くないってのは嘘になるだろうが。

だが、僕の周りでは中々この境地に行っている人は少ないなと感じている。


何故だろうか。何故こんな差が出るのだろうか。

好きなことをして生きるとは

例えば僕は日本で、いや世界でも有名な文化服装学院というアパレル専門学校に行っていた。

間違いなく日本で服が好きな人達が集まっている場所だ。僕はここに行ったことを最初悔やんだ。これでもかと自分の世界を表現できる素晴らしい人たちの中で何となく好きで入った僕なんかが入れる場所じゃないと思ったからだ。

間違いなく服にかける熱量は凄い。間違いない。夢を見て勉強し社会に出ていく。

だが、卒業して約7年。アパレル業界で働いている人はどのくらいの人だろうか。

服を作りたいと思い学んだ2・3年間の先の就職先は販売員ってのがほとんどだ。


他の例を言うならば日常からプログラムを書くのが好きなプログラマーの方も仕事でプログラムを書けても全て思うように書けるわけではない。色々な制約やビジネスとの掛け合い、自分のポジションもある。プログラムを書くことが好きで選んだ仕事、プログラムを書けている。なのに楽しいとは決して言えない。そんなもんだ。

好きなことをして生きるって大変

好きなことをして生きていくってのが一つこれからのテーマだと思うのだけど、好きなことをして生きるってのは中々難しい。

前にもこのようなテーマで記事を書いたし上で書いた通りだが、好きな事、特殊な事ほどそこで勝負してくるライバル達も熱狂的なのである。道は狭くゴールに行ける人はある程度決まっている。


じゃーどうするのか。仕事は仕事と諦めることしかできないのか。

それもそれで一つだと思うが一日の半分以上が仕事をしなければならないことを考えると仕事を楽しめるかどうかで人生は変わってくるだろう。

そう思うと仕事って楽しいと思えるべきだが何が楽しいのかもはや分からなくなっていると人は多いと思う。もちろん僕もだ。



僕の周りを見渡した時に決して仕事が楽しいってわけじゃないのだが生きることを楽しんでいる人達はいる。

その人たちと仕事を楽しんでいる人との共通点を探してみると僕は「お金」に辿り着いた。

そこを一つ軸にしてこれからの人生考えると変わった生き方ができるのでは無いかと思っている。

最後に

そもそも「人間」として生き続けるってこと自体が仕事なのだ。 まー知っている人はビビビッとくるフレーズだろう。 「人間」という仕事なのだ。生きるってことすらも仕事なのだ。

好きなことで生きることは大変だが、お金を稼ぐってことも大変だ。

うーん生きるって大変だ。

この当たり前の日常こそが幸せなのだろう

先週末は久しぶりに家族でがっつり遊んだ気がする。


土曜日は僕の住んでいる場所で一番大きな祭りがあり、花火もいっぱいあがった。

同じ地域に住んでいる人達が同じ場所に集まり同じ空を見上げ花火を見る。

子供たちで来ている人もいるし、カップルもいる、家族もいれば、じいじばあばもいる。

みんな過ごす毎日は違うし何を考えているのか何を思っているのか普段何をしているのか何てお互い知らない。

だけど、花火を見ているその時間だけは、同じ気持ち同じ思いで同じ時間を過ごす。


やはりこういう時間ってのはとても素敵だなと思った。



日曜日は家族で地域のプールだ。

ウォータースライダーや、流行りのナイトプールみたいなオシャレさや水着のねーちゃんはいないが、子供たち浅いプールでバナナ鬼。深いプールで泳ぐ 練習。家族で同じ時間を過ごせばそれなりに面白い。

それに、なんと家族4人で300円だ! 田舎万歳である。



何か面白いことをしたでも、特別なことをしたでもない。当たり前の日常を当たり前のように過ごしただけなのだが家族と過ごす時間ってのは良いものだ。


で、まーここからが本題なのだがこの時間を更に有意義に質を高めてくれるものがある。

分かるだろうか。


.
.
.
.

そーお金だ。


なんじゃそりゃって思うかもしれないが、家族がいるからこそ思うことは正直世の中金だ。


お金があればこの思い出にの質を更にいくらでもアップさせることができる。

地域のプールじゃなくて沖縄に行った方が絶対面白い。そんなことは当たり前である。


じゃーどうやってお金を稼ぐのかって話なのだが、最近少し分かってきた気がする。

本当に色々な仕組みがある。それを知れたことは本当に良かった。


後は、そこに自分がコミットできるのか。突き抜けれるのか。そこだけかなと。

最後に

最近色々あった。今もめちゃくちゃ悩んでいる最中だ。

何が正解か何て全く分からないけど一つ思ったことは、家族って良いもんだ。

だから、この軸からは絶対に外れてはいけない。僕はそうやって生きていこう。

28歳になった今日、僕は人生詰んだことを発表します

28年前の朝、僕は生まれた。

今日まで28年という長い長い年月を過ごしてきた。

だけど、今僕は人生の帰路に立たされている。

そー気づいてしまったのだよ。この世のからくりに。


僕のこれまでの人生については改めて自己紹介として書こうと思うのだが、一言で僕の人生を表現するならば「逃げ」。

ただただ逃げてきた人生だった。


その結果、今日僕は改めて感じた。


「人生詰んだ」

2020年には年収400万以下が6割 ?

危機感だけは凄く感じていてざっと洗い出しただけでも、こんな感じだろうか

  • 40年続く会社は3社?だっけな
  • 大企業があの状態
  • 2020年には年収400万以下が6割?
  • 既に中国のエンジニアの方が高給取り
  • 会社じゃなく個人が活躍する時代
  • 昇給ってあるようで無いって気づいた
  • 一歩外出たら僕は何が出来るんだ? ⇒ 何もない
  • valuやshowroomなど個人が活躍する時代
  • 技術の発展で職を失う

このまま生きていたら、どう考えても子供が大学行くとか不可能。共働きが当たり前。残業稼ぐようなスタイルもどんどん減るだろう。僕が今やっているようなSEだって良く言えばエンジニアと営業の架け橋。なんて言うけど要らないよね。開発と営業で仕事は回る。


みたいなことを色々考えると家族ある人間からすると、あれっ結構やばいなと思うわけですよ。

やれば出来るは最高のご褒美

僕が小さい頃から親に言われ続けてきた魔法の言葉「やれば出来る」。これは絶対に使ってはいけない。


だってやれば出来ると思ってしまうからである。

「やれば」出来るんだよ。だけどこれは「やったら」出来ない事が分かってしまうから結果的に何もやらない人間を生み出してしまう。

僕の場合は先ず受験から逃げた。本当は行きたい高校があったにも関わらず本番に弱いという理由で指定校推薦を選択した。

大学もそうだ。受験勉強が嫌だから専門学校を選んだ。

これは本当にやりたい事じゃないと言って日々の勉強から逃げた。

言葉が上手く表現できないからブログを書くことから逃げた。

全て「やれば出来る」って知らぬ知らぬ間に自分に言い聞かせている。やったら出来ないを知りたくないから逃げる。

最後に

もー若くない。

Twitterを見てみよう。

ネットの世界をのぞいてみよう。

そして東京へ行ってみよう。

自分より若い人達が、活躍していることから目を離してはいけない。

自分より若い人達が、頑張っていることから目を離してはいけない。


今この一瞬、一瞬この地球上にいる誰かが同じことを考えていて歩きだしたなら、僕は走らないといけない。

そうしないとどんどんどんどん離されてしまう。

自分より若い人たちは、既にもーとんでもなく遠くにいる。

それを見ているだけじゃなくて一歩一歩踏み出そう。

そうすれば今くすぶっている人達よりかは一歩前に出れる。そうやって毎日を刻んでいこう。


人生は長いようであっという間。

まだ28歳ではなく、もー28歳。

いつでも、どんな時も人生を変えることは出来るって心から思ってる。

だけどその道は年を重ねるごとに確実に狭くなっていく。


だから今、今動きだそう。

人生を変えるには目標を叶える行動する「時間」を確保し、その行動を加速させる「環境」に行く。

そして最後まで「やりきる」こと。

やりきった先に何があるのかを想像すれば、きっと頑張れる。

今日はそんな感じ。頑張ろう自分。もう一回今日から頑張ろう。何度だって挑戦できるんだから。



誕生日おめでとう

Ruby on Rails チュートリアルで30歳までに人生を変える(第5章)

こんにちは。opiyoです。

今回は、第5章をやっていきます。

第5章はレイアウト。つまり見た目の部分をメインにやっていきます。

では、早速始めてみたいと思います。

f:id:opiyotan:20170626134807p:plain

railsチュートリアル5章の学び

  • クラスとidの違い クラス:ページの中で何度でも使用ができる id:一度しか使用できない

  • 画像はapp/assets/imagesに置きimage_tag("ファイル名", alt: "属性名")で呼び出す

  • .(ドット)はクラスを表します

  • Atomエディタでのコメントアウト方法は「Commnad + /」

  • アセットディレクト

  • app/assets: 現在のアプリケーション固有のアセット
  • lib/assets: あなたの開発チームによって作成されたライブラリ用のアセット
  • vendor/assets: サードパーティのアセット

  • アセットをまとめる処理を行うのはSprocketsというgem

  • リダイレクトの場合のみ_url書式を使用

  • pathとurlの違い

  • 統合テスト (Integration Test)の実行方法

    • $ rails test:integration

railsチュートリアル5章の演習解説

5.1.1 演習 ナビゲーション

5.1.1.1

<問題> Webページと言ったらネコ画像、というぐらいにはWebにはネコ画像が溢れていますよね。リスト 5.4のコマンドを使って、図 5.3のネコ画像をダウンロードしてきましょう。

<回答>

$ curl -OL cdn.learnenough.com/kitten.jpg

5.1.1.2

<問題> mvコマンドを使って、ダウンロードしたkitten.jpgファイルを適切なアセットディレクトリに移動してください (参考: 5.2.1)。

<回答>

$ mv kitten.jpg app/assets/images/kitten.jpg

5.1.1.3

<問題> image_tagを使って、kitten.jpg画像を表示してみてください (図 5.4)。

<回答>

# app/views/static_pages/home.html.erb
<div class="center jumbotron">
  <h1>Welcome to the Sample App</h1>

  <h2>
    This is the home page for the
    <a href="http://railstutorial.jp/">Ruby on Rails Tutorial</a>
    sample application.
  </h2>

  <%= link_to "Sign up now!", "#", class: "btn btn-lg btn-primary" %>
</div>

<%= link_to image_tag("rails.png", alt: "Rails logo"), "https://rubyonrails.org/" %>
<%= image_tag("kitten.jpg", alt: "cat logo") %>

5.1.2 演習 BootstrapとカスタムCSS

5.1.2.1

<問題>リスト 5.10を参考にして、5.1.1.1で使ったネコ画像をコメントアウトしてみてください。また、ブラウザのHTMLインスペクタ機能を使って、コメントアウトするとHTMLのソースからも消えていることを確認してみてください。

<回答>

<!-- <%= image_tag("kitten.jpg", alt: "cat logo") %> -->

5.1.2.2

<問題>リスト 5.11のコードをcustom.scssに追加し、すべての画像を非表示にしてみてください。うまくいけば、Railsのロゴ画像がHomeページから消えるはずです。先ほどと同様にインスペクタ機能を使って、今度はHTMLのソースコードは残ったままで、画像だけが表示されなくなっていることを確認してみてください。

<回答>

img {
  display: none;
}

5.1.3 演習 パーシャル(partial)

5.1.3.1

<問題>Railsがデフォルトで生成するheadタグの部分を、リスト 5.18のようにrenderに置き換えてみてください。ヒント: 単純に削除してしまうと後でパーシャルを1から書き直す必要が出てくるので、削除する前にどこかに退避しておきましょう。

<回答>

# app/views/layouts/_rails_default.html.erb
<%= csrf_meta_tags %>
<%= stylesheet_link_tag    'application', media: 'all', 'data-turbolinks-track': 'reload' %>
<%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %>

5.1.3.2

<問題>リスト 5.18のようなパーシャルはまだ作っていないので、現時点ではテストは redになっているはずです。実際にテストを実行して確認してみましょう。

<回答> redになる!

5.1.3.3

<問題>layoutsディレクトリにheadタグ用のパーシャルを作成し、先ほど退避しておいたコードを書き込み、最後にテストが green に戻ることを確認しましょう。

<回答> greenになる!

5.2.2 演習 アセットパイプライン

5.2.2.1

<問題> 5.2.2で提案したように、footerのCSSを手作業で変換してみましょう。具体的には、リスト 5.17の内容を1つずつ変換していき、リスト 5.20のようにしてみてください。

<回答>

/* footer */

footer {
  margin-top: 45px;
  padding-top: 5px;
  border-top: 1px solid $gray-medium-light;
  color: $gray-light;
  a {
    color: $gray;
    &:hover {
      color: $gray-darker;
    }
  }
  small {
    float: left;
  }
  ul {
    float: right;
    list-style: none;
    li {
      float: left;
      margin-left: 15px;
    }
  }
}

5.3.2 演習 RailsのルートURL

5.3.2.1

<問題>実は名前付きルートは、as:オプションを使って変更することができます。有名なFar Sideの漫画に倣って、Helpページの名前付きルートをhelfに変更してみてください。

<回答>

 rails routes
 Prefix Verb URI Pattern        Controller#Action
   root GET  /                  static_pages#home
   help GET  /help(.:format)    static_pages#help
  about GET  /about(.:format)   static_pages#about
contact GET  /contact(.:format) static_pages#contact
rh0257:railstutorial_5 taku$ rails routes
 Prefix Verb URI Pattern        Controller#Action
   root GET  /                  static_pages#home
   helf GET  /help(.:format)    static_pages#help # 「helf」になっていることを確認!
  about GET  /about(.:format)   static_pages#about
contact GET  /contact(.:format) static_pages#contact

5.3.2.2

<問題>先ほどの変更により、テストが redになっていることを確認してください。リスト 5.28を参考にルーティングを更新して、テストを greenにして見てください。

<回答> できた

5.3.2.3

<問題>エディタのUndo機能を使って、今回の演習で行った変更を元に戻して見てください。

<回答> Command + z

5.3.3 演習 名前付きルート

5.3.3.1

<問題>リスト 5.29のようにhelfルーティングを作成し、レイアウトのリンクを更新してみてください。

<回答> <%= link_to "Help", helf_path %>にしても/helpにジャンプすることを確認した

5.3.3.2

<問題>前回の演習と同様に、エディタのUndo機能を使ってこの演習で行った変更を元に戻してみてください。

<回答> Command + z

演習 5.3.4 リンクのテスト

5.3.4.1

<問題> footerパーシャルのabout_pathをcontact_pathに変更してみて、テストが正しくエラーを捕まえてくれるかどうか確認してみてください。

<回答>

$ rails test
Running via Spring preloader in process 49273
Started with run options --seed 21667

 FAIL["test_layout_links", SiteLayoutTest, 0.8195362979986385]
 test_layout_links#SiteLayoutTest (0.82s)
        Expected at least 1 element matching "a[href="/about"]", found 0..
        Expected 0 to be >= 1.
        test/integration/site_layout_test.rb:9:in `block in <class:SiteLayoutTest>'

  5/5: [============================================================================================================================================================] 100% Time: 00:00:00, Time: 00:00:00

Finished in 0.95899s
5 tests, 12 assertions, 1 failures, 0 errors, 0 skips

5.3.4.2

<問題> リスト 5.35で示すように、Applicationヘルパーで使っているfull_titleヘルパーを、test環境でも使えるようにすると便利です。こうしておくと、リスト 5.36のようなコードを使って、正しいタイトルをテストすることができます。ただし、これは完璧なテストではありません。たとえばベースタイトルに「Ruby on Rails Tutoial」といった誤字があったとしても、このテストでは発見することができないでしょう。この問題を解決するためには、full_titleヘルパーに対するテストを書く必要があります。そこで、Applicationヘルパーをテストするファイルを作成し、リスト 5.37のFILL_INの部分を適切なコードに置き換えてみてください。ヒント: リスト 5.37ではassert_equal <期待される値>, <実際の値>といった形で使っていましたが、内部では==演算子で期待される値と実際の値を比較し、正しいかどうかのテストをしています。

<回答>

# test/helpers/application_helper_test.rb
require 'test_helper'

class ApplicationHelperTest < ActionView::TestCase
  test "full title helper" do
    assert_equal full_title, 'Ruby on Rails Tutorial Sample App'
    assert_equal full_title("Help"), 'Help | Ruby on Rails Tutorial Sample App'
  end
end

5.4.1 演習

5.4.1.1

<問題>表 5.1を参考にしながらリスト 5.41を変更し、users_new_urlではなくsignup_pathを使えるようにしてみてください。

<回答>

# routes.rb
  get '/signup', to: 'users#new'
# rails routesコマンド
$ rails routes
 Prefix Verb URI Pattern        Controller#Action
   root GET  /                  static_pages#home
   help GET  /help(.:format)    static_pages#help
  about GET  /about(.:format)   static_pages#about
contact GET  /contact(.:format) static_pages#contact
 signup GET  /signup(.:format)  users#new ← `signup`が追加されていることを確認!

5.4.1.2

<問題>先ほどの変更を加えたことにより、テストが redになったことを確認してください。なお、この演習はテスト駆動開発 (コラム 3.3) で説明した red/green のリズムを作ることを目的としています。このテストは次の5.4.2で greenになるよう修正します。

<回答> OK

5.4.2 演習

5.4.2.1

<問題>もしまだ5.4.1.1の演習に取り掛かっていなければ、まずはリスト 5.41のように変更し、名前付きルートsignup_pathを使えるようにしてください。また、リスト 5.43で名前付きルートが使えるようになったので、現時点でテストが greenになっていることを確認してください。

<回答>

# rails testコマンド
$ rails test
Running via Spring preloader in process 2676
Started with run options --seed 22738

  7/7: [============================================================================================================================================================] 100% Time: 00:00:00, Time: 00:00:00

Finished in 0.89370s
7 tests, 17 assertions, 0 failures, 0 errors, 0 skips

5.4.2.2

<問題>先ほどのテストが正しく動いていることを確認するため、signupルールの部分をコメントアウトし、テスト redになることを確認してください。確認できたら、コメントアウトを解除して greenの状態に戻してください。

<回答> OK コメントアウト#で、元に戻すときはCommand + z

5.4.2.3

<問題>リスト 5.32の統合テストにsignupページにアクセスするコードを追加してください (getメソッドを使います)。コードを追加したら実際にテストを実行し、結果が正しいことを確認してください。 ヒント: リスト 5.36で紹介したfull_titleヘルパーを使ってみてください。

<回答>

# test/integration/site_layout_test.rb
require 'test_helper'

class SiteLayoutTest < ActionDispatch::IntegrationTest
  test "layout links" do
    get root_path
    assert_template 'static_pages/home'
    assert_select "a[href=?]", root_path, count: 2
    assert_select "a[href=?]", help_path
    assert_select "a[href=?]", about_path
    assert_select "a[href=?]", contact_path
    get contact_path
    assert_select "title", full_title("Contact")

    get signup_path ← 追加!
    assert_template 'users/new' ← 追加!
  end
end

好きなことで生きていくって難しいよ

会社では新卒を除いて僕が一番若い

20代は僕以外に多分一人しかいない

先輩達のほとんどが中途組だから人生の参考にはならない


さっきTwitter見てたら2020年には年収400万以下の人が6割になるってニュースを見た。

まー当たり前だろうし、そんな事は分かっているのだけど改めて言われると夢がないなーって思う。


ある程度大きな会社に入ればだいたいこのくらいで年収いくら、あーなったら出世コースでとか分かるっていう。実際にあーあいつは出世コースだなみたいな話もするらしいので本当だろう。

先ずこのレースに参加できるのは学生時代必死に勉強して良い大学に入った人達だけだ。

大学を卒業してなければ就職活動に参加することすら出来ない


いやいや今の時代40年間続く会社は4社くらいしかない

あれだけ大きな会社だった今の時代どうなるか分からない

だからこそ好きなことをやらないと生きていけない


そんな言葉がネットの世界では溢れているが、好きなことだと思って専門学校に行くという人生を歩んで来た人間から言わせると本当にそれ好きか?

それが好きな人達の中に飛び込むと圧倒される。そこでなんて最高な世界なんだって思えればそれは本当に好きなんだろうけど大体の人は場違いの場所に来たってなると思うよ。だって熱量が違い過ぎる。

専門的な事をするって簡単に言うけど間違いなく上には上がいるしそもそも普通のサラリーマンをするより門はめちゃくちゃ狭いぞ。


ただ、その中でもがき苦しみ突き抜けた人ってのは間違いなく成功する。

僕の知り合いは最初全然冴えない感じだったけど今では業界でも知名度のある凄い奴になっている。(まー元々馬鹿みたいにカッコ良かったから殻を破れてなかっただけかもしれないが)

最後に

とまー色々最近考えることがあって人生について悩み苦しんでいるのだけど好きなことで生きていくってのは大変ですよって話です。

だけど普通に生きていたら400万の人生しか生きれない。

じゃーどうするか。


藤原先生の「レアカード」になるって考え方がきっと確実に生きていく方法、正解なんだと思います。 たとえ好きな事じゃなくても100分の1を積み重ねていくことで自分の価値を上げる。 今周りにある環境で100分の1を先ずは目指す。何かに挑戦して100分の1を目指す。その繰り返し繰り返しが結果的に自分の価値を高める=レアカードになれる。

好きな事だから頑張れるってのは勿論あると思うけど、そればっかりに頭を使うんじゃなくて色々な要素を掛け算して考えるってのがすごい大事。

うーん何か言いたいことと違った結論になってしまったような。まー今日はこんな感じ。

しっかり握っておかないと心はすぐに離れてしまうから

最近いろいろとバタバタとしていて、子供たちと接する時間が取れてなかった。


昨日やっと色々落ち着いて子供たちと遊ぼうとするのですが何するにも壁があるような。

娘は絶対朝送ってくれるのにそれがない。帰った時の「パパだいずき」がない。「しょうぎしょうぎ」っていわない。

物理的な距離は確実に心の距離も遠ざける

これらは昨日一日で感じた事だから今日帰ったらな~んて事はないのかもしれない。

相手は子供だ。 子供は環境に適応するのが本当に早いとよく言う。子供たちも幼稚園に行きだして集団生活になりきっと楽しいことばかりじゃないだろうけど、朝早く起きて支度をして幼稚園に行って弁当食べて帰ってくる。そんな日常が当たり前になっていく。

海外に転勤になった時、一番大変なのはママって聞く。子供たちは気づいたら当たり前の生活になってしまう。


全部いいことだけ取り上げればそうだが、逆だって当然だ。

居なくて当たり前になってしまったら、そのように振舞うしどう接すればよいかも分からない。

大人は色々な事情や想いを知っているし我慢が出来るから頑張れるけど子供は今見えている世界が全てである。

父との思い出はキャッチボールだけ

僕は父が嫌いだ。

僕は父と話した記憶がほとんど無い。

学生の頃、友達が父と一緒にエロ本見て遊んでたとか言ってたけど考えられなかった。だけどそんな父って良いなって思う。

どんな時も真面目で笑わず本を読んでいる。唯一の思い出は庭の水やりを終わった後の夕方のキャッチボールとチケットが当たったと言って連れてってもらった東京ドームオープン戦だ。

ずっとサッカーをやっていたのだけど何となく野球がしたくて小学校高学年から野球を始めた。自分中でも分からないきっと父と遊んだ唯一の野球という存在が忘れられなくて野球をやってのだと思う。


どんな仕事をしていたかは今となってやっと何となく分かるけど聞いたことなかったし、何が好きで何を思って生きてきたのか。あなたは人生楽しかったのだろうか。

僕は父から学んだことは正直ほとんど無い。目の前にはいるが僕の心にはいなかった。

最後に

まー色々と書いてきたが、子供の心はしっかりと握っておかなければすぐに何処かへ行ってしまうなと思った。って話です。


物理的に近くにいることは勿論だけど、それだけじゃなくしっかりと会話して伝えていく必要がある。

僕は子供にとって父でいたいし、大人になった時に一番の親友でいたい。

その為にも、今から自分がどう生きてきたのか、何か思っているのか、何を学んだのか。

今、目の前に見えている「あたりまえ」の世界は全然当たり前ではない

ドコモとミスチルの25周年記念動画を見たことがあるだろうか。


もし見たことが無ければ是非見てほしい。

私は重なる部分が多く、泣いてしまった。

今こうして思い出すだけでも少し目が重たくなってる気がする。

https://www.nttdocomo.co.jp/special_contents/25th/mrchildren/


私は今人生の大きな岐路に立っていると思っている。

まだ決まった訳では無いから多くの事は言えないのだが、こんなんも悩んだことは人生で思いつかない。


言いたいことは一つで、 人間何処かで頑張らないと本当の幸せを掴むことは出来ない。



動画の中でも高橋一生は単身赴任で遠くに出かけていってしまう。

一人娘がいるのだが、それまで娘はパパが大好きだったのに会えない。

誕生日には娘がダンスする動画をパパに送ったり本当に幸せそうにしている。


だが単身赴任が終わり家に帰ると娘と離れてしまった気持ちは取り戻すことが出来ず喧嘩ばかり。

当たり前だ。娘はずっと寂しかったのだ。

一度閉じてしまった心は中々開かない。



じゃーこの時パパは単身赴任なんてせずに家にいればよかったんじゃないか。家族と一緒に引っ越せば良かったんじゃないか。離れてしまうくらいなら仕 事を変えればよかったんじゃないか。

そんな風に考える人もいるかもしれないが、「生きる」ってそんな簡単な話じゃない。相当な覚悟を持ってきっと決断したのだと思う。

きっと「今」ではなく「未来」が幸せであれと願い、想い、出した答えだったのだろう。


何が正解かなんて、僕たちは今を歩いているのだから未来のことは分からない。

「忙しい」という言葉を言い訳に未来に対する危機感が全くない人達。

危機感いっぱいにもかかわらず行動できなきない人。

どんな答えを出したって想いを持っての行動ならば、それはきっと間違ってないのだと思う。

ただその決断をしたことで悲しんでいる人がいるかもしれない。迷惑をかけているかもしれない。

その想いをしっかり胸に刻み一歩ずつ前に進みだそう。きっと良い未来が待っている。

Ruby on Rails チュートリアル4章の後半まとめてみた

こんちには、opiyoです。

人生の生き残りをかけて始めた「Railsブートキャンプ」ですが、今日はRailsチュートリアル第4章をやっていこうと思います。

第4章は「Ruby」のお勉強です。早速やってみましょう!

この記事は後半戦になります。

前半戦はこちらからどうぞ。

opiyotan.hatenablog.com

railsチュートリアル4章の解説

クラス

  • メソッドをまとめるのにクラスを使用する
  • これらのクラスからインスタンスを作成するとオブジェクトができる
  • リテラルコンストラク
> s = "opiyo"
=> "opiyo"
> s.class
=> String
  • 名前付きコンストラクタとは、クラス名に対してnewメソッドを呼び出す
  • Hashの場合は引数がデフォルト値になる
# 文字列
> d = String.new("Opiyo")
=> "Opiyo"
> d.class
=> String
> d == "Opiyo"
=> true

# 配列
> a = Array.new([1, 3, 2])
=> [1, 3, 2]

# Hash
> h = Hash.new
=> {}
> h[:foo]            # 存在しないキー (:foo) の値にアクセスしてみる
=> nil
> h = Hash.new(0)    # 存在しないキーのデフォルト値をnilから0にする
=> {}
> h[:foo]
=> 0
  • クラスの継承
> s = String.new("foobar")
=> "foobar"
> s.class
=> String
> s.class.superclass
=> Object
> s.class.superclass.superclass
=> BasicObject
> s.class.superclass.superclass.superclass
=> nil
  • 組み込みの基本クラスの拡張が可能
> class String
>   # 文字列が回文であればtrueを返す
>   def palindrome?
>     self == self.reverse
>   end
> end
=> nil
> "deified".palindrome?
=> true
  • コントローラークラスの継承
> controller = StaticPagesController.new
=> #<StaticPagesController:0x007fec80a64130 @_action_has_layout=true, @_routes=nil, @_request=nil, @_response=nil>
> controller.class
=> StaticPagesController
> controller.class.superclass
=> ApplicationController
> controller.class.superclass.superclass
=> ActionController::Base
> controller.class.superclass.superclass.superclass
=> ActionController::Metal
> controller.class.superclass.superclass.superclass.superclass
=> AbstractController::Base
> controller.class.superclass.superclass.superclass.superclass.superclass
=> Object
> controller.class.superclass.superclass.superclass.superclass.superclass.superclass
=> BasicObject
> controller.class.superclass.superclass.superclass.superclass.superclass.superclass.superclass
=> nil

railsチュートリアル4章の演習問題

演習4.4.1 コンストラク

4.4.1.1

<問題>1から10の範囲オブジェクトを生成するリテラルコンストラクタは何でしたか? (復習です)

<回答>

> r = 1..10
=> 1..10
> r.class
=> Range

4.4.1.2

<問題>今度はRangeクラスとnewメソッドを使って、1から10の範囲オブジェクトを作ってみてください。ヒント: newメソッドに2つの引数を渡す必要があります

<回答>

> r = Range.new(1,10)
=> 1..10
> r.class
=> Range

4.4.1.3

<問題>比較演算子==を使って、上記2つの課題で作ったそれぞれのオブジェクトが同じであることを確認してみてください。

<回答>

>  r = 1..10
=> 1..10
> rn = Range.new(1,10)
=> 1..10
> r == rn
=> true

演習4.4.2 クラス継承

4.4.2.1

<問題>Rangeクラスの継承階層を調べてみてください。同様にして、HashとSymbolクラスの継承階層も調べてみてください。

<回答>

# Range
> r = Range.new(1,10)
=> 1..10
> r.class
=> Range
> r.class.superclass
=> Object
> r.class.superclass.superclass
=> BasicObject
> r.class.superclass.superclass.superclass
=> nil

# Hash
h = Hash.new(0)
=> {}
> h.class
=> Hash
> h.class.superclass
=> Object
> h.class.superclass.superclass
=> BasicObject
> h.class.superclass.superclass.superclass
=> nil

# Symbol
:symbol
=> :symbol
> :symbol.class
=> Symbol
> :symbol.class.superclass
=> Object
> :symbol.class.superclass.superclass
=> BasicObject
> :symbol.class.superclass.superclass.superclass
=> nil

4.4.2.2

<問題>リスト 4.15にあるself.reverseのselfを省略し、reverseと書いてもうまく動くことを確認してみてください。

<回答>

> class Word < String
>   def palindrome?
>     self == self.reverse
>   end
> end
=> :palindrome?
> s = Word.new("level")
=> "level"
> s.palindrome?
=> true
> s.length
=> 5

> class Word < String
>   def palindrome?
>     self == reverse
>     end
>   end
=> :palindrome?
> Word.new("level")
> s.palindrome?
=> true
> s.length
=> 5

演習 4.4.3 組み込みクラスの変更

4.4.3.1

<問題>palindrome?メソッドを使って、“racecar”が回文であり、“onomatopoeia”が回文でないことを確認してみてください。南インドの言葉「Malayalam」は回文でしょうか? ヒント: downcaseメソッドで小文字にすることを忘れないで。

<回答>

> "racecar".palindrome?
=> true
> "onomatopoeia".palindrome?
=> false
> "Malayalam".downcase.palindrome?
=> true

4.4.3.2

<問題>リスト 4.16を参考に、Stringクラスにshuffleメソッドを追加してみてください。 ヒント: リスト 4.12も参考になります。

<回答>

> class String
>   def shuffle
>     self.split("").shuffle.join
>   end
> end
=> :shuffle
> "foobar".shuffle
=> "ofbaro"

4.4.3.3

<問題>リスト 4.16のコードにおいて、self.を削除してもうまく動くことを確認してください。

<回答>

> class String
>   def shuffle
>     split("").shuffle.join
>   end
> end
=> :shuffle
> "foobar".shuffle
=> "rafobo"

演習 4.4.4 コントローラークラス

4.4.4.1

<問題>第2章で作ったToyアプリケーションのディレクトリでRailsコンソールを開き、User.newと実行することでuserオブジェクトが生成できることを確認してみましょう。

<回答>

> u = User.new
=> #<User id: nil, name: nil, email: nil, created_at: nil, updated_at: nil>

4.4.4.2

<問題>生成したuserオブジェクトのクラスの継承階層を調べてみてください。

<回答>

> u.class
=> User(id: integer, name: string, email: string, created_at: datetime, updated_at: datetime)
> u.class.superclass
=> ApplicationRecord(abstract)
> u.class.superclass.superclass
=> ActiveRecord::Base
> u.class.superclass.superclass.superclass
=> Object
> u.class.superclass.superclass.superclass.superclass
=> BasicObject
> u.class.superclass.superclass.superclass.superclass.superclass
=> nil

演習 4.4.5 ユーザークラス

4.4.5.1

<問題>Userクラスで定義されているname属性を修正して、first_name属性とlast_name属性に分割してみましょう。また、それらの属性を使って "Michael Hartl" といった文字列を返すfull_nameメソッドを定義してみてください。最後に、formatted_emailメソッドのnameの部分を、full_nameに置き換えてみましょう (元々の結果と同じになっていれば成功です)

<回答>

# example_user.rb
class User
  attr_accessor :first_name, :last_name, :email

  def initialize(attributes = {})
    @name  = attributes[:first_name]
    @name  = attributes[:last_name]
    @email = attributes[:email]
  end

  def full_name
    @full_name = @first_name + @last_name
  end

  def formatted_email
    "#{full_name} <#{@email}>"
  end
end
# rails c
> require './example_user'
=> true
> u = User.new(first_name: "Haku", last_name: "Nagano", email: "haku@co.jp")
=> #<User:0x007f8d718ab8c0 @first_name="Haku", @last_name="Nagano", @email="haku@co.jp">
> u.full_name
=> "HakuNagano"
> u.email = "Haku@co.jp"
=> "Haku@co.jp"
> u.formatted_email
=> "HakuNagano <Haku@co.jp>"

4.4.5.2

<問題>"Hartl, Michael" といったフォーマット (苗字と名前がカンマ+半角スペースで区切られている文字列) で返すalphabetical_nameメソッドを定義してみましょう。

<回答>

  def alphabetical_name
    "#{first_name}, #{last_name}"
  end
# rails c
> require './example_user'
=> true
> u = User.new(first_name: "Haku", last_name: "Nagano", email: "haku@co.jp")
=> #<User:0x007f8d6b3d2048 @first_name="Haku", @last_name="Nagano", @email="haku@co.jp">
> u.alphabetical_name
=> "Haku, Nagano"

4.4.5.3

<問題>full_name.splitとalphabetical_name.split(’, ’).reverseの結果を比較し、同じ結果になるかどうか確認してみましょう。

<回答> ?再度確認する

新しいRubyのバージョンがrbenvに表示されない時はgit pullする

Rubyのバージョン調べてみると2.2.3だったので、2.2.4以上をインストールすべく

$ brew update
$ brew upgrade rbenv ruby-build

をやってインストールできるバージョン一覧を表示

$ rbenv install --list
(略)
  2.2.1
  2.2.2
  2.2.3
(略)

しかし、2.2.3以上のバージョンが表示されない。。。

で、調べてみるとruby-buildgit pullすれば良いそうだ

$ cd ~/.rbenv/plugins/ruby-build
$ git pull

再度表示すると2.2.4、2.2.5が出現!!

$ rbenv install --list
(略)
  2.2.1
  2.2.2
  2.2.3
  2.2.4
  2.2.5
(略)

めでたし。めでたし。

Ruby on Rails チュートリアル4章の前半まとめてみた

こんちには、opiyoです。

人生の生き残りをかけて始めた「Railsブートキャンプ」ですが、今日はRailsチュートリアル第4章をやっていこうと思います。

第4章は「Ruby」のお勉強です。早速やってみましょう!

あまりにもボリューミーなので、2回に分けます。この記事では「4.3 他のデータ構造までを」。


前回までのをまとめたのはこちらからどうぞ。

opiyotan.hatenablog.com

この章から始められる場合も、3章の「セットアップ」を参考に準備してください。

railsチュートリアル4章の解説

カスタムヘルパー

Railsのビューからは色々な関数が定義れています。

これは、自分で定義することもでき「カスタムヘルパー」と呼びます。

ここでは、3章で作成した各ビューで定義しているタイトルをヘルパーを使って定義します。

# app/helpers/application_helper.rb
module ApplicationHelper

  # ページごとの完全なタイトルを返します。
  def full_title(page_title = '')
    base_title = "Ruby on Rails Tutorial Sample App"
    if page_title.empty? # empty?は空っぽだったら「true」を返す
      base_title
    else
      page_title + " | " + base_title
    end
  end
end

文字列とメソッド

$ rails console #ターミナルに潜り込みます
>>

このターミナルを使って簡単なRubyの勉強

コメントアウト

name = test * test # この「#」がコメントアウト
end

足し算

> 17 +42
=> 59

文字列の連結

> "foo" + "bar"
=> "foobar"

式展開

> first_name = "Taku"
> "#{first_name} Nakano"
=> "Taku Nakano"

出力

> puts "foo" # putsだと末尾に自動で改行コードが付与されるされる
foo
=> nil
> print "foo" # 文字が続いているのがわかる
foo=> nil

シングルクォート内の文字列

> first_name = 'Taku'
> '#{first_name} Nakano'
=> "\#{first_name} Nakno" # シングルクォートの場合は式展開されないので注意!

オブジェクトとメッセージ

Rubyでは文字列も、nilも何でもかんでもオブジェクトです。

例えば、文字列の数を知りたい場合はkengthメソッドを使います。

> "foobar".length        # 文字列に "length" というメッセージを送る
=> 6

条件分岐

  • ifを使って処理を分岐することができる
  • 2つ以上にしたい時はelsifを使う
  • and(&&) や or(||) を使える
> if s.nil?
>   "The variable is nil"
> elsif s.empty?
>   "The string is empty"
> elsif s.include?("foo")
>   "The string includes 'foo'"
> end
=> "The string includes 'foo'"

> x = "foo"
=> "foo"
> y = ""
=> ""
> puts "Both strings are empty" if x.empty? && y.empty?
=> nil
> puts "One of the strings is empty" if x.empty? || y.empty?
"One of the strings is empty"
=> nil
> puts "x is not empty" if !x.empty?
"x is not empty"
=> nil

メソッドの定義

メソッドは先ほど作ったカスタムヘルパーや、homeアクションやhelpアクションなどもそうですね。

  • def hogehoge(メソッド名) endで定義できる
  • 引数にデフォルト値を含めることが可能def string_message(str = '')
    • この場合は引数を指定しないとstr = ''がセットされる

配列と範囲演算子

文字列の分割

> "foo bar     baz".split # デフォルトは「空白」で分割する
=> ["foo", "bar", "baz"]
> "fooxbarxbazx".split('x') # 引数を指定すればそれで分割できる
=> ["foo", "bar", "baz"]

配列の中身を取り出す

a = [42, 8, 17]
=> [42, 8, 17]
> a[0] # 0が一番目の要素になるので要注意!
=> 42
> a[1]
=> 8
> a[2]
=> 17
> a[-1] # マイナスの場合は後ろから数える!
=> 17

> a.first
=> 42
> a.second
=> 8
> a.last
=> 17
> a.last == a[-1]
=> true

いろいろなメソッド

a
=> [42, 8, 17]
> a.empty? # 配列が空であればtrue、1つ以上何か値があればfalseを返します。
=> false
> a.include?(42)
=> true
> a.sort
=> [8, 17, 42]
> a.reverse
=> [17, 8, 42]
> a.shuffle
=> [8, 42, 17]
> a
=> [42, 8, 17] # いろいろやっても値は「変わらない!」ことに気をつけましょう。
> a.sort! # 「!」などの破壊的メソッドと呼ばれるメソッドを使うと強制的に値を書き換えます。
=> [8, 17, 42]
> a
=> [8, 17, 42]
値の追加
> a.push(6)
=> [42, 8, 17, 6]
irb(main):044:0> a << 7
=> [42, 8, 17, 6, 7]
irb(main):045:0> a << "foo" << "bar"
=> [42, 8, 17, 6, 7, "foo", "bar"]
結合
> a
=> [42, 8, 17, 6, 7, "foo", "bar"]
> a.join
=> "4281767foobar"
> a.join(",")
=> "42,8,17,6,7,foo,bar"
範囲
> 0..9
=> 0..9
irb(main):064:0> 0..9.to_a
NoMethodError: undefined method `to_a' for 9:Integer # 9に対して`to_a`してるのでエラーになります
Did you mean?  to_s
               to_c
               to_f
               to_i
               to_d
               to_r
.
.
  from -e:1:in `<main>'
irb(main):065:0> (0..9).to_a # ()を付けて範囲に対して`to_a`していることを伝えてあげます
=> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

> a = %w(foo bar baz quux)
=> ["foo", "bar", "baz", "quux"]
> a[0..2]
=> ["foo", "bar", "baz"]

> ('a'..'e').to_a # 文字でも使える!すごいねRuby!
=> ["a", "b", "c", "d", "e"]

ブロック

  • ブロックは「{ }」のことで、「do end」で囲って表現する場合もあります。
  • 短い1行のブロックには波かっこを使用し、長い1行や複数行のブロックにはdo..end記法を使うのが一般的

例えば、以下は1~5を順番に変数iに渡してputs 2 * iを実行するというような処理になります。

> (1..5).each { |i| puts 2 * i }
2
4
6
8
10
=> 1..5

> (1..5).each do |i|
*   puts i * 2
> end
2
4
6
8
10
=> 1..5

mapメソッド

> 3.times { puts "Betelgeuse!" }   # 3.timesではブロックに変数を使用していない
"Betelgeuse!"
"Betelgeuse!"
"Betelgeuse!"
=> 3

> (1..5).map { |i| i**2 }          # 「**」記法は冪乗 (べき乗) 
=> [1, 4, 9, 16, 25] # 配列で帰ってくる
# 同じ結果をeachでやるには、こんな感じ?
> array = []
=> []
> (1..5).each do |i|
*   array << i ** 2
> end
=> 1..5
> array
=> [1, 4, 9, 16, 25]

> %w[a b c]
=> ["a", "b", "c"]
> %w[a b c].map {|char| char.upcase}
=> ["A", "B", "C"]
> %w[a b c].map {|char| char.downcase}
=> ["a", "b", "c"]

> %w[A B C].map(&:downcase) # 省略できる
=> ["a", "b", "c"]

ハッシュとシンボル

  • ハッシュとはインデックス([]の中身)に整数値以外のものも使用できる点が配列と違う
  • ハッシュは「{}」を使って表記する
  • ブロックの「{}」とは全く違う
  • ハッシュでは要素の「並び順」が保証されない
 user = {}
=> {}
> user["first_name"] = "Michael"
=> "Michael"
> user["last_name"] = "Hartl"
=> "Hartl"
> user["first_name"]
=> "Michael"
> user
=> {"first_name"=>"Michael", "last_name"=>"Hartl"}
> user = { "first_name" => "Michael", "last_name" => "Hartl" }
=> {"last_name"=>"Hartl", "first_name"=>"Michael"}
  • シンボルとはコロンが前に置かれている文字列
  • 文字列と似ているが異なる
  • Railsでは文字列よりもシンボルを使用する
  • 文字列と違って全ての文字が使えるわけではない
  • ハッシュもeachメソッド
> "name".split('')
=> ["n", "a", "m", "e"]
> :name.split('')
NoMethodError: undefined method `split' for :name:Symbol
> "foobar".reverse
=> "raboof"
> :foobar.reverse
NoMethodError: undefined method `reverse' for :foobar:Symbol

> :foo-bar
NameError: undefined local variable or method `bar' for main:Object
> :2foo
SyntaxError

> user = { :name => "Michael Hartl", :email => "michael@example.com" }
=> {:name=>"Michael Hartl", :email=>"michael@example.com"}
> user[:name]
=> "Michael Hartl"
> user[:password]
=> nil

> h1 = { :name => "Michael Hartl", :email => "michael@example.com" }
=> {:name=>"Michael Hartl", :email=>"michael@example.com"}
> h2 = { name: "Michael Hartl", email: "michael@example.com" } # 別の書き方 これもよく見る
=> {:name=>"Michael Hartl", :email=>"michael@example.com"}
> h1 == h2
=> true

> params = {}
=> {}
> params[:user] = { name: "Michael Hartl", email: "mhartl@example.com" }
=> {:name=>"Michael Hartl", :email=>"mhartl@example.com"}
> params
=> {:user=>{:name=>"Michael Hartl", :email=>"mhartl@example.com"}}
>  params[:user][:email]
=> "mhartl@example.com"

その他

app/views/layouts/application.html.erbに書かれている以下の2行は色々な要素が省略されているのに注意!

stylesheet_link_tag 'application', media: 'all',
                                   'data-turbolinks-track': 'reload'
# メソッド呼び出しの丸かっこは省略可能。
stylesheet_link_tag('application', media: 'all',
                                   'data-turbolinks-track': 'reload')
# 最後の引数がハッシュの場合、波かっこは省略可能。
stylesheet_link_tag 'application', { media: 'all',
                                     'data-turbolinks-track': 'reload' }

# htmlだとこうなります
<link data-turbolinks-track="true" href="/assets/application.css" media="all"
rel="stylesheet" />

railsチュートリアル4章の演習問題

演習

<問題1>

city変数に適当な市区町村を、prefecture変数に適当な都道府県を代入してください。

<回答1>

 prefecture = "岡山県"
=> "岡山県"
city = "倉敷市"
=> "倉敷市"

<問題2>

先ほど作った変数と式展開を使って、「東京都 新宿区」のような住所の文字列を作ってみましょう。出力にはputsを使ってください。

<回答2>

> puts prefecture + " " + city
岡山県 倉敷市
> puts "#{prefecture} #{city}"
岡山県 倉敷市

<問題3>

上記の文字列の間にある半角スペースをタブに置き換えてみてください。(ヒント: 改行文字と同じで、タブも特殊文字です)

<回答3>

> puts "#{prefecture} \t #{city}"
岡山県    倉敷市

<問題4>

タブに置き換えた文字列を、ダブルクォートからシングルクォートに置き換えてみるとどうなるでしょうか?

<回答4>

> puts '#{prefecture} \t #{city}'
#{prefecture} \t #{city}

演習

<問題1>

"racecar" の文字列の長さはいくつですか? lengthメソッドを使って調べてみてください。

<回答1>

> "racecar".length
=> 7

<問題2>

reverseメソッドを使って、"racecar"の文字列を逆から読むとどうなるか調べてみてください。

<回答2>

> "racecar".reverse
=> "racecar"

<問題3>

変数sに "racecar" を代入してください。その後、比較演算子 (==) を使って変数sとs.reverseの値が同じであるかどうか、調べてみてください。

<回答3>

> s = "racecar"
=> "racecar"
irb(main):013:0> s == s.reverse
=> true

<問題4>

リスト 4.9を実行すると、どんな結果になるでしょうか? 変数sに "onomatopoeia" という文字列を代入するとどうなるでしょうか? ヒント: 上矢印 (またはCtrl-Pコマンド) を使って以前に使ったコマンドを再利用すると一からコマンドを全部打ち込む必要がなくて便利ですよ。)

<回答4>

> puts "It's a palindrome!" if s == s.reverse
It's a palindrome!
=> nil

> s = "onomatopoeia"
=> "onomatopoeia"
> puts "It's a palindrome!" if s == s.reverse
=> nil

演習

<問題1>

リスト 4.10のFILL_INの部分を適切なコードに置き換え、回文かどうかをチェックするメソッドを定義してみてください。ヒント: リスト 4.9の比較方法を参考にしてください。  ※回文・・・上から読んでも下から読んでも、同じ言葉になる文句

<回答1>

> def palindrome_tester(s)
>   if s == s.reverse
>     puts "It's a palindrome!"
>   else
>     puts "It's not a palindrome."
>   end
> end

<問題2>

上で定義したメソッドを使って “racecar” と “onomatopoeia” が回文かどうかを確かめてみてください。1つ目は回文である、2つ目は回文でない、という結果になれば成功です。

<回答2>

> palindrome_tester("racecar")
It's a palindrome!
=> nil
> palindrome_tester("onomatopoeia")
It's not a palindrome.
=> nil 

<問題3>

palindrome_tester("racecar")に対してnil?メソッドを呼び出し、戻り値がnilであるかどうかを確認してみてください (つまりnil?を呼び出した結果がtrueであることを確認してください)。このメソッドチェーンは、nil?メソッドがリスト 4.10の戻り値を受け取り、その結果を返しているという意味になります。

<回答3>

> palindrome_tester("racecar").nil?
It's a palindrome!
=> true

> if palindrome_tester("racecar").nil?
>   puts "TRUE"
> end
It's a palindrome!
TRUE

演習

<問題1>

文字列 “A man, a plan, a canal, Panama” を ", " で分割して配列にし、変数aに代入してみてください。

<回答1>

> a = "A man, a plan, a canal, Panama".split(",")
=> ["A man", " a plan", " a canal", " Panama"]

<問題2>

今度は、変数aの要素を連結した結果 (文字列) を、変数sに代入してみてください。

<回答2>

> s = a.join
=> "A man a plan a canal Panama"

<問題3>

変数sを半角スペースで分割した後、もう一度連結して文字列にしてください (ヒント: メソッドチェーンを使うと1行でもできます)。リスト 4.10で使った回文をチェックするメソッドを使って、(現状ではまだ) 変数sが回文ではないことを確認してください。downcaseメソッドを使って、s.downcaseは回文であることを確認してください。

<回答3>

> s.split(" ")
=> ["A", "man", "a", "plan", "a", "canal", "Panama"]
> s.split(" ").join
=> "AmanaplanacanalPanama"

> s_down = s.downcase
=> "amanaplanacanalpanama"
> s_down == s_down.reverse
=> true

<問題4>

aからzまでの範囲オブジェクトを作成し、7番目の要素を取り出してみてください。同様にして、後ろから7番目の要素を取り出してみてください。(ヒント: 範囲オブジェクトを配列に変換するのを忘れないでください)

<回答4>

> az = ("a".."z").to_a
=> ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"]
> az[7 - 1]
=> "g"
> az[-7]
=> "t"

演習

<問題1>

範囲オブジェクト0..16を使って、各要素の2乗を出力してください。

<回答1>

> (0..16).map {|i| puts i ** 2}
0
1
4
9
16
25
36
49
64
81
100
121
144
169
196
225
256

<問題2>

yeller (大声で叫ぶ) というメソッドを定義してください。このメソッドは、文字列の要素で構成された配列を受け取り、各要素を連結した後、大文字にして結果を返します。例えばyeller([’o’, ’l’, ’d’])と実行したとき、"OLD"という結果が返ってくれば成功です。ヒント: mapとupcaseとjoinメソッドを使ってみましょう。

<回答2>

> def yeller(array)
>   puts array.join.upcase
> end
=> :yeller

> yeller(%w(o l d))
OLD

<問題3>

random_subdomainというメソッドを定義してください。このメソッドはランダムな8文字を生成し、文字列として返します。ヒント: サブドメインを作るときに使ったRubyコードをメソッド化したものです。

<回答3>

> def random_subdomain
>   ('a'..'z').to_a.shuffle[0..7].join
> end
=> :random_subdomain

> random_subdomain
=> "ikzbpahe"

<問題4>

リスト 4.12の「?」の部分を、それぞれ適切なメソッドに置き換えてみてください。ヒント:split、shuffle、joinメソッドを組み合わせると、メソッドに渡された文字列 (引数) をシャッフルさせることができます。

<回答4>

> def string_shuffle(s)
>   s.split("").shuffle.join # splitに「""」を渡すと1文字ずつ分割してしてくれる
> end
> string_shuffle("foobar")
=> "oobfra"

演習

<問題1>

キーが’one’、’two’、’three’となっていて、それぞれの値が’uno’、’dos’、’tres’となっているハッシュを作ってみてください。その後、ハッシュの各要素をみて、それぞれのキーと値を"’#{key}’のスペイン語は’#{value}’"といった形で出力してみてください。

<回答1>

> hash
=> {:one=>"uno", :two=>"dos", :three=>"tres"}
* hash.each do |k,v|
* puts "#{k}のスペイン語は#{v}です"
> end
oneのスペイン語はunoです
twoのスペイン語はdosです
threeのスペイン語はtresです
=> {:one=>"uno", :two=>"dos", :three=>"tres"}

<問題2>

person1、person2、person3という3つのハッシュを作成し、それぞれのハッシュに:firstと:lastキーを追加し、適当な値 (名前など) を入力してください。その後、次のようなparamsというハッシュのハッシュを作ってみてください。1.) キーparams[:father]の値にperson1を代入、2). キーparams[:mother]の値にperson2を代入、3). キーparams[:child]の値にperson3を代入。最後に、ハッシュのハッシュを調べていき、正しい値になっているか確かめてみてください。(例えばparams[:father][:first]がperson1[:first]と一致しているか確かめてみてください)

<回答2>

> params[:father] = person1
=> {:first=>"nakano", :last=>"taku"}
> params[:mother] = person2
=> {:first=>"nakano", :last=>"haku"}
> params[:child] = person3
=> {:first=>"nakano", :last=>"toma"}

> params[:father][:first] == person1[:first]
=> true
> params[:mother][:first] == person2[:first]
=> true
> params[:child][:first] == person3[:first]
=> true

<問題3>

userというハッシュを定義してみてください。このハッシュは3つのキー:name、:email、:password_digestを持っていて、それぞれの値にあなたの名前、あなたのメールアドレス、そして16文字からなるランダムな文字列が代入されています。

<回答3>

> user = {}
=> {}
> user[:name] = "Taku"
=> "Taku"
> user[:email] = "kosmo.waizu0804@gmail.com"
=> "kosmo.waizu0804@gmail.com"
> > user[:password_digest] = ("a".."z").to_a.shuffle[0..15].join
=> "fpnewraocjbhustg"
> user
=> {:name=>"Taku", :email=>"kosmo.waizu0804@gmail.com", :password_digest=>"fpnewraocjbhustg"}

<問題4>

Ruby API (訳注: もしくはるりまサーチ) を使って、Hashクラスのmergeメソッドについて調べてみてください。次のコードを実行せずに、どのような結果が返ってくるか推測できますか? 推測できたら、実際にコードを実行して推測があっていたか確認してみましょう。

<回答4>

> { "a" => 100, "b" => 200 }.merge({ "b" => 300 })
=> {"a"=>100, "b"=>300}

railsチュートリアル4章の気になる!

その他メモ

  • 新しいブランチの作り方
$ git checkout -b rails-flavored-ruby
Switched to a new branch 'rails-flavored-ruby'
$ git branch
  master
* rails-flavored-ruby

第4章まだ途中ですが、ここで一度アップ!

1万文字超えてるではないか...