Bitcoinの技術について調べてみました
大変有名な仮想通貨であるBitcoinについて少し調べてみたのでまとめます。
以下のサイトを参考にしました。
はじめに
このシステムを思いついたサトシ・ナカモトと言われる人物は間違いなく本物の天才でしょう。
Bitcoinが高度な技術を使用しているからではありません。
お金の本質を完璧に理解し、過不足なくシステム化してあるからです。
Bitcoinとは簡単に言うと「全員が複写している署名付き台帳」のことです。
コインはどこで管理されているのか
Bitcoinのコインは一体どこにあるのか?
答え:「どこにもない」
まぁ強いて言うなら口座残高の数字がそれだといえるかもしれません。
日本円であれば紙幣1枚1枚にIDが振ってありますが、Bitcoinは紙幣や硬貨に相当するデータがありません。
有るのは取引履歴だけです。
これはまさしくお金の本質を射ています。
紙幣は元々は貴金属などの価値のある物品の預り証が起源と言われています。 近代まで時代が下ると、金と交換できることを前提に広くやり取りされるようになりました。 つまり、本来の紙幣の役割は以下の2つです。
- 金と1対1で対応していること
- 他人と取引できること
しかし、ニクソンショック以降は紙幣と金の交換は保証されなくなりました。 即ちお金の本質は以下の一点に集約されます。
- 他人と取引できること
つまり取引の記録さえ正しく取れば通貨として成立するわけです。
Bitcoinによる送金の記録
Bitcoinの送金の記録は非常にシンプルです。 一回の送金記録はトランザクションと言われます。 トランザクションは以下のデータの集合です。
- 宛先口座番号(=受け手の公開鍵)
- 直前の取引のハッシュ値
- 送金者のデジタル署名
要は「いつどこに送ったか」という情報に送金者のサインが有るだけです。
ちょっと工夫しているなと思うのが以下の点です。
まさに無駄がないといった感じでとても好きです。
- 前後関係の管理に取引時間ではなく直前取引のハッシュ値を利用している。
- 口座番号はデジタル署名に使う公開鍵を使用している。
不正を考慮しなければこれで通貨としては成り立ちます。
Bitcoinにおける不正監視
Bitcoinは送金記録の集まりなので起こりうる問題があるとすれば、次のような感じ。
1に関しては前回取引の記録をハッシュ値にして取り込んでいるので、ハッシュ機構とデジタル署名がまともに機能していれば防げます。
2〜3に関しては結局どの取引を信用するのかという問題になります。
4に関しても残高がマイナスになるような取引を信用せず、受け取り手が後にトランザクションを繋げなければいいだけの話です。
(逆に信用してトランザクションを繋げれば信用貸状態になるということです)
通常の通貨であれば銀行がこのあたりの責任を負うのですが、Bitcoinには中央銀行が存在しないP2Pシステムです。
Bitcoinの結論は「コストのかかっている取引を総意とする」ということです。
ブロックチェーンによる総意の決定
トランザクションはブロックという単位でアーカイブされ、これまたチェーン構造を取ります。(ブロックチェーン)
このブロックチェーンはネットワーク全体に公開され、参加者なら誰でも継ぎ足すことができます。
そして、ここがBitcoinの肝なのですが、このブロックを作るには膨大な計算リソースを消費するように設計されています。
つまりブロックチェーンの長い取引ほどコストがかかっているわけです。
ブロックチェーンが競合した場合は最も長いブロックチェーンをBitcoinネットワーク全体のブロックチェーンとして信用します。
自由競争市場ではモノの価値はいずれコストに落ち着く仕組みを上手く利用して、コストにより価値を維持しているのです。
通常の通貨が政府によりコントロールされているのに対して、競争の仕組みで通貨価値をコントロールしているのは、本当に経済というものをよく理解しているなと思いました。
Bitcoinの新規発行
Bitcoinは基本的には壊れたりなくしたりしないので、新規発行しなくても問題内容に思います。
通貨価値は市場原理でコントロールされますし。
ですがBitcoinは新規発行通貨をブロックチェーンに追記した者(通称マイナー)に報酬として付与しています。
これは本当に感嘆したのですが、ネットワーク維持コストをインフレによって贖っているということです。
現在Bitcoinは注目が高まっているため需要が高まり価格があがり続けていますが、一般には通貨というのは発行量が増えると価値が下がっていきます。
つまり、新規発行が増えれば増えるほど既存のBitcoin保有者は損をするということになります。
そしてその損失分はマイナーの利益として供給されます。
つまりBitcoinの新規発行の仕組みは、全Bitcoin保持者からネットワーク維持者への資金移動を実現しているのです。
この仕組みに気づいた時は「遊戯の奴そこまで考えて・・・」と驚きました。
まとめ
OSS Gateに参加してきました
8/12に大阪で開催されたOSS Gateに参加してきたのでその話をまとめます。
どんな会
オープンソースに携わっていない人を主にターゲットとした、チュートリアルのようなものです。
各地で継続的に活動しているいるようです。
圧倒的Mac率
15人ぐらい参加してたんですが8割がMacでした。
やっぱUnix系使いたいよね…
gitのMLに投函
どのプロジェクトに参加してもいいということで普段お世話になっているgitさんにちょっかいを出すことにしました。
gitはLinusさんのテリトリーなのでMLでやり取りされています 。
そのMLに参加して「ドキュメントが酷いぞ」という私的を春巻きに包んで指摘しておきました。
感想
非常にゆったりしたペースで司会が進行して特に難しさなどは感じなかったです。
今後も気軽にCommit出来るようになればいいなぁと思います。
会場に使わせてもらったさくらインターネットさんのカフェテリア?がとてもオシャレでした。
ブラック企業一覧が完成したようです
知らない間に厚労省のデータをいい感じに見やすくした『ブラック・ブラック企業』というサイトができたようです。
地味な黒ベースのサイトですがデザインがスッキリしていて個人的には好きです。
地域別に調べることが出来るので就活生は是非参考にしてください。
http://structure-and-representation.com/works/blackCorporate/
まだまだ有名ではなく「ブラック・ブラック企業」で検索しても全然見つからず。
以下のニュース記事からリンクを辿って閲覧しました。 structure-and-representation.com
※ちなみに「ブラック・ブラック企業 Structure and Representation」までいれると検索にかかりました。 ブラック・ブラック企業 Structure and Representation - Google 検索
ブラック企業ネタは最近地味に盛り上がって来てるので、その辺でビジネスできたら儲かりそうな気がしますね。
前職にいた頃のサービス残業を暗に指示するメールも密かに保管したままなので、どこか買い取ってくれませんかね?笑
ついでにいうと希望して取得できなかった約20日分の有給も買い取ってほしいですね。
まぁ過ぎたことは仕方ないとして、なにか楽しいことをビジネスにできたらなぁと思う今日このごろです。
といってもそう簡単にうまい話は転がってるわけがないのですが。
なんでも良いからやってみる、と言うのは大事かなぁと思って色々思索しています。
PyCharmでunittestが実行できない
Python3をインストールしたので早速IDEでTDD回して気前よく開発を始めようと思ったのですが、派手にころんだのでまとめます。
迷子の迷子のテストさん
まず始めに作った階層はJavaに似せてこんな感じ。
auto-trade/ +- main +- __init__.py +- DailyPrice.py +- tests +- __init__.py +- TestDailyDrice.py
__init__.py
というファイルを置くとパッケージとして認識されるそうな
その結果こんなエラーが
ModuleNotFoundError: No module named '/Users/ksilver/PycharmProjects/auto-trade/test/TestDailyDrice'
なんだこれは、テストでコケるならまだしもモジュールが見つからない???
実行環境おかしいんじゃね?
とりあえずIDEの設定を確認しようそうしよう。
Projectの設定はProjectを右クリックしたメニューから……無いじゃん!!!
仕方なくPrefereneceから辿って設定に行き着きました。
もうちょっとマシな辿り着き方ないんですかね。。。。
設定を見ても正しくPython3.6が指定されている模様。
コマンドで叩いてみる
ググったら良い記事が合ったので採用
これをもとにコマンドを叩いてみます。(たんたかたーん)
kMBA:auto-trade ksilver$ python3 -m unittest tests.TestDailyPrice E ====================================================================== ERROR: TestDailyPrice (unittest.loader._FailedTest) ---------------------------------------------------------------------- ImportError: Failed to import test module: TestDailyPrice Traceback (most recent call last): File "/usr/local/Cellar/python3/3.6.2/Frameworks/Python.framework/Versions/3.6/lib/python3.6/unittest/loader.py", line 153, in loadTestsFromName module = __import__(module_name) ModuleNotFoundError: No module named 'tests.TestDailyPrice' ---------------------------------------------------------------------- Ran 1 test in 0.000s FAILED (errors=1)
なんだろう、怒られてしまいましたぞ。
そんなモジュールねぇってさ。わけがわからないよ
本家を参照してみる
これは一旦本家ドキュメントに立ち返るしか無い
26.4. unittest — ユニットテストフレームワーク — Python 3.6.1 ドキュメント
ファイルもルート直下に移動してテストコードをコピーして実行
kMBA:auto-trade ksilver$ python3 -m unittest TestDailyDrice.py ... ---------------------------------------------------------------------- Ran 3 tests in 0.000s OK
おおお動いた!!!
しかしPyCharmでは相変わらず動かない。
PyCharmで動かないのはなぜ?
実行ログをを良く確認する。
FAILED (errors=1) Launching unittests with arguments python -m unittest /Users/ksilver/PycharmProjects/auto-trade/TestDailyDrice.py in /Users/ksilver/PycharmProjects/auto-trade/main
ん?実行ディレクトリがなんかおかしくね?なんでmainで実行してるんだ?
一旦全てのディレクトリを消し去って構成をフラットにしてリトライすると実行すらできませんでした。
Error running Unittests in TestDailyDrice.py: Cannot start process, the working directory '/Users/ksilver/PycharmProjects/auto-trade/main' does not exist
なんか勝手にworking directoryと言うものが設定されているようです。
しゃーなしなので全ファイルをmain直下に移して実行するとうまくいきました。
結論
PyCharmではプロジェクト直下にソースコードを置いてはいけないようです。
次のような構成にしたらうまく動きますよ。というお話
root/ +- main/ +- product.py +- test/ +- test_code.py
Python3をインストールしてみました
技術メモ
Macにpyenvでpython3を入れようとしたら失敗しました。
色々やってみましたが全然うまく行かなかったので記録に残しておきます。
pyenvを入れようとして失敗
kMBA:work ksilver$ pyenv install 3.6.2 Downloading Python-3.6.2.tar.xz... -> https://www.python.org/ftp/python/3.6.2/Python-3.6.2.tar.xz Installing Python-3.6.2... BUILD FAILED (OS X 10.12.5 using python-build 20160602) Inspect or clean up the working tree at /var/folders/b2/s70h2rk10q3g959t0y6mwdnm0000gn/T/python-build.20170722122727.33068 Results logged to /var/folders/b2/s70h2rk10q3g959t0y6mwdnm0000gn/T/python-build.20170722122727.33068.log Last 10 log lines: File "/private/var/folders/b2/s70h2rk10q3g959t0y6mwdnm0000gn/T/python-build.20170722122727.33068/Python-3.6.2/Lib/ensurepip/__main__.py", line 4, in <module> ensurepip._main() File "/private/var/folders/b2/s70h2rk10q3g959t0y6mwdnm0000gn/T/python-build.20170722122727.33068/Python-3.6.2/Lib/ensurepip/__init__.py", line 189, in _main default_pip=args.default_pip, File "/private/var/folders/b2/s70h2rk10q3g959t0y6mwdnm0000gn/T/python-build.20170722122727.33068/Python-3.6.2/Lib/ensurepip/__init__.py", line 102, in bootstrap _run_pip(args + [p[0] for p in _PROJECTS], additional_paths) File "/private/var/folders/b2/s70h2rk10q3g959t0y6mwdnm0000gn/T/python-build.20170722122727.33068/Python-3.6.2/Lib/ensurepip/__init__.py", line 27, in _run_pip import pip zipimport.ZipImportError: can't decompress data; zlib not available make: *** [install] Error 1
記事があったのでリンクを張っておきます qiita.com
上記の記事で試してもうまくいかなかったためpyenvは一旦忘れることにしました。
homebrewでpython3をインストール
brew installであっさりインストール完了
ここまでの苦労は何だったのか。。。
PIPが動かない
続いてPIPを動かそうとしたら
kMBA:~ ksilver$ pip -bash: pip: command not found
なるほど、ちゃんとインストールしないとね
kMBA:~ ksilver$ brew install pip Error: No available formula with the name "pip" Homebrew provides pip via: `brew install python`. However you will then have two Pythons installed on your Mac, so alternatively you can install pip via the instructions at: https://pip.readthedocs.io/en/stable/installing/ kMBA:~ ksilver$
Macには既存のPython2が入っているためbrewではなくインストールガイドに従えとのこと。
kMBA:~ ksilver$ python3 get-pip.py Requirement already up-to-date: pip in /usr/local/lib/python3.6/site-packages kMBA:~ ksilver$
・・・・・えーなんでーあるって言われる事件
犯人探し
Pythonの情報を確認
kMBA:~ ksilver$ which python3 /usr/local/bin/python3
kMBA:~ ksilver$ python3 --version Python 3.6.2
/usr/local/lib/python3.6/site-packages の参照は正しそうな気がする。。。
kMBA:~ ksilver$ ls /usr/local/lib/python3.6/site-packages/pip __init__.py _vendor cmdoptions.py download.py locations.py pep425tags.py utils __main__.py basecommand.py commands exceptions.py models req vcs __pycache__ baseparser.py compat index.py operations status_codes.py wheel.py kMBA:~ ksilver$
おるやん。。。。
何故かパスが通ってないのかなぁ
ここで閃き
kMBA:~ ksilver$ pip3 Usage: pip <command> [options] Commands: ...
しょうもないミスでした。
いやぁお騒がせしました。
TDD bootcampに行ってきました
TDD、なんて甘美で素晴らしい響きなんでしょうか。 というわけで7/1に大阪で開催されたTDD Bootcampの感想を書きたいと思います。
TDDとは
テスト駆動開発のこと….わからん まずテストコードを書いてから、プロダクトコードを書きましょうという思想。 テストファーストだとか言わます。 詳細はぐぐってください。
TDD Bootcampは座学と実習を通してTDDの入門学習を行う集まりです。
品質テスト≠開発テスト
テストと聞くとプロダクトのリリース前に行うテストをイメージします。
しかし、これら品質の確認の為のテストとTDDで扱うテストは別物のようです。
ここを勘違いするとTDDの説明を聞いてもしっくりこないと思います。
TDDで扱うテストはプログラマが安心してコーディングを行うためのものです。
プログラマが安心するためにテストコードは2つの役割があるのだなと思いました。
テストコード=ゴールへの道標
TDDはRed → Green → Refancoringのサイクルで回します。
TDDの最大の特徴は、まず失敗するテストを追加して(Red)からプロダクトコードを追加/修正する(Green)という点です。
『Assert First』などとも呼ばれるこの原則はテストコードは道標の役割を持ちます。
作りたい製品にたいして、さしあたって達成すべきチェックポイント、それをテストコードという明確な形で見える化する。
目標達成におけるKPIに近い考え方だと私は思います。
遠すぎるゴールに対してチェックポイントを置いていくことで道を見失わないようにする。
様々な分野で見受けられるこのベストプラクティスはコーディングの世界にも通じるようです。
進むべき道先を照らすことでプログラマは安心して機能を追加する(攻める)事ができます。
テストコード=デグレ検出器
プログラマにとってシステムダウンの次に怖いのはデグレ。
即ち、プログラムの変更により今まで使えていた他の機能が使えなくなること。
そもそもゴミコードがゴミのまま放置されるのは、
- 「動いてるコードを触って壊れたら心配」
- 「ゴミだけどとりあえず動いてるからそっとしておこう」
という保守的な考えによるもの。
TDDのテストコードは一度書くとユーザーが消すまでこまめに実行され続けます。
これによりデグレを起こしたら直ちに検出できる(守れる)ようになります。
デグレにすぐに気付ける体制があって初めて安心してリファクタリングをすることができます。
まとめ
TDDはテスト駆動と銘打っていますが、動くチェックリストという方が近い感覚です。
高度な自動化技術やJUnitなどのライブラリが目立ちますが、それは手間を省く周辺技術で、本質的には誰でも導入できるものです。
高度な技術的手法というより堅実な仕事の進め方と考えたほうが良いでしょう。
ちょっと気軽にTDD始めてみませんか?
転職レポート:大手SIを辞めてWeb系へ
最近暑くなりましたね。
さて先日転職先での試用期間が終わり正式に無期契約社員となりました。
その辺のお話を書いてみようかなぁと思います。
ちなみに似たような記事があったのでここに貼っておきます。
なんで辞めたの?
新卒で入った4年弱努めたNECソリューションイノベーターを辞めました。
理由は色々あるんですが主なものは次の3つかと思います。
- 技術的に成長できない
- 残業時間が多い
- 慢性的なパワハラ
そんなこんなで嫌気が指して、ちょっと他の会社も見てみるかぁと軽いノリで転職エージェントを訪れたところ、トントン拍子で話が進み2ヶ月で内定取って辞めました。
悪かったこと
給料が下がった
まぁこれはありがちな話。 会社を移ることで給与が上がることは稀です。 と言っても前職は残業代ブーストがかかっていたので単に下がったと言っても微妙なところ。 現職は裁量労働制で残業代込み込みですが殆ど定時で帰れています。
3月の給与が殆ど無かった
これは事務手続き上の問題ですが、住民税が一括支払いになったため給与と相殺されてなくなってしまいました。 後で調べたら普通は選択出来るそうです。 なんだかなぁ…..
有給20日分を失った
辞める前に有給を取るつもりでしたが拒否されました☆
まぁ早く新しい職場で働きたかったので1ヶ月半しか用意しなかったのも有ると思います。
もとから有給は捨てるのが当たり前な風土だったので年間8日ぐらい(夏期休暇含む)しか使えなかったんですけどね。
先輩はどうせ有休取れないと開き直って遅刻しまくって午前休を当てていました。
賢いんだかなんなんだか……
退職金が殆どもらえなかった
3年間努めた人の平均退職金は20万円だそうです。
4年弱努めた私の退職金は……20975円
まじかよ。
良かったこと
残業が減った
前職は多い時で月80時間ぐらい、月平均だと30時間ぐらいでした。
ちなみに目標設定面談の時に月30時間は頑張らないとなぁみたいなことを言っていたので、「頑張る=長く働く」のようです。
だいたいみんな21時頃まで働いていたので裏定時と呼んでいました。
現職では月5時間程度です。
単月45時間を超える人は殆どいないそうです。
サビ残が無くなった
前職は残業時間帯に2回休憩時間がありました。
まぁ本当であれば休まないといけないんですが「終わってないのにどこいくねん」という圧力がありました。
働いていてもシステムによって休憩時間に割り当てられるため事実上のサービス残業タイムになっていました。
さすがにアホらしので圧力に気づかないふりしてフラっと消えてましたけどね。
上司指示が明確になった
前職では「いいかんじになるべく早く」とかいういわゆる「なるはや指示」が殆どで、詳しく聞いても「それぐらい自分で考えろ」と一蹴されたものです。
現職では毎日チームで進捗会議を行い、遅れが出ていなくても進め方の相談に乗ってくれます。
職場の雰囲気が良くなった
前職では結構ピリピリしている人が多かったです。 近くの席の人がパワハラ受けてるのを聞くだけでもだいぶストレスでしたね。
- 「はぁ!?」
- 「こんなんもわからんのか」
- 「ふざけんな」
- 「いいかげんにしろよ」
- 「しらんわ」
こういう事を言う人がいないだけでも今の職場は快適です。
開発環境が大幅に改善
劇的Before/Afterを御覧ください。
Before
After
評価が劇的に上がった
前職では「何も任せられない」「エンジニアじゃない」とか散々言われていました。
現職では、業務知識がまだ揃っていないだけで大変優秀との評価をいただきました。
同じ人間でも使い方次第。
今後自分が無能な部下を持つことが有ったとしても、本当に無能なのは誰なのか常に省みることが出来る人間でありたいですね。
学びの機会が増えた
積極的に社内勉強会が催され、休日には外部団体開催の勉強会に会議室を貸し出しているので、非常に学ぶ機会は多いです。
ハッキリ言ってエンジニアは学び続けないと腐ってしまうので学びの場が有るかどうかは死活問題です。
東京に比べると大阪開催のイベントが少ないのは残念なことですが、それでもとても刺激的な体験ができています。
前職?そんなの有るわけ無いでしょ。
まとめ
ぶっちゃけもっと早く転職すればよかったなと思っています。
新卒で入社するとその会社のことしか知らなくて視野が狭くなってしまいがち。
自分も転職記事を読んだりエージェントの紹介を受けるまで、こんなに素晴らしい職場があるとは思っていませんでした。
際限なく働き続けることを当たり前と洗脳されて殺されていく人達も、それ以外の選択肢が見えていなかったのかぁと思うと悲しくなります。
Q: 仕事行きたくない
A: 辞めましょう
Q: 残業しんどい
A: 辞めましょう
Q: パワハラが(ry
A: 辞めましょう
Q: セク(ry
A: 辞めましょう
職場とは価値を生み出し社会に還元していく場所です。
くだらない殺し合いや潰し合いをやって遊んでいないできちんと働くべきです。
日本は高齢化が進み人手不足が深刻化しています。
無駄なサビ残してゴミ作ってる暇があったら価値のある仕事をしましょう。
長く働くつもりではありますが、また何かのきっかけで今の会社を離れることがあるかもしれません。
人生何が有るかわかりませんしね。
次の機会が有ったとしても給料より楽しくやっていけかで仕事を選ぶことになると思います。
オッサンの絵をいくら集めたところで人生は豊かになりませんからね。
金で品格を売るのはやめよう。
不満足な豚をやめて、自尊心の有る人間になろう。
宣伝
自分が使ったエージェントはレバテックと言うところです。
(LINEでやり取りできて急な問い合わせにも丁寧に対応してもらえます)
他にもPaizaを使いました。
(コードスキル測定は客観的指標に超便利。それしか使ってないけど)