SlideShare une entreprise Scribd logo
1  sur  36
Lua & co - @LDuboeuf - Novembre 2016
Lua & co
Lua & co - @LDuboeuf - Novembre 2016
Plan
● A propos de moi
● Intro à Lua
● Utilisé où, pour faire quoi ?
● Quelques notions
● Luajit / luajit ffi
● Lua pour le web : Openresty
Lua & co - @LDuboeuf - Novembre 2016
A propos de moi
du dev , de l'admin sys & réseaux
Et Depuis 2012
Formateur @ Afpa
Lua & co - @LDuboeuf - Novembre 2016
Introduction a Lua
● Créé en 1993 par Roberto Lerusalimschy, Waldemar Celes,
Luiz Henrique de Figueiredo – au Bresil
● Langage de script rapide, léger ( 24000 loc écrit en ANSI C ),
facilement intégrable.
● Multi-paradigme : procédural, OO, fonctionnel
● Tourne sur toutes les distributions Unix et Windows,
smartphones (Android, iOS, Symbian, Windows Phone), sur
processeurs embarqués ( ARM, Rabbit), IBM mainframes, etc.
● C<->Lua bindings
● Licence MIT
Lua & co - @LDuboeuf - Novembre 2016
Utilisé où ?
redis Utilisé comme :
● Extension
● Monitoring
● Scripting (DSL)
● Proxy – Load balancing
● Gestion des caches
● Web Application
Firewall
● Robotique
● Game play
● Etc...
Lua & co - @LDuboeuf - Novembre 2016
Notions
Lua & co - @LDuboeuf - Novembre 2016
Notions suite...
Lua & co - @LDuboeuf - Novembre 2016
Notions suite...
● Concept de Metatable
– Permet de changer le comportement des tables
● Surcharge des opérateurs « +, -, /, * » (exemple Tbl1 + tbl2 )
● Comparaisons
● Héritage, interface (OOP)
– Permet d’intercepter les événements liés à la table :
● accès à la table,
● l’ajout de nouvelles entrées,
● la concaténation
● etc...
Lua & co - @LDuboeuf - Novembre 2016
Notions suite… OOP
Lua & co - @LDuboeuf - Novembre 2016
Notions fin
● Multithreading : les coroutines :
– pas multithread au sens OS, non pré-emptif. Permet les
opérations non bloquantes sur l'I/O.
● Bizarreries :
– Indice des tableaux commence par 1 !
– Différent de 1 => if (i~=1) then … end
– Pas d'opérateur ternaire ( x>3 ? 1 : 0; )
– Pas de raccourci pour l'incrément ( pas de i++ ni i+= )
● => i = i + 1
–
Lua & co - @LDuboeuf - Novembre 2016
Luajit
● Compilateur JIT pour lua
● Super rapide ! : 3 a 100x
● Et petit : < 100 KB
● Integration facilitée avec les librairies natives
C : => ffi (foreign function include)
Lua & co - @LDuboeuf - Novembre 2016
Luajit : ffi - exemple
Lua & co - @LDuboeuf - Novembre 2016
Outils & support
● Outils :
– Gestionnaire de paquet : Luarocks
– Tests unitaires : « busted » ou « luaunit » et d’autres…
– Debugger :IDE ZeroBrane Studio
● Supports
– Mailing list
– irc.freenode.net #lua
– Workshops
Lua & co - @LDuboeuf - Novembre 2016
Lua pour le web
● Pléthore de solutions,
– du 100 % Lua :
● Xavante, Pegasus
– Extension de serveur existant :
● LightHttpd, Apache, Nginx, Tornado...
– NodeJs like :
● Luvit
Lua & co - @LDuboeuf - Novembre 2016
Openresty
Openresty = Nginx + Luajit + Modules
Lua & co - @LDuboeuf - Novembre 2016
Nginx
● HTTP server, reverse proxy, proxy mail
● Modèle asynchrone
● Empreinte mémoire faible
● Modulaire
● Extensible avec des modules écrit en C
Lua & co - @LDuboeuf - Novembre 2016
Nginx modèle
Source : http://www.aosabook.org/en/nginx.html
Lua & co - @LDuboeuf - Novembre 2016
Nginx – serveur min.
worker_processes 1;
error_log logs/error.log;
events {
worker_connections 1024;
}
http {
server {
listen 8000;
location / {
index index.html;
root public/;
}
}
$> curl http://0.0.0.0:8000/index.html
Lua & co - @LDuboeuf - Novembre 2016
Openresty
● Créé et maintenu principalement par Yichun Zhang (@agentzh) .(
Taobao.com puis Clouflare )
● En production sur des sites à fort trafic (Alibaba group, Clouflare)
● Modules I/O non bloquants pour :
● Memcached
● Redis
● MySQL / Drizzle
● PostgreSQL
● Websockets, CLI, Json, etc..
Lua & co - @LDuboeuf - Novembre 2016
Openresty
● Directives pour executer du code Lua durant les phases
Nginx
– Init phase
– Rewrite phase.
– Access phase.
– Content phase.
– Log phase
– Et d’autres…
● API Lua pour accéder à l’environnement Nginx
Lua & co - @LDuboeuf - Novembre 2016
Openresty
● Le code Lua est exécuté directement au sein
des workers
Lua & co - @LDuboeuf - Novembre 2016
Openresty – Hello world
location /hellolua {
default_type 'text/plain';
content_by_lua_block {
local name = ngx.var.arg_name or "Anonymous"
ngx.say("Hello, ", name, "!")
};
}
$> curl http://localhost/hellolua?name=Lua
Hello, Lua
Lua & co - @LDuboeuf - Novembre 2016
Openresty : Chargement module externe
location /xxxx {
rewrite_by_lua_file /path/to/rewrite.lua;
access_by_lua_file /path/to/access.lua;
content_by_lua_file /path/to/content.lua;
}
● Les modules sont chargés qu’une seule fois par worker à la première
requête
Lua & co - @LDuboeuf - Novembre 2016
Openresty -sous requête
location / {
content_by_lua '
local res = ngx.location.capture("/memcached",
{ args = { cmd = "incr", key = ngx.var.uri } }
)
';
}
location /memcached {
set $memc_cmd $arg_cmd;
set $memc_key $arg_key;
memc_pass 127.0.0.1:11211;
}
Lua & co - @LDuboeuf - Novembre 2016
Openresty – cosocket
● Connection E/S non bloquante avec la librairie
Cosocket :
– TCP ou Unix Domain sockets
– Permet une écriture séquentiel du code tout en
s’assurant que l’exécution soit asynchrone ! ( voir la
joie des callbacks ;-))
– Mécanisme « Keepalive » pour la réutilisation des
connections.
Lua & co - @LDuboeuf - Novembre 2016
Openresty : client TCP
location /memcached {
content_by_lua_block {'
local sock = ngx.socket.connect("127.0.0.1", 11211)
sock:send("SET foo bar 3600rn")
local line = sock:receive()
if line then
ngx.say(line)
end
sock:setkeepalive()
};
}
$> curl http://localhost/memcached
STORED
Lua & co - @LDuboeuf - Novembre 2016
Openresty : mysql
location /todos {
content_by_lua_block {
local mysql = require "resty.mysql"
local db, err = mysql:new()
if not db then
ngx.say("failed to instantiate mysql: ", err)
return
end
db:set_timeout(1000) -- 1 sec
--connect…
local res, err, errcode, sqlstate = db:query("select * from tasks")
if not res then
ngx.say("bad result: ", err, ": ", errcode, ": ", sqlstate, ".")
return
end
local cjson = require "cjson"
ngx.say("result: ", cjson.encode(res))
} ;
}
Lua & co - @LDuboeuf - Novembre 2016
Openresty : mini app
location /api/v0.1/todos {
          default_type application/json;
          
          content_by_lua_block {
            local todo_api = require "todo-app"
            --get location after /api/v0.1/todos
            local sub_loc = string.sub(ngx.var.request_uri, string.len(ngx.var.location)+1)
            if sub_loc == "" then sub_loc = "/" end
            local router = require "router"
            local r = router.new()
            r:get("/", todo_api.getAll)
            r:post("/", todo_api.create)
            r:delete("/:id", todo_api.delete)
            r:put("/:id", todo_api.update)
            --execute routes
            r:execute(ngx.var.request_method, sub_loc, ngx.req.get_uri_args())
          }
●         }
https://github.com/lduboeuf/openresty-todo-app
Lua & co - @LDuboeuf - Novembre 2016
Openresty - outils
● Profilage en temps réel 
● Test suite
● Gestionnaire de package (OPM)
● Mailing list
Lua & co - @LDuboeuf - Novembre 2016
Openresty : encore plus
● Lapis (  http://leafo.net/lapis/ ) = openresty + 
libs utils + templating html + sessions
● Sailor ( http://sailorproject.org/ ) = MVC, routing, 
 templating, model generator, etc.
Lua & co - @LDuboeuf - Novembre 2016
Bonus !
Lua & co - @LDuboeuf - Novembre 2016
Protocole agnostique : Luvit
● Créé par Tim Caswell (@creationix) , un des premier contributeur 
de NodeJs.
● En production chez Rackspace pour leurs agents de monitoring.
● Initialement l’idée était de porter Node en Lua avec des api 
similaires : Gain en mémoire de 20x !
● Repose comme Node sur la lib LibUV : event loop,  E/S 
Asynchrone , ...
● Intègre la librairie OpenSSL, zlib.
● Objectif : pouvoir créer des applications auto-executables, 
rapides, légères.
Lua & co - @LDuboeuf - Novembre 2016
Luvit
● On peut créer une appli « node-style » ( basée sur 
des callbacks ) ou séquentielle ( mais non bloquante 
grâce aux co-routines ).
● Gestionnaire de package, repository et 
compilateur : lit ( créé avec Luvit… )
– Exemple : compiler une appli et l’executer
git clone git@github.com:creationix/hexes.git
cd hexes
lit install
lit make
./hexes
Lua & co - @LDuboeuf - Novembre 2016
Luvit : exemple
https://github.com/creationix/hexes
Lua & co - @LDuboeuf - Novembre 2016
Luvit
● Cool si :
– Pas peur de la doc sporadique
– Prêt à coder son connecteur ;-) ( pour l’instant 
existe un wrapper pour Prostgresql, Redis ).
– Mettre la main dans le cambouis
● Communauté limitée mais très réactive et 
sympa ;-) :freenode IRC  #luvit , et mailing list 
Lua & co - @LDuboeuf - Novembre 2016
Bah voilà , Merci !

