Lua に触れてみる 5

最近は Raspberry Pi で LuaJIT を少し触りましたが、 以前 Apache2.4.1 に mod_lua が追加されたときにも 少しだけ Lua を触っていました。

Lua が結構速いということで、 その時に 他の言語と 超簡単な速度比較をしていたのですが、 今回は LuaJIT も含めて Raspberry Pi 上で比較してみたいと思います。

$ time bash -c 'for ((i=0;i<1000000;i++)) do j=i; done'

real    2m51.676s
user    2m46.940s
sys     0m3.620s

$ time perl -e 'for($i=0;$i<1000000;$i++){$j=$i;}'

real    0m2.782s
user    0m2.740s
sys     0m0.020s

$ time lua -e 'for i=1,1000000 do j=i end'

real    0m0.337s
user    0m0.330s
sys     0m0.010s

$ time luajit -e 'for i=1,1000000 do j=i end'

real    0m0.041s
user    0m0.010s
sys     0m0.000s

luajit は 速いですね。

変数を局所化した方が早くなるそうなので そちらもお試し。

$ time lua -e 'local i, j; for i=1,1000000 do j=i end'

real    0m0.171s
user    0m0.160s
sys     0m0.010s

$ time luajit -e 'local i, j; for i=1,1000000 do j=i end'

real    0m0.022s
user    0m0.010s
sys     0m0.000s

かなり速くなりました。

Raspberry Pi と LuaJIT で 3D してみる (2)

以前試した LjES が ver.2.00 になったということで さっそく試してみたいと思います。

[参考]
Raspberry Pi メモ (29) - LuaJITでお手軽3D (5)

今回のバージョンでは Blender で作成し Collada 形式でエクスポートした 3D モデルを読み込む機能が追加されていて お手軽に 3D アニメーション ができるそうです。

上記サイトにも書いてありますが、 以下のコマンドを実行するだけで デモを動かすことができます。

$ cd /tmp
$ curl -O http://www.mztn.org/rpi/ljes-2.00.tar.gz
$ tar zxf ljes-2.00.tar.gz
$ cd ljes-2.00
$ cd examples
$ luajit hand.lua

2014-01-07-wheezy-raspbian 上で試しましたが 簡単に動きました。

WRITE_0788_01

[1] 〜 [6] を押すと、指が動きます。 終了したいときは [q] を押します。 その他、操作は [h] で表示されます。

3D モデルとアニメーションの定義が 取り込めて Lua のプログラムで利用できるようになっているのはすごいですね。

Raspberry Pi と LuaJIT で 3D してみる (1)

jun さんが Raspberry Pi 上で動く LuaJIT の 3D ライブラリを作られたので 3D で 遊んでみたいと思います。

[参考サイト]
Raspberry Pi メモ (20) LuaJITでお手軽3D (2) LjESリリース - Jun's homepage

LuaJIT や OpenGL ES2 についても書かれてますので 詳しくは次のページなんかを参照してください。

[参考サイト]
Raspberry Pi メモ (19) LuaJITでお手軽3D (1) - Jun's homepage
Raspberry Pi メモ (7) OpenGL ES2 (1) 概要 - Jun's homepage

とりあえず動かしてみます。

まず Raspberry Pi を起動して HDMI からの出力を TV などに出しておきます。

次に LuaJIT の 3D ライブラリをダウンロードして 解凍します。

$ cd /tmp
$ wget http://www.mztn.org/rpi/ljes-1.00.tar.gz
$ tar zxf ljes-1.00.tar.gz
$ cd ljes-1.00
$ ls -F
COPYRIGHT  examples/  LjES/  README  test/

examples の中にサンプルがあります。

$ cd examples
$ ls *.lua
axis.lua          donut.lua        term.lua
demo_shape.lua    double_cone.lua  truncated_cone.lua
demo_spheres.lua  sphere.lua

demo_shape.lua を実行してみます。

$ luajit demo_shape.lua

HDMI の出力先に次のような 3D が表示されます。

WRITE_0709_01

