<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>yusukezzz weblog</title>
	<atom:link href="https://www.yusukezzz.net/feed" rel="self" type="application/rss+xml" />
	<link>https://www.yusukezzz.net/</link>
	<description></description>
	<lastBuildDate>Sat, 28 Jul 2018 23:52:23 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.7.11</generator>
	<item>
		<title>mac で homebrew から入れた mysql 8.0 を 5.7 に落とす</title>
		<link>https://www.yusukezzz.net/archives/143</link>
		<pubDate>Sat, 28 Jul 2018 23:49:16 +0000</pubDate>
		<dc:creator><![CDATA[yusukezzz]]></dc:creator>
				<category><![CDATA[uncategorized]]></category>
		<category><![CDATA[homebrew]]></category>
		<category><![CDATA[mac]]></category>
		<category><![CDATA[mysql]]></category>

		<guid isPermaLink="false">https://www.yusukezzz.net/?p=143</guid>
		<description><![CDATA[ダウングレードとは言ってない 公式ドキュメントにもダウングレードがサポートされてないことははっきり書いてありま [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>ダウングレードとは言ってない<br />
公式ドキュメントにもダウングレードがサポートされてないことははっきり書いてあります<br />
<a href="https://dev.mysql.com/doc/refman/8.0/en/downgrading.html">MySQL :: MySQL 8&#46;0 Reference Manual :: 2&#46;10&#46;2 Downgrading MySQL</a></p>
<p>production では必ず8.0に上げる前にバックアップを取っておきましょう</p>
<p>今回、 Homebrew で入れてたやつをうっかりアップグレードしてしまって焦りました<br />
最終的に data ディレクトリを初期化する羽目になりました。。。（一応データは救出出来ました）<br />
以下流れです</p>
<h3>うっかり 8.0 にしてしまう</h3>
<p>brew upgrade でよく見ずに更新してしまい、いつの間にか起動できなくなっているのに気付きました<br />
その時はこのようなエラーが出ていました</p>
<pre><code class="bash">2018-07-28T19:27:30.524132Z 1 [ERROR] [MY-010781] [Server] Found ./mysql/index_stats.frm file in mysql schema. DD will
create .ibd file with same name. Please rename table and start upgrade process again.
2018-07-28T19:27:30.524175Z 1 [ERROR] [MY-010336] [Server] Found .frm file with same name as one of the Dictionary Tab
les.
2018-07-28T19:27:30.524338Z 0 [ERROR] [MY-010020] [Server] Data Dictionary initialization failed.
2018-07-28T19:27:30.524359Z 0 [ERROR] [MY-010119] [Server] Aborting
</code></pre>
<h3>5.7 を入れ直す</h3>
<p>他にも色々変わってそうだし 8.0 を使い続けるのは厳しそうだったので元に戻す方向で頑張ることにしました<br />
実行したコマンドは以下の通り（8.0を消して5.7を入れ直してます）</p>
<pre><code class="bash">brew sevices stop mysql
brew uninstall mysql
brew install mysql@5.7
brew services start mysql@5.7
</code></pre>
<h3>しかし5.7が起動しない</h3>
<p>素直には起動してくれず、以下のようなログが吐かれていました</p>
<pre><code class="bash">2018-07-28T22:01:56.921910Z 0 [ERROR] InnoDB: Unsupported redo log format. The redo log was created with MySQL 8.0.11. Please follow the instructions at http://dev.mysql.com/doc/refman/5.7/en/upgrading-downgrading.html
2018-07-28T22:01:56.921954Z 0 [ERROR] InnoDB: Plugin initialization aborted with error Generic error
2018-07-28T22:01:57.428053Z 0 [ERROR] Plugin 'InnoDB' init function returned error.
2018-07-28T22:01:57.428134Z 0 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
2018-07-28T22:01:57.428180Z 0 [ERROR] Failed to initialize builtin plugins.
2018-07-28T22:01:57.428202Z 0 [ERROR] Aborting
</code></pre>
<p>どうやら中途半端に 8.0 向けになったファイルが悪さをしていそう？<br />
ひとまず起動させて dump だけしたかったので redo log が書かれている ib_logfile を移動させてみます</p>
<pre><code class="bash">brew services stop mysql@5.7
mkdir ~/backup
cd /usr/local/var/mysql
mv ib_logfile* ~/backup
brew services start myswl@5.7
</code></pre>
<p>自分の場合はこれで起動しました！<br />
しかし err ログを見てると不穏な出力がありました</p>
<pre><code class="bash">2018-07-28T22:09:52.237832Z 0 [Warning] InnoDB: Table mysql/innodb_index_stats has length mismatch in the column name
table_name.  Please run mysql_upgrade
</code></pre>
<p><code>innodb_index_stats</code> は <code>mysql</code> DB にある統計用テーブルとのことで、致命的な問題ではなさそうです（起動してますし）<br />
一応動いているのでこのまま dump してしまいます</p>
<p><code>mysqldump -u root --databases db1 db2... &gt; ~/all.sql</code></p>
<h3>復旧</h3>
<p>これで必要なデータは吸い出せたので、データディレクトリを初期化して dump したデータを入れ直します</p>
<pre><code class="bash">brew services stop mysql@5.7
cd /usr/local/var
mv mysql mysql_old
mkdir mysql
mysqld --initialize-insecure
brew services start mysql@5.7
mysql -u root &lt; ~/all.sql
</code></pre>
<p>このブログのデータも無事元通りになりました</p>
]]></content:encoded>
			</item>
		<item>
		<title>PS4 に外付けSSDを導入</title>
		<link>https://www.yusukezzz.net/archives/138</link>
		<pubDate>Tue, 13 Mar 2018 17:04:19 +0000</pubDate>
		<dc:creator><![CDATA[yusukezzz]]></dc:creator>
				<category><![CDATA[uncategorized]]></category>
		<category><![CDATA[game]]></category>
		<category><![CDATA[ps4]]></category>

		<guid isPermaLink="false">https://www.yusukezzz.net/?p=138</guid>
		<description><![CDATA[もうMHWは100時間以上プレイしているのですが、今更ながらSSDを導入してみました 起動時間やクエスト出発時 [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>もうMHWは100時間以上プレイしているのですが、今更ながらSSDを導入してみました<br />
起動時間やクエスト出発時のロードが本当に短くなるのでおすすめです</p>
<p>今回はPS4がSATA2までしか対応してないのと、<br />
システムソフトウェアの再インストールが面倒そうだったので外付けにしました<br />
PS4ProならSATA3なので内蔵化した方がいいです</p>
<p>購入したSSDは売れ筋の<a href="http://amzn.to/2FCrFAB">Crucial SSD 500GB MX500</a>です<br />
250GB以上であればなんでも良いですが、SATA3のものにしておきましょう</p>
<p>外付けケースはSATA3かつUSB3.0以上のものを選んでおけばとりあえず問題ないと思われますが、<br />
メーカーホームページを参照するなどして最大転送速度の説明はよく読みましょう<br />
予算に余裕がある場合は、今後を考えるとUSB3.1 Gen2又はSuperSpeed+という10Gbpsの規格に対応した製品が良いかもしれません<br />
自分はセンチュリーの<a href="http://amzn.to/2FynxWr">CSS25U31BK</a>にしました<br />
本当は玄人志向の<a href="http://amzn.to/2FGTWpI">GW2.5FST-SU3.1</a>が欲しかったのですが、秋葉原の店頭でも売り切れていました。。。</p>
<p>2.5インチストレージには7.5mmと9mmの2種類があり、ケースも対応している厚さが違うので組み合わせに注意しましょう<br />
上記は7.5mm同士の組み合わせになります</p>
<p>ケースにSSDをセットしてケーブルでPS4に繋ぐと自動的に認識されフォーマットを促されます<br />
フォーマット完了後は新規ソフトのインストール先が外付けストレージになり、<br />
設定メニュー＞ストレージから内蔵の方にあるソフトを移動させたり出来るようになります</p>
]]></content:encoded>
			</item>
		<item>
		<title>スマホが突然壊れた時にやったこと</title>
		<link>https://www.yusukezzz.net/archives/133</link>
		<pubDate>Sat, 24 Feb 2018 07:31:19 +0000</pubDate>
		<dc:creator><![CDATA[yusukezzz]]></dc:creator>
				<category><![CDATA[uncategorized]]></category>
		<category><![CDATA[android]]></category>

		<guid isPermaLink="false">https://www.yusukezzz.net/?p=133</guid>
		<description><![CDATA[先日、普通に操作中に Nexus5X がシャットダウンしてしまいました ファクトリリセットなどを試してもブート [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>先日、普通に操作中に Nexus5X がシャットダウンしてしまいました<br />
ファクトリリセットなどを試してもブートアニメーションを突破出来ず、<br />
故障と判断して諦めてスマホを新調することになったのでその時大変だったことをまとめておきます</p>
<h3>一応再起動出来るかの検証</h3>
<p>cache, data パーティションの初期化、電源ボタン連打、端末を冷やしてから再起動などググって出て来る方法は一通り試しましたがダメでした<br />
bootloader はアンロックしていなかったのでファクトリイメージの再書き込みで回復出来たのかは未検証です</p>
<h3>SIMカードの入れ替え</h3>
<p>悲しいことに N5X 付属のピンを紛失しており途方に暮れました<br />
代わりになりそうなものがなかったので仕方なく爪楊枝をカッターで加工して頑張って取り出しました。。。<br />
N5X のSIMスロットの穴は iPhone などと比べて小さく、安全ピンなどの代用品でも太さ次第では使えないので注意が必要です<br />
新しい端末の Xperia XZ1 compact は防水のためかSIMスロットがキャップ式で、トレーも指で簡単に引き出せて感動しました</p>
<h3>各種アカウントの復旧</h3>
<p>新しい端末に Google アカウントをセットアップする際に、旧端末の2段階認証アプリが使えなかったため詰みかけました<br />
結局PCブラウザでログインしっぱなしだったため、パスワード入力でリカバリコード画面にアクセス出来て助かりました<br />
Slack もアプリで認証していたのですが、たまたまPC版クライアントがログイン状態であればなんとかなる仕様だったため助かりました</p>
<p>このような場合、リカバリコードを保存したり代替のアクセス手段を用意しておかないとサービス次第で詰みます<br />
またコードの保存先も検討が必要で、例えば dropbox に置いても dropbox 自体がアプリでの2段階認証になってると詰みます<br />
自分は最近2段階認証を有効化したものはアプリに登録するのが面倒でSMS認証になっていたため助かりました（dropboxもその一つ）<br />
とはいえ端末の物理的紛失・盗難を考慮するとリカバリコードを紙に印刷しておくのが一番無難ということになるかもしれません…</p>
]]></content:encoded>
			</item>
		<item>
		<title>Switch ソフトのDL版は量販店で買おう</title>
		<link>https://www.yusukezzz.net/archives/125</link>
		<pubDate>Fri, 08 Dec 2017 17:44:20 +0000</pubDate>
		<dc:creator><![CDATA[yusukezzz]]></dc:creator>
				<category><![CDATA[uncategorized]]></category>
		<category><![CDATA[game]]></category>
		<category><![CDATA[switch]]></category>

		<guid isPermaLink="false">http://blog.dev/?p=125</guid>
		<description><![CDATA[先日運良く amazon で Switch を定価購入することが出来た 早速ゼノブレイド2のDL版をニンテンド [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>先日運良く amazon で Switch を定価購入することが出来た</p>
<p>早速ゼノブレイド2のDL版をニンテンドーeショップで購入（もちろん定価）した<br />
…のだが、よくよく調べると量販店の方がお得な値段でDL版を提供していることに気付いた<br />
Sony PS4 のDL版は PlayStation Store でしか提供されておらず、<br />
定価で買うのが習慣化していたので完全に油断していたorz</p>
<p>例えばゼノブレイド2は定価だと税込み8618円だが、 amazon ではご覧の通り<br />
自分が確認した時は約1割の値引きがされていた（実際の値段はamazonで確認して欲しい）</p>
<p><iframe style="width:120px;height:240px;" marginwidth="0" marginheight="0" scrolling="no" frameborder="0" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&#038;bc1=FFFFFF&#038;IS2=1&#038;bg1=FFFFFF&#038;fc1=000000&#038;lc1=0000FF&#038;t=yskzzz-22&#038;o=9&#038;p=8&#038;l=as4&#038;m=amazon&#038;f=ifr&#038;ref=as_ss_li_til&#038;asins=B075KGQZVJ&#038;linkId=87ff5ca4d690defa0f705816e6148557"></iframe></p>
<p>ヨドバシも10%のポイント還元が受けられるので、ほぼ同額だ<br />
さらに amazon の場合は下記のような複数本同梱でのディスカウントもしていて、強い</p>
<p><iframe style="width:120px;height:240px;" marginwidth="0" marginheight="0" scrolling="no" frameborder="0" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&#038;bc1=FFFFFF&#038;IS2=1&#038;bg1=FFFFFF&#038;fc1=000000&#038;lc1=0000FF&#038;t=yskzzz-22&#038;o=9&#038;p=8&#038;l=as4&#038;m=amazon&#038;f=ifr&#038;ref=as_ss_li_til&#038;asins=B077XSPWRS&#038;linkId=fcfcb30dd538b203a5e8d3a315d52d3c"></iframe></p>
<p>知ってる人にとっては当たり前のことなのだけど、戒めとして記しておく<br />
次からは絶対にニンテンドーeショップ以外で買おうと心に誓った。。。</p>
]]></content:encoded>
			</item>
		<item>
		<title>osx 版 Synergy2 がスリープ復帰後に再接続してくれない</title>
		<link>https://www.yusukezzz.net/archives/120</link>
		<pubDate>Wed, 29 Nov 2017 16:56:59 +0000</pubDate>
		<dc:creator><![CDATA[yusukezzz]]></dc:creator>
				<category><![CDATA[uncategorized]]></category>
		<category><![CDATA[osx]]></category>
		<category><![CDATA[synergy]]></category>

		<guid isPermaLink="false">http://blog.dev/?p=120</guid>
		<description><![CDATA[Synergy2 になってから表題の現象が起こっているのに気づいた ver は 2.0.1, 2.0.2 で確 [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Synergy2 になってから表題の現象が起こっているのに気づいた<br />
ver は 2.0.1, 2.0.2 で確認している</p>
<p>osx 版は一度起動すると以降 Synergy.app を実行しても何も表示されないのがそもそもバグっぽいのだけど、<br />
とりあえずプロセスを kill すると勝手に再起動してくれて繋がったのでスリープ解除後に下記コマンドを自動で実行するようにした</p>
<p><code>killall synergy-service</code></p>
<p>自動実行には sleepwatcher を使った<br />
homebrew の場合以下のようにインストール出来る</p>
<pre><code class="bash">brew install sleepwatcher
brew tap homebrew/services
brew services start sleepwatcher
</code></pre>
<p>インストール後、 <code>~/.sleep</code> と <code>~/.wakeup</code> というシェルスクリプトを作成して置いておくとそれぞれスリープ時と解除時に自動で実行してくれる</p>
]]></content:encoded>
			</item>
		<item>
		<title>PageSpeed Insights スコア向上のためにやったこと</title>
		<link>https://www.yusukezzz.net/archives/109</link>
		<pubDate>Sat, 25 Nov 2017 13:51:32 +0000</pubDate>
		<dc:creator><![CDATA[yusukezzz]]></dc:creator>
				<category><![CDATA[uncategorized]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[js]]></category>

		<guid isPermaLink="false">http://blog.dev/?p=109</guid>
		<description><![CDATA[PageSpeed Insights www.yusukezzz.net のスコアはPC版で90、モバイル向け [&#8230;]]]></description>
				<content:encoded><![CDATA[<p><a href="https://developers.google.com/speed/pagespeed/insights/">PageSpeed Insights</a></p>
<p>www.yusukezzz.net のスコアはPC版で90、モバイル向けで87となっている<br />
github.io に置いてるサイトなので出来ることはあまり多くないのだけど、元は70点台ぐらいだったのでここまで上げるためにやったこと2点をまとめておく</p>
<h3>CSS, JS の縮小</h3>
<p>いわゆる minify と言われているやつ<br />
wordpress だと plugin で出来たりするが、この blog では cloudflare の機能を利用している<br />
<img src="http://blog.dev/wp-content/uploads/2017/11/cloudflare-speed-autominify-300x148.png" alt="" width="300" height="148" class="alignnone size-medium wp-image-115" srcset="https://www.yusukezzz.net/wp-content/uploads/2017/11/cloudflare-speed-autominify-300x148.png 300w, https://www.yusukezzz.net/wp-content/uploads/2017/11/cloudflare-speed-autominify-768x379.png 768w, https://www.yusukezzz.net/wp-content/uploads/2017/11/cloudflare-speed-autominify-1024x506.png 1024w" sizes="(max-width: 300px) 100vw, 300px" /><br />
Speed タブの Auto Minify から有効化出来る<br />
CSS, JS, HTMLの3種類が選べるが、この blog だとHTMLの minify は不具合があったので CSS, JS だけ使用している</p>
<h3>レンダリングをブロックしているコンテンツの排除</h3>
<p>同期的に読み込まれる CSS, JS はページのレンダリングを遅くするため、非同期的に読み込むとスコアが向上する<br />
読み込むだけで効果のある単純な JS であれば async または defer 属性を付けるだけでなんとかなる(※)が、<br />
読み込んでから初期化処理を呼び出す必要がある場合は読み込み完了に hook して実行する必要がある<br />
この blog では highlightjs が該当し、ページ末尾で以下のような script を実行している</p>
<p>※document.write しちゃってるような行儀の悪い script や読み込み順に依存関係があるものを除く</p>
<pre><code class="javascript">&lt;script&gt;
  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);
&lt;/script&gt;
</code></pre>
<p>もっとも、小規模なものであれば外部ファイル化せずに直接 head タグ内に書いたほうが良い（インライン展開）</p>
]]></content:encoded>
			</item>
		<item>
		<title>Kotlin の Parcelize で簡単 Parcelable 実装</title>
		<link>https://www.yusukezzz.net/archives/99</link>
		<pubDate>Wed, 22 Nov 2017 15:26:42 +0000</pubDate>
		<dc:creator><![CDATA[yusukezzz]]></dc:creator>
				<category><![CDATA[uncategorized]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[kotlin]]></category>
		<category><![CDATA[parcelable]]></category>

		<guid isPermaLink="false">http://blog.dev/?p=99</guid>
		<description><![CDATA[Kotlin 1.1.4 から Parcelable を手軽に実装できるようにする機能が追加された KEEP/ [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Kotlin 1.1.4 から Parcelable を手軽に実装できるようにする機能が追加された</p>
<p><a href="https://github.com/Kotlin/KEEP/blob/master/proposals/extensions/android-parcelable.md">KEEP/android&#45;parcelable&#46;md at master · Kotlin/KEEP</a></p>
<p>まだステータスは正式版ではないので gradle で</p>
<pre><code class="gradle">androidExtensions {
    experimental = true
}
</code></pre>
<p>を有効化し、</p>
<pre><code class="kotlin">@Parcelize
class MyParcelable(val data: Int): Parcelable
</code></pre>
<p>このように書いておくとコンパイル時に自動的に Parcelable 相当の実装を生成してくれる<br />
data クラスにも使用出来るので json のパース結果などを Activity 間で受け渡すのが非常に簡単になる</p>
<p>これまでは <a href="https://github.com/grandstaish/paperparcel">grandstaish/paperparcel</a> を使っていたが <code>CREATOR</code> フィールドを用意する必要がないのでより手軽だ</p>
<p>※注意<br />
CRETOR フィールドを用意する必要はないが、@Parcelize アノテーションを付与したクラスはIDE上で<br />
<code>this class implements parcelable but does not provide a CREATOR field</code><br />
というエラー扱いになる（でもコンパイルは通る）<br />
下記チケットが起票されているので、直に修正される…と思いたい<br />
<a href="https://youtrack.jetbrains.com/issue/KT-19300">&#91;AS3&#46;0&#93; Android extensions, Parcelable: editor shows warning about incomplete implementation on a class with Parcelize annotation : KT&#45;19300</a></p>
]]></content:encoded>
			</item>
		<item>
		<title>Android Studio 3.0 で Robolectric 関連の変更に追従</title>
		<link>https://www.yusukezzz.net/archives/97</link>
		<pubDate>Fri, 27 Oct 2017 04:58:14 +0000</pubDate>
		<dc:creator><![CDATA[yusukezzz]]></dc:creator>
				<category><![CDATA[uncategorized]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[robolectric]]></category>

		<guid isPermaLink="false">http://blog.dev/?p=97</guid>
		<description><![CDATA[先日 Android Studio 3.0 が正式にリリースされたので早速ダウンロードしてビルドしたら Rob [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>先日 Android Studio 3.0 が正式にリリースされたので早速ダウンロードしてビルドしたら Robolectric のテストがコケるようになってしまった<br />
<a href="http://robolectric.org/getting-started/">Getting Started &#124; Robolectric</a> に書いてある通りなのだけど以下の対応をしたら通るようになった<br />
どうやらリソースパスを解決するAPIに変更があったらしい</p>
<h3>1. testOptions の追加</h3>
<p>app/build.gradle に以下の記述を追加する</p>
<pre><code class="gradle">android {
  testOptions {
    unitTests {
      includeAndroidResources = true
    }
  }
}
</code></pre>
<h3>2. BuildConfig の指定を止める</h3>
<p>テストクラスに Robolectric の BuildConfig 指定がある場合は消す<br />
<code>@Config(constants = BuildConfig.class)</code></p>
]]></content:encoded>
			</item>
		<item>
		<title>chrome custom tabs の warmup</title>
		<link>https://www.yusukezzz.net/archives/92</link>
		<pubDate>Tue, 17 Oct 2017 17:28:08 +0000</pubDate>
		<dc:creator><![CDATA[yusukezzz]]></dc:creator>
				<category><![CDATA[uncategorized]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[library]]></category>

		<guid isPermaLink="false">http://blog.dev/?p=92</guid>
		<description><![CDATA[custom tabs を使う際は事前に chrome のプロセスを温めておくことで遷移を高速化出来るのだけど [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>custom tabs を使う際は事前に chrome のプロセスを温めておくことで遷移を高速化出来るのだけど、自前で実装しようと思うと結構面倒くさい<br />
先人の知恵を拝借しようと Github を検索すると下記の実装が見つかった</p>
<p><a href="https://github.com/DreaminginCodeZH/CustomTabsHelper">DreaminginCodeZH/CustomTabsHelper: Custom tabs, made easy&#46;</a></p>
<p><a href="https://github.com/saschpe/android-customtabs">saschpe/android&#45;customtabs: Chrome CustomTabs for Android demystified&#46; Simplifies development and provides higher level classes including fallback in case Chrome isn&#8217;t available on device&#46;</a></p>
<p>CustomTabsHelper は Fragment を使う前提の実装で、今回自分は Fragment を使っていなかったので後者の android-customtabs を採用した<br />
使い方は非常にシンプルで README と example の通りなので省略する</p>
<p>基本的な実装はどちらも同じ、というか下記公式の customtabs 使用例が元になっていて単にアプリ（Fragment）開始時に customtabs の service に接続し、停止時に切断している<br />
<a href="https://github.com/GoogleChrome/custom-tabs-client">GoogleChrome/custom&#45;tabs&#45;client: Chrome custom tabs examples</a></p>
<p>ちょっとしたことだけど非常に反応が良くなるので customtabs を使うならぜひ利用したい</p>
]]></content:encoded>
			</item>
		<item>
		<title>jvisualvm でリモート接続</title>
		<link>https://www.yusukezzz.net/archives/90</link>
		<pubDate>Fri, 13 Oct 2017 14:51:52 +0000</pubDate>
		<dc:creator><![CDATA[yusukezzz]]></dc:creator>
				<category><![CDATA[uncategorized]]></category>
		<category><![CDATA[debug]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[jvisualvm]]></category>

		<guid isPermaLink="false">http://blog.dev/?p=90</guid>
		<description><![CDATA[jdk をインストールすると付いてくる便利なプロファイラ jvisualvm でリモートサーバの java プ [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>jdk をインストールすると付いてくる便利なプロファイラ jvisualvm でリモートサーバの java プロセスに接続する方法についての覚書</p>
<p>jvisualvm でリモート接続する方法は、<br />
jstatd（これも jdk 組み込み）という java プロセスの監視ツールを経由する方法と JMX という仕様を利用する方法の2種類がある<br />
今回はリモートサーバに jdk が入ってなかったので JMX でやる場合</p>
<h3>JMX 起動オプション</h3>
<p>リモートサーバで java アプリを起動する際に以下のオプションを指定しておく（以下は jdk8 の場合）<br />
port は他で使われてなければ何でも良いが、同じ値を指定する<br />
127.0.0.1 は環境に合わせて変える</p>
<pre><code>-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
</code></pre>
<p>今回接続する際は ssh のポートフォワーディングを利用した<br />
<code>ssh -L 3333:127.0.0.1:3333 user@remote-server</code><br />
などでリモートへの接続を開いておき jvisualvm から localhost:3333 に対して繋ぐ</p>
]]></content:encoded>
			</item>
		<item>
		<title>Laravel で .env の内容が反映されない場合</title>
		<link>https://www.yusukezzz.net/archives/84</link>
		<pubDate>Sun, 08 Oct 2017 03:28:11 +0000</pubDate>
		<dc:creator><![CDATA[yusukezzz]]></dc:creator>
				<category><![CDATA[uncategorized]]></category>
		<category><![CDATA[laravel]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://blog.dev/?p=84</guid>
		<description><![CDATA[公式マニュアルにも記載があるが、 Laravel アプリで artisan config:cache を行って [&#8230;]]]></description>
				<content:encoded><![CDATA[<p><a href="https://laravel.com/docs/5.5/configuration#configuration-caching">公式マニュアル</a>にも記載があるが、<br />
Laravel アプリで <code>artisan config:cache</code> を行っていると .env を変更してもファイルの内容が反映されない<br />
また、アプリ内で env ヘルパー関数などから直接環境変数を参照しているとそもそも値が渡っていない<br />
下記実装を見ると分かるが、 config キャッシュ済みの場合はそもそも .env のロード自体がスキップされるため</p>
<p><a href="https://github.com/laravel/framework/blob/bd352a0d2ca93775fce8ef02365b03fc4fb8cbb0/src/Illuminate/Foundation/Bootstrap/LoadEnvironmentVariables.php#L20">framework/LoadEnvironmentVariables&#46;php#L20 at bd352a0d2ca93775fce8ef02365b03fc4fb8cbb0 · laravel/framework</a></p>
<p>解決するには config を cache しない、又は env の値を config ファイルを経由して参照するよう徹底し値の変更ごとに cache し直す</p>
]]></content:encoded>
			</item>
		<item>
		<title>vultr で ubuntu インストールして最初に行った設定</title>
		<link>https://www.yusukezzz.net/archives/77</link>
		<pubDate>Sun, 01 Oct 2017 17:25:01 +0000</pubDate>
		<dc:creator><![CDATA[yusukezzz]]></dc:creator>
				<category><![CDATA[uncategorized]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[ubuntu]]></category>
		<category><![CDATA[ufw]]></category>
		<category><![CDATA[vultr]]></category>

		<guid isPermaLink="false">http://blog.dev/?p=77</guid>
		<description><![CDATA[SSD VPS Servers, Cloud Servers and Cloud Hosting by Vul [&#8230;]]]></description>
				<content:encoded><![CDATA[<p><a href="https://www.vultr.com/">SSD VPS Servers, Cloud Servers and Cloud Hosting by Vultr &#45; Vultr&#46;com</a> というサービスで ubuntu をインストールした時の記録</p>
<p>2.5ドルのは空きがなかったので5ドルのプランにした<br />
とはいえ東京でメモリ1GBのマシンがこの値段なら十分安い<br />
ちなみに<a href="https://www.vultr.com/?ref=7199493">このリンク</a>から登録してもらうとお互いにクレジットがもらえる（ある程度実際に課金する必要はある）</p>
<p>インストールしたのは ubuntu 16.04<br />
web管理画面から作成を実行し、しばらくしてRUNNINGのステータスになるとアクセス可能になる<br />
IPアドレスと root のパスワードも管理画面で確認可能</p>
<h3>アカウント作成</h3>
<p>最初は root しかいないので作業用アカウントを作成し sudo 出来るグループに追加しておく</p>
<pre><code>adduser yusuke
passwd yusuke
gpasswd -a yusuke admin
</code></pre>
<p>作成したら ssh-copy-id などで公開鍵認証でのログインが出来るようにしておく<br />
必ず鍵認証でアクセスが可能なことを確認しておくこと</p>
<h3>root, パスワードでのログイン禁止設定</h3>
<p><code>sudo vim /etc/ssh/sshd_config</code> して　PermitRootLogin, PasswordAuthentication を no にする<br />
<code>sudo service sshd restart</code> する<br />
この時点でパスワードログイン出来ないことを確認しておくこと</p>
<h3>ファイアウォール設定</h3>
<p>ubuntu では iptables を直接触らずに ufw というコマンドで設定していく<br />
以下では ssh, http, https のみ許可している<br />
参考：<a href="https://qiita.com/yoh-nak/items/46935af3c5c4036e93b3">ufwを使って簡単にファイアウォールを設定する &#45; Qiita</a></p>
<pre><code>sudo ufw default deny
sudo ufw allow 22
sudo ufw allow 80
sudo ufw allow 443
sudo ufw enable
sudo ufw reload
</code></pre>
<h3>aptitude のインストール</h3>
<p>組み込みの apt-get でも十分だが、 aptitude の方が多少便利<br />
具体的には関連パッケージの自動アンインストールをデフォルトでやってくれたりする<br />
（autoremove を付ければ apt-get でも出来る）</p>
<p><code>sudo apt-get install aptitude</code></p>
<p>ついでに upgrade して再起動しておく</p>
<pre><code>sudo aptitude upgrade
sudo reboot
</code></pre>
<h3>怪しいログイン試行をブロック</h3>
<p>denyhosts というサービスをインストールするとログインに失敗したホストを自動的に /etc/hosts.deny に追加してくれる<br />
<code>sudo aptitude install denyhosts</code><br />
設定は<a href="http://d.conma.me/entry/20080126/1201329875">Denyhosts導入メモ &#45; まめ畑</a>などを参考に<br />
<code>sudo service denyhosts restart</code> で設定反映</p>
<h3>タイムゾーンをJSTにする</h3>
<p>デフォルトはUTCなので日本時間に変更する</p>
<pre><code>sudo timedatectl set-timezone Asia/Tokyo
</code></pre>
<p>時刻同期の設定もしておく</p>
<pre><code>sudo aptitude install ntp
sudo vim /etc/ntp.conf
</code></pre>
<p>末尾の方にある server に適当な国内 ntp サーバを設定する<br />
<code>server ntp.nict.jp</code> など<br />
<code>sudo service ntp restart</code> で反映</p>
]]></content:encoded>
			</item>
		<item>
		<title>Laravel の Input 値が空文字列だったら null に変換する機能を無効にする</title>
		<link>https://www.yusukezzz.net/archives/70</link>
		<pubDate>Wed, 20 Sep 2017 04:38:22 +0000</pubDate>
		<dc:creator><![CDATA[yusukezzz]]></dc:creator>
				<category><![CDATA[uncategorized]]></category>
		<category><![CDATA[laravel]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://blog.dev/?p=70</guid>
		<description><![CDATA[Model のフィールドに空文字列を渡しているつもりが mysql 側から NonNull なカラムに Nul [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Model のフィールドに空文字列を渡しているつもりが mysql 側から NonNull なカラムに Null が渡されたとエラーが返ってきてこの機能の存在に気づいた<br />
middleware は非常に便利だが、自分が実装・追加したわけではない処理に関してはこのような暗黙的な副作用があったりして中々厳しい</p>
<p><a href="https://laravel.com/docs/5.5/requests#input-trimming-and-normalization">HTTP Requests &#45; Laravel &#45; The PHP Framework For Web Artisans</a><br />
ドキュメントにも書かれており、どうやら 5.4 からこの挙動がデフォルトになったようだ<br />
無効にするには <code>App\Http\Kernel</code> クラスにある <code>ConvertEmptyStringsToNull</code> middleware をコメントアウトすれば良い</p>
]]></content:encoded>
			</item>
		<item>
		<title>無料で使える画像リサイズAPI</title>
		<link>https://www.yusukezzz.net/archives/55</link>
		<pubDate>Tue, 16 May 2017 14:55:20 +0000</pubDate>
		<dc:creator><![CDATA[yusukezzz]]></dc:creator>
				<category><![CDATA[uncategorized]]></category>
		<category><![CDATA[api]]></category>
		<category><![CDATA[free]]></category>
		<category><![CDATA[image]]></category>

		<guid isPermaLink="false">http://localhost:8080/wordpress/?p=55</guid>
		<description><![CDATA[Android アプリで使うために指定した url の画像をリサイズして返してくれるAPIを探したところ、2つ [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Android アプリで使うために指定した url の画像をリサイズして返してくれるAPIを探したところ、2つ見つけることが出来た<br />
しかもどちらも無料で利用でき、 https にも対応している<br />
登録も API key の取得も要らず、画像の url を書き換えるだけで今すぐ利用出来る</p>
<p><span id="more-55"></span></p>
<p><a href="http://zimage.io/">Zimage – Images, delivered fast&#46;</a></p>
<p><a href="http://rsz.io/">RSZ&#46;IO &#45; a free responsive image service</a></p>
<p>使い方はこんな感じ</p>
<p>http://edge.zimage.io/?url=https://s3-us-west-2.amazonaws.com/stllc/zimage/images/ferrari.png&#038;w=200</p>
<p>http://rsz.io/s3-us-west-2.amazonaws.com/stllc/zimage/images/ferrari.png?width=200</p>
<p>リサイズ機能における両者の差はほとんどないように見えるが、 zimage.io は作者が<a href="http://docs.zimage.io/faq/">FAQ</a>で述べている通り商用利用を見越した作りになっているようだ</p>
<p>どちらも <a href="https://github.com/jcupitt/libvips">jcupitt/libvips</a> を使っているためリサイズ結果は同等のはず</p>
<p>zimage.io は有料プランが準備中であり、SLAも定義されているのが特徴的（無料版は 99.95% とされている）<br />
rsz.io はこの記事執筆時点で直近112日以内のダウンタイムは約1時間であり、稼働率は 99.963% であると記載されている（ただし保証するという旨は一切書かれていない）</p>
<p>最大の違いはキャッシュの有無で、 zimage.io はリサイズ結果をキャッシュしてくれるため1歩リードしている<br />
運営者が twitter をやっていて動向が伺えるのも良い <a href="https://twitter.com/davidbyttow">David Byttow ?&#40;@davidbyttow&#41;さん &#124; Twitter</a><br />
便利なので有料プランが軌道にのって末永く存続してくれることを祈るばかりである</p>
<p>こうして書くと zimage.io が完全に上位互換に見えるが、将来性が不透明なのも確か<br />
rsz.io はそもそもマネタイズの意思が見えなくてもはや不気味なのだけど、少なくとも2014年ごろから継続して稼働しているみたいだったので選択肢として一応残した</p>
]]></content:encoded>
			</item>
		<item>
		<title>tmux 2.4 で vi 風キーバインドが invalid or unknown command と言われる</title>
		<link>https://www.yusukezzz.net/archives/46</link>
		<pubDate>Sat, 06 May 2017 16:05:07 +0000</pubDate>
		<dc:creator><![CDATA[yusukezzz]]></dc:creator>
				<category><![CDATA[uncategorized]]></category>
		<category><![CDATA[tmux]]></category>

		<guid isPermaLink="false">http://localhost:8080/wordpress/?p=46</guid>
		<description><![CDATA[起動時に invalid or unknown command: bind-key -t vi-copy v  [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>起動時に</p>
<p><code>invalid or unknown command: bind-key -t vi-copy v begin-selection</code></p>
<p>などと言われる<br />
どうやら設定の書き方が変わってしまったようだ</p>
<p><a href="https://github.com/tmux/tmux/issues/754">invalid or unknown command: &#96;bind&#45;key &#45;t vi&#45;copy &#46;&#46;&#46;&#46;&#96; · Issue &#35;754 · tmux/tmux</a></p>
<p>ここの下の方に書かれているが、こんな感じにすると直った</p>
<pre><code class="shell">unbind-key -T copy-mode-vi Space     ;   bind-key -T copy-mode-vi v send-keys -X begin-selection
unbind-key -T copy-mode-vi Enter     ;   bind-key -T copy-mode-vi y send-keys -X copy-pipe-and-cancel "reattach-to-user-namespace pbcopy"
unbind-key -T copy-mode-vi C-v       ;   bind-key -T copy-mode-vi C-v send-keys -X rectangle-toggle
unbind-key -T copy-mode-vi [         ;   bind-key -T copy-mode-vi [ send-keys -X begin-selection
unbind-key -T copy-mode-vi ]         ;   bind-key -T copy-mode-vi ] send-keys -X copy-selection
</code></pre>
]]></content:encoded>
			</item>
		<item>
		<title>静的サイトジェネレーターを試して wordpress に戻ってみた話</title>
		<link>https://www.yusukezzz.net/archives/22</link>
		<pubDate>Fri, 05 May 2017 12:52:12 +0000</pubDate>
		<dc:creator><![CDATA[yusukezzz]]></dc:creator>
				<category><![CDATA[uncategorized]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://localhost:8080/wordpress/?p=22</guid>
		<description><![CDATA[これまで jekyll, middleman, hugo などの静的サイトジェネレーターを試してきたけど、どう [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>これまで jekyll, middleman, hugo などの静的サイトジェネレーターを試してきたけど、どうにも CLI で編集・管理する作業に慣れず長続きしなかった</p>
<p>調べてみると GUI を持ったものもいくつか存在したが情報が少なそうだったので結局ローカルPCで wordpress を使って静的サイトを出力するという、本末転倒気味なことを試してみることにした</p>
<p>途中、静的サイトジェネレーターに慣れた方が良かったのでは…？と思わないでもなかったが、一応それなりな環境が出来てしまったので作業の記録を残しておく</p>
<p><span id="more-22"></span></p>
<h3>注意点</h3>
<ul>
<li>当然ながら標準のコメント機能は完全に機能しなくなる</li>
<li>wordpress 上で記事を削除しても出力済みの静的ファイルまでは消してくれないので対応が必要</li>
<li>タグやカテゴリにマルチバイト文字を使っていると正しくリンクされない</li>
<li><strong>静的ファイルの出力が非常に遅い（全てのサイト内ページにHTTPリクエストを投げてHTML化しているため）</strong></li>
</ul>
<h3>設定方法</h3>
<p>wordpress の詳細なインストール方法は割愛するが、動けばいいので osx なら標準で apache, php はインストールされているため mysql だけ用意すれば良い<br />
最新で揃えたければ適当に<br />
<code>brew install homebrew/php/php71 nginx mysql</code><br />
など</p>
<p>wordpress 自体の設定はパーマリンク設定を記事ごとに一意のURLを振る形式に必ず変更する<br />
初期設定だとGETパラメータで記事IDを指定するため静的化出来ない</p>
<p>プラグインは <a href="https://ja.wordpress.org/plugins/simply-static/">Simply Static — WordPress プラグイン</a> を入れる<br />
設定は例えばこのサイトならばリンク先に絶対URLで https://www.yusukezzz.net/ を使用する<br />
出力先は適当なローカルディレクトリで github pages の git リポジトリとして別途設定しておくと楽<br />
これだけでひとまず静的サイト生成出来るので試しに実行してみる</p>
<p>ちなみにこの blog のソースは <a href="https://github.com/yusukezzz/yusukezzz.github.io">yusukezzz/yusukezzz&#46;github&#46;io</a> で見ることが出来る</p>
<h3>ダイエット</h3>
<p>あとは git push するだけだが、恐らく余分なファイルや表示が含まれているので削りたくなるだろう<br />
出力後のファイルに不要なものが含まれていたらプラグイン設定からエクスクルードをよしなに設定しよう</p>
<p>その他以下自分が気になった点と雑な改善方法を列挙しておく<br />
（wordpress の知見がない人はあまりテーマやプラグインを弄らない方が良い）</p>
<ul>
<li>meta タグに不要なのが色々ある
<ul>
<li><a href="https://ja.wordpress.org/plugins/wp-head-cleaner/">wp&#95;head&#40;&#41; cleaner — WordPress プラグイン</a> などで削る</li>
</ul>
</li>
<li>jquery が不要なのに強制的に読み込まれている
<ul>
<li>テーマ上で <code>wp_head();</code> している箇所の前で <code>wp_deregister_script('jquery');</code> する</li>
<li>テーマによっては jquery の存在を前提に jquery-plugin を使っている場合もあるので注意</li>
</ul>
</li>
<li>rss にコメントのフィードURLも含まれている
<ul>
<li><code>wp-includes/feed-rss2.php</code> を適当に編集する</li>
</ul>
</li>
</ul>
<h3>おまけ</h3>
<p>静的ファイル生成時に git push まで自動で行う方法の例（プラグインを弄る）<br />
本当に雑なやり方なので全くおすすめしない</p>
<p>最後に呼ばれる処理である、<br />
<code>/wp-content/plugins/simply-static/includes/tasks/class-ss-wrapup-task.php</code> ファイルの<br />
<code>perform</code> メソッド内で push 操作を行う<br />
例えば<br />
<code>exec("cd /path/to/your.github.io; git add -A; git commit -m \"update\"; git push");</code><br />
など</p>
]]></content:encoded>
			</item>
		<item>
		<title>Hello world</title>
		<link>https://www.yusukezzz.net/archives/6</link>
		<comments>https://www.yusukezzz.net/archives/6#respond</comments>
		<pubDate>Wed, 03 May 2017 16:02:27 +0000</pubDate>
		<dc:creator><![CDATA[yusukezzz]]></dc:creator>
				<category><![CDATA[uncategorized]]></category>

		<guid isPermaLink="false">http://localhost:8080/wordpress/?p=6</guid>
		<description><![CDATA[test echo "Hello world!";]]></description>
				<content:encoded><![CDATA[<h1>test</h1>
<pre><code class="php">echo "Hello world!";
</code></pre>
]]></content:encoded>
			</item>
	</channel>
</rss>
