<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Takaya Kobayashi</title>
    <description>The latest articles on DEV Community by Takaya Kobayashi (@jgs).</description>
    <link>https://dev.to/jgs</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F44253%2Fac941ba0-5a85-49d4-a642-43a73d72b8f0.jpeg</url>
      <title>DEV Community: Takaya Kobayashi</title>
      <link>https://dev.to/jgs</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jgs"/>
    <language>en</language>
    <item>
      <title>Tofu キーボードを組み立てた</title>
      <dc:creator>Takaya Kobayashi</dc:creator>
      <pubDate>Sun, 25 Nov 2018 07:07:03 +0000</pubDate>
      <link>https://dev.to/jgs/tofu--495o</link>
      <guid>https://dev.to/jgs/tofu--495o</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnb37g26k7c0grqzbn86g.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnb37g26k7c0grqzbn86g.jpg" width="800" height="426"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://kbdfans.cn/collections/diy-kit/products/tofu-hhkb-layout-hot-swap-diy-kit" rel="noopener noreferrer"&gt;https://kbdfans.cn/collections/diy-kit/products/tofu-hhkb-layout-hot-swap-diy-kit&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;KBDFans の Tohu HHKB Layout の DIY Kit を買った。ゲームメインの Windows 機ではずっと Majestouch の青軸を使っていたのだけど、買ったのが JIS キーボードを使っていた頃で自分の周辺機器で最後の JIS キーボードだった。JIS の配列を手が忘れかけてきていて、いい加減ストレスだったので US 配列のキーボードに換えたかった。&lt;/p&gt;

&lt;p&gt;60%キーボードは群雄割拠で種類がたくさんある中で Tofu を選んだのは、PCB がホットスワップになっていて、プレートに HHK 配列のものがあって、ぐらい。Aliexpress で注文してから想像してたより早く到着した。5日ほど。&lt;/p&gt;

&lt;p&gt;まずはスタビライザーを組み立て&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa3h0n1jsy6psehmcyek4.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa3h0n1jsy6psehmcyek4.jpg" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;この後は写真を撮るのを失念していて何もないのだけど、プレートにキーキャップを嵌めて PCB に挿し込むだけである。右上らへんが結構タイトで、挿すのが難しかった。&lt;/p&gt;

&lt;p&gt;スイッチは遊舎工房さんで Kailh Speed Rose Pink をチョイス。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://yushakobo.jp/shop/kailh-speed/" rel="noopener noreferrer"&gt;https://yushakobo.jp/shop/kailh-speed/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;PCB に LED がついてて、LED をつけると結構綺麗だったのでクリアなスイッチにするか迷ったのだけど、家使いだし実用重視で。ホットスワップなので後から取り替えてもいいし。&lt;/p&gt;

&lt;p&gt;QMK のファームウェアが使えるとのことだったので、Mac で書き込みをしようとしたけどうまくいかなかった。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://kbdfans.cn/pages/qmk-instructions" rel="noopener noreferrer"&gt;https://kbdfans.cn/pages/qmk-instructions&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;を参考に、Windows で環境を構築した。qmkeyboard の GUI のエディタが使いづらかったので hex を Mac でビルドして、Dropbox で Windows に共有して書き込むようにした。GUI のエディタでソフトリセットのキーを仕込んでおくと裏蓋を開けてスイッチを押す必要がなくなるので、hex には必ずソフトリセットのキーを入れておくと便利。&lt;/p&gt;

&lt;p&gt;何のキーが押されているかを確認するのは&lt;/p&gt;

&lt;p&gt;&lt;a href="http://keyboardchecker.com/" rel="noopener noreferrer"&gt;http://keyboardchecker.com/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;を使った。シンプルで使いやすい。&lt;/p&gt;

&lt;p&gt;基本は HHK のキー配置を参考にしつつ、レイヤーに wsad でアローを入れたりレイヤーの左右 Shift に変換/無変換キーを配置して、MS-IME の設定で変換/無変換を押したら IME のオン/オフを設定しておくと Mac のように英数/かなを決め打ちで切り替えられるのでとても便利になった。&lt;/p&gt;

&lt;p&gt;また、Windows の設定で US のキーボードを挿しても JIS のキーボードとして扱うようになっているようだったので、Windows の設定から「時刻と言語」のところからキーボードのレイアウトを US に変更すると素直に US のキーボードとして入力できるようになった。&lt;/p&gt;

&lt;p&gt;今のお困りポイントは、PCB の左右に USB-C のポートがあるのだけど、右がとても不安定で左に挿したいのだけどケーブルの長さが足りなくて渋々右に挿している(ケーブルをサイバーマンデーで買おうという魂胆...)ことと、スタビライザーの挙動が怪しくてエンターキーは Lube を塗ったらそれなりに動くようになったのだけどスペースはキーキャップを嵌めるとキーが埋まって動かなくなってしまうこと。応急処置で1.5uくらいのキーキャップを装着してるのだけど、スペースがちょっと遠くて不便...。手元の7uのキーキャップは Pimp の Grabbag に付いてきたやつしかないのでキーキャップが歪んでるのかなー、ともおもったけどどう見てもスタビライザーの方がキースイッチの平行線上にない気がしていて、取り付け方を間違えたかな...とおもったり。ゆくゆく直したい。&lt;/p&gt;

&lt;p&gt;あとは、ほぼ同時に組み立てた crkbd も触ってると別に複数uのキーって要らないなと思いはじめてきたので Planck みたいな1uオンリーで60%みたいなキーボードもいいかも、と。ただ、オーソリニアは使ったことがないので Normal staggered な40-60%あるといいなーとかとか。Zinc の数字列があるようなのが理想かも。&lt;/p&gt;

</description>
      <category>keyboard</category>
      <category>tofu</category>
      <category>kbdfans</category>
    </item>
    <item>
      <title>Metamask で Dev トークンの残高を確認する</title>
      <dc:creator>Takaya Kobayashi</dc:creator>
      <pubDate>Tue, 28 Aug 2018 03:43:55 +0000</pubDate>
      <link>https://dev.to/jgs/metamask--dev--g00</link>
      <guid>https://dev.to/jgs/metamask--dev--g00</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--0WlfakUr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.gyazo.com/0663e25d96c0ffd26d31415cfc778949.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--0WlfakUr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.gyazo.com/0663e25d96c0ffd26d31415cfc778949.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;と、Ethrscan の URL が送られてきたものの、Metamask で Dev トークンの残高を確認する方法がよく分からなかったので。&lt;/p&gt;

