wired raven

文字通りの日記。主に思ったことやガジェットについて

Incase 13インチTextured Hardshell Case in Woolenex for MacBook Proを購入

渋谷に出かける用事があったので、帰りにApple Storeに寄ってシェルケースを探す。

Incaseのシェルケースが良いかな、と棚の前で悩んでいると、店員さんがApple Storeアプリ使うとより情報調べやすいですよ、とのこと。バーコードを読み取ると詳細を表示してくれるようで。

とはいえ、それだけだと判断がつかないので、試しにつけてみたい、と相談したら快諾してくれたので、色々と試させてもらった。

外側は梨地、裏側はドットパターンが入っているものと悩んだけど、Incase 13インチTextured Hardshell Case in Woolenex for MacBook Pro with Thunderbolt 3(USB-C)を選んだ。

見た目が大きく変わるのと、布のような表面の加工の触り心地が良かったことが決め手になった。

気になるところは、表面加工の耐久性。長持ちしてくれることを祈ろう。

ケースのゴム足のグリップが良く、滑りにくくなった。机の上で向きを頻繁に変えるような使い方とは相性が悪いかもしれない。

あと、このゴム足のおかげで打鍵感が優しくなった。タイピングの疲労感が軽くなるかも。

傷の修理について

店員さんに修理できるか質問したところ、

  • 機能面には影響のない傷なので修理対象外になること
  • トップケースの修理なのでディスプレイごとの交換になること

と返事をもらった。かすり傷で修理を依頼するのは大げさにも程が有る。

使っていれば傷はつくものだし、ケースを使っていてもやっぱり傷はつく、とも。もう少し頑丈になってくれないものか。

ずがーん

鞄からMacBook Pro 13インチを取り出すときに、金属製の背もたれにぶつけてしまっていい音が。

ヒンジ側のフチが幅1㎝ほど削れてしまった。フチの加工がきれいなだけに目立つ。

運がよかったのはディスプレイを開いてしまえば、見えなくなる場所だったことか。

ポジティブに考えれば、他の人のMacBook Proと見分けがつきやすくなったとか、シール貼る踏ん切りがついたとか。

これから先も持ち運ぶつもりだし、スリーブケースかハードケースを購入しようか。取り出すたびに神経質になるのも毒だし。

今日のRailsチュートリアル(3章はじまり~3.3.2 Redまで)

メモ

プッシュはこまめに行う

$ git add -A
$ git commit -m "Add a Static Pages controller"
$ git push -u origin static-pages

とすると、3行目でプッシュ先が指定されて、

git push

だけでstatic-pagesブランチにプッシュされるようになる?

Herokuにデプロイするときは、ブランチをmasterに切り替えてから操作する。ほかにもやり方あるのか?

git branch -- ブランチ確認
git checkout master
git push heroku master

rails testでエラー

ec2-user:~/environment/sample_app (static-pages) $ rails test
Running via Spring preloader in process 7160
/home/ec2-user/environment/sample_app/db/schema.rb doesn't exist yet. Run `rails db:migrate` to create it, then try again. If you do not intend to use a database, you should instead alter /home/ec2-user/environment/sample_app/config/application.rb to limit the frameworks that will be loaded.
Run options: --seed 5222

# Running:

..

Finished in 0.307131s, 6.5119 runs/s, 6.5119 assertions/s.

