Skip to content

Instantly share code, notes, and snippets.

@umegaya
Last active December 12, 2015 02:38
Show Gist options
  • Save umegaya/4700105 to your computer and use it in GitHub Desktop.
Save umegaya/4700105 to your computer and use it in GitHub Desktop.
plumvalley algorithm manifest

plumvalley algorithm manifesto

our mission

「luaという言語で、分散コンピューティングを趣味として楽しめるようなフレームワークを作ることで、人々の創造性を最大限引き出し、増幅させる」

luaという言語で、分散コンピューティングを趣味として楽しめるようなフレームワークを作ることで、人々の創造性を最大限引き出し、増幅させる」

なぜluaなのか?

  • luaJITという処理系があるから
  • 将来的にはほかの言語もサポートしていく必要があるが最初のプロダクトとしてはluaJITを使うことが最も高品質になると判断した

これからのリアルタイムネットワークアプリケーション開発に求められる技術的用件

  • クライアント側は各種モバイルデバイスで最適化された速度で動作し、デバイスの進化に素早く対応できること
  • サーバー側はhadoopのような単純な検索、個数カウントなどより高度な例えば物理シミュレーションなどの分散処理を大規模に提供すること
  • 開発速度を担保しながらこれらを提供していく必要がある。したがって動的言語を使いたい
  • luaJITは動的言語の中では求められている技術的用件に対して非常な優位性を持っている

luaJITの優位性

速度

  • 最速の動的言語実装の1つと広く認められている
  • javaよりも速く、C/C++からも多くのケースで2〜3割落ちる程度か、場合によっては同等の速度で動作する

luaJITの優位性

portability

  • arm, ppc, x86上の主要なアーキテクチャで動作する
  • ほとんどのモバイルデバイスにすぐ対応できる

luaJITの優位性

OSのネイティブ機能との親和性 (luaJIT ffi)

  • 通常動的言語でネイティブ機能を使うのに必要なバインディングという工程が全く不要
  • しかもバインディングが必要な言語と比べて圧倒的に高速
  • いち早く最新のハードウェアの機能を取り込み、高いパフォーマンスで利用できる

luaJITの優位性

luaJITなら動的言語の開発効率を保ったままで

  • クライアント側はデバイスに最適化されたパフォーマンスに加え、新しいハードウェアの追加など、モバイルデバイスの発達にほかの主要な動的言語より圧倒的に早くキャッチアップできる
  • サーバー側はやがて来るべきGPUを多用するようなクラウドコンピューティングの時代に最高のパフォーマンスを発揮できる
  • というかluaJIT ffiと同等の機能がないような動的言語はそもそも土俵にすら上れない

「luaという言語で、分散コンピューティングを趣味として楽しめるようなフレームワークを作ることで、人々の創造性を最大限引き出し、増幅させる」

人々が創造性を発揮するには巨大なコンピューティング能力をもっと自在に操れることが必要

  • 現代の創造性の発露はかなりの部分がネットワークを通じたサービスの提供を通じて行われる

現代の商用のサービスに対して、人々がコンピューターとネットワークを用いて行う活動は1台のハードウェアではまかなうことができない

  • 大量のハードウェアを用意し、プログラムによってそれらを連携させることでサービスに十分なコンピューティング能力を提供している

現代の商用のサービスに対して、人々がコンピューターとネットワークを用いて行う活動は1台のハードウェアではまかなうことができない

  • 大量のハードウェアを用意し、プログラムによってそれらを連携させることでサービスに十分なコンピューティング能力を提供している

プログラムによってそれらを連携させることは人間の創造性に対して本来不要な制限である

  • もし無制限のリソース(メモリ、CPU、ハードディスク)をもつコンピューターの上でプログラムを書けるとしたらどれほどの時間が節約されるだろうか
  • もちろんそれは夢物語だが、現在のクラウドコンピューティング環境はサービスの提供者の創造性を手軽に具現化するためにはまだまだきわめて貧弱であるといわざるを得ない

だからこそawsのELBのようなサービスや、herokuやrackspaceがあるのでは?

だからこそawsのELBのようなサービスや、herokuやrackspaceがあるのでは?

  • 彼らは間違ったやり方で問題を解決しようとしている
  • 分散処理における決まったデザインパターンを改変不能な形で提供している
  • そのやりかたでは開発者は分散処理環境におけるリソースの自由なコントロールを行うことができない

環境の自由なコントロールこそが創造性を発揮する際に最も必要なことである

  • すべてがリソース化されソフトウェアからコントロール可能なら、それをコントロールするのは開発者が作ろうとしているサービスのプログラム自身であるべき

アナロジー:プログラムにおけるメモリ割当

プログラムにおけるメモリの割当はそのプログラム自身が必要に応じて行う

今のクラウドコンピューティング環境をメモリ割当で例えると

  • メモリを割り当てるためには専用のメモリ割当ソフトウェア(herokuやrackspaceなどのサービスのアナロジー)を使わなくてはならず、
  • 割り当てたメモリを使うためには割り当てられたメモリの場所を自分のプログラムに設定ファイルなどで教える必要があるようなもの
  • これでは開発者は自由な発想をメモリ割当の煩雑さのために妨げられてしまうだろう

メモリ割当ソフト開発者の過ち

彼らはユーザーの自由な発想を妨げないために一度に10個のメモリを割り当てられるようにしたり、時間が来たら自動でメモリ割り当てソフトを起動するような機能を開発していることになる

より自由に開発者の創造性を発揮させるためには本質的に何を実装すべきなのか?

それがわれわれが実装しようとしているものです

RPC