&lt;p&gt;Etherscan の &lt;code&gt;ERC20(DEV)&lt;/code&gt; と書いてあるところが Dev トークンの情報が見れる URL のリンクになっている。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://etherscan.io/token/0x98626e2c9231f03504273d55f397409defd4a093"&gt;https://etherscan.io/token/0x98626e2c9231f03504273d55f397409defd4a093&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;ここの Contract というところがトークンアドレスのよう。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--6jBRgOX_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.gyazo.com/eedead944b380515ad9bbdcbfdc7ffce.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--6jBRgOX_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.gyazo.com/eedead944b380515ad9bbdcbfdc7ffce.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;これを Metamask の &lt;code&gt;トークンを追加&lt;/code&gt; -&amp;gt; &lt;code&gt;カスタムトークン&lt;/code&gt; の &lt;code&gt;トークンアドレス&lt;/code&gt; のところにコピペ&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--sMSq0jmp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.gyazo.com/f2e95a660b3001937567cc3ebd73d9f2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--sMSq0jmp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.gyazo.com/f2e95a660b3001937567cc3ebd73d9f2.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;すると、トークンシンボルと小数点桁数というところが補完されるので &lt;code&gt;次へ&lt;/code&gt; を押す&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--LNIE6kmK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.gyazo.com/1c175be859fc8c90162404d860e7a950.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--LNIE6kmK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.gyazo.com/1c175be859fc8c90162404d860e7a950.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;残高も確認できる。ここで &lt;code&gt;トークンを追加&lt;/code&gt; を押すと Metamask に Eth と並んで Dev という項目が追加される。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--8nn7JsRs--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.gyazo.com/e28ffabe3dcde9c3e92e245d38a34c99.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--8nn7JsRs--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.gyazo.com/e28ffabe3dcde9c3e92e245d38a34c99.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;ゎ〜ぃ&lt;/p&gt;

</description>
      <category>metamask</category>
      <category>dev</category>
    </item>
    <item>
      <title>Firebase Functions で Node.js 8 使えるようになったぞ〜〜〜！！！</title>
      <dc:creator>Takaya Kobayashi</dc:creator>
      <pubDate>Wed, 01 Aug 2018 16:22:08 +0000</pubDate>
      <link>https://dev.to/jgs/firebase-functions--nodejs-8--23lk</link>
      <guid>https://dev.to/jgs/firebase-functions--nodejs-8--23lk</guid>
      <description>

&lt;h1&gt;tldr&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;firebase-tools&lt;/code&gt; をアップグレードする&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;functions/package.json&lt;/code&gt; に &lt;code&gt;"engines": { "node": "8" }&lt;/code&gt; を追加する&lt;/li&gt;
&lt;li&gt;&lt;code&gt;firebase deploy&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;経緯&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://cloud.google.com/functions/docs/concepts/nodejs-8-runtime"&gt;https://cloud.google.com/functions/docs/concepts/nodejs-8-runtime&lt;/a&gt; でしれっと（？） Cloud Functions で Node.js 8 が使えることが書いてあって(あと Python)小躍りしながら試しました。&lt;/p&gt;

&lt;p&gt;じゃあ Firebase Functions でも使えるんじゃね...?と調べてみても、全く情報が出てきませんでした。ウェブのコンソールからランタイムを変更できる、と書いてる記事もあったのですが自分のプロジェクトにはそういう項目はなく...。&lt;/p&gt;

&lt;p&gt;firebase-tools のリポジトリを &lt;code&gt;runtime&lt;/code&gt; で検索すると対応しているっぽい雰囲気がありました。しばらくコード追ったりした後に、最初に気付けばよかったんですが、リリースノートにちゃんと書いてありました。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/firebase/firebase-tools/releases/tag/v4.0.0"&gt;https://github.com/firebase/firebase-tools/releases/tag/v4.0.0&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;まずはちゃんとリリースノートを読もうな！&lt;/p&gt;

&lt;h1&gt;余談&lt;/h1&gt;

&lt;p&gt;しばらく見ない間に TypeScript にもオフィシャルに対応していて &lt;code&gt;firebase init&lt;/code&gt; で対話的にプロジェクトを作成する際に TS でスキャッフォルドを作ってくれるのでお手軽に型を付けられるようになっていた。かなりマトモな環境の Node.js 8 で動かすものを TS で書けるとなるとだいぶ選択肢に入ってくるのでは...?というカンジがした。まだ beta っぽいけどガンバッテほしい...!&lt;/p&gt;


</description>
      <category>firebase</category>
      <category>cloudfunctions</category>
      <category>firebasefunctions</category>
      <category>node</category>
    </item>
    <item>
      <title>Oculus Go で React 360 の開発をはじめられる</title>
      <dc:creator>Takaya Kobayashi</dc:creator>
      <pubDate>Fri, 25 May 2018 16:33:30 +0000</pubDate>
      <link>https://dev.to/jgs/oculus-go--react-360--29lg</link>
      <guid>https://dev.to/jgs/oculus-go--react-360--29lg</guid>
      <description>&lt;p&gt;Oculus Go を買った &lt;a href="https://note.mu/jgs/n/nd31e52697614" rel="noopener noreferrer"&gt;https://note.mu/jgs/n/nd31e52697614&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;ちなみに、この FANBOX の記事で NetflixVR は左上の Void theater というところからゴロ寝追従モードに入ってくれることをコメントで教えてもらったので快適になりました&lt;/p&gt;




&lt;p&gt;Oculus Go にはそれなりなブラウザが搭載されていることを &lt;a href="https://qiita.com/wakufactory/items/98658e8d089386a7b073" rel="noopener noreferrer"&gt;Oculus GoのブラウザについてのWeb開発者目線からのまとめ - Qiita&lt;/a&gt;　を読んで知ったので、WebVR はどんなもんかと見物するために買ったといっても過言ではない&lt;/p&gt;

&lt;p&gt;だいたいの流れは上述の記事通りなのだけど、いくつかハマったので記しておく&lt;/p&gt;

&lt;p&gt;まずは Oculus Go を開発者モードにする&lt;/p&gt;

&lt;p&gt;これは &lt;a href="http://unrealengine.hatenablog.com/entry/2018/05/04/232708" rel="noopener noreferrer"&gt;UE4 Oculus GoでVRアプリの開発を開始するまでの方法 - Let's Enjoy Unreal Engine&lt;/a&gt; ここに詳しい&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dashboard.oculus.com" rel="noopener noreferrer"&gt;https://dashboard.oculus.com&lt;/a&gt; から団体を作るとスマホの Oculus アプリからデバイスの「その他の設定」から「開発者モード」という項目が出現するのでこれをトグルする&lt;/p&gt;

&lt;p&gt;&lt;code&gt;chrome://inspect/#devices&lt;/code&gt; にアクセスして USB を接続すると Chrome のインスペクタから見えるのだが、&lt;code&gt;Pending authentication: please accept debugging session on the device.&lt;/code&gt; と表示されてなかなかアクセスできない&lt;/p&gt;

&lt;p&gt;Oculus Go で許可すると見れるようになるらしいが、それらしいダイアログが全く表示されない&lt;/p&gt;

&lt;p&gt;Oculus の Developer 向けのページを見ても Windows 向けの zip は公開されているが、Mac には特に言及がない&lt;/p&gt;

&lt;p&gt;adb がいるのかな？と推測して Android Studio をインストールするも&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;✈ ./adb shell
error: device unauthorized.
This adb server's $ADB_VENDOR_KEYS is not set
Try 'adb kill-server' if that seems wrong.
Otherwise check for a confirmation dialog on your device.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;などと表示されてなかなか接続できない&lt;/p&gt;

&lt;p&gt;半ばヤケクソで再起動を繰り返していたらコントローラが認識されなくなる...&lt;/p&gt;

