bouzuya.hatenablog.com

ぼうずやのにっき

30 分タイマー

今週は 30 分ごとのアラームを設定している。アラームがなるごとに立ち上がり、伸びや休みをとるようにしている。あまり同じ姿勢をとらないほうが良いと聞いたからだ。

今日は CDN の設定をした。日本にサーバーがあると、海外からのアクセスだと応答が悪いんだなあ。当たり前だけど。

あとは rev-hash で hash をつけるスクリプトを書いてみた。 webpack で [hash] と書けばつけられるんだけど、その値を再利用したりするのに plugin が〜などを見て、もういいやって。

NPM の private package を CI で npm install する

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-jumshistory.back() 対応を進めている。途中までつくったあと、問題を見つけてしまい書き直している。 Command にはユーザーの操作を表すものと内部で Handler 間の依頼のために使うものがあることを再認識した。あえてそれらを区別せず、同じところに突っ込んでいる。


会社で懇親会があった。『農家うたげ。』に行く。野菜を推している店だ。そこまで好きじゃない。同僚の結婚祝いがあった。ぼくのときが 2016 年末だった気がするので、あれからもう 1 年以上が経つのか……。


書き忘れていたので書いておく。『イノベーションのジレンマ』を読んだ。名前が売れているので、なんとなく目がついて読んでみたのだけど、個人的にはくだらないと感じた。大企業が破壊的イノベーションにより急速に成長する企業に負けないために……という意味でしか参考にならないし、全体的に結果論という印象を受けた。


bouzuya/blog.bouzuya.net を 3.3.4 にした。 package.jsonauthor を直しただけ。ふと気づいたので。

bouzuya/cyclejs-history-driver 0.2.1 をつくった

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-W09 をふりかえる。

2017-03 の目標

  • ☐: 『型システム入門』を読む
  • ☑: 斑鳩を続ける
  • ☑: bath 2.0.0 をつくる
  • ☐: PureScript でなにかつくる

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 以下で目標達成だけど、ここからが厳しいだろう。

2017-W10 の目標

  • ☐: 毎日、週の目標を確認する
  • ☐: 毎日、斑鳩をする
  • ☐: cyclejs-history-driver のことを書く
  • ☐: ザ・ゲームのことを書く
  • ☐: 『イノベーションのジレンマ』のことを書く
  • ☐: mr-jums に bath 2.x を適用する
  • ☐: 斑鳩の動画を投稿する

bath をつかった router の bouzuya/spa-town 0.1.2 をつくった

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 に対応する nameparams を返すようになっている。どれにも当てはまらないときは事前に設定された既定値を返す。

コード例は次のとおりだ。

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 という単純な挙動だ。

上記のような要望やあるいは他の要望も、必要に応じて変更するかもしれないし、別物としてつくるかもしれない。これくらいならアプリケーションごとに実装しても良いとは思うので、無理にこれを使う必要はない。