MawaLog

一日一日、楽しく生きる。技術と音楽が好き。

Django-Celeryにスケジュールをセットして動くようにする@ローカル

コメント

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

こうしていると、このエラーがでる。どうもスケジューラー経由の実行だと、たくさん規定の引数をぶちこむようだ。

note.nkmk.me

なので、 ↓
こうする。*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

これでうまく動いた!^^/

参考

Periodic Tasks — Celery 4.2.0 documentation

アセンブラの基本文法のメモ

たのしいバイナリの歩き方

たのしいバイナリの歩き方

これ読んでいます。これで文法の基礎が勉強できる箇所がありましたので自分用にメモしておきます。

基礎知識

走り書きメモですみません。

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

これでバイナリ解析が少しはできそうだ^^

勉強・引用・参考元の本と記事

たのしいバイナリの歩き方

たのしいバイナリの歩き方

bambinya.hateblo.jp

Eclipseで逆コンパイルを行う:JavaTips 〜Eclipse活用編 - @IT

RSA暗号解読問題を解く(後編)[CTF for Beginners 2018]"RSA is Power"

f:id:k_mawa:20180619141331p:plain

経緯

これの続き。

k-mawa.hateblo.jp

ちょっとだけ巻き戻しで、まず問題に与えられている数字は以下

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(([モジュラとする数],[公開鍵にする数],[秘密鍵にする数]))

参考記事

SECCON Beginners CTF 2018 Write-up

zeosutt.hatenablog.com

Django-Celery-Redisのherokuへのデプロイメモ。

Heroku: Up and Running: Effortless Application Deployment and Scaling

Heroku: Up and Running: Effortless Application Deployment and Scaling

コメント

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

elements.heroku.com

手順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']

引用元

Celery 3.1 を Django で使う

↓こう変える

#↓ここから追記↓

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セッティングのチェック項目

コメント

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']

引用元

Celery 3.1 を Django で使う

  • その4:settings.pyがあるディレクトリの__init__.pyceleryに必要なコードを追記してある(今回はこれが抜けてた!追記すると動いた^^;)
#__init__.py

from __future__ import absolute_import, unicode_literals
from .celery import app as celery_app

__all__ = ['celery_app']
  • その5:task.pyに非同期処理する関数を@shared_taskデコレータつきで書いてる

  • その6:settings.pyがあるディレクトリのcelery.pyの追加と書き込みは済んでいる

  • その7:$brew install redisは済んでいる

  • その8:$redis-serverは動いている

  • その9:$celery -A [proj名] worker -l infoでワーカーは動いている

その8とその9あたりは、下記を参照ください

k-mawa.hateblo.jp

と、いうわけでおおまかに書いても9個もチェック項目があるという・・・

vue.js開発過程記録1:vue.jsを触ってみた。it worksまで

f:id:k_mawa:20180617021558p:plain

経緯など

↑の本。うちのフロントエンドは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も入れる。

qiita.com

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に開発サーバーが公開してくれてる

こんな感じ! f:id:k_mawa:20180617021558p:plain

参考になった書籍

React、Angular、Vue.js、React Nativeを使って学ぶ はじめてのフロントエンド開発

React、Angular、Vue.js、React Nativeを使って学ぶ はじめてのフロントエンド開発

コード署名のメモ。brew install gdbだけでは動かないよという話

Advanced Apple Debugging & Reverse Engineering Second Edition: Exploring Apple Code Through Lldb, Python and Dtrace

Advanced Apple Debugging & Reverse Engineering Second Edition: Exploring Apple Code Through Lldb, Python and Dtrace

コード署名が必要なパッケージがあると知る

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サポートの影響?という別の要因で完璧には動かなかったけど、コード署名はうまくいって起動はできるようになった。)