2013/02/13


Boost 1.53 がリリースされたので入れた。
新しく追加されたライブラリ。
  • Atomic: C++11-style atomic<> from Helge Bahmann, maintained by Tim Blechmann.
  • Coroutine: Coroutine library, from Oliver Kowalke.
  • Lockfree: Lockfree data structures, from Tim Blechmann.
  • Multiprecision: Extended precision arithmetic types for floating point, integer and rational arithmetic from John Maddock and Christopher Kormanyos.
  • Odeint: Solving ordinary differential equations, from Karsten Ahnert and Mario Mulansky.
非同期関連が増えて面白くなってきた。
試しに boost::coroutine 使おうと思ったら boost::context の make_fcontext と jump_fcontext がアセンブラでシンボルエクスポートされてなさげ。普段は masm にパスを通しているのだけど、どうやら VC 付属の ml じゃないと駄目らしい。
気付くまでハマった。。。

ようやく動くようになった。 #include <boost/coroutine/coroutine.hpp>

int
main(){
  typedef boost::coroutines::coroutine<std::string()> ctype;

  ctype
  c([] (ctype::caller_type &yeild) {
    for (int i = 0; i < 10; i++){
      yeild(i % 2 == 0 ? "フル" : "チン\n");
    }
  });

  while(c) {
    std::cout << c.get();
    c();
  }

  return 0;
}
実行結果 フルチン
フルチン
フルチン
フルチン
フルチン
ブーストフルーチンでは無いので注意。
Posted at by



2013/02/08


日本人なら日本語だろ!!
日本語プログラム言語「なでしこ」公式ページ

「PC Online」に執筆していたコラム(へのリンク)が、PBSupport さんのページで、FM用(FileMaker)のデータベースとして公開されました。 これは、クジラ飛行机「文系サラリーマン...

http://nadesi.com/
#!cnako

データとはハッシュ
「hoge:foo  bar:baz time:20:30:58」を「\t」で正規表現区切る
それを反復
  それを「^([^:]+):(.*)」で正規表現マッチ
  データ@抽出文字列[0]は抽出文字列[1]

データを表示
実行結果 time=20:30:58
bar=baz
hoge=foo
参考資料
Posted at by



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