wired raven

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

ずがーん

鞄から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チュートリアル

追記

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

AirPods with Wireless Charging Caseレビュー

購入

ヨドバシカメラApple Storeで在庫切れになっていたので、au Online Shop経由で購入。

  • 2019/04/14に仮注文
  • 2019/04/15に本注文
  • 2019/04/16に発送
  • 2019/04/17、手元に届く

思っていたよりも早く届いた。

レビュー

ケース

重さ

38g、ケースもコンパクトなので邪魔にはならない。

バッテリー持ち

ケース AirPods
充電前 81% 71%
充電後 75% 100%

ざっくり考えると、ケース20%弱でAirPodsがフル充電できることになる。ケースだけでAirPodsを5回ぐらいフル充電できそうだ。

AirPods

重さ

4gと軽い。

付け心地

形状はEarPodsと同じ。EarPodsで落ちにくい人なら問題なく使える。

EarPodsだとケーブルに引っ張られて落ちる場面があったが、ワイヤレスのAirPodsにはその心配がない。

頭を横に振ったり、ジャンプしたりしても落ちなかった。歩いたり、早歩きする分には問題なかったが、スロージョグぐらいになると位置がずれ始めた。

運動するときに使う場合は密着性をあげるアクセサリや落下防止のアクセサリと組み合わせるといいかも。

音質

普段、低音重視のイヤホンやヘッドホンを使っているので、バランスよく聞こえる。

音漏れ

オープンエア型のイヤフォンなので、音漏れはしやすい。横に誰かがいるような場面では、音量に注意したほうがいいだろう。

遮音性

ほとんどないので期待してはいけない。

外の音が聞こえやすいので、話しかけられても返事はしやすいだろう。

遅延

アイドルマスターシンデレラガールズのタイミング調整機能で調べることにした。

計測は2回。

出力 調整値
内蔵スピーカー -5~2
AirPods 13~18
PowerBeats 3 16~20
Bose QuietComfort 35 Series II 21

AirPodsは遅延が小さいといえる。

バッテリー持ち

カタログスペックだと再生5時間可能。

1時間半ほど再生して残り74%、だいたいカタログスペック通りの数字になりそう。

Hey, Siri

部屋の中では普通に使える。

外では状況によっては反応しない。流石に無理があるか?

タップ操作

初期設定では両方とも次のトラック、左右別に設定もできる。

設定できる操作は

  • Siri
  • 再生/一時停止
  • 次のトラック
  • 前のトラック
  • オフ
    • 割り当てなし

の5つ。

ペアリング

iPhoneの場合はケースを近づけるだけでペアリングが完了する。

同じApple IDでログインしている端末にもこれで使えるようになる。

切り替え

iPadiPhoneならコントロールセンター、macOSならメニューバーから短い操作でできる。

ケースに入れても最後に繋いだデバイスに自動で再接続するので、複数のデバイスで使いわける際はちゃんと、接続されているかを確認したほうがよい。

総評

iOSmacOSのデバイスを使っている人には、切り替えがスムーズなのでおすすめのフルワイヤレスイヤホン。

再生時間が5時間なので、移動中に使ったりするのにちょうどいいだろう。使い終わったらケースに入れて充電すればバッテリー切れの心配はない。

AirPodsそのものの評価ではないが、アクセサリーが豊富なのも他のイヤホンにはない特徴だと思う。普及しているものならではだろう。

参考