窓際BLOG

プログラミングの学習メモや書籍の感想等を公開していきます。

RubyonRails:RubyonRailsチュートリアル回答メモ(第7章)

第7章の回答メモです。

「ユーザー登録」

問1

リスト7.31のコードを使用して、7.1.4で定義されたgravatar_forヘルパーにオプションのsizeパラメーターを取ることができる (gravatar_for user, size: 40のようなコードをビューで使用できる) ことを確認してください。(9.3.1でこれを改善したヘルパーを使います)

回答

user_helper.rb

module UsersHelper
# 引数で与えられたユーザのGravator画像を返す
  def gravator_for(user,options = {size: 80})
    gravatar_id = Digest::MD5::hexdigest(user.email.downcase)
    size = options[:size]
    gravator_url = "https://secure.gravatar.com/avatar/#{gravatar_id}?s=#{size}"
    image_tag(gravator_url,alt: user.name,class: "gravatar")
  end
end

プロフィール画像のサイズが指定したとおり、「80px,80px」となる。 f:id:madogiwa0124:20160925222846p:plain

問2

リスト7.18で実装したエラーメッセージに対するテストを書いてみてください。どのくらい細かくテストするかはお任せします。リスト7.32にテンプレートを用意しておいたので、参考にしてください。

回答

users_signup_test

  test "invalid signup information" do
    get signup_path
    assert_no_difference 'User.count' do
      post users_path,user:{
        name:                  "",
        email:                 "user@invalid",
        password:              "foo",
        password_confirmation: "bar"
      }
    end
    assert_template 'users/new'
    assert_select 'div#error_explanation' # 生成されるHTML要素に左記が含まれるかtest
    assert_select 'div.field_with_errors'   # 生成されるHTML要素に左記が含まれるかtest
  end

問3

7.4.2で実装したflashに対するテストを書いてみてください。どのくらい細かくテストするかはお任せします。 リスト7.33に最小限のテンプレートを用意しておいたので、参考にしてください (ヒント: FILL_INメソッドを適切なコードに置き換えると完成します)。(テキストに対するテストは壊れやすいです。文量の少ないflashのキーであっても、それは同じです。個人的には、flashが空でないかをテストするだけの場合が多いです)

回答

user_signup_test.rb

  test "valid signup information" do
    get signup_path
    assert_difference 'User.count',1 do
      post_via_redirect users_path,user:{
        name:                  "Example User",
        email:                 "user@example.com",
        password:              "password",
        password_confirmation: "password"
      }
    end
    assert_template 'users/show'
    assert_not flash.empty? # 追加
  end
end

問4

7.4.2で触れたように、flash用のHTML (リスト7.25) は読みにくいです。より読みやすくしたリスト7.34のコードに対してテストスイートを実行し、こちらも正常に動作することを確認してください。このコードでは、Railsのcontent_tagヘルパーを使用しています。

回答

application.html.erb

      <% flash.each do |message_type,message| %>
         <%= content_tag(:div, message, class: "alert alert-#{message_type}") %>
      <% end %>

ここまで

RubyonRails:RubyonRailsチュートリアル回答メモ(第6章)

第6章の回答メモです。

「ユーザーのモデルを作成する」

問1

リスト6.31の、メールアドレスを小文字に変換するコードに対するテストを、リスト6.41に示されているように作成してください。このテストでは、reloadメソッドを使用してデータベースから値を再度読み込み、assert_equalメソッドを使用して同値であるかどうかをテストしてください。リスト6.41のテストが正しいかどうか検証するために、before_saveの行をコメントアウトするとテストが失敗し、元に戻すと成功することを確認してください。

回答

user_test.rb

  test "email addresses should be saved as lower-case" do
    mixed_case_email = "Foo@exAMPle.CoM"
    @user.email = mixed_case_email
    @user.save
    assert_equal mixed_case_email.downcase,@user.reload.email
  end

