2013/02/06


DLL(どるる)でmruby(むるびぃ)を実行(らん)してやったぜ!
cremno さんが mruby-dll という、mruby.dll を作るバッチファイルその他を作ってくれたので試した。
cremno/mruby-dll - GitHub

a quick-and-dirty script that creates mruby.dll

https://github.com/cremno/mruby-dll
mruby.dll の作り方はプロジェクトの README.md を見ていただくとして、これを使ったアプリケーションを書いてみた。
#include <windows.h>
#include <stdio.h>

#define _(x) #x

typedef struct mrb_value {
  char _[16];
} mrb_value;

int
main(int argc, char* argv[]) {
  HMODULE hmruby = LoadLibrary("mruby.dll");
  void* (*mrb_open)();
  void (*mrb_close)(void*);
  mrb_value (*mrb_load_string)(void*,const char*);
  void* mrb;
  void* ctx;
  
  mrb_open = (void* (*)()) GetProcAddress(hmruby, "mrb_open");
  mrb_close = (void (*)(void*)) GetProcAddress(hmruby, "mrb_close");
  mrb_load_string = (mrb_value (*)(void*,const char*)) GetProcAddress(hmruby, "mrb_load_string");

  mrb = mrb_open();
  mrb_load_string(mrb, _(
                                         \n
def fizz_buzz_factory                    \n
  i = 0                                  \n
  Proc.new do                            \n
   i += 1                                \n
   case                                  \n
   when i % 15 == 0 then "FizzBuzz"      \n
   when i % 5 == 0 then "Buzz"           \n
   when i % 3 == 0 then "Fizz"           \n
   else i                                \n
   end                                   \n
  end                                    \n
end                                      \n
                                         \n
fb = fizz_buzz_factory                   \n
                                         \n
(1..100).to_a.each do                    \n
  puts fb.call                           \n
end                                      \n

));

  mrb_close(mrb);

  FreeLibrary(hmruby);
  return 0;
}
単純に DLL をロードしてコールする物。mruby.h を使わずやりたかったので mrb_value を固定 16 バイトに。

実行するとちゃんと FizzBuzz 出力されます。
mrb_load_string の戻り値が構造体の実体なので、この DLL だけを使うにはおそらく FFI が書ける使える LL くらいしか無いと思いますが、遊ぶには十分だと思います。

いい大人なので、ちゃんと発音しましょう。
Posted at by



2013/02/05


サーバを運用していらっしゃる方であれば、サービスの停止は死に値します。
大事な事なのでもう一度言います。

サーバを運用していらっしゃる方であれば、サービスの停止は死に値します。


サーバ管理者は皆、突然の死に備えるべきです。

そんな過酷な場面に立ち向かうサーバ管理者の皆さんの苦労を少しでも軽減する為に、apache モジュールを書きました。
mattn/mod_suddendeath - GitHub

突然の死!

https://github.com/mattn/mod_suddendeath
まずコンパイルしてインストールします。 apxs -ci mod_suddendeath.c -lhttpd -lapr-1
そして apache を再起動します。

サービスが動作しているディレクトリの .htaccess に以下を書き込みます。

SetHandler suddendeath
すると
このようなメッセージがブラウザに出力されます。簡単ですね!メンテナンスに最適です。なお、メッセージを変える事も出来ます。.htaccess
SuddenDeathMessage 突然の死
SetHandler suddendeath
SuddenDeathMessage によるメッセージ指定も出来ますし SuddenDeathFile /path/to/your/suddendeath.txt
SetHandler suddendeath
ファイルでの指定も可能です!!

もちろん改行をちゃんと判定していますので例えば       突然の

DanKogai Not Found
この様なテキストを SuddenDeathFile に設定すれば
ちゃんと余白を埋めて、幅も計算して出力してくれます!(utf-8で指定する必要があります)

これで万が一のサービスダウンやメンテナンスがあっても心配ありませんね!
ぜひお役立て下さい。
Posted at by



2013/01/30


現在 Vim は以下の LL言語による拡張をサポートしています。
  • Lua
  • MzScheme
  • Perl5
  • Python2
  • Python3
  • Ruby1.8
  • Ruby1.9
  • TCL
最近 mruby 熱が高いので if_mruby を書いてみた。
vim7-if_mruby.diff
https://gist.github.com/4662845
基本的な動作は if_ruby に合わせてあります。Makefile は mingw32 用だけ手を加えています。mingw32 と VC++ と configure && make もサポートしてます。MRUBY_ROOT という環境変数に mruby のリポジトリルートを指す必要があります。
:mruby (1..100).to_a.each{|x| puts x}
こんな事も出来ますし、if_ruby 同様に :mruby VIM::Window::current.height = 3
こんな事も出来ます。
1点だけ移植出来なかった物があり、ruby には rb_define_virtual_variable という API があり、これを使うと変数の参照でC言語の関数が呼び出せるのですが、mruby にはこれ相当の物がありませんでした。
メソッド名に「$」を含ませる事も出来ないので、結局 $curwin$curbuf については __curwin__curbuf という名称に変更しています。

おおよそ動くのですが
if_mruby の可能性について - GitHub

Vim標準の外部インタフェースとして、if_rubyがありますが、素のRuby言語は言語組み込みを想定されていないためいろんな困難があります...

https://github.com/vim-jp/issues/issues/297
のコメントにも書いた通り、
ただし僕は現状vim-devに送るつもりはない。mrubyはダイナミックロード(require)をサポートしていないし、vimから使うmrubyに新しい機能が欲しくなったら
  • mruby に欲しい mrbgem を導入
  • libmruby.a をビルド
  • vim をビルド
を毎回しないといけない。
という問題があるので、すぐさま vim-dev にパッチを送るつもりは無いです。

Vim に if_mruby が入るかどうかは、require が入るかどうかに掛かっているんですよ!Matz さん!(チラッチラッ)
良かったら遊んで下さい。

追記
mruby-require がいい感じに出来上がってきたので、vim-dev に送るかもです。
Posted at by