&lt;p&gt;これも調べてみると Oculus のボタンと戻るボタンを長押しすると再度ペアリングしてくれるようだ&lt;/p&gt;

&lt;p&gt;それからいろいろ探ってみるも、全く Oculus Go で許可できなくて、アプリから設定をいろいろ変えてみたりして再起動したタイミングで起動時に許可を求めるダイアログが出た！！！！！！！！！！&lt;/p&gt;

&lt;p&gt;いろいろ探ってみるとどうやらアンロックパターンを設定するとデバッグを許可するダイアログが出ないみたいだ...&lt;/p&gt;

&lt;p&gt;また、許可する際に「このマシンから常にデバッグできるようにする」にチェックを入れて許可してもアンロックパターンを設定すると吹き飛んでしまうよう&lt;/p&gt;

&lt;p&gt;なので、インスペクトする際にはとりあえずアンロックパターンを削除するのが定石っぽい&lt;/p&gt;

&lt;p&gt;このアンロックパターンを削除するのも結構鬼門で、「Oculus 暗証番号」とかいうのを求められるのだが、正規ルートをなぞってきてもそんな番号を設定したおぼえはない&lt;/p&gt;

&lt;p&gt;仕方ないので「Oculus 暗証番号をリセット」からリセットするのだが、リセット画面では8桁以上の入力を求められるのに実際の暗証番号入力画面では4桁しか入力できない謎仕様で合ってるんだか合ってないんだかよく分からない番号をとりあえず入力するとアンロックパターンは削除できる...。&lt;/p&gt;

&lt;p&gt;インスペクタは&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.gyazo.com%2F91254abb75a239e94c2d8bcc9ecbd321.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.gyazo.com%2F91254abb75a239e94c2d8bcc9ecbd321.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;こんな感じで、ゴーグルをかぶらなくてもデバッグできるので楽そう〜とおもった&lt;/p&gt;

&lt;p&gt;が、ブラウザの360度モードに入ると console にエラーを上げて死んでしまうのだ...&lt;/p&gt;

&lt;p&gt;しょうがないので360度モードの時はコンソールやネットワークだけをとりあえず見れる程度におもっておく&lt;/p&gt;

&lt;p&gt;さて、WebVR のことはあまり知らないのでとりあえず普段使っている React の &lt;code&gt;Learn Once Write Anywhere&lt;/code&gt; を試すために ReactVR を触ってみようとおもったら、知らない間に React 360 に改名していたようだ&lt;/p&gt;

&lt;p&gt;ドキュメントを読むに、ReactVR は内部で使うことになって2つに分裂してしまったので元 ReactVR の方が React 360 になったらしい&lt;/p&gt;

&lt;p&gt;チュートリアルに従って作っていく&lt;/p&gt;

&lt;p&gt;リポジトリ: &lt;a href="https://github.com/e-jigsaw/Hello360" rel="noopener noreferrer"&gt;https://github.com/e-jigsaw/Hello360&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;適当なディレクトリを切って &lt;code&gt;npm install react-360-cli&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;react-360 init Hello360&lt;/code&gt; するとスキャフォールドを作ってくれて &lt;code&gt;npm install&lt;/code&gt; がはじまるんだけど Electron のインストールとかもはじまって、何に使うんだ...みたいな気持ちになった&lt;/p&gt;

&lt;p&gt;&lt;code&gt;npm start&lt;/code&gt; すると &lt;code&gt;localhost:8081&lt;/code&gt; が立ち上がるのだが、シンプルな html が表示されるだけで何も出ない...&lt;/p&gt;

&lt;p&gt;よくよくドキュメントを読んでみると &lt;code&gt;localhost:8081/index.html&lt;/code&gt; にアクセスしろと書いてあるのでこちらを開くと CLI でビルドがはじまる&lt;/p&gt;

&lt;p&gt;ビルドが完了すると360度見回せるビューが出現する!!&lt;/p&gt;

&lt;p&gt;ソースを編集してリロードすると素早く反映してくれる謎技術。察するに React Native まわりの技術にのっかってる雰囲気がある&lt;/p&gt;

&lt;p&gt;チュートリアルに従って VR ボタンを伴ったカウンターを作った&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.gyazo.com%2F2f948e372656b1009e37c865239da904.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.gyazo.com%2F2f948e372656b1009e37c865239da904.gif"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;ブラウザの360度モードだと動画を撮影する手段が見当たらなくて困っている。解決方法を知っている方はコメントいただけると助かります...!!&lt;/p&gt;

&lt;p&gt;とりあえず今日はこの辺で。作りたいものを考えはじめたんだけど、WebVR(標準は WebXR として策定されるらしい？)だと UI が Web のそれが全く通じない気がしたのでどういう UI がいいのか考えるのが楽しそう&lt;/p&gt;

&lt;p&gt;Scrapbox Meetup #4 でも三次元で探索するにはどういう UI がいいか？という話題が LT で上がっていたが、確かに現在の Web のインターフェースは二次元で探索するのに適した UI だとおもうので三次元空間の面には持っていけるだろうが全体の体験の設計としては甘そう&lt;/p&gt;

&lt;p&gt;Oculus Go のホーム画面の UI も結局ポインティングデバイスを使ってのソレなのでまだまだ、という感じがする&lt;/p&gt;

&lt;p&gt;憧れ100%だけど&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/zg0IO38HIOH8k/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/zg0IO38HIOH8k/giphy.gif"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;みたいな UI 作れるといいな...!!&lt;/p&gt;

</description>
      <category>oculusgo</category>
      <category>react360</category>
    </item>
    <item>
      <title>published: false の記事供養 (2018/05 版)</title>
      <dc:creator>Takaya Kobayashi</dc:creator>
      <pubDate>Fri, 25 May 2018 07:36:24 +0000</pubDate>
      <link>https://dev.to/jgs/published-false--201805--1k06</link>
      <guid>https://dev.to/jgs/published-false--201805--1k06</guid>
      <description>&lt;p&gt;忙しさにかまけて、書き出しだけ書いてそのまま仕上がらなかった記事は Chrome のタブに開きっぱなしになっているのだけど、だいぶ日数が経って書き上がる気がしなくなってしまったのでまとめて放流して供養する。&lt;/p&gt;




&lt;h1&gt;
  
  
  Slack から Google Home を喋らせる
&lt;/h1&gt;

&lt;p&gt;3月のはじめごろに Google Home Mini を買った。スマートスピーカーがブームになってきた頃は、みんなそんなに喋るスピーカーがほしいんだろうか？と懐疑的だったが、お試しで1台買った。我が家では、喋るラジオみたいな役職に就いて便利だったので1台買い増して居間と寝室の2台構成となった。&lt;/p&gt;

&lt;p&gt;ところで、とても無益な話になってしまうのだが、私の妻は大変なものぐさで Slack で連絡をして通知音が鳴っても「なんか言ってるんだろうなー」とおもうだけで中身を確認してくれない習性がある。当人もその自覚があり、「Google Home 買ったんだしなんか伝えたい時は Google Home が喋れば聞いてやらんこともない(意訳)」というオーダーが入ったので日曜大工をがんばることになった。&lt;/p&gt;

