SlideShare a Scribd company logo
1 of 78
Download to read offline
this presentation code is on
https://github.com/gabrielelana/node-examples
gabriele lana
  gabriele.lana@cleancode.it
    twitter: @gabrielelana
         this presentation code is on
https://github.com/gabrielelana/node-examples
why
         node.js?

“Node's goal is to
  provide an easy
   way to build
scalable network
    programs”

           http://nodejs.org/#about
what is
                  node.js?
•   asynchronous i/o framework
•   core in c++ on top of v8
•   rest of it in javascript
•   swiss army knife for network
    related stuffs
•   can handle thousands of
    concurrent connections with
    minimal overhead (cpu/memory)
    on a single process
Single thread
synchronous I/0
Single thread
synchronous I/0
multiple thread
synchronous I/0
multiple thread
synchronous I/0
you can
  “always”
 scale with
  multiple
machines but
  it costs
  you $$$
but...
what is HE
 doing?
CPU BOUND
          TASKS?


  but...
what is HE
 doing?
CPU BOUND
          TASKS?

             ...OR I/o
  but...       BOUND
what is HE    TASKS?
 doing?
synchronous I/0

function
productsInCart(request,
response)
{




var
db
=
new
Db()




var
user
=
new
User(request)




if
(user.isAuthorized("cart/products"))
{








response.write(












JSON.stringify(
















db.productsInCart(user.cartId())












)








)




}
else
{








response.unauthorized()




}
}
synchronous I/0

function
productsInCart(request,
response)
{




var
db
=
new
Db()




var
user
=
new
User(request)




if
(user.isAuthorized("cart/products"))
{








response.write(












JSON.stringify(
















db.productsInCart(user.cartId())












)








)




}
else
{








response.unauthorized()




}
}
synchronous I/0

function
productsInCart(request,
response)
{




var
db
=
new
Db()




var
user
=
new
User(request)




if
(user.isAuthorized("cart/products"))
{








response.write(












JSON.stringify(
















db.productsInCart(user.cartId())












)








)




}
else
{








response.unauthorized()




}
}
synchronous I/0

function
productsInCart(request,
response)
{




var
db
=
new
Db()




var
user
=
new
User(request)




if
(user.isAuthorized("cart/products"))
{








response.write(












JSON.stringify(
















db.productsInCart(user.cartId())












)








)




}
else
{








response.unauthorized()




}
}
single thread
asynchronous I/0
single source events
  STATES




                      EVENTS
http://www.infoq.com/presentations/Death-by-Accidental-Complexity
single source events
 function
productsInCart(request,
response)
{
 



var
db
=
null,
user
=
null,
...
 



createDb()
 



handle(function(source,
event)
{
 







if
(event["name"]
===
"createDb")
{
 











if
(db
===
null)
{
 















db
=
event.data
 















createUser(request)
 











}
else
{
 















????
 











}
 







}
else
if
(event["name"]
===
"createUser")
{
 











if
(user
===
null)
{
 















user
=
event.data
 















...
 











}
else
{
 















???
 











}
 







...

 







}
else
{
 











source.push(event,
state)
 







}
 



},
"_initial")
 }
asynchronous I/0
  single thread
asynchronous I/0


           I am
       “callback”
         call me
         if you
        need me...
asynchronous I/0
  single thread
asynchronous I/0
multiple source events
     (local state)
STATES




         EVENTS
multiple source events
     (local state)
  function
productsInCart(request,
response)
{
  



createDb(function(db)
{
  







createUser(function(user)
{
  











if
(user.isAuthorized("cart/products")
{
  















response.write(
  



















JSON.stringify(
  























db.productsInCart(user.cartId())
  



















)
  















)
  















response.end()
  











})
else
{
  















response.unauthorized()
  











}
  







})
  



})
  }
multiple source events
     (local state)
  function
productsInCart(request,
response)
{
  



createDb(function(db)
{
  







createUser(function(user)
{
  











if
(user.isAuthorized("cart/products")
{
  















response.write(
  



















JSON.stringify(
  























db.productsInCart(user.cartId())
  



















)
  















)
  















response.end()
  











})
else
{
  















response.unauthorized()
  











}
  







})
  



})
  }
Event Emitter
                         (local state)
var
http
=
require("http")

var
server
=
http.createServer(function(request,
response)
{


response.writeHead(200,
{




"Content-Type":
"plain/text"


})


response.write("Hello
Worldn")


response.end()
})

server.listen(8080)

console.log(">
SERVER
STARTED")



                      01#hello_world/hello_world_server.js
Event Emitter
                         (local state)
var
http
=
require("http")

var
server
=
http.createServer(function(request,
response)
{


response.writeHead(200,
{




"Content-Type":
"plain/text"


})


response.write("Hello
Worldn")


response.end()
})

server.listen(8080)

console.log(">
SERVER
STARTED")



                      01#hello_world/hello_world_server.js
Event Emitter
                         (local state)
var
http
=
require("http")

var
server
=
http.createServer(function(request,
response)
{


response.writeHead(200,
{




"Content-Type":
"plain/text"


})


response.write("Hello
Worldn")


response.end()
})

server.listen(8080)

console.log(">
SERVER
STARTED")



                      01#hello_world/hello_world_server.js
Event Emitter
                         (local state)
var
http
=
require("http")

var
server
=
http.createServer(function(request,
response)
{


response.writeHead(200,
{




"Content-Type":
"plain/text"


})


response.write("Hello
Worldn")


response.end()
})

server.listen(8080)

console.log(">
SERVER
STARTED")



                      01#hello_world/hello_world_server.js
Event Emitter
                                (local state)
coder@apollo:~/Work/src/node/examples$ node hello_world_server.js
> SERVER STARTED
                                                                    #1
coder@apollo:~$ curl "http://localhost:8080/"
Hello World
                                                                    #2
Event Emitter
                         (local state)
var
server
=
require("http").createServer()

server.on("request",
function(request,
response)
{


console.log(">
REQUEST
STARTED")


request.on("end",
function()
{




console.log(">
REQUEST
CLOSED")




response.writeHead(200,
{






"Content-Type":
"plain/text"




})




response.end("Hello
Worldn")




server.close()


})


response.on("close",
function()
{




console.log(">
RESPONSE
CLOSED")


})
})

              01#hello_world/hello_world_server_emitter.js
Event Emitter
                         (local state)

...

server.on("close",
function()
{


console.log(">
SERVER
CLOSED")
})

server.on("listening",
function()
{


console.log(">
SERVER
STARTED")
})

server.listen(8080)




              01#hello_world/hello_world_server_emitter.js
Event Emitter
                                (local state)
coder@apollo:~/Work/src/node/examples$ node hello_world_server.js
> SERVER STARTED                                                    #1
coder@apollo:~$ curl "http://localhost:8080/"
Hello World                                                         #2
                                                                    #1
> REQUEST STARTED
> REQUEST CLOSED
> SERVER CLOSED
why so
complicated?
data streams
server.on("request",
function(request,
response)
{


var
chunks
=
[],






output
=
fs.createWriteStream("./output")



request.on("data",
function(chunk)
{




chunks
=
forEachLine(chunks.concat(chunk),
function(line)
{






output.write(parseInt(line,
10)
*
2)






output.write("n")




})


})



request.on("end",
function()
{




response.writeHead(200,
{
"Content-Type":
"plain/text"
})




response.end("OKn")




output.end()




server.close()


})
})
                               02#proxy_stream/proxy_stream.js
Event Emitter
                                (local state)
coder@apollo:~/Work/src/node/examples$ node stream_doubler.js
                                                                    #1
coder@apollo:~$ curl "http://localhost:8080/" --data $'1n2n3n'
OK                                                                  #2
coder@apollo:~/Work/src/node/examples$ cat output
2
4
6                                                                   #1
why
                 javascript?


•   Friendly callbacks
•   ubiquitous (well known)
•   no I/o primitives
•   one language to rule them all
web applications
                             before: a web
mind shift #1               server with some
                            application logic


                        application
           Web server
                        application


                        application


                        application
web applications
                        after: an application
mind shift #1             accessible over
                                http

        web server




                     application
web applications
                        after: an application
mind shift #1                 that can
                          communicate and
                         collaborate with
        web server
                             the world




                     application
web applications
                    before: stateful
mind shift #2   • no easy to scale
                • no easy to reuse

                v
                     M
                c
web applications
                    before: stateful
mind shift #2   • no easy to scale
                • no easy to reuse

                v
                     M
                c


  conversation       application
     state             state
web applications
                    before: stateful
mind shift #2   • no easy to scale
                • no easy to reuse

                v
                     M
                c



   tightly coupled
web applications
                    after: stateless
mind shift #2      • easy to scale
                   • easy to reuse


       v
            http
                       M
       c
web applications
                    after: stateless
mind shift #2      • easy to scale
                   • easy to reuse


       v
            http
                       M
       c


conversation       application
   state             state
web applications
                       after: stateless
mind shift #2
                http




                       web server
                                        M
                http

                                     statefull
                                    connection



• easy to scale                                  M
• easy to reuse
no fluff
just stuff
tic - tac - toe
tic - tac - toe



demo
INSTALL NPM
                                   (node packet manager)

coder@apollo:~/Work/src/node/examples$ curl http://npmjs.org/install.sh | sh
...
npm ok
It worked

coder@apollo:~/Work/src/node/examples$ npm list | wc -l
1776

coder@apollo:~/Work/src/node/examples$   npm   install   connect@0.2.5
coder@apollo:~/Work/src/node/examples$   npm   install   faye@0.5.3
coder@apollo:~/Work/src/node/examples$   npm   install   backbone@0.3.0
coder@apollo:~/Work/src/node/examples$   npm   install   underscore@1.1.2
static handler

var
server
=
connect.createServer(connect.logger({
"buffer":
true
}))


.use("/",
connect.router(function(resource)
{




resource.get("/board",
function(request,
response,
next)
{






request.url
=
"/board.html"






next()




})




...


}),
connect.staticProvider({





"root":
path.join(__dirname,
"static"),





"cache":
true



}))

server.listen(port)



                                             05#tictactoe/server.js
game handler
                           (generate board-id)






resource.post("/board",
function(request,
response)
{






response.writeHead(200,
{
"Content-Type":
"application/json"
})






uuid(function(boardId)
{








response.end(










JSON.stringify({












"board":
{
"id":
boardId
}










})








)






})




})




                                             05#tictactoe/server.js
game handler
                              (initial board/user)




resource.get("/board/:id",
function(request,
response)
{






var
board
=
boards.get(request.params["id"])






if
(board
===
undefined)
{








board
=
new
Board({
"id":
request.params["id"]
})








boards.add(board)






}






uuid(function(userId)
{








var
user
=
board.user(userId)








response.writeHead(200,
{
"Content-Type":
"application/json"
})








response.end(










JSON.stringify({












"board":
board,












"user":
user










})








)






})




})
                                                05#tictactoe/server.js
game handler
                                 (make your move)







resource.post("/board/:id",
function(request,
response)
{






waitForBody(request,
function(body)
{








boards.get(request.params["id"]).move(JSON.parse(body))








response.writeHead(204,
{
"Content-Type":
"application/json"
})








response.end(JSON.stringify({
"response":
"ok"
}))






})




})




                                                05#tictactoe/server.js
comet handler

var
comet
=
new
Faye.NodeAdapter({
"mount":
"/comet",
"timeout":
50
})

var
server
=
connect.createServer(connect.logger({
"buffer":
true
}))


.use("/comet",
function(request,
response,
next)
{




comet.handle(request,
response)


})


...
})

comet.attach(server)




                                              05#tictactoe/server.js
comet EVENTS
                       on backbone events



var
client
=
comet.getClient()
var
boards
=
new
Backbone.Collection

boards.bind("change",
function(board)
{


client.publish("/board-"
+
board.get("id"),
board)
})




                                         05#tictactoe/server.js
in browser
                                     routing

$(function()
{



$.sammy(function()
{









this.get("",
function(context)
{






$.post("/board",
function(response)
{








context.redirect("#/board/"
+
response["board"]["id"])






})




})





...


}).run()
})



                                  05#tictactoe/static/board.html
in browser
                                 routing/start game





var
comet
=
new
Faye.Client("/comet")




var
game
=
new
Game()





this.get("#/board/:id",
function(context)
{






game.start()






$.get("/board/"
+
context.params["id"],
function(response)
{








game.set({
"me":
new
User(response.user)
})








game.set({
"board":
new
Board(response.board)
})








comet.connect()








comet.subscribe("/board-"
+
context.params["id"],
function(board)
{










game.get("board").set(board)








})






})




})

                                            05#tictactoe/static/board.html
in browser
                             game logic example




window.Game
=
Backbone.Model.extend({




"initialize":
function()
{






...






game.get("board").bind("change",
function()
{








if
(this.isMyTurn())
{










return
game.trigger("make-your-move")








}








return
game.trigger("wait-for-move")






})




}


})




                               05#tictactoe/static/js/application.js
in browser
                              game logic example




game.bind("play-with-board",
function(cells)
{






buildBoard(['_'].concat(cells))




})





game.bind("play-with-mark",
function(mark)
{






showPlayerMarker(cellMarksUrl[myMark
=
mark])




})




game.bind("make-your-move",
function()
{






$("#board").undelegate()






$("#board").delegate("*[id^=cell]",
"mouseover",
function()
{








$(this).data("cell").select()






})






$("#board").delegate("*[id^=cell]",
"mouseout",
function()
{








$(this).data("cell").unselect()






})






...

                                05#tictactoe/static/js/application.js
What about
cpu bound
  tasks?
the fork
                               be with you


#!/bin/bash

for
count
in
`seq
1
100`;
do




echo
$count




sleep
0.1
done




                03#long_running_jobs/long_running_job.sh
the fork
                                be with you
var
spawn
=
require("child_process").spawn,




server
=
require("http").createServer()

server.on("request",
function(request,
response)
{


var
job
=
spawn("./long_running_job.sh")



job.stdout.on("data",
function(tick)
{




response.write(tick)




})



job.on("exit",
function()
{




response.end()


})
})


              03#long_running_jobs/long_running_server.js
the fork
                                     be with you
coder@apollo:~$ ab -c 1 -n 1 "http://localhost:8080/"
...
Concurrency Level:      1
Time taken for tests:   10.531 seconds
...


coder@apollo:~$ ab -c 1 -n 2 "http://localhost:8080/"
...
Concurrency Level:      1
Time taken for tests:   20.108 seconds
...
the fork
                                     be with you
coder@apollo:~$ ab -c 2 -n 1 "http://localhost:8080/"
...
Concurrency Level:      2
Time taken for tests:   10.634 seconds
...

coder@apollo:~$ ab -c 100 -n 100 "http://localhost:8080/"
...
Concurrency Level:      100
Time taken for tests:   11.198 seconds
...

coder@apollo:~$ ab -c 500 -n 500 "http://localhost:8080/"
...
Concurrency Level:      500
Time taken for tests:   31.082 seconds
...
enter comet


w
 at
 at ch
watch
    ch
                M                spawn
w




                watch
            w




                        w
         t a




                        at
           ch




                            ch
enter comet



demo
static handler

var
port
=
8080

var
server
=
connect.createServer(connect.logger())


.use("/comet",
function(request,
response)
{
...
})


.use("/spawn",
function(request,
response)
{
...
})


.use("/",
connect.staticProvider({





"root":
path.join(__dirname,
"static"),





"cache":
true



}))

comet.attach(server)

server.listen(port)



                            04#progress/progress_server.js
comet handler


var
comet
=
new
Faye.NodeAdapter({


"mount":
"/comet",
"timeout":
50

})

var
server
=
connect.createServer(connect.logger())


.use("/comet",
function(request,
response,
next)
{




comet.handle(request,
response)


})


...




                            04#progress/progress_server.js
spawn handler
var
client
=
comet.getClient(),
jobCounter
=
0

var
server
=
connect.createServer(connect.logger())


.use("/comet",
function(request,
response)
{
...
})


.use("/spawn",
function(request,
response,
next)
{




var
worker
=
spawn("./long_running_process.sh"),








jobId
=
jobsCounter++













response.writeHead(200,
{
"Content-Type":
"plain/text"
})




response.end("OKn")





worker.stdout.on("data",
function(progress)
{






client.publish("/job-progress",
{









"id":
jobId,









"progress":
parseInt(progress.toString(),
10)






})




})


})
                             04#progress/progress_server.js
in browser

<script>


$(function()
{




var
comet
=
new
Faye.Client("/comet")





comet.connect()




comet.subscribe("/job-progress",
function(job)
{






$("#template").progressBar(job.id,
job.progress)




})


})
</script>




                                 04#progress/static/index.html
node.js is
 awesome
 but when
 should i
  use it?
when to use it?

•   chat/messaging
•   real-time applications
•   intelligent proxies
•   high concurrency applications
•   communication hubs
•   coordinators
please tell
me something
 bad about
  node.js
some warnings

•   release stable 0.2.4 (young)
•   lots of stuffs to look at
•   lots of half backed stuffs
•   retro compatibility???
•   bad at handling static contents
•   hard to find organized and
    authoritative informations
Questions?
gabriele lana
  gabriele.lana@cleancode.it
    twitter: @gabrielelana
         this presentation code is on
https://github.com/gabrielelana/node-examples

More Related Content

What's hot

What's hot (20)

Node.js Basics
Node.js Basics Node.js Basics
Node.js Basics
 
Node js introduction
Node js introductionNode js introduction
Node js introduction
 
Node js
Node jsNode js
Node js
 
Node.js Tutorial for Beginners | Node.js Web Application Tutorial | Node.js T...
Node.js Tutorial for Beginners | Node.js Web Application Tutorial | Node.js T...Node.js Tutorial for Beginners | Node.js Web Application Tutorial | Node.js T...
Node.js Tutorial for Beginners | Node.js Web Application Tutorial | Node.js T...
 
Express js
Express jsExpress js
Express js
 
Node.js Express
Node.js  ExpressNode.js  Express
Node.js Express
 
NodeJS - Server Side JS
NodeJS - Server Side JS NodeJS - Server Side JS
NodeJS - Server Side JS
 
Introduction to Node JS.pdf
Introduction to Node JS.pdfIntroduction to Node JS.pdf
Introduction to Node JS.pdf
 
Basic Concept of Node.js & NPM
Basic Concept of Node.js & NPMBasic Concept of Node.js & NPM
Basic Concept of Node.js & NPM
 
Introduction to NodeJS
Introduction to NodeJSIntroduction to NodeJS
Introduction to NodeJS
 
Rest api with node js and express
Rest api with node js and expressRest api with node js and express
Rest api with node js and express
 
Express node js
Express node jsExpress node js
Express node js
 
An Introduction to Redux
An Introduction to ReduxAn Introduction to Redux
An Introduction to Redux
 
Node js for beginners
Node js for beginnersNode js for beginners
Node js for beginners
 
Intro to Asynchronous Javascript
Intro to Asynchronous JavascriptIntro to Asynchronous Javascript
Intro to Asynchronous Javascript
 
Redux toolkit
Redux toolkitRedux toolkit
Redux toolkit
 
Express JS
Express JSExpress JS
Express JS
 
Introduction to React JS for beginners
Introduction to React JS for beginners Introduction to React JS for beginners
Introduction to React JS for beginners
 
Introduction to React JS
Introduction to React JSIntroduction to React JS
Introduction to React JS
 
Introduction to react js
Introduction to react jsIntroduction to react js
Introduction to react js
 

Similar to Nodejs Explained with Examples

Writing robust Node.js applications
Writing robust Node.js applicationsWriting robust Node.js applications
Writing robust Node.js applications
Tom Croucher
 
A language for the Internet: Why JavaScript and Node.js is right for Internet...
A language for the Internet: Why JavaScript and Node.js is right for Internet...A language for the Internet: Why JavaScript and Node.js is right for Internet...
A language for the Internet: Why JavaScript and Node.js is right for Internet...
Tom Croucher
 
Remedie: Building a desktop app with HTTP::Engine, SQLite and jQuery
Remedie: Building a desktop app with HTTP::Engine, SQLite and jQueryRemedie: Building a desktop app with HTTP::Engine, SQLite and jQuery
Remedie: Building a desktop app with HTTP::Engine, SQLite and jQuery
Tatsuhiko Miyagawa
 
Node js presentation
Node js presentationNode js presentation
Node js presentation
martincabrera
 

Similar to Nodejs Explained with Examples (20)

Introduction to Nodejs
Introduction to NodejsIntroduction to Nodejs
Introduction to Nodejs
 
A language for the Internet: Why JavaScript and Node.js is right for Internet...
A language for the Internet: Why JavaScript and Node.js is right for Internet...A language for the Internet: Why JavaScript and Node.js is right for Internet...
A language for the Internet: Why JavaScript and Node.js is right for Internet...
 
Writing robust Node.js applications
Writing robust Node.js applicationsWriting robust Node.js applications
Writing robust Node.js applications
 
JS everywhere 2011
JS everywhere 2011JS everywhere 2011
JS everywhere 2011
 
A language for the Internet: Why JavaScript and Node.js is right for Internet...
A language for the Internet: Why JavaScript and Node.js is right for Internet...A language for the Internet: Why JavaScript and Node.js is right for Internet...
A language for the Internet: Why JavaScript and Node.js is right for Internet...
 
Node.js - async for the rest of us.
Node.js - async for the rest of us.Node.js - async for the rest of us.
Node.js - async for the rest of us.
 
Original slides from Ryan Dahl's NodeJs intro talk
Original slides from Ryan Dahl's NodeJs intro talkOriginal slides from Ryan Dahl's NodeJs intro talk
Original slides from Ryan Dahl's NodeJs intro talk
 
Play!ng with scala
Play!ng with scalaPlay!ng with scala
Play!ng with scala
 
Ruby MVC from scratch with Rack
Ruby MVC from scratch with RackRuby MVC from scratch with Rack
Ruby MVC from scratch with Rack
 
soft-shake.ch - Hands on Node.js
soft-shake.ch - Hands on Node.jssoft-shake.ch - Hands on Node.js
soft-shake.ch - Hands on Node.js
 
Intro to Node
Intro to NodeIntro to Node
Intro to Node
 
Event-driven IO server-side JavaScript environment based on V8 Engine
Event-driven IO server-side JavaScript environment based on V8 EngineEvent-driven IO server-side JavaScript environment based on V8 Engine
Event-driven IO server-side JavaScript environment based on V8 Engine
 
Server side JavaScript: going all the way
Server side JavaScript: going all the wayServer side JavaScript: going all the way
Server side JavaScript: going all the way
 
Building web framework with Rack
Building web framework with RackBuilding web framework with Rack
Building web framework with Rack
 
Event driven programming -- Node.JS
Event driven programming -- Node.JSEvent driven programming -- Node.JS
Event driven programming -- Node.JS
 
Remedie: Building a desktop app with HTTP::Engine, SQLite and jQuery
Remedie: Building a desktop app with HTTP::Engine, SQLite and jQueryRemedie: Building a desktop app with HTTP::Engine, SQLite and jQuery
Remedie: Building a desktop app with HTTP::Engine, SQLite and jQuery
 
Play vs Rails
Play vs RailsPlay vs Rails
Play vs Rails
 
NodeJS
NodeJSNodeJS
NodeJS
 
Node js presentation
Node js presentationNode js presentation
Node js presentation
 
From Ruby to Node.js
From Ruby to Node.jsFrom Ruby to Node.js
From Ruby to Node.js
 

More from Gabriele Lana

Agileday Coderetreat 2013
Agileday Coderetreat 2013Agileday Coderetreat 2013
Agileday Coderetreat 2013
Gabriele Lana
 
Milano Legacy Coderetreat 2013
Milano Legacy Coderetreat 2013Milano Legacy Coderetreat 2013
Milano Legacy Coderetreat 2013
Gabriele Lana
 
Minimum Viable Product
Minimum Viable ProductMinimum Viable Product
Minimum Viable Product
Gabriele Lana
 

More from Gabriele Lana (20)

Microservice Architectures
Microservice ArchitecturesMicroservice Architectures
Microservice Architectures
 
Professional Programmer 2018
Professional Programmer 2018Professional Programmer 2018
Professional Programmer 2018
 
Beyond Phoenix
Beyond PhoenixBeyond Phoenix
Beyond Phoenix
 
Parse Everything With Elixir
Parse Everything With ElixirParse Everything With Elixir
Parse Everything With Elixir
 
The Magic Of Elixir
The Magic Of ElixirThe Magic Of Elixir
The Magic Of Elixir
 
Professional Programmer (3 Years Later)
Professional Programmer (3 Years Later)Professional Programmer (3 Years Later)
Professional Programmer (3 Years Later)
 
Resource Oriented Design
Resource Oriented DesignResource Oriented Design
Resource Oriented Design
 
Agileday Coderetreat 2013
Agileday Coderetreat 2013Agileday Coderetreat 2013
Agileday Coderetreat 2013
 
Milano Legacy Coderetreat 2013
Milano Legacy Coderetreat 2013Milano Legacy Coderetreat 2013
Milano Legacy Coderetreat 2013
 
Minimum Viable Product
Minimum Viable ProductMinimum Viable Product
Minimum Viable Product
 
API Over HTTP
API Over HTTPAPI Over HTTP
API Over HTTP
 
coderetreat
coderetreatcoderetreat
coderetreat
 
Professional Programmer
Professional ProgrammerProfessional Programmer
Professional Programmer
 
It is not supposed to fly but it does
It is not supposed to fly but it doesIt is not supposed to fly but it does
It is not supposed to fly but it does
 
MongoDB With Style
MongoDB With StyleMongoDB With Style
MongoDB With Style
 
Nosql
NosqlNosql
Nosql
 
Magic of Ruby
Magic of RubyMagic of Ruby
Magic of Ruby
 
Why couchdb is cool
Why couchdb is coolWhy couchdb is cool
Why couchdb is cool
 
ProgrammingKatas
ProgrammingKatasProgrammingKatas
ProgrammingKatas
 
CouchDB Vs MongoDB
CouchDB Vs MongoDBCouchDB Vs MongoDB
CouchDB Vs MongoDB
 

Recently uploaded

Recently uploaded (20)

Ransomware_Q4_2023. The report. [EN].pdf
Ransomware_Q4_2023. The report. [EN].pdfRansomware_Q4_2023. The report. [EN].pdf
Ransomware_Q4_2023. The report. [EN].pdf
 
Manulife - Insurer Transformation Award 2024
Manulife - Insurer Transformation Award 2024Manulife - Insurer Transformation Award 2024
Manulife - Insurer Transformation Award 2024
 
FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024
 
Cyberprint. Dark Pink Apt Group [EN].pdf
Cyberprint. Dark Pink Apt Group [EN].pdfCyberprint. Dark Pink Apt Group [EN].pdf
Cyberprint. Dark Pink Apt Group [EN].pdf
 
Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...
Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...
Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdf
 
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin WoodPolkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
 
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, AdobeApidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
 
ICT role in 21st century education and its challenges
ICT role in 21st century education and its challengesICT role in 21st century education and its challenges
ICT role in 21st century education and its challenges
 
presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century education
 
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
 
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost SavingRepurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
MS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectorsMS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectors
 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
 
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdfRising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
 
Strategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherStrategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a Fresher
 
CNIC Information System with Pakdata Cf In Pakistan
CNIC Information System with Pakdata Cf In PakistanCNIC Information System with Pakdata Cf In Pakistan
CNIC Information System with Pakdata Cf In Pakistan
 
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
 

Nodejs Explained with Examples