ikeikeikeike's unk blog.

http://github-awards.com/users/ikeikeikeike

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

日本語って難しい

URLにローマ字slugを付けたくなったので、地域名称からそれっぽいslugに変換した

MeCabとromajiを使用したとさ、チョー簡単。

require 'MeCab'
require 'romaji'

mecab = MeCab::Tagger.new '--node-format=%f[7] --eos-format='
Romaji.kana2romaji(mecab.parse '国分寺・立川・八王子').gsub('', '-')
# => "kokubunji-tachikawa-hachiouji"

一回しか使わないから、入れるのダルかった。

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たのしいぜ(飽きたら死亡)

* Railsで夜な夜なアプリつくってる、だいたい3ヶ月ぐらい経過。 個人レベルではけこう規模でかいかも
* Vimは偉大だな〜
* 早く今の作業終わらしてRailsの機能をDjangoでも使えるようにしたい。かも。逆もあり。かも。考えているだけかもしれん。
* そろそろred5勉強せなアカンかも
 

以上、釣りタイトルだしカスすぎ、死ね〜オレ

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って定期実行できないのかな、よく知らない。有料からなのかな。