web development with lua @ bulgaria web summit 2016

Post on 16-Jan-2017

694 Views

Category:

Software

1 Downloads

Preview:

Click to see full reader

TRANSCRIPT

Web development with Lua Programming Language

Introducing Sailor, an MVC web framework in Lua

Etiene Dalcol @etiene_d

@etiene_dBulgaria Web Summit 2016

@etiene_d

@etiene_dBulgaria Web Summit 2016

Sailor!sailorproject.org

@etiene_dBulgaria Web Summit 2016

Google Summer of Code

LabLua

@etiene_dBulgaria Web Summit 2016

Lua Ladieslualadies.org

@etiene_dBulgaria Web Summit 2016

Lua Space

lua.space

@space_lua

@etiene_dBulgaria Web Summit 2016

Lua overview

The state of web dev

Sailor

@etiene_dBulgaria Web Summit 2016

@etiene_dBulgaria Web Summit 2016

• Script Language • Duck-typed • Multi-paradigm

• procedural, OO, functional,data-description

• Garbage collection • Coroutines • First-class functions • Lexical scoping • Proper tail calls • MIT License

What is Lua?

@etiene_dBulgaria Web Summit 2016

Advantages

Powerful.

@etiene_dBulgaria Web Summit 2016

Why Lua?Size

(docs included)

First-class functions+

Lexical scoping +

Metatables

Native C API

276 Kb

Object Orientation

Ada, Fortran, Java, Smalltalk, C#, Perl,

Ruby etc.+

@etiene_dBulgaria Web Summit 2016

Advantages

Simple.Powerful.

@etiene_dBulgaria Web Summit 2016

_G _VERSION assert collectgarbage dofile error getmetatable ipairs load loadfile next pairs pcall print rawequal rawget rawlen rawset require select setmetatable tonumber tostring type xpcall bit32.arshift bit32.band bit32.bnot bit32.bor bit32.btest bit32.bxor bit32.extract bit32.lrotate bit32.lshift bit32.replace bit32.rrotate bit32.rshift

coroutine.create coroutine.resume coroutine.running coroutine.status coroutine.wrap coroutine.yield debug.debug debug.getuservalue debug.gethook debug.getinfo debug.getlocal debug.getmetatable debug.getregistry debug.getupvalue debug.setuservalue debug.sethook debug.setlocal debug.setmetatable debug.setupvalue debug.traceback debug.upvalueid debug.upvaluejoin io.close io.flush io.input io.lines io.open io.output io.popen io.read io.stderr io.stdin io.stdout io.tmpfile io.type io.write

file:close file:flush file:lines file:read file:seek file:setvbuf file:write math.abs math.acos math.asin math.atan math.atan2 math.ceil math.cos math.cosh math.deg math.exp math.floor math.fmod math.frexp math.huge math.ldexp math.log math.max math.min math.modf math.pi math.pow math.rad math.random math.randomseed math.sin math.sinh math.sqrt math.tan math.tanh

os.clock os.date os.difftime os.execute os.exit os.getenv os.remove os.rename os.setlocale os.time os.tmpname package package.config package.cpath package.loaded package.loadlib package.path package.preload package.searchers package.searchpath string.byte string.char string.dump string.find string.format string.gmatch string.gsub string.len string.lower string.match string.rep string.reverse string.sub string.upper table.concat table.insert table.pack table.remove table.sort table.unpack

@etiene_dBulgaria Web Summit 2016

@etiene_dBulgaria Web Summit 2016

"Since Lua itself is so simple, it tends to

encourage you to solve problems simply."

Ragnar Svensson - Lead Developer at King (Lua Workshop Oct 15 2015)

@etiene_dBulgaria Web Summit 2016

Advantages

Fast.Simple.Powerful.

@etiene_dBulgaria Web Summit 2016

http://www.humbedooh.com/presentations/ACNA%20-%20mod_lua.odp Introducing mod_lua by Daniel Gruno