Contenu connexe

Tendances

PHP Composer : Pourquoi ? Comment ? Et plus ...
PHP Composer : Pourquoi ? Comment ? Et plus ...PHP Composer : Pourquoi ? Comment ? Et plus ...
PHP Composer : Pourquoi ? Comment ? Et plus ...Romain Cambien
 
AFUP Aix/Marseille - 16 mai 2017 - Open API
AFUP Aix/Marseille - 16 mai 2017 - Open APIAFUP Aix/Marseille - 16 mai 2017 - Open API
AFUP Aix/Marseille - 16 mai 2017 - Open APIRomain Cambien
 
Cloud foundry intro with groovy
Cloud foundry intro with groovyCloud foundry intro with groovy
Cloud foundry intro with groovyGuillaume Laforge
 
GPars et PrettyTime - Paris JUG 2011 - Guillaume Laforge
GPars et PrettyTime - Paris JUG 2011 - Guillaume LaforgeGPars et PrettyTime - Paris JUG 2011 - Guillaume Laforge
GPars et PrettyTime - Paris JUG 2011 - Guillaume LaforgeGuillaume Laforge
 
technologie web - part3
technologie web - part3technologie web - part3
technologie web - part3Benoît Simard
 
Retour d'expérience : Mise en place de l'ENT v4 à l'UPMC
Retour d'expérience : Mise en place de l'ENT v4 à l'UPMCRetour d'expérience : Mise en place de l'ENT v4 à l'UPMC
Retour d'expérience : Mise en place de l'ENT v4 à l'UPMCLudovic A
 
