CSS のカバレッジを計測する Clairvoyance というツールを作りました

タイトルの通り、CSSカバレッジを計測するツールを作りました。

github.com

これは何?

css に書かれたスタイルが html の中でどのくらい使われているのか計測できるツールです。

  • 使用頻度の多いスタイルを調べる(影響範囲が大きいので気をつける)
  • 未使用のスタイルを調べる(消したい)

ってのを調べるために作りました。

なんて読むの?

Clairvoyance は「クレアボヤンス」と読みます。 千里眼 という意味です。

PhantomJS を使っているので、超常現象っぽい名前にしてみました。厨二病乙。

インストール方法

npm でインストールできます。

$ npm install clairvoyance

phantomjs を使っているので、もしかしたら phantomjs のインストールが別途必要かも。

使い方

インストールすると clairvoyance というコマンドが使えるようになるので、 css と html のパスを渡します。

$ clairvoyance --css path/app.css --html path/index.html

これで coverage/css-coverage.json が生成されます。

HTML レポート

Clairvoyance はカバレッジデータを JSON で出力しかできないので、HTMLで見るためには clairvoyance-html を使います。

まず、 npm でインストールします。

$ npm install clairvoyance-html

あとはオプションで HTML レポートを指定します。

$ clairvoyance --css path/app.css --html path/index.html --reporter clairvoyance-html

すると、こんな感じでレポートが生成されます。

f:id:sinsoku:20160131172955p:plain

ファイル名をクリックすると、ソースコードを表示できます。

f:id:sinsoku:20160131173013p:plain


まだ直したいところは色々とあるけど、ひとまず自分が欲しい機能はできたのでブログに書きました。

Ruby で SSH 鍵を生成する方法

Rails で Web 上から SSH 鍵を生成したくなったけど、方法がなかなか見つからなかったから書いておく。備忘録。

コード

Gemfile に gem 'net-ssh' を追加して、↓みたいなモデルを作ればうまくできた。

class SslKey < ActiveRecord::Base
  belongs_to :user

  validates :user_id, presence: true
  validates :title, presence: true, uniqueness: { scope: :user }
  validates :private_key, presence: true
  validates :public_key, presence: true

  before_validation :generate_keys

  private

  def generate_keys
    key = OpenSSL::PKey::RSA.new 4096
    self.private_key = key.to_pem
    data = [key.to_blob].pack('m0')
    self.public_key = "#{key.ssh_type} #{data}"
  end
end

参考ページ

stackoverflow.com

Swift 2.2 の機能: 0011_付属型を許容するため、 typealias キーワードを associatedtype に置き換える

2日前にマージされていたので、紹介します。

github.com

概要

typealias キーワードは今のところ2種類の型の宣言に使われています:

  1. タイプエイリアス (既存の型の別名)
  2. 付属型 (プロトコルの一部として使われる型のプレースホルダー)

これらの2つの宣言は異なり、個別のキーワードを使うべきです。これにより違いが明確になり、付属型の使用に関するいくつかの混乱を軽減するだろう。

提案された新しいキーワードは associatedtype です。

protocol Prot {
    associatedtype Container : SequenceType
}
extension Prot {
    typealias Element = Container.Generator.Element
}

付属型を使うのが分かりやすくなりそう。
Swift 初心者なので、詳しく分からないけど(汗

Swift 2.2 の機能: 0001_外部引数名として(大部分の)キーワードを許容する

Swift と英語の勉強の一環として、 apple/swift-evolution の 2.2 を少し読んでみた。

英語苦手なんで、時間がとてもかかるよ・・・。

翻訳したファイル(途中)

the "omit needless words" heuristics のあたりの訳がよく分からなかった。


これからもコツコツと読んで、Swift と英語力を上げていきたい。
あと、変な訳があったら GitHub で Issue や Pull Request を頂けると嬉しいです。

Heroku で Sidekiq を使おうと思ったら Error fetching job: ERR max number of clients reached が出た話

Heroku で mperham/sidekiq を使おうと思ったら、 Error fetching job: ERR max number of clients reached が大量に出るようになってしまいました。

ログがいっぱいになり、Sidekiq.❨╯°□°❩╯︵┻━┻ したくなった。

エラーの原因

今回、 Heroku Redis の hobby-dev(Connection Limit: 20)を使っていました。 これの Limit を超えて接続していたのが原因でした。

接続数の計算方法

manuel.manuelles.nl

この記事がとても参考になりました。記事からの引用になりますが、 Sidekiq の接続数は下記の項目を考慮して算出する必要があります。

1. Sidekiq Client connection size
2. Sidekiq Server connection size
3. Sidekiq Server reserved connections (reserved for the Fetcher and Retrier)
4. Sidekiq concurrency size
5. Unicorn worker_process size
6. Heroku Web Dyno count
7. Heroku Worker count

The answer for all our problems could be described in the following sum:

max connections = (Heroku worker count * (concurrency + 2 reserved connections)) + (web dyno count * (client connection size * unicorn worker_process size))

おまけ

この問題の原因を調査中に、なぜか config/sidekiq.yml が読み込まれず、 concurrency が 25(default) になってしまう問題が起きました。
これは config/sidekiq.yml を↓のように書いていたのが原因でした。

concurrency: 8
test:
  db: <%= ENV['TEST_ENV_NUMBER'].to_i + 1 %>

正しくは wiki に記載のあるように、こんな感じで書きます。

---
:concurrency: 8
test:
  :db: <%= ENV['TEST_ENV_NUMBER'].to_i + 1 %>

fork 元のリポジトリを定期的に fetch して、自分のリポジトリに同期するシェルスクリプト

GitHub で fork したリポジトリで作業して、 fork 元に Pull Request を出すようなワークフローを使っている人向け。

特にお仕事とかで複数人で Pull Request を使うときに便利。

コード

下記のファイルを PATH の通った場所に置いて、作業ディレクトリで実行すれば良い。

#!/bin/sh

while :
do
  date
  git fetch -p --all
  CURRENT=`git rev-parse --abbrev-ref HEAD`
  if [ $CURRENT != 'master' ]
  then
    UPSTREAM_MASTER=`git rev-parse upstream/master`
    ORIGIN_MASTER=`git rev-parse origin/master`
    if [ $UPSTREAM_MASTER != $ORIGIN_MASTER ]
    then
      git branch -f master upstream/master
      git push origin master
    fi
  fi

  sleep 60
done

dateスクリプトが動いているか確認するだけの行なので、不要であれば消しても問題ないです。

git-fetch の -p オプションはリモートでブランチが削除されたら、ローカルの追跡ブランチも一緒に消してくれるオプションです。

使い方

私は ~/bin/polling_github を作っているので、こんな感じ。

$ cd ~/github/workdir
$ polling_github
2016115日 金曜日 195332秒 JST
Fetching origin
Fetching upstream

Git のエイリアスで引数を使う方法

備忘録。

参考ページ

rcmdnk.github.io

コード

例えば、先日のブログに書いた「Pull Request を簡単にチェックアウトするコマンド」をエイリアスにするとこんな感じ。

[alias]
  ft-pr = "!f(){ git fetch origin pull/$1/head:pr_$1;};f"