蟻地獄

Twitterに書ききれない長めの文とか書くよ

Google App Engine と Cloud Datastore だけでオークションサイトを作った

こんばんは!サーバレスしてますか!

Google App Engine (GAE)がなんか最近イケてるとかイケてないとかいう話を聞いて、とりあえず何か小さなサービスを作って試してみようと思ったのですが、どうせ作るなら毒にも薬にもならない掲示板とかじゃなくて罠を踏み倒しそうな感じのが良いと思い、オークションサイトを作ってみました。

concept-auction.appspot.com

データべースはRDBを一切使用せず、Cloud Datastoreのみで構築しています。え、Cloud DatastoreってKey-Valueストアじゃないの?と思うかもしれませんが、実は色々なクエリが使えたりトランザクションが使えたりするので、仮想通貨の受け渡しなんかもわりと真っ当に実装することができます。

ただし、RDBのように扱えるかというとやはりそうではなく、様々な制約があるので、Cloud Datastoreに特化したテーブル設計が必要となります。特にData Consistencyのドキュメントは10回くらい読んだほうが良いです。

Data Consistency  |  Google Cloud Platform

制約はいろいろありますが3行でまとめると、

という感じです。なのでテーブル設計の段階から、トランザクションが必要なデータはルートエンティティにしないようにしたり、1つのエンティティグループへの更新が集中しないような親子関係にするといった工夫が必要になります。1秒1トランザクションという制約はかなり厄介で、今回作ったオークションサイトでも入札の整合性をどうやって保つかで苦労しました。

とは言え勝手にスケールアウトしてくれるというのはとても魅力的で、今回作ったオークションサイトも、アクセスが無ければ維持費$0、何かの間違いでYahoo砲を食らっても無限にスケールする(※ただし予算がスケールするとは言っていない)というのは非常に楽です。

まあそんなこんなで、本当にちゃんとスケールするのか試してみたいのでみんなツイッターで拡散してね!

concept-auction.appspot.com

日本取引所グループがブロックチェーンをぼろくそに言ってる

日本取引所グループ(東証大証の総元締め)がブロックチェーンの実証実験をやるっていうのが以前話題になっていましたが、その結果がついに出ました。ありがたいことになんとレポートを全文無料で読むことができます。
http://www.jpx.co.jp/corporate/research-study/working-paper/tvdivq0000008q5y-att/JPX_working_paper_No15.pdf

そんなに長くないのでぜひ原文を読んでほしいのですが、要点をまとめると以下のような感じです。

実証実験内容

  • コンソーシアム型ブロックチェーン。ノードを持つのは市場管理者・金融機関・株式発行体(要は上場企業)の三者
  • 市場管理者と金融機関が認証処理を行う権限を持つ。株式発行体はデータの参照のみ可能で、書き込みはブロックチェーン外で市場管理者に依頼する。投資家は金融機関に受託して取引を行う
  • 金融機関は自社の顧客以外の取引内容は参照不可。株式発行体は自社の株式の所有者と保有残高以外は参照不可。市場管理者は全ての情報が参照可能
  • コンセンサスアルゴリズムはProof of Workではスループット性能が不足することが予想されたので、3分の2以上の合意を認証の条件とするPractical Byzantine Fault Toleranceを採用
  • スマートコントラクトでロジックを実装

結果

  • 証券市場の取引(注文のマッチング)は集中処理のほうが効率が良く、注文の変更・取り消しも頻繁に発生するのでブロックチェーンには不向き。決済、証券保有者管理、配当などのポストトレード分野では有用かも
  • いちいちスナップショット保管したりしなくても過去の任意の時点の状態を確認できるのは便利。株主に対する権利付与の基準日時を過去の任意の時点に指定したりできる
  • 各ノードのシステム時刻の差、外部データを取得する処理、乱数を用いた処理などの非決定的要因でノード間の差異が生じて認証に失敗する場合がある。これらの処理は証券取引には必須なので大問題。そういう処理を特定のノードだけにやらせるという手もあるが、そのノードが単一障害点となるので本末転倒
  • 先進国の上場株式市場で求められる処理性能は秒間数千〜数万件くらいだが、負荷テストの結果は秒間数十〜百件程度だった。ブロックチェーン実装の開発元のデモで示されてる数値はあてにならない
  • ネックはスマートコントラクトを1件ずつ直列実行しているところ。ブロックチェーンは各ノードが1台構成なのが前提なので複数サーバでの並列処理ができない
  • 秘匿性要件は満たせたが、それはHyperlegderの機能であって他のブロックチェーン実装は未対応のものがほとんど
  • 可用性、データ復旧の容易さは良さげ。ただし前述の単一障害点の問題が無ければの話
  • 単純なITインフラの置き換えによるコスト削減効果は限定的で、どっちかというと過去データの断面取得が可能なことによるビジネスプロセスの改善や、業界横断的にノードを持つことでディザスタリカバリの費用を削減できることに期待
  • ブロックチェーン上のファイナリティはPractical Byzantine Fault Toleranceを採用したことで解決
  • ブロックチェーン外のファイナリティが問題。現行の法律では証券保管振替機構口座振替をもってファイナリティを得ており、ブロックチェーン上の記録を真正とするには法整備が必要
  • 現状日本円はブロックチェーン上に記録されていないので、資金決済のファイナリティについては一工夫必要。そもそも中央銀行がデジタル通貨を発行すれば全部解決するがせやかて工藤

以上のように、実際作ってみたら問題がぼろぼろ出てきました、という内容となっています。なので結論としては過大評価でしたね、となると思いきや、「V. まとめ」のセクションを見てみると・・・

DLTを金融市場インフラに活用した場合、いくつかの課題があるものの、新たなビジネスの創出、業務オペレーションの効率化、コストの削減等に寄与し、金融ビジネスの構造を大きく変革する可能性の高い技術であることが分かった。

ええぇぇぇ〜!「いくつかの課題」どころか、わりと根本的な欠点をさっきまでガンガン挙げてましたやん!可能性の大安売りや!

ここだけ別の人が書いたんですかね……
過去データの断面取得が可能なことをやたら持ち上げてますが、これ別にブロックチェーンの発明じゃなくただの追記型のデータ構造だってだけですし、可用性については現実的には単一障害点ができてしまうって自分で言うてましたやん。

という感じなので、ぜひまとめのセクションだけでなく中身も読んでみることをおすすめします。数式とか出てこないし意外とさくっと読めますよ。

socket.io とは何だったのか

「Socket.IO は必要か?」または「WebSocket は通るのか?」問題について 2016 年版
socket.io が提供してくれているものは何か - from scratch

実はこの辺りの話って、公式サイトのFAQに書いてあるんですよね。・・・と思って久しぶりに公式サイト見てみたら、おっしゃれーにリニューアルされてて以前のFAQが無くなっていました。

というわけでv0.9の頃のサイトをInternet Archiveから引っ張り出してきました。
Socket.IO: the cross-browser WebSocket for realtime apps.

Why not just call it `WebSocket` if the actual WebSocket is not present and mimick its API?

抄訳: ヘイボブ!これってただのWebSocketの代わりじゃないの?

Socket.IO does more than WebSocket, even if WebSocket is selected as the transport and the user is browsing your website with an ultra modern browser. Certain features like heartbeats, timeouts and disconnection support are vital to realtime applications but are not provided by the WebSocket API out of the box.

This is akin to jQuery's decision of creating a feature-rich and simple $.ajax API as opposed to normalizing XMLHttpRequest.

抄訳: 何を言ってるんだいアリス!たとえWebSocketで通信できる環境でも、Socket.IOはWebSocketよりすごいんだ!ハートビートやタイムアウトや再接続なんかはリアルタイムアプリケーションには必須だけど、WebSocketは提供していないだろう?jQueryがただのXMLHttpRequestの代わりじゃないのと同じさ!

ビットコイン中級者向けの3つのクイズ

こんばんは!ビットコイナーめめるです!

ビットコインは仕組みが難しいので色々な勘違いがありますよね。今日は、「ビットコインは円天とは違う」とか「ビットコインの社長は逮捕されてない」といったことが分かってきた中級者向けのクイズを考えてみました。何問答えられるかな?

第一問

ビットコインプロトコルではマイナーへの報酬として新たなビットコインが発行されるため、ビットコインの全体量は日々増え続けています。しかし、ビットコインは一般的に「デフレモデルであり将来的に価格が上昇する」と言われています。それはなぜでしょうか?

第二問

現状のビットコインはスケーラビリティに問題があるため、プロトコルのアップデートが計画されています。では、仮にプロトコルがアップデートされないままユーザーが増え続けた場合、具体的にどのようなことが起こるでしょうか?

第三問

2014年にマウントゴックスが破綻しましたが、この事件はビットコインの仕組みが原因ではなく、マウントゴックスの不正が原因だとされています。では、マウントゴックスは具体的にどのような不正を行ったのでしょうか?また、マウントゴックスのような不正な取引所から身を守るためにはどうすれば良いでしょうか?


分かったかな?答えは私も分からないよ!

ビットコイン界隈の派閥樹形図を作ってみた

デリばんは!

先週末にビットコインの仕組みを調べていたんですが、ブロックチェーンとProof of Workだけかと思ったらなんか他にもいろいろ話が出てきて思ったより闇が深かったので、ビットコイン界隈の派閥樹形図を作ってみました!
https://gist.github.com/mitomemel/1dd6e78116ef66fe19e3

ここ間違ってるよとかあったらコメントお願いします!

Unlimited Server Works

体はvimで出来ている
「――――I am the bone of my vim.」

血潮はsedで心はawk
「――――Sed is my body, and awk is my blood」

幾たびのリリースを越えて不敗
「――――I have created over a thousand services.

ただ一度の障害もなく、
Unaware of loss.

ただ一度の睡眠もなし
Nor aware of gain」

担い手はここに独り
「――――Withstood pain to create config files,

sshsedを打つ
waiting for one's arrival」

ならば我が生涯に意味は不要ず
「――――I have no regrets. This is the only path」


このサーバは、無限のシェルスクリプトで出来ていた
「――――My whole server was "unlimited shell script works"」

MikuMikuDanceのファイルを表示するブログパーツを作ってみた

mmd.gl.enchant.jsとか使ってMMDのファイルを表示するGoogleガジェットを作ったよ!

(ブラウザがWebGLに対応している必要があります)

自分のブログへの貼り付け方

ここでコードを取得できます。
PMDファイル・VMDファイルのURLを設定するだけ。テクスチャとかtoon*.bmpはPMDファイルと同じディレクトリに置いて下さい。ファイルが足りないとミクさんが真っ黒になったりするので、そういうときはJavaScriptコンソールで取得に失敗しているファイルがないか見てみてね。

WebGLすごい!

2014/11/28 追記

Googleガジェットがサービス終了したっぽいよ。