user.rb

  before_save { self.email = email.downcase }    # $ bundle exec rake test の結果: true
  # before_save { self.email = email.downcase } # $ bundle exec rake test の結果: false

問2

before_saveコールバック内でemail.downcase!と書き、email属性を直接変更してもよいことを、テストスイートを走らせて確認してください (リスト6.42のように書いてもよいことを、テストスイートを実行して確認してください。

回答

user.rb

    before_save { email.downcase! }    # $ bundle exec rake test の結果: true

問3

before_saveコールバック内でemail.downcase!と書き、email属性を直接変更してもよいことを、テストスイートを走らせて確認してください (リスト6.42のように書いてもよいことを、テストスイートを実行して確認してください。

回答

user_test.rb

  test "email validation should accept invalid addresses" do
    invalid_addresses = %w[
                          user@example,com
                          user_at_foo.org
                          user.name@example.
                          foo@bar_baz.com
                          foo@bar..com #"."が2回以上出現するケース
                        ]
    invalid_addresses.each do |invalid_address|
      @user.email = invalid_address
      assert_not @user.valid?,"#{invalid_address.inspect}should be valid"
    end
  end

user.rb

    VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-]+(\.[a-z\d\-]+)*\.[a-z]+\z/i   # $ bundle exec rake test の結果: true
  # VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i# $ bundle exec rake test の結果: false

ここまで

RubyonRails:RubyonRailsチュートリアル回答メモ(第1章)

Ruby on Rails チュートリアルの演習回答メモです。

第一章「ゼロからデプロイまで」

演習1

問1

リスト1.8のhelloアクションを書き換え、「Hello, world!」の代わりに「hola, mundo!」と表示されるようにしてみましょう。課外作業: Railsの表示では「非ASCII文字」もサポートされています。スペイン語特有の逆さ感嘆符「¡」を含む「¡Hola, mundo!」を表示してみましょう (図1.19)20 

回答

application_controller.rb

class ApplicationController < ActionController::Base
  # Prevent CSRF attacks by raising an exception.
  # For APIs, you may want to use :null_session instead.
  protect_from_forgery with: :exception
  def hello
      render text:"hola, mundo!"
  end
end
問2

リスト1.8のhelloアクションを複製して、第2のアクションgoodbyeを追加しましょう。このアクションは、「goodbye, world!」というテキストを表示します。リスト1.10のルーティングを編集して、ルートルーティングの割り当て先をhelloアクションからgoodbyeアクションに変更します (図1.20)。

回答

application_controller.rb

class ApplicationController < ActionController::Base
  # Prevent CSRF attacks by raising an exception.
  # For APIs, you may want to use :null_session instead.
  protect_from_forgery with: :exception
  def hello
      render text:"hola, mundo!"
  end

  def goodbye
      render text:"goodbye, world!!"
  end

end

routes.rb

Rails.application.routes.draw do
  root 'application#goodbye'
end

とりあえず、一章はここまで

SIerを辞めかけて思ったこと

10月1日から今の仕事(中堅SIer)をやめて、

第二創業期のとあるベンチャー企業で働くはずだったのですが、

いろいろ悩んだ結果、現在の職場に残ることになりました。 

転職のきっかけ

転職のきっかけは、今いる案件を一人で回すようになったことだと思います。

甘えもあるかも知れません、経験の浅い自分が年商〜千億の会計システムの導入案件の要件定義を一人でやっていくことへの不安と顧客への申し訳なさ、そういう状況になってしまう会社への不信感を感じたこと。

それと以前から下記に不満を感じていたことが大きな理由です。

  • 労働環境:長時間労働の常態化(日付が変わる前には、帰りたい!)
  • 獲得スキル:マネジメント + Excel(エンジニアとして成長したい!)
  • キャリアパスプロマネ(もっとサービスを考えてみたい!)

そんなわけで今年の7月頃、転職活動を始めました。

[この頃の自分]

  • 一人で案件を回して、孤独感はんぱない。実際に顧客に提示している体制とは違う。嘘ついてお金貰っている・・・?
  • 会計業務はそこそこ面白いけど、それ以外の資料作成や導入システムの仕様調査に掛かる時間が半端なくて、自身の成長としては、足踏みしている感はんぱない。
  • なんのために自分は仕事をしているのか(顧客?会社?チーム?)。少なくても自分のためだとは思えない。

転職活動について

転職活動は、paizaをを利用しました。

paiza.jp

理由は、

  • 実際に自分の書いたコードが採用の判断材料となるため、自分の実力感とのアンマッチを防げる(ハードルは上げたくない!)
  • 転職活動を通じて自分自身の技術を伸ばしていける

(実際に内定も貰え、自分の技術的スキルも向上したと考えているので、この判断は良かったと考えています。)

スケジュールと概要

【自己分析+お勉強(〜7月)】

・履歴書・職務経歴書を書きつつ自己分析

 自分のやりたいこと、今後のキャリアパスを記事を見たり、勉強会に参加して色々と考えました。

 ・SIerから飛び出して、それからどうするの? - DevLOVE | Doorkeeper

 ・一社目選びが成功の秘訣!SIerからWebエンジニアへの失敗しない転職方法 | TechStars Blog

 ・技術か管理か?SIerのエンジニアがこのさき失敗しないためのキャリアガイド - paiza開発日誌

 ・「SIer から WEB業界に転身するために準備しておくべきこと」Crevo CTO 工藤陽 | CAREER HACK

・プログラミングのお勉強

 転職活動前からですが、javascriptRubyを中心に勉強してました。

 ドットインストール(javascriptRuby関連のもの)

 たのしいRuby 第5版   

 確かな力が身につくJavaScript「超」入門

 JS+Node.jsによるWebクローラー/ネットエージェント開発テクニック

・paizaのスキルチェックでランクを"C"まで上げる

 RubyjavascriptでランクCはクリア出来るぐらいまでやりました。

あとは、こんなの作ってました。。。

TaskBorder:登録不要の看板型タスク管理アプリ

キーワードミキサー:2つのキーワードから連想したアイデアTwitterに投稿出来るアプリ

【転職先探し(7月)】

前段の自己分析をして、自分の転職先を選ぶ観点は下記としました。

  • BtoCの自社サービス(自分の成長=サービスの成長、自分のアイデアをサービスに反映させて、世の中に広めたい!)
  • 世の中のためになり、面白そうなこと(せっかくやるなら!)
  • 給料は一旦、考えない(経験が浅いため給料が大分下がるのは仕方ない。)

求人探しは、自分から色々探すというよりは、paizaからスカウトで来た求人を中心に見てましたねー。(思い返せば結構受け身だったような・・・。)

そしてついに、、、

【面接(8月)】

・一社目:web広告系BtoC自社サービス

 結果:不合格

 原因:スキルのアンマッチ

 備考:スキル不足もそうだが、技術を教えて貰おうという姿勢が良くなかったと思う。甘い。

・二社目:webベンチャー系BtoC自社サービス(第二創業期)

 結果:内定

 要因:人柄、企業文化とのマッチ、スキルを身に付けてくれそう

 備考:自分の志向とも合っていたし、本当に良い会社に出会えたと思った。

大変だったこと

 長時間労働の中、面接の時間を確保するのがめっちゃ大変だった。。。平日の時間を作る代わりに土日出社したり。。。

転職活動を終えて

内定辞退

まぁ結局は辞退してしまいました。。。

  • 顧客、チームを考えた時に今の案件を途中で、放り出すことが出来なかった。
  • 正直ベンチャー企業でやっていける自信が持てなかった。(びびってしまった涙)

 上記が正直な理由です。

正直、この決断が正しかったかどうかはわかりません。

内定先にも、直接お伺いし真摯に一緒に自分のキャリアを考えて頂きました。

本当に感謝しています。

これからどうすんの?

 とりあえず上司等と話し、自社の新規事業立ち上げに関われそうなので、

そこをモチベーションに頑張っていこうかと思っています。

とりあえず下記を目標に今年度頑張ります!

  • 自社の新規事業立ち上げに関わり、アメンバーになる。
  •  現在の会計案件を最後までやり切る。
  • プライベートで何かサービスを公開する。

最後に

辞退はしたけど、転職活動っていうのは自分自身のキャリアを見直すいい機会になったと思う。

今までは、「こんなことやりたくない、もう辞めたい。けど自分は他に行く場所なんてあるのか?」って思っていて、すごくもやもやして中途半端な状態だった。本当につらい時期だったと思う。

でも転職活動をして、実際に内定をもらって自分の自信になったし、いい意味で吹っ切れたと思う。

今も相変わらず、業務は忙しいけど前みたいなもやもや感は無くなったと思う。

とりあえず、目標達成に向けて前向きに頑張っていきたい。

 

転職を考えているSIerで働く自分と同年代の若手の皆さんへ

色々ともやもやしている人は、転職活動をしてみるのも良いかと思います。

 

以上、散文失礼しました。

 

 

 

 

javascript:<input type="date">の初期値に現在日付を設定する方法

自分で作っている時に少しハマったので、φ(..)メモメモ

<input type="date">の日付の設定について

<input type="date" id="limit">

HTML5で新しく追加された日付を入力するためのフォーム部品は、
時刻の形式を"yyyy-mm-dd"で設定しなければいけません。

なにも考えずに設定してしまうと・・・

しかし、下記のように何も考えずに月日を取得し、設定すると形式が合わずErrorとなってしまいます。。。

  var month = date.getMonth() + 1 // 返り値は、1 ~ 12
  var day = date.getDate() // 返り値は、1 ~ 31

※返り値が一桁となる場合、mmまたはddの形式とならない。

解決作

日付を取得した後に指定桁数にゼロ埋めしてあげる。
以下のサンプルでは、toTargetDigitsで対象(num)と何桁まで0埋めするか(digits)を指定し、
指定桁数まで文頭に'0'を追加しています。

サンプルソース

  var date = new Date()
  var year = date.getFullYear()
  var month = date.getMonth() + 1
  var day = date.getDate()

  var toTargetDigits = function (num, digits) {
    num += ''
    while (num.length < digits) {
      num = '0' + num
    }
    return num
  }
  
  var yyyy = toTargetDigits(year, 4)
  var mm = toTargetDigits(month, 2)
  var dd = toTargetDigits(day, 2)
  console.log(yyyy+'-'+mm+'-'+dd)

参考にさせて頂いたページ

tagamidaiki.com
qiita.com

Bootstrap:btn-groupで結合したボタンをインラインで表示する方法

Bootstrapで結合したボタンをインラインで表示させる際にハマったので、メモφ(..)

結果としては、下記のように<div></div>じゃなくて<span></span>を使用すれば、
問題ないっぽい。

<span class="btn-group">
     <button class="btn btn-xs btn-success">ボタン1</button>
     <button class="btn btn-xs btn-success">ボタン2</button>
</span>

参考にしたページ
qiita.com

javascript:Twitter投稿画面に任意の文字列を初期設定させる方法

外部サービスからTwitterへ投稿する必要があり、
TwitterAPI等は使いたくなかったのでいろいろ調査した結果をメモ。

Twitterの投稿画面に任意の文字列を初期設定させるためには、
投稿画面のurlの"text="以降にURLエンコードした文字列を設定して上げれば良い。
TwitterAPI等を使わなくてもTweetを投稿することは出来る。
("#"をつければ、ハッシュタグとして認識される。)
※もっと良いやり方があるかもしれませんが。。。

(function() {
        window.open(
            "https://twitter.com/intent/tweet?text=" + 
            encodeURIComponent(
                "hogehogehoge"
                +"#hugahuga"
            )
        );
})();