Upstart と Unicorn と Rails
なんのひねりもありませーん
Upstart って便利だなーっ
description "Start the Unicorn. Run the Unicorn Workers for Rails Application" start on runlevel [2345] stop on runlevel [!2345] console owner env HOME=/home/vagrant env RBENV_ROOT=/home/vagrant/.rbenv env PATH="/home/vagrant/.rbenv/shims:/home/vagrant/.rbenv/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games" env RAILS_ENV=vagrant #setuid vagrant #setgid vagrant chdir /home/vagrant/var/current script exec sudo -u vagrant env PATH=$PATH $HOME/.rbenv/versions/1.9.3-p448/bin/bundle exec unicorn_rails -c config/appserver/vagrant_unicorn.rb -E $RAILS_ENV -p 5000 >> /tmp/upstart.log 2>&1 end script respawn limit 10 5
reload
$ sudo reload rails-unicorn
restart
$ sudo restart rails-unicorn
stop
$ sudo stop rails-unicorn
start
$ sudo start rails-unicorn
Python syntastic
始まりは突然
なんか最近、syntastic で pylint がいつの間にか有効になってて C0111, C0301, C0103 のメッセージがでまくる。
(記憶だと以前 postmkvirtualenv あたりに pylint インストールするように書いたのかな、しらんけど)
まぁあまり気にならなくてずっと放置気味だったんだけど、少し暇になったんで設定してみた。
let g:syntastic_python_pylint_args='-d C0111 -d C0301 -d C0103 -f parseable -r n -i y'
オプションあり過ぎるんだけど、コレで望む結果になったのでまぁいいや
おまけ flake8
flake8 はこれ
let g:syntastic_python_flake8_args='--ignore=E501'
備考
.pylintrc も書いたんだけど syntastic でエラーが出たのでやめた
Celeryのハマリポイント
はい、Celeryです。Celeryって本当によく使いますけど、本当に初見殺し多いですよね。今回はふとした気の迷いでそんなハマリポイントをいくつか羅列してみます。 (基本 django-celery を対象にしています)
ハマリポイント1 - MySQLがデッドロックして動作しなくなった
BlockerをMySQLにした時に起こります、公式ドキュメントにも書いてある有名なハマリポイント。
対策
- SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED をsession毎に発行
- my.confに書いてデフォルト設定
ハマリポイント2 - Task Resultsが消えない ##
いつもRabbitMQ、 RedisをBlockerにしてたんだけど、Databaseに変えた途端起こるハマリポイント。 CELERY_TASK_RESULT_EXPIRES設定しているのにおかしいなーとか思った人もいるはず。
対策
- celerybeatを起動しておく
- celery.task.backend_cleanup() をcronあたりで定期実行
- そもそも CELERY_IGNORE_RESULT で Task Resultを溜めない
ハマリポイント3 - 処理速度遅くね? ##
デフォルトだと遅いです。どれくらい遅いかは忘れたけど遅いです。
対策
- CELERY_DISABLE_RATE_LIMITS を設定
- CELERY_ANNOTATIONS = {'*': {'rate_limit': '2000/s'}} とかやっておく (OrderedDict)
- CELERYD_CONCURRENCY を増やす
- CELERYD_POOL を processes から 非同期ワーカー (gevent, eventletの癖を理解した上で) に変更してみる
ハマリポイント4 - エラー時にメールが飛ばないの... ##
エラーが起きてるのにCeleryがエラーメッセージを送ってくれない、死にたい。
対策
- CELERY_SEND_TASK_ERROR_EMAILS を設定
ハマりポイント5 - リトライ設定したいけど、項目多すぎてよくわからん。
対策
- CELERY_TASK_PUBLISH_RETRY_POLICY
ハマリポイント6 - max_retriesを設定しているのにリトライしない ##
対策
- task.retry() を呼んでください
ハマリポイント7 - 全ての回数のリトライ終了後に処理をかましたい ##
対策
- task.retry から celery.exceptions.MaxRetriesExceeded が投げられるのでそれを捕まえてください
ハマリポイント8 - Celeryのタイムアウト秒数を超えても、exceptionを投げてくれない
対策
- CELERYD_TASK_SOFT_TIME_LIMITを設定 CELERYD_TASK_TIME_LIMIT は使用しない
ハマリポイント9 - 非同期中、必要なデータがDatabaseにある筈なのにない
Database内の必要なデータがcommitされる前にtaskが起動されてしまってる事が多いです
これはCeleryが悪いわけじゃないですけど、同時接続数が多くなればまぁよくあります。
対策
- 愚直に非同期処理前にマニュアルでコミットを確定させる
- リトライを多めにとっておく, Countdownも指定しておく
最近、超忙しいのでここまでです。 TODO: 暇になったらまたかく
Sencha Touch 2 と CoffeeScript と Sass と Guardfile があーしてこーして
guardを使えば楽勝コンパイル作業
って、あたりまえでしょ!な話
$ gem install guard guard-coffeescript
インストール後、下記Guardfileをプロジェクトツリー直下に置く
require 'guard/guard' guard 'coffeescript' do watch %r{^app/.+\.coffee$} watch %r{^app.coffee$} end
監視してくれないなら下記を入れてみる
$ gem install rb-fsevent # OSXの場合 $ gem install rb-inotify # Linuxの場合 $ gem install rb-fchange # Windowsの場合
guard起動
$ guard
おまけ - Sass も一緒にコンパイルする
Sencha Commandおせーんだよ(汗) って人少なからずいると思うんですよね。 Sencha Command内で使用しているcompass configuration fileを指定してやれば動きます。
$ gem install guard-compass
インストール後、下記Guardfileをプロジェクトツリー直下に置く
require 'guard/guard' guard 'coffeescript' do watch %r{^app/.+\.coffee$} watch %r{^app.coffee$} end config = File.expand_path "../resources/sass/config.rb", __FILE__ path = File.expand_path '../', __FILE__ guard 'compass', :project_path => path, :configuration_file => config do watch %r{resources/.+\.scss} end
あとはguard起動してちゃんちゃん
参考
Cross-Origin Resource SharingなDecorator. Djangoだよ
小ネタ、さっき書いてたノリでココにも書く
■ Decorator
コード非公開
(下記のMiddleware番の39行目から46行目をコピペしてデコってね♡)
■ Middleware
* https://bitbucket.org/schinckel/django-ajax-helper/src/cadb1ff58863/ajax_helper/middleware.py
■ Nginx
* http://torufurukawa.blogspot.jp/2012/06/cors-nginx.html
■ 近況報告
* ばっくえんどエンジニア(死語)からふろんとえんどエンジニア(死語)にジョブチェンジ気味で軽く日和ってる気がするでもCoffeeScriptたのしいぜ(飽きたら死亡)
以上、釣りタイトルだしカスすぎ、死ね〜オレ
Travis CI と tox
Travis CI と tox
toxを使えば Travis-CI がくちゃくちゃ簡単らしいのでやってみた記録
もともとtox自体は使っていましたので、噂通りすぐにできました。
django-spine
django-subcommand
python-eco
tastypie-queryset-client
- .travis.yml
- tox.ini
- 実際にリクエストを飛ばすテストをしてるからか、知らないけどテストが通らなかった
fluent-plugin-gstore
有名ドコロはこんな風に書いてるみたい
ipython
pyramid
こんなところですかね。
ところでところでTravis-CIって定期実行できないのかな、よく知らない。有料からなのかな。