NodeWay in my project & sails.js

5,395 views
5,241 views

Published on

Published in: Technology
2 Comments
3 Likes
Statistics
Notes
No Downloads
Views
Total views
5,395
On SlideShare
0
From Embeds
0
Number of Embeds
456
Actions
Shares
0
Downloads
52
Comments
2
Likes
3
Embeds 0
No embeds

No notes for slide

NodeWay in my project & sails.js

  1. 1. NodeWay dovchar 2013
  2. 2. dovcharitweekend2013 Aboutme
  3. 3. ✦ 7 years in IT dovcharitweekend2013 Aboutme
  4. 4. ✦ 7 years in IT ✦ 3 years in SoftServe dovcharitweekend2013 Aboutme
  5. 5. ✦ 7 years in IT ✦ 3 years in SoftServe ✦ 7 months Application Architect dovcharitweekend2013 Aboutme
  6. 6. ✦ 7 years in IT ✦ 3 years in SoftServe ✦ 7 months Application Architect ✦ Main language: Javascript dovcharitweekend2013 Aboutme
  7. 7. ✦ 7 years in IT ✦ 3 years in SoftServe ✦ 7 months Application Architect ✦ Main language: Javascript ✦ Hobby language: Go dovcharitweekend2013 Aboutme
  8. 8. ✦ 7 years in IT ✦ 3 years in SoftServe ✦ 7 months Application Architect ✦ Main language: Javascript ✦ Hobby language: Go ✦ Pacemaker conference dovcharitweekend2013 Aboutme
  9. 9. ✦ 7 years in IT ✦ 3 years in SoftServe ✦ 7 months Application Architect ✦ Main language: Javascript ✦ Hobby language: Go ✦ Pacemaker conference ✦ Script’n’Code meet-up dovcharitweekend2013 Aboutme
  10. 10. ✦ 7 years in IT ✦ 3 years in SoftServe ✦ 7 months Application Architect ✦ Main language: Javascript ✦ Hobby language: Go ✦ Pacemaker conference ✦ Script’n’Code meet-up ✦ Open source (typescript grails, clio go, sonar qunit) dovcharitweekend2013 Aboutme
  11. 11. dovcharitweekend2013 Agenda
  12. 12. NodeWay in my project dovcharitweekend2013 Agenda
  13. 13. NodeWay in my project NodeWay in my dreams dovcharitweekend2013 Agenda
  14. 14. NodeWay in my project NodeWay in my dreams ✦Nodejs ✦Installation ✦My Project ✦Architecture ✦Project statistics ✦Code health goal ✦Before ✦After ✦Development process ✦Conclusion dovcharitweekend2013 Agenda
  15. 15. NodeWay in my project NodeWay in my dreams ✦Nodejs ✦Installation ✦My Project ✦Architecture ✦Project statistics ✦Code health goal ✦Before ✦After ✦Development process ✦Conclusion dovcharitweekend2013 ✦What is Sails ✦Features ✦Get Started ✦MVC Structure ✦Routers ✦Assets ✦Policies ✦Deployment ✦Sockets ✦Conclusion Agenda
  16. 16. NodeJSdovcharitweekend2013 «Node.js is a software platform that is used to build scalable network (especially server- side) applications. Node.js utilizes JavaScript as its scripting language, and achieves high throughput via non-blocking I/O and a single-threaded event loop. Node.js contains a built-in HTTP server library, making it possible to run a web server without the use of external software, such as Apache or Lighttpd, and allowing more control of how the web server works.» Wikipedia
  17. 17. NodeJSdovcharitweekend2013 «Node.js is a software platform that is used to build scalable network (especially server- side) applications. Node.js utilizes JavaScript as its scripting language, and achieves high throughput via non-blocking I/O and a single-threaded event loop. Node.js contains a built-in HTTP server library, making it possible to run a web server without the use of external software, such as Apache or Lighttpd, and allowing more control of how the web server works.» Wikipedia ‣Original author(s): Ryan Lienhart Dahl ‣Stable release: 0.10.18 / September 4, 2013 ‣Preview release: 0.11.7 / August 21, 2013 ‣Development status: Active ‣Written in C++, JavaScript ‣Operating system: Mac OS X, Linux, Solaris, FreeBSD, OpenBSD, Windows (older versions require Cygwin), webOS ‣Type: Event-driven networking ‣License: MIT ‣Website: nodejs.org
  18. 18. NodeJSdovcharitweekend2013 «Node.js is a software platform that is used to build scalable network (especially server- side) applications. Node.js utilizes JavaScript as its scripting language, and achieves high throughput via non-blocking I/O and a single-threaded event loop. Node.js contains a built-in HTTP server library, making it possible to run a web server without the use of external software, such as Apache or Lighttpd, and allowing more control of how the web server works.» Wikipedia ‣Original author(s): Ryan Lienhart Dahl ‣Stable release: 0.10.18 / September 4, 2013 ‣Preview release: 0.11.7 / August 21, 2013 ‣Development status: Active ‣Written in C++, JavaScript ‣Operating system: Mac OS X, Linux, Solaris, FreeBSD, OpenBSD, Windows (older versions require Cygwin), webOS ‣Type: Event-driven networking ‣License: MIT ‣Website: nodejs.org
  19. 19. Installationdovcharitweekend2013 Install on OSX Using a package: Simply download Macintosh Installer Using homebrew: brew install node Using macports: port install nodejs
  20. 20. Installationdovcharitweekend2013 Install on Linux Ubuntu, Mint Example install: sudo apt-get install python-software-properties python g++ make sudo add-apt-repository ppa:chris-lea/node.js sudo apt-get update sudo apt-get install nodejs It installs current stable Node on the current stable Ubuntu. Quantal (12.10) users may need to install the software-properties-commonpackage for the add-apt- repository command to work: sudo apt-get install software-properties-common As of Node.js v0.10.0, the nodejs package from Chris Lea's repo includes both npm and nodejs-dev. There is a naming conflict with the node package (Amateur Packet Radio Node Program), and the nodejs binary has been renamed fromnode to nodejs. You'll need to symlink /usr/bin/node to /usr/bin/nodejs or you could uninstall the Amateur Packet Radio Node Program to avoid that conflict.
  21. 21. Installationdovcharitweekend2013 Install on Windows Using a package: Simply download Windows Installer. Using chocolatey to install Node: cinst nodejs or for full install with NPM: cinst nodejs.install
  22. 22. AboutProjectdovcharitweekend2013
  23. 23. AboutProjectdovcharitweekend2013
  24. 24. AboutProjectdovcharitweekend2013
  25. 25. AboutProjectdovcharitweekend2013
  26. 26. AboutProjectdovcharitweekend2013
  27. 27. AboutProjectdovcharitweekend2013
  28. 28. AboutProjectdovcharitweekend2013
  29. 29. AboutProjectdovcharitweekend2013
  30. 30. AboutProjectdovcharitweekend2013
  31. 31. AboutProjectdovcharitweekend2013
  32. 32. AboutProjectdovcharitweekend2013
  33. 33. AboutProjectdovcharitweekend2013
  34. 34. Architecturedovcharitweekend2013
  35. 35. Architecturedovcharitweekend2013
  36. 36. Architecturedovcharitweekend2013
  37. 37. ProjectStatisticsdovcharitweekend2013
  38. 38. ProjectStatisticsdovcharitweekend2013 ✦ 2 years development
  39. 39. ProjectStatisticsdovcharitweekend2013 ✦ 2 years development ✦ 10 scrum teams
  40. 40. ProjectStatisticsdovcharitweekend2013 ✦ 2 years development ✦ 10 scrum teams ✦ 59 modules
  41. 41. ProjectStatisticsdovcharitweekend2013 ✦ 2 years development ✦ 10 scrum teams ✦ 59 modules ✦ 3200 javascript files
  42. 42. ProjectStatisticsdovcharitweekend2013 ✦ 2 years development ✦ 10 scrum teams ✦ 59 modules ✦ 3200 javascript files ✦ 200.000 lines of code
  43. 43. ProjectStatisticsdovcharitweekend2013 ✦ 2 years development ✦ 10 scrum teams ✦ 59 modules ✦ 3200 javascript files ✦ 200.000 lines of code ✦ 1.826 total violations
  44. 44. ProjectStatisticsdovcharitweekend2013 ✦ 2 years development ✦ 10 scrum teams ✦ 59 modules ✦ 3200 javascript files ✦ 200.000 lines of code ✦ 1.826 total violations ✦ 28.3% average coverage
  45. 45. ProjectStatisticsdovcharitweekend2013 ✦ 2 years development ✦ 10 scrum teams ✦ 59 modules ✦ 3200 javascript files ✦ 200.000 lines of code ✦ 1.826 total violations ✦ 28.3% average coverage ✦ >5000 unit tests
  46. 46. What is Node.js doing here?! dovcharitweekend2013
  47. 47. Code health goal 90% dovcharitweekend2013
  48. 48. CodeHealthdovcharitweekend2013 Source
  49. 49. CodeHealthdovcharitweekend2013 Source Architecture & Design
  50. 50. CodeHealthdovcharitweekend2013 Source Architecture & Design Duplications
  51. 51. CodeHealthdovcharitweekend2013 Source Architecture & Design Duplications Unit tests
  52. 52. CodeHealthdovcharitweekend2013 Source Architecture & Design Duplications Unit tests Complexity
  53. 53. CodeHealthdovcharitweekend2013 Source Architecture & Design Duplications Unit tests Potential bugs Complexity
  54. 54. CodeHealthdovcharitweekend2013 Source Architecture & Design Duplications Coding rules Unit tests Potential bugs Complexity
  55. 55. CodeHealthdovcharitweekend2013 Source Comments Architecture & Design Duplications Coding rules Unit tests Potential bugs Complexity
  56. 56. Beforedovcharitweekend2013
  57. 57. Beforedovcharitweekend2013 ✦ A lot of manual work
  58. 58. Beforedovcharitweekend2013 ✦ A lot of manual work ✦ More than 5 different sources for analysis and counting
  59. 59. Beforedovcharitweekend2013 ✦ A lot of manual work ✦ More than 5 different sources for analysis and counting ✦ JSTD: js test driver for running tests on CI
  60. 60. Beforedovcharitweekend2013 ✦ A lot of manual work ✦ More than 5 different sources for analysis and counting ✦ JSTD: js test driver for running tests on CI ✦ Strange custom ruby scripts (still have no idea what they were used for :)
  61. 61. Beforedovcharitweekend2013 ✦ A lot of manual work ✦ More than 5 different sources for analysis and counting ✦ JSTD: js test driver for running tests on CI ✦ Strange custom ruby scripts (still have no idea what they were used for :) ✦ Sonar showed only back-end code
  62. 62. Beforedovcharitweekend2013 ✦ A lot of manual work ✦ More than 5 different sources for analysis and counting ✦ JSTD: js test driver for running tests on CI ✦ Strange custom ruby scripts (still have no idea what they were used for :) ✦ Sonar showed only back-end code ✦ Code coverage was to get in a separate application which made the automatic analysis even more complicated
  63. 63. Beforedovcharitweekend2013 ✦ A lot of manual work ✦ More than 5 different sources for analysis and counting ✦ JSTD: js test driver for running tests on CI ✦ Strange custom ruby scripts (still have no idea what they were used for :) ✦ Sonar showed only back-end code ✦ Code coverage was to get in a separate application which made the automatic analysis even more complicated ✦ Code health was counted in exel with its magic formulas that mysteriously worked hiding the real problems
  64. 64. Total CRAP... dovcharitweekend2013
  65. 65. Afterdovcharitweekend2013
  66. 66. Afterdovcharitweekend2013 ✦ We’ve refused from everything we had before but the existing tests
  67. 67. Afterdovcharitweekend2013 ✦ We’ve refused from everything we had before but the existing tests ✦ We’ve decided to switch to node.js for non-functional requirements
  68. 68. Afterdovcharitweekend2013 ✦ We’ve refused from everything we had before but the existing tests ✦ We’ve decided to switch to node.js for non-functional requirements ✦ We’ve chosen grunt.js for running node.js tasks (running unit tests, counting code coverage, creating reports for Sonar, checking the code semantics and complexity: jshint)
  69. 69. Afterdovcharitweekend2013 ✦ We’ve refused from everything we had before but the existing tests ✦ We’ve decided to switch to node.js for non-functional requirements ✦ We’ve chosen grunt.js for running node.js tasks (running unit tests, counting code coverage, creating reports for Sonar, checking the code semantics and complexity: jshint) ✦ We’ve excluded any manual intervention: sided applications for code coverage, exel creepy files, etc.
  70. 70. Afterdovcharitweekend2013 ✦ We’ve refused from everything we had before but the existing tests ✦ We’ve decided to switch to node.js for non-functional requirements ✦ We’ve chosen grunt.js for running node.js tasks (running unit tests, counting code coverage, creating reports for Sonar, checking the code semantics and complexity: jshint) ✦ We’ve excluded any manual intervention: sided applications for code coverage, exel creepy files, etc. ✦ We’ve put counting code health on Sonar’s shoulders for back-end as well as UI
  71. 71. Afterdovcharitweekend2013 ✦ We’ve refused from everything we had before but the existing tests ✦ We’ve decided to switch to node.js for non-functional requirements ✦ We’ve chosen grunt.js for running node.js tasks (running unit tests, counting code coverage, creating reports for Sonar, checking the code semantics and complexity: jshint) ✦ We’ve excluded any manual intervention: sided applications for code coverage, exel creepy files, etc. ✦ We’ve put counting code health on Sonar’s shoulders for back-end as well as UI ✦ We’ve fastened unit testing on CI
  72. 72. Afterdovcharitweekend2013 ✦ We’ve refused from everything we had before but the existing tests ✦ We’ve decided to switch to node.js for non-functional requirements ✦ We’ve chosen grunt.js for running node.js tasks (running unit tests, counting code coverage, creating reports for Sonar, checking the code semantics and complexity: jshint) ✦ We’ve excluded any manual intervention: sided applications for code coverage, exel creepy files, etc. ✦ We’ve put counting code health on Sonar’s shoulders for back-end as well as UI ✦ We’ve fastened unit testing on CI ✦ We’ve prevented the developers from failed builds and have given them the clear system for code quality analysis and correction
  73. 73. Exampledovcharitweekend2013
  74. 74. Developmentprocessdovcharitweekend2013
  75. 75. Conclusiondovcharitweekend2013
  76. 76. Conclusiondovcharitweekend2013
  77. 77. Conclusiondovcharitweekend2013 +
  78. 78. Conclusiondovcharitweekend2013 +
  79. 79. Conclusiondovcharitweekend2013 + +
  80. 80. Conclusiondovcharitweekend2013 + +
  81. 81. Conclusiondovcharitweekend2013 = + +
  82. 82. Conclusiondovcharitweekend2013 = + +
  83. 83. Nodejsframeworksdovcharitweekend2013
  84. 84. Nodejsframeworksdovcharitweekend2013
  85. 85. Nodejsframeworksdovcharitweekend2013
  86. 86. Nodejsframeworksdovcharitweekend2013
  87. 87. Nodejsframeworksdovcharitweekend2013
  88. 88. Nodejsframeworksdovcharitweekend2013
  89. 89. Nodejsframeworksdovcharitweekend2013
  90. 90. Nodejsframeworksdovcharitweekend2013
  91. 91. Sailsdovcharitweekend2013 What is Sails.js?
  92. 92. Sailsdovcharitweekend2013 Sails.js make it easy to build custom, enterprise-grade Node.js apps. It is designed to mimic the MVC pattern of frameworks like Ruby on Rails, but with support for the requirements of modern apps: data-driven APIs with scalable, service-oriented architecture. It's especially good for building chat, realtime dashboards, or multiplayer games. What is Sails.js?
  93. 93. Featuresdovcharitweekend2013
  94. 94. Featuresdovcharitweekend2013 ✦ Sails.js is database agnostic. Its ORM, Waterline, provides a simple data access layer that works, no matter what database you're using.
  95. 95. Featuresdovcharitweekend2013 ✦ Sails.js is database agnostic. Its ORM, Waterline, provides a simple data access layer that works, no matter what database you're using. ✦ Sails.js automatically generates a RESTful JSON API for your app. That means you don't have to write any backend code to build simple database apps.
  96. 96. Featuresdovcharitweekend2013 ✦ Sails.js is database agnostic. Its ORM, Waterline, provides a simple data access layer that works, no matter what database you're using. ✦ Sails.js automatically generates a RESTful JSON API for your app. That means you don't have to write any backend code to build simple database apps. ✦ Realtime Socket.io requests are routed to your controllers the same way as everything else: with resourceful conventions and URL mappings.
  97. 97. Featuresdovcharitweekend2013 ✦ Sails.js is database agnostic. Its ORM, Waterline, provides a simple data access layer that works, no matter what database you're using. ✦ Sails.js automatically generates a RESTful JSON API for your app. That means you don't have to write any backend code to build simple database apps. ✦ Realtime Socket.io requests are routed to your controllers the same way as everything else: with resourceful conventions and URL mappings. ✦ Sails.js provides basic security and role-based access control by default, and you can add as many custom policies as you like.
  98. 98. Featuresdovcharitweekend2013 ✦ Sails.js is database agnostic. Its ORM, Waterline, provides a simple data access layer that works, no matter what database you're using. ✦ Sails.js automatically generates a RESTful JSON API for your app. That means you don't have to write any backend code to build simple database apps. ✦ Realtime Socket.io requests are routed to your controllers the same way as everything else: with resourceful conventions and URL mappings. ✦ Sails.js provides basic security and role-based access control by default, and you can add as many custom policies as you like. ✦ Because Express and Socket.io share the same configurable session store, all of your security policies are reused for realtime WebSocket requests as well.
  99. 99. Featuresdovcharitweekend2013 ✦ Sails.js is database agnostic. Its ORM, Waterline, provides a simple data access layer that works, no matter what database you're using. ✦ Sails.js automatically generates a RESTful JSON API for your app. That means you don't have to write any backend code to build simple database apps. ✦ Realtime Socket.io requests are routed to your controllers the same way as everything else: with resourceful conventions and URL mappings. ✦ Sails.js provides basic security and role-based access control by default, and you can add as many custom policies as you like. ✦ Because Express and Socket.io share the same configurable session store, all of your security policies are reused for realtime WebSocket requests as well. ✦ Sails.js has automatic asset minification. With Sails, you just put your files in the proper folder and they are automatically included in your layout. Then, when you're ready to go into production, they are minified and gzipped to preserve as much bandwidth as possible.
  100. 100. GetStarteddovcharitweekend2013
  101. 101. GetStarteddovcharitweekend2013 npm install -g sails
  102. 102. GetStarteddovcharitweekend2013 npm install -g sails
  103. 103. GetStarteddovcharitweekend2013 npm install -g sails
  104. 104. GetStarteddovcharitweekend2013 npm install -g sails
  105. 105. GetStarteddovcharitweekend2013 npm install -g sails
  106. 106. GetStarteddovcharitweekend2013 npm install -g sails
  107. 107. GetStarteddovcharitweekend2013 npm install -g sails
  108. 108. GetStarteddovcharitweekend2013 npm install -g sails
  109. 109. GetStarteddovcharitweekend2013 npm install -g sails
  110. 110. GetStarteddovcharitweekend2013 npm install -g sails
  111. 111. Controllerdovcharitweekend2013
  112. 112. Controllerdovcharitweekend2013
  113. 113. Controllerdovcharitweekend2013
  114. 114. Controllerdovcharitweekend2013
  115. 115. Controllerdovcharitweekend2013
  116. 116. Controllerdovcharitweekend2013 ✦ req.param()
  117. 117. Controllerdovcharitweekend2013 ✦ req.param() ✦ req.isSocket
  118. 118. Controllerdovcharitweekend2013 ✦ req.param() ✦ req.isSocket ✦ req.isAjax
  119. 119. Controllerdovcharitweekend2013 ✦ req.param() ✦ req.isSocket ✦ req.isAjax ✦ req.isJson
  120. 120. Controllerdovcharitweekend2013 ✦ req.param() ✦ req.isSocket ✦ req.isAjax ✦ req.isJson ✦ res.view()
  121. 121. Controllerdovcharitweekend2013 ✦ req.param() ✦ req.isSocket ✦ req.isAjax ✦ req.isJson ✦ res.view() ✦ res.send()
  122. 122. Controllerdovcharitweekend2013 ✦ req.param() ✦ req.isSocket ✦ req.isAjax ✦ req.isJson ✦ res.view() ✦ res.send() ✦ res.json()
  123. 123. Controllerdovcharitweekend2013 ✦ req.param() ✦ req.isSocket ✦ req.isAjax ✦ req.isJson ✦ res.view() ✦ res.send() ✦ res.json() ✦ res.redirect()
  124. 124. Controllerdovcharitweekend2013 ✦ req.param() ✦ req.isSocket ✦ req.isAjax ✦ req.isJson ✦ res.view() ✦ res.send() ✦ res.json() ✦ res.redirect() ✦ res.viewExists
  125. 125. Modeldovcharitweekend2013
  126. 126. Modeldovcharitweekend2013
  127. 127. Modeldovcharitweekend2013
  128. 128. Modeldovcharitweekend2013
  129. 129. Modeldovcharitweekend2013 ✦ Attributes
  130. 130. Modeldovcharitweekend2013 ✦ Attributes ✦ Validations
  131. 131. Modeldovcharitweekend2013 ✦ Attributes ✦ Validations ✦ Instance Methods (save, destroy, toObject, toJSON)
  132. 132. Modeldovcharitweekend2013 ✦ Attributes ✦ Validations ✦ Instance Methods (save, destroy, toObject, toJSON) ✦ Custom Defined Instance Methods
  133. 133. Modeldovcharitweekend2013 ✦ Attributes ✦ Validations ✦ Instance Methods (save, destroy, toObject, toJSON) ✦ Custom Defined Instance Methods ✦ Lifecycle callbacks
  134. 134. Modeldovcharitweekend2013 ✦ Attributes ✦ Validations ✦ Instance Methods (save, destroy, toObject, toJSON) ✦ Custom Defined Instance Methods ✦ Lifecycle callbacks ✦ Custom tables name
  135. 135. Modeldovcharitweekend2013 ✦ Attributes ✦ Validations ✦ Instance Methods (save, destroy, toObject, toJSON) ✦ Custom Defined Instance Methods ✦ Lifecycle callbacks ✦ Custom tables name ✦ Adapters
  136. 136. Modeldovcharitweekend2013 ✦ Attributes ✦ Validations ✦ Instance Methods (save, destroy, toObject, toJSON) ✦ Custom Defined Instance Methods ✦ Lifecycle callbacks ✦ Custom tables name ✦ Adapters ✦ Associations
  137. 137. Modeldovcharitweekend2013 ✦ Attributes ✦ Validations ✦ Instance Methods (save, destroy, toObject, toJSON) ✦ Custom Defined Instance Methods ✦ Lifecycle callbacks ✦ Custom tables name ✦ Adapters ✦ Associations ✦ Automatic schema creation
  138. 138. Modeldovcharitweekend2013 ✦ Attributes ✦ Validations ✦ Instance Methods (save, destroy, toObject, toJSON) ✦ Custom Defined Instance Methods ✦ Lifecycle callbacks ✦ Custom tables name ✦ Adapters ✦ Associations ✦ Automatic schema creation ✦ Data manipulation: create, findOne, find, dynamic finders (i.e findByName), update, destroy,
  139. 139. Modeldovcharitweekend2013 ✦ Attributes ✦ Validations ✦ Instance Methods (save, destroy, toObject, toJSON) ✦ Custom Defined Instance Methods ✦ Lifecycle callbacks ✦ Custom tables name ✦ Adapters ✦ Associations ✦ Automatic schema creation ✦ Data manipulation: create, findOne, find, dynamic finders (i.e findByName), update, destroy, ✦ Migrations
  140. 140. dovcharitweekend2013 View/Assets
  141. 141. Routersdovcharitweekend2013
  142. 142. Routersdovcharitweekend2013 ✦ If the URL is not specified in config/routes.js, the default route for a URL is: /:controller/:action/:id where :controller, :action, and the :id request parameter are derived from the url. ✦ If the requested controller/action doesn't exist: - if a view exists ( / views/:controller/:action.ejs), Sails will render that view - if no view exists, but a model exists, Sails will automatically generate a JSON API for the model which matches :controller. - if no view OR model exists, Sails will respond with a 404.
  143. 143. Routersdovcharitweekend2013 ✦ If the URL is not specified in config/routes.js, the default route for a URL is: /:controller/:action/:id where :controller, :action, and the :id request parameter are derived from the url. ✦ If the requested controller/action doesn't exist: - if a view exists ( / views/:controller/:action.ejs), Sails will render that view - if no view exists, but a model exists, Sails will automatically generate a JSON API for the model which matches :controller. - if no view OR model exists, Sails will respond with a 404.
  144. 144. Underthehuddovcharitweekend2013
  145. 145. Underthehuddovcharitweekend2013 ✦ Policies ✦ Custom adapters ✦ Deployment ✦ Configurations ✦ Database support ✦ Sockets
  146. 146. Conclusiondovcharitweekend2013
  147. 147. Linksdovcharitweekend2013
  148. 148. Linksdovcharitweekend2013 ✦ Node.js
  149. 149. Linksdovcharitweekend2013 ✦ Node.js ✦ Sonarqube
  150. 150. Linksdovcharitweekend2013 ✦ Node.js ✦ Sonarqube ✦ grunt, bower, yeoman
  151. 151. Linksdovcharitweekend2013 ✦ Node.js ✦ Sonarqube ✦ grunt, bower, yeoman ✦ pacemaker, script’n’code
  152. 152. Linksdovcharitweekend2013 ✦ Node.js ✦ Sonarqube ✦ grunt, bower, yeoman ✦ pacemaker, script’n’code ✦ Sails.js Facebook Twitter Linkedin Gmail
  153. 153. Questionsdovcharitweekend2013
  154. 154. Questions? dovcharitweekend2013

×