2014.12.11 - TECH CONF #3 - Présentation Node.js
2014.12.11 - TECH CONF #3 - Présentation Node.js2014.12.11 - TECH CONF #3 - Présentation Node.js
2014.12.11 - TECH CONF #3 - Présentation Node.jsTelecomValley
 
Réu technodejs
Réu technodejsRéu technodejs
Réu technodejsnaholyr
 

Tendances (11)

Introduction à Node.js
Introduction à Node.js Introduction à Node.js
Introduction à Node.js
 
PHP Composer : Pourquoi ? Comment ? Et plus ...
PHP Composer : Pourquoi ? Comment ? Et plus ...PHP Composer : Pourquoi ? Comment ? Et plus ...
PHP Composer : Pourquoi ? Comment ? Et plus ...
 
AFUP Aix/Marseille - 16 mai 2017 - Open API
AFUP Aix/Marseille - 16 mai 2017 - Open APIAFUP Aix/Marseille - 16 mai 2017 - Open API
AFUP Aix/Marseille - 16 mai 2017 - Open API
 
Cloud foundry intro with groovy
Cloud foundry intro with groovyCloud foundry intro with groovy
Cloud foundry intro with groovy
 
GPars et PrettyTime - Paris JUG 2011 - Guillaume Laforge
GPars et PrettyTime - Paris JUG 2011 - Guillaume LaforgeGPars et PrettyTime - Paris JUG 2011 - Guillaume Laforge
GPars et PrettyTime - Paris JUG 2011 - Guillaume Laforge
 
technologie web - part3
technologie web - part3technologie web - part3
technologie web - part3
 
SdE 9 - Threads
SdE 9 - ThreadsSdE 9 - Threads
SdE 9 - Threads
 
Retour d'expérience : Mise en place de l'ENT v4 à l'UPMC
Retour d'expérience : Mise en place de l'ENT v4 à l'UPMCRetour d'expérience : Mise en place de l'ENT v4 à l'UPMC
Retour d'expérience : Mise en place de l'ENT v4 à l'UPMC
 
2014.12.11 - TECH CONF #3 - Présentation Node.js
2014.12.11 - TECH CONF #3 - Présentation Node.js2014.12.11 - TECH CONF #3 - Présentation Node.js
2014.12.11 - TECH CONF #3 - Présentation Node.js
 
201505 monitoring
201505 monitoring201505 monitoring
201505 monitoring
 
Réu technodejs
Réu technodejsRéu technodejs
Réu technodejs
 

En vedette

Introduction to Lua Luajit Openresty Luvit
Introduction to Lua Luajit Openresty LuvitIntroduction to Lua Luajit Openresty Luvit
Introduction to Lua Luajit Openresty LuvitLionel Duboeuf
 
Web development with Lua @ Bulgaria Web Summit 2016
Web development with Lua @ Bulgaria Web Summit 2016Web development with Lua @ Bulgaria Web Summit 2016
Web development with Lua @ Bulgaria Web Summit 2016Etiene Dalcol
 
La réponse de la liste Surgères Demain menée par Catherine DESPREZ à Surgères...
La réponse de la liste Surgères Demain menée par Catherine DESPREZ à Surgères...La réponse de la liste Surgères Demain menée par Catherine DESPREZ à Surgères...
La réponse de la liste Surgères Demain menée par Catherine DESPREZ à Surgères...Sylvain Perso
 
Facteurs orientation
Facteurs orientationFacteurs orientation
Facteurs orientationclodo38
 
Social Media Training
Social Media TrainingSocial Media Training
Social Media TrainingOlgaNazarko
 
Nuevo documento de microsoft office word danny ville[1]
Nuevo documento de microsoft office word danny ville[1]Nuevo documento de microsoft office word danny ville[1]
Nuevo documento de microsoft office word danny ville[1]jpvg
 
Presentation envilogue ppif %281%29
Presentation envilogue ppif %281%29Presentation envilogue ppif %281%29
Presentation envilogue ppif %281%29Arthur SYROTNIK
 
Géoguichet cimetière - 5 - Les thématiques d’affichage dans le géoguichet
Géoguichet cimetière - 5 - Les thématiques d’affichage dans le géoguichetGéoguichet cimetière - 5 - Les thématiques d’affichage dans le géoguichet
Géoguichet cimetière - 5 - Les thématiques d’affichage dans le géoguichetgimwebgis
 
Material educativo para tecnologías en la educacion
Material educativo para tecnologías en la educacionMaterial educativo para tecnologías en la educacion
Material educativo para tecnologías en la educacionELVIA
 
Séminaire GRANIT - Introduction du cycle "Internet comme terrain"
Séminaire GRANIT - Introduction du cycle "Internet comme terrain"Séminaire GRANIT - Introduction du cycle "Internet comme terrain"
Séminaire GRANIT - Introduction du cycle "Internet comme terrain"geo_in_geo
 
Comment OAuth autorise ces applications à accéder à nos données privées ?
Comment OAuth autorise ces applications à accéder à nos données privées ?Comment OAuth autorise ces applications à accéder à nos données privées ?
Comment OAuth autorise ces applications à accéder à nos données privées ?Fabien Vauchelles
 

En vedette (20)

Introduction to Lua Luajit Openresty Luvit
Introduction to Lua Luajit Openresty LuvitIntroduction to Lua Luajit Openresty Luvit
Introduction to Lua Luajit Openresty Luvit
 
Web development with Lua @ Bulgaria Web Summit 2016
Web development with Lua @ Bulgaria Web Summit 2016Web development with Lua @ Bulgaria Web Summit 2016
Web development with Lua @ Bulgaria Web Summit 2016
 
La réponse de la liste Surgères Demain menée par Catherine DESPREZ à Surgères...
La réponse de la liste Surgères Demain menée par Catherine DESPREZ à Surgères...La réponse de la liste Surgères Demain menée par Catherine DESPREZ à Surgères...
La réponse de la liste Surgères Demain menée par Catherine DESPREZ à Surgères...
 
El hombre jsk
El hombre jskEl hombre jsk
El hombre jsk
 
Electro waste
Electro wasteElectro waste
Electro waste
 
Facteurs orientation
Facteurs orientationFacteurs orientation
Facteurs orientation
 
Rail 135d
Rail 135dRail 135d
Rail 135d
 
Como manejar nuestros estados emocionales
Como manejar nuestros estados emocionalesComo manejar nuestros estados emocionales
Como manejar nuestros estados emocionales
 
D° INTERNACIONAL PRIVADO
D° INTERNACIONAL PRIVADOD° INTERNACIONAL PRIVADO
D° INTERNACIONAL PRIVADO
 
Social Media Training
Social Media TrainingSocial Media Training
Social Media Training
 
Léame de photoshop cs4
Léame de photoshop cs4Léame de photoshop cs4
Léame de photoshop cs4
 
07. reinventar el periodismo
07. reinventar el periodismo07. reinventar el periodismo
07. reinventar el periodismo
 
Nuevo documento de microsoft office word danny ville[1]
Nuevo documento de microsoft office word danny ville[1]Nuevo documento de microsoft office word danny ville[1]
Nuevo documento de microsoft office word danny ville[1]
 
Presentation envilogue ppif %281%29
Presentation envilogue ppif %281%29Presentation envilogue ppif %281%29
Presentation envilogue ppif %281%29
 
Webinar ATN+ - Les services à la personne par Sykio et Lomaco
Webinar ATN+ - Les services à la personne par Sykio et Lomaco Webinar ATN+ - Les services à la personne par Sykio et Lomaco
Webinar ATN+ - Les services à la personne par Sykio et Lomaco
 
Géoguichet cimetière - 5 - Les thématiques d’affichage dans le géoguichet
Géoguichet cimetière - 5 - Les thématiques d’affichage dans le géoguichetGéoguichet cimetière - 5 - Les thématiques d’affichage dans le géoguichet
Géoguichet cimetière - 5 - Les thématiques d’affichage dans le géoguichet
 
Material educativo para tecnologías en la educacion
Material educativo para tecnologías en la educacionMaterial educativo para tecnologías en la educacion
Material educativo para tecnologías en la educacion
 
C 485 de 2000
C 485 de 2000C 485 de 2000
C 485 de 2000
 
Séminaire GRANIT - Introduction du cycle "Internet comme terrain"
Séminaire GRANIT - Introduction du cycle "Internet comme terrain"Séminaire GRANIT - Introduction du cycle "Internet comme terrain"
Séminaire GRANIT - Introduction du cycle "Internet comme terrain"
 
Comment OAuth autorise ces applications à accéder à nos données privées ?
Comment OAuth autorise ces applications à accéder à nos données privées ?Comment OAuth autorise ces applications à accéder à nos données privées ?
Comment OAuth autorise ces applications à accéder à nos données privées ?
 

Similaire à Presentation du language Lua, Luajit, Openresty Luvit

Responsible Design ou Le web moderne à destination de tous
Responsible Design ou Le web moderne à destination de tousResponsible Design ou Le web moderne à destination de tous
Responsible Design ou Le web moderne à destination de tousjwajsberg
 
Etat de l'art des systèmes embarqués, utilisation du logiciel libre
Etat de l'art des systèmes embarqués, utilisation du logiciel libreEtat de l'art des systèmes embarqués, utilisation du logiciel libre
Etat de l'art des systèmes embarqués, utilisation du logiciel librePierre Ficheux
 
NFS, MPI, Programmation Sérial & Parallèle avec Condor Scénarios et Simulatio...
NFS, MPI, Programmation Sérial & Parallèle avec Condor Scénarios et Simulatio...NFS, MPI, Programmation Sérial & Parallèle avec Condor Scénarios et Simulatio...
NFS, MPI, Programmation Sérial & Parallèle avec Condor Scénarios et Simulatio...Ayoub Rouzi
 
Enib cours c.a.i. web - séance #5 : scala play! framework
Enib   cours c.a.i. web - séance #5 : scala play! frameworkEnib   cours c.a.i. web - séance #5 : scala play! framework
Enib cours c.a.i. web - séance #5 : scala play! frameworkHoracio Gonzalez
 
OpenShift en production - Akram Ben Assi & Eloïse Faure
OpenShift en production - Akram Ben Assi & Eloïse FaureOpenShift en production - Akram Ben Assi & Eloïse Faure
OpenShift en production - Akram Ben Assi & Eloïse FaureParis Container Day
 
Tester et configurer vos profils avec les containers
Tester et configurer vos profils avec les containersTester et configurer vos profils avec les containers
Tester et configurer vos profils avec les containersChristophe Villeneuve
 
Préprocesseurs CSS et remote editing : Quelles solutions ? - Human talks Laval
Préprocesseurs CSS et remote editing : Quelles solutions ? - Human talks Laval Préprocesseurs CSS et remote editing : Quelles solutions ? - Human talks Laval
Préprocesseurs CSS et remote editing : Quelles solutions ? - Human talks Laval Romain Sauger
 
Oxalide Workshop #4 - Docker, des tours dans le petit bassin
Oxalide Workshop #4 - Docker, des tours dans le petit bassinOxalide Workshop #4 - Docker, des tours dans le petit bassin
Oxalide Workshop #4 - Docker, des tours dans le petit bassinLudovic Piot
 
Oxalide Workshop #4 - Docker, des tours dans le petit bassin
Oxalide Workshop #4 - Docker, des tours dans le petit bassinOxalide Workshop #4 - Docker, des tours dans le petit bassin
Oxalide Workshop #4 - Docker, des tours dans le petit bassinOxalide
 
Apache solr andré bois-crettez 08
Apache solr   andré bois-crettez 08Apache solr   andré bois-crettez 08
Apache solr andré bois-crettez 08Loïc Descotte
 
Autour de Node.js - TechConf#3
Autour de Node.js - TechConf#3Autour de Node.js - TechConf#3
Autour de Node.js - TechConf#3Luc Juggery
 
Pyconfr2018 deploy des application python dans un cluster open shift
Pyconfr2018 deploy des application python dans un cluster open shiftPyconfr2018 deploy des application python dans un cluster open shift
Pyconfr2018 deploy des application python dans un cluster open shiftArthur Lutz
 
Meetup Drupal Lyon 2016 - Environnements de dév Drupal automatisés LXC et Ans...
Meetup Drupal Lyon 2016 - Environnements de dév Drupal automatisés LXC et Ans...Meetup Drupal Lyon 2016 - Environnements de dév Drupal automatisés LXC et Ans...
Meetup Drupal Lyon 2016 - Environnements de dév Drupal automatisés LXC et Ans...Aurelien Navarre
 
Enib cours c.a.i. web - séance #6 : introduction à node js
Enib   cours c.a.i. web - séance #6 : introduction à node jsEnib   cours c.a.i. web - séance #6 : introduction à node js
Enib cours c.a.i. web - séance #6 : introduction à node jsHoracio Gonzalez
 
Node.js et les nouvelles technologies javascript
Node.js et les nouvelles technologies javascriptNode.js et les nouvelles technologies javascript
Node.js et les nouvelles technologies javascriptKhalid Jebbari
 

Similaire à Presentation du language Lua, Luajit, Openresty Luvit (20)

Infrastructure as code drupal
Infrastructure as code drupalInfrastructure as code drupal
Infrastructure as code drupal
 
Responsible Design ou Le web moderne à destination de tous
Responsible Design ou Le web moderne à destination de tousResponsible Design ou Le web moderne à destination de tous
Responsible Design ou Le web moderne à destination de tous
 
Etat de l'art des systèmes embarqués, utilisation du logiciel libre
Etat de l'art des systèmes embarqués, utilisation du logiciel libreEtat de l'art des systèmes embarqués, utilisation du logiciel libre
Etat de l'art des systèmes embarqués, utilisation du logiciel libre
 
NFS, MPI, Programmation Sérial & Parallèle avec Condor Scénarios et Simulatio...
NFS, MPI, Programmation Sérial & Parallèle avec Condor Scénarios et Simulatio...NFS, MPI, Programmation Sérial & Parallèle avec Condor Scénarios et Simulatio...
NFS, MPI, Programmation Sérial & Parallèle avec Condor Scénarios et Simulatio...
 
Ocs
OcsOcs
Ocs
 
Enib cours c.a.i. web - séance #5 : scala play! framework
Enib   cours c.a.i. web - séance #5 : scala play! frameworkEnib   cours c.a.i. web - séance #5 : scala play! framework
Enib cours c.a.i. web - séance #5 : scala play! framework
 
OpenShift en production - Akram Ben Assi & Eloïse Faure
OpenShift en production - Akram Ben Assi & Eloïse FaureOpenShift en production - Akram Ben Assi & Eloïse Faure
OpenShift en production - Akram Ben Assi & Eloïse Faure
 
Tester et configurer vos profils avec les containers
Tester et configurer vos profils avec les containersTester et configurer vos profils avec les containers
Tester et configurer vos profils avec les containers
 
Préprocesseurs CSS et remote editing : Quelles solutions ? - Human talks Laval
Préprocesseurs CSS et remote editing : Quelles solutions ? - Human talks Laval Préprocesseurs CSS et remote editing : Quelles solutions ? - Human talks Laval
Préprocesseurs CSS et remote editing : Quelles solutions ? - Human talks Laval
 
Oxalide Workshop #4 - Docker, des tours dans le petit bassin
Oxalide Workshop #4 - Docker, des tours dans le petit bassinOxalide Workshop #4 - Docker, des tours dans le petit bassin
Oxalide Workshop #4 - Docker, des tours dans le petit bassin
 
Oxalide Workshop #4 - Docker, des tours dans le petit bassin
Oxalide Workshop #4 - Docker, des tours dans le petit bassinOxalide Workshop #4 - Docker, des tours dans le petit bassin
Oxalide Workshop #4 - Docker, des tours dans le petit bassin
 
Apache solr andré bois-crettez 08
Apache solr   andré bois-crettez 08Apache solr   andré bois-crettez 08
Apache solr andré bois-crettez 08
 
Autour de Node.js - TechConf#3
Autour de Node.js - TechConf#3Autour de Node.js - TechConf#3
Autour de Node.js - TechConf#3
 
Pyconfr2018 deploy des application python dans un cluster open shift
Pyconfr2018 deploy des application python dans un cluster open shiftPyconfr2018 deploy des application python dans un cluster open shift
Pyconfr2018 deploy des application python dans un cluster open shift
 
Meetup Drupal Lyon 2016 - Environnements de dév Drupal automatisés LXC et Ans...
Meetup Drupal Lyon 2016 - Environnements de dév Drupal automatisés LXC et Ans...Meetup Drupal Lyon 2016 - Environnements de dév Drupal automatisés LXC et Ans...
Meetup Drupal Lyon 2016 - Environnements de dév Drupal automatisés LXC et Ans...
 
sshGate
sshGatesshGate
sshGate
 
Enib cours c.a.i. web - séance #6 : introduction à node js
Enib   cours c.a.i. web - séance #6 : introduction à node jsEnib   cours c.a.i. web - séance #6 : introduction à node js
Enib cours c.a.i. web - séance #6 : introduction à node js
 
12-Factor
12-Factor12-Factor
12-Factor
 
Node.js et les nouvelles technologies javascript
Node.js et les nouvelles technologies javascriptNode.js et les nouvelles technologies javascript
Node.js et les nouvelles technologies javascript
 
Cours1
Cours1Cours1
Cours1
 