@etiene_dBulgaria Web Summit 2016

Better Reasons

• It looks cool (I heard you could make games with it)

My

@etiene_dBulgaria Web Summit 2016

Better Reasons

• It looks cool (I heard you could make games with it)

@etiene_dBulgaria Web Summit 2016

Better Reasons

• It looks cool (I heard you could make games with it)

• It’s made in my home country (In my university to be more precise)

@etiene_dBulgaria Web Summit 2016

• It looks cool (I heard you could make games with it)

• It’s made in my home country (In my university to be more precise)

• It’s easy to learn

Better Reasons

@etiene_dBulgaria Web Summit 2016

-- Cipher module

--[[ Based on algorithms/caesar_cipher.lua

by Roland Yonaba ]]

local cipher = {}

local function ascii_base(s)

return s:lower() == s and ('a'):byte() or ('A'):byte()

end

function cipher.caesar( str, key )

return str:gsub('%a', function(s)

local base = ascii_base(s)

return string.char(((s:byte() - base + key) % 26) + base)

end)

end

return cipher

One slide crash course: cipher module

@etiene_dBulgaria Web Summit 2016

-- Cipher module

--[[ Based on algorithms/caesar_cipher.lua

by Roland Yonaba ]]

local cipher = {}

local function ascii_base(s)

return s:lower() == s and ('a'):byte() or ('A'):byte()

end

function cipher.caesar( str, key )

return str:gsub('%a', function(s)

local base = ascii_base(s)

return string.char(((s:byte() - base + key) % 26) + base)

end)

end

return cipher

One slide crash course: cipher module

@etiene_dBulgaria Web Summit 2016

-- Cipher module

--[[ Based on algorithms/caesar_cipher.lua

by Roland Yonaba ]]

local cipher = {}

local function ascii_base(s)

return s:lower() == s and ('a'):byte() or ('A'):byte()

end

function cipher.caesar( str, key )

return str:gsub('%a', function(s)

local base = ascii_base(s)

return string.char(((s:byte() - base + key) % 26) + base)

end)

end

return cipher

One slide crash course: cipher module

private

public

@etiene_dBulgaria Web Summit 2016

-- Cipher module

--[[ Based on algorithms/caesar_cipher.lua

by Roland Yonaba ]]

local cipher = {}

local function ascii_base(s)

return s:lower() == s and ('a'):byte() or ('A'):byte()

end

function cipher.caesar( str, key )

return str:gsub('%a', function(s)

local base = ascii_base(s)

return string.char(((s:byte() - base + key) % 26) + base)

end)

end

return cipher

One slide crash course: cipher module

@etiene_dBulgaria Web Summit 2016

-- Cipher module

--[[ Based on algorithms/caesar_cipher.lua

by Roland Yonaba ]]

local cipher = {}

local function ascii_base(s)

return s:lower() == s and ('a'):byte() or ('A'):byte()

end

function cipher.caesar( str, key )

return str:gsub('%a', function(s)

local base = ascii_base(s)

return string.char(((s:byte() - base + key) % 26) + base)

end)

end

return cipher

One slide crash course: cipher module

@etiene_dBulgaria Web Summit 2016

-- Cipher module

--[[ Based on algorithms/caesar_cipher.lua

by Roland Yonaba ]]

local cipher = {}

local function ascii_base(s)

return s:lower() == s and ('a'):byte() or ('A'):byte()

end

function cipher.caesar( str, key )

return str:gsub('%a', function(s)

local base = ascii_base(s)

return string.char(((s:byte() - base + key) % 26) + base)

end)

end

return cipher

One slide crash course: cipher module

@etiene_dBulgaria Web Summit 2016

-- Cipher module

--[[ Based on algorithms/caesar_cipher.lua

by Roland Yonaba ]]

local cipher = {}

local function ascii_base(s)

return s:lower() == s and ('a'):byte() or ('A'):byte()

