詩と創作・思索のひろば

ドキドキギュンギュンダイアリーです!!!

Fork me on GitHub

Polymer エレメントの開発ツールと CI

https://blog.polymer-project.org/images/logos/p-logo.png

先日の Google I/O 2015 にあわせて Polymer 1.0 がリリースされました。めでたい。そこで表題のように、自分で Polymer エレメント(コンポーネント)を作るときの構成の話。

始めるにあたっては PolymerLabs/seed-element をベースにすると便利で、この中には以下のような標準的な構成が示されています。

web-component-tester

web-component-tester は Polymer エレメントをテストするためのツールで、テストを実行するだけじゃなく Mocha や Async.js など便利なライブラリをテストから利用できるようにしてくれます。Polymer が提供するコンポーネントのテストはこれに依存しているため、実質的な標準ツールと言ってよいでしょう。

wct コマンドで起動するとローカルでも Chrome、Firefox などを起動して、test 以下のテストをそれぞれのブラウザで実行できます。

f:id:motemen:20150601234654p:plain

iron-component-page

iron-component-page は Polymer エレメントのドキュメントを提供するためのコンポーネントで、body 下に以下のように要素を配置するだけでページの URL から対象のコンポーネントを検出して、それをロードし、API の詳細と、demo ディレクトリがあればデモへのリンクを表示します。Polymer Catalog のようなページがこれだけで作れて、一気にそれっぽさが増しますね。

<iron-component-page></iron-component-page>

この HTML ファイルは基本的にコンポーネントの .html の隣に index.html として置くようです。seed-element をベースにする場合は元からあって、編集する必要もない。

polyserve

上記のドキュメントに関して、bower で入手したコンポーネントや開発中のものをローカル環境で参照するに便利なのが polyserve です。Polymer プロジェクトのルートで以下のようにして起動すれば、bower でインストールしたコンポーネントを http://localhost:8080/components/{element-name} (デモならさらにその下の /demo/ )で参照できます。

polyserve [-p 8080]

seed-element の構成に従うと、プロジェクトルートに置いているコンポーネントの HTML {my-element}.html も、以下のような bower でインストールされる前提の相対 URL 指定で他のライブラリを読みこむことになります。

<link rel="import" href="../polymer/polymer.html">

このため普通のローカルサーバだと参照先がなくて挙動の確認がおこなえないのですが、polyserve はこの要素も /components/{my-element} 以下で配信してくれるので、依存のロードがうまいこといくようになっています。ここが、気が効いていて便利な点。エレメント名には bower.json が参照されます。

ドキュメントの公開

プロジェクトを GitHub にアップロードするのなら、ドキュメントも GitHub Pages を使いたいところです。先ほどの iron-component-page を使えば標準的な UI が提供されるので、それを使います。

polyserve が行うようなディレクトリ構成(みんな /components/ 以下)にするとすんなりいきますが、単純にやるのだと https://{user}.github.io/{element-name}/components/{element-name}/ といった URL での配信になってしまいます。公式のリポジトリには gp.sh ってスクリプトもあるんですが、これはトップページへのアクセスをコンポーネントのディレクトリにリダイレクトするようになっています。Polymer Catalog のように複数のエレメントを配信する場合はそれでいいのですが、1 つだけの場合ちょっと収まりが悪い。

そこで gh-pages ブランチの /index.html に <base href="..."> 要素を置くことで、https://{user}.github.io/{element-name}/ での配信を可能にします。

以上のスクリプトを実行すると components 以下に主役のコンポーネントとその依存をフラットに配置した上で、上記のように細工したドキュメントの index.html を最上位に置いたディレクトリを gh-pages という名前で生成します。この内容を gh-pages ブランチとして push するといい感じになると思います。

vulcanize、polybuild

これで Polymer エレメントを使用したドキュメントページが配信できたわけですが、<link rel="import"> によるインポートは再帰的に行われ、またそのためにネットワーク通信が発生するので結構遅い。これを解決するために、依存するコンポーネントを一枚の HTML にまとめる vulcanize というツールを使うことができます。

vulcanize my-element.html > my-element.build.html

これで HTML も CSS も JavaScript も全部まとまるんですが、まあ全部まとまってもらっても困る(Content-Security-Policy とか)。現在は内部で vulcanize を利用した polybuild があるので、これを使うのがよいということになりそうです(ヘルプがなかったりと、ツールとしての成熟度にはまだ余地がありそう)。

polybuild index.html # index.build.html と index.build.js を生成する

ちなみに Polymer エレメントの自作に関しては以下のビデオを見ると感覚がつかめると思います。0.8 のころの話だけど、大枠は一緒です。

CI

もちろん公開して使ってもらうものであればテストは CI に載せたいし、ドキュメントもウェブでアクセスできるのがいいでしょう。その自動化に今回は Wercker を使います。

Wercker(同僚によると「ウェッキャー」)はいわゆる CI as a Service で、最近 Docker イメージをビルド環境に指定できるようになったらしい。ご無沙汰だったので使ってみました。まあこれはただ使いたかっただけなので、他のサービスでも問題なく応用できると思います。