Presentation du language Lua, Luajit, Openresty Luvit

  • 1. Lua & co - @LDuboeuf - Novembre 2016 Lua & co
  • 2. Lua & co - @LDuboeuf - Novembre 2016 Plan ● A propos de moi ● Intro à Lua ● Utilisé où, pour faire quoi ? ● Quelques notions ● Luajit / luajit ffi ● Lua pour le web : Openresty
  • 3. Lua & co - @LDuboeuf - Novembre 2016 A propos de moi du dev , de l'admin sys & réseaux Et Depuis 2012 Formateur @ Afpa
  • 4. Lua & co - @LDuboeuf - Novembre 2016 Introduction a Lua ● Créé en 1993 par Roberto Lerusalimschy, Waldemar Celes, Luiz Henrique de Figueiredo – au Bresil ● Langage de script rapide, léger ( 24000 loc écrit en ANSI C ), facilement intégrable. ● Multi-paradigme : procédural, OO, fonctionnel ● Tourne sur toutes les distributions Unix et Windows, smartphones (Android, iOS, Symbian, Windows Phone), sur processeurs embarqués ( ARM, Rabbit), IBM mainframes, etc. ● C<->Lua bindings ● Licence MIT
  • 5. Lua & co - @LDuboeuf - Novembre 2016 Utilisé où ? redis Utilisé comme : ● Extension ● Monitoring ● Scripting (DSL) ● Proxy – Load balancing ● Gestion des caches ● Web Application Firewall ● Robotique ● Game play ● Etc...
  • 6. Lua & co - @LDuboeuf - Novembre 2016 Notions
  • 7. Lua & co - @LDuboeuf - Novembre 2016 Notions suite...
  • 8. Lua & co - @LDuboeuf - Novembre 2016 Notions suite... ● Concept de Metatable – Permet de changer le comportement des tables ● Surcharge des opérateurs « +, -, /, * » (exemple Tbl1 + tbl2 ) ● Comparaisons ● Héritage, interface (OOP) – Permet d’intercepter les événements liés à la table : ● accès à la table, ● l’ajout de nouvelles entrées, ● la concaténation ● etc...
  • 9. Lua & co - @LDuboeuf - Novembre 2016 Notions suite… OOP
  • 10. Lua & co - @LDuboeuf - Novembre 2016 Notions fin ● Multithreading : les coroutines : – pas multithread au sens OS, non pré-emptif. Permet les opérations non bloquantes sur l'I/O. ● Bizarreries : – Indice des tableaux commence par 1 ! – Différent de 1 => if (i~=1) then … end – Pas d'opérateur ternaire ( x>3 ? 1 : 0; ) – Pas de raccourci pour l'incrément ( pas de i++ ni i+= ) ● => i = i + 1 –
  • 11. Lua & co - @LDuboeuf - Novembre 2016 Luajit ● Compilateur JIT pour lua ● Super rapide ! : 3 a 100x ● Et petit : < 100 KB ● Integration facilitée avec les librairies natives C : => ffi (foreign function include)
  • 12. Lua & co - @LDuboeuf - Novembre 2016 Luajit : ffi - exemple
  • 13. Lua & co - @LDuboeuf - Novembre 2016 Outils & support ● Outils : – Gestionnaire de paquet : Luarocks – Tests unitaires : « busted » ou « luaunit » et d’autres… – Debugger :IDE ZeroBrane Studio ● Supports – Mailing list – irc.freenode.net #lua – Workshops
  • 14. Lua & co - @LDuboeuf - Novembre 2016 Lua pour le web ● Pléthore de solutions, – du 100 % Lua : ● Xavante, Pegasus – Extension de serveur existant : ● LightHttpd, Apache, Nginx, Tornado... – NodeJs like : ● Luvit
  • 15. Lua & co - @LDuboeuf - Novembre 2016 Openresty Openresty = Nginx + Luajit + Modules
  • 16. Lua & co - @LDuboeuf - Novembre 2016 Nginx ● HTTP server, reverse proxy, proxy mail ● Modèle asynchrone ● Empreinte mémoire faible ● Modulaire ● Extensible avec des modules écrit en C
  • 17. Lua & co - @LDuboeuf - Novembre 2016 Nginx modèle Source : http://www.aosabook.org/en/nginx.html
  • 18. Lua & co - @LDuboeuf - Novembre 2016 Nginx – serveur min. worker_processes 1; error_log logs/error.log; events { worker_connections 1024; } http { server { listen 8000; location / { index index.html; root public/; } } $> curl http://0.0.0.0:8000/index.html
  • 19. Lua & co - @LDuboeuf - Novembre 2016 Openresty ● Créé et maintenu principalement par Yichun Zhang (@agentzh) .( Taobao.com puis Clouflare ) ● En production sur des sites à fort trafic (Alibaba group, Clouflare) ● Modules I/O non bloquants pour : ● Memcached ● Redis ● MySQL / Drizzle ● PostgreSQL ● Websockets, CLI, Json, etc..
  • 20. Lua & co - @LDuboeuf - Novembre 2016 Openresty ● Directives pour executer du code Lua durant les phases Nginx – Init phase – Rewrite phase. – Access phase. – Content phase. – Log phase – Et d’autres… ● API Lua pour accéder à l’environnement Nginx
  • 21. Lua & co - @LDuboeuf - Novembre 2016 Openresty ● Le code Lua est exécuté directement au sein des workers
  • 22. Lua & co - @LDuboeuf - Novembre 2016 Openresty – Hello world location /hellolua { default_type 'text/plain'; content_by_lua_block { local name = ngx.var.arg_name or "Anonymous" ngx.say("Hello, ", name, "!") }; } $> curl http://localhost/hellolua?name=Lua Hello, Lua
  • 23. Lua & co - @LDuboeuf - Novembre 2016 Openresty : Chargement module externe location /xxxx { rewrite_by_lua_file /path/to/rewrite.lua; access_by_lua_file /path/to/access.lua; content_by_lua_file /path/to/content.lua; } ● Les modules sont chargés qu’une seule fois par worker à la première requête
  • 24. Lua & co - @LDuboeuf - Novembre 2016 Openresty -sous requête location / { content_by_lua ' local res = ngx.location.capture("/memcached", { args = { cmd = "incr", key = ngx.var.uri } } ) '; } location /memcached { set $memc_cmd $arg_cmd; set $memc_key $arg_key; memc_pass 127.0.0.1:11211; }
  • 25. Lua & co - @LDuboeuf - Novembre 2016 Openresty – cosocket ● Connection E/S non bloquante avec la librairie Cosocket : – TCP ou Unix Domain sockets – Permet une écriture séquentiel du code tout en s’assurant que l’exécution soit asynchrone ! ( voir la joie des callbacks ;-)) – Mécanisme « Keepalive » pour la réutilisation des connections.
  • 26. Lua & co - @LDuboeuf - Novembre 2016 Openresty : client TCP location /memcached { content_by_lua_block {' local sock = ngx.socket.connect("127.0.0.1", 11211) sock:send("SET foo bar 3600rn") local line = sock:receive() if line then ngx.say(line) end sock:setkeepalive() }; } $> curl http://localhost/memcached STORED
  • 27. Lua & co - @LDuboeuf - Novembre 2016 Openresty : mysql location /todos { content_by_lua_block { local mysql = require "resty.mysql" local db, err = mysql:new() if not db then ngx.say("failed to instantiate mysql: ", err) return end db:set_timeout(1000) -- 1 sec --connect… local res, err, errcode, sqlstate = db:query("select * from tasks") if not res then ngx.say("bad result: ", err, ": ", errcode, ": ", sqlstate, ".") return end local cjson = require "cjson" ngx.say("result: ", cjson.encode(res)) } ; }
  • 28. Lua & co - @LDuboeuf - Novembre 2016 Openresty : mini app location /api/v0.1/todos {           default_type application/json;                      content_by_lua_block {             local todo_api = require "todo-app"             --get location after /api/v0.1/todos             local sub_loc = string.sub(ngx.var.request_uri, string.len(ngx.var.location)+1)             if sub_loc == "" then sub_loc = "/" end             local router = require "router"             local r = router.new()             r:get("/", todo_api.getAll)             r:post("/", todo_api.create)             r:delete("/:id", todo_api.delete)             r:put("/:id", todo_api.update)             --execute routes             r:execute(ngx.var.request_method, sub_loc, ngx.req.get_uri_args())           } ●         } https://github.com/lduboeuf/openresty-todo-app
  • 29. Lua & co - @LDuboeuf - Novembre 2016 Openresty - outils ● Profilage en temps réel  ● Test suite ● Gestionnaire de package (OPM) ● Mailing list
  • 30. Lua & co - @LDuboeuf - Novembre 2016 Openresty : encore plus ● Lapis (  http://leafo.net/lapis/ ) = openresty +  libs utils + templating html + sessions ● Sailor ( http://sailorproject.org/ ) = MVC, routing,   templating, model generator, etc.
  • 31. Lua & co - @LDuboeuf - Novembre 2016 Bonus !
  • 32. Lua & co - @LDuboeuf - Novembre 2016 Protocole agnostique : Luvit ● Créé par Tim Caswell (@creationix) , un des premier contributeur  de NodeJs. ● En production chez Rackspace pour leurs agents de monitoring. ● Initialement l’idée était de porter Node en Lua avec des api  similaires : Gain en mémoire de 20x ! ● Repose comme Node sur la lib LibUV : event loop,  E/S  Asynchrone , ... ● Intègre la librairie OpenSSL, zlib. ● Objectif : pouvoir créer des applications auto-executables,  rapides, légères.
  • 33. Lua & co - @LDuboeuf - Novembre 2016 Luvit ● On peut créer une appli « node-style » ( basée sur  des callbacks ) ou séquentielle ( mais non bloquante  grâce aux co-routines ). ● Gestionnaire de package, repository et  compilateur : lit ( créé avec Luvit… ) – Exemple : compiler une appli et l’executer git clone git@github.com:creationix/hexes.git cd hexes lit install lit make ./hexes
  • 34. Lua & co - @LDuboeuf - Novembre 2016 Luvit : exemple https://github.com/creationix/hexes
  • 35. Lua & co - @LDuboeuf - Novembre 2016 Luvit ● Cool si : – Pas peur de la doc sporadique – Prêt à coder son connecteur ;-) ( pour l’instant  existe un wrapper pour Prostgresql, Redis ). – Mettre la main dans le cambouis ● Communauté limitée mais très réactive et  sympa ;-) :freenode IRC  #luvit , et mailing list 
  • 36. Lua & co - @LDuboeuf - Novembre 2016 Bah voilà , Merci !