ErlangEOSのJavaScript,Python,Rubyとの連携
俺はErlang大好きっ子だが、バイナリーデータを加工しまくるような処理はF#,C#で書いている。Erlangはこういった他の言語との連携も実によく考えられている。F#,C#で作っている部分でどうにも対処できないようなエラーが起きて落ちてもErlangに何の影響も与えずに自動で再起動、処理もリトライするように作ってある。こんな処理が簡単に作れてしまうのがErlangの素晴らしいところだ。
NIFで高速なJavaScriptとの連携 basho/erlang_js · GitHub
Portを使ったPython,Rubyとの連携 ErlPort - connect Erlang to other languages
なんていう汎用的なライブラリーがある。ところが、これの使い方が美しくない。
例えばこんな風、
{ok, P} = python:start(). python:call(P, math, factorial, [10]).
これをErlangEOSで書くと、
P = #<erlport>(python){} P.math.factorial(10)
と書ける。若しくは、
P = #<erlport>(python){} Math = P.math Math.factorial(10)
これって、もう完全にErlangの一部として使えるでしょ。
こんな感じでJavaScript,Python,RubyとErlangをいい感じで統合できるようになった。
結構いい感じで動いているんだけど、困っていることがある。 REPLで使おうとするとうまくいかない。erlで起動して明示的にreplの関数を呼べば動くんだが、いったい何が違うんだろうか。
node.jsの敷居の低さは素晴らしい
Erlangに出会ったのは6,7年前。でも、そのころはまったく使いこなすことができず、 Lisp,OCaml,F#,Haskell などの関数型言語の経験を数年経て、やっと使えるようになった。 しかも、今のようにErlang大好きっ子になり仕事のために使うようになる前は、 node.jsでかなり頑張っていた。
俺はずっとクライアントサイドのプログラムを作っていたので、サーバー側の経験がほとんどなく、敷居の低いnode.jsが光り輝いて見えた。
かなり頑張ってみたが、エラー処理、バイナリーデータ処理、他のサーバーとの連携、他の言語との連携・・・壁にぶち当たり、Erlang/OTPでの解決策を参考にしようと調べ始めた結果、Erlangでやればいいじゃん、との結論に達して今に至る。結局のところ、Erlang/OTPはすべてを解決してくれた。
Erlangは本当に素晴らしい。しかし、素晴らしいと思えるまでの敷居が非常に高いと思う。
誰だって最初は初心者で、初心者が熟練していかなくてはプロにならない。それなのに、Erlangの敷居の高さは初心者を寄せ付けず、その結果、Erlangのユーザー数が伸びないのだと俺は思う。
Erlangはサーバー系を作るためのDSLのような扱いさえされることがあるが、Erlangは汎用言語だ! 関数型言語のLLでプログラムを書きたいだろ? それならばErlangだ。
しかし、ErlangはLLだなんて誰も思わない。なぜならば、Erlangは敷居が高いから!
俺はErlangのこの敷居の高さをどうにかしたいと思ってErlangEOSを作った。
今、俺は仕事で使うErlangのソースのすべてをErlangEOSで書いている。Pythonのようなインデントはプログラムをきれいにしてくれて、 ,.; で悩むことは一切ない。 ErlangObjectSystemはOOPだけでなくMetaProgrammingのためにも使えて、今は主に後者の用途で使っている。例えばRPCをEOSで書くことにより、見かけのコードは単なるオブジェクトのメソッド呼び出しなのに分散させたり、分散のアルゴリズムを変えることができる。本当に便利だ。これは俺が欲しかったものだ。だからまだプロ仕様で粗削りなものだが、俺が本当に目指しているのは node.jsの敷居の低さ、手軽さだ。今でもErlangは十分パワフルだから、これがもっと手軽になったらすごいことになると思うんだ。Erlangのユーザーをもっと増やして、数のパワーも味方につけたい。
寝ながらプログラミングしたい
普段はMacBookProやMacMiniでプログラミングしてるわけだけど、最近寒くなってきてお布団が恋しい季節だと、布団にもぐって寝ながらプログラミングしたくなる。 WindowsRTからWindows8にリモートデスクトップでつないで使ってみると結構いい感じだったので、これで寝ながらプログラミングに挑戦してみた。 しかし、残念ながら操作性が最悪。 選択とかの細かい作業がなかなかうまくいかずにストレスがたまる。
タッチ操作だけでプログラムを作れる環境がほしいな。
操作性だけでなくて、言語とかの環境自体がタッチでいい感じにそうさできるようなのがほしい。
作るならHTML5かな。
HTML5も勉強してみたくなった。
ErlangEOS OOP inheritance sample ported from IO language
// https://github.com/stevedekorte/io/blob/master/samples/misc/Inheritance.io start()-> // Define a Dog object Dog = #<obj>{ barkPhrase = "woof!" bark = method()-> io.format( @"#{This.barkPhrase}\n" ) } Chiwawa = Dog.clone() Chiwawa.barkPhrase := "yip!" io.format("Dog bark: ") Dog.bark() io.format("Chiwawa bark: ") Chiwawa.bark() // make an instance MyChiwawa = Chiwawa.clone() MyChiwawa.barkPhrase := "Yo Quiero Taco Bell" io.format("myChiwawa bark: ") MyChiwawa.bark()
bank account sample ported from IO language
// https://github.com/stevedekorte/io/blob/master/samples/misc/Account.io start()-> Account = #<obj>{ balance = 0.0 deposit = method(V)-> This.balance := This.balance + V show = method()-> @"Account balance: $#{This.balance}\n" } io.format( @"Inital: #{Account.show()}") io.format( "Depositing $10\n" ) Account.deposit(10.0) io.format( @"Final: #{Account.show()}" )
accumulator generator in ErlangEOS
// accumulator generator http://paulgraham.com/accgen.html foo(N)-> Obj = #<obj>{ accumulator=N } fun(I)-> Obj.accumulator := Obj.accumulator + I test()-> Foo = foo(0) 1 = Foo(1) 2 = Foo(1) 12 = Foo(10) 22 = Foo(10)
ErlangEOS ver0.01aをリリースしました
歌舞伎座.tech#3「Real World Erlang/OTP」にあわせてErlangEOSをまとめました。
自分的にはまだリリースレベルには達していないのですが、とりあえず今のレベルでまとめて、しばらくはドキュメントやサンプルを充実させることにし、githubで公開しました。
zed-throben/erlangeos · GitHub
実は、githubでオリジナルのプロジェクトを公開するのはこれが初めてです。なぜならば、現在勤務している会社がオープンソースに否定的だからです。コストを掛けて社員を雇って生み出された成果をなぜ無料で公開するのか? 気持ちはわからないでもありません。
だから深夜、早朝、週末はErlangEOSのためだけのプログラミングを行うようになりました。かつてはプライベートも仕事も境界はなく、深夜にいいアイディアを思いつけばすぐに仕事に反映させたりしていました。しかし、今は明確に時間を分けているため仕事は勤務時間内にしか行わないようになりました。以前は興味が有ることをどんどん仕事に取り入れ、仕事からのフィードバックを取り入れ、相乗効果でどんどん深まっていったものです。出資者の一人でもある私にとっては、なんだか複雑な、寂しい感じもします。しかし考え方が違うならしょうがないですね。今日のgithubでの公開は私の新しい人生の始まりとなる気がします。