作成者別アーカイブ: beryu

写真を(また)はじめました

D3100年末年始に帰省した際、父からD3100(上写真)を思いがけず貰ってしまったので、また写真を始めようと思います。

140104_2もともと、学生時代に自分でD50(左写真)を買ってブログにちょくちょく写真を掲載していたのですが、5〜6年前に社会人になって以降はほとんど触らない日々が続いていたのでした。
ここのところ無趣味な生活が続いていたし、良いキッカケも出来たのでまたカメラを触ろうかと。

140104_3さっそく帰省帰りにおしゃれなハンバーガー屋に寄ってゆず茶を撮ってみました。
Photoshopで自分好みの色に多少調整してますが、やっぱりこのボケ味と色は一眼レフならではですね。
iPhoneで撮った写真も綺麗で好きですが、一眼で撮る写真の雰囲気も良い。

BTOしたMacBook Airがポイント5%付きで買えた話

130712_1
3年前からメイン機として使っていたMBPがヘタって来たので、MacBook Air(13inch, Mid2013)を買いました。
買う時の希望は「BTOしたい(=CPUやメモリを増設したい)」「出来れば安く買いたい」の2つくらい。

BTOできてポイントも付く店舗がある

ソフマップ系列のMacCollectionという店舗では、BTOを受け付けてくれました。
しかもソフマップカードのポイント5%が付きます。
ビックカメラ等の家電量販店でも店舗の在庫分を購入すればポイントが付くみたいなんですが、BTOを依頼するとポイントが0%(=ポイント無し)になってしまうのです。
ノートPCを買うとき一緒にPCケースも買ったりするはずなので、ポイントがあると便利なんですよね。

人気のある構成でカスタマイズされたMacBook Airの在庫がある場合も

上記したMacCollectionでは、CPU交換、HDD増設、USキーボード交換などが予め完了している端末の在庫もいくつかありました。
ただ、私の希望構成(下記)は在庫が無かったので発注してもらって入荷を待つことに。

私の希望構成

  • HDD:256GB
  • メモリ:8GB
  • CPU: Core i7 1.7GHz
  • キーボード:JISキーボード

手元に届くまで2週間くらいかかった

ここはデメリットですが、注文した日から2週間前後待ちました。
[Apple]→[MacCollection店舗]→[私の自宅]という経路で配送されたので、店舗を経由する分余計に時間がかかってます。
僕の場合は手持ちのMacBook Proが一応まだ動くので急ぐ必要もなく、そんなに困りませんでしたが。
店舗に届いた時点で連絡をもらって取りに行くことも出来るみたいです。

(ちなみに)5%ポイントで私が買ったもの

他にもケース買ったりしたんですが、とにかくパワーサポートの液晶フィルムがとても良い買い物でした。
精度が良いので上下左右ほとんど隙間が出来ず、テカテカだったグレア液晶がまるで元々ノングレア液晶だったかのように見えるくらい自然な仕上がりになりました。
室内で照明の反射が邪魔だったり、外出先で太陽の反射が激しくて見難かったりした問題がこれでだいぶ解消するはず。

待つ時間があってポイントが欲しい方には良いかも

BTOしたい方でもポイントが要らなければオンラインのAppleStoreで十分なんですが、
一緒に周辺機器を揃えたい、なんて方は上記した買い方が良いかも。というお話でした!

SoundCloudはどうやってタブ間で同期を取っているか

僕の好きな音楽共有サイトの一つに「SoundCloud」というサービスがあります。
日本人もたくさん投稿していて、カッコイイEDMもかなり投稿されてるので、作業用BGMによく利用させてもらっています。
そのSoundCloudでどうやって実装されてるのか興味深い箇所があったので、調べる過程も含めて共有します。

複数タブ(又はウィンドウ)で情報を同期してくれる機能が便利で不思議

20130312
SoundCloudを複数ページ開いた状態で、片方のタブで再生中に別タブの再生ボタン(上の画像で黒で囲んである左側のボタン)を押すと、もう片方の再生が止まるんですよね。
また、ボリュームコントロール(上の画像で黒で囲んである右側のボタン)も、片方のタブで調整するともう片方のタブに自動的に反映されます。
YouTubeでタブ毎に音量調整する癖がついてたので、「おおっ」と少し感動してしまいましたw

どうやって実装してる?

JavaScriptで他のタブに直接アクセスする事は出来ないはず。
じゃあサーバを介して情報をやりとりしてるのかな?と思ってChrome devtoolsで通信を監視してみました。

20130312_2
通信してない…!
ボリュームコントロールをいじってみた所、通信が発生していないのに別タブで再生中の楽曲の音量が変わりました。
つまり、クライアント側の処理だけでタブ間同期を実現しているということ。

クライアントでタブ間で共通して使えるリソースといえば…

CookieかlocalStorageを使っている可能性が高い。
→どちらかを使っていれば、ボリュームを変更した時にそのどちらかの値が書き換わっているはず!

ということで、またdevtoolsで以下のjavascriptを実行してみました。

cookieの値が変化しているか確認

  1. ボリュームを変更する操作をする前に以下を実行。
    console.log(document.cookie);
  2. 実行結果をコピーして、SoundCloudの画面上のボリュームを変更。
  3. 以下を実行。
    console.log(document.cookie === '__qca=...'); // 右項は上記1.の実行結果の文字列のコピペ
  4. trueと表示されたらCookieの値が変更されていない。falseなら変更されてる。

実行結果

true
ふむ。Cookieはこの機能に利用されていない様子。

localStorageの値が変化しているか確認

  1. ボリュームを変更する操作をする前に以下を実行。(localStorageはオブジェクトなので、テキスト化するためにちょっと余計な事してます)
    console.log(escape(JSON.stringify(localStorage)));
  2. 実行結果をコピーして、SoundCloudの画面上のボリュームを変更。
  3. 以下を実行。
    console.log(escape(JSON.stringify(localStorage)) === '%7B%22V2%3A%3Alocal...'); // 右項は上記1.の実行結果の文字列のコピペ
  4. trueと表示されたらlocalStorageの値が変更されていない。falseなら変更されてる。

実行結果

false
きた!!!変更されてるのでタブ間同期にlocalStorageが利用されている可能性が高い。
localStorageの内容を見ると「V2::local::volume-settings: “{“volume”:0.5}”」というフィールドがあったので、この値を各タブで共有して音量情報を同期してるっぽいです。

どうやってlocalStorageの変更を監視しているか?

localStorageの変更時に’storage’イベントが発火するようなので、多分それを利用してるんじゃないかと(ソースは読んでない)。
このイベント、localStorageを変更したウィンドウ以外のウィンドウでも発火するんですね。意外。

W3Cの仕様書の「4.4 The storage event」の章に以下の記述があるので、これがタブ間の同期に利用されている仕様なんでしょうかね。。(英語得意じゃないのであんまり自信ないです)

When this happens, the user agent must queue a task to fire an event with the name storage, which does not bubble and is not cancelable, and which uses the StorageEvent interface, at each Window object whose Document object has a Storage object that is affected.

まとめ

  • SoundCloudの複数ウィンドウ間の同期にはlocalStorageのstorageイベントが使われてるっぽい。
  • 異なるウィンドウ同士の同期にlocalStorageが使える、ということだけでも覚えておくと役に立つかも。