coins LT #10

ルアカツ!～ルアカツドウ!～
びしょ～じょ自己紹介

• こんにちは、びしょ～じょです。
♥ 百合とかアイカツとか Arch Linux とか Lua/MoonScript とかが趣味

Luakatsu
Lua とは
LuaRocks とは
Aikatsu!
Luakatsu!
how to use
実装
〆

付録
速度比較
出典など

Luakatsu
Lua とは
LuaRocks とは
Aikatsu!
Luakatsu!
how to use
実装
〆

付録
速度比較
出典など

Lua + Aikatsu!

• Lua とは
C/C++への組み込み言語として開発された、マルチパラダイムな動的型付け言語♦ 小さい実装♠ Lua5.2.4 のソースは全部で 2 万行程度 (Ruby 2.2.1 のソースは 20 万行くらい)♣ もちろんこのスライドも LATEX に Lua が埋め込まれている LuaLATEX♥ 柔軟な記述♦ 手続き型で馴染みやすい♠ 関数がファーストクラス♣ 強力で唯一なデータ構造である tableによりオブジェクト指向プログラミングもできる。

♥ 高速に動作
多くの他のスクリプト言語よりも高速に動作し、JIT コンパイラの LuaJIT を用いれば Java より若干遅い程度の速度が出せる。

Lua + Aikatsu!

• Lua とは⇒ Wikipedia に詳細な記述がある

人人人人人人人＞まぁ見てくれ＜∨∨∨∨∨∨∨

Code 1: example.lua
12
3
45(function() io.write(string.format("Hello, %s!\n", "Lua")) end)()-- anonymous functiont = {"This", "is", "table"} -- global variable
for i = 1, #t do-- 1 origin
print(t[i])end> lua example.lua
Hello, Lua!
ThisistableLuakatsu
Lua とは
LuaRocks とはAikatsu!
Luakatsu!
how to use
実装
〆

付録
速度比較
出典など

Lua + Aikatsu!

• LuaRocks とはLua のパッケージ管理システム
Ruby でいうところの RubyGems 、Python でいうところの Pip ……という認識。
パッケージの登録や、他のユーザが登録したパッケージを簡単にインストールして使用することができる。

Luakatsu
Lua とは
LuaRocks とは
Aikatsu!
Luakatsu!
how to use
実装
〆

付録
速度比較
出典など

Lua + Aikatsu!

• アイカツ!

～アイドルカツドウ!～

奇跡の賜物
もはや説明は不要
先々週からはアニメの放送時間が 18:30 にずれたので注意Lua + Aikatsu!

Lua + アイカツ! =Lua + Aikatsu!

Lua + アイカツ! =型エラー

Luakatsu

Luakatsu
Lua とは
LuaRocks とは
Aikatsu!
Luakatsu!
how to use実装〆

付録
速度比較
出典など

Luakatsu!

• Luakatsu♦ sue445 さんの Rubicure に影響されて制作

Luakatsu!

• Luakatsu♦ sue445 さんの Rubicure に影響されて制作♠ 文字通り Ruby + プリキュア> ruby -rubicure -e 'Cure.marine'{:human_name=>"来海えりか", :precure_name=>"キュアマリン", :cast_name=>"水沢史絵", :created_date=>Sun, 21 Feb 2010, :color=>"blue", :transform_message=>"(プリキュアの種、いくですぅ！)\nプリキュア！オープンマイハート！\n海風に揺れる一輪の花！
キュアマリン！\nハートキャッチ、プリキュア！", :extra_names=>["スーパーキュアマリン"], :attack_messages=>["花よきらめけ！\nプリキュア！ブルーフォルテウェイブ！！", "花よ、咲き誇れ！\nプリキュア・ハートキャッチ・オーケストラ！！"], :transform_calls=>["open_my_heart"]}Luakatsu!

• Luakatsu♦ sue445 さんの Rubicure に影響されて制作♠ 文字通り Ruby + プリキュア♣ ではアイカツでこんな感じのやつは? ⇒ ない♥ じゃあ作るしか無いよなぁ?

♦ 現在 v2.0 が最新 (黒沢凛君、天羽まどか君に対応)♠ メジャーバージョンが 2 のくせにまだまだ機能が少ないのが特徴。
♣ Lua なので、LuaTEX からもちょっと វេទមន្ត すれば 簡単に 使える。

? LuaTEX に入っている Lua の処理系は ~/.luarocks以下のモジュールを読み込んでくれないのでここで一工夫必要。
参考: http://bit.ly/1CBXGjy♥ Lua に倣い MIT ライセンス

Luakatsu
Lua とは
LuaRocks とは
Aikatsu!
Luakatsu!
how to use実装〆

付録速度比較出典など

Luakatsu!
how to use

簡単インストール> luarocks --local install luakatsu

ワンライナー> lua -luakatsu -e "Aikatsu()"
私のアツいアイドル活動、アイカツ! 始まります! ﾌﾌｯﾋ
> date -s "04/01"> lua -luakatsu -e "Aikatsu()"
アメージーング! ショーーターイム! 俺のホットなティーチャー活動、アイカツ! スタート
だぜ、イェア!

Luakatsu!
how to use

Code 2: luakatsu_example.lua
1
2
3
4
5
6
7
8
910
11

require "luakatsu"
print(Aikatsu.Kii.name)print(Aikatsu.groups.Powapuri.name)for _, v in pairs(Aikatsu.Yurika.favorite_foods) do -- iterator
print(v)endprint("Version: ", Aikatsu.version)
Aikatsu.Ichigo() -- not needed `print` function

Luakatsu!
how to use> lua luakatsu_example.lua
Version: v2.0-0
冴草 きい
Powa² × PuRiRiN
牛丼
ラーメン
name 星宮いちご
actor 諸星 すみれ
birthday 03/15
blood_type O
favorite_foods のり弁
special_ablity ご飯をきっちりよそう
favorite_brand Angely Sugar
type Cutesignature_songs 輝きのエチュード, Growing for a dream, Dance in the rainsing 霧島 若歌
affilication Soleil, STAR☆ ANIS, 2wingS
school スターライト学園

Luakatsu!
how to use⇒ 幼女先輩各位にも簡単に触ってもらえるようなインターフェイス

LuakatsuLua とは
LuaRocks とは
Aikatsu!
Luakatsu!
how to use
実装
〆付録
速度比較
出典など

Luakatsu!
実装

以下が未実装♦ 各話タイトル♠ ステージ♣ ドレス (カード)♥ アイカツ格言♦ ……などなど

Luakatsu!
実装

以下が未実装♠ 各話タイトル⇐♣ ステージ♥ ドレス (カード)⇐ まぁいいかな♦ アイカツ格言♠ ……などなど

Luakatsu!
実装

以下が未実装♣ 各話タイトル♥ ステージ♦ ドレス (カード)⇐♠ アイカツ格言⇐ 肝心♣ ……などなど

Luakatsu!
実装

以下が未実装♥ 各話タイトル♦ ステージ♠ ドレス (カード)⇐♣ アイカツ格言⇐ 肝心♥ ……などなど(だめじゃん)\ ドッ /\ ワハハハハハ /Luakatsu!
実装

実態はAikastuというtableをグローバル変数として定義し、そこにいろいろ突っ込んでいる。アイドルの情報も全部table。
星宮いちご (Aikatsu.Ichigo) —その実態—{{"name", "星宮 いちご"}, {"actor", "諸星 すみれ"}, {"birthday", "03/15"}, {"zodiac_sign", "Picces"}, {"blood_type", "O"}, {"favorite_foods", {"のり弁"}}, {"special_ablity", {"ご飯をきっちりよそう"}}, {"favorite_brand", "Angely Sugar"}, {"type", "Cute"},{"signature_songs", {"輝きのエチュード", "Growing for a dream", "Dance in the rain"}}, {"sing", "霧島 若歌"}, {"affilication", {"Soleil", "STAR☆ ANIS", "2wingS"}}, {"school", "スターライト学園"}}

Luakatsu!
実装

しかし上記のように{{str, str}, {str, str} ...}みたいに定義しても当然t.kのように参照はできない

Q. そもそもなんで上記のような定義なのか
A. Lua の連想配列部分 ({k1 = v1, k2 = v2, ...}) は順序情報を保存しないので、小技を用いてチョチョイと……。
Q. 別によくない?
A. でもプロフィールを見るときは最初に名前が出ると嬉しいやんけ⇒ metatable という機能を使う

Luakatsu!
実装

metatable ……tableに付与する特別なtable。演算子オーバーロードとかもできる。
setmetatable(t, {__index = ..., __call = ...})
setmetatable関数でmetatableをセット♦ __index♠ t.kが未定義の時、 tに設定されている __index tableを参照する、という機能♣ 連想配列部分にも value を突っ込んでいくと tableがでかくなってしまう。
♥ {"k1", "v1"}のような tableを k1 = v1のように変換した tableを __indexとしてもとの tableに設定する。

♦ __call♠ tableを functionのように扱った時、 __callで定義した functionが実行される、という機能♣ t.__call()とかしなくて良いので、インターフェイスがすっきりする。
♥ tableの配列部分は順序が保持されるので、 {"key", "value"}を順番に出力

Luakatsu!
実装

metatableその他一部♦ 四則演算__add (+)、__sub (−)、__mul (×)、__div (÷)♠ 比較__eq (==)、__lt (<)、__le (<=)♣ シフト (Lua 5.3 から)__shl (<<)、__shr (>>)♥ 特殊__newindex · · · · · · tableへの（配列部分、連想配列部分問わず）値の追加時に発火する関数

Luakatsu
Lua とは
LuaRocks とはAikatsu!
Luakatsu!
how to use
実装
〆

付録
速度比較
出典など

Luakatsu!

♦ Luakatsu は アイカツ!の Lua 実装♠ Lua の連想配列部分の順序を保持しないところを metatable でカバー
♣ この辺のtableを生成する関数くらいしか頑張ったところがない (おわり)。
♥ あとはアイドル情報を魂を込めて一人ひとり手打ちしたくらい (公式などからうまくスクレイピングなどで引っ張れる形の情報がなくてつらい)。
♦ LuaLATEX めっちゃしんどかった。

ご清聴ありがとうございました。

Luakatsu
Lua とは
LuaRocks とはAikatsu!
Luakatsu!
how to use
実装
〆

付録
速度比較
出典など

Luakatsu
Lua とは
LuaRocks とはAikatsu!
Luakatsu!
how to use
実装
〆

付録
速度比較
出典など

速度比較 I• 速度比較
38 番目のフィボナッチ数を求めるまでの速度を計測
実行環境は ArchLinux(Linux Kernel 4.0.0)、Xeon E3-1270
pseudocode
def fib(n)if n < 2 thenreturn n
end
return fib(n - 1) + fib(n - 2)
endfib(38)速度比較 I

Code 3: fibs/fib.lua
1
2
3
4
56

local function fib(n)if n < 2 then return n end
return fib(n - 1) + fib(n - 2)
end
fib(38)速度比較 II

Code 4: fibs/fib.rb
1
2
3
4
5
67

def fib n
return n if n < 2
return fib(n - 1) + fib(n - 2)
endfib 38

Code 5: fibs/fib.py
12345

def fib(n):if n < 2: return nreturn fib(n - 1) + fib(n - 2)
fib(38)速度比較 III

Code 6: fibs/fib.java
12345
678910class fib{static int fib(int n){if(n < 2) return n;
return fib(n - 1) + fib(n - 2);}
public static void main(String[] arg){fib(38);}}速度比較 IV

Code 7: fibs/fib.c1
234
5
67
8

int fib(int n){if(n < 2) return n;
return fib(n - 1) + fib(n - 2);}
int main(){fib(38);}速度比較 I

timeコマンドにて計測。
for i in `seq 1 10`; time COMPILER fileCompiler/Interpreter
LuaRubyPythonLuaJIT
Java
GCC
Java、お前速いんだな。

Version
5.2.4
2.2.1p85
3.4.3
2.0.3
1.8.0_40
4.9.2

time
5.63195.530815.6391
0.347
0.2204
0.3356

Luakatsu
Lua とは
LuaRocks とは
Aikatsu!
Luakatsu!
how to use
実装
〆

付録
速度比較
出典など

• 出典など♠ さなフォン飾 (タイトル、その他)
http://sana.s12.xrea.com/2_sanafonkazari.html♣ Rubicure
https://github.com/sue445/rubicure♥ アイカツ格言♦ ゆうがた 6:30!
アイカツ! 第 126 話♠ 芸能人はカードが命アイカツ! 第 1 話♣ みんなでアイカツ!
アイカツ! 第 102 話