end

function cipher.caesar( str, key )

return str:gsub('%a', function(s)

local base = ascii_base(s)

return string.char(((s:byte() - base + key) % 26) + base)

end)

end

return cipher

One slide crash course: cipher module

@etiene_dBulgaria Web Summit 2016

?

?

Learning Lua

?

? ?

@etiene_dBulgaria Web Summit 2016

Lua on the web

• Early stage

• cgilua ~ 1995

• Kepler Project ~ 2003

@etiene_dBulgaria Web Summit 2016

“ I have myself developed Web sites with pure C++, Java, C#, PHP, and Python. The easiest way to go was definitely Python. If the libraries existed, Lua would be not quite as easy to use as Python, but probably quite a bit more efficient; I think it would become my first choice... if the libraries existed.” Michael Gogins

“ Recently there was some discussion about mod_lua on the Apache developers mailing list. I mentioned there that I feel Lua could replace PHP as the number one web scripting language if mod_lua were stable (i.e. not still in beta) and it were implemented well (not making some of PHP's mistakes such as putting everything in the global scope with no consistent naming or parameter schemes). I've wanted to use Lua for all the things I currently use PHP for ever since I discovered it.” Rena

@etiene_dBulgaria Web Summit 2016

@etiene_dBulgaria Web Summit 2016

9423 words

http://eev.ee/blog/2012/04/09/php-a-fractal-of-bad-design/

@etiene_dBulgaria Web Summit 2016

http://w3techs.com/technologies/history_overview/programming_language/ms/y

@etiene_dBulgaria Web Summit 2016

Why?

@etiene_dBulgaria Web Summit 2016

Why?

http://blog.codinghorror.com/php-sucks-but-it-doesnt-matter/

@etiene_dBulgaria Web Summit 2016

@etiene_dBulgaria Web Summit 2016

@etiene_dBulgaria Web Summit 2016

Servers

• Apache: mod_lua

• Nginx: OpenResty

@etiene_dBulgaria Web Summit 2016

Servers

• Apache: mod_lua

• Nginx: OpenResty

@etiene_dBulgaria Web Summit 2016

Servers

• Apache: mod_lua

• Nginx: OpenResty

• Xavante

• Others: Lighttpd, Lwan, Pegasus, Mongoose

@etiene_dBulgaria Web Summit 2016

Frameworks

Orbit (2007) Least known No significant updates since 2010 MVC

@etiene_dBulgaria Web Summit 2016

Frameworks

Orbit (2007) Least known No significant updates since 2010 MVC

Luvit (2011) Most popular Intense development node.js port 2-4x faster Needs a better documentation

@etiene_dBulgaria Web Summit 2016

Frameworks

Lapis (2012) Intense development Moonscript and Lua Very well documented Templater OpenResty only Not MVC

@etiene_dBulgaria Web Summit 2016

Frameworks

Lapis (2012) Intense development Moonscript and Lua Very well documented Templater OpenResty only Not MVC

Others Very early development, complicated, abandoned, poorly documented, license issues or I never heard about it...

lua.space/webdev/the-best-lua-web-frameworks

@etiene_dBulgaria Web Summit 2016

Sailor!sailorproject.org

@etiene_dBulgaria Web Summit 2016

Sailor!

@etiene_dBulgaria Web Summit 2016

Sailor!

0.1 (Venus)

@etiene_dBulgaria Web Summit 2016

Sailor!

0.1 (Venus)

0.2 (Mars)

@etiene_dBulgaria Web Summit 2016

What exactly is Sailor?

• It’s an MVC web framework • Completely written in Lua • Compatible with Apache (mod_lua), Nginx (OpenResty),

Xavante, Mongoose, Lighttpd and Lwan • Compatible with Linux, Windows and Mac • Compatible with different databases • MIT License • Pre alpha v0.5 (Pluto) • Planning next release to be a 1.0!

@etiene_dBulgaria Web Summit 2016

@etiene_dBulgaria Web Summit 2016

What (else) is cool about Sailor?

• Routing and friendly URLs • Session, cookies, include, redirect… • Lua Pages parsing • Mail sending • Simple Object Relational-Mapping • Validation (valua) • Basic login and authentication modules • Form generation • Themes (Bootstrap integration out of the box) • App generator (Linux and Mac only) • Model and CRUD generator • Automated tests

@etiene_dBulgaria Web Summit 2016

• Routing and friendly URLs • Session, cookies, include, redirect… • Lua Pages parsing • Mail sending • Simple Object Relational-Mapping • Validation (valua) • Basic login and authentication modules • Form generation • Themes (Bootstrap integration out of the box) • App generator (Linux and Mac only) • Model and CRUD generator • Automated tests

• Lua at client

What (else) is cool about Sailor?

@etiene_dBulgaria Web Summit 2016

Not so great things

• It’s still in early development • Things are changing fast • It lacks features • Documentation

@etiene_dBulgaria Web Summit 2016

How to get Sailor!

$ luarocks install sailor $ sailor create ‘My App’ /var/www $ cd /var/www/my_app $ lua start-server.lua

@etiene_dBulgaria Web Summit 2016

@etiene_dBulgaria Web Summit 2016

/conf /controllers /models /pub /runtime /tests /themes /views

App structure

@etiene_dBulgaria Web Summit 2016

/conf /controllers /models /pub /runtime /tests /themes /views

App structure

Lua filesStuff!

JS libraries, images…Temp files Lua Pages

@etiene_dBulgaria Web Summit 2016

Example!

-- /controllers/site.lua local site = {} function site.index(page) local msg = “Hello World” page:render(‘index’, { msg = msg } ) end function site.notindex(page) page.theme = nil page:write(“I’m different!”) end return site

@etiene_dBulgaria Web Summit 2016

<!-- /views/site/index.lp —> <p> A message from the server: <?lua page:print(msg) ?> <br/> The message again: <%= msg %> <!-- syntactic sugar: same thing as above —></p>

Example!

@etiene_dBulgaria Web Summit 2016

@etiene_dBulgaria Web Summit 2016

<?lua@server -- Code here runs on the server ?> <?lua -- Same as above ?> <?lua@client -- Runs at the client ?> <?lua@both -- Runs at the server and the client ?> <?lua@both another_msg = “Another message” ?> <?lua page:print(another_msg) ?> <?lua@client window:alert(another_msg) ?>

Example!

@etiene_dBulgaria Web Summit 2016

@etiene_dBulgaria Web Summit 2016

local user = {} local v = require “valua” -- validation module user.attributes = { { id = “safe” }, { name = v:new().not_empty().len(6,50) } } user.db = { key = ‘id’, table = ‘users’ } user.relations = { posts = { -- u.posts relation = “HAS_MANY”, model = “post”, attribute = “author_id” } } return user

Example!

@etiene_dBulgaria Web Summit 2016

local user = {} local v = require “valua” -- validation module user.attributes = { { id = “safe” }, { name = v:new().not_empty().len(6,50) } } user.db = { key = ‘id’, table = ‘users’ } user.relations = { posts = { -- u.posts relation = “HAS_MANY”, model = “post”, attribute = “author_id” } } return user

Example!

@etiene_dBulgaria Web Summit 2016

bit.ly/luawebdev

@etiene_dBulgaria Web Summit 2016

Rails Girls Summer of Code

railsgirlssummerofcode.org

sailorproject.org

github.com/sailorproject

dalcol@etiene.net

@etiene_d

sailorproject.org

github.com/sailorproject

dalcol@etiene.net

@etiene_d

gitter.im/sailorproject/sailor

@sailor_lua

Thank you!sailorproject.org

github.com/sailorproject

dalcol@etiene.net

@etiene_d

top related