2012/05/31


やったーJavaScriptの動くMySQLできたよー - 愛と勇気と缶ビール

しばらく 積ん読 していたこの本をちょっと眺めてみたら、 MySQL のUDFって簡単に作れるんだなー、と思った && そういや V8 って ライブラリ として簡単にリンクできるはずだな、と思い出した...

http://d.hatena.ne.jp/zentoo/20110925/1316961032
Big Sky :: やったーJavaScriptの動くSQLiteできたよー

正誤表を書くのにしばらくこの本をちょっと眺めてみたら、SQLiteのUDFって簡単に作れるんだなー、と思った && そういやV8ってライブラリとして簡単にリンクできるはずだな、と思い出した ので、つい...

http://mattn.kaoriya.net/software/lang/c/20110926141218.htm
まぁ、単なるUDFですが。
mattn/mysql-mruby - GitHub
https://github.com/mattn/mysql-mruby
これをコンパイルしてpluginとして配置すると mysql> SELECT mrb_eval('[1,2,3].map {|x| "hello" + x}');
+-------------------------------------------+
| mrb_eval('[1,2,3].map {|x| "hello" + x}') |
+-------------------------------------------+
| ["hello1", "hello2", "hello3"]            |
+-------------------------------------------+
1 row in set (0.00 sec)

こんな事出来て幸せ!

あなたも matz テーブルの mruby フィールドに何か書き込んでみませんか!
Posted at by



2012/05/10


mattn/go-mruby - GitHub

go-mruby make interface to embed mruby into go.

https://github.com/mattn/go-mruby
Matzさんにヒントも貰いながら、さっき出来ました。
メソッドは RunEval があり、mrubyの評価値を取得する事が出来ます。Go言語から渡した引数が ARGV になります。なので mruby 上では String とは限りません。
package main

import "github.com/mattn/go-mruby"

func main() {
    mrb := mruby.New()
    defer mrb.Close()

    println(mrb.Eval(`"hello " + ARGV[0]`"mruby").(string))

    for _, i := range mrb.Eval(`ARGV.map {|x| x + 1}`123).([]interface{}) {
        println(i.(int32)) // 2 3 4
    }
}
良かったら遊んでみて下さい。
Posted at by



2012/05/09


しなちく 「お前それ、シナチクって言いたかっただけやろ」

...
...
...
...

「そうですが、何か」

mruby で mruby-httpmruby-uv を使い、sinatra ライクなのが動くまでに到った。
ショボいアプリケーションなら書ける様になったけど、mrubyはまだファイルIOが出来ないのでアプリと呼べる様な物が動くにはまだまだ先。
require 'HTTP'
require 'UV'

# {{{
module Sinatic
  @routes = { 'GET' => [], 'POST' => [] }
  def self.route(method, path, opts, &block)
    @routes[method] << [path, opts, block]
  end
  def self.do(r)
    @routes[r.method].each {|path|
      if path[0] == r.path
        param = {}
        r.body.split('&').each {|x|
          tokens = x.split('=')
          param[tokens[0]] = HTTP::URL::decode(tokens[1])
        }
        body = path[2].call(r, param)
        return [
          "HTTP/1.0 200 OK",
          "Content-Type: text/html; charset=utf-8",
          "Content-Length: #{body.size}",
          """"].join("\r\n") + body
      end
    }
    return "HTTP/1.0 404 Not Found\r\nContent-Length: 10\r\n\r\nNot Found\n"
  end
  def self.run()
    s = UV::TCP.new()
    s.bind(UV::ip4_addr('127.0.0.1'8888))
    s.data = []
    s.listen(50) {|x|
      return if x != 0
      c = s.accept()
      c.read_start {|b|
        h = HTTP::Parser.new()
        h.parse_request(b) {|r|
          i = b.index("\r\n\r\n") + 4
          r.body = b.slice(i, b.size - i)
          c.write(::Sinatic.do(r)) {|x| c.close }
        }
      }
      s.data << c
    }
    while 1 do
      NOTE: must be call run_once to run GC.
      UV::run_once()
    end
  end
end

module Kernel
  def get(path, opts={}, &block)
    ::Sinatic.route 'GET', path, opts, &block
  end
  def post(path, opts={}, &block)
    ::Sinatic.route 'POST', path, opts, &block
  end
end
# }}}

get "/foo.js" do
'$(function() {
  $("#foo").text("hello world");
})'
end

get "/" do
'
<script src="http://code.jquery.com/jquery-latest.js"></script>
<script src="/foo.js"></script>
<div id="foo"></div>
<form action="/add" method="post">
<label for="name"/>お名前</label>
<input type="text" id="name" name="name" value="">
<input type="submit">
</form>
'
end

post "/add" do |rparam|
"
<meta http-equiv=refresh content='2; URL=/'>
通報しますた「#{param['name']}
"
end


Sinatic.run

# vim: set fdm=marker:
Posted at by