"Remote Procedure Call"

  • プログラムの開発者からプログラムが物理的にどこで実行されているか隠蔽するための仕組み
  • プログラムからはそのプログラムにおける自然な「関数呼び出し」をしているように見えるが、実際はどこか地球上の別の場所にあるコンピューター(RPCサーバー)にリクエストが発行され、その結果を「関数の戻り値」として受け取る形で実行されている
  • これによりプログラムは自分が動作しているコンピューター以外のコンピューティングリソースを使うことができるようになる

通常RPCを実行するための物理的なコンピューターはプログラムの実行前にすでに用意されている

awsのようなIaaSが存在する現在では、プログラムからRPCを実行するためのコンピューターをawsのAPIで割り当てて、RPCサーバーとしてセットアップした上で、そのサーバーに対しRPCをすることができる

このやり方で、プログラムがメモリを割り当てるのと同じようにプログラムがプログラムのソースコードの中でコンピューティングリソースそのものを割り当てて使う、ということが可能になる。

  • サービスを構成する全てのプログラムが1つのプログラムのように動作することになり、普通のプログラムを書くような自由さと簡単さで分散処理を記述できるようになるだろう

すでに誰かがやっているのでは?

効率的で使いやすいRPCのフレームワークというのはとても難しい

  • RPCを実行するコンピューターとの接続が切れたら?切れたことはすぐに検出される?
  • リクエストはどうやって処理される?昔のサーバーがやっていたようにリクエストごとにCPUを1つ使ったりしていると現代的なサービスでは全く処理が追いつかない
  • 呼び出し可能なRPCはどのように定義される?動的に定義できないと現代的なサービスではダウンタイムが長くなりすぎる

効率的で使いやすいRPCのフレームワークというのはとても難しい

  • 実は、今回のフレームワークが常時接続に特化している一番の理由はオンラインゲームに対応するためではなく、RPCのパフォーマンス上必要だから
  • C/C++とluaの効率的な処理系と優れた言語仕様によって、われわれは既に効率的で使いやすいRPCのフレームワークを既に開発しているが、実際に1から開発をする場合、かなり時間が必要
  • 使いやすいRPCフレームワークは結果としてオンラインゲームのような複雑なネットワークアプリケーションの開発の難しさも隠蔽してくれる

「luaという言語で、分散コンピューティングを趣味として楽しめるようなフレームワークを作ることで、人々の創造性を最大限引き出し、増幅させる

コンピューティングリソース自体をプログラムから割り当てられるようになると何がおこるか

  • オートスケーリングや負荷分散など、いままでプログラム外部のサービスによってコントロールされていた機能をプログラムそのものに含むことができるようになる
  • つまり、サービスのインフラをコントロールする処理そのものがプログラムに含まれる

分散コンピューティングに関するイノベーションが加速する

  • これまでawsやherokuなどがサービスとして提供していたものが等価な処理を自身で行うライブラリとして提供されていくだろう
  • その場合、サービスとして提供するときのようにコンピューティングリソースを確保しておく必要がない
  • サービスのインフラをコントロールするような処理を提供する裾野が広がる => おそらくオープンソースのものがどんどん出てくる

人間の創造性が引き出され、巨大なコンピューティング能力によって増幅される

  • 最終的には仮想ハードウェアを提供するための機能だけがあれば、あとはプログラムの組み合わせで複雑な分散システムを開発者が自由に構築できるようになる
  • 開発者はいままでよりも遥かに自由に創造性を発揮できるようになるだろうし、取り組もうと思う人々の数も増えていくだろう

ビジネスモデル:マーケットプレイス?

  • いまいくつかあるような、IaaSを「運用する」ことで付加価値をつけるようなビジネスモデルは、運用そのものがプログラムによってなされることになるため、成立しにくくなるかもしれない
  • フレームワーク自体でマネタイズをすることはあまり考えていない
  • PaaSのようなものを構築して、フレームワークの上で使われるさまざまなライブラリのマーケットプレイスを提供することでマネタイズが可能かもしれない

参照情報がトラッキング可能なマーケットプレイス

  • 画像や音楽などのリソースまで含めてそのマーケットプレイスで取り扱えるようにする
  • サービスにどんなリソースやライブラリが使われているか、またその作者が簡単にトラッキングできるようにする
  • リソースやライブラリを使って作られたサービスの収益をリソースやライブラリの作者に還元できるようにする
  • サービスの技術的な詳細が今までよりもずっと明確にわかる。またリソースやライブラリを作るモチベーションが高まる
  • オープンなイノベーションの効果によって、さらなる創造性の発露と増幅が起きていく

progress

開発のロードマップと状況

  • 高効率で使いやすいRPCフレームワーク(yue)の実装 >> done
  • yueを使って手軽にモバイルアプリケーションを開発するためのクライアントフレームワークの選定 >> done (MOAI sdk)
  • MOAI sdkへのyue+luaJITの統合(=toad) >> 今ここ(almost done)
  • toadを使ったゲームの開発によるフレームワークの品質の向上 ~2013/Q2?
  • yueを使ったPaaSの実装 ~2013/Q3?
  • market placeの実装 ~2013/Q4?

まとめ

LuaJITは今後のリアルタイムネットワークアプリケーション開発に求められる技術要素に対して大きな優位性を持っている

LuaJITだから実現できる高度なRPCフレームワークによって、プログラムそのものが必要に応じてコンピューティングリソースを割り当てるようなプログラミング環境を実現できる

コンピューティングリソース自体をプログラムから割り当てられるようになると、巨大なコンピューティング能力を利用するときのハードルが下がり、より自由にその能力を利用できるようになる

巨大なコンピューティング能力を普通の開発者でも自由に使えるようになると、オープンなイノベーションの効果によってコンピューティング能力の利用自体がさらに容易になる。その力によって個人の創造性がより容易に世界に向けて発信されるようになる。

happy end!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment