hi

pipのrequirements.txtを最新に保つ

  • requirements.txt にあるパッケージを常に最新に保ちたい
  • requirements.txt, requirements/dev.txt, requirements/prod.txt のように複数に別れていると、1度全部のパッケージをアップデートしてからそれぞれの .txt に書き出すことも面倒
  • リポジトリgithub か bitbucket にある

のようなときに https://requires.io/ を使います。

requires.io | Monitor your dependencies

登録してリポジトリを選択すると、下のような画面が表示されます。

f:id:wozozo:20141205173822p:plain

outdatedなパッケージがあれば Pull Request を送るかメールを送る設定もできます。 公開リポジトリで使うぶんには無料です。

関係ないですが、Gmailだと登録メールとかいろんなメールがSPAM判定されていたので届かない人はSPAMのとこ見ましょう。

pipsi = pip script installer

mitsuhiko/pipsi ってのがあります。

インストールすると実行ファイルが吐き出されるパッケージを、パッケージごとに virtualenv 環境を構築し分離する。システムの Python や各パッケージとは分離はされるけど、1箇所に PATH を通していれば分離されていることは何も考えず実行できます。

$ curl -O https://pypi.python.org/packages/source/v/virtualenv/virtualenv-1.9.1.tar.gz
$ tar -xvf virtualenv-1.9.1.tar.gz
$ cd virtualenv-1.9.1/
$ python setup.py install

$ curl https://raw.githubusercontent.com/mitsuhiko/pipsi/master/get-pipsi.py | python

$ export PATH=~/.local/bin:$PATH

例えば ansible をインストールすると、ansible コマンドその他もろもろが ~/.local/bin に入ります。

$ pipsi install ansible
......
......
......
Successfully installed ansible paramiko jinja2 PyYAML pycrypto ecdsa markupsafe
Cleaning up...
  Linked script /root/.local/bin/ansible-galaxy
  Linked script /root/.local/bin/ansible-doc
  Linked script /root/.local/bin/ansible-vault
  Linked script /root/.local/bin/ansible-pull
  Linked script /root/.local/bin/ansible
  Linked script /root/.local/bin/ansible-playbook
Done.

気をつける点としては、pipsi でインストール(管理)できるのは実行ファイルが存在すパッケージのみ。逆に言うと実行ファイルが無いパッケージは一切インストールできません。

$ pipsi install requests
New python executable in /root/.local/venvs/requests/bin/python
Installing setuptools............done.
Installing pip...............done.
Downloading/unpacking requests
  Downloading requests-2.3.0.tar.gz (429kB): 429kB downloaded
  Running setup.py egg_info for package requests

Installing collected packages: requests
  Running setup.py install for requests

Successfully installed requests
Cleaning up...
Did not find any scripts.  Uninstalling.

当然、中身は virtualenv なので pipsi 経由でインストールしたパッケージ同士であろうと import しあうことはできません。

試してないけどたぶん Python3.4 とかでは動かない。

libsass and SassC

最近知ったんだけど、Sass を C++ で実装している libsass と SassC っていうプロジェクトがあるんですね。作者はオリジナルの Sass と同じ人?

なんで Ruby じゃなくてわざわざ C++ かというと、sass ファイルが肥大化してきたり、 Compass なんかのフレームワークをゴリゴリ使っているとコンパイルに結構な時間がかかってくる問題があって、まぁ遅いんです。CSS を書くために良い CPU 積んだマシンとか買いたくないですし。そこで libsass 書いてますって話になります。

Sassc and Bourbon: it works. - Damian Le Nouaille

手元に良いサンプルがないのでここに書かれているのを参考にしますが、

I have a project (more than 5000 lines of sass) that was using Compass but it became very slow at compilation: 6 secs. I decided to stop using Compass and just go with Bourbon. This was the first big win. From 6 secs to 2 secs.

まず、Compass を使って書かれた 5000 行ぐらいの sass を Bourbon を使って書き直したらコンパイル時間が6秒から2秒になった。

Compass が大きいのか Bourbon が小さいのか、まあたぶん前者かなと思います。

そして本題の sassc を使うと、

$ time sass src/css/core/main.scss # 1,51s user 0,28s system 81% cpu 2,188 total
$ time sassc src/css/core/main.scss # 0,07s user 0,02s system 34% cpu 0,244 total

Near 10x faster for my project: from 2200 ms to 250 ms guys. Wow.

この例だと、だいたい10倍ぐらい速くなりました。

まだ簡単に手元で使ってみただけで、おそらくユーザーもまだまだ少ないと思うので変なバグ踏んだらハマりそう。

ただしこれ、gem で入れた sass コマンドが import できる path とかは全く見てくれないので、Sass 用のライブラリを使う場合は、

sassc -I vendor/bundle/ruby/1.9.1/gems/compass-0.12.2/frameworks/compass/stylesheets/ -t compressed assets/scss/app.scss

みたいに sassc コマンドのオプションに path を渡してやらないと使えません。ついでに、こっちは libsass の問題?な気がしますが、

@mixin filter-gradient($start-color, $end-color, $orientation: vertical) {
  @include has-layout;
  $gradient-type: if($orientation == vertical, 0, 1);
  @if $legacy-support-for-ie6 or $legacy-support-for-ie7 or $legacy-support-for-ie8 {
    filter: progid:DXImageTransform.Microsoft.gradient(gradientType=#{$gradient-type},
             startColorstr='#{ie-hex-str($start-color)}', endColorstr='#{ie-hex-str($end-color)}');
  }
}

の、 filter: progid:DXImageTransform.Microsoft.gradient みたいな IE 用の特殊な書き方があると

compass/stylesheets/compass/css3/_images.scss:87: error: error reading values after progid

って言われて落ちます。ここでも邪魔してくれる IE。この分岐文の中に入ってこなければ大丈夫かと思って $legacy-support-for-ie: false; にしてみてもダメだったので、現状 Compass と一緒に使う事はできなさそうです。Bourbon は Bourbon does not intend to support IE filters. と詠ってるので大丈夫なんでしょう。

さっきの記事のコメント欄に Bourbon の人が、 SassC 用の対応をしたバージョンをリリースしたよって書いてあって、Bourbon は結構フットワーク軽そうな感じがしてます。あんまり人気ないですけど。

このまま Sass と SassC の2つに別れるんじゃなく、上手に本体に取り込まれるといいなーと思います。

参考

pip-tools keeps your pinned dependencies fresh.

あれです。

べんりなやつです。

pip でモジュールは入れたけど、新しいバージョン出てるのか調べるの面倒ですね。

pip install pip-tools すると、pip-reviewpip-dump の2つのコマンドが入ります。

↑こんなイメージ。

pip-review

pip-review は、インストール済みのモジュールの更新チェック・更新作業をすることができます。

引数を付けない場合は更新チェックだけ。

$ pip-review
Django==1.5.1 is available (you have 1.5b1)
Pillow==2.0.0 is available (you have 1.7.8)
South==0.8.1 is available (you have 0.7.6)
boto==2.9.5 is available (you have 2.6.0)
bpython==0.11 is available (you have 0.12)
distribute==0.6.45 is available (you have 0.6.27)
django-appconf==0.6 is available (you have 0.5)
django-braces==1.0.0 is available (you have 0.1.9)
django-compressor==1.3 is available (you have 1.2)
django-extensions==1.1.1 is available (you have 1.0.1)
mercurial==2.6 is available (you have 2.5.4)
virtualenv==1.9.1 is available (you have 1.7.2)
virtualenvwrapper==4.0 is available (you have 3.5)

--interactive オプションを付けると1個ずつ確認しながら、

$ pip-review --interactive
Django==1.5.1 is available (you have 1.5b1)
Upgrade now? [Y]es, [N]o, [A]ll, [Q]uit

--auto オプションなら全部一気に更新してくれます。

pip-dump

pip-dump はインストール済みのモジュールを requirements.txt に書き出す事ができます。ただこれだけだと pip freeze > requirements.txt するのと同じです。 こいつが便利なのは例えば、下の3つのモジュールがインストール済みだとして、

bpython==0.11
Django==1.5.1
Pillow==2.0.0

requirements.txt には Django と Pillow、dev-requirements.txt には bpython というふうに分けたい場合、 dev-requirements.txt には分けたいモジュール名だけを書き、それ以外は requirements.txt に書き出したいので touch しただけの空ファイルを置いておくと、以下のように dump してくれます。

$ touch requirements.txt
$ echo 'bpython' > dev-requirements.txt
$ pip-dump
$ cat requirements.txt
Django==1.5.1
Pillow==2.0.0
$ cat dev-requirements.txt
bpython==0.11

なんらかのアプリケーションつくってるときに環境ごとに微妙に入れるモジュールが違う場合なんかは便利だと思います。

dump したくないモジュールがある場合は、.pipignore に書いておくとうまいことしてくれます。

ちなみに作者は gitflow の人です。

参考

grunt watch 遅い

grunt-contrib-watch と grunt-contrib-compass を使って SCSS ファイルの更新を検知してコンパイルするという下に書いたみたいな task をしばらく使ってた。

module.exports = (grunt) ->
  grunt.initConfig
    pkg: grunt.file.readJSON 'package.json'
    watch:
      css:
        files: ['assets/scss/**/*.scss'],
        tasks: ['css']
    compass:
      dev:
        options:
          config: 'config.rb'

直接 compass watch してたときは気にならなかったけど、 grunt watch 経由に切り替えてから、SCSS を書き換えてすぐにブラウザをリロードすると、コンパイルがまだ終わっていないことが頻繁にある。 grunt が更新に気づいてから ruby に渡すまでのところが遅いみたいだけど、速い CPU のマシン使うぐらいしか解決策ないのかな。

>> File "assets/scss/app.scss" changed.
Running "sass:dev" (sass) task

Done, without errors.

Completed in 1.264s at Sat Apr 20 2013 00:22:14 GMT+0900 (JST) - Waiting...

遅いと言っても今のところ 平均 1.3 秒ぐらいなんだけど。

gifboomの質

誰かも書いてたけど、gifboom のあのコミュニティの質の低さなんなんだろう。質が低いって言葉は適切じゃないかもしれないけど、英語で喋りだすと急に性格変わる人みたいな雰囲気にてる気がする。

良い悪いの問題じゃなくて、コミュニケーションの道具がテキストからフレーム間引いたgifアニメになるだけであんなに質が変わるものなんだとおもった。

いや別に全然いいんですけどね。