2 runs, 2 assertions, 0 failures, 0 errors, 0 skips
Traceback (most recent call last):
        33: from -e:1:in `<main>'
        32: from /home/ec2-user/.rvm/rubies/ruby-2.6.0/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require'
        31: from /home/ec2-user/.rvm/rubies/ruby-2.6.0/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require'
        30: from /home/ec2-user/.rvm/gems/ruby-2.6.0/gems/spring-2.0.2/lib/spring/application/boot.rb:19:in `<top (required)>'
        29: from /home/ec2-user/.rvm/gems/ruby-2.6.0/gems/spring-2.0.2/lib/spring/application.rb:135:in `run'
        28: from /home/ec2-user/.rvm/gems/ruby-2.6.0/gems/spring-2.0.2/lib/spring/application.rb:135:in `loop'
        27: from /home/ec2-user/.rvm/gems/ruby-2.6.0/gems/spring-2.0.2/lib/spring/application.rb:141:in `block in run'
        26: from /home/ec2-user/.rvm/gems/ruby-2.6.0/gems/spring-2.0.2/lib/spring/application.rb:171:in `serve'
        25: from /home/ec2-user/.rvm/gems/ruby-2.6.0/gems/spring-2.0.2/lib/spring/application.rb:171:in `fork'
        24: from /home/ec2-user/.rvm/gems/ruby-2.6.0/gems/minitest-5.10.3/lib/minitest.rb:63:in `block in autorun'
        23: from /home/ec2-user/.rvm/gems/ruby-2.6.0/gems/minitest-5.10.3/lib/minitest.rb:141:in `run'
        22: from /home/ec2-user/.rvm/gems/ruby-2.6.0/gems/minitest-5.10.3/lib/minitest.rb:687:in `report'
        21: from /home/ec2-user/.rvm/gems/ruby-2.6.0/gems/minitest-5.10.3/lib/minitest.rb:687:in `each'
        20: from /home/ec2-user/.rvm/gems/ruby-2.6.0/gems/guard-minitest-2.4.4/lib/guard/minitest/reporter.rb:10:in `report'
        19: from /home/ec2-user/.rvm/gems/ruby-2.6.0/gems/guard-minitest-2.4.4/lib/guard/minitest/notifier.rb:31:in `notify'
        18: from /home/ec2-user/.rvm/gems/ruby-2.6.0/gems/guard-compat-1.2.1/lib/guard/compat/plugin.rb:113:in `notify'
        17: from /home/ec2-user/.rvm/gems/ruby-2.6.0/gems/guard-2.13.0/lib/guard/notifier.rb:31:in `notify'
        16: from /home/ec2-user/.rvm/gems/ruby-2.6.0/gems/guard-2.13.0/lib/guard/notifier.rb:11:in `connect'
        15: from /home/ec2-user/.rvm/gems/ruby-2.6.0/gems/notiffany-0.1.1/lib/notiffany/notifier.rb:42:in `connect'
        14: from /home/ec2-user/.rvm/gems/ruby-2.6.0/gems/notiffany-0.1.1/lib/notiffany/notifier.rb:42:in `new'
        13: from /home/ec2-user/.rvm/gems/ruby-2.6.0/gems/notiffany-0.1.1/lib/notiffany/notifier.rb:87:in `initialize'
        12: from /home/ec2-user/.rvm/gems/ruby-2.6.0/gems/notiffany-0.1.1/lib/notiffany/notifier.rb:198:in `_activate'
        11: from /home/ec2-user/.rvm/gems/ruby-2.6.0/gems/notiffany-0.1.1/lib/notiffany/notifier.rb:180:in `_detect_or_add_notifiers'
        10: from /home/ec2-user/.rvm/gems/ruby-2.6.0/gems/notiffany-0.1.1/lib/notiffany/notifier/detected.rb:59:in `detect'
         9: from /home/ec2-user/.rvm/gems/ruby-2.6.0/gems/notiffany-0.1.1/lib/notiffany/notifier/detected.rb:59:in `each'
         8: from /home/ec2-user/.rvm/gems/ruby-2.6.0/gems/notiffany-0.1.1/lib/notiffany/notifier/detected.rb:60:in `block in detect'
         7: from /home/ec2-user/.rvm/gems/ruby-2.6.0/gems/notiffany-0.1.1/lib/notiffany/notifier/detected.rb:60:in `detect'
         6: from /home/ec2-user/.rvm/gems/ruby-2.6.0/gems/notiffany-0.1.1/lib/notiffany/notifier/detected.rb:60:in `each'
         5: from /home/ec2-user/.rvm/gems/ruby-2.6.0/gems/notiffany-0.1.1/lib/notiffany/notifier/detected.rb:62:in `block (2 levels) in detect'
         4: from /home/ec2-user/.rvm/gems/ruby-2.6.0/gems/notiffany-0.1.1/lib/notiffany/notifier/detected.rb:100:in `_add'
         3: from /home/ec2-user/.rvm/gems/ruby-2.6.0/gems/notiffany-0.1.1/lib/notiffany/notifier/detected.rb:100:in `new'
         2: from /home/ec2-user/.rvm/gems/ruby-2.6.0/gems/notiffany-0.1.1/lib/notiffany/notifier/base.rb:59:in `initialize'
         1: from /home/ec2-user/.rvm/gems/ruby-2.6.0/gems/notiffany-0.1.1/lib/notiffany/notifier/tmux.rb:69:in `_check_available'
/home/ec2-user/.rvm/gems/ruby-2.6.0/gems/notiffany-0.1.1/lib/notiffany/notifier/tmux/client.rb:12:in `version': undefined method `[]' for nil:NilClass (NoMethodError)

ぐぐったらtmuxをインストールしたら直るとのこと。

さくっとsudo yum install tmuxしてrails testを実行、今度は問題なし。

エラーログの最終行からtmuxが使えないというのが読み取れそうな……。

雑感

  • README.mdを整えるとそれらしく見えると、しょうもないことを思った
  • 最初の設定に躓きはしたけど、GitHubにプッシュできているので一安心

今日のRailsチュートリアル(2章終わりまで)

2.3.3 ユーザーはたくさんのマイクロポストを持っている

演習

1.

ユーザーのshowページを編集し、ユーザーの最初のマイクロポストを表示してみましょう。同ファイル内の他のコードから文法を推測してみてください (コラム 1.1で紹介した技術の出番です)。うまく表示できたかどうか、/users/1 にアクセスして確認してみましょう。

