akiyoko blog

akiyoko の IT技術系ブログです

「fin-pyもくもく会 #9」に参加してきました

主催

fin-py

会場

株式会社インタートレード
東京都中央区新川一丁目17番21号 茅場町ファーストビル3階

Twitter

twitter.com



 

全体の感想など

前回の初参加からおよそ3ヶ月、3回ぶりの参加となりました。


《過去記事》
akiyoko.hatenablog.jp



前回は、Poloniex という仮想通貨取引所の API を使ってロボアドを作ろう、ということで API を初めて触ってみたのですが、その後の成果は全く奮わず。。

今回はそれを一歩進めて、API を使って仮想通貨の売買のテストをしてみることにしました。




最近は「インベスターZ」を読んで投資のノウハウを勉強中のど素人ですが、fin-py 常連の方々に「おっ!」と思ってもらえるような爪痕を残せるようになるまで頑張ってみたいと考えています。




そして、fin-py 主催者からのつぶやき。

爪痕残せた!(違)


実行環境

  • macOS Sierra 10.12.6
  • Python 3.5.2(Anaconda 4.2.0)


 

やったこと

ccxt というライブラリのコードを読みながら、実際に触ってみました。


まず、Exchange クラスは

def load_markets(self, reload=False):
def fetch_markets(self):
def fetch_tickers(self, symbols=None, params={}):
def fetch_order_status(self, id, market=None):
def fetch_order(self, id, symbol=None, params={}):
def fetch_orders(self, symbol=None, params={}):
def fetch_open_orders(self, symbol=None, params={}):
def fetch_closed_orders(self, symbol=None, params={}):

あたりのメソッドが使えそう。

また、取引所ごとに

def fetch_ticker(self, symbol, params={}):
def fetch_trades(self, symbol, params={}):
def create_order(self, symbol, type, side, amount, price=None, params={}):
def cancel_order(self, id, symbol=None, params={}):
def withdraw(self, currency, amount, address, params={}):

が用意されている。

しかしながら create_order() は、直接使うのではなく、指値注文なら

def create_limit_buy_order(self, symbol, *args):
def create_limit_sell_order(self, symbol, *args):

create_limit_xxx_order 系のメソッドを使うっぽい。たぶん。

def create_market_buy_order(self, symbol, amount, params={}):
def create_market_sell_order(self, symbol, amount, params={}):

create_market_xxx_order 系は成行注文かな。
見たところ、対応している取引所は少なそうな雰囲気ではあるが。

# sell one ฿ for market price and receive $ right now
print(exmo.id, exmo.create_market_sell_order('BTC/USD', 1))

# limit buy BTC/EUR, you pay €2500 and receive ฿1  when the order is closed
print(exmo.id, exmo.create_limit_buy_order('BTC/EUR', 1, 2500.00))

こんな感じで使えと。
https://github.com/ccxt/ccxt#python-1


以下、実際に試してみた。


 

fetch_balance

バランスを取得する。


(使用例)

import ccxt
from pprint import pprint

ex = ccxt.bittrex({
    'apiKey': BITTREX_KEY,
    'secret': BITTREX_SECRET,
})

ret = ex.fetch_balance()
pprint(ret)


(出力例)

{'BTC': {'free': 0.33, 'total': 0.33, 'used': 0.0},
 'LTC': {'free': 0.0, 'total': 2.22, 'used': 2.22},
 'XRP': {'free': 1000.0, 'total': 1000.0, 'used': 0.0},
 ...
 'free': {...,
          'BTC': 0.33,
          'LTC': 0.0,
          'XRP': 1000.0,
          ...},
 'info': [...,
          {'Available': 0.33,
           'Balance': 0.33,
           'CryptoAddress': '1Mxxxxxxxx',
           'Currency': 'BTC',
           'Pending': 0.0},
          {'Available': 1000.0,
           'Balance': 1000.0,
           'CryptoAddress': None,
           'Currency': 'XRP',
           'Pending': 0.0},
          ...],
 'total': {...,
           'BTC': 0.33,
           'LTC': 2.22,
           'XRP': 1000.0,
           ...},
 'used': {...,
           'LTC': 2.22,
           ...}}

ルート直下は、

- info: 全通貨の情報(作成済みのアドレスやバランスなどの量)
- free: ポジションフリーになっている量を全通貨分まとめて表示
- total: 保持している総量を全通貨分まとめて表示
- used: ポジションを取っている量を全通貨分まとめて表示

各通貨の下は、

- free: ポジションフリーになっている量
- total: 総量
- used: ポジションを取っている量

という形で出力されている。



 

fetch_order_book

注文板を取得する。
Bittrex でいうところの「ORDER BOOK」の板。


(使用例)

ret = ex.fetch_order_book('LTC/BTC')
pprint(ret)


(出力例)

{'asks': [[0.00724399, 162.062],
          [0.007244, 68.0758],
          [0.00724498, 12.119],
          ...,
          [0.01287905, 0.27054]],
 'bids': [[0.00721213, 4.87597329],
          [0.0072, 112.42175327],
          [0.007194, 54.9071],
          ...,
          [1e-08, 9874677.64]],
 'datetime': '2017-10-28T06:57:05.000Z',
 'timestamp': 1509173824684}

'asks' は売り出し価格、'bids' は買いたい値段。
成立した金額に近いものから順に(すなわち 'asks' は値段の低い順、'bids' は値段の高い順に)並んでいる。

'asks' および 'bids' のそれぞれのリストは、0番目が BTC換算の価格、1番目がそれぞれの売買ボリューム(アルトコインベースで BTC建てではない)。


 

fetch_trades

他人のものを含めて過去に成立した取引を抽出する。
Bittrex で言うところの「MARKET HISTORY」の板。


(使用例)

ret = ex.fetch_trades('LTC/BTC')
pprint(ret)


(出力例)

[{'amount': 3.63704229,
  'datetime': '2017-11-05T14:21:40.000Z',
  'id': '91373876',
  'info': {'FillType': 'PARTIAL_FILL',
           'Id': 91373876,
           'OrderType': 'SELL',
           'Price': 0.00720401,
           'Quantity': 3.63704229,
           'TimeStamp': '2017-11-05T14:21:40.993',
           'Total': 0.02620128},
  'price': 0.00720401,
  'side': 'sell',
  'symbol': 'LTC/BTC',
  'timestamp': 1509891700000,
  'type': 'limit'},
  ...]


 

