Y-Ken Studio

新しもの好きのデータエンジニアが四方山話をお届けします。

Mac OSXではじめるLua:brewコマンドで簡単インストール&動作テスト

軽くて速いと評判のスクリプト言語である、Luaを使ってみたレポートをしたいと思います。

Luaとは

Luaはプログラムの機能を拡張する、いわゆる組み込み用途に特化したスクリプト言語。 軽快で高速、組み込みが容易、移植性が高い、といった特徴を持ち、多くの環境に移植されている。
http://d.hatena.ne.jp/keyword/Lua

とのことです。

環境

MacOSX 10.8.3にbrewを入れた環境です。

$ sw_vers -productVersion
10.8.3

$ brew -v
Homebrew 0.9.4

Lua本体のインストール

luaを入れるのもbrewコマンドで一発です。

$ brew install lua
==> Downloading http://www.lua.org/ftp/lua-5.1.5.tar.gz
######################################################################## 100.0%
==> Patching
patching file Makefile
patching file src/Makefile
==> make macosx INSTALL_TOP=/usr/local/Cellar/lua/5.1.5 INSTALL_MAN=/usr/local/C
==> make install INSTALL_TOP=/usr/local/Cellar/lua/5.1.5 INSTALL_MAN=/usr/local/
🍺  /usr/local/Cellar/lua/5.1.5: 15 files, 288K, built in 6 seconds

kyototycoonのLuaスクリプティング拡張をLuaJITにしてみた によると、JIT版であるluajitの方が高速らしい。
これまた、brewコマンドで一発インストール出来ます。

$ brew install luajit
==> Downloading http://luajit.org/download/LuaJIT-2.0.1.tar.gz
######################################################################## 100.0%
==> make PREFIX=/usr/local/Cellar/luajit/2.0.1 amalg
==> make PREFIX=/usr/local/Cellar/luajit/2.0.1 amalg install
🍺  /usr/local/Cellar/luajit/2.0.1: 25 files, 1.5M, built in 18 seconds

Luaパッケージリポジトリ「LuaRocks」

LuaRocksという、PHPでいうPEARRubyでいうRubyGems的なパッケージリポジトリがあります。

CPANRubyGemsほどではないですが、データベースドライバやHTTPクライアントなどいろんなモジュールが揃っているようなので、組み込み用途だけではなく簡単なバッチ処理などでもLuaは使えるのではないでしょうか。
http://rest-term.com/archives/3038/

その他、Redisとの通信を行うものもあるようです。

動作テスト

とりあえず起ち上げてみます。

$ lua
Lua 5.1.5  Copyright (C) 1994-2012 Lua.org, PUC-Rio
>

$ luajit
LuaJIT 2.0.1 -- Copyright (C) 2005-2013 Mike Pall. http://luajit.org/
JIT: ON CMOV SSE2 SSE3 SSE4.1 fold cse dce fwd dse narrow loop abc sink fuse
> ^C

luamd5を行うサンプルプログラムの動作テスト

以下にあるプログラムlua -lmd5 -e 'print(md5.sumhexa(""))'を試しに動かしてみましょう。
[lua]luaはじめました。で、luarocksをrpm導入(rpmbuild編)。

むむ?動かないですね。どうやらmd5が入っていないようです。
パスが通っていないという訳でもなさそうです。

$ lua -lmd5 -e 'print(md5.sumhexa(""))'
lua: module 'md5' not found:
    no field package.preload['md5']
    no file './md5.lua'
    no file '/usr/local/share/lua/5.1/md5.lua'
    no file '/usr/local/share/lua/5.1/md5/init.lua'
    no file '/usr/local/lib/lua/5.1/md5.lua'
    no file '/usr/local/lib/lua/5.1/md5/init.lua'
    no file './md5.so'
    no file '/usr/local/lib/lua/5.1/md5.so'
    no file '/usr/local/lib/lua/5.1/loadall.so'
stack traceback:
    [C]: ?
    [C]: ?

Luarockでmd5をインストール

luarocks install md5でさくっと使えるはず。
しかし、gmakeコマンドが見つからないため、インストールに失敗しました。
そうです。MacOSXXcodeを入れていたとしてもgmakeコマンドはありません。

$ luarocks install md5
Installing http://www.luarocks.org/repositories/rocks/md5-1.1.2-2.src.rock...
Using http://www.luarocks.org/repositories/rocks/md5-1.1.2-2.src.rock... switching to 'build' mode
Archive:  /tmp/luarocks_luarocks-rock-md5-1.1.2-2-3965/md5-1.1.2-2.src.rock
  inflating: md5-1.1.2-2.rockspec
 extracting: md5-1.1.2.tar.gz
sh: gmake: command not found

Error: Build error: Failed building.

gmake on OSX 10.6?の記事によると、「make is usually the same as gmake」とのこと。
という訳で、gmakeにmakeのシンボリックリンクを張りましょう。
その後に再度luarocks install md5を実行するとインストール出来ました。

$ sudo ln -s /usr/bin/make /usr/bin/gmake
Password:
$ luarocks install md5
Installing http://www.luarocks.org/repositories/rocks/md5-1.1.2-2.src.rock...
Using http://www.luarocks.org/repositories/rocks/md5-1.1.2-2.src.rock... switching to 'build' mode
Archive:  /tmp/luarocks_luarocks-rock-md5-1.1.2-2-6518/md5-1.1.2-2.src.rock
  inflating: md5-1.1.2-2.rockspec
 extracting: md5-1.1.2.tar.gz
export MACOSX_DEPLOYMENT_TARGET=10.5; gcc -O2 -fPIC -I/usr/local/opt/lua/include   -c -o src/md5.o src/md5.c
export MACOSX_DEPLOYMENT_TARGET=10.5; gcc -O2 -fPIC -I/usr/local/opt/lua/include   -c -o src/md5lib.o src/md5lib.c
export MACOSX_DEPLOYMENT_TARGET="10.3"; export MACOSX_DEPLOYMENT_TARGET=10.5; gcc -O2 -fPIC -I/usr/local/opt/lua/include -bundle -undefined dynamic_lookup -all_load -o src/core.so src/md5.o src/md5lib.o
export MACOSX_DEPLOYMENT_TARGET=10.5; gcc -O2 -fPIC -I/usr/local/opt/lua/include   -c -o src/des56.o src/des56.c
export MACOSX_DEPLOYMENT_TARGET=10.5; gcc -O2 -fPIC -I/usr/local/opt/lua/include   -c -o src/ldes56.o src/ldes56.c
export MACOSX_DEPLOYMENT_TARGET="10.3"; export MACOSX_DEPLOYMENT_TARGET=10.5; gcc -O2 -fPIC -I/usr/local/opt/lua/include -bundle -undefined dynamic_lookup -all_load -o src/des56.so src/des56.o src/ldes56.o
mkdir -p /usr/local/lib/luarocks/rocks/md5/1.1.2-2/lib/md5
cp src/core.so /usr/local/lib/luarocks/rocks/md5/1.1.2-2/lib/md5/core.so
mkdir -p /usr/local/lib/luarocks/rocks/md5/1.1.2-2/lua
cp src/md5.lua /usr/local/lib/luarocks/rocks/md5/1.1.2-2/lua
cp src/des56.so /usr/local/lib/luarocks/rocks/md5/1.1.2-2/lib
Updating manifest for /usr/local/lib/luarocks/rocks

md5 1.1.2-2 is now built and installed in /usr/local/ (license: MIT/X11)

(今度こそ)luamd5を行うサンプルプログラムの動作テスト

無事、lua、luajitそれぞれで実行することが出来ました!

$ lua -lmd5 -e 'print(md5.sumhexa(""))'
d41d8cd98f00b204e9800998ecf8427e

$ luajit -lmd5 -e 'print(md5.sumhexa(""))'
d41d8cd98f00b204e9800998ecf8427e

まだどういう時に便利なのか良く分かっていませんが、
とりあえず開発環境が出来たので本日はここでおしまいにしたいと思います。