MacBookProをAppleの修理サービスに出した話
症状
私のMacBookPro(2016)のディスプレイが突如映らなくなりました。正確に表現すると、ディスプレイを30%以上開くと映らなくなります。caps lockのランプは付く状態であったため、ディスプレイの問題かロジックボード根本の問題と予想。ただ、外部出力でモニターを拡張した場合、モニターには映像がしっかり映るので、おそらくディスプレイの問題。その数日前からトラックパットのクリックのレスポンスがなくなったりする症状も確認されていたため、ビックカメラのApple修理サポートに持ち込みました。
(持って行く前に写真撮っておけばよかった)
2018/10/18 AM
予約をしていなかったので、開店直後を狙って入店。ひとまず後回しにされたけど、予約の方が来なかったため割と早く対応してもらえた。症状の報告としては、ディスプレイを開くと映らなくなることを報告。聞けばトラックパットのレスポンス修理も、ディスプレイの修理料金内で行ってくれるとのことだったので、頼むことに。見積もりは62640円
。まぁ自分ではどうしようもなかったのでむしろありがたいという気持ちで修理に出しました。バックアップは取っていなかったのですが、この修理ならおそらく消えないだろうなんて高を括っていました。
2018/10/26 AM
前日に修理完了の連絡をショートメールで受けたので受け取りに。(受け取りは予約いらないです) しかし、出てきた本体の電源がつかず。もう一度検査修理するためにさらに一週間預けることになりました。この時点でディスプレイのテストは全て通ったとのことを説明され、目視でもMacBookの上半分が新しくなっていることを確認。まぁ、テスト時は動いてたのなら、仕方ないよねって気持ちでした。ただ、この時点でデータ全部飛ぶなってことを確信。(笑) それと料金が最初の見積もりよりも上がるかもとの説明が、、!
2018/10/31 AM
二日前にショートメールで修理完了のお知らせが届いたので取りに行きました。 そして無事生還!いやそんなおおごとでもないですが、、。料金は変わらず62460円。増えてなくてよかった。修理内容を転記しておきます。
内蔵ディスプレイに映像が映らないとの初見申請を確認。外部出力が可能な事から総合診断テストを実施。外部ディスプレイには正常に映像が映る事を確認した為、ディスプレイ交換修理を行いましたが本体の電源が入らない症状発生を確認。各種パーツ再接続を行うも症状改善せず。以上の事からロジックボード及びディスプレイ交換が必要と判断。詳細な検査検証を行うべくアップル修理センターでの修理を依頼致します。
で、最終的に交換されたパーツは以下。
- Logic Board i7 3.3 16GB 256GB (電源が入らない)
- Display Assembly Space Gray (映像が表示されない)
- Top Case with Battery (Trackpadの反応に違和感)
うーん。総取っ替えかな笑 Logic Boardを変えたので当然のごとくデータは飛びました!まぁこれは自分が悪い!そんなに大事なものなかったし!最近のMacBookは頭脳部をちっちゃくLogic Boardにまとめているので、該当箇所だけ変えることができませんでした。
との説明。
報告書を見る限りバッテリーも変わってますね。これは下パーツがバッテリー部とまとめて製造されているからでしょうか?トラックパットの不具合はLogicBoard側の問題だと思ったのですが、まぁ新しいならそれはそれでokです。ちなみにキーボードも新しくなってました。私はMacBookPro 2016モデルを初期購入組だったのですが、optionキー
とcontrolキー
の右上にマークはありませんでした。
まとめ
結果的に二週間かかりましたが、普通であれば一週間見れは大丈夫かなと思います。対応自体は丁寧でありがたかったです。データ飛んだのはドンマイです。値段も相応でしょうか。自分ではどうにもなりませんからね。店員さんの説明だと"今回はレアケースで何故起こったのかは不明。初期不良系のものかもしれない。"とのこと。元々MBP2016は15inchディスプレイの方で、映像が映らなくなる初期不良とかありましたので、可能性はなくもないですが、多分運悪く故障が重なっただけかと思います。とりあえず、おかえりなさいですね。以上。
ruby チュートリアル5章 メモ
Bootstrap
twitter社製作とのこと。webデザインとユーザインターフェースの面で恩恵を受けられる。特に、レスポンシブデザインであるのが強み。スタイルシートはapp/assets/stylesheets/
に置くことで、application.css
の一部としてwebのレイアウトに読み込まれる。
Bootstrapのフレームワークを読み込むためには、スタイルファイルの先頭に以下のコードを挿入する。
@import "bootstrap-sprockets"; @import "bootstrap";
scss
ほぼcssかもしれないけれど、.
から始まるものはクラスに対してのもの。#
から始まるのもはid属性を表す。ノーマルなやつはおそらくhtmlタグの類。
body { padding-top: 60px; } .center { text-align: center; } #logo { float: left; margin-right: 10px; font-size: 1.7em; color: #fff; text-transform: uppercase; letter-spacing: -1px; padding-top: 9px; font-weight: bold;
ネスト
スタイルシート中の共通パターンをくくって表現可能。id中の属性については&で表現が可能。
.center { text-align: center; } .center h1 { margin-bottom: 10px; } #logo { float: left; margin-right: 10px; font-size: 1.7em; color: #fff; } #logo:hover { color: #fff; text-decoration: none; }
.center { text-align: center; h1 { margin-bottom: 10px; } } #logo { float: left; margin-right: 10px; font-size: 1.7em; color: #fff; &:hover { color: #fff; text-decoration: none; } }
変数
値を変数に代入して利用できる。色は同じ色をわかりにくい16進数で何度も書かれるよりわかりやすくなる。
$light-gray: #777; h2 { color: $light-gray; } footer { color: $light-gray; }
bootstrapではすでにいくつか変数として用意しているものもあるのでそれを利用するのもあり。一覧はこちら
パーシャル
必要なコード群を一つのファイルにまとめたり、隠したりできる機能。コードを別のファイルに記述しておき、パスで読み込んでそのコードを挿入できるみたいな機能。以下のように記述する。
<%= render 'layouts/header' %>
これで次のファイルを参照する。app/views/layouts/_header.html.erb
ファイル名のアンダースコアは、パーシャルの命名規則。
アセットパイプライン
アセットディレクトリ、マニフェストファイル、プリプロセッサエンジンという、3つの主要な機能をもつ。いろんなアセットを扱えたり、アセットをまとめて扱えたりできているのはこれのおかげ?最大のメリットは、本番アプリケーションで使用するためにアセットを自動で最適化してくれること。(プログラマ的にはアセットはそれぞれ小分けされていた方が扱いやすいが、アプリケーションは読み込み展開に時間がかかってしまう。のでまとめてくれる)不要なインデント、空白等も取り除いてくれるらいし。
アセットディレクトリ
railsでは静的ファイルを目的別に分類する3つのディレクトリが使われる。それぞれのアセットクラス用のサブディレクトリがある。app/assetsの場合、画像用、JavaScript用、CSS用のサブディレクトリがある。 - app/assets: 現在のアプリケーション固有のアセット - lib/assets: あなたの開発チームによって作成されたライブラリ用のアセット - vendor/assets: サードパーティのアセット
$ ls app/assets/ images/ javascripts/ stylesheets/
チュートリアルで作成したcustom.scss
はサンプルアプリケーション固有のアセットなのでapp/assets/stylesheets
にある。
マニフェストファイル
静的ファイル (アセット) を上記の場所へそれぞれ配置すれば、マニフェストファイルを使って、それらをどのように1つのファイルにまとめるのかをRailsに指示することができる。例えばapp/assets/stylesheets/application.css
はアプリケーションのcss用マニフェストファイル。でコメントアウト内の以下の2行が大事。
*= require_tree . *= require_self
- 1行目は
app/assets/stylesheets
ディレクトリ (サブディレクトリを含む) 中のすべてのCSSファイルが、アプリケーションCSSに含まれるようにする。 - 2行目はCSSの読み込みシーケンスの中で、application.css自身もその対象に含める指示。
注意としてマニフェストファイルはCSSとJavaScriptには適用されるが、画像ファイルには適用されない。
プリプロセッサエンジン
必要なアセットをディレクトリに配置してまとめた後、Railsはさまざまなプリプロセッサエンジンを介してそれらを実行し、ブラウザに配信できるようにそれらをマニフェストファイルを用いて結合し、サイトテンプレート用に準備する。どのプリプロセッサを使うのかは、ファイル名の拡張子を使って判断。.scss
や.coffee
,,erb
等
foobar.js.erb.coffee
上の拡張子の場合は、CoffeeScriptとERbの両方で実行されるが、 コードは右から左へと実行されるので、この例ではCoffeeScriptが最初に実行
ルーティングとメソッド
config/route.rb
でroot
に指定したものは以下のメソッドでパスを取得できる。
root_path -> '/' root_url -> 'http://www.example.com/'
config/route.rb
に以下のように記述していくとそれぞれに対して以下のようなメソッドでパスを取得できるようになる。
Rails.application.routes.draw do ... get '/help', to: 'static_pages#help' ... end
help_path -> '/help' help_url -> 'http://www.example.com/help'
ペルパーのテスト(RSpec)
include
を用いるれば、そこで定義したヘルパーを利用できる。
require 'rails_helper' describe 'ApplicationHelper' do include ApplicationHelper describe 'full_title' do it 'full title helper' do base_title = "Ruby on Rails Tutorial Sample App" page_title = "Help" expect(full_title).to eq(base_title) expect(full_title(page_title)).to eq("#{page_title} | #{base_title}") end end end
ruby チュートリアル 4章 メモ
pry
テストコードでバックするときに導入しました。確認したいコードの手前にbinding.pry
と書くとテストコンソールでブレークできる。そこでpp response.body
と打てばレスポンスの中身を確認できるので、デバッグにとても便利。ちなみにquit
を入力すればテストが続行される。
文字列の式展開
編集に代入した文字列を文字列中で使用できる。3章のテストコードを書く際にすでにできていた。
>> first_name = "Michael" # 変数の代入 => "Michael" >> "#{first_name} Hartl" # 文字列の式展開 => "Michael Hartl"
ダブルクォートとシングルクォート
' '
内では式展開が行われない。" "
では行われる。
[5] pry(main)> foo= "aa" => "aa" [6] pry(main)> '#{foo}' => "\#{foo}" [7] pry(main)> "#{foo}" => "aa"
rubyの基礎?
- Rubyはあらゆるものがオブジェクト。オブジェクトはメッセージに応答できる。
[19] pry(main)> "foobar".length => 6 [20] pry(main)> "foobar".empty? => false
- Rubyではbooleanを返すメソッドの名前の末尾に?
をつける。
- 'nil'もオブジェクトで、nil
が'nil'かを聞けるメソッドもある
nil.nil?
- !!
(バンバン)演算子は二重否定になり、値が強制的にbooleanになる。
- rubyのメソッドはデフォルトでメソッド内で最後に評価された式の値が自動的に返される。(returnを書いても普通に返せる)
- モジュールは関連したメソッドをまとめる方法。include
メソッドを使用してミックスインする。railsのApplicationHelper
モジュールは自動的に読まれている。
- 破壊的メソッドは、配列等の順番を変更してしまうメソッドで、末尾に!
がつく。
[78] pry(main)> a => [1, 2, 3, 4, 5] [79] pry(main)> a.reverse => [5, 4, 3, 2, 1] [80] pry(main)> a => [1, 2, 3, 4, 5] [81] pry(main)> a.reverse! => [5, 4, 3, 2, 1] [82] pry(main)> a => [5, 4, 3, 2, 1]
- レンジを表すのに
0..9
とかける。
[85] pry(main)> a= %w[foo bar baz quux] %wを使うと文字列の配列に変換できる。 => ["foo", "bar", "baz", "quux"] [86] pry(main)> a[0..2] => ["foo", "bar", "baz"]
- 配列の範囲を指定するやり方が便利
[93] pry(main)> a[2..(a.length-1)] => [2, 3, 4, 5, 6, 7, 8, 9] [94] pry(main)> a=(0..9).to_a => [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] [95] pry(main)> a[2..(a.length-1)] => [2, 3, 4, 5, 6, 7, 8, 9] [96] pry(main)> a[2..-2] => [2, 3, 4, 5, 6, 7, 8]
- {}またはdo endで囲まれているものがブロック。短いものは{}でまとめて1行で書くのがよい。
- ハッシュ。連想配列とかディクショナリー型的なもの。並び順が保証されない。定義は以下のように
{}
を用いる。
user = { "first_name" => "Michael", "last_name" => "Hartl" }
またシンボルを用いて以下のようにも書ける。
{ :name => "Michael Hartl" } { name: "Michael Hartl" }
-inspectメソッドは要求されたオブジェクトを表現する文字列を返す。p
メソッドというショートカットがある
[177] pry(main)> puts :name, :name.inspect name :name => nil [181] pry(main)> p :name # 'puts :name.inspect' と同じ :name => :name
- rubyはメソッド呼び出し時の丸括弧を使わなくてもよい
# メソッド呼び出しの丸カッコは省略可能。 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' } stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload'
- rubyは既存のクラスにメソッドを組み込むことができる。(組み込みクラス)むやみにする必要はない。
アクセサー
その属性に対応するアクセサーは、そのデータのゲッターとセッターを定義してくれる。例えばattr_accessor :name, :email
と定義した場合、インスタンス変数の@name
と@email
にアクセスできるようになる。クラス内からならどこからでもアクセスできるようになる。
initialize(attributes={})
コンストラクタ。{}をデフォルトで当てているので、空のインスタンスを生成することが可能になる。
require
ruby的にrequire
でファイルを呼べばそれを読み込むことができる.
require './example_user'
ruby チュートリアル 3章メモ
モデルとか
scaffoldで生成したモデルはApplicationRecordクラスを継承している。ApplicationRecordクラスは、Active Recordが提供する基本クラス ActiveRecord::Base
を継承している。これによりモデルオブジェクトはデータベースにアクセスできるようになる。
コントローラも基本的には同じで、ApplicationControllerがActionController::Base
というクラスを継承している。このクラスは、RailsのAction Packというライブラリが提供しているコントローラの基本クラス。ActionController::Base
を継承しているのでモデルオブジェクトの操作や、送られてくるHTTP requestのフィルタリング、ビューのHTML出力が可能となる。コントローラは必ずApplicationControllerを継承しているので、Applicationコントローラで定義したルールは、アプリケーションのすべてのアクションに反映される。
命名規則?
チュートリアルに従うのであれば、コントローラはキャメルケース、アクション名は小文字を使用する。コントローラはこうする事で、スネークケースにしたファイルを自動で生成してくれる(ex, StaticPages -> static_pages_controller.rb)
コントローラの生成(generateコマンド)
自分のrailsを呼び出すまでがまず長いので順番が曖昧になりがち。railsのgenerate
コマンドで何を生成するかでcontrollerを指定するイメージ。
bundle exec rails g controller Foo bar baz
テスト駆動開発 (TDD)
先に正しいコードがないと成功しないテストコードを作成してから、本編のコーディングを行う手法。TDDの是非については両者の意見があるが、テストは必要なものである事には一致している。
Rspecの導入
チュートリアルではMinitestを使用している。(rubyネイティブではMinitestのが良い?!)
group :development, :test do #Gemfileに書き込み .. gem 'rspec-rails', '3.6.0' gem 'factory_girl_rails', '~> 4.2.1' #テストコードを簡単に作成できるらしい end
$bundle install --without production --path=vendor/bundle $ bundle exec rails g rspec:install $ bundle exec rspec #テストの実行
現状だと空なのでそのまま終わる。
** コントローラのテスト rubyのチュートリアル的に初めのテストはコントローラのテストになりそう。チュートリアルだとaboutのテストを作成するが、まず既存のアクションに対するテストを作成してみる。
require 'rails_helper' RSpec.describe StaticPagesController, type: :controller do describe 'GET #home' do it 'has a 200 status code' do get 'home' expect(response).to have_http_status(:ok) end end describe 'GET #help' do it 'has a 200 status code' do get 'help' expect(response.status).to eq(200) #この書き方でもok end end end
するとこんなエラーが、、
require File.expand_path('../../config/environment', __FILE__)
解決法はこちらのサイトにありました。以下の3行をconfig/application.rb
の先頭に追記します。
理由まではちょっとまだわからないです。
ENV['RAILS_ENV'] ||= 'test' require File.expand_path('../../config/environment', __FILE__) require 'rspec/rails'
無事テスト完了しました。
$ bundle exec rspec .. Finished in 0.02094 seconds (files took 8.91 seconds to load) 2 examples, 0 failures
** aboutのテストエラーを解決していく 上のテストコードにaboutアクションについて同じテストを書きました。その後のテストのエラーは以下。
Failures: 1) StaticPagesController GET #about has a 200 status code Failure/Error: get 'about' ActionController::UrlGenerationError: No route matches {:action=>"about", :controller=>"static_pages"} # ./spec/controllers/static_pages_controller_spec.rb:18:in `block (3 levels) in <top (required)>'
ルートマッチがうまくいっていないとのこと。チュートリアル通り、config/routes.rb
に追記します。おそらく次のエラーはアクションがありませんのエラーです。
1) StaticPagesController GET #about has a 200 status code Failure/Error: get 'about' AbstractController::ActionNotFound: The action 'about' could not be found for StaticPagesController # ./spec/controllers/static_pages_controller_spec.rb:18:in `block (3 levels) in <top (required)>'
最後はビューがないよってエラーです。少し長いですが、上に出てくるエラーはチュートリアルと同じですね。
1) StaticPagesController GET #about has a 200 status code Failure/Error: get 'about' ActionController::UnknownFormat: StaticPagesController#about is missing a template for this request format and variant. request.formats: ["text/html"] request.variant: [] NOTE! For XHR/Ajax or API requests, this action would normally respond with 204 No Content: an empty white screen. Since you're loading it in a web browser, we assume that you expected to actually render a template, not nothing, so we're showing an error to be extra-clear. If you expect 204 No Content, carry on. That's what you'll get from an XHR or API request. Give it a shot. # ./spec/controllers/static_pages_controller_spec.rb:18:in `block (3 levels) in <top (required)>'
aboutに対応したviewのファイルを作ってあげて終了です。テストもうまくいくはずです。緑の文字が気持ちいいです。
... Finished in 0.06586 seconds (files took 10.31 seconds to load) 3 examples, 0 failures
rspecが認識するファイル
接尾辞として_spec.rb
がついていること、specディレクトリ以下にあることがテスト時に実行される条件。例えば、hoge_pages_controller.rb
ならhoge_pages_controller_spec.rb
に、application.html.erb
ならapplication.html_spec.rb
にテストを記述してあげる。
ページ要素の検証
初めはcapybaraを使おうとか考えましたが、チュートリアルのテストコードがそのまま使えるようです。(assert_select
のやつ)it~endの間に追加して終わりです。
注意としては以下の1行を追加すること。render_views
を書けばviewの内容も確認できる。これはcontrollerは元々アクション等の振る舞いのみをテストしてほしいからっぽい。 そもそもviewのテストは複雑になるのでテストもあまりしないらしい。
describe StaticPagesController, type: :controller do render_views ...
erb「埋め込みRuby」(Embedded Ruby)
書き方として<% %>
と<%= %>
がある。前者は中のコードが実行されるが、出力しない。後者は実行した後、記述部に出力が挿入される。viewの部分でよく使用する。
yield
今回<%=yield ... %>
の書き方が出てきた。yieldは渡されたブロックを走らせてくれる。ブロックは{}
やdo~end
で囲まれた部分のこと。rubyはデフォルトでブロックを引数として受け取っているらしいのでそれをyieldで走らせているっぽい。デフォルトで生成されたapplication.html.erb
ではbody部分をyield記述しているので、レイアウトを各ページに反映していると考えられる。
課題
テストのヘルパーの使い方がわからない。RSpecからだと呼べないのか、書く場所がよくないのか?
Rubyの勉強メモ
ruby関係の勉強を始めたので個人的なメモとか残していきます。チュートリアルに関してはこちらのサイトを参考にして進めていきます。
Gem
ライブラリの事。rubyではGemと呼ぶらしい。railsもgem。gemはグローバルに必要なもの以外はそれぞれのプロジェクトにインストールする。(railsもグローバルには入れるべきではないらしい)
bundler
gem管理ライブラリ。gemのバージョン毎の依存関係とかも見てくれるとのこと。bundlerもgem。
gemfile, gemfile.lock
bundlerが利用する設定ファイル。gemfileにはbundlerがインストールするgemとそのバージョン情報を記載する。gemfile.lockはそれに応じて自動生成される。
グローバルにrailsを含まないプロジェクトの作成
参考にさせていただいたのはこのサイト。上で紹介したチュートリアルはクラウドIDEを使っていたのですが、ローカル環境でチュートリアルを進めたかったため、サイト外の手法を利用しました。ちなみにrbenvまでのインストールは完了している前提です。
$ rbenv exec gem install bundler #ruby環境にbundlerのみをインストール $ rbenv rehash #$ rbenv exec gem listで現在有効なgem一覧を取得可能 $mkdir newproject #新しいプロジェクトを作る場所 $cd newproject $ cat << EOS > Gemfile #railsプロジェクトを生成する目的で一時的にrailsを入れる source "http://rubygems.org" gem "rails", "5.2.1" #最新バージョンを調べてください EOS $ bundle install --path vendor/bundle #railsを vender/bundle 以下にインストール $ bundle exec rails new sampleproject --skip-bundle #sampleprojectは自分のプロジェクト名をつけてあげる $ rm -f Gemfile #プロジェクトの生成が終わったので削除する $ rm -f Gemfile.lock $ rm -rf .bundle $ rm -rf vendor/bundle $ cd sampleproject $ bundle install --path vendor/bundle #プロジェクト内にgemを再インストール
プロジェクト生成に使用したgemは消してしまいますが、生成時にGemfile内に必要なgemの情報が書かれるため、それを利用してプロジェクト内にrailsを引っ張ってこれるようです。おそらく。
vendor/bundleディレクトリは、"容量が多い", "Gemfileによりgit clone先で同じ環境が作れる"との理由で、git管理から外してあげるのが良いそうです。
$ echo '/vendor/bundle' >> .gitignore
以下のコマンドを実行して、ブラウザでターミナルに表示された場所にアクセスできれば完了です。(httpです)これ以降、サーバを立ち上げる際はこのコマンドを使用してください。rails serverコマンドは使用できないです。
$ bundle exec rails server
なお、私が試した時railsの最新バージョンは5.2.1だったのに対して、チュートリアルでは5.1.6であった。5.1系から5.2系になる際にbootsnapというgemが追加されたそうです。これはrailsの起動を早くするものらしく、5.2でデフォルト採用されたとのこと。なので、5.2で上のようにプロジェクトを生成して5.1に戻すと、bootsnapがないよ!ってエラーが投げられます。大人しく初めからrails5.1.6を使用してプロジェクトを作り始めるか、ここのサイトを参考にgemに追加して実行すれば動く模様。
config/route.rb
railsのルーティングファイル。rootとつけたコントローラのアクションがindexページを生成する。
GithubとBitbucket
チュートリアルに登場してたのでメモ程度に。Bitbucketの利点は「共同作業者が一定数以下ならリポジトリを公開しなくても無料、共同作業者が一定数を超えると有料」なところ。Bithubは非公開リポジトリを作成するためには有料アカウントが必要なので、セキュリティ面でチュートリアルのプロジェクトでも非公開を推奨するらしい。
Herokuにデプロイ
ブランチ切って作業して、それをマージせずにmasterをherokuにpushしてしまい詰まりました。エラーは以下のようなものでした。
Specified 'sqlite3' for database adapter, but the gem is not loaded. Add `gem 'sqlite3'` to your Gemfile (and ensure its version is at the minimum required by ActiveRecord). (Gem::LoadError)
解決法はここのサイトの通り。config/database.ymlのproduction設定がsqlite3のままなので修正するのと、herokuにポスグレを導入してデータベースを作成し直すの2点。
$ heroku addons:create heroku-postgresql:hobby-dev $ heroku run rake db:migrate
herokuにpushする前にあらかじめconfig/database.ymlを変更しておけば、導入の手順は必要ないです。