&lt;p&gt;いろいろ調べたが &lt;a href="https://scrapbox.io/smart-home/Google_Home%E3%81%AE%E5%96%8B%E3%82%89%E3%81%9B%E6%96%B9"&gt;Google Homeの喋らせ方&lt;/a&gt; に書かれているように Google Home と同じネットワークの中に何らかの司令塔がないと喋れないようだった。&lt;/p&gt;

&lt;p&gt;そこで、随分長らく買いそびれていた Raspberry Pi を買った。これもざざっと調べてスイッチサイエンスさんのスターターキット( &lt;a href="https://www.switch-science.com/catalog/3559/"&gt;https://www.switch-science.com/catalog/3559/&lt;/a&gt; )を買った。ちゃちゃっと組み立てて刺すだけで Linux が立ち上がって少し感動した。ただ、我が家は HDMI のディスプレイを置いている位置には使える LAN ケーブルがなくて、運用の際には別の位置に置いて有線で使いたかったので、最初のセットアップを無線でやって ssh でログインできるところまでやって、勢いで有線で切り替える少々トリッキーなセットアップをした。祈りながら ssh がつながった時も少し感動した。&lt;/p&gt;

&lt;p&gt;ささっと Node.js をインストールして、前掲の記事で紹介されていた &lt;a href="https://github.com/noelportugal/google-home-notifier"&gt;https://github.com/noelportugal/google-home-notifier&lt;/a&gt; で様子を探ってみる。試しに喋らせてみると&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Please fix your application to use the native API of Avahi!
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;というような WARN が出るが、調べると &lt;a href="https://github.com/thkl/homebridge-homematic/issues/41"&gt;https://github.com/thkl/homebridge-homematic/issues/41&lt;/a&gt; なんか大変らしい。&lt;/p&gt;

&lt;p&gt;それはそれとして、&lt;code&gt;google-home-notifier&lt;/code&gt; が日本語を話してくれない問題があってコード読んだらそんなに大したことをしてなかったので、自分で再実装することにした。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/e-jigsaw/google-home-notifier"&gt;https://github.com/e-jigsaw/google-home-notifier&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;ここまで書いて力尽きていた。現在我が家は Slack から Telegram に移行してしまったので、Slack のシステムは止めてしまった。&lt;/p&gt;




&lt;h1&gt;
  
  
  Electron のアプリから TouchBar に UI をつくる
&lt;/h1&gt;

&lt;p&gt;MacbookPro を新調して、TouchBar が搭載されたので何かできないかな〜とぼんやりおもってたら Electron で TouchBar を操作できる API が搭載されていることを知ったので触ってみる。Chrome Extension で特定ページで TouchBar に何らかを出して便利になったりすると面白そう。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/electron/electron/blob/master/docs/api/touch-bar.md"&gt;https://github.com/electron/electron/blob/master/docs/api/touch-bar.md&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;この辺の Doc を読みつつ。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// ...&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;touchBar&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;TouchBar&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
  &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;TouchBarLabel&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;test&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
  &lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="c1"&gt;// ...&lt;/span&gt;
&lt;span class="nx"&gt;mainWindow&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;setTouchBar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;touchBar&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;// ...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;こんな感じで書くだけで Label が表示できた。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;  &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;TouchBarButton&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;➡️&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;click&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;yo&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;これで &lt;code&gt;yo yo&lt;/code&gt; できるボタンが作れた。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;
  &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;TouchBarScrubber&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;items&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;
      &lt;span class="na"&gt;label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;foo&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;bar&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
    &lt;span class="p"&gt;}],&lt;/span&gt;
    &lt;span class="na"&gt;select&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;index&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;index&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="na"&gt;showArrowButtons&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;selectedStyle&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;background&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
  &lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;セレクタはこんな感じ。&lt;/p&gt;




&lt;p&gt;これもここで力尽きている。そもそも TouchBar まわりのドキュメントが少なくて、すぐにソース掘ったりしなきゃいけなくなったりしてまだ望みの UI というか、システムが作れていない。&lt;/p&gt;

&lt;p&gt;Electron 製のアプリは2コぐらい並列して開発を続けているが、どちらもあまり時間が取れていなくて進捗がない...。&lt;/p&gt;




&lt;p&gt;もっと下書きがあった気がしたんだけど、dev.to で下書いていたのはこの2本だった。&lt;br&gt;
もっと継続的にアウトプットをデリバリーしていきたい...。&lt;/p&gt;

</description>
    </item>
    <item>
      <title>dig コマンドで TXT レコードを引いてくる</title>
      <dc:creator>Takaya Kobayashi</dc:creator>
      <pubDate>Tue, 15 May 2018 04:49:36 +0000</pubDate>
      <link>https://dev.to/jgs/dig--txt--58bj</link>
      <guid>https://dev.to/jgs/dig--txt--58bj</guid>
      <description>&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;dig -t TXT example.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;何かと必要になるでおなじみの TXT レコードがちゃんと設定されているか確かめる方法を知らなかったので備忘録として...。&lt;/p&gt;

&lt;p&gt;前回の投稿からだいぶ日が空いてしまったけれど、dev.to に投稿しようとおもってざっくり書いたけど、まだ推敲してない投稿がたくさんあります...。&lt;/p&gt;

</description>
      <category>dig</category>
    </item>
    <item>
      <title>recompose で ref を扱う</title>
      <dc:creator>Takaya Kobayashi</dc:creator>
      <pubDate>Tue, 20 Feb 2018 15:44:19 +0000</pubDate>
      <link>https://dev.to/jgs/recompose--ref---2jmd</link>
      <guid>https://dev.to/jgs/recompose--ref---2jmd</guid>
      <description>&lt;p&gt;recompose を使うと見た目の component とロジックを切り離して書けるのでスッキリする、というような記事を先日書いた(&lt;a href="https://dev.to/jgs/storybook-driven-development---37b7"&gt;Storybook Driven Development を試している&lt;/a&gt;)のだが、React の ref の使い方で大いにハマったので書いておく。&lt;/p&gt;

