読者です 読者をやめる 読者になる 読者になる

EnsekiTT Blog

EnsekiTTが書くブログです。

Pythonで受信したデータを複数プロセスに分配してみた話

Pythonで受信したデータを複数プロセスに分配してみた話

つまりなにしたの?

TCPで受信したデータを複数プロセスに分配してそれぞれで処理をする

Python3.6を対象にやってみた
https://docs.python.jp/3/library/multiprocessing.html

用意したもの

manage.py : プロセスの起動を行う
tcp_recv.py : TCPの受信用(サーバとして動作する)
process.py : TCPの内容が分配されて、この中で処理が実行される
tcp_send.py : TCPの送信用(クライアントとして動作する)
github.com
↑ぜんぶはこちら

続きを読む

DeepLearning界のHerokuと名高いFloydと遊んでみた話

つまりなにしたの?

Floyd Zero Setup Deep LearningというDeepLearningのサービスで自前のデータを使って学習できるようにした。

最初にやること

FloydにSignupする→メール認証まで通す
Floyd Zero Setup Deep Learning

環境を用意する

pyenv virtualenvでFloyd用の場所を作っておく。(ココは必須ではない)

pyenv install 3.5.2
pyenv virtualenv 3.5.2 floyd
mkdir floyd_env
cd floyd_env
pyenv local floyd

Floyd-cliをインストールする

$ pip install floyd-cli

Floyd loginすると

$ floyd login
Authentication token page will now open in your browser. Continue? [Y/n]:
Please paste the token here:
Login Successful

Floydが用意してくれた例で遊ぶ

f:id:ensekitt:20170509214438p:plain
動作確認できました。でも実行されたコードを良く見てみると、TensorFlowがよしなに揃えたデータセットだった。
データセットは手元にあるんだ!これをどうにかしたい!ってときのためにチュートリアルがこの記事の真の目的

続きを読む

GWにポモドーロテクニックを実践してみたらまるで生産性がなかった話

どうだったのか?

8時間働いても集中してる生産時間は3時間もないってことに気づいて本当に危機感を持った。

f:id:ensekitt:20170509080833j:plain*1

続きを読む

GWでノージョブ時間が長かったので、Heroku上のWebアプリからCeleryにジョブキューを投げた話

つまりなにしたの?

HerokuにホスティングしたFlaskウェブアプリから
Herokuに同じくホスティングしているCeleryにジョブキューを発行した。

(2dyno構成が必要になるので立ち上げっぱなしにするとHerokuの無料枠を半月で使い切るので注意)

できたもの

github.com
ここのHerokuボタンから実行できますが、2つ目のDynoは起動されないのでManageAppから立ち上げて上げる必要があります。
f:id:ensekitt:20170507141821p:plain

たまに動いているやつ。
JobQueue
(ログを見ないとキューが処理されていることが確認できない残念仕様)

続きを読む

PythonからCeleryにジョブをキューに突っ込んで実行した話

つまりなにしたの?

Pythonコマンドラインからジョブキューを発行した。
そして、これらをHerokuで動かす(よていやりました*1

環境:

Celery

Celeryは、分散されたメッセージ受け渡しよる非同期タスクキュー/ジョブキューで、リアルタイム操作に向けだけど、スケジューリングにも対応している便利なやつです。
僕は機械学習の学習フェーズなどの時間のかかるタスクを順番に実行したい場合に使っています。Cronでもいいけど、定期的に発行すると一定期間以上学習に時間がかかることがあると破綻するためです。
また、キュー方式だと溜まっているタスクを把握しやすいことも嬉しいことの一つです。

Flask

FlaskはPythonで記述されたマイクロフレームワークです。簡単なウェブアプリならさくっと作れます。(先日までTornadoを使ってましたがドキュメントのわかりやすさでFlaskに移り住みました。)

Heroku

Herokuはsalesforceの提供するPaaS(Platform as a Service)です。ほぼUbuntuのOSにRuby on railsをサポートするものでしたが、最近はいろんなプログラミング言語(今回はPython)を使うことができるようになっています。また、データベースもPostgreSQLにかぎらずRedisも使えます。今回はそんなPythonとRedisを活用します。

環境を整える。

Redisをインストールする
brew install redis
Celeryをインストールする

(virtualenv環境を用意することを推奨します)

pip install celery 
Flaskをインストールする

(virtualenv環境を用意することを推奨します)

pip install flask
ワーカーのコードを書く
from celery import Celery
import time
app = Celery('tasks', broker='redis://localhost:6379/0')

@app.task
def task(message):
    time.sleep(10) #時間のかかるタスクのフリをする
    return "Hello {0}".format(message) 

動かしてみる

Redisを起動する
redis-server /usr/local/etc/redis.conf
ワーカーを起動する
celery -A job worker --loglevel=info
キューを渡す
% python
Python 3.5.2 (default, Feb  4 2017, 18:33:41)
[GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.42.1)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from jobqueue import task
>>> task.delay("World.")
ワーカーを起動したコンソールでは
[2017-05-05 16:47:03,008: INFO/MainProcess] Received task: jobqueue.task[84a31de4-a00a-46b5-87e7-a631518f212d]
[2017-05-05 16:47:03,011: INFO/PoolWorker-4] Task jobqueue.task[84a31de4-a00a-46b5-87e7-a631518f212d] succeeded in 0.0006478669820353389s: 'Hello World.'

こんなんが表示されることが確認できる。

次回はHerokuで動かしてみます。

Curl でPOSTリクエストをした話

Flaskの練習をしていて、Viewを作る前にロジックを試したくなった。
PythonでPostリクエスト投げても良かったんだけど、curlで手軽に投げたいって思って調べた。

パラメータ付きのPOSTを行う

curl -w '%{http_code}\n' 'localhost:5001/' --data 'message=justdoit' -XPOST

パラメータ付きPOSTをURLエンコードして行う

curl -w '%{http_code}\n' 'localhost:5001/' --data-urlencode 'message={"properties": 10}' -XPOST

ファイルをアップロードする

curl -w '%{http_code}\n' 'localhost:5001/' -F "file=@sample.txt" -XPOST

Pythonでデーモンを召喚した話

デーモンってちゃんと説明するとなんだっけ?

と思ってWikipediaで調べてきた。
UNIXなどのマルチタスクオペレーティング・システムにおいてバックグラウンドプロセスとして動作するプログラムを意味する。ユーザが直接対話的に制御するプログラムではない。典型的なデーモンは名前の最後尾に”d”がつく。例えばSyslogdはシステムログを扱うデーモンだ。
UNIX系の環境では、デーモンの親プロセスはinitプロセスになっていることが多い。
デーモンは起動処理内でForkで子プロセスを作成し、親プロセスのほうが即座に終了するため、initが里親となる。更に、デーモンまたはOSは制御端末(tty)からの切り離しなどの処理も行う必要がある。こういったデーモンを生成するための手続きをUNIX系ではdaemon(3)などの便利なルーチンにまとめて実装していることが多い。

Pythonによるデーモンのサンプルスクリプト

import os
import sys
import time

def createDaemon():
    pid = os.fork()

    if pid > 0:
        f2 = open('/var/run/oredaemon.pid','w')
        f2.write(str(pid)+"\n")
        f2.close()        
        sys.exit()

    if pid == 0:
        i = 0
        while True:
            f = open('/home/ensekitt/testest.txt','a')
            f.write(str(i) + "\n")
            f.close()
            time.sleep(1)

            i += 1

if __name__ == '__main__':
    createDaemon()