create_limit_buy_order

指値で買い注文を出す。


(使用例)

ret = ex.create_limit_buy_order('LTC/BTC', 2, 0.0005)
pprint(ret)

の例だと、
「0.00050000 BTC / 1 LTC」の指値で、2 LTC の注文を出している。
第三引数は、合計金額ではなく、アルトコイン1単位あたりの値段なので要注意。


なお Bittrex では、合計金額が 50K satoshi 以下のゴミ注文を出すと「DUST_TRADE_DISALLOWED_MIN_VALUE_50K_SAT」というエラーが出るようなので、これも要注意。*1


(出力例)

{'id': 'd60c914b-9ba1-4e27-b055-deb7c6549f7f',
 'info': {'message': '',
          'result': {'uuid': 'd60c914b-9ba1-4e27-b055-deb7c6549f7f'},
          'success': True}}


 

fetch_order

自分が出したオーダーを抽出する。


オーダー時の 'id' を指定します。
売買成立後のオーダーを見ることも可能。


約定前のオーダーでは、'status' が 'open' になっています。
(部分的に売れている場合はどうなるのか?については要調査。)


(使用例)

ret = ex.fetch_order('d60c914b-9ba1-4e27-b055-deb7c6549f7f', 'LTC/BTC')
pprint(ret)


(出力例)

{'amount': 2.0,
 'average': None,
 'cost': 0.001,
 'datetime': '2017-11-05T14:36:54.000Z',
 'fee': {'cost': 0.0, 'currency': 'BTC'},
 'filled': 0.0,
 'id': 'd60c914b-9ba1-4e27-b055-deb7c6549f7f',
 'info': {'AccountId': None,
          'CancelInitiated': False,
          'Closed': None,
          'CommissionPaid': 0.0,
          'CommissionReserveRemaining': 2.5e-06,
          'CommissionReserved': 2.5e-06,
          'Condition': 'NONE',
          'ConditionTarget': None,
          'Exchange': 'BTC-LTC',
          'ImmediateOrCancel': False,
          'IsConditional': False,
          'IsOpen': True,
          'Limit': 0.0005,
          'Opened': '2017-11-05T14:36:54.987',
          'OrderUuid': 'd60c914b-9ba1-4e27-b055-deb7c6549f7f',
          'Price': 0.0,
          'PricePerUnit': None,
          'Quantity': 2.0,
          'QuantityRemaining': 2.0,
          'ReserveRemaining': 0.001,
          'Reserved': 0.001,
          'Sentinel': '4f9809dd-a8d5-4225-a7cf-1feebfcea9f6',
          'Type': 'LIMIT_BUY'},
 'price': 0.0005,
 'remaining': 2.0,
 'side': 'buy',
 'status': 'open',
 'symbol': 'LTC/BTC',
 'timestamp': 1509892614000,
 'type': 'limit'}

売買成立後のオーダーを見ると、'status' が 'closed' になっていました。ちなみに、キャンセル済みの場合でも 'status' は 'closed' でした。


 

fetch_open_orders

自分が出している約定前のオーダーの一覧を抽出する。
「OPEN ORDERS」の板。


(使用例)

ret = ex.fetch_open_orders('LTC/BTC')
pprint(ret)


(出力例)

[{'amount': 2.0,
  'average': None,
  'cost': 0.001,
  'datetime': '2017-11-05T14:36:54.000Z',
  'fee': {'cost': 0.0, 'currency': 'BTC'},
  'filled': 0.0,
  'id': 'd60c914b-9ba1-4e27-b055-deb7c6549f7f',
  'info': {'CancelInitiated': False,
           'Closed': None,
           'CommissionPaid': 0.0,
           'Condition': 'NONE',
           'ConditionTarget': None,
           'Exchange': 'BTC-LTC',
           'ImmediateOrCancel': False,
           'IsConditional': False,
           'Limit': 0.0005,
           'Opened': '2017-11-05T14:36:54.987',
           'OrderType': 'LIMIT_BUY',
           'OrderUuid': 'd60c914b-9ba1-4e27-b055-deb7c6549f7f',
           'Price': 0.0,
           'PricePerUnit': None,
           'Quantity': 2.0,
           'QuantityRemaining': 2.0,
           'Uuid': None},
  'price': 0.0005,
  'remaining': 2.0,
  'side': 'buy',
  'status': 'open',
  'symbol': 'LTC/BTC',
  'timestamp': 1509892614000,
  'type': 'limit'}]

 

cancel_order

約定前のオーダーをキャンセルする。

オーダー時の戻り値から取得した 'id' の値を第一引数に使います。


(使用例)

ret = ex.cancel_order('d60c914b-9ba1-4e27-b055-deb7c6549f7f', 'LTC/BTC')
pprint(ret)


(出力例)

{'message': '', 'result': None, 'success': True}

なお、すでにキャンセル済みのオーダーに cancel_order() すると、

ccxt.base.errors.InvalidOrder: bittrex cancelOrder() error: {"success":false,"message":"ORDER_NOT_OPEN","result":null}

という例外が発生します。


 

fetch_orders

自分の過去の取引履歴を抽出する。

キャンセルを除いた、過去に売買が成立した取引だけが抽出できるはず。
新しい順に出力されます。

(使用例)

ret = ex.fetch_orders('LTC/BTC')
pprint(ret)

(出力例)

[{'amount': 1.1,
  'average': 0.00689999,
  'cost': 0.00758999,
  'datetime': '2017-11-02T11:09:40.000Z',
  'fee': {'cost': 0.00001897, 'currency': 'BTC'},
  'filled': 1.1,
  'id': 'dc7bfda3-d170-4e30-8461-771d8f690c73',
  'info': {'Closed': '2017-11-02T11:09:41.203',
           'Commission': 0.00001897,
           'Condition': 'NONE',
           'ConditionTarget': None,
           'Exchange': 'BTC-LTC',
           'ImmediateOrCancel': False,
           'IsConditional': False,
           'Limit': 0.0069,
           'OrderType': 'LIMIT_SELL',
           'OrderUuid': 'dc7bfda3-d170-4e30-8461-771d8f690c73',
           'Price': 0.00758999,
           'PricePerUnit': 0.00689999,
           'Quantity': 1.1,
           'QuantityRemaining': 0.0,
           'TimeStamp': '2017-11-02T11:09:40.91'},
  'price': 0.0069,
  'remaining': 0.0,
  'side': 'sell',
  'status': 'closed',
  'symbol': 'LTC/BTC',
  'timestamp': 1509620980000,
  'type': 'limit'},
...]

 

追記

とある取引所での create_limit_sell_order() の戻り値の 'id' の値がおかしいように思ったので、Issue を出してみたら、2時間くらいで解決してくれました。
早い!!
https://github.com/ccxt/ccxt/issues/465

「PyCon JP 2017」に初参加してきました

タイトル

PyCon JP 2017 - connpass (2017.9.8-9)
pyconjp.connpass.com

会場

早稲田大学西早稲田キャンパス63号館
東京都新宿区大久保3-4-1

Twitter

twitter.com


 

全体の感想など

PyConJP、今回が初参加でした。
会場は隅々まで活気があって、参加した人しか分からないパワーや刺激をたくさん受けて過ごした二日間でした。

スケジュールはこちら。
pycon.jp

動画やスライドもこのページに揃っているので、参加できなかった人、見逃したセッションはここでフォローを。



一日目は昼前から参加したのですが、会場まで向かう人がまばらで、会場が大学敷地のかなり奥の方だったので「あれ?合ってんのかな?」とちょっと迷子になりかけました。。

f:id:akiyoko:20170908115140j:plain:w400


そして、初っ端からのお弁当タイム(笑)。
お弁当がタダ(チケット代に含まれている)なのは、会場で初めて知りました。ラッキー!

結構豪華です。

f:id:akiyoko:20170908115758j:plain:w400


それどころか、飲み物(コーヒー、ジュース)も無料で飲めるし、おやつタイムになったら(セルフですが)おやつがもらえるんですね。これも知らなかった。

f:id:akiyoko:20170909152925j:plain:w300
(写真は二日目の「PyConJP 最中」とアメ?)


二日目もお昼から。
脇目も振らず食堂に向かい、颯爽とお弁当を手にします。
わ〜い、選びたい放題や〜(違)

f:id:akiyoko:20170909134227j:plain:w400


休み時間が短くて(人気のセッションの前にはちょっとした席取り?なんかもあって)日頃不摂生している体にはしんどいイベントでしたが、出来たてホヤホヤ(9月9日発刊)の「PythonユーザのためのJupyter[実践]入門」が並んでいたのを休憩中に見かけたので早速購入してみました。

パラパラと立ち読みしたところ、他で見られないような細かい説明が多々あって、一瞬で「これは買い」だと感じました。一部で「鈍器」と言われている(笑)ほど分厚い本に仕上がっていますが、著者曰くどこから読んでもいいらしいので、気軽に読めそうです。しばらくしたら感想をブログに載せようかと考え中です。それにしても 400ページで 3,500円は安い!!



f:id:akiyoko:20170909144253j:plain:w400



PyCon JP とは全然関係ないですが、この翌日から夏休みで屋久杉を見に行ってきたのですが、往復12時間のトレッキングに体力の限界を感じました。。

f:id:akiyoko:20171106030010g:plain

Animated GIF editor and GIF maker で作成)





 

Day 1(9月8日)

メディア会議

  • 7割売れたら合格点
  • 最初の部数が売れたら「売れた」と言っていい
  • Pythonスタートブックが入門本で一番売れてる。1万部?
  • 5万部?売れるとビルが立つ?
  • ディープラーニング本
  • 本を書いたら人生変わる?
    • 出たばっかりなのであんまり。近しい人が声をかけてくれるくらい
    • 達成感はある。承認欲求が満たされる
    • 履歴書に書くとインパクトあるアピールになる
  • Amazonの著者ページは、編集社に権限がある場合も。だから勝手に作られてることも?
  • 本を書くためにすること
    • 公式ドキュメントを一番読んだ。下手なことは書けないので
    • 結城先生の文章の書き方、を読んだ
  • Markdown で一章1ページずつ
    • GitLab でプライベートリポジトリを創った
    • 製品版に近い状態に出力(HTML?)できるような独自のツールがある
  • e-Pub形式にするかしないか?は、飾りの多さによる?
  • Dropboxレビューの機能を使った
    • ページごとに指摘ができる??
  • 定時に帰ってから、3〜4ヶ月間コワーキングスペースに篭って執筆した
  • 〆切は1〜2ヶ月くらい遅れがち
  • 海外の公式に近いドキュメントをボランティアが無料で翻訳しているものは、出版社からするとちょっと脅威に感じる
  • Pytyon本の企画は、「Pythonこれから来るぞ!」というイチ編集者の意気込みから!?


 

Kivy


Kivy はつらそう、という感想が多かった。
PyQt はどうなの?

  • キヴィー
  • Kivy Showcase にサンプルが並んでる
  • Kv Language というUI用のメタ言語がある
    • Widget(UI)を簡単に記述できる。CSSとBootstrap(グリッド)に近い
    • 全部Pythonで書くこともできるが、KVと合わせることもできる
  • MITライセンス
  • 2017年現在も開発が盛んに行われている
  • GUI部門で一位!
  • 公式Androidアプリを試してみるのが一番わかり易い
  • Garden
    • 拡張機能。個別にインストール
  • Androidアプリの作成方法は二つ
    • Kivy Launcher
      • Pythnon 2系のみ。Kivy 1.9.1 のみ(最新版ではない)
    • Buildozer(UbuntuVM)
      • Python2/3両対応
  • クロスプラットフォームの検討
    • 2019年目処で全てのデバイスで Python3 対応予定
  • 4つの壁
    • 1. 情報が少ない(特に日本語)
    • 2. インストール
      • 非公式パッケージのインストールがオススメ
    • 3. Kv Language
      • kviewer (デバッガ?)を使うのがオススメ
    • 4. 日本語入力(IME)に問題あり
  • 簡単なアプリならすぐに作れる


 

PythonとRを行ったり来たり

https://github.com/toshiukii/rpy-talk/blob/master/rpy_pyconjp17.ipynb

  • 関西大学での教育系データの分析
  • Python と R の比較
    • 読みやすさ、書きやすさ、言語の総合力 ⇔ 知見の蓄積
    • 機械学習ライブラリ ⇔ 統計パッケージ
    • 実務家ユーザー ⇔ 研究者
    • Jupyter Notebook ⇔ RStudio
    • Rより速いことが多い ⇔ RMarkdownによる文書作成
  • Python, pandas は欠損値の扱いが雑なのがデメリット
  • Jupyter Notebook で Rkernel を使うこともできる
  • feather はカラム志向のデータストア?高速、欠損値の扱いがウリ
  • RPy2
    • Python 2.7, 3.3> で動作
    • Pythonから Rを呼び出す
  • iPythonでセルマジックを使う
    • 「%%R」でセル全体に適用させると、Rのコードをペタッと貼れる
  • Pythonでデータを綺麗にして送り込む?
  • Pandasでは、obuject型ではなくなるべくint/float型に変換しておくと間違いがない
  • WesとHadleyが組んだように、PythonとRも仲良くしようぜ!

 

PythonでOAuth『サーバ』を構築した話


仮想通貨取引所 Zaif の人。
暗号通貨のAPIを使うときの OAuthサーバの話。

  • OAuth 2.0 の話
  • 「OAuth2 規約」
    • パラメータや戻り値が規約で決まっている
  • scopeは「%20(空白)」で区切るという決まりに
  • マスタデータ登録時にリダイレクトURLを登録しておけば、リクエストのパラメータとして redirect_uri は不要
  • state はなりすまし対策。規約では必須ではないが、入れたほうがよい
  • URLのバリデートには「cornice(コーニス)」を使った
    • Pyramidと相性がよい
  • expires_in(利用期限)は3600秒がデフォルトらしい


 

プロダクト開発して分かったDjangoの深~いパーミッション管理の話

hirokiky Slides


PyQ の人。

  • Djangoの権限管理の定石
  • Lv1 View で if文
  • Lv1 User にプロパティ is_premium
  • Lv2 デコレータを作る @premium_required
  • Lv2 凝ったデコレータ @subscription_required(STANDARD_PLAN, PREMIUM_PLAN)
  • リクエストのユーザ情報とプランとが密結合。。
  • パーミッションを作る!
    • @user_permission_required("view_premium_articles")
  • Lv3 許可設定
  • パーミッションを採用すると、仕様の変更に強くなった
  • 複雑になっちゃう。。→ライブラリ!
    • Django 自体の Permission
      • DBで管理。User <-> Model のパーミッションだけ
    • django-guardian
      • 一番人気らしい。イケてる版 Djnago の Permission
    • django-rules
      • DB使わずにできる
      • デコレータやテンプレートも使える
  • django-keeper というライブラリ作った!
    • ACLを設定する

 

Day 2(9月9日)

Pythonの本気!RaspberryPiやEdisonを使ったIoTシステムの構築

https://www.slideshare.net/yutakitagami/pycon-jp-2017yuta-kitagami



を書いた人。

  • IoT時代において、「Python 最強だから」
  • Pythonでハードウェアを扱える。ハードウェア用のラブラリがあるから
    • C言語で書かれたライブラリのPythonラッパー
  • Python用のCソースが用意されている
    • py_xxx.c
  • akilib は自作ライブラリ(秋葉原の部品を扱えるライブラリ!)
  • Bottle(イイ!), tynyDB(ちょっと重い), requests
  • OpenCV も C のPythonライブラリ
  • http://elpisapi.net/TestAPI/
    • Bottle で Websocket で通信してる
  • ラズパイもPythonで動かせるが、長時間動かしていると不安定?(勝手にOS落ちてたりする?)
    • 結局Cがよいのでは???
    • Micro Python(組み込み用Python)に期待?
  • ほかの多数のライブラリとの組み合わせだと、Cでは飽和してしまうので無理
    • Cはひとつのことだけに集中するならよい

 

Pythonをとりまく並行/非同期の話

https://tell-k.github.io/pyconjp2017/

  • 並行/並列処理とは?
    • 本当に複数の処理を同時に実行するのが -> 並列処理
    • 複数処理を効率良く切り替えながらあたかも同時に実行するのが -> 並行処理
  • concurrent.futures
    • Python3.2 から追加された並行/並列処理用のライブラリ
  • Pythonのコードを実行できるスレッドは 常に一つのみ という制限
    • CPython がスレッドセーフではない Cライブラリに依存しているから
  • ちなみに、I/O処理や、一部のC拡張モジュールなどでは GILが解放される らしいです
  • CPUバウンドな処理を並列にするには?
    • マルチプロセス で 並列 に実行する
  • 非同期I/O
  • イベントを監視するためのループが イベントループ
  • コルーチン
    • 処理を任意のタイミングで中断/再開できる機能
    • Pythonではジェネレータの拡張構文として実装されている
    • ジェネレータベースのコルーチン
  • Python公式で非同期I/O のための共通のコンポーネント群
    • Python3.5 からは asyn/await構文 (ネイティブコルーチン) が使える

まとめ

  • 並行は並列を包含する概念
  • マルチスレッドはI/Oバウンドには効果あり
  • マルチスレッドはGILがあるのでCPUバウンドには効果なし
  • 並列処理をしたいのであればマルチプロセスが良い
  • C10K問題くらいからシングルスレッドでも非同期処理が必要になった
  • シングルスレッドで非同期処理
  • イベントループ/IO多重化/コルーチンという技術要素で実現
  • Pythonの非同期ライブラリ
  • asyncioの誕生の背景と概要
  • 今後は各種ライブラリがもっとasyncioに対応していくでしょう

 

SREエンジニアがJupyter+BigQueryでデータ分析基盤をDev&Opsする話

  • アプリならPython一択、インフラはBigQuery一択
  • Jupyterなら、主要BIツールにたいてい繋がる
  • 「俺の考えた最強のデータ基盤」は使われない。。
    • 重要なのは、イテレーションを回すこと。やりたいことが日々変わること
    • 事前の十全な準備は無理
  • p.118「タスクの優先順位」おもしろい!

「第2回PythonのWebスタートアップを詳しく語る会」に参加してきました

会場

株式会社ミクシィ
東京都渋谷区東1-2-20 住友不動産渋谷ファーストタワー7F

Twitter

twitter.com


 

全体の感想など

最近多くなってきた気がする Python 関連の勉強会ですが、Python の Webサービス系(特に Django)の話が聞けるのは結構レアだと思います。
というわけで、忙しい中、しかも体調の悪い中でしたが参加してみました。

5人の登壇者がいろいろな話をする中、Django の話になると、やはり初心者のためのドキュメントや本が少ないこと、特に日本語のものが少ないことが問題点として挙げられてました。私も全く同意見なのですが、結局私の中では「Two Scoops of Django」という英語本がベストという結論に達しています。


《過去記事》
akiyoko.hatenablog.jp





 

Pythonicな開発文化の作り方

株式会社SQUEEZE リードエンジニア 新井正貴氏


《発表スライド》
https://slideship.com/users/@massa142/presentations/2017/08/EErUdBKVhasoNhGdvNVPEb/

《参加メモ》
第2回PythonのWebスタートアップを詳しく語る会でPythonicな開発文化について発表してきた #Pythonstartup - massa142's blog


  • Design Doc(Google が推奨)
    • 仕様のレビュー・文章化
  • トップダウンな意思決定はしない
  • 一次面接はCTOが担当
  • 二次面接はエンジニア3人以上で
    • +2/+1/-1/-2 のポイントを理由とともに投票
    • 誰か一人でも-2をつければオファーしない
    • 平均+1を上回れば次の面接へ
  • プルリクは小さく!
    • CIのトリガーツール「Danger」でプルリクのサイズもチェックできる

SQUEEZE の CTO関根氏の「SQUEEZEのプロダクトを支える技術」も参考に。



 

Re:dash x Pythonではじめるサービス改善

株式会社ビザスク 取締役CTO 花村創史氏


  • GoogleAppEngine x Python
  • Python x Django x Angular
  • 分析ツール重要
    • re:dash, mixpanel, fullstory, etc
  • データ連携、クエリの定時実行もできる
  • Pythonの計算結果をテーブルとして出せる(データソースとして別のテーブルからも取ってこれる)
  • データをキャッシュしてくれる
  • 実行結果を csv, json でダウンロードできる



 

チュートリアルの次へ・初心者向けDjangoの歩き方

株式会社フンザ 取締役CTO 酒徳千尋氏

チケットキャンプ を運営している株式会社フンザ 酒徳氏の LT でした。チケットキャンプで「PyCon JP」のチケットが売ってない云々ありましたが、さっき確認したらちゃんと登録されていました。早い!

ticketcamp.net


参考になるオープンソースプロジェクトの Mezzanine は、私もイチ押しだったので嬉しかったです。

《過去記事》
akiyoko.hatenablog.jp

akiyoko.hatenablog.jp


それにしても、「Mezzanine」の読み方は「メッツァニーネ」だったのでしょうか。。気になるところです。




 

Pythonで作るHRTechサービスの裏側

株式会社リーディングマーク 中途事業開発責任者 長岡 諒氏


  • 沼津エンジニア
  • レクミーTV(Python, Flask)
  • Djangoの良さ
    • 1. 強力な管理画面作成機能がある
      • Grappelli というライブラリでデザイン強化やダッシュボードも
    • 2. Webアプリ作成に必要な機能が揃っている
    • 3. 標準のORMが一定強力
      • 1.11でサブクエリもサポート
    • 4. 後方互換製の重視
    • 5. Puthonの豊富なライブラリで機能追加できる
      • django-sendgrid, REST framework


ここでも、Two scoop of django 推しが!!

Two Scoops of Django: Best Practices for Django 1.8

Two Scoops of Django: Best Practices for Django 1.8



 

クイズ・python勝ち抜きバトル!!

株式会社アイリッジ 開発グループ 副グループ長 植木 基博氏


面白かったのですが、二択にしてくれた方が参加者が適度に残って良かったかなぁ、と思いました。PyCon JP 2017 での本番 に期待です。

「撮影・編集スキルは不要!動画制作ディレクションの勘所」に参加してきました

会場

エイクエント東京オフィス
東京都港区 南青山2−11−16 METLIFE青山ビル9F

Twitter

twitter.com


 

全体の感想など

仕事の延長で、たまーに動画を撮ったり編集したりするのですが、そこで困るのが、準備(機材選びやセッティングなど)と当日の撮り方(演出)と編集です。つまり、全部ですね。

映像制作の経験がほとんど無いので、

  • そもそも演出の仕事って?
  • 演出のプランはどうやって練る?
  • 演出で大事なことは?
  • 編集する際のコツは?

など、聞きたいことは山ほどありました。
本当は、基本的な機材選びなどの技術的なことも聞きたかったのですが、残念ながらそっち方面の話はあまり聞くことができませんでした。あくまで演出の話、そして特に、ネット動画ならではの演出の話が中心でした。

例えば、

  • Web動画は、はじめに見られないと見られない
  • 答えを先頭に出して印象づける
  • 撮影前に台本(必要なカット割りなどが決められている)を用意しておくことで、現場での演出はほぼ不要になる
  • 演出をキッチリ決めることで、品質のバラツキを無くす

などなど。


あと編集系の話は、少しだけ聞くことができました。
例えば、Adobe Premiere(私は Element を使ってました)はどんな形式の動画でも読み込めるとか、顔のボカシを入れるのも簡単だとか。あの「シン・ゴジラ」も Adobe Premiere で編集しているらしいです。




以降、メモです。


撮影・編集スキルは不要!動画制作ディレクションの勘所

岡部 憲道氏(株式会社OPEN8 ルトロン本部 コンテンツ部部長)


元、地上波のテレビ番組出身。現在は、女性向けのおでかけ系動画サイト「おでかけ動画マガジン ルトロン」を運営中。30秒動画を月間1000本アップしているとのこと。すごい!

Gunosy などとコンテンツ連携も。SmartNews でも「ルトロン」チャンネルがあるらしいです。


1. 収録に必要な機材と人員

  • 基本的にロケ
  • Web撮影の場合は
    • 機材は、一眼レフ、音響機材、三脚 etc
    • 人員は、ディレクター + カメラマン(だが、ディレクター一人の場合も多い)

2. 地上波&Webメディアの制作現場の比較

  • Web撮影の場合は
    • 会議、撮影準備、撮影、編集・完成などの全ての仕事を、メディア + ディレクター + ライターでこなす

3. 動画制作者が使う業界用語

「てっぺん(=24時)」とか。

↓ こんな感じでした。
映像制作業界用語大辞典-あ行 | Wood's Office

4. 動画制作のディレクション「演出さえできれば誰でもできる!」

  • 演出は意識しないとできない(カメラや編集ソフトは覚えれば誰でもできる)
  • 動画やTVを見たときに、演出を意識すること!
  • 大切なのはコミュニケーション
    • 人の話を聞いて、話を咀嚼して、否定しない
  • 映像は作り手が楽しんで映像制作すること!!
  • 取りたいカットをきちんと取れるように、演出家の現場の仕切りも大事。演出家は指揮者みたいなもの

「ビットコインとか勉強会#9」に参加してきました

会場

Yahoo! LODGE
東京都千代田区紀尾井町1-3 17F

Twitter

twitter.com


YouTube

www.youtube.com



仮想通貨と言えば・・。
Coincheck様、いつもお世話になっております。


ビットコイン取引高日本一の仮想通貨取引所 coincheck bitcoin
ビットコイン取引高日本一の仮想通貨取引所 coincheck bitcoin


 

全体の感想など

「ビットコインとか勉強会」の参加は四回目。
当時は Segwit 問題で大揺れの時期で、そこらあたりの情報を聞きに来た方も多かったと思いますが、勉強会の内容はどちらかというと技術寄りのものと ICO(Initial Coin Offering)関連のもので少しベクトルが違う感じでした。


<過去記事>
akiyoko.hatenablog.jp

akiyoko.hatenablog.jp

akiyoko.hatenablog.jp






 

トランザクション構造と生トランザクション

河除 光瑠氏


  • そもそもトランザクションとは?
  • アウトプットでコインをロックし、その使用可能条件定義を行う
  • インプットで使用する
  • 要するに、トランザクションはコインのロックとアンロックを行うためのデータ
  • インプット構造
    • ロックタイム?
    • Unlocking Script?
    • シーケンス番号
  • アウトプット構造
    • 送付数量(Satoshi)
  • TxID(トランザクションID)と呼ばれるTx識別子は、上記データをhash256(SHA-256を二度掛け)したもの
  • インプットの検証(署名検証)
    • インプットの使用条件を満たしていることの確認は、単純にアンロッキングスクリプト、ロッキングスクリプトを順に実行し、最終的にスタックに1(True)が残っているかどうかを確認する
  • トランザクション展性とは?
  • Txのインプットやアウトプットの情報は変えられないが、TxIDは変えることが可能な性質(攻撃手法)
  • Mt.GoxのようにTxIDでのみ取引状態管理を行っている場合は、ハッキングの対象になり得る

以下、まとめ。

  • 生トランザクションは構造通りに各要素が連続して記載されたバイトデータ
  • P2PKHの電子署名は「署名を含まない」トランザクションのハッシュ値を暗号化データとして使用している
  • 上記から、署名(インプットのスクリプト)を変更しても、既存の署名は有効なままなので無意味なデータ変更や挿入をインプットスクリプトに行うことでTxIDは変化させられる
  • その他データの書き換えは現行仕様でもできない(送金先や手数料総量等)
  • segwit がトランザクション展性を解決するようになる
  • SigHash の生成方法については、BIP143 で定義



 

30秒で$35M 集めたスマートコントラクトから学ぶ Ethereum 開発入門

山中 悠氏


  • ICO/Crowdsaleに自信を持って参戦できるようになるかも
  • 暗号通貨のKickstarter?「Starbase」
  • トークンによる資金調達ができるように
  • 上場したばかりの暗号通貨もMarketCapの上位に
  • Aragon
  • Bancor
  • Kickstarterの10倍以上!
  • ICO=私設の暗号通貨取引所への上場
    • Basic Attention Token=30秒で$35M集めた
    • ブロックチェーンを活用した全く新しい広告技術
  • 仕組みを理解するための3ステップ
    • 1. Etherenum と Smart Contract を理解する
    • 2. ICOを支える技術
    • 3. BAT の Smart Contract から学ぶ
  • Ethereum:世界規模の分散アプリケーションプラットフォーム
    • Etherを払えば誰でも使える
    • Smart Contractsの実行基盤
      • コードで記述した契約条件を自動執行するプログラム
      • 一度定義した契約条件は変更できないというブロックチェーンの不可逆性を利用
  • Ether:Smart Contracts上の関数を実行するための手数料としても使えるし、Bitcoinのような通貨としても使える
  • ICOの時点ではプロダクトが完成していない場合が多い!!
  • Crowdsale:暗号通貨に依るクラウドファインディング
  • Token:暗号通貨の一種。プロジェクトによって独自の権利を持つ暗号通貨である場合も
  • ERC20(トークンの共通規格)
  • Solidity:Smart Contractsを書くためのプログラム言語
    • デプロイ後のバグ修正は不可能
    • 「OpenZeppelin」というライブラリを使うとセキュアなコーディングができるらしい。
  • `constant` 修飾子が付いている関数とそうでない関数
    • 付いていない関数を実行するには、処理量に応じた Ether(Gas)が必要
  • Smart ContractをEthereum上にデプロイ
    • Truffle
    • Gethを通してメインネットワークに乗せる
  • 『リスクはあなたが何をやっているか理解していない時に起こる』(Warren Buffett)

Token というモノが存在するわけではない。分かりやすく言えば、「Smart Contract によって Token という概念を実現している」とのこと。

「fin-pyもくもく会 #6」に参加してきました

主催

fin-py

会場

株式会社インタートレード
東京都中央区新川一丁目17番21号 茅場町ファーストビル3階

Twitter

twitter.com



Poloniex ではないですが、Coincheck様にはいつもお世話になっています。


ビットコイン取引高日本一の仮想通貨取引所 coincheck bitcoin
ビットコイン取引高日本一の仮想通貨取引所 coincheck bitcoin



 

全体の感想など

「fin-py もくもく会」に初参加してきました。
11時から19時までの長丁場だったのですが、前日に夜間リリースがあったので、徹夜明けでの参加となりました。

朝の5時にリリース作業が終わり、「食のテーマパーク」になるとかいう噂の築地で朝食を食べて、一旦チャージ。

小田保 魚河岸店

食べログ小田保 魚河岸店


まだまだ時間があったので、銀座のマンガ喫茶で「アイアムアヒーロー」を軽い気持ちで読み始めたら、続きを読まないと気持ち悪くなってきてあまり寝れず。。


という感じで、あまり体調の良くない中での参加となりました。


会場に行ってみると、20人ほどのメンバーでほぼ満員。常連の方が多いように見えましたが、私を含め初参加の方もちらほら。プログラマやエンジニアの方が多かったでしょうか、肌に合っている感じがしました。




 

やりたかったこと

「Poloniex API を使ったロボアドを作ろう」

Poloniex で取り引き可能な数あるオルトコインの中から、ある程度の売買ボリュームがあり、ボリンジャーバンドのマイナス 2σ 近くに下がってきたコインの情報を教えてくれるロボアドバイザーを作ってみよう、というテーマで進めてみました。


きっかけは、日経ソフトウェア 7月号で「Python で「ビットコイン」システムトレード」という連載が始まったということを知り、早速買って読んだところから。



私のバックグラウンドとしては、Python歴は 5〜6年。ただし、EdTech 方面が中心で FinTech は全く経験無し。

投資はピカピカの一年生で、最近何冊か本を読んだだけ。メンバーの FinTech 用語(株用語?)に何度か着いていけなくなりましたが、まだまだこれから勉強です。


参考

Poloniex API
https://poloniex.com/support/api/


実行環境

  • macOS Sierra 10.12.6
  • Python 3.5.2(Anaconda 4.2.0)
  • Jupyter Notebook


 

やったこと

まずは、実行環境の構築から。
Python や Jupyter Notebook の構築には、Pyenv を使っています。

$ pyenv install anaconda2-4.2.0
$ pyenv global anaconda2-4.2.0
$ pyenv rehash

《過去記事》
akiyoko.hatenablog.jp


次に、「python-poloniex」という非公式ライブラリをインストールします。

$ pip install https://github.com/s4w3d0ff/python-poloniex/archive/v0.4.3.zip

(参考)


小手調べに、Poloniex API が扱っているアルトコインのリストを出してみます。

% matplotlib inline

import time
from datetime import datetime

import matplotlib.pyplot as plt
import pandas as pd
import poloniex

pd.options.display.max_rows = 20
plt.style.use('ggplot')

polo = poloniex.Poloniex(timeout=10, coach=True)
[(k, v['name']) for (k, v) in polo.returnCurrencies().items()]
[(u'XVC', u'Vcash'),
 (u'SRCC', u'SourceCoin'),
 (u'EXE', u'Execoin'),
 (u'WC', u'WhiteCoin'),
 (u'MIL', u'Millennium Coin'),
 (u'MIN', u'Minerals'),
 (u'NOBL', u'NobleCoin'),
 (u'NAS', u'NAS'),
 (u'NOTE', u'DNotes'),
 (u'CCN', u'Cannacoin'),
    ・
    ・

ということで、285種類ほどありました。



次に、BTC/USD のチャートデータから、5分足チャートを100本分取得してみます。
「coach=True」を使うことで、API の利用制限に引っ掛からないように調整しながら API コールをしてくれるようです。

polo = poloniex.Poloniex(timeout=10, coach=True)
period = polo.MINUTE * 5  # polo.DAY
tick = 100
chart_usdt_btc = polo.returnChartData('USDT_BTC', period=period, start=time.time() - period * tick)
chart_usdt_btc
[{u'close': u'2547.88327288',
  u'date': 1498401300,
  u'high': u'2562.35094814',
  u'low': u'2540.9878283',
  u'open': 2560,
  u'quoteVolume': u'178.68276651',
  u'volume': u'455680.07147934',
  u'weightedAverage': u'2550.21835837'},
 {u'close': u'2534.75773305',
  u'date': 1498401600,
  u'high': u'2547.93614683',
  u'low': u'2529.50957325',
  u'open': u'2547.88327288',
  u'quoteVolume': u'96.17031996',
  u'volume': u'243915.59281282',
  u'weightedAverage': u'2536.28762922'},
    ・
    ・

といったチャートデータが取得できます。


取得したデータを線グラフとしてプロットします。

'rmean' は移動平均を計算しています。

df = pd.DataFrame(chart_usdt_btc)
df['date'] = df['date'].apply(lambda x: datetime.fromtimestamp(x))
df['open'] = df['open'].astype(float)
df['close'] = df['close'].astype(float)
df['volume'] = df['volume'].astype(float)
# SMA (Simple Moving Average) is explained at https://coins.newbium.com/post/1873-indicator-on-poloniex-what-is-that
df['rmean'] = df['close'].rolling(window=50).mean()
df['rstd'] = df['close'].rolling(window=50).std()
df['upper_band'] = df['rmean'] + df['rstd'] * 2
df['lower_band'] = df['rmean'] - df['rstd'] * 2
df.plot(x='date', y=['close', 'rmean', 'upper_band', 'lower_band'])

f:id:akiyoko:20170731003928p:plain



売買ボリュームとチャートに関連があるか見たかったので、同じグラフにプロットしてみます。「secondary_y」オプションを使うと便利です。

ax = df.plot(x='date', y='close')
df.plot(ax=ax, x='date', y='volume', secondary_y=True)

f:id:akiyoko:20170731004901p:plain



最後に、移動平均からの乖離が「何σ」かを算出してみます。

df_latest = df.tail(5)
((df_latest['close'] - df_latest['rmean']) / df_latest['rstd']).values
array([-0.04303016,  0.52402959,  0.31290352, -0.33566383, -0.22423144])


という感じで進めていきました。


github.com



他の LT からの情報

Dash
https://plot.ly/dash/getting-started

pandas のデータが食える。
中身は plotly。フリーで使える(PRICING はサポート?)。D3.js を使っているので SVGではなく HTML。
同じようなプロット機能を持つ bokeh は、オンマウスとかを作り込まないといけないのでその点がイケてないとか。

GoGetSSL で SSL証明書を更新するための手順

現在運営している某サイトを SSL化していて、その SSL証明書を GoGetSSL という海外の販売所(販売代理店)で購入・申請していたのですが、最近、更新時期が近づいてきたので更新作業をしたのです。作業自体は小一時間ほどで終わったのですが、事前にあれこれ調べた時間の方が掛かったなぁ、と。更新作業自体が頻繁に発生することもないので、次に作業するときの備忘録として書き残しておきたいと思います。


《過去記事》
akiyoko.hatenablog.jp

akiyoko.hatenablog.jp



条件

  • 前回と同じドメイン認証(DV)証明書「RapidSSL」を購入
  • CSR の内容は同じ(つまり今回は再作成しない)
  • ドメインは「お名前.com」で管理している
  • サーバは Ubuntu、Nginx でドメインの設定をしている

SSL証明書の更新手順

1)Whois情報公開代行設定を解除

お名前.com の ドメインNavi にログインし、「ドメイン設定」->「ドメインWhois情報変更」から、対象のドメイン名をクリックして「登録者情報の変更」にチェックを入れると登録者情報が表示されるので、住所などの情報が正しいか確認しておきます。

f:id:akiyoko:20170612014828p:plain

次に、「Navi TOP」のドメイン一覧から、対象のドメインの「Whois情報公開代行」の「解除する」をクリックして、Whois情報公開代行の設定を解除します。

f:id:akiyoko:20170612015159p:plain


Whois情報公開代行サービスを解除したら、Whois検索で、自分で取得したドメインの Whois情報を確認しておきます。Registrant(登録者名)に自分の登録者情報が表示されていれば OKです。

Whois検索 - お名前.com




 

2)前回と同じ種類・ブランドのSSL証明書を購入

GoGetSSL にログインします。

https://my.gogetssl.com/

f:id:akiyoko:20170612015333p:plain


「Manage SSL certificate」をクリックしてSSL証明書の一覧を表示して、前回のオーダー(RapidSSL Standard)の「View」をクリックします。

f:id:akiyoko:20170612015731p:plain


「Start Renewal」をクリックします。

f:id:akiyoko:20170612015922p:plain


今回はまとめて 3年分を選択します。

f:id:akiyoko:20170612015958p:plain


PayPal で購入しました。
f:id:akiyoko:20170612020034p:plainf:id:akiyoko:20170612020156p:plain





 

3)CSRを作成(今回はしない!)

更新の度に新しいCSRを生成する必要はありますか


更新の度に新しいキーペアファイルを作成し、新しいキーペアファイルより生成した新しいCSRで申請することをお勧めします。
同じキーペアファイルを利用し続けるのではなく、サーバIDの更新の度に新たなキーペアに切り替えることがセキュリティ上も理想的です。

またMicrosoft IIS 5.0など、ウェブサーバアプリケーションによっては、前回取得時と同じCSRで取得したサーバIDでは、インストールができない仕様のものもあります。


Symantec Managed PKI for SSL サポート


ということで、セキュリティ上はアレかもしれませんが、きちんと管理できているのでそのまま前回の CSR を使い回すことにします。



 

4)CSRを申請

SSL証明書の一覧から「Generate」をクリックします。
f:id:akiyoko:20170612020252p:plain

Order Type Renewal order
Web Server Software OTHER(「Nginx」は選べなくなったようです)
Paste your CSR 前回の CSRをまるごとコピペ
Please select signature algorithm SHA2

と適宜入力して「Validate CSR」をクリックします。
f:id:akiyoko:20170612020333p:plain

「Get WHOIS email」をクリックし、送達可能なメールアドレスを選択して、「Next Step」をクリック。
f:id:akiyoko:20170612020524p:plain

氏名、メールアドレス、電話番号などを適宜入力後、「Complete Generation」をクリックします。
f:id:akiyoko:20170612020619p:plain

完了しました。証明書の一覧画面を見てみます。
f:id:akiyoko:20170612020724p:plain

まだ「Processing」になっています。
f:id:akiyoko:20170612020824p:plain


しばらくすると、メールバリデーションのための確認メールが届くので、メール中のリンクをクリックします。
f:id:akiyoko:20170629135745p:plain:w400


「承認します」をクリック。
f:id:akiyoko:20170612020931p:plain


「Active」になりました。
f:id:akiyoko:20170612021004p:plain

「Valid from」「Valid till」が更新されています。
なお、3年分更新しましたが、1ヶ月のボーナスが付いているようです。
f:id:akiyoko:20170612021157p:plain


最後に SSL証明書と中間証明書をダウンロードします。
f:id:akiyoko:20170612021302p:plain



 

5)サーバのSSL証明書を更新

以降、サーバのIPアドレスを「52.xxx.xxx.xxx」、ドメインを「akiyoko.com」、アプリ名を「akiyokoproject」として進めます。


クライアント(Mac)からサーバに SSL証明書と中間証明書を転送します。

$ scp -i ~/.ssh/aws_p1.pem ~/Downloads/www_akiyoko_com.crt ubuntu@52.xxx.xxx.xxx:/tmp/
$ scp -i ~/.ssh/aws_p1.pem ~/Downloads/www_akiyoko_com.ca-bundle ubuntu@52.xxx.xxx.xxx:/tmp/

次に、Ubuntu 上で、SSL証明書を前回のものから入れ替えます。

$ sudo cp /etc/nginx/conf/akiyokoproject.crt /etc/nginx/conf/akiyokoproject.crt.201606
$ sudo cp /etc/nginx/conf/akiyokoproject.key /etc/nginx/conf/akiyokoproject.key.201606

$ sudo cp /tmp/www_akiyoko_com.crt /etc/nginx/conf/akiyokoproject.crt
### 中間証明書を連結する
$ cat /tmp/www_akiyoko_com.ca-bundle | sudo tee -a /etc/nginx/conf/akiyokoproject.crt


CSRを新しく生成した場合は、秘密鍵(/etc/nginx/conf/akiyokoproject.key)を新しく書き換えておきます(今回は書き換えません)。


SSL証明書・秘密鍵のオーナーが root.root、パーミッションが 644 になっていることを確認。

$ ls -al /etc/nginx/conf/
total 40
drwxr-xr-x 2 root root 4096 Jun 10 20:08 .
drwxr-xr-x 6 root root 4096 Jul  8  2016 ..
-rw-r--r-- 1 root root 5070 Jun 10 20:09 akiyokoproject.crt
-rw-r--r-- 1 root root 4749 Jun 10 20:08 akiyokoproject.crt.201606
-rw-r--r-- 1 root root 1111 Jul  8  2016 akiyokoproject.crt.orig
-rw-r--r-- 1 root root 1704 Jul  8  2016 akiyokoproject.key
-rw-r--r-- 1 root root 1704 Jun 10 20:08 akiyokoproject.key.201606
-rw-r--r-- 1 root root 1704 Jul  8  2016 akiyokoproject.key.orig


Nginx をリロードします。

$ sudo service nginx reload


完了したら、SSL証明書のチェックをします。

Check SSL Installation. Test SSL now!
でチェック可能です。

「akiyoko.com」などと入力すると、診断結果が出力されます。

f:id:akiyoko:20170612021520p:plain

f:id:akiyoko:20170612021552p:plain


あるいは、
https://cryptoreport.geotrust.com/checker/views/certCheck.jsp
の方がスッキリしていていいかもしれません。


最後に忘れずに、Whois情報公開代行設定を再設定をして完了です。