&lt;p&gt;アプリケーションを作っていると、往々にして &lt;code&gt;componentDidUpdate&lt;/code&gt; などで &lt;code&gt;ref&lt;/code&gt; を参照したいということが発生する。普通に &lt;code&gt;class&lt;/code&gt; で書いていると&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;extends&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Component&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;componentDidUpdate&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;textarea&lt;/span&gt; &lt;span class="c1"&gt;// =&amp;gt; &amp;lt;textarea /&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nf"&gt;render&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;textarea&lt;/span&gt; &lt;span class="nx"&gt;ref&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;textarea&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;textarea&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;textarea&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt; &lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;という風に書くが、recompose を使っていると&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;enhance&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;lifecycle&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="nf"&gt;componentDidUpdate&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// ???&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="nf"&gt;enhance&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;textarea&lt;/span&gt; &lt;span class="nx"&gt;ref&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="o"&gt;??&lt;/span&gt;&lt;span class="p"&gt;?}&lt;/span&gt; &lt;span class="sr"&gt;/&amp;gt;&lt;/span&gt;&lt;span class="se"&gt;)&lt;/span&gt;&lt;span class="err"&gt;)
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;というような形に分離する。この時、先に示したように &lt;code&gt;ref&lt;/code&gt; で &lt;code&gt;this&lt;/code&gt; に代入しても、&lt;code&gt;componentDidUpdate&lt;/code&gt; の中では &lt;code&gt;this&lt;/code&gt; は &lt;code&gt;ProxyComponent&lt;/code&gt; となっていて &lt;code&gt;ref&lt;/code&gt; が読み出せなくなってしまう。これを解決するためには、&lt;code&gt;withHandlers&lt;/code&gt; を併用する。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;enhance&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;compose&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nf"&gt;withHandlers&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;refs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;onRef&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;props&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;textarea&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;refs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;textarea&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;textarea&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
      &lt;span class="na"&gt;onUpdate&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;props&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;refs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;textarea&lt;/span&gt; &lt;span class="c1"&gt;// として参照できる!!&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}),&lt;/span&gt;
  &lt;span class="nf"&gt;lifecycle&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="nf"&gt;componentDidUpdate&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;onUpdate&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;enhance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;textarea&lt;/span&gt; &lt;span class="nx"&gt;ref&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;onRef&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="sr"&gt;/&amp;gt;&lt;/span&gt;&lt;span class="se"&gt;)&lt;/span&gt;&lt;span class="err"&gt;)
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;これで recompose でも ref を取り扱うことができた。&lt;/p&gt;

</description>
      <category>react</category>
      <category>recompose</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Storybook Driven Development を試している</title>
      <dc:creator>Takaya Kobayashi</dc:creator>
      <pubDate>Fri, 16 Feb 2018 17:14:35 +0000</pubDate>
      <link>https://dev.to/jgs/storybook-driven-development---37b7</link>
      <guid>https://dev.to/jgs/storybook-driven-development---37b7</guid>
      <description>&lt;p&gt;前々から気になっていた Storybook を試して、プロダクトでも採用してみたので所感を書く。&lt;/p&gt;

&lt;p&gt;ちなみに、&lt;a href="https://github.com/zeit/next.js" rel="noopener noreferrer"&gt;Next.js&lt;/a&gt; を使っているけれど、&lt;code&gt;.babelrc&lt;/code&gt; の設定とかをやっていれば &lt;code&gt;start-storybook&lt;/code&gt; の &lt;code&gt;-s ./&lt;/code&gt; オプションで問題なく動いた。&lt;/p&gt;

&lt;h1&gt;
  
  
  動機
&lt;/h1&gt;

&lt;p&gt;ここ数年、React を使って component ベースでウェブページを設計することを何度かやってきているが、未だにパスタコンポーネントが出来上がってしまう。そしてパスタコンポーネント群は往々にして開発がつらくなっていく...。&lt;/p&gt;

&lt;h1&gt;
  
  
  Storybook について
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.gyazo.com%2F4e5bee38519cf776e97452d380d7b305.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.gyazo.com%2F4e5bee38519cf776e97452d380d7b305.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Storybook は動的にスタイルガイドを生成できるツールで、React だけではなく Vue や Angular にも対応しているよう。&lt;/p&gt;

&lt;p&gt;&lt;code&gt;@storybook/react&lt;/code&gt; をインストールして CLI から起動するだけでホットロードしてくれる画面が立ち上がって便利だった。&lt;/p&gt;

&lt;p&gt;サンプルは &lt;a href="https://storybook.js.org/examples/" rel="noopener noreferrer"&gt;https://storybook.js.org/examples/&lt;/a&gt; でみれる。&lt;/p&gt;

&lt;h1&gt;
  
  
  アトミックデザインについて
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.gyazo.com%2F1e42493f2e45b243085bf9571b593212.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.gyazo.com%2F1e42493f2e45b243085bf9571b593212.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;(これが全てだろう)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.gyazo.com%2F758f97c15a3e4721f5a4c020125d04e7.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.gyazo.com%2F758f97c15a3e4721f5a4c020125d04e7.jpg"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;(有名な図)&lt;/p&gt;

&lt;p&gt;Storybook を書いていくときにある程度項目立てをしていった方がいいだろう、と考えた。そこで思い出したのが Atomic Design だった。昔、知った時は分類がややこしそうだと思ったが、一旦従ってみることにした。&lt;/p&gt;

&lt;h1&gt;
  
  
  開発フロー
&lt;/h1&gt;

&lt;p&gt;まずは小物から Atom として Storybook に書いていく。状態によって変化するコンポーネントは状態を列挙して、Storybook 上で確認できるようにしていく。まずは Atom と Molecules たちが仕上がってくる。&lt;/p&gt;

&lt;p&gt;各パーツが仕上がったら API とつなぎ込む必要がある Organisms など、動きをつけていく。ここで役に立つのが recompose である。&lt;/p&gt;

&lt;h1&gt;
  
  
  recompose について
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://github.com/acdlite/recompose" rel="noopener noreferrer"&gt;recompose&lt;/a&gt; は Lodash ライクな React (特に HoC)向けのユーティリティベルト。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;enhance&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;withState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;counter&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;setCounter&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;Counter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;enhance&lt;/span&gt;&lt;span class="p"&gt;(({&lt;/span&gt; &lt;span class="nx"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setCounter&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;
  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nx"&gt;Count&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;button&lt;/span&gt; &lt;span class="nx"&gt;onClick&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;setCounter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;n&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Increment&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/button&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;button&lt;/span&gt; &lt;span class="nx"&gt;onClick&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;setCounter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;n&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Decrement&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/button&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;こんな感じで見た目を司るコンポーネントのみを切り出せるように様々な関数が用意されている。&lt;/p&gt;

&lt;p&gt;例えば React の Lifecycle 関数だと&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;PostsList&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;posts&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;ul&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;posts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;li&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/li&amp;gt;&lt;/span&gt;&lt;span class="se"&gt;)&lt;/span&gt;&lt;span class="sr"&gt;}&amp;lt;/u&lt;/span&gt;&lt;span class="nx"&gt;l&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;PostsListWithData&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;lifecycle&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="nf"&gt;componentDidMount&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;fetchPosts&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;posts&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setState&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;posts&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;})(&lt;/span&gt;&lt;span class="nx"&gt;PostsList&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;こんな感じで分離させることができる。&lt;/p&gt;

&lt;p&gt;また、これらは &lt;code&gt;compose&lt;/code&gt; 関数でこれらを組み合わせることもできる。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;enhance&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;compose&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nf"&gt;withState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;counter&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;setCounter&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="nf"&gt;lifecycle&lt;/span&gt;&lt;span class="p"&gt;({...})&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;enhance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;Counter&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ゆくゆくは enzyme を使って Storybook 上で挙動の確認などもできるとよいのだけど、一旦 Storybook ではスタイルガイドに徹することにして&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;Counter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;({...})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(...)&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;enhance&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;compose&lt;/span&gt;&lt;span class="p"&gt;(...)&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nf"&gt;enhance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;Counter&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;として、story では &lt;code&gt;import {Counter} from '...'&lt;/code&gt; と読み込み、Pages からは &lt;code&gt;import Counter from '...'&lt;/code&gt; と読み込むことで見た目のみのコンポーネントと、動き込みのコンポーネントに分けることができた。&lt;/p&gt;

&lt;p&gt;見た目に関しては Storybook 上でパーフェクトに仕上がってるので、バチッと動くロジックを書けばうまいこと動くようになるので心地よかった。&lt;/p&gt;

&lt;h1&gt;
  
  
  今後の展望など
&lt;/h1&gt;

&lt;p&gt;Storybook のドキュメントにも書いてある visual regression test をやってみたい。あとは、上にも少し書いた enzyme を使っての動きのテストなど。&lt;/p&gt;

&lt;h1&gt;
  
  
  まとめ
&lt;/h1&gt;

&lt;p&gt;Atomic Design に従ったコンポーネント群を Storybook を使って見た目を仕上げてから、recompose を使って動きを足していく開発フローを導入してみている。&lt;/p&gt;

&lt;p&gt;余談だけど、ざざっと Examples を見たら Wix の wix-style-react はものすごい使いやすいようにカスタムされていてすごかった...。オフィシャルに取り込んでほしいレベル。&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>react</category>
      <category>storybook</category>
      <category>recompose</category>
    </item>
    <item>
      <title>Google Chrome で特定の要素を Scrapbox の記法に変換する Extension</title>
      <dc:creator>Takaya Kobayashi</dc:creator>
      <pubDate>Sun, 11 Feb 2018 12:25:48 +0000</pubDate>
      <link>https://dev.to/jgs/google-chrome--scrapbox--extension--104m</link>
      <guid>https://dev.to/jgs/google-chrome--scrapbox--extension--104m</guid>
      <description>

&lt;p&gt;Scrapbox を半年以上ヘビーに使っていて、後から読み返すかもしれないページを &lt;a href="https://github.com/e-jigsaw/scboloo"&gt;scboloo&lt;/a&gt; を使ってページを作成して記録していたのだが、これでサムネイルを Gyazo って記録するとあとから検索する際に不便なので、コアになる部分を引用して記録したくて要素を選択する UI を Chrome の Extension として作った。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--8PZkWFJU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://i.gyazo.com/66db455f380e61f008c910430f2699bb.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--8PZkWFJU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://i.gyazo.com/66db455f380e61f008c910430f2699bb.gif" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;こんな感じで範囲を選択すると&lt;/p&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[****** JavaScript の async/await の仕様をずっと誤解していた]
[**** [/jgs [https://res.cloudinary.com/practicaldev/image/fetch/s--HYyGI8aZ--/c_fill,f_auto,fl_progressive,h_50,q_auto,w_50/https://thepracticaldev.s3.amazonaws.com/uploads/user/profile_image/44253/ac941ba0-5a85-49d4-a642-43a73d72b8f0.jpeg] Takaya Kobayashi] Feb 08, 2018 [/ Updated on Feb 11, 2018] [/jgs/javascript--asyncawait---2l41/edit EDIT POST]]

[/t/javascript #javascript]
すごい初歩的なことかもしれないのだけれど、年単位ぐらいで誤解したままコードを書いていたので懺悔のためにも書いておく...。 何が違ったかというと、async function の扱いである。async function も
...
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;というような感じで Scrapbox フレンドリーなテキストがクリップボードにコピーされる。あとは Scboloo でページを作成して、ペーストする。あとは文章を辿りながら、要素要素で範囲選択をして &lt;code&gt;[]&lt;/code&gt; でリンクを張っておく。これで後から格段に引きやすくなるとおもう。(たぶん)&lt;/p&gt;


</description>
      <category>javascript</category>
      <category>googlechrome</category>
      <category>extension</category>
      <category>scrapbox</category>
    </item>
    <item>
      <title>JavaScript の async/await の仕様をずっと誤解していた</title>
      <dc:creator>Takaya Kobayashi</dc:creator>
      <pubDate>Thu, 08 Feb 2018 04:54:10 +0000</pubDate>
      <link>https://dev.to/jgs/javascript--asyncawait---2l41</link>
      <guid>https://dev.to/jgs/javascript--asyncawait---2l41</guid>
      <description>&lt;p&gt;すごい初歩的なことかもしれないのだけれど、年単位ぐらいで誤解したままコードを書いていたので懺悔のためにも書いておく...。&lt;/p&gt;

&lt;p&gt;何が違ったかというと、async function の扱いである。async function も &lt;code&gt;function&lt;/code&gt; と同じだとおもっていて、 &lt;code&gt;Promise&lt;/code&gt; を返さないと呼び出し側で &lt;code&gt;await&lt;/code&gt; できないと勘違いしていた。そのため、今までは&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;fn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;reject&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{...})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;というような感じで &lt;code&gt;Promise&lt;/code&gt; を一旦返すようにしていた。しかし、async function は呼び出すと &lt;code&gt;Promise&lt;/code&gt; を返してくれるのだ。&lt;/p&gt;

&lt;p&gt;参照: &lt;a href="https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/async_function"&gt;https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/async_function&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;fn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Node.js v9.5 で確認した。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[AsyncFunction: fn]
Promise { undefined }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;Promise&lt;/code&gt; が返ってくる...。よくよく調べていくと async function の中で &lt;code&gt;return&lt;/code&gt; すると &lt;code&gt;Promise&lt;/code&gt; を &lt;code&gt;resolve&lt;/code&gt; し、 &lt;code&gt;throw&lt;/code&gt; すると &lt;code&gt;Promise&lt;/code&gt; を &lt;code&gt;reject&lt;/code&gt; することになるんだそうな。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;fn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;yo&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;main&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;=&amp;gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;yo
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;fn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nb"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;err&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;yo&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;main&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;=&amp;gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Error: err
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;まじか...。俺の &lt;code&gt;Promise&lt;/code&gt; とはなんだったんだ.........。とても恥ずかしい.....。&lt;/p&gt;

</description>
      <category>javascript</category>
    </item>
    <item>
      <title>ランダムに色を表示するだけのサービスをつくった</title>
      <dc:creator>Takaya Kobayashi</dc:creator>
      <pubDate>Tue, 09 Jan 2018 15:49:51 +0000</pubDate>
      <link>https://dev.to/jgs/-gf7</link>
      <guid>https://dev.to/jgs/-gf7</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--rMuYl-ee--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/kotbjrtjwxwx7y2ubo91.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--rMuYl-ee--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/kotbjrtjwxwx7y2ubo91.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://color.kbys.tk/"&gt;https://color.kbys.tk/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;野暮用でランダムな色がちょいちょい必要になったのでサクッと作ろうとおもった。&lt;/p&gt;

&lt;p&gt;最近 unpkg.com という CDN を知って、ここでは npm に登録されているパッケージとバージョンを指定するとファイルが配信されるようになっている。面白いのが &lt;code&gt;?module&lt;/code&gt; を付けると ES modules に対応したかたちにトランスパイルされて送られてくるところ。&lt;/p&gt;

&lt;p&gt;例えば &lt;a href="https://unpkg.com/@angular/router@4.3.5/@angular/router.es5.js?module"&gt;https://unpkg.com/@angular/router@4.3.5/@angular/router.es5.js?module&lt;/a&gt; だと&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// ...&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;BehaviorSubject&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://unpkg.com/rxjs@^5.0.1/BehaviorSubject?module&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Subject&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://unpkg.com/rxjs@^5.0.1/Subject?module&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://unpkg.com/rxjs@^5.0.1/observable/from?module&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://unpkg.com/rxjs@^5.0.1/observable/of?module&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;concatMap&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://unpkg.com/rxjs@^5.0.1/operator/concatMap?module&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;every&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://unpkg.com/rxjs@^5.0.1/operator/every?module&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="c1"&gt;// ...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;というような感じで &lt;code&gt;import&lt;/code&gt; 句のあとも &lt;code&gt;unpkg.com&lt;/code&gt; にリライトされている。これを使って、手元でビルドせずにアプリを作ってみようとしたのだが、CommonJS で依存が書かれていると解決できないようで、自分好みのミニマルなライブラリは使えなかった。残念。&lt;/p&gt;

&lt;p&gt;そこで、どうしようか迷った結果 &lt;code&gt;preact-cli&lt;/code&gt; でパパッと雛形を作ってパパッと Netlify にデプロイした。&lt;/p&gt;

&lt;p&gt;特に大層なことはしてなくて、素直に JS と CSS だけ書いたら形になるし便利な時代になった。&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>preact</category>
    </item>
    <item>
      <title>2017年振り返り</title>
      <dc:creator>Takaya Kobayashi</dc:creator>
      <pubDate>Sun, 24 Dec 2017 04:31:40 +0000</pubDate>
      <link>https://dev.to/jgs/2017-40e3</link>
      <guid>https://dev.to/jgs/2017-40e3</guid>
      <description>&lt;p&gt;以前の職場の同僚に &lt;a href="http://commits.top/japan.html" rel="noopener noreferrer"&gt;Most active GitHub users in Japan&lt;/a&gt; でランクインしてるよって教えてもらって、これを書いている時点(2017/12/21)で96位とのこと。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fpzapxqu6u1ag7gg6porb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fpzapxqu6u1ag7gg6porb.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;GitHub の設定で Private Repository もカウントするようにしておいたお陰かもしれない。年末なので、今年何をコミットしてきたかを Public Repository の形跡を基にざっと振り返る。&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://github.com/e-jigsaw/babylon-sandbox" rel="noopener noreferrer"&gt;e-jigsaw/babylon-sandbox&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;ちょうど昨年末から年初にかけて自由研究で &lt;a href="https://www.babylonjs.com/" rel="noopener noreferrer"&gt;BabylonJS&lt;/a&gt; を触っていた。この頃はまだ &lt;a href="https://yarnpkg.com" rel="noopener noreferrer"&gt;Yarn&lt;/a&gt; を使っていたようなので &lt;a href="https://nodejs.org" rel="noopener noreferrer"&gt;Node.js&lt;/a&gt; は v7 だったっぽい。BabylonJS 自体は結構難しかった。&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://github.com/e-jigsaw/webpack-chunkhash-sample" rel="noopener noreferrer"&gt;e-jigsaw/webpack-chunkhash-sample&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://webpack.js.org/" rel="noopener noreferrer"&gt;Webpack&lt;/a&gt; の2系が出て、&lt;code&gt;webpack.config.js&lt;/code&gt; を試し書きしたりしていた。その際 chunkhash の設定で成果物がどう生成されるかを調べていたみたい。&lt;/p&gt;

&lt;p&gt;余談だけど、この年末にかけて &lt;a href="https://parceljs.org/" rel="noopener noreferrer"&gt;📦 Parcel&lt;/a&gt; や &lt;a href="https://github.com/developit/microbundle" rel="noopener noreferrer"&gt;microbundle&lt;/a&gt; など Webpack 疲れした人々がオルタナティブを作っているようで、Webpack が統一したかと思われていたバンドラ戦国時代はまた戦乱の日々に向かっていくのかもしれない。何度通った轍なんだ...。&lt;/p&gt;

&lt;p&gt;個人的には npm が ES modules の CDN みたいな感じになってイイ感じに ES modules で読めるようになると嬉しいかもな〜。&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://github.com/e-jigsaw/react-redux-immutable-sample" rel="noopener noreferrer"&gt;e-jigsaw/react-redux-immutable-sample: react redux immutable sample&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;仕事で &lt;a href="https://redux.js.org/" rel="noopener noreferrer"&gt;redux&lt;/a&gt; を使っていたが、イロイロ割れ窓を作ってしまった結果大変残念な仕上がりになってしまった経験を踏まえて、reducer が常に &lt;a href="https://facebook.github.io/immutable-js/" rel="noopener noreferrer"&gt;immutable&lt;/a&gt; の Record を返すようにすれば見通しが良くなるのでは...?と試行していた。結果的には不採用。&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://github.com/e-jigsaw/firebase-cloud-functions-sandbox" rel="noopener noreferrer"&gt;e-jigsaw/firebase-cloud-functions-sandbox: firebase cloud functions sandbox&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://firebase.google.com" rel="noopener noreferrer"&gt;Firebase&lt;/a&gt; の Cloud Functions を試していた。&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://github.com/e-jigsaw/aws-code-build-sample" rel="noopener noreferrer"&gt;e-jigsaw/aws-code-build-sample: aws code build sample&lt;/a&gt;, &lt;a href="https://github.com/e-jigsaw/circleci-2.0-sandbox" rel="noopener noreferrer"&gt;e-jigsaw/circleci-2.0-sandbox: circleci 2.0 sandbox&lt;/a&gt;, &lt;a href="https://github.com/e-jigsaw/codefresh-sandbox" rel="noopener noreferrer"&gt;e-jigsaw/codefresh-sandbox&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;この辺は中身があまりないのだけれど、会社でビルド環境を検証していて AWS の Code Build や CircleCI 2.0, Codefresh を試行した。結果的にはインフラチームが自前 Drone 環境を作ってくれたのでそこへ移行していった。ただ、使う分には良かったが運用はとてもつらそうだったので微妙だったかも。&lt;/p&gt;

&lt;p&gt;それまでは Docker Hub を使っていたり、GCP の Container Builder を使ったりしていた。CI 自体は Wercker で。そういえば、Wercker が Oracle に買収されたのも今年だったか。&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://github.com/e-jigsaw/json-refs-with-yaml-sandbox" rel="noopener noreferrer"&gt;e-jigsaw/json-refs-with-yaml-sandbox: json refs with yaml sandbox&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;仕事のプロジェクトでコンテナをフル活用していて、1つのリポジトリで用途に応じてコンテナを分けて使っていた。また、1リポジトリ内に関係する複数のプロジェクトをまとめて運用していたので&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.
|--project
   |--A
      |--docker-compose.yml
   |--B
      |--docker-compose.yml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;というように1リポジトリに複数 &lt;code&gt;docker-compose.yml&lt;/code&gt; が存在している。&lt;/p&gt;

&lt;p&gt;さらに、コンテナの tag と git の commit hash を揃えるようにして、&lt;code&gt;docker-compose.yml&lt;/code&gt; では commit hash まで指定するようにしていたため、コンテナのバージョンアップをすると関係する &lt;code&gt;docker-compose.yml&lt;/code&gt; を手でまとめて更新しないといけなくて、大変だった。&lt;/p&gt;

&lt;p&gt;これを解決するために yaml から yaml を生成する簡単なスクリプトを書いた。yaml から yaml にする途中で &lt;a href="https://github.com/whitlockjc/json-refs" rel="noopener noreferrer"&gt;json-refs&lt;/a&gt; をカマして &lt;code&gt;$ref&lt;/code&gt; などでファイルを分割できるようにした。また、簡易な正規表現で &lt;code&gt;{{FOO}}&lt;/code&gt; のような handlebars っぽいプレースホルダを書くと指定した値に書き換えるようにして、&lt;code&gt;container-name:{{CONTAINER_REVISION}}&lt;/code&gt; とコンテナのリビジョンをまとめて更新できるようにした。&lt;/p&gt;

&lt;p&gt;他にも &lt;code&gt;wercker.yml&lt;/code&gt; や &lt;code&gt;drone.yml&lt;/code&gt; などのファイルも管理下に入れていった。&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://github.com/e-jigsaw/esa2ieyasu" rel="noopener noreferrer"&gt;e-jigsaw/esa2ieyasu: esa -&amp;gt; ieyasu Chrome Extension&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;仕事で esa に日報をつけていて、ieyasu という勤怠ツールで勤怠の記録をつけないといけなかったので ieyasu の入力画面でポチッとすると自動的に値が埋まるようにするツールを作った。&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://github.com/e-jigsaw/spa-2017-sandbox" rel="noopener noreferrer"&gt;e-jigsaw/spa-2017-sandbox: SPA 2017 sandbox&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;プロジェクトの構成をリライトするために、どういう構成がいいかを試していた。View は React.js で、ステートマネージャーをどうするかを基本的に試行していた。この時点ではストアを Immutable.js の Record を使って、Redux の middleware を使って動的に reducer を書き換えてページによって必要な reducer を追加していくようにして各ページをスリムにできるようにした。また、コンポーネントも動的にダウンロードできるようにしたりした。&lt;/p&gt;

&lt;p&gt;というような感じで Redux にいろいろ手を加えてがんばったけど、不採用にした。&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://github.com/e-jigsaw/image-size-sandbox" rel="noopener noreferrer"&gt;e-jigsaw/image-size-sandbox: image-size sandbox&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;どういう要件だったか忘れたけど仕事で SVG のサイズを計算して SVG 自体に埋めないといけなかったので &lt;a href="https://github.com/image-size/image-size" rel="noopener noreferrer"&gt;image-size&lt;/a&gt; というライブラリを試した。&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://github.com/e-jigsaw/lerna-sandbox" rel="noopener noreferrer"&gt;e-jigsaw/lerna-sandbox: lerna sandbox&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;プロジェクトの構造を &lt;a href="https://github.com/lerna/lerna" rel="noopener noreferrer"&gt;lerna&lt;/a&gt; に寄せると便利かな？とおもって試したけど、OSS のプロジェクトほど恩恵が受けられなくて見送った。&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://github.com/e-jigsaw/preq" rel="noopener noreferrer"&gt;e-jigsaw/preq: Promised minimal requset&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/request/request" rel="noopener noreferrer"&gt;request&lt;/a&gt; を Promise でラップするだけのやつ。他にもありそう。&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://github.com/e-jigsaw/web" rel="noopener noreferrer"&gt;e-jigsaw/web: Web technology infomation&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Web まわりのことを書き記された記事などをスクラップしていたリポジトリだったが、6月を境に Scrapbox に本格的に移行してしまったので更新を終了。&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://github.com/e-jigsaw/es-modules-sandbox" rel="noopener noreferrer"&gt;e-jigsaw/es-modules-sandbox: ES modules sandbox&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Android Chrome にも ES modules が実装されたと聞いてどういうものかと試した。npm のパッケージ群がうまいことバンドルできるようになってほしいのと、ES modules の実装が他のブラウザではまだなのでそこかなあ。&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://github.com/e-jigsaw/vision-api-sandbox" rel="noopener noreferrer"&gt;e-jigsaw/vision-api-sandbox: Cloud Vision API sandbox&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;仕事とは関係なく GCP の Vision API を試す必要があったのでお試し。OCR としてはもう一つ、という印象。&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://github.com/e-jigsaw/heroku-sandbox" rel="noopener noreferrer"&gt;e-jigsaw/heroku-sandbox: heroku sandbox&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/zeit/next.js" rel="noopener noreferrer"&gt;Next.js&lt;/a&gt; と Heroku を組み合わせて Heroku の dx (主に Pipelines)を試そう！というリポジトリ。immutable なサーバ(BFF みたいな)だと Heroku と親和性が高くてとても便利だった。&lt;/p&gt;

&lt;p&gt;最近はサーバ側が必要ないタイプだったら Netlify、サーバ側で何らかが必要だったら Heroku かなあ〜っておもっている。&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://github.com/e-jigsaw/mobx-sandbox" rel="noopener noreferrer"&gt;e-jigsaw/mobx-sandbox: mobx sandbox&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;今年は Redux から MobX に完全に転向した。素の MobX でも十二分に React と相性が良くて便利だし、&lt;a href="https://github.com/mobxjs/mobx-state-tree" rel="noopener noreferrer"&gt;mobx-state-tree&lt;/a&gt; を採用すると、さらに気持ちよくドメインを書ける。&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://github.com/e-jigsaw/sb-scripts" rel="noopener noreferrer"&gt;e-jigsaw/sb-scripts: Scrapbox scripts&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Scrapbox に年のページを作ってインデックスとして使っていて、そのページをダッと書き出すスクリプト。&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://github.com/e-jigsaw/svge" rel="noopener noreferrer"&gt;e-jigsaw/svge: Online SVG Editor&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;mobx-state-tree をバックエンドにブラウザで使える SVG エディタをホビーで作ろうとした(まだ未完)&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://github.com/e-jigsaw/lpt2sb" rel="noopener noreferrer"&gt;e-jigsaw/lpt2sb: lpt rebirth&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;元々 &lt;a href="https://github.com/e-jigsaw/lpt" rel="noopener noreferrer"&gt;lpt&lt;/a&gt; (Last month Photo from Tumblr の略)というのを作っていて、これは先月リブログしたものを引っ張ってきて Google Photo につっこむというものだった。が、Google Photo に NSFW な画像が混入すると最悪 BAN されると聞いて日和って全部消したのだった。&lt;/p&gt;

&lt;p&gt;それから Scrapbox に出会って、sb なら許してくれそう(という雑な希望)を持って作り直した。最初は CLI でブラウザを開く仕様だったが、操作が煩雑だったので Electron でアプリを作ってコントロールできるようにした。&lt;/p&gt;




&lt;p&gt;というあたりが Public になってるコミット群だった。&lt;/p&gt;

&lt;p&gt;芝は&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F2k616ytyrqyrrvlh784d.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F2k616ytyrqyrrvlh784d.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;こんな感じ。ちょっと下半期は失速気味だったかも...?&lt;/p&gt;

&lt;p&gt;来年もガンバロー。&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