Wercker でのテスト

wct を使うにはブラウザが必要(ほんとは Sauce Labs も使えるけど、今回はやらなかった)なので、そのための Dockerfile を書きました。motemen/nodejs-java-browsers これは以下がインストールされていて、xvfb-run wct とすればブラウザを起動してテストが行える環境になっています。

  • xvfb
  • chrome
  • firefox
  • nodejs
  • java
  • git

wercker.yaml の当該部分は以下のとおり。

box: motemen/nodejs-java-browsers
build:
  steps:
    - npm-install
    - script:
        name: bower install
        code: |
          ./node_modules/bower/bin/bower install --allow-root --config.interactive=false
    - script:
        name: npm test
        code: |
          xvfb-run npm test

Wercker でのデプロイ

Wercker では成果物を GitHub Pages に push するステップ(手順)が利用可能なので、これと先ほどのスクリプトを利用すれば簡単に GitHub Pages を更新できます。

deploy:
  steps:
    - script:
        name: generate gh-pages content
        code: |
          set -x

          url=$(git config remote.origin.url)
          url=${url%.git}

          name=$(basename $url)
          user=$(basename $(dirname $url))
          user=${user#*:}

          out=./gh-pages

          rm -rf $out
          mkdir -p $out

          cp -R bower_components $out/components

          git archive --prefix=components/$name/ HEAD | tar x -C $out

          git rev-parse HEAD > $out/GIT_REVISION

          cat $out/components/$name/index.html | sed "s:<head>:<head><base href='components/$name/'>:" > $out/index.html
    - lukevivier/gh-pages@0.2.1:
        token: $GITHUB_TOKEN
        basedir: gh-pages

asciidoctor-element

そういうわけでできたのが asciidoctor-element です。どうぞご利用ください(実装は marked-element の丸パクリなんで見るとこない)。

コマンドラインでカラーコードの計算・操作ができるツール

何かしら画面を作らなければいけないときには色のことを考える必要があって、たとえばこの色を少し暗くした色が欲しい! と思ったときに、素人としては頼れる方法を持っていないのが問題なのです。ウェブサイトであれば Scss なり Less なりの CSS プリプロセッサを使えばそういった要求に応える便利な機能が用意されているのであまり考える必要はないのだけれど、他の場面でも使える汎用的な道具が欲しかった。簡単に言うと darken(red, 10%) とか与えたら #rrggbb みたいな形式で表現してくれるやつです。

そこで書いたのがコレだ: motemen/node-less-calc

たぶん Functions | Less.js にある関数がすべて使えます……というので分かるとおり、Less の機能にそのまま乗っかっている非常にエコな実装。オマケで色だけでなく大きさの計算もできる。

% less-calc 'darken(red, 10%)'
#cc0000

% less-calc '1px+1px'
2px

npmjs.org にアップロードしていないので以下のようにしてインストールしてください。

% npm install -g motemen/node-less-calc

2015年のタスク管理

今年に入ってからタスク整理のしかたを考えなおして、とりあえず数ヶ月続けてみた結果、現時点で維持はできていて悪くはないと思ってるやり方をまとめておきます。

大方針: 「やりたいこと」と「やらなければいけないこと」を分ける

これまでは Remember The Milk なり Google Tasks なりに一元管理して、日々生じる外発的なタスク(あの人に声かけて、とか、文書を準備して、とか)と突然思いつく内発的なアイデア(こんなウェブサービス、ツールを作る、○○について調べる)を一カ所に投げ込んでいたのがよくなくて、もちろんツールの機能で分けることはしていたとはいえ、今ひとつ整理された見た目にならなくてだんだん足が遠のいてしまっていた問題があった。というかそもそも整理したくないというのもある。そこで今年はこれらのタスクやアイデアを二つの場所に分けて管理してみることにした。

  • やらなければならないこと、特に締切のあるものは Todoist
  • やりたいこと、やらなくてもいいこと、いつやってもいいことは Trello

という風に分けた。これで基本的には日中は Todoist を見ていて、やる気をだしたいときには Trello を見るという運用になった。

Todoist

ここはやらなければならないタスクを放りこむところ。Todoist はいわゆる TODO 管理サービスで、他の競合と較べたときの長所があるかどうかは知らないのだけれど、なかなか使い心地がよくて、今年のはじめから使い続けている。とうぜんスマートフォンアプリはあるのだけど、OSX アプリがある(Chrome アプリもある)のがよくて、ホットキーから即座にタスクを追加できるのが便利だった。

f:id:motemen:20150420202007p:plain

「締切」のところに「tom」と入力して明日、「mon」と入力して来週月曜日、というのをよく使ってる。また、「プロジェクト」というタスクを分類する機能があるけど、これ系は使いこなせないことがわかっているので、締切オンリーで運用している。また基本的に期限なしのタスクは入れない。

Trello

ここはやりたいことを溜めておくところ。Trello はカンバン式のタスク管理サービス。正直そんなに使いやすいとは思ってないのだけど、タスクの進行状況を一覧できて他サービスとの連携ができるサービスを他に知らないので、前からなんとなく使っていたこれをきちんと使ってみることにしてる。ボードは以下のように分けている。

  • Ideas … なんでもいいので思いついたことが入るところ。ウェブサービスやツールのアイデア、調べ物、おもしろツイートなど。
  • WIP … 着手しはじめた=プロジェクトのディレクトリを作った。
  • To Publish … だいたいできたのでブログに書く。
  • Done … ひと通りおわった。

この運用は去年からしていて、その成果が 【想定はてブ数つき】2014 年のボツネタを一挙公開!!! - 詩と創作・思索のひろば です。

メールは最高

一般的に敵視されがちな感じのあるメールだけど、自分の場合仕事のやりとりに使うわけではなくて、メールは通知の受信用なので、非常に便利だと思うようになった。

Inbox Zero

「Inbox Zero」のオリジナルがどこか知らないのでリンクできないし考え方も本当は知らないのだけど、この名前にしたがって、今年のはじめに受信箱のメールを全部アーカイブした。Gmail は検索でなんでもカバーできるのでそんなに心理的な負担もなく、スッキリしました。また、メールを既読にする際は何かしらのアクションを取る、というルールを設けた。たいてい何か返事をするとか、何もしなくてよいことを確認する、といった風になるけれど、ときどき少し重めであとで確認することにしたい、というものがある。そういう時に、スヌーズ機能のあるメーラが便利。

Mailbox

最近メーラーには Mailbox を使ってる。これが便利なのはメールをアーカイブするだけでなく、「スヌーズ」できる点で、受信箱からとりあえず消し去るけどまたあとで参照したい、というメールを「明日」とか「来週」まで受信箱から外しておくことができる。これで、だいたい一日の終わりには受信箱が空になっている状態にできている。空になるとご褒美画像が見られます。

f:id:motemen:20150420202220p:plain:h400

正直別に使いやすいと思ってはいなくて、Inbox by Gmail でも同じようなことができるし見た目も好きなんだけれど、OSX アプリがあるのが大きく、こちらを使っている。

タスクの追加

上に挙げたようにタスクを置く場所が 2 箇所になったのだけど、スマートフォンから追加するときには、素早く行えるよう IFTTT の Do Note を使っている。

使っているレシピは以下の 2 つ。

タスクを一覧する

前述のように Todoist/Trello とタスクを分けたのだけど、これら以外にも使っているサービスはあるので何かしら集約の手立てを考える必要がある。

Sunrise

Sunrise はカレンダーサービスで、いろいろなサービスと連携できる。これも OSX アプリがある(Chrome アプリもある)。Google カレンダーが表示できるのに加え、Todoist のタスクもカレンダーに表示できるので今日やること、今週やることなんて単位で把握するのに便利。使い出してすぐに Microsoft に買収された

Taco

Taco は TODO 集約サービス。Todoist、Trello だけにとどまらず多くのサービスのタスクを Taco 上で並べることができる(下も参照)。Taco 上で✓すると対応サービスでも完了状態にできるのが便利。このビューでも優先順位付けというかソートができるのだけど、二重管理になるのであまりやっていない。Chrome の新しいタブを Taco にするっていう拡張があって、自然と TODO を目にすることになるのがよい。といいつつ最近は目が滑ってあんまり見てない。

その他の場所で管理されているタスク

Pocket

Pocket はあとで読むサービス。Android のインテントひとつで URL をメモっておくことができるのが便利。これも一種の TODO であるので Taco に表示しておきたいと思ったのだけど未対応だったので、秘密の URL で Pocket の未読を RSS 化できるサービスを作った(Taco はフィードには対応している)。

GitHub Issues

もうひとつ舞い込んでくるタスクは自分の GitHub プロジェクトへのプルリクエストやイシュー。これは把握しているつもりでも見落としてしまっていた問題があったのだけれど、Taco は自分にアサインされたイシューをひとつのタスクとして表示できるので、「GitHub の通知メールをアーカイブする際にはそのプルリクエストやイシューを自分にアサインする」というルールを自分に課すことで、ひとまずその案件については忘れることができた。何かやることを探すモードになったら Taco なり GitHub なりを見ればそのイシューに辿り着けるってわけだ。

以上

とくに

  • タスクのある場所を 2 つ用意する
  • Inbox Zero を目指す
    • スヌーズできるメーラを使う

というのを試してみて、結構気に入ってる。

まだまだ完全に満足はしていなくて、

  • Trello 的な使い方ができてもっとよいもの
  • Evernote のうまい使い方(連携サービスが多いのでうまく使えると楽しそう)

などなど、よりよい知見をお持ちの方は教えてください。

完訳 7つの習慣 人格主義の回復

完訳 7つの習慣 人格主義の回復

はてなで一緒に働きませんか?