bitcoin保管方法まとめ
自分用にまとめ。随時更新
免責事項: 筆者は、あなたに対して何も保証しません。筆者は、あなたに対して一切責任を負いません。すべての作業は自己責任で行って下さい。
所感
セキュリティ
ペーパーウォレット>物理デバイス>>>デスクトップウォレット>>モバイルウォレット>>>>>>>ウェブウォレット
取引のしやすさ
Webウォレット>>>モバイルウォレット=デスクトップウォレット=物理デバイス>>>>>>>>>>>>>>>>ペーパーウォレット
特徵
ペーパーウォレット
アドレスと秘密鍵を印刷して保管する方法。長期間の保存を目的とする。送金時には、デスクトップ・モバイル・ウェブウォレットなどにインポートする。ソースコードをダウンロードして、オフラインで作成。
メリット
- オフラインで作成した場合、最も安全
デメリット
- 盗難・火災による紛失の可能性(コピーがない場合は復元できない)
- 使いにくい
物理デバイス
専用のデバイスに保管する方法。長期保管を目的としている
メリット
- オフラインで保管するためクラッキングの可能性は低く、物によってはパスワード・取引の承諾などによって厳重にプロテクトをかけることができるため、ペーパーよりセキュリティが高い
- PCに接続するだけなので取引の利便性が良い
デメリット
- 紛失盗難の可能性
デスクトップウォレット
デスクトップアプリをインストールしてローカル環境で管理する方法
メリット
- 利便性が良い
- オフラインで管理する場合はセキュリティ面でも優れている
デメリット
- PCの故障により取り出せなくなる可能性があるので、PCのバックアップに気を使う必要がある
- ハッキングやウイルス感染により盗まれる可能性があるので、PCのセキュリティには注意する必要がある
モバイルウォレット
スマートフォン上で管理する方法
breadwallet - bitcoin wallet - iOS
MYCELIUM - Android
メリット
- QRコードを利用できる
- 実店舗の利用に便利
デメリット
- スマートフォンの紛失盗難の可能性
- ハッキングによって盗まれる可能性
ウェブウォレット
ウェブ上のウォレットサービスを利用する方法
メリット
- 使いやすい
- どのコンピューターからもアクセスできる
- セキュリティをサービス提供者に一任できる
デメリット
- 多くのビットコインが集まるためハッキングの可能性が最も高い
Amazon Dash Buttonをハックする
ウィルキンソン Dash Buttonをハックしたときの備忘録。
Amazon Dash Buttonのセットアップ
まずはAmazon iOS/Androidアプリを使って、Amazon Dash Buttonのセットアップ。商品選択でキャンセルしておくことに注意。
MACアドレスの取得
使用するのはdash-buttonというライブラリ。これをインストールする。
npm i -S dash-button
package.json
のscripts
に手を加える:
{ "scripts": { "scan": "dash-button scan" } }
スキャン実行中に、Amazon Dash Buttonを押すとMACアドレスが取得できる:
sudo npm run scan > amazon-dash-button@1.0.0 scan /Users/uraway/github/amazon-dash-button > dash-button scan Scanning for DHCP requests and ARP probes on en0... Detected a DHCP request or ARP probe from xx:xx:xx:xx:xx:xx
うまくいかない場合は、インターフェースオプション(--interface
/-i
)をつけて、他のインターフェースを試してみるといいかもしれない。
Amazon Dash Buttonを入退室ボタンにしてみる
SlackのAPIを使って、Slackに入退室のメッセージを送信するボタンにハックしてみる。
const DashButton = require('dash-button'); const Slack = require('node-slack'); const DASH_BUTTON_MAC_ADDRESS = 'xx:xx:xx:xx:xx:xx'; const HOOK_URL = 'https://hooks.slack.com/services/*****'; let button = new DashButton(DASH_BUTTON_MAC_ADDRESS); let slack = new Slack(HOOK_URL); let i = 0; button.addListener(() => { i++; console.log(`${i} times working!`); if (i % 2 === 0) { slack.send({ text: '入室しました', username: 'WILLKINSON' }); } else { slack.send({ text: '退室しました', username: 'WILLKINSON' }); } });
スクリプト実行中にAmazon Dash Buttonを押すと…
- 出版社/メーカー: Amazon
- 発売日: 2016/12/05
- メディア: エレクトロニクス
- この商品を含むブログを見る
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.
nokogiri
がインストールできない
Gem::Ext::BuildError: ERROR: Failed to build gem native extension. An error occurred while installing nokogiri (1.6.8.1), and Bundler cannot continue. Make sure that `gem install nokogiri -v '1.6.8.1'` succeeds before bundling.
xcodeのコマンドラインツールをインストールすれば解決した:
gem uninstall nokogiri xcode-select --install gem install nokogiri
依然xcode関係を整理したからかな?
npmに代わるNodeパッケージマネージャーyarn
yarn
FacebookとExponent, Google, Tildeとの共同チームによって生まれた新しいパッケージマネージャー
Yarn pulls packages from registry.yarnpkg.com, which allows them to run experiments with the Yarn client. This is a proxy that pulls packages from the official npm registry, much like npmjs.cf.
新しいレジストリも作るのかと一瞬思ったけど、どうやらそうではなく、npmレジストリを利用するための新しいクライアントのようだ。よかった。
npmjsのブログを見る限りはyarnのリリースにかなり好意的。でもnpm Inc.がyarn開発からハブられたのはなぜなのか。
特徴
https://bower.io/blog/2016/using-bower-with-yarn/
bowerのブログを参考にまとめる。ただ、yarnとbowerは今は共存してない様子。
Lockfile
ユーザーやデバイス間にまたがるプロジェクトのライブラリのバージョン違いをなくす。npmでいうshrinkwrap
機能。チーム開発していると頻発するので嬉しい。
Security
パッケージをインストールする前にパッケージをチェックしてセキュリティを高める。キャッシュを使うのもセキュリティ面で効果があるんだろう。
Offline
洗練されたキャッシュシステムで、パッケージのインストールにかかる時間を大幅に減らし、またオフラインでも使用可能になる。速い。
インストール
npm install --global yarn
pip
をeasy_install
したのを思い出した。
使い方
npmとのコマンド対応表
https://yarnpkg.com/en/docs/migrating-from-npm#toc-cli-commands-comparison
npm | Yarn |
---|---|
npm install | yarn install |
(N/A) | yarn install --flat |
(N/A) | yarn install --har |
(N/A) | yarn install --no-lockfile |
(N/A) | yarn install --pure-lockfile |
npm install [package] | (N/A) |
npm install --save [package] | yarn add [package] |
npm install --save-dev [package] | yarn add [package] --dev |
(N/A) | yarn add [package] --peer |
npm install --save-optional [package] | yarn add [package] --optional |
npm install --save-exact [package] | yarn add [package] --exact |
(N/A) | yarn add [package] --tilde |
npm install --global [package] | yarn global add [package] |
npm uninstall [package] | (N/A) |
npm uninstall --save [package] | yarn remove [package] |
npm uninstall --save-dev [package] | yarn remove [package] |
npm uninstall --save-optional [package] | yarn remove [package] |
(N/A) | yarn upgrade [package] |
Git Large File Storage
参考
Git Large File Storage (Git LFS) とは、大容量ファイルを扱うためのGit拡張。オーディオ・ビデオ・データセット・グラフィクスといったファイルをリモートサーバーに格納し、テクストポインタとしてGitで管理することができる。
環境
OS X El Capitan Version 10.11.6 git version 2.10.0
インストール
$ brew install git-lfs $ git lfs install
使ってみる
新規プロジェクトの場合
まずはバイナリファイルを用意し、これを管理することにする:
$ touch README.md $ ls > large.bin
git-lfsで管理するファイルのパターンを設定する:
$ git lfs track '*.bin' Tracking *.bin
'*.bin'のパターンにマッチするすべてのファイルが対象となる。
git-lfsに管理されているファイルパターンを確認するには、引数無しでgit lfs track
を実行する:
$ git lfs track Listing tracked paths *.bin (.gitattributes)
また、pre-push
フックと.gitattributes
が作成されている:
$ cat .git/hooks/pre-push #!/bin/sh command -v git-lfs >/dev/null 2>&1 || { echo >&2 "\nThis repository is configured for Git LFS but 'git-lfs' was not found on your path. If you no longer wish to use Git LFS, remove this hook by deleting .git/hooks/pre-push.\n"; exit 2; } git lfs pre-push "$@" $ cat .gitattributes *.bin filter=lfs diff=lfs merge=lfs -text
Herokuなんかはgit-lfsに対応していないので、このpre-push
フックを削除しないとうまくビルドできないので注意。
次にこの.gitattributes
をコミットする必要がある:
$ git add .gitattributes $ git add large.bin $ git commit -m "Added bin"
git lfs ls-files
コマンドでgit-lfs対象のファイルを確認できる:
$ git lfs ls-files 02c2d7a18e * large.bin
既存のプロジェクトの場合
すでにバイナリファイルをgit-lfsを使わずにコミットしており、途中からgit-lfsで管理したいとする:
$ git init . $ ls > bar.bin $ ls > foo.bin $ git add . $ git commit -m "initial commit" $ ls > foo.bin $ git add foo.bin $ git commit -m "Second commit"
トラック対象のファイルを定義する:
$ git lfs track '*.bin' $ git add .gitattributes $ git commit -m "Now tracking bin files" $ git tag not_working
対象のファイルを定義した.gitattributes
をコミットしただけなので、バイナリファイルがlsfオブジェクトに変換されたわけではない。
すでにコミットしたファイルのキャッシュをクリアし、もう一度コミットし直す:
$ git rm --cached *.bin $ git add *.bin $ git commit -m "Convert last commit to LFS"
git lfs ls-files
コマンドで対象のファイルを確認する:
$ git lfs ls-files 4665a5ea42 * bar.bin 4665a5ea42 * foo.bin
最新の履歴のfoo.bin
ファイルの中身を確認すると、lfsオブジェクトに変換されていることがわかる:
$ git show HEAD:foo.bin version https://git-lfs.github.com/spec/v1 oid sha256:4665a5ea423c2713d436b5ee50593a9640e0018c1550b5a0002f74190d6caea8 size 36
過去(バイナリファイルをコミットし直す前)の履歴のfoo.bin
ファイルでは、まだ変換されていない:
$ git show not_working:foo.bin bar.bin foo.bin
過去の履歴のファイルも変換するには、git-lfs-migrateを使うらしい。
単語をベクトル化するword2vec(gensim)を使い、指定した二単語間の関連度を算出する
word2vec
2014年から2015年辺りに流行った、単語をベクトル化して評価する手法。 有名なのは、
king – man + woman = queen
学習データとなるコーパスを準備する
無料かつ簡単に手に入るWikipediaのdumpファイルから持ってきます。
https://dumps.wikimedia.org/jawiki/latest/ の jawiki-latest-pages-articles.xml.bz2 をダウンロードします。
xmlファイルのままでは使えないので、 これをwp2txtを使ってplain.txtに変換します:
$ gem install wp2txt
$ wp2txt jawiki-latest-pages-articles.xml.bz2
ファイルが大量に作成されるので、次のように連結します:
$ cat jawiki-latest-pages-articles.xml-* > jawiki.txt
word2vecでは、単語ごとにスペースで区切られている必要があるので、日本語形態素解析器であるMecabを使って分かち書きします。
まずは、Mecabと標準辞書(IPA)をインストールします:
$ brew install mecab mecab-ipadic
さらにmecab-ipadic-NEologdというカスタム辞書をインストールします:
$ git clone --depth 1 https://github.com/neologd/mecab-ipadic-neologd.git
$ cd mecab-ipadic-neologd
$ ./bin/install-mecab-ipadic-neologd -n
Mecabと辞書のインストールが完了しました。まずはカスタム辞書のインストール先を調べます:
$ echo `mecab-config --dicdir`"/mecab-ipadic-neologd"
/usr/local/lib/mecab/dic/mecab-ipadic-neologd
Mecabの -d オプションにこのパスを指定して、分かち書きを行います:
$ mecab -d /usr/local/lib/mecab/dic/mecab-ipadic-neologd \
-Owakati jawiki.txt > jawiki_wakati.txt
これで学習データの準備が整いました。
word2vecの実装
参考
- https://radimrehurek.com/gensim/models/word2vec.html
- http://rare-technologies.com/word2vec-tutorial/
- http://tjo.hatenablog.com/entry/2014/06/19/233949
- http://sucrose.hatenablog.com/entry/2013/10/29/001041
Pythonのgensimを使って、word2vecを使用します。cythonを入れると学習時間が短縮されるみたいです。
$ easy_install gensim numpy scipy
$ pip install cython
まずは、学習のためのスクリプトを記述、実行します:
train.py
# -*- coding: utf-8 -*- from gensim.models import word2vec import logging logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO) sentences = word2vec.Text8Corpus('jawiki_wakati.txt') model = word2vec.Word2Vec(sentences, size=200, min_count=20, window=15) model.save("jawiki_wakati.model")
$ python train.py
あまりにも時間がかかりすぎる場合はファイルを分割します。最終的に100MBほどに分割して学習させました。
これでモデルができました。ちょっと動作を確かめてみましょう。
similarity.py
# -*- coding: utf-8 -*- from gensim.models import word2vec import logging import sys logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO) model = word2vec.Word2Vec.load("jawiki_wakati.model") argvs = sys.argv print model.similarity(argvs[1], argvs[2])
これを実行します。
$ python similarity.py 日本 フィリピン
2016-09-09 21:57:52,064 : INFO : loading Word2Vec object from jawiki_wakati.model
2016-09-09 21:58:03,569 : INFO : loading syn0 from jawiki_wakati.model.syn0.npy with mmap=None
2016-09-09 21:58:03,956 : INFO : loading syn1 from jawiki_wakati.model.syn1.npy with mmap=None
2016-09-09 21:58:04,573 : INFO : setting ignored attribute syn0norm to None
0.262511504266
学習量が少ないので正確性にはかけるのでしょうが、ちゃんと単語類似度を返しています。
APIとして使う
ほかのプログラミング言語から使用しやすいように、APIとして使えるようにしてみます。
フレームワークにはFalconを使用、WSGIサーバーのgunicornも一緒にインストールします。
$ pip install falcon gunicorn
簡単に、2つのトークンを受け取って、類似度をJSONで返すAPIを作成します:
server.py
# -*- coding:utf-8 -*- import json import falcon from gensim.models import word2vec import logging class Server(object): def __init__(self): self.logger = logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO) self.model = word2vec.Word2Vec.load("jawiki_wakati.model") def on_get(self, req, res): s1 = req.get_param('s1') s2 = req.get_param('s2') content = { "similarity": self.model.similarity(s1, s2) } res.body = json.dumps(content) app = falcon.API() app.add_route("/", Server())
サーバーを動かしてみます:
$ gunicorn server:app
次のようにGETリクエストを送ると、JSONで返ってきます:
$ curl "127.0.0.1:8000?s1=日本&s2=フィリピン"
{"similarity": 0.26251150426566316}
Docker
デプロイしやすいようにDockerで動かしてみます。
現在の環境はこれ:
Dockerファイルを追加:
Dockerfile
FROM python:2.7.9 RUN pip install --upgrade pip WORKDIR /gensim-api COPY requirements.txt /gensim-api RUN pip install -r requirements.txt COPY . /gensim-api
管理が楽なのでDocker Composeを使用:
docker-compose.yml
api: image: gensim-api command: gunicorn --reload -b 0.0.0.0:5000 server:app volumes: - .:/gensim-api ports: - "5000:5000"
次のコマンドでDockerイメージを作成し、コンテナを起動します:
$ docker build -t gensim-api . $ docker-compose up
最後に
上記のように、gensimを使えば簡単に単語の類似度が算出できることが分かりました。学習データの準備さえ乗り越えれば、あとはどうってことないと思います。
ソースコードはこちら:
https://github.com/uraway/gensim-api
今のところ、学習量は100MBなんですが、続けて学習させることも可能っぽいので、適度に更新しておきます。
単語の類似度以外にもいろいろ出来そうです。
Atom linter-rubocop でのエラー
linter-rubocop 0.5.0
Error: /Users/uraway/.rvm/rubies/ruby-2.3.1/lib/ruby/site_ruby/2.3.0/rubygems.rb:270:in `find_spec_for_exe': can't find gem rubocop (>= 0.a) (Gem::GemNotFoundException) from /Users/uraway/.rvm/rubies/ruby-2.3.1/lib/ruby/site_ruby/2.3.0/rubygems.rb:298:in `activate_bin_path' from /Users/uraway/.rvm/gems/ruby-2.3.1/bin/rubocop:22:in `<main>' from /Users/uraway/.rvm/gems/ruby-2.3.1/bin/ruby_executable_hooks:15:in `eval' from /Users/uraway/.rvm/gems/ruby-2.3.1/bin/ruby_executable_hooks:15:in `<main>' at /Users/uraway/.atom/packages/linter-rubocop/lib/index.coffee:57:15 at process._tickCallback (internal/process/next_tick.js:103:7)
linter-rubocopが参照しているrubocopの場所がどうもおかしい。
とりあえずlinter-rubocopのドキュメントを見ると、解決法が:
rubocopのパスを調べて
which rubocop /Users/uraway/.rvm/gems/ruby-2.3.1/bin/rubocop
bin/
をwrappers/
に置き変えて、linter-rubocopのexecutablePath
にペースト:
/Users/uraway/.rvm/gems/ruby-2.3.1/wrappers/rubocop
エラーはでなくなった。