[Q]キーで終了します。 [Ctrl]+[C]で終了した場合、コンソールの設定が変更されたままになります。 そのときは、エコーされませんが、次のように term.lua を実行すると元に戻ります。

$ ./term.lua

今回はここまで。

lua に触れてみる 4

lua は変数に型を定義しませんが 型は存在します。 他の型のない言語と同じように 変数に色々な型を入れることができます。

適当に試してみます。

$ lua
>

対話モードに入りました。

> = type(a)
nil

type は引数の型を返す関数です。
変数 a が定義されていない状態では nil を返します。

> a = "test"
> = type(a)
return

> a = 2.2
> = type(a)
number

> a = true
> = type(a)
boolean

> a = {1,2,3}
> = type(a)
table

変数には関数も入れることができます。

> a = type
> = type(a)
function

当然、次のようなこともできます。

> a = type
> = a(a)
function

lua に触れてみる 3

lua は変数に型がない言語としては かなり速いそうです。

適当に試してみます。

$ time lua -e 'for i=1,1000000 do j=i end'

real    0m0.029s
user    0m0.030s
sys     0m0.000s
$ time perl -e 'for($i=0;$i<1000000;$i++){$j=$i;}'

real    0m0.143s
user    0m0.150s
sys     0m0.000s
$ time php -r 'for($i=0;$i<1000000;$i++)$j=$i;'

real    0m0.160s
user    0m0.140s
sys     0m0.020s
$ time bash -c 'for ((i=0;i<1000000;i++)) do j=i; done'

real    0m6.276s
user    0m5.910s
sys     0m0.180s

厳密な比較ではないですが なんとなく速そうですね。

lua に触れてみる 2

前回に続き lua を触ってみます。

lua はスクリプトファイルやコンパイルしたファイルを引数にする以外にも 実行する方法があります。

まずは perl などでもお馴染みのコマンドラインの引数に スクリプトを直接書く方法です。

$ lua -e "print(3)"
3

オプションは "-e" を指定します。

このような処理も書けます。

$ lua -e "for i=1,3 do print(i) end"
1
2
3

次は、対話型です。

引数を指定せずに lua コマンドを実行すると プロンプトが表示されて 対話モードになります。

$ lua
>

対話モードを終了するには [Ctrl]+[c] します。

出力するには print() 関数以外にも = を使うことができます。

> print(3)
3

> = 4
4

"=" は return と同じです。 ([↑]キーでコマンド履歴を表示すると "=" は return になっています)

なので return でも出力できます。

> return 1 + 2
3

カンマで区切るとタブ区切りで出力します。

> print(1,2,3)
1       2       3

> = "a", "b", "c"
a       b       c

> return 3, 5, 7
3       5       7

lua に触れてみる

[参考]
Apache HTTP Server 2.4.1 がリリースされました - Apache JP (2012/02/21)

ということなのですが、内容に「スクリプト言語 Lua を組み込むモジュール (mod_lua)」というのがあり、 巷で話題?の lua に触れてみました。

まずインストール。
Ubuntu 10.04 には lua50 というパッケージがあります。

$ sudo apt-get install lua50

これで lua 5.0.x が入ります。

コマンドは次のような感じです。

$ lua
lua     lua50   luac    luac50 

lua コマンドが lua の実行で、luac がコンパイラのようです。
Java と似てますね。

対話形式もできるようですが、それはまた別の機会に。

とりあえず適当なソースを書いてみます。

$ vi test.lua
print(3)

実行してみます。

$ lua test.lua
3

コンパイルしてみます。

$ luac test.lua
$ ls
luac.out  test.lua 

"luac.out" というファイルができました。
実行してみます。

$ lua luac.out
3

コンパイルしたファイルの実行も "luac.out" 単体ではなく lua コマンドに食べさせるようです。

実行可能なスクリプトファイルにしてみます。

$ vi test2.lua
$ chmod 755 test2.lua
#!/usr/bin/lua

print(3)

実行してみます。

$ ./test2.lua
3

簡単ですね。

ちなみにコンパイルしたファイルを file すると コンパイルしたバージョンが表示されるようです。

$ file luac.out
luac.out: Lua bytecode, version 5.0