Django-Celeryにスケジュールをセットして動くようにする@ローカル
monkeyjack人工植物草Imitation CeleryリーフグリーンFoliage Home Decor 0fc86a448d9ee0e32f6ad4b8bd12d311
- 出版社/メーカー: MonkeyJack
- メディア: ホーム&キッチン
- この商品を含むブログを見る
コメント
Celery(セロリ)のスケジューラーを使います
追記部分
#settings.py from datetime import timedelta CELERYBEAT_SCHEDULE = { 'add-every-300-seconds': { 'task': '<app名>.tasks.test_def', 'schedule': timedelta(seconds=300), 'args': (16, 16) }, } CELERY_TIMEZONE = 'Asia/Tokyo'
なんかどうも5分に1回の起動が最短ペースの模様。数秒に一回だとcelery側でエラーがでた。
つぎに走らせる関数
#<app名>.tasks.py @shared_task def test_def(): print("scheduler is fine!")
celery.beat.SchedulingError: Couldn't apply scheduled task add-every-300-seconds: test_def() takes 0 positional arguments but 2 were given
こうしていると、このエラーがでる。どうもスケジューラー経由の実行だと、たくさん規定の引数をぶちこむようだ。
なので、
↓
こうする。*args
をつけて可変長で引数を受け入れられるようにする。
#<app名>.tasks.py @shared_task def test_def(*args): print("scheduler is fine!")
これでよし。
Cerelyの起動もスケジューラー利用時は-Bオプションをつける
$ celery -A [proj名] worker -l info
↓
こうする
$ celery -A [proj名] worker -l info -B
これでうまく動いた!^^/
参考
アセンブラの基本文法のメモ
- 作者: 愛甲健二
- 出版社/メーカー: 技術評論社
- 発売日: 2013/08/22
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (12件) を見る
これ読んでいます。これで文法の基礎が勉強できる箇所がありましたので自分用にメモしておきます。
基礎知識
走り書きメモですみません。
Python(核心部分はCで実装)とかRuby(核心部分MRIはCで実装)とかJavaとか(高級言語)
↓
コンパイル
↓
バイトコード(中間コード)(より低級言語。パッと見アセンブラに似た感じ)→逆アセンブル→アセンブラコードを解読(可読)→バイトコードは逆コンパイルができる!ツールJad、JadClipse
↓
仮想機械(MV)上で実行(JavaだとJITコンパイラ(=Just in Time)が機械語ソースを動的に書き出す(イメージ?))
Cとか
↓
gccなどでコンパイル
↓
アセンブリソースができる
↓
アセンブラ
↓
機械語(バイナリ)→逆アセンブル→アセンブラコードを解読(可読,CTF頻出)
レジスタ
CPUのメモリ領域のこと スタックはメモリの扱われ方でデータがロケット鉛筆式に出入りするデータ型っぽいもの
EAX ECX EDX EBX ESP スタックの管理に使われる EBP スタックの管理に使われる ESI EDI EIP 現在のプロセスの管理に使われる
フラグ
C・・・Oまでで0と1の値がはいる。Fをつけてアセンブラ上で扱われることがある
C 0or1:CF P 0or1:PF A 0or1:AF Z 0or1:ZF S 0or1:SF T 0or1:TF D 0or1:DF O 0or1:OF
頻出文法
= MOV (move) += ADD (add) -= SUB (substract) ++ INC (increment) -- DEC (decrement) if == : else: CMP(compare) (ユーザー認証の比較ででるためCTFでキーになる可能性あり) if == : ZF=1 else: ZF=0 TEST(test) (ユーザー認証の比較ででるためCTFでキーになる可能性あり) if ZF==1 : else: JE (just exist?) if ZF==0 : Goto Func() JNE (just not exist?) Goto Func: JMP (jump) Func(): CALL
これでバイナリ解析が少しはできそうだ^^
勉強・引用・参考元の本と記事
- 作者: 愛甲健二
- 出版社/メーカー: 技術評論社
- 発売日: 2013/08/22
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (12件) を見る
RSA暗号解読問題を解く(後編)[CTF for Beginners 2018]"RSA is Power"
経緯
これの続き。
ちょっとだけ巻き戻しで、まず問題に与えられている数字は以下
N = 97139961312384239075080721131188244842051515305572003521287545456189235939577 E = 65537 C = 77361455127455996572404451221401510145575776233122006907198858022042920987316
前回、素因数分解パッケージのmsieveの計算パワーで、素因数のペアが、299681192390656691733849646142066664329と324144336644773773047359441106332937713になるということころまでわかりました。
さてその続き。
pycryptoを使う
インストールが必要
$ pip install pycrypto
これでよし。
さて計算。まずわかっている数を書く。
N = 97139961312384239075080721131188244842051515305572003521287545456189235939577 E = 65537 C = 77361455127455996572404451221401510145575776233122006907198858022042920987316 p = 299681192390656691733849646142066664329 q = 324144336644773773047359441106332937713
公開鍵から秘密鍵をつくる
#pycryptoをインポート from Crypto.PublicKey import RSA from Crypto import Random from Crypto.Util.number import * #inverse()を使う import Crypto.PublicKey.RSA as RSA >>> inverse(E,(p-1)*(q-1)) 88509020092584531671107468782943602124921999287671161687233461555074737950465 d = inverse(E,(p-1)*(q-1)) >>> d 88509020092584531671107468782943602124921999287671161687233461555074737950465 #秘密鍵
- pycryptoのinverse()について
inverse() 秘密鍵 = inverse([公開鍵にする数], [(p - 1) * (q - 1)])
inverseが何をしているかはこれを。 https://asecuritysite.com/encryption/inve?val1=17&val2=3120
秘密鍵で暗号化された文章を復号
rsa_key = RSA.construct((p*q, E, d)) #もちろんrsa_key = RSA.construct((N, E, d))でもOK >>> rsa_key <_RSAobj @0x10f7b06a0 n(256),e,d,p,q,u,private> >>> rsa_key.decrypt(C) 175721217420599820463601725034319415104774797848891230924248444157707646333 int = rsa_key.decrypt(C) >>> long_to_bytes(int) b'ctf4b{5imple_rs4_1s_3asy_f0r_u}'
解けた!!
- pycryptoのRSA.construct()について
RSA.construct RSA = RSA.construct(([モジュラとする数],[公開鍵にする数],[秘密鍵にする数]))
参考記事
Django-Celery-Redisのherokuへのデプロイメモ。
Heroku: Up and Running: Effortless Application Deployment and Scaling
- 作者: Neil Middleton,Richard Schneeman
- 出版社/メーカー: O'Reilly Media
- 発売日: 2013/11/24
- メディア: ペーパーバック
- クリック: 2回
- この商品を含むブログを見る
コメント
Django+Celeryで非同期処理ができるようになり、最終関門はherokuデプロイです。情報が少ないし公式ドキュメントだけだと(たぶん)エラーになり・・・ついにできました!その時のメモ。
手順1 Procfileに追加→Redis動かすワーカー起動を指示
Procfile
web: gunicorn [プロジェクト名].wsgi:application -b 0.0.0.0:$PORT worker: celery worker -A [プロジェクト名].celery -l INFO #↑この行が追加された #ローカルで必要だった、$celery -A [プロジェクト名] worker -l infoをherokuが勝手にやってくれるイメージです
手順2 heroku localで動くか動作確認
(どこでもOK)$redis-server #redis起動は同じく必要 (仮想環境)$heroku local
ここまではローカルのsettings.pyで動かしました。これでデプロイ下準備は完了。
手順3 heroku-redisアドオンを追加
$heroku addons:create heroku-redis:hobby-dev
手順4 アドオンが追加されたか確認
$ heroku redis:info === redis-xxxx-123456 (REDIS_URL) #仮の名前に変更してます Plan: Hobby Dev Status: available Created: 2018-06-15 13:19 UTC Version: 3.2.11 Timeout: 300 Maxmemory: noeviction Maintenance: not required Maintenance window: Thursdays 17:30 to 21:30 UTC Persistence: None HA Status: Unavailable
これはwebのherokuコンソールでも確認可能です。
手順5 Django用のheroku-redis接続パッケージをインストール
django-redis-cacheというモジュールが必要。公式ページに記載されてました。
pip install django-redis-cache pip freeze > requirements.txt
手順6 settings.pyのCelery設定をデプロイ先のheroku-redisに接続されるようにする
#settings.pyローカルで動いた参考例(引用です) BROKER_URL = 'redis://localhost' CELERY_RESULT_BACKEND = 'redis' CELERY_TASK_SERIALIZER = 'json' CELERY_RESULT_SERIALIZER = 'json' CELERY_ACCEPT_CONTENT = ['json']
引用元
↓こう変える
#↓ここから追記↓ import os CACHES = { "default": { "BACKEND": "redis_cache.RedisCache", "LOCATION": os.environ.get('REDIS_URL'), } } BROKER_URL = os.environ.get("REDIS_URL") CELERY_RESULT_BACKEND = os.environ.get("REDIS_URL") #↑ここまでが変更点↑ #BROKER_URL = 'redis://localhost' #localのときだけ #CELERY_RESULT_BACKEND = 'redis' #localのときだけ CELERY_TASK_SERIALIZER = 'json' CELERY_RESULT_SERIALIZER = 'json' CELERY_ACCEPT_CONTENT = ['json']
REDIS_URLという環境変数はheroku:redisを導入しときに勝手に設定されるのです。
手順7 いつものようにherokuにデプロイ
$git add. $git commit -m "celery" $git push heroku master $heroku ps:scale worker=1 #↑workerプロセスを起動するためにこれがいる!
手順8 logをとってうまく行ってるかチェック
$heroku logs -t
参考資料
"Connecting in Django"の箇所 devcenter.heroku.com
自分の完成形とちょっと違うけど、参考になりました github.com
DjangoからCeleryへのタスクがつながらず、サーバーがずーっと応答しない!ときのCeleryセッティングのチェック項目
monkeyjack人工植物草Imitation CeleryリーフグリーンFoliage Home Decor 0fc86a448d9ee0e32f6ad4b8bd12d311
- 出版社/メーカー: MonkeyJack
- メディア: ホーム&キッチン
- この商品を含むブログを見る
コメント
Celery(セロリ)が動きそうで動かないことがあります。djangoローカルサーバーがviewを呼び出したまま止まるのでエラーも吐かないのでなにをしてるかよくわかりませんでした。チュートリアル記事も何度も見直したのに動かない・・・こないだは動いたのに・・・なぜだ・・・これを次回から回避できます。
チェック項目
その1:
pip install celery
は済んでいるその2:
pip install redis
は済んでいるその3:settings.pyにBROER_URLなどの記載は済んでいる
#settings.py参考例(引用です) BROKER_URL = 'redis://localhost' CELERY_RESULT_BACKEND = 'redis' CELERY_TASK_SERIALIZER = 'json' CELERY_RESULT_SERIALIZER = 'json' CELERY_ACCEPT_CONTENT = ['json']
引用元
#__init__.py from __future__ import absolute_import, unicode_literals from .celery import app as celery_app __all__ = ['celery_app']
その5:task.pyに非同期処理する関数を
@shared_task
デコレータつきで書いてるその7:
$brew install redis
は済んでいるその8:
$redis-server
は動いているその9:
$celery -A [proj名] worker -l info
でワーカーは動いている
その8とその9あたりは、下記を参照ください
と、いうわけでおおまかに書いても9個もチェック項目があるという・・・
vue.js開発過程記録1:vue.jsを触ってみた。it worksまで
経緯など
↑の本。うちのフロントエンドはvue.jsでできているサービスが一個あり、担当の同僚いわく、AngularとReactと比べてオススメということで、話を聞いていたのですが、TwitterTLでもvue.jsの話がたくさんでてくるような気がしたので、なんとなくvue.jsの最初だけやってみたのです。
あと、モバイルアプリ開発でvue nativeというのも出たという話も聞いたので、いよいよswift, kotolin, javaはモバイル開発のためにまたさらに個別に複数言語と環境構築からデプロイまでを学ばなくていいかも!?という期待もあり・・・苦笑 ( Unityで頑張ってコード書いてきたC#でできるXamarineがよりヒットしてきてくれないかなって期待もあるんですが・・・ )
と、いうわけでit worksまでやりました。
まず環境構築node.js&npm
とりあえず、ランタイムのnode.jsを入れる。パッケージ管理(のほかに色々できるっぽい)ツールnpmも入れる。
node.js インストール時に、このエラーありました。
curl: (23) Failed writing body (0 != 941)
この記事のおかげで解決 qiita.com
テストプロジェクトを開発サーバーで起動(?)
ってことかな??とりあえず動きました。
$npm i vue $npm i -g vue-cli $vue init webpack my-proj #このコマンド後色々質問がくるけど適当に答えた $cd my-proj $npm run dev #128.0.0.1:8081に開発サーバーが公開してくれてる
こんな感じ!
参考になった書籍
React、Angular、Vue.js、React Nativeを使って学ぶ はじめてのフロントエンド開発
- 作者: 原一浩,taisa,小松大輔,永井孝,池内孝啓,新井正貴,橋本安司,日野洋一郎
- 出版社/メーカー: 技術評論社
- 発売日: 2018/05/09
- メディア: 単行本(ソフトカバー)
- この商品を含むブログを見る
コード署名のメモ。brew install gdbだけでは動かないよという話
- 作者: Raywenderlich Com Team,Derek Selander
- 出版社/メーカー: Razeware LLC
- 発売日: 2017/12/15
- メディア: ペーパーバック
- この商品を含むブログを見る
コード署名が必要なパッケージがあると知る
gdbというデバッガーをMacOSで使おうとした時、brew install gdb
ではいることははいるけども、$gdb コマンドを打っても起動しない。これは、コード署名という手続きが必要なパッケージだったのだ・・・(これは上手く行ったが、他のサポートの問題で結局gdbじゃなくてlldbというのを使うことになったのだが・・・)
その顛末の続きはこちら k-mawa.hateblo.jp
で、コード署名というのをやってみたので、今後コード署名という手続きが必要なパッケージがあるかもしれないので、メモしておく。
詳しくはここにかいてある qiita.com
のでここでは手続きのメモを。
1:MacOSのキーチェーンアクセスを開く $open -a "Keychain Access.app" ↓ 2:GUI操作でコード署名するという意味合いの証明書をつくる ↓ 3:システム配下に設置(エラーがでるときはログイン配下に設置してからシステム配下にドラッグアンドドロップで移動) ↓ 4:つくった証明書を「常に信頼する」に変更(GUI) ↓ 5:システムのフォルダにかかっている鍵をあける。じゃないとコマンド打っても鍵が見つからないって出る(GUI) ↓ 6:コード署名コマンド実行 例)$ sudo codesign -s gdbcert /usr/local/bin/gdb #gdbcertは自分で決めた証明書の名前 #コマンド応答はないけど、鍵の音がなって完了した
これで、動くようになる(gdbはOSサポートの影響?という別の要因で完璧には動かなかったけど、コード署名はうまくいって起動はできるようになった。)