Pythonでジョブキューしてみる

2015-08-02
このエントリーをはてなブックマークに追加

PythonでジョブキューするといえばやっぱりCeleryがスタンダードなんだろうか。RQというシンプルなジョブキューライブラリもあるんですけど、今回はCeleryを動かしてみる。

インストールは簡単。

pip install Celery

バックエンドはRabbitMQかRedisで使うのが良さそうです。手元の環境にRedisが入っていたのでそのままRedisを使ってみます。

from celery import Celery

app = Celery('tasks', broker='redis://localhost:6379/0')

@app.task
def task(message):
    return "Hello {0}".format(message)

上記をjob.pyとして保存しておきます。で、このjob.pyをワーカーとして起動。このワーカーがデキューしてくれます。

$ celery -A job worker --loglevel=info

いろいろログを出力して起動してくれます。ワーカーの起動はいろいろオプションがあります。デーモンとして動かしたり並列で大量に立ち上げたり。非常に便利。

で、エンキューはもうインタラクティブシェルでもできます。

$ python
Python 3.4.2 (default, Oct 16 2014, 01:53:40)
[GCC 4.4.7 20120313 (Red Hat 4.4.7-4)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from job import task
>>> task.delay("World.")

エンキューもこれだけ。
で、エンキューするとさっき立ち上げたワーカーの方でデキューしてジョブを捌いてくれます。

succeeded in 0.0014186919997882796s: 'Hello World.'

こんな簡単にジョブキューの仕組みが作れるなんて。

Pythonでscikit-learnを使ってNon-negative Matrix Factorization

2015-06-16
このエントリーをはてなブックマークに追加

Non-negative Matrix Factorization(NMFでググるといろいろ出てきます)、非負値行列因子分解です。

集合知プログラミング でも紹介されている特徴を抽出する方法です。推薦エンジンとかにも使われているそうです。

書籍では自前で実装されてますがscikit-learnに同じものがあるので便利に利用させていただきます。

import numpy as np
from sklearn.decomposition import ProjectedGradientNMF


def main():

    X = np.array([
        [1, 0, 0],
        [1, 1, 0],
        [0, 1, 0],
        [0, 1, 0],
        [0, 0, 1],
    ])

    model = ProjectedGradientNMF(init='nndsvdar')
    _res = model.fit_transform(X)
    print(_res)

if __name__ == "__main__":
    main()

実行するとこんな感じで出力されます。

$ python nfm.py
[[ -0.00000000e+00   9.15822497e-01  -0.00000000e+00]
 [  6.85467400e-01   9.15816894e-01  -0.00000000e+00]
 [  6.85636205e-01   2.24117374e-09  -0.00000000e+00]
 [  6.85636205e-01   2.24116561e-09  -0.00000000e+00]
 [ -0.00000000e+00  -0.00000000e+00   9.99944486e-01]]

素晴らしい。

サンプルデータをちゃんと投入すればもうちょっとまともな値がでてきます。パラメータの与え方はちゃんと検証して調整しないとです。

動かした環境はPython3.4で、

$ pip freeze
numpy==1.9.2
scikit-learn==0.16.1
scipy==0.15.1

Python便利。

Tornadoをデバッグモード、オートリロードで稼働させる

2015-05-24
このエントリーをはてなブックマークに追加

tornado

Wikipediaにも「Pythonで書かれたスケーラブルでノンブロッキングなWebサーバ、Webフレームワーク」と書かれたTornadoのデバッグモードをオンにしてファイルの変更を検知してリロードしてくれるようにするやり方。

import tornado.ioloop
import tornado.web


class MainHandler(tornado.web.RequestHandler):
    def get(self):
        self.write("Hello, world")

application = tornado.web.Application(
    [
        (r"/", MainHandler),
    ],
    debug=True
)

if __name__ == "__main__":
    application.listen(8888)
    tornado.ioloop.IOLoop.instance().start()

ほとんどサンプルのまんまです。

debug=True だけでオートリロードもしてくれます。簡単。これだとデバッグモード切り替えで都度コードの書き換えが必要になるのでコマンドライン引数で振る舞い変えるようにしたほうがいいでしょうね。

TornadoはPython3.2以降にも対応してるので安心です。

PythonでunixタイムスタンプをDatetimeオブジェクトに変換する

2015-05-22
このエントリーをはてなブックマークに追加
from datetime import datetime
print(datetime.fromtimestamp(1432049226))

これだけ。

MacでローカルのMySQL5.6にPython3.4で接続する際にlibmysqlclient.18.dylibが無いとエラーが出た

2015-05-10
このエントリーをはてなブックマークに追加

mysqlclient使って

import MySQLdb

しただけで

Library not loaded: libmysqlclient.18.dylib

ってエラー吐いたんだけどlibmysqlclient.18.dylibは

/usr/local/mysql-5.6.16-osx10.7-x86_64/lib/libmysqlclient.18.dylib

にありました。なので、

sudo ln -s /usr/local/mysql-5.6.16-osx10.7-x86_64/lib/libmysqlclient.18.dylib /usr/lib/libmysqlclient.18.dylib

シンボリックリンク張って無事に繋がるようになりました。

久々にローカルで作業するとつまんないことで躓く。。。

iOS Developer Programを更新した

2015-02-19
このエントリーをはてなブックマークに追加

ios-developer-program

まあライセンスを更新しただけなんですけど、円安と消費税率アップのお陰で去年の1.5倍位になっててビビった。去年は8,400円だったろうに。。。

もう何年も個人でアプリ出せてないし、今年は更新するのやめておこうかなーと思ってたんですけど、出しておきたいアプリが一本あって、コアになる部分は書き上がってるので勿体無いなぁと。

ということで、今年こそ数年ぶりのアプリをリリースします!

これ毎年言ってる気がする。。。

ハルロックを読んで電子工作に興味津々になった

2015-02-08
このエントリーをはてなブックマークに追加

もうタイトルのまんまなんですけど、特に2巻と3巻(まだ3巻までしか出てません)。猫ツイッターとかすごい面白そう。

や っ て み た い つ く っ て み た い 。

なに作るか全然プランはないし電子工作なんてやったことないから最初っから難しいのなんて作れないだろう。

まあ、最初は平日の朝、家から一定の距離離れたら青葉がメンションくれるツールでも作るかな。(それ工作しなくてもいいよねとか聞こえない。)

aoba

Python3で並列処理してみた

2015-01-28
このエントリーをはてなブックマークに追加

Python3っていうか、3.3以降です。

from concurrent.futures import ProcessPoolExecutor
import time


def work(job):
	time.sleep(job)
	print(job)

def main():
	_jobs = [5, 1, 2]
	_e = ProcessPoolExecutor(max_workers=2)
	for _j in _jobs:
		_e.submit(work, _j)

if __name__ == '__main__':
	main()

簡単なサンプルなんですけど、ワーカー2つ作って並列にworkというメソッドを実行してくれます。
実行すると

$ python sample.py
1
2
5

こんな感じに出力されます。5,1,2って順番で処理投げ込んでるのに1,2,5の順番で終わってます。

Pythonでmultiprocessingを使って並列処理 で書いたサンプルも簡単でしたけど、ProcessPoolExecutor使うともっと簡単です。

ProcessPoolExecutor使って4並列で走るツール書いて実行したらこんな感じになりました。
ProcessPoolExecutor
これはいい。

Python3でGZipされたログファイルを読み込む

2014-12-25
このエントリーをはてなブックマークに追加

ApachetとかNginxのログは圧縮して保存してケースが多いんですけど、それを読むときにいちいち解凍してるのもめんどくさいのでgzipのまんま読んでみるサンプル。

import gzip


def main():

    _f = gzip.open('/path/to/logfile.gz', 'rb')
    _line = _f.readline()

    while _line:
        _text = _line.decode('utf-8')
        print(_text)
        _line = _f.readline()

    _f.close()


if __name__ = '__main__':
    main()

ファイルを読み込むだけだと文字列はなくてバイト配列なのでそれをデコードしてます。テキストファイルを読み込む時となんら変わりはないのですが、デコードが必要なのでそれを忘れるとあれ?ってなってしまうので要注意。

最初.split(‘\t’)ができなくてあれ?ってなりました。

Python3.4で動かしたコードですけど、2.7でも動くはずです。

2015.01.28 追記

    _f = gzip.open('/path/to/logfile.gz', 'rt')
    _line = _f.readline()

    while _line:
        print(_line)
        _line = _f.readline()

ファイル開くときにテキストモードで開けばもっとスマートです。@yosida95 に教えてもらいました。感謝!

最新のFFmpegをソースからインストールする

2014-11-28
このエントリーをはてなブックマークに追加

スマフォで撮った動画をアップしてブラウザで表示させたい!っていう要望があったとしたら今どきならmpeg4とoggに変換しておいてvideoタグで表示させてやるのが手っ取り早いかと。「YouTubeAPI叩いてアップすりゃいいじゃん」とか聞こえない。

動画を変換するならFFmpegが便利なんですけど、yumでインストールしようとすると0.6という非常に古いバージョンをインストールしようとします(’14.11.27現在)ので、ここはソースからインストールしようと。

sudo rpm -Uhv http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm

sudo yum install yasm-devel yasm
sudo yum install libogg libogg-devel
sudo yum install faac faac-devel
sudo yum install xvidcore xvidcore-devel zlib-devel zlib
sudo yum install libvorbis libvorbis-devel
sudo yum install libtheora libtheora-devel

git clone git://git.videolan.org/x264.git

cd x264
sudo ./configure –enable-shared
sudo make
sudo make install

sudo git clone git://source.ffmpeg.org/ffmpeg.git ffmpeg
cd ffmpeg
sudo ./configure –enable-gpl –enable-version3 –enable-nonfree –enable-shared –enable-libfaac –enable-libx264 –enable-libtheora –enable-libvorbis
sudo make
sudo make install

vi /etc/ld.so.conf
/usr/local/lib

sudo ldconfig

$ ffmpeg -version
ffmpeg version N-67254-g0c42f47 Copyright (c) 2000-2014 the FFmpeg developers
built on Oct 30 2014 06:36:01 with gcc 4.4.7 (GCC) 20120313 (Red Hat 4.4.7-4)

ライブラリ、コーデックの類は依存関係がめんどくさいのでyumで。x264だけyumで入るバージョンが古かったのでgitから落としてきました。

スマートフォンから動画をアップしてブラウザで閲覧、っていうのであればmp4とoggがあれば足りるだろうということで最低限しかいれてません。これで足りてる、はず。IE8以下は知らない。

WebMってどうなったんだろ。

12/04追記、configureに–enable-libtheora –enable-libvorbis が足りなかったので追加。

Tags: