akiyoko blog

akiyoko の IT技術系ブログです

「BPStudy#123 〜技術書籍執筆の実際、ノウハウ」に参加してきました

主催

BPStudy

会場

国際英語学校代々木教会ビル会場 大会議室6F
東京都渋谷区代々木1-29-5 (教会ビル)

Twitter

twitter.com



 

全体の感想など

最近、何か技術本を書きたいなぁ、と思い始めていました。
というのも、
techbookfest.org

というのを少し前に知ったからです。
こういうアウトプットのし方もあるのね、と。

あと、ちょうど最近、

というのもホットエントリーになっていたり。


ちなみに結城浩さんは、過去に自身のブログでこういったことも書いています。

本を出版するのは、一冊目が一番たいへんだ。 ほんとうに、ほんとうに一冊目はたいへん。 二冊目以降は(一冊目に比べれば)夢のように楽だ。 何が楽になるかというと、自分の中に生じる不安を吹き飛ばすのが楽になる。 「こんなに大変で、自分はやりとげられるだろうか」という不安に対しては、 「うん、大丈夫。こういう大変さはいつもと同じだ」 と答えられるようになる。 「こんなに一冊の本に時間をかけても大丈夫なのだろうか」という不安に対しては 「気持ちが前向きになっているから大丈夫。この時間は品質向上に必要な時間なのだ」 と自分に対して答えられるようになる。 いつも、祈りは必要だ。いつも、呼吸が必要なように。 それはそれとして、 二冊目以降、 自分の不安な気持ちをなだめるためのエネルギーを、 具体的な仕事に向けることができるのはとても楽なことだ。


一冊の本の7分目ほどで、何か大切なものがキラキラッと見えることがある。 本を書き始める前には知らなかった何か、 ささやかではあるけれど本質的な何かを見つかる瞬間だ。 それは著者にとって大きな報酬の1つだ。 物語をつかむ瞬間。 大きな喜びの瞬間。


でも、一番大きな喜びは、出版後にやってくる。 それは、読者から送られてくる「なるほど、わかりました!」というフィードバックだ。


本を書くということ


私自身はこれまで本を書いたことはありませんが、この一年ほど某会報誌に毎月10ページほど寄稿していたこともあり、書くことの辛さ、難しさは多少は理解しているつもりです。でもどうせ書くなら、多くの人に届けられるものを書きたい。そんなことを悶々と思っていたときに偶然見つけたこの勉強会。これは行くしかないでしょうと。


そして今回感じたこと。本を書く人は、人に何かを伝えるのが上手い。
というか、話の「構成」がうまいのかなあ、と感じました。きちんと伝えられるような構成をまず考えているというか、伝えたいことを中心に話を作っているというか。技術書とは言えど、本を買った人に何かを残す、という使命をきちんと意識しているように思いました。



 

まず、共著からやってみよう 〜 Pythonエンジニアファーストブックで学んだノウハウの共有

鈴木 たかのり 氏(株式会社ビープラウド)

Slide:Pythonエンジニアファーストブックの紹介


  • 6章を5人で書いた。
  • ターゲットは、これからPythonを仕事で使うエンジニア
  • Pythonエンジニア養成読本を改訂
    • Pythonのバージョンを3系に
    • Bottle → Djangoに変更
    • ライブラリ、ツールを最新に
  • スケジュール
    • 2016年12月に改訂を打診
    • 3月にキックオフの飲み会
    • 6月に Web以外脱稿
    • 7月に Web脱稿
    • 9月9日発刊
  • 打ち合わせでストーリー作成
  • LEGOのデータを使おう!
    • 実際に Scrapy で LEGO のデータをクローリングしている人がいる *1

 
Pythonエンジニアファーストブックで学んだノウハウの共有
清原 弘貴 氏(株式会社ビープラウド)

Slide:共著からやってみよう 〜Pythonエンジニアファーストブックで学んだノウハウの共有

  • 初めてなら共著をオススメ
    • 今まで他の本をやってきた人の執筆ノウハウが使える
    • 執筆の流れが理解できる
  • 執筆ノウハウ
    • Sphinx で書く
    • term-validator でビルドのたびに漢字や表記の揺れを自動でチェックしてくれる
    • TODOや指摘をプルリクでやり取り(GitLab?)
    • Dropbox で PDFファイルを直接レビュー(すごい!!オススメ!)
      • PDFにコメントを付けられる
      • Dropbox と Adobe が提携してるから実現してる??
  • Slack でやりとり
  • コードは GitHub で公開している
  • 執筆の流れ
    • 意外と時間が掛かるし、流れや見積もり感覚が開発と少し違う
  • 良かったところ
    • 知識を補完し合える(得意・不得意)
    • よく知ってる人としてのレビュー、知らない観点からのレビュー
    • 著者みんなで告知できる
      • Twitter、POP行脚、イベント発表、打ち上げ
  • 積極的にレビューするのが大事
  • 共著に参加するには?
    • 声が掛かりそうな人と仲良くなる
    • 私できますよ的な雰囲気をアピール
    • 信頼貯金を貯めよう
  • 「意見は率直に」
    • by「ピクサー流 創造するちから」



 

技術書を書くということ。商業誌を書くということ 〜 Jupyter 実践入門執筆プロジェクトを終えて

池内 孝啓 氏(株式会社 slideship)


  • 技術書を書くということ
  • 動機
    • 利己的
      • 自己や自社のブランディング
      • 経験
      • 印税
    • 利己的
      • 世に広める
      • 後世に記録を残す
  • ブランディング
    • キャリアの方向性と書籍の領域がマッチしていればブランディングになる
    • 実績として分かりやすい
  • 技術の輪を広げる
    • コミュニティに還元(Pay it forward)
  • 印税?
    • 300頁/1時間あたり1.5頁=200時間
    • 一冊 120万円とすると、割に合わない?
  • 納本制度
    • Jupyter本も納本済み
    • 知識や技術が陳腐化しても、当時の考えや歴史は覆らない
  • 商業誌を書くということ
  • 利益を出す必要がある
  • 良い本かどうかはマーケットが判断
  • Jupyter本は、2016年2月頃に技術評論社へ企画を持ち込む
    • 紆余曲折を経て2017年に企画スタート
  • テーマ選択の理由は「行ける!」と思ったから
  • ベネフィットを届ける
  • 読者は高度な専門知識に対してお金を払っている
    • 正確な情報
    • 妥当な方法
  • 読者がどれだけ利益を得たかが全て
    • 知らなかったことが知れる。分からなかったことが分かる
    • 学習のきっかけ
  • 売上の向上のために
    • ニーズに答える
    • ベネフィットを提供
    • マーケットの大きなところを狙う
  • 利益率を上げるために
    • 執筆コストを下げる
    • 執筆ノウハウを共有
  • 執筆プロジェクトは、ステークホルダーの利益をどう最大化させるかという視点をもっと持つ
  • O'Reillyのアトラス?どうなったか不明
  • テキストからコンバート?
  • GitBook?(Sphinx の代替として)
    • Markdown を束ねるツール


 

はじめての執筆でわかった技術書ができるまでの流れ

岩崎 圭 氏(株式会社 SQUEEZE)

docs.google.com


  • スケジュール
    • 2016年10月キックオフ
    • 2017年6月が本来の〆切 → 8月に完成
  • 形式は Markdown
  • GitLab の git で管理
  • やり取りは Slack
  • pyhack の常連 + ブログも書いていたので? 声をかけてもらったのかな?
  • まずは企画を通す
  • 最初のキックオフMTGでアウトラインを出す
  • ツールは、Sphinx, Re:VIEW
  • 執筆が上手くいかない問題
    • 書く時間を上手く確保できない
      • 平日仕事が終わったら必ず「コワーキングスペースに行く」を習慣化
    • 筆が進まない問題
      • 各章で最初にアウトラインを書くようにした
    • 執筆のアクティビティを Slack に流す
      • 執筆が死んでる感を出さないように
  • 1章あたりどんなに短くとも2週間は掛かった
  • 原稿消滅事件
  • レビューはDropboxコメント機能を利用
  • 修正は時間と体力との戦い
  • もう少し上手くやりたかったこと
    • 日本語力不足の解消
    • 最低限の校正の自動化(textlint x CI など)
    • 原稿の自動ビルド(テンションが違う)
    • 原稿の時点である程度レビューしたかった
    • 素のMarkdownがつらい
      • コラム、Note、Point など書籍ならではのブロックの表現
  • とんでもない量の時間と体力を費やして本当に疲れた
  • 技術的な内容を日本語に変換するのが難しい

gitlab.com の原稿消失事件は、2月のコレらしい。
結局大丈夫だったとのこと。




 

LT

 

技術書は Jupyter Notebook で書けばいいんじゃない?

driller / どりらん 氏

  • Jupyter Notebook とドキュメントビルダーだけで OK!
  • nbconvert で変換
  • Shpinx, Pelican
  • nbsphinx
  • PDF や ePub を作成するなら ⇒ Sphinx
  • HTML形式だけでよいなら ⇒ Miyadaiku
  • ただし、テキスト校正ツールが使えない、コーディング規約のチェックが使えないなどの問題も

 

技術書査読・校正の現場から

Hayao Suzuki 氏


 

一流のエンジニア/経営者になるため基礎力を磨け!

高崎健太郎

  • 一流になるためには学びが重要
  • 自習、経験、環境
  • ぶれない軸
  • 一緒に学び合える仲間
  • 学びを与えてくれるもの
    • 歴史、スポーツ
      • 同じテーマで議論できる
      • 葛藤、挫折、新たな挑戦。組織論、戦術論


 

技術書の原稿はWordで書いちゃダメゼッタイという話

生形 可奈子 氏(アシアル株式会社)

  • スラスラわかるJavaScript は単著
  • 増刷で修正する場合は、軽微な修正であっても原稿データと同期を取る
  • Amazonレビューの「違反を報告」はヤバイ

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

主催

fin-py

会場

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

Twitter

twitter.com



 

全体の感想など

fin-py は今回で 3回目の参加となりました。

Python は業務で7年ほど&プライベートでもちょくちょく触っているのでそこそこ使いこなせますが、これまで金融業界の経験もないし、個人的にほとんど投資をしたことがないので、Finance の部分は素人同然。発表のときに「約定」を「やくてい」と読んでしまうほどのレベルです。。


まあ、金融業界にいなくても独学で十分という話もありますが。。


あと今回は参加者が多くてビックリしました。特に初参加の方が多かったようです。Quantopian 関連の人が多かったのでしょうか、詳しくはよく分かりません。



《過去記事》
akiyoko.hatenablog.jp

akiyoko.hatenablog.jp



 

やりたかったこと

bitFlyer の BTC-FX API を使ってトリガー検知

bitFlyer Lightning FX(ビットコイン FX) では、預入証拠金に対して最大15倍の取引ができるのが特徴です。最低取引金額が 0.001 BTC になっているため、1BTC=100万円として 1,000 円(レバレッジ15倍なら預入証拠金は約67円)から取引ができることになります。


bitFlyer ビットコインを始めるなら安心・安全な取引所で
bitFlyer ビットコインを始めるなら安心・安全な取引所で


背景としては、この一年の仮想通貨のトレンドとして、

Ripple(3月上旬)
アルトコイン(〜6月中旬)
草コイン(〜7月?)
ICO(〜9月中旬)
ハードフォーク(〜11月?)
チャイナショック(9月初旬) ⇒ アルトコインが焼かれる
CME先物発表(10月下旬) ⇒ アルトコインが焦土に
取引所増加
BTC-FX ⇐ 今ココ!?


みたいな流れがあったりするので、ちょっと触ってみようかと(まだ触ったことはありません)。


 

やったこと

  • FX 戦士たちの戦略調査
  • bitFlyer Lightning(FX取引所)を眺めてみる
    • いろんな音が鳴ってた ♪
  • pybitflyer 触ってみた
  • ccxt で書いてみた
  • テクニカル指標を扱うライブラリ「TA-Lib」を使ってグラフ書いてみた

 

環境
$ sw_vers
ProductName:    Mac OS X
ProductVersion: 10.12.6
BuildVersion:   16G1036

$ python --version
Python 3.5.2 :: Anaconda 4.2.0 (x86_64)


 

TA-Lib のインストール

テクニカル指標を扱うライブラリ。
GitHub - mrjbq7/ta-lib: Python wrapper for TA-Lib (http://ta-lib.org/).

$ brew install ta-lib
$ pip install TA-lib

TA-Lib (0.4.10)

「error: command '/usr/bin/clang' failed with exit status 1」とのエラーが出るので、まず先に「brew install ta-lib」が必要。

(参考)python - /usr/bin/clang command failing trying to pip install TA-lib on MacOS - Stack Overflow


 

pybitflyer のインストール

id:yag_ays さん作の bitFlyer REST API のラッパーライブラリ。
bitFlyer LightningのAPIをPythonから使えるパッケージ「pybitflyer」を作りました - おおかみ山

$ pip install pybitflyer

pybitflyer (0.1.7)


使ってみる。

import pybitflyer

exec(open('env.py', 'rb').read())

api = pybitflyer.API(
    api_key=BITFLYER_KEY,
    api_secret=BITFLYER_SECRET,
)
api.board(product_code='FX_BTC_JPY')

こんな感じで、板情報が取れます(それぞれ100件くらい)。

{'asks': [{'price': 942400.0, 'size': 0.00310928},
  {'price': 942497.0, 'size': 0.60458056},
  {'price': 942498.0, 'size': 0.04},
  ...],
 'bids': [{'price': 942212.0, 'size': 0.0521},
  {'price': 942152.0, 'size': 0.3},
  {'price': 942151.0, 'size': 0.22},
  ...],
 'mid_price': 942306.0}


 

ccxt で書いてみた

pybitflyer とほぼ同じことが書けます。

import ccxt
from pprint import pprint

exec(open('env.py', 'rb').read())

ex = ccxt.bitflyer({
    'apiKey': BITFLYER_KEY,
    'secret': BITFLYER_SECRET,
})

pprint(ex.fetch_ticker('FX_BTC_JPY'))
print('-' * 50)
pprint(ex.fetch_order_book('FX_BTC_JPY'))
{'ask': 1019470.0,
 'average': None,
 'baseVolume': 234473.73139995,
 'bid': 1019144.0,
 'change': None,
 'close': None,
 'datetime': '2017-11-26T12:56:20.000Z',
 'first': None,
 'high': None,
 'info': {'best_ask': 1019470.0,
          'best_ask_size': 0.0152,
          'best_bid': 1019144.0,
          'best_bid_size': 1.4489,
          'ltp': 1019144.0,
          'product_code': 'FX_BTC_JPY',
          'tick_id': 10554736,
          'timestamp': '2017-11-26T12:56:20.9',
          'total_ask_depth': 8018.9239892,
          'total_bid_depth': 11740.4605367,
          'volume': 249894.26662009,
          'volume_by_product': 234473.73139995},
 'last': 1019144.0,
 'low': None,
 'open': None,
 'percentage': None,
 'quoteVolume': 249894.26662009,
 'symbol': 'FX_BTC_JPY',
 'timestamp': 1511700980000,
 'vwap': None}
--------------------------------------------------
{'asks': [[1019470.0, 0.0152],
          [1019475.0, 0.0152],
          [1019494.0, 0.2008],
          ...,
          [1735257.0, 0.79804842]],
 'bids': [[1019144.0, 1.4489],
          [1019143.0, 2.331],
          [1019140.0, 0.01],
          ...,
          [95000.0, 2.0]],
 'datetime': '2017-11-26T12:56:22.000Z',
 'timestamp': 1511700981575}


しかしながら、pybitflyer と同じく 100件ほどしか板情報が取れないため、例えばボリンジャーバンドを計算するための ticker の情報はどうやって収集すればいいの?というのが懸念点。



 

TA-Lib を使ってグラフ書いてみた

とりあえず、さくらのクラウドサーバ上の MongoDB に格納している ticker データからグラフ作ってみました。

前回の反省を活かし、Jupyter Notebook で。

% matplotlib inline

from datetime import datetime, timedelta

import matplotlib.pyplot as plt
import pandas as pd
import talib
from pymongo import MongoClient, ASCENDING
from sshtunnel import SSHTunnelForwarder

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

now = datetime.now()
df = None

with SSHTunnelForwarder(
    '153.xxx.xxx.xxx',
    ssh_username='ubuntu',
    ssh_pkey='/Users/akiyoko/.ssh/sakura.pem',
    remote_bind_address=('127.0.0.1', 27017)
) as server:
    # server.start()
    print(server.local_bind_port)

    client = MongoClient('127.0.0.1', server.local_bind_port)
    db = client['bittrex']
    collection = db['tickers']

    records = list(collection.find(
        {
            'symbol': 'BTC',
            'timestamp': {'$gte': now - timedelta(minutes=60 * 24)},
        },
        {'_id': False},
    ).sort('timestamp', ASCENDING))

    df = pd.DataFrame(records)
    # Need?
    # https://stackoverflow.com/a/17328858/8426544
    #df = df.set_index(pd.DatetimeIndex(df['timestamp']))

print(df.dtypes)

df['sma'] = talib.SMA(df['last'].values, timeperiod=12)
print(df)

ax = df.plot(x='timestamp', y='last')
df.plot(ax=ax, x='timestamp', y='sma', secondary_y=True)


f:id:akiyoko:20171126220525p:plain





 

LT

pandas はデータをリサンプリングできる。例えば、1分足から5分足へ。

例えば、こんな感じ。

% matplotlib inline

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

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

df = pd.read_csv('DAT_ASCII_EURUSD_M1_2015.csv', sep=';',
                 names=('Time', 'Open', 'High', 'Low', 'Close', ''),
                 index_col='Time', parse_dates=True)
df.index += pd.offsets.Hour(7)

# cf. https://stackoverflow.com/a/36223274/8426544
# cf. http://nekopuni.holy.jp/2015/01/pythonnysol%E7%82%BA%E6%9B%BF%E9%AB%98%E9%A0%BB%E5%BA%A6%E3%83%87%E3%83%BC%E3%82%BF%E3%81%8B%E3%82%89%E4%BB%BB%E6%84%8F%E3%81%AE%E3%83%AD%E3%82%A6%E3%82%BD%E3%82%AF%E8%B6%B3%E3%83%81%E3%83%A3/
df = df.resample('1H').agg({
    'Open': 'first',
    'High': 'max',
    'Low': 'min',
    'Close': 'last',
}).ffill()
df['FastMA'] = talib.SMA(df['Close'].values, timeperiod=10)
df['SlowMA'] = talib.SMA(df['Close'].values, timeperiod=30)

df.plot(y=['Close', 'FastMA', 'SlowMA'])

from pandas_highcharts.display import display_charts
df = pd.DataFrame({'Close': df['Close'], 'FastMA': df['FastMA'], 'SlowMA': df['SlowMA']})
display_charts(df, chart_type="stock", title="MA cross", figsize=(640, 480), grid=True)

(参考)PythonでFXシストレのバックテスト(1)


resample() メソッドを使用することで時系列データの頻度を変換できます。日次のデータを週次や月次などのデータに変換できます。


どりらんさん共著の Jupyter 本に載ってる!(P.128 あたり)


Jupyter 上で動かせるチャートを書くなら、pandas-highcharts が良さげ。
python-highcharts もあるよ。


 

「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'},
...]

「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 という概念を実現している」とのこと。