今週は 30 分ごとのアラームを設定している。アラームがなるごとに立ち上がり、伸びや休みをとるようにしている。あまり同じ姿勢をとらないほうが良いと聞いたからだ。
今日は CDN の設定をした。日本にサーバーがあると、海外からのアクセスだと応答が悪いんだなあ。当たり前だけど。
あとは rev-hash で hash をつけるスクリプトを書いてみた。 webpack で [hash]
と書けばつけられるんだけど、その値を再利用したりするのに plugin が〜などを見て、もういいやって。
NPM の private package を CI で扱う方法を調べた。
通常 private package の場合は npm install
の際に npm login
しておく必要があるが、ほかにも方法がある。
The npm Blog — Deploying with npm private modules
authToken
を得る方法だ。npm login
が .npmrc
に出力する情報を取っておいて……という方法だ。これが公開の API なのか謎なのだけど、公式の blog にあるし良いのだろう。
.npmrc
は //registry.npmjs.org/:_authToken=${NPM_TOKEN}
を書き込んでおいても変数展開してくれる。そこまでやってくれるなら、環境変数を直接参照する仕様にしてくれるといいんだけど……。
ちなみに上記だけ分かればあとはどうとでもなると思うのだけど、 CircleCI にはそれに関連するドキュメントもある。https://circleci.com/docs/1.0/npm-private-module-dependency/ https://circleci.com/docs/1.0/npm-login/
bouzuya/mr-jums の history.back()
対応を進めている。途中までつくったあと、問題を見つけてしまい書き直している。 Command
にはユーザーの操作を表すものと内部で Handler
間の依頼のために使うものがあることを再認識した。あえてそれらを区別せず、同じところに突っ込んでいる。
会社で懇親会があった。『農家うたげ。』に行く。野菜を推している店だ。そこまで好きじゃない。同僚の結婚祝いがあった。ぼくのときが 2016 年末だった気がするので、あれからもう 1 年以上が経つのか……。
書き忘れていたので書いておく。『イノベーションのジレンマ』を読んだ。名前が売れているので、なんとなく目がついて読んでみたのだけど、個人的にはくだらないと感じた。大企業が破壊的イノベーションにより急速に成長する企業に負けないために……という意味でしか参考にならないし、全体的に結果論という印象を受けた。
bouzuya/blog.bouzuya.net を 3.3.4 にした。 package.json
の author
を直しただけ。ふと気づいたので。
bouzuya/cyclejs-history-driver 0.2.0 0.2.1 をつくった。 2017-03-05 のことだ。
経緯について書く。
先週は bouzuya/bath 2.0.1 や bouzuya/spa-town 0.1.2 をつくった。
bath は path template engine だ。 template と parameters から path をつくったり、template と path から parameters を取り出したりできる。
spa-town は router だ。各 route pattern に bath を使っている。 bath の活用例でもある。
それらをせっかくつくったので、何かに適用したくなった。ちょうどいい題材として bbn: blog.bouzuya.net の 4.x である bouzuya/mr-jums に適用しようとした。
mr-jums は 2016-12 から commit していないので、いろいろ依存関係が古くなっていた。 Cycle.js や webpack などだ。 Cycle.js のバージョンを上げたところ、 driver の仕様も変わってしまい、動かなくなった。
動かなくなったのが cyclejs-history-driver だ。 2016-08-27 につくったものだ。Cycle.js v7.0.0 (Cycle Diversity) への対応を試している。
Cycle Diversity は複数種類の stream library への対応をうたっている。だから diversity なのだろう。で、それらの違いを吸収するために library ごとに adapter をつくるようになっていた。
それが今回の Cycle Unified で動かなくなった。 Unified は ES Observable を使って変換しているらしい。ふーん。詳細は知らないが、 Driver の API が変わっている。う、うーん。何回 API 変えるつもりだよ……。
で、bouzuya/cyclejs-history-driver 0.2.1 ができた。経緯ここまで。
mr-jums に spa-town を組み込みたかっただけなのに……。
追記。書きそびれていた。 2017-02-21 から NPM にお金を払っているし、せっかくなので NPM に scoped package として公開した。@bouzuya/cyclejs-history-driver
2017-W09 をふりかえる。
いろいろ忘れていた。忘れないように確認しよう。
2017-02-27/2017-03-05
PureScript で何かをつくる代わりに bath の 2.0.1 をつくった。手をかけず、なかなか良いものができた。それをもとに spa-town 0.1.2 をつくった。良い調子だ。
せっかくつくったので、それらを mr-jums に組み込もうとしたら cyclejs-history-driver が……。このあたりはまた別で書く。
なかなかいい流れだ。なにかをつくったことが次のなにかにつながる感じ。 blog.bouzuya.net はこういう blog でありたい。
斑鳩。最高記録を 9 MISS に更新。欠かさず続けている。それもあって 10 MISS を切ってきた。 4 MISS 以下で目標達成だけど、ここからが厳しいだろう。
bouzuya/spa-town 0.1.0 0.1.1 0.1.2 をつくった。
spa-town は bouzuya/bath を基にしたシンプルなルーターだ。paramsFn
ごとに name
をつけた route pattern をつくっておき、複数の route pattern を並べて router にする。 router は path
に対応する name
と params
を返すようになっている。どれにも当てはまらないときは事前に設定された既定値を返す。
コード例は次のとおりだ。
import * as assert from 'assert'; import { result, route, router } from 'spa-town'; const router1 = router([ route('root#index', '/'), route('users#index', '/users'), route('users#index', '/users/'), route('users#show', '/users/{id}', { id: /^\w+$/ }), route('users#show', '/users/{id}/', { id: /^\w+$/ }) ], result('root#notfound', {})); assert.deepEqual(router1('/'), result('root#index', {})); assert.deepEqual(router1('/users'), result('users#index', {})); assert.deepEqual(router1('/users/'), result('users#index', {})); assert.deepEqual(router1('/users/123'), result('users#show', { id: '123' })); assert.deepEqual(router1('/users/123/'), result('users#show', { id: '123' })); assert.deepEqual(router1('/no-match'), result('root#notfound', {}));
bath の活用例になっている。一度は bath の examples/ に入れたのだけど、何かに使ってみたくなり、リポジトリを分けて npm package を公開した。
bath よりも実際のアプリケーションにありそうな形になっているはずだ。 path を解釈して、対応する name と params を返す。対応するものを選ぶあたりが routing ……と言っていいのかな。 router の範囲はさまざまだが、わりと小さい範囲に留めたつもりだ。
末尾 /
のために別の route
を用意しないといけないあたりは、最終的な利便性よりも学習性を採っている。ほかにも大文字小文字の区別や、 directory ごとの入れ子構造などを取りたい可能性もありそうだが、捨てている。 server-side を考えると method
も判定に含めたいかもしれない。
入れ子構造はわりと欲しい気がするのだけど、優先順位が複雑になりそうなので避けている。現状は単純な Array
なので上から順に見て、なければ default という単純な挙動だ。
上記のような要望やあるいは他の要望も、必要に応じて変更するかもしれないし、別物としてつくるかもしれない。これくらいならアプリケーションごとに実装しても良いとは思うので、無理にこれを使う必要はない。