# Intro à Lua
## 17/05/2017
<img src="lua-logo.gif" alt="Lua logo" style="width: 20%;border: none">
Note: setup:
luarocks install --server=http://luarocks.org luarepl inspect
eval $(luarocks path --bin)
rep.lua # use rlwrap
### Le langage (1/4)
- 1993, écris en C
- typé dynamiquement
- garbage collection
- first-class functions
<pre style="width: 100%"><code class="lang-lua hljs">foo = function () print(42) end
</code></pre>
- closures
- coercion (conversion auto number/string)
### Le langage (2/4)
- gestion des erreurs via fonctions: `error` / `pcall`
- modules:
<pre style="width: 100%"><code class="lang-lua hljs">utils = require('utils')
</code></pre>
- package manager: `luarocks`
- API Lua/C simple: LIFO stack
- luaJIT
### Le langage (3/4)
- variables globales par défault
<pre style="width: 100%"><code class="lang-lua hljs">local foo = function () print(42) end
</code></pre>
- une fonction peut retourner plusieurs valeurs
<pre style="width: 100%"><code class="lang-lua hljs">foo = function () return 4, 2 end
</code></pre>
- unpack
- passage de paramètres par nom
<pre style="width: 100%"><code class="lang-lua hljs">kung = function (t) return t.a + t.b end
</code></pre>
- varargs
<pre style="width: 100%"><code class="lang-lua hljs">bar = function (a, ...) return a + ... end
</code></pre>
Note:
foo = function (a, b) return a + b end
foo(1, 2)
foo(unpack({1, 2}))
kung{a=1,b=2}
bar(1, 2)
bar(1)
bar(1, 2, 3)
### Le langage (4/4)
- iterators (coroutines)
- ranges: `i = 1,100`
- **tables**
<pre style="width: 100%"><code class="lang-lua hljs">t = {a = 5, 10}
</code></pre>
- une valeur "`nil`" clôt une table
Note:
t[1]
inspect = require('inspect')
print(inspect({1, 2, nil, 3}))
### Lua & Redis
- API Lua
- Redis "`EVAL`", "`SCRIPT LOAD`" & "`EVALSHA`"
- [tuto](https://www.redisgreen.net/blog/intro-to-lua-for-redis-programmers/)
Note:
redis-cli --eval incrset.lua links:counter links:urls , https://chezsoi.org
redis-cli KEYS '*'
redis-cli GET links:counter
redis-cli HGET links:urls 1
### Lua & Redis: what for ?
- lock / atomic transactions (alt: `WATCH`/`MULTI`/`EXEC`)
- conditional logic: `EXISTS`, `HEXISTS`
- bénéficier de la stdlib (base, table, string, math, cjson, cmsgpack...)
### Lua & Nginx
Avec [OpenResty](https://openresty.org) : serveur de webapps basé sur Nginx
Trivia: le script Lua CLI de [Kong](https://github.com/Mashape/kong/blob/master/bin/kong) est démarré via [resty](https://github.com/openresty/resty-cli/blob/master/bin/resty), le script CLI d'OpenResty... écris en PERL !
### Lua & Nginx: à quoi ça ressemble ?
https://github.com/openresty/lua-nginx-module#synopsis
https://github.com/openresty/lua-nginx-module#directives
- `content_by_lua_block`
- `content_by_lua_block`
- `access_by_lua_file`
### Lua & Nginx: what for ?
- gestion des accès & sécu custom
- manipulation des headers HTTP
- choix de backend dynamique
- URL dispatch
- cache custom
### Des questions ?
- [Learn Lua in 15min](http://tylerneylon.com/a/learn-lua/)
- [Sources de cette prez](https://github.com/Lucas-C/linux_configuration/blob/master/languages/Lua/prez-vsct-2017-05-17.html)