chrome custom tabs の warmup

custom tabs を使う際は事前に chrome のプロセスを温めておくことで遷移を高速化出来るのだけど、自前で実装しようと思うと結構面倒くさい
先人の知恵を拝借しようと Github を検索すると下記の実装が見つかった

DreaminginCodeZH/CustomTabsHelper: Custom tabs, made easy.

saschpe/android-customtabs: Chrome CustomTabs for Android demystified. Simplifies development and provides higher level classes including fallback in case Chrome isn’t available on device.

CustomTabsHelper は Fragment を使う前提の実装で、今回自分は Fragment を使っていなかったので後者の android-customtabs を採用した
使い方は非常にシンプルで README と example の通りなので省略する

基本的な実装はどちらも同じ、というか下記公式の customtabs 使用例が元になっていて単にアプリ(Fragment)開始時に customtabs の service に接続し、停止時に切断している
GoogleChrome/custom-tabs-client: Chrome custom tabs examples

ちょっとしたことだけど非常に反応が良くなるので customtabs を使うならぜひ利用したい

jvisualvm でリモート接続

jdk をインストールすると付いてくる便利なプロファイラ jvisualvm でリモートサーバの java プロセスに接続する方法についての覚書

jvisualvm でリモート接続する方法は、
jstatd(これも jdk 組み込み)という java プロセスの監視ツールを経由する方法と JMX という仕様を利用する方法の2種類がある
今回はリモートサーバに jdk が入ってなかったので JMX でやる場合

JMX 起動オプション

リモートサーバで java アプリを起動する際に以下のオプションを指定しておく(以下は jdk8 の場合)
port は他で使われてなければ何でも良いが、同じ値を指定する
127.0.0.1 は環境に合わせて変える

-Dcom.sun.management.jmxremote.port=3333
-Dcom.sun.management.jmxremote.rmi.port=3333
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false
-Djava.rmi.server.hostname=127.0.0.1

今回接続する際は ssh のポートフォワーディングを利用した
ssh -L 3333:127.0.0.1:3333 [email protected]
などでリモートへの接続を開いておき jvisualvm から localhost:3333 に対して繋ぐ

Laravel で .env の内容が反映されない場合

公式マニュアルにも記載があるが、
Laravel アプリで artisan config:cache を行っていると .env を変更してもファイルの内容が反映されない
また、アプリ内で env ヘルパー関数などから直接環境変数を参照しているとそもそも値が渡っていない
下記実装を見ると分かるが、 config キャッシュ済みの場合はそもそも .env のロード自体がスキップされるため

framework/LoadEnvironmentVariables.php#L20 at bd352a0d2ca93775fce8ef02365b03fc4fb8cbb0 · laravel/framework

解決するには config を cache しない、又は env の値を config ファイルを経由して参照するよう徹底し値の変更ごとに cache し直す

vultr で ubuntu インストールして最初に行った設定

SSD VPS Servers, Cloud Servers and Cloud Hosting by Vultr - Vultr.com というサービスで ubuntu をインストールした時の記録

2.5ドルのは空きがなかったので5ドルのプランにした
とはいえ東京でメモリ1GBのマシンがこの値段なら十分安い
ちなみにこのリンクから登録してもらうとお互いにクレジットがもらえる(ある程度実際に課金する必要はある)

インストールしたのは ubuntu 16.04
web管理画面から作成を実行し、しばらくしてRUNNINGのステータスになるとアクセス可能になる
IPアドレスと root のパスワードも管理画面で確認可能

アカウント作成

最初は root しかいないので作業用アカウントを作成し sudo 出来るグループに追加しておく

adduser yusuke
passwd yusuke
gpasswd -a yusuke admin

作成したら ssh-copy-id などで公開鍵認証でのログインが出来るようにしておく
必ず鍵認証でアクセスが可能なことを確認しておくこと

root, パスワードでのログイン禁止設定

sudo vim /etc/ssh/sshd_config して PermitRootLogin, PasswordAuthentication を no にする
sudo service sshd restart する
この時点でパスワードログイン出来ないことを確認しておくこと

ファイアウォール設定

ubuntu では iptables を直接触らずに ufw というコマンドで設定していく
以下では ssh, http, https のみ許可している
参考:ufwを使って簡単にファイアウォールを設定する - Qiita

sudo ufw default deny
sudo ufw allow 22
sudo ufw allow 80
sudo ufw allow 443
sudo ufw enable
sudo ufw reload

aptitude のインストール

組み込みの apt-get でも十分だが、 aptitude の方が多少便利
具体的には関連パッケージの自動アンインストールをデフォルトでやってくれたりする
(autoremove を付ければ apt-get でも出来る)

sudo apt-get install aptitude

ついでに upgrade して再起動しておく

sudo aptitude upgrade
sudo reboot

怪しいログイン試行をブロック

denyhosts というサービスをインストールするとログインに失敗したホストを自動的に /etc/hosts.deny に追加してくれる
sudo aptitude install denyhosts
設定はDenyhosts導入メモ - まめ畑などを参考に
sudo service denyhosts restart で設定反映

タイムゾーンをJSTにする

デフォルトはUTCなので日本時間に変更する

sudo timedatectl set-timezone Asia/Tokyo

時刻同期の設定もしておく

sudo aptitude install ntp
sudo vim /etc/ntp.conf

末尾の方にある server に適当な国内 ntp サーバを設定する
server ntp.nict.jp など
sudo service ntp restart で反映

Laravel の Input 値が空文字列だったら null に変換する機能を無効にする

Model のフィールドに空文字列を渡しているつもりが mysql 側から NonNull なカラムに Null が渡されたとエラーが返ってきてこの機能の存在に気づいた
middleware は非常に便利だが、自分が実装・追加したわけではない処理に関してはこのような暗黙的な副作用があったりして中々厳しい

HTTP Requests - Laravel - The PHP Framework For Web Artisans
ドキュメントにも書かれており、どうやら 5.4 からこの挙動がデフォルトになったようだ
無効にするには App\Http\Kernel クラスにある ConvertEmptyStringsToNull middleware をコメントアウトすれば良い