Switch ソフトのDL版は量販店で買おう

先日運良く amazon で Switch を定価購入することが出来た

早速ゼノブレイド2のDL版をニンテンドーeショップで購入(もちろん定価)した
…のだが、よくよく調べると量販店の方がお得な値段でDL版を提供していることに気付いた
Sony PS4 のDL版は PlayStation Store でしか提供されておらず、
定価で買うのが習慣化していたので完全に油断していたorz

例えばゼノブレイド2は定価だと税込み8618円だが、 amazon ではご覧の通り
自分が確認した時は約1割の値引きがされていた(実際の値段はamazonで確認して欲しい)

ヨドバシも10%のポイント還元が受けられるので、ほぼ同額だ
さらに amazon の場合は下記のような複数本同梱でのディスカウントもしていて、強い

知ってる人にとっては当たり前のことなのだけど、戒めとして記しておく
次からは絶対にニンテンドーeショップ以外で買おうと心に誓った。。。

osx 版 Synergy2 がスリープ復帰後に再接続してくれない

Synergy2 になってから表題の現象が起こっているのに気づいた
ver は 2.0.1, 2.0.2 で確認している

osx 版は一度起動すると以降 Synergy.app を実行しても何も表示されないのがそもそもバグっぽいのだけど、
とりあえずプロセスを kill すると勝手に再起動してくれて繋がったのでスリープ解除後に下記コマンドを自動で実行するようにした

killall synergy-service

自動実行には sleepwatcher を使った
homebrew の場合以下のようにインストール出来る

brew install sleepwatcher
brew tap homebrew/services
brew services start sleepwatcher

インストール後、 ~/.sleep~/.wakeup というシェルスクリプトを作成して置いておくとそれぞれスリープ時と解除時に自動で実行してくれる

PageSpeed Insights スコア向上のためにやったこと

PageSpeed Insights

www.yusukezzz.net のスコアはPC版で90、モバイル向けで87となっている
github.io に置いてるサイトなので出来ることはあまり多くないのだけど、元は70点台ぐらいだったのでここまで上げるためにやったこと2点をまとめておく

CSS, JS の縮小

いわゆる minify と言われているやつ
wordpress だと plugin で出来たりするが、この blog では cloudflare の機能を利用している

Speed タブの Auto Minify から有効化出来る
CSS, JS, HTMLの3種類が選べるが、この blog だとHTMLの minify は不具合があったので CSS, JS だけ使用している

レンダリングをブロックしているコンテンツの排除

同期的に読み込まれる CSS, JS はページのレンダリングを遅くするため、非同期的に読み込むとスコアが向上する
読み込むだけで効果のある単純な JS であれば async または defer 属性を付けるだけでなんとかなる(※)が、
読み込んでから初期化処理を呼び出す必要がある場合は読み込み完了に hook して実行する必要がある
この blog では highlightjs が該当し、ページ末尾で以下のような script を実行している

※document.write しちゃってるような行儀の悪い script や読み込み順に依存関係があるものを除く

<script>
  function loadCss(url) {
    var l = document.createElement('link'); l.rel = 'stylesheet'; l.href = url;
    var h = document.getElementsByTagName('head')[0]; h.parentNode.insertBefore(l, h);
  }
  function loadJs(url, cb) {
    var d = document, t = 'script',
        o = d.createElement(t),
        s = d.getElementsByTagName(t)[0];
    o.async = true;
    o.src = url;
    if (cb) { o.addEventListener('load', function (e) { cb(null, e); }, false); }
    s.parentNode.insertBefore(o, s);
  }
  var cb = function() {
    loadCss('https://www.yusukezzz.net/wp-content/highlightjs/solarized-light.css');
    loadJs('https://www.yusukezzz.net/wp-content/highlightjs/highlight.pack.js', function() {
      hljs.initHighlightingOnLoad();
    });
  };
  var raf = requestAnimationFrame || mozRequestAnimationFrame ||
      webkitRequestAnimationFrame || msRequestAnimationFrame;
  if (raf) raf(cb);
  else window.addEventListener('load', cb);
</script>

もっとも、小規模なものであれば外部ファイル化せずに直接 head タグ内に書いたほうが良い(インライン展開)

Kotlin の Parcelize で簡単 Parcelable 実装

Kotlin 1.1.4 から Parcelable を手軽に実装できるようにする機能が追加された

KEEP/android-parcelable.md at master · Kotlin/KEEP

まだステータスは正式版ではないので gradle で

androidExtensions {
    experimental = true
}

を有効化し、

@Parcelize
class MyParcelable(val data: Int): Parcelable

このように書いておくとコンパイル時に自動的に Parcelable 相当の実装を生成してくれる
data クラスにも使用出来るので json のパース結果などを Activity 間で受け渡すのが非常に簡単になる

これまでは grandstaish/paperparcel を使っていたが CREATOR フィールドを用意する必要がないのでより手軽だ

※注意
CRETOR フィールドを用意する必要はないが、@Parcelize アノテーションを付与したクラスはIDE上で
this class implements parcelable but does not provide a CREATOR field
というエラー扱いになる(でもコンパイルは通る)
下記チケットが起票されているので、直に修正される…と思いたい
[AS3.0] Android extensions, Parcelable: editor shows warning about incomplete implementation on a class with Parcelize annotation : KT-19300

Android Studio 3.0 で Robolectric 関連の変更に追従

先日 Android Studio 3.0 が正式にリリースされたので早速ダウンロードしてビルドしたら Robolectric のテストがコケるようになってしまった
Getting Started | Robolectric に書いてある通りなのだけど以下の対応をしたら通るようになった
どうやらリソースパスを解決するAPIに変更があったらしい

1. testOptions の追加

app/build.gradle に以下の記述を追加する

android {
  testOptions {
    unitTests {
      includeAndroidResources = true
    }
  }
}

2. BuildConfig の指定を止める

テストクラスに Robolectric の BuildConfig 指定がある場合は消す
@Config(constants = BuildConfig.class)