2015/08/15


埋め込み向けで、C言語から呼べて API が小さい JavaScript エンジン v7 を見つけました。

cesanta/v7 · GitHub
https://github.com/cesanta/v7/

特徴としては

  • クロスプラットフォーム: Arduino から MS Windows まで、どこでも動く。
  • 小さい: コンパイルされたコアはわずか 40KB から 200KB。
  • シンプルで直観的な C/C++ API: 簡単に C/C++ の関数を JavaScript 環境へエクスポート出来る。
  • 標準: V7 は JavaScript 5.1 を実装し、Standard ECMA tests をパスする事を目指している。
  • パフォーマンス: V7 は非 JIT エンジンの中で最速を目指している。
  • 創造的に利用可能: V7 は、ハードウェア(SPI、UARTなど)、ファイル、暗号化、ネットワークといった補助ライブラリのAPIを提供する。
  • ソースコードは ISO C と ISO C++ に準拠している。
  • 非常に簡単な統合: プロジェクトに取り込むには単に v7.h と v7.c の2つのファイルをコピーするだけ。

v8duktape も良いのですが、v8 はどっしり構えないと書き出せないし、duktape も API がスタックマシン形式という誰得だったりするので、純粋にC言語から使えてしかも define だけでネットワークや暗号まで使えるなら、こりゃ使わない理由はない。試しにサンプルを書いてみた。

#include <v7.h>
#include <stdio.h>
#include <string.h>

static v7_val_t
js_neocomplete(struct v7 *v7, v7_val_t this_obj, v7_val_t args) {
  char buf[100], *p;
  p = v7_to_json(v7, this_obj, buf, sizeof(buf));
  puts(p);
  return v7_create_undefined();
}

int
main() {
  v7_val_t result;
  struct v7* v7 = v7_create();
  v7_val_t obj = v7_create_object(v7);
  v7_val_t arr = v7_create_array(v7);
#define V7_STR(v7, v) v7_create_string(v7, v, strlen(v), 1)
  v7_array_push(v7, arr, V7_STR(v7, "きさま!"));
  v7_array_push(v7, arr, V7_STR(v7, "まさか!"));
  v7_array_push(v7, arr, V7_STR(v7, "そのまさかだ!"));
  v7_array_push(v7, arr, V7_STR(v7, "フハハハハハ!"));
#undef V7_STR
  v7_set(v7, obj, "Shougo"60, arr);
  v7_set_method(v7, obj, "neocomplete", &js_neocomplete);
  v7_set(v7, v7_get_global_object(v7), "Shougo"60, obj);

  v7_exec(v7, &result, "Shougo.neocomplete()");
  v7_destroy(v7);
}

実行すると

{"Shougo":["きさま!","まさか!","そのまさかだ!","フハハハハハ!"]}

という文字が出力されます。

見てもらえると分かる通り、かなり直観的な操作で JavaScript のオブジェクトや配列や JSON 操作や、C言語関数の呼び出しが行えるようになっています。ただしライセンスは GPL v2 なので利用の際には注意が必要です。

Posted at by



2015/07/28


Ruby 製バッチ処理を省メモリ化した - 彼女からは、おいちゃんと呼ばれています

少し前に Ruby 製の バッチ処理 を省メモリ化したときの話をメモしておきます。 どのような バッチ処理 だったか 動画共有サイト にアップされた動画がオトナの事情によって削除されることがしばしばあ...

http://blog.inouetakuya.info/entry/2015/07/26/204320

ActiveRecord の each は全件、find_each はデフォルトで1000件をインスタンス化するので、HTML をパースしたDOMツリーが1000件もメモリに乗ったらそりゃ OOM Killer で殺されても文句は言えないかもしれない。

ActiveRecord::Batches

The find_each method uses find_in_batches with a batch size of 1000 (or as specified by the :batch_size option).

http://api.rubyonrails.org/classes/ActiveRecord/Batches.html

試しにキャッシュと呼んでおられる @doc の中身を表示すると

  def doc
    p @doc
    # 動画配信元ページの HTML をキャッシュ
    @doc ||= Nokogiri::HTML(open(source_url))
  end
#<Nokogiri::HTML::Document:0x149ddbc name="document" children...
#<Nokogiri::HTML::Document:0x11abd6c name="document" children...
#<Nokogiri::HTML::Document:0xdbcd8c name="document" children=...

毎回異なるメモリのアドレス値が表示されており全くキャッシュに意味が無い事が分かる。上記の通り find_each の仕様ならばきちんと1000個の DOM ツリーがメモリに乗っている事になる。

class Video < ActiveRecord::Base
  after_initialize do
    doc ||= Nokogiri::HTML(open(source_url))
    @deleted = doc.at_css('.message').try(:text).try(:match'This video has been deleted')
    @removed = doc.title.match 'Removed'
  end

  def deleted?
    match_removed? || match_deleted?
  end

  def existing?
    !deleted?
  end

  private

  def match_deleted?
    @deleted
  end

  def match_removed?
    @removed
  end
end

こんな感じに使ったらすぐに doc を捨ててしまうか、batch_size の数を減らして一度にインスタンス化される数を制限する事で解決しそうな気がします(こちらは未検証)。

Video.find_each(batch_size5do |video|
  video.delete! unless video.existing?
end
Posted at by



2015/07/03


ちょっと書き物をする用事があって、markdown で書かなきゃいけなかったんですが

  • 余計なインストールの手間が不要で
  • 余計な設定は一切不要で
  • 使い勝手は Linux や Windows 全て同じで
  • 出来れば Markdown 保存したら自動更新されて
  • GitHub Flavour Markdown でコードハイライトト
  • GitHub Flavour Markdown でテーブル表記

こういうのが欲しくて、あるアプリケーションを見つけたんだけど外部の JavaScript を使ってる上にそのリソースURLが無くなり動かなくなってて困ったので作った。

今後もこういう事あるだろうし、自分用に作っておくべきだと思った。書き物をする予定だったのに気付いたら作ってたのでしょうがない。僕のせいではない。

mattn/mkup - GitHub

README.md mkup Portable Markdown Previweer Usage 1 mkup Installation 1 go get github.com/mattn/mkup ...

https://github.com/mattn/mkup
$ mkup

でカレントディレクトリ配下のファイルがサーブされます。.md, .mkd, .markdown の拡張子が付いたファイルは GitHub Flavour Markdown で綺麗に表示されます。ただし GitHub の API は使いません。ブラウザで http://localhost:8000 を開いておけばファイル更新後に勝手にリロードされます。テーブルタグもサポートしていますし、コードハイライトもサポートしています。ただし Google Code Prettify なので誤爆はあり得ます。

尚、mkup は JavaScript や CSS といった全てのリソースを実行モジュール内に保持していますので、Windows であれば exe ファイル1個あればどこでもプレビュー出来ますし、ちょっと別のPCで作業する必要があるって時にも exe ファイルだけコピーすればすぐ Markdown を書きが始められます。

自分専用なので最少の機能しかないですが、よろしければどうぞ。リリースにバイナリが置いてあるので持ってってください。

Releases - mattn/mkup - GitHub
https://github.com/mattn/mkup/releases
Posted at by