Unknown Region

プログラムでハマったエラーとその解決方法についての備忘録メモ

【Lua × JavaScript】Fengariのメモ

TypeScriptを弄っていたはずが、いつの間にか楽しくてFengariを弄っていた(?)ので……調べながら試したことのメモ。

fengari.io

FengariはJavaScriptで実装されたLuaVMとのこと。

ブラウザ上でLuaスクリプトを動かすことができる。

 

以下は簡単なHello Worldの例

例: index.html

<html>
<head>
<title>Hello World</title>
<script src="fengari-web.js" type="text/javascript"></script>
</head>
<body>
<script type="application/lua">
-- jsをrequire
local js = require "js"

-- windowを代入
local window = js.global

-- window.document.body.innerHTMLを書き換え
window.document.body.innerHTML = "Hello World.";
</script>
</body>
</html>

ブラウザで開くと単純に[Hello World.]と表示されるだけのHTML(笑)

[fengari-web.js]自体は事前にダウンロードしてきて同階層に置くのをお忘れなく。

ちなみにこれもまた公式に書いてある情報で、JavaScriptを使うのと同様にluaファイルを別で作成しscriptタグのsrcで指定するようにすることも可能。

 

もし本格的にこれを使って開発をすることになったら、変数のデバッグが欲しくなるかと。

ただ、JavaScriptデバッグLuaデバッグの両方が必要になって大変かもしれない。

一応、変数の内容確認に使えそうなのが以下の3つで、それぞれ動きが違うのでまとめておく。

先に言っておくと単純な文字列や数値の場合は、これら3つに大きな違いはなかった。

問題になるのはobject(table)の場合だ。

例: sample.html

<html>
<head>
<title>Sample</title>
<script src="fengari-web.js" type="text/javascript"></script>
</head>
<body>
<script type="application/javascript">
window.js_val = {"hoge": "fuga"};
</script>
<script type="application/lua">
local js = require "js"
local window = js.global

-- js_val
window.console:log(window.js_val)
window.console:dir(window.js_val)
print(window.js_val)

local lua_val = { hoge = "fuga" }

-- lua_valの内容確認
window.console:log(lua_val)
window.console:dir(lua_val)
print(lua_val)
</script>
</body>
</html>

実行結果は次の通り(consoleの内容で、少し見やすいように加工してある)

実行結果

fengari-web.js:8 {hoge: "fuga"}
                  hoge: "fuga"
fengari-web.js:8 Object
                  hoge: "fuga"
fengari-web.js:8 [object Object]
fengari-web.js:8 ƒ table: 0x23
fengari-web.js:8 ƒ n()
fengari-web.js:8 table: 0x23

パッとみた感じ、JavaScript由来のオブジェクトについては[console.log()]か[console.dir()]を使うのが良さそう。

逆にLua由来のオブジェクト(table)は、一発でconsoleに出すことは難しいのかもしれない。

 

【MATLAB】nchoosekによる[組み合わせ]の利用

今回は以前に記事を書いた記事の、MATLAB版。

plugout.hateblo.jp

MATLAB[組み合わせ]の処理実装するためには[nchoosek]を利用するのが一番スマート。

jp.mathworks.com

 

例: Demo1.m

data = ["A", "B", "C", "D", "E"];
patterns = nchoosek(data, 3);
[m, ~] = size(patterns);
for i = 1: m
    pattern = patterns(i, :);
    disp(mat2str(pattern));
end

上記コードを実行すると以下が出力される。

>> Demo1
["A" "B" "C"]
["A" "B" "D"]
["A" "B" "E"]
["A" "C" "D"]
["A" "C" "E"]
["A" "D" "E"]
["B" "C" "D"]
["B" "C" "E"]
["B" "D" "E"]
["C" "D" "E"]

つまりは[patterns]には[5C3]の組み合わせが、以下のような行列として格納されていることがわかる。

    "A"    "B"    "C"
    "A"    "B"    "D"
    "A"    "B"    "E"
    "A"    "C"    "D"
    "A"    "C"    "E"
    "A"    "D"    "E"
    "B"    "C"    "D"
    "B"    "C"    "E"
    "B"    "D"    "E"
    "C"    "D"    "E"

 

 

さらに[「A, A, A, A, B, C」の中から3つ取り出す際にAの重複を排除する]ような場合には、以下の様に[unique()]を使用すると良い。

例: Demo2.m

data = ["A", "A", "A", "A", "B", "C"];
patterns = nchoosek(unique(data), 3);
[m, ~] = size(patterns);
for i = 1: m
    pattern = patterns(i, :);
    disp(mat2str(pattern));
end

上記コードを実行すると以下が出力される。

>> Demo2
["A" "B" "C"]

 

ちなみに[組み合わせ]ではなく[順列]を求めたい場合には以下のようにすれば良い。

例: Demo3.m

data = ["A", "B", "C", "D", "E"];
patterns = [];
init_patterns = nchoosek(data, 3);
[m, ~] = size(init_patterns);
for i = 1: m    
    tmp_pattern = perms(init_patterns(i, :));
    [n, ~] = size(tmp_pattern);
    for j = 1: n
        pattern = tmp_pattern(j, :);
        disp(mat2str(pattern));
        patterns = [patterns; pattern];
    end
end

上記コードを実行すると以下が出力される。

>> Demo3
["C" "B" "A"]
["C" "A" "B"]
["B" "C" "A"]
["B" "A" "C"]
["A" "C" "B"]
["A" "B" "C"]
["D" "B" "A"]
["D" "A" "B"]
["B" "D" "A"]
["B" "A" "D"]
["A" "D" "B"]
["A" "B" "D"]
["E" "B" "A"]
["E" "A" "B"]
["B" "E" "A"]
["B" "A" "E"]
["A" "E" "B"]
["A" "B" "E"]
["D" "C" "A"]
["D" "A" "C"]
["C" "D" "A"]
["C" "A" "D"]
["A" "D" "C"]
["A" "C" "D"]
["E" "C" "A"]
["E" "A" "C"]
["C" "E" "A"]
["C" "A" "E"]
["A" "E" "C"]
["A" "C" "E"]
["E" "D" "A"]
["E" "A" "D"]
["D" "E" "A"]
["D" "A" "E"]
["A" "E" "D"]
["A" "D" "E"]
["D" "C" "B"]
["D" "B" "C"]
["C" "D" "B"]
["C" "B" "D"]
["B" "D" "C"]
["B" "C" "D"]
["E" "C" "B"]
["E" "B" "C"]
["C" "E" "B"]
["C" "B" "E"]
["B" "E" "C"]
["B" "C" "E"]
["E" "D" "B"]
["E" "B" "D"]
["D" "E" "B"]
["D" "B" "E"]
["B" "E" "D"]
["B" "D" "E"]
["E" "D" "C"]
["E" "C" "D"]
["D" "E" "C"]
["D" "C" "E"]
["C" "E" "D"]
["C" "D" "E"]

[patterns]には[5P3]の各通りが格納される。

尚、パフォーマンスが気になる場合には[patterns]を拡張するのではなく、予め計算してサイズを確保しておくことをオススメする。

 

連絡先: plugout777★yahoo.co.jp (クローラー対策のため★を@に変更してください)