1時間たっぷり考えて正解に至らず。検索して他の人のコードを参考に、というか、書き写した

views/show.html.erbの下のほうに

.
.
.
<p>
  <strong>first micropost:</strong>
  <%= @user.microposts.first.content %>
</p>

<%= link_to 'Edit', edit_user_path(@user) %> |
<%= link_to 'Back', users_path %>

を追加。

これでクエリの発行から結果の表示までできるのか……。

どうも、SQLクエリを発行して、その結果を処理して、というイメージが離れない。

2.

リスト 2.16は、マイクロポストのContentが存在しているかどうかを検証するバリデーションです。マイクロポストが空でないことを検証できているかどうか、実際に試してみましょう (図 2.16のようになっていると成功です)。

指示通りにファイルを書き換えてみると、バリデーションチェックが動いてエラー表示になった

3.

リスト 2.17のFILL_INとなっている箇所を書き換えて、Userモデルのnameとemailが存在していることを検証してみてください (図 2.17)。

models/user.rbを次のように編集

class User < ApplicationRecord
    has_many :microposts
    validates :name, presence: true
    validates :email, presence: true
end

2.3.4 継承の階層

演習

1.

本番環境で2~3人のユーザーを作成してみましょう

作成はできるもののエラーが表示される。

f:id:sesuna:20190423184852p:plain

2.3.3.1の演習で改造したコードが悪さをしていたようで、削除後にherokuにデプロイしたら直った。

2.

本番環境で最初のユーザーのマイクロポストを作ってみましょう

これは普通に投稿できた。

3.

マイクロポストのContentに141文字以上を入力した状態で、マイクロポストを作成してみましょう。リスト 2.13で加えたバリデーションが本番環境でもうまく動くかどうか、確認してみてください。

バリデーションが動くことを確認した。

雑感

  • ざっとやってみたけど、理解度がすごく怪しい
  • 確実に一個ずつ進めていくのがいいのか、さっとまずは全体をやるのがよいのか悩ましい
    • 一番、困るのは挫折することなのでひとまずはざっとやってみるか……?

今日のRailsチュートリアル

つまずいたところ

第1章 ゼロからデプロイまで - Railsチュートリアル

  • heroku loginで躓く
    • ターミナルを覗くとログイン用のURLとWarning: Cannot open browser.のメッセージ
    • URLを開いて、すでに用意してあったHerokuアカウントでログインすると、すんなりログインが終わった

演習

2章の演習

  1. 図 2.11を参考にしながら、/users/1/edit というURLにアクセスしたときの振る舞いについて図を書いてみてください。
    • 後述
  2. 図示した振る舞いを見ながら、Scaffoldで生成されたコードの中でデータベースからユーザー情報を取得しているコードを探してみてください。
    • models/user.rb
  3. ユーザーの情報を編集するページのファイル名は何でしょうか?
    • views/users/edit.html.erb

1.

  1. ブラウザから「/users/1/edit」というURLのリクエストをRailsサーバーに送信する
  2. 「/users/1/edit」リクエストは、Railsのルーティング機構によって、Usersコントローラ内のeditアクションに割り当てられる
  3. editアクションの前にset_userアクションが実行され、「指定のユーザをとりだせ」(User.find(params[:id]))と問い合わせる。この場合はユーザID: 1
  4. Usersモデルは問い合わせを受け、ユーザID: 1のユーザw-をデータベースがら取り出す
  5. データベースから取り出されたユーザーをUserモデルからコントローラに返す
  6. Usersコントローラーは、ユーザーを@users変数に保存し、editビューに渡す
  7. editビューが起動し、ERBを実行して、HTMLを生成する
  8. コントローラは、ビューで生成されたHTMLを受け取り、ブラウザに返す

editアクションの中身がわからない

例としてあげられているindexアクションだと、

  def index
    @users = User.all
  end

で、editは

  def edit
  end

だけ。

users_controller.rbをよく見ると、頭のほうで

before_action :set_user, only: [:show, :edit, :update, :destroy]

と定義されている。

  private
    # Use callbacks to share common setup or constraints between actions.
    def set_user
      @user = User.find(params[:id])
    end

    # Never trust parameters from the scary internet, only allow the white list through.
    def user_params
      params.require(:user).permit(:name, :email)
    end

パラメータで渡されたユーザーIDで検索する処理が先には入るのか。

進捗

課題

  • ブログに書くのだからフォーマットを考えたい
  • 演習の答えあわせができてない。そろそろ答えに確信が持てなくなってきた。答え合わせをしたいが……
  • 2時間ぐらいが限界。最初の1時間は健全な集中の仕方で、後半はやや自棄になった感じの集中だった。休憩はさんだりしたら、リラックスして挑めるのだろうか?

今日のRailsチュートリアル

追記

アドバイスのおかげで解決した。感謝。