SlideShare a Scribd company logo
Sonia Pini – Carlo Bonamico
Real World AngularJS recipes:
beyond TodoMVC
sonia.pini@nispro.it - NIS s.r.l.
carlo.bonamico@nispro.it - NIS s.r.l.
carlo.bonamico@gmail.com – Genova Java User Group
Twitter: @carlobonamico @nis_srl
ROME 27-28 march 2015
We all love TodoMVC
● Great resource
– discover and
approach
new front-end
technologies
http://todomvc.com/examples/angularjs   
● You got captured by Angular
power and simplicity
– have chosen it
for your next project
– or thinking about it
While in the “Write App” step...
● But it's difficult!
● Angular is
not suited to
production, then?
● What's the matter?
http://www.bennadel.com/
Data Binding is just the beginning
It doesn’t just magically
generate maintainable
and extensible apps
● How to design
and implement
a robust HTML5
SPA?
{{ iceberg.tip }}
Modules test
Routing
directives
The questions we all ask...
● Which language do we use?
● How do we split the app in modules?
● How do we organize our App's structure?
● Do I really need to learn directives?
● How do we package our App for development
and production?
● How do we test our App?
– this talk shares practical recipes
from our real world Angular development experience
Which language do I use?
But don't you just need to use plain javascript?
ES5 vs ES6 vs TypeScript
● First of all: know your JavaScript (ES5)
– do not use it like Java / C#!
– learn variable scopes, closures, object-based
inheritance, idioms
– some starting points at the end
● JS is not the only choice:
– ES6 – the future of Web
– TypeScript – typed superset of ES5 → ES6
● Angular 2.0 will fully support ES5
– But will make even more things for you in ES6 and TS
● error detection, IDE support, easier Dependency Injection
Angular 2.0
friendly
Examples
● ES6 - Controller ● TypeScript - Controller
How do we split the app in modules?
Modularization guidelines
Modularity is the separation of a system’s into a set
of logically indipendent pieces
Common design principles a module should follow:
● High Cohesion - Single Responsibility Principle
(SOLID Principle)
● Low Coupling - low dependency
● See also R.Martin's Principles of Package Design
– CCP The Common Closure Principle
● Classes that change together are packaged together
– CRP The Common Reuse Principle
● Classes that are used together are packaged together
– And more http://butunclebob.com/ArticleS.UncleBob.PrinciplesOfOod
How do we can map functionalities
into Angular Modules?
Modularity – Style Guide
● Separate Module in category as described in John
Papa’s AngularJs Styleguide
– Reusable Blocks - common service e.g. exception
handling, logging, security
– Feature Modules - app specific features
– App Module - thin module used for pulling together the
application
Webmail App
Logging Auth UI Widgets
Message 
List 
Reader
Message 
Composer
Contacts
How do we arrange source code?
Typical Hello World folder Structure
A directory for each type of object
app/
----- controllers/
---------- main.controller.js
---------- other.controller.js
----- directives/
---------- main.directive.js
---------- other.directive.js
----- services/
---------- user.service.js
---------- item.service.js
----- js/
---------- bootstrap.js
---------- jquery.js
----- app.js
views/
----- mainView.html
----- otherView.html
----- index.html
Finding files and debugging
becomes difficult
as the application grows in size
Modular Structure
● Feature-based
– a module / folder
for each feature or
macro-component
app/
----- app.module.js
----- app.config.js
----- components/
---------- calendar.directive.js
---------- calendar.directive.html
---------- user-profile.directive.js
---------- user-profile.directive.html
----- people
---------- people.module.js
---------- people.config.js
---------- attendees.html
---------- attendees.controller.js
---------- attendees.controller.spec.js
---------- speakers.html
---------- speakers.controller.js
---------- speakers.controller.spec.js
----- services/
Features are the high-
level section of the
application, often
corresponding to top-
level routes
What is the right size of controllers?
Controller Granularity: from this
Image courtesy of Todd Motto's very interesting tutorial
https://www.thinkful.com/learn/angularjs-tutorial-build-a-gmail-clone
    WebMailController
Controllers: to this
   WebMailController
MessageListController
FolderList
Controller
MsgAction
Controller
Controller tips
● Controllers should be as small as possible
– used just to prepare the model and react to user inputs
– avoid DOM manipulation
● Prefer the new Controller As syntax
<div ng­controller=”MsgController as msgCtrl”>
{{msgCtrl.message.subject}}
function MsgController()  //no $scope!
{
this.message = { subject : “Hello World” };
}
Easier to test, maintain,
Reduces code duplication (DRY)
Angular 2.0
friendly
How can many small Controllers / Components
interact?
Collaborating Controllers
– Through the Scope hierarchy
● Child controller reads/write its parent scope (or vice-versa)
● ONLY suited for controllers of tightly coupled parts
● Avoid if possible
– Through a common Service
● Best used within a module
– MessageListController   MessageListService→
– NavigationController   MessageListService→
– Through events
● Best used across modules or independent functionalities
● e.g. from in Contact module choose one from list
$broadcast(“composeEmail”, 
        {action: “compose”, to: currentContact})
● Message Composer module listens and creates a new mail
– $on(“composeEmail”, function (event) {...})
Do I really need to write Directives?
Directive Roles
● Directives (together with Dependency Injection) are
the key to Angular powers
– initial learning step but definitely worth doing!
● First concept: directive have different roles
– Element → creates a new tag <my­autocomplete>
– Decorator → adds behaviour to an existing tag ng­hide
– Template → manipulate the page structure ng­repeat
● Containers are a special type of template <my­panel> 
● There are standard “recipes” and tips for each role
– See http://ng-book.com
Will be
explicit in
Angular 2.0
Directive tips
● Progressively implement a hierarchy of Directives
– Utility directives
– show­tooltip­on=”warning”
– Ui elements
<contact­autocomplete></contact­autocomplete>
– Reusable Components
● Tip – learn transclusion!
– <message­composer message=”newMessage” 
                  on­send=”wmCtrl.sent()”>
<my­custom­message­action­bar></...>
– </message­composer>
– Macro-component (optional, but...)
Thinking in Components: from this
     ng­controller=”WebMailController”
ng­controller=”MessageListController”
MessageList.html
Ng­controller
=
”FolderList
Controller” MsgAction
Controller
Thinking in Components
– more references on how to do this at the end
<message­list><folder­list>
<message­actions>
<message­details>
<message­search­box>
Angular 2.0
Friendly !!
So we are done now :-)
let's just copy the folder in our production web
server...
Some things are missing!
● Security
● Logging
● Packaging and Optimizations
● Testing
Authentication & Authorization
● Traditional Request-Response web applications
(think JSP, ASP, PHP) typically use
– cookies with session ID
– session data on the server
– login opens a new session on the server
● You can technically do this in a Single Page App
– but not a good match to REST (stateless) services
● Use Token-based authentication
– and remember to check access permissions
in the REST endpoints!
JWT - http://jwt.io/
● JWT = encoded & signed Json object containing
– Access token
– Signed Claims (customizable!)
● Username
● Expiration
● Returned by login REST service
● Sent as header at each request
– Authentication: bearer eyJhbGciO.eyJzdWIiOWV9.eoaDV
● Checked by REST backed at each request
– can also be used with websockets
● Angular Library
https://github.com/auth0/angular­jwt 
{
  “user”: “sonia”, 
  “company”: “NIS” 
}
+ HMACSHA256
Logging
● If you move a significant part of your app to the
client side, you need to know what's happening
– are there errors?
● Our approach:
– intercept all exception on the client
● $exceptionHandler service
– represent exception as event JSON object
{ event: “exception”, date: …, message: , severity: }
– LogService which sends events to REST endpoint
● Can also be used to collect and send metrics to the
server
Packaging: different needs
Development Time
● Live reload
● No caching
● No minify for debug
● A file for each
class/controller/service
● Mock REST services
Production Time
● Image Optimizations
● CSS Optimizations
● Minify
● A few files to speed up
download
● Real REST services
Solution: use workflow tools
● Gulp
– http://gulpjs.com/
● Grut
– http://gruntjs.com/
● Tips
– Use workflow tool from the beginning
– Generators helps you to kickstart new App
● Customize the result following your needs
– http://yeoman.io/
– We use
– https://github.com/Swiip/generator­gulp­angular 
But do I need to test my app?
Testing is nice – BDD even more
in theory, but...
Testing web / Javascript applications is difficult...
Testing Angular Apps is easier
● Unit test = Karma & Jasmine
– it isn't a waste of time → has saved us HOURS
– use dump(var)
instead of
console.log(var)
– use mocking
– angular­mocks.js
● Integration test
– test controllers
with services
– use mock
of backend
● $httpBackend 
Testing Angular Apps is easier
● Functional / E2E Test = Protractor
– emulates user actions / search elements in the page
– special Angular support
● Automatically waits for async actions & match by model
BDD with Protractor + Cucumber
● Acceptance Test → Focus on the Customer
– sit down with your customers
– describe the feature in natural language and review it
– use the result as blueprint to guide your development
Page Object
● Using Page Objects to organize tests
– encapsulate information about your page structure
– reusable across multiple tests
– if the template of your App changes, you only need to
update the Page Object
Test pyramid vs cupcake
http://martinfowler.com/bliki/TestPyramid.html
References
● StyleGuide
– https://github.com/johnpapa/angular­styleguide 
● SOLID Principles
– http://butunclebob.com/ArticleS.UncleBob.PrinciplesOf
Ood
● Javascript by Yakov Fain
– http://enterprisewebbook.com/appendix_a_advancedjs.html
– https://www.youtube.com/watch?v=X1J0oMayvC0
● Axel Rauschmayer Speaking Javascript
– http://speakingjs.com/ 
● TypeScript
– http://www.typescriptlang.org/
● ES6
– http://www.2ality.com/2014/08/es6­today.html
References
● Component based directives
– http://tech.opentable.com/2015/02/10/reusable­components­an
gular/
– https://leanpub.com/web­component­development­with­angularj
s/read
● Angular 2.0
– http://angular.io/
● NG-Conf 2015 Playlist
– https://www.youtube.com/playlist?list=PLOETEcp3DkCoNnlhE­7f
ovYvqwVPrRiY7
● Cucumber
● https://cukes.info/ 
● https://github.com/cucumber/cucumber­js 
Thank you!
● Other presentations
– http://www.slideshare.net/carlo.bonamico/presentations
● Follow us on Twitter
– @carlobonamico @nis_srl
● updates on AngularJS!
● and some Docker, Ansible, Continuous Delivery
● Contact us
– carlo.bonamico@gmail.com / carlo.bonamico@nispro.it
– Sonia.pini@nispro.it
● Our company
– http://www.nispro.it
Leave your feedback on Joind.in!
https://joind.in/event/view/3347

More Related Content

What's hot

Angularjs - lazy loading techniques
Angularjs - lazy loading techniques Angularjs - lazy loading techniques
Angularjs - lazy loading techniques
Nir Kaufman
 
Nodejs web service for starters
Nodejs web service for startersNodejs web service for starters
Nodejs web service for starters
Bruce Li
 
Puppeteer - A web scraping & UI Testing Tool
Puppeteer - A web scraping & UI Testing ToolPuppeteer - A web scraping & UI Testing Tool
Puppeteer - A web scraping & UI Testing Tool
Miki Lombardi
 
Angular js
Angular jsAngular js
Angular js
Knoldus Inc.
 
High Performance JavaScript (CapitolJS 2011)
High Performance JavaScript (CapitolJS 2011)High Performance JavaScript (CapitolJS 2011)
High Performance JavaScript (CapitolJS 2011)Nicholas Zakas
 
Gettings started with the superheroic JavaScript library AngularJS
Gettings started with the superheroic JavaScript library AngularJSGettings started with the superheroic JavaScript library AngularJS
Gettings started with the superheroic JavaScript library AngularJS
Armin Vieweg
 
Magento 2 Development
Magento 2 DevelopmentMagento 2 Development
Magento 2 Development
Duke Dao
 
AngularJS vs React JS vs Node JS: Which is Best For Web Development ?
AngularJS vs React JS vs Node JS: Which is Best For Web Development ?AngularJS vs React JS vs Node JS: Which is Best For Web Development ?
AngularJS vs React JS vs Node JS: Which is Best For Web Development ?
MarkupBox
 
Developing large scale JavaScript applications
Developing large scale JavaScript applicationsDeveloping large scale JavaScript applications
Developing large scale JavaScript applications
Milan Korsos
 
Service Worker 101 (en)
Service Worker 101 (en)Service Worker 101 (en)
Service Worker 101 (en)
Chang W. Doh
 
Single Page Application (SPA) using AngularJS
Single Page Application (SPA) using AngularJSSingle Page Application (SPA) using AngularJS
Single Page Application (SPA) using AngularJS
M R Rony
 
Angular1x and Angular 2 for Beginners
Angular1x and Angular 2 for BeginnersAngular1x and Angular 2 for Beginners
Angular1x and Angular 2 for Beginners
Oswald Campesato
 
JAVA SCRIPT
JAVA SCRIPTJAVA SCRIPT
JAVA SCRIPT
Go4Guru
 
GWT
GWTGWT
AngularJS - What is it & Why is it awesome ? (with demos)
AngularJS - What is it & Why is it awesome ? (with demos)AngularJS - What is it & Why is it awesome ? (with demos)
AngularJS - What is it & Why is it awesome ? (with demos)
Gary Arora
 
Angular 1.x reloaded: improve your app now! and get ready for 2.0
Angular 1.x reloaded:  improve your app now! and get ready for 2.0Angular 1.x reloaded:  improve your app now! and get ready for 2.0
Angular 1.x reloaded: improve your app now! and get ready for 2.0
Carlo Bonamico
 
Muhammad azamuddin introduction-to-reactjs
Muhammad azamuddin   introduction-to-reactjsMuhammad azamuddin   introduction-to-reactjs
Muhammad azamuddin introduction-to-reactjs
PHP Indonesia
 
On Selecting JavaScript Frameworks (Women Who Code 10/15)
On Selecting JavaScript Frameworks (Women Who Code 10/15)On Selecting JavaScript Frameworks (Women Who Code 10/15)
On Selecting JavaScript Frameworks (Women Who Code 10/15)
Zoe Landon
 
Angular 2: What's New?
Angular 2: What's New?Angular 2: What's New?
Angular 2: What's New?
jbandi
 
Single Page WebApp Architecture
Single Page WebApp ArchitectureSingle Page WebApp Architecture
Single Page WebApp ArchitectureMorgan Cheng
 

What's hot (20)

Angularjs - lazy loading techniques
Angularjs - lazy loading techniques Angularjs - lazy loading techniques
Angularjs - lazy loading techniques
 
Nodejs web service for starters
Nodejs web service for startersNodejs web service for starters
Nodejs web service for starters
 
Puppeteer - A web scraping & UI Testing Tool
Puppeteer - A web scraping & UI Testing ToolPuppeteer - A web scraping & UI Testing Tool
Puppeteer - A web scraping & UI Testing Tool
 
Angular js
Angular jsAngular js
Angular js
 
High Performance JavaScript (CapitolJS 2011)
High Performance JavaScript (CapitolJS 2011)High Performance JavaScript (CapitolJS 2011)
High Performance JavaScript (CapitolJS 2011)
 
Gettings started with the superheroic JavaScript library AngularJS
Gettings started with the superheroic JavaScript library AngularJSGettings started with the superheroic JavaScript library AngularJS
Gettings started with the superheroic JavaScript library AngularJS
 
Magento 2 Development
Magento 2 DevelopmentMagento 2 Development
Magento 2 Development
 
AngularJS vs React JS vs Node JS: Which is Best For Web Development ?
AngularJS vs React JS vs Node JS: Which is Best For Web Development ?AngularJS vs React JS vs Node JS: Which is Best For Web Development ?
AngularJS vs React JS vs Node JS: Which is Best For Web Development ?
 
Developing large scale JavaScript applications
Developing large scale JavaScript applicationsDeveloping large scale JavaScript applications
Developing large scale JavaScript applications
 
Service Worker 101 (en)
Service Worker 101 (en)Service Worker 101 (en)
Service Worker 101 (en)
 
Single Page Application (SPA) using AngularJS
Single Page Application (SPA) using AngularJSSingle Page Application (SPA) using AngularJS
Single Page Application (SPA) using AngularJS
 
Angular1x and Angular 2 for Beginners
Angular1x and Angular 2 for BeginnersAngular1x and Angular 2 for Beginners
Angular1x and Angular 2 for Beginners
 
JAVA SCRIPT
JAVA SCRIPTJAVA SCRIPT
JAVA SCRIPT
 
GWT
GWTGWT
GWT
 
AngularJS - What is it & Why is it awesome ? (with demos)
AngularJS - What is it & Why is it awesome ? (with demos)AngularJS - What is it & Why is it awesome ? (with demos)
AngularJS - What is it & Why is it awesome ? (with demos)
 
Angular 1.x reloaded: improve your app now! and get ready for 2.0
Angular 1.x reloaded:  improve your app now! and get ready for 2.0Angular 1.x reloaded:  improve your app now! and get ready for 2.0
Angular 1.x reloaded: improve your app now! and get ready for 2.0
 
Muhammad azamuddin introduction-to-reactjs
Muhammad azamuddin   introduction-to-reactjsMuhammad azamuddin   introduction-to-reactjs
Muhammad azamuddin introduction-to-reactjs
 
On Selecting JavaScript Frameworks (Women Who Code 10/15)
On Selecting JavaScript Frameworks (Women Who Code 10/15)On Selecting JavaScript Frameworks (Women Who Code 10/15)
On Selecting JavaScript Frameworks (Women Who Code 10/15)
 
Angular 2: What's New?
Angular 2: What's New?Angular 2: What's New?
Angular 2: What's New?
 
Single Page WebApp Architecture
Single Page WebApp ArchitectureSingle Page WebApp Architecture
Single Page WebApp Architecture
 

Similar to Real World AngularJS recipes: beyond TodoMVC - Carlo Bonamico, Sonia Pini - Codemotion Rome 2015

Angular.ppt
Angular.pptAngular.ppt
Angular.ppt
Mytrux1
 
Introduction to Angular Js
Introduction to Angular JsIntroduction to Angular Js
Introduction to Angular Js
Professional Guru
 
Top 7 Angular Best Practices to Organize Your Angular App
Top 7 Angular Best Practices to Organize Your Angular AppTop 7 Angular Best Practices to Organize Your Angular App
Top 7 Angular Best Practices to Organize Your Angular App
Katy Slemon
 
Gatling - Bordeaux JUG
Gatling - Bordeaux JUGGatling - Bordeaux JUG
Gatling - Bordeaux JUGslandelle
 
Dive into Angular, part 5: Experience
Dive into Angular, part 5: ExperienceDive into Angular, part 5: Experience
Dive into Angular, part 5: Experience
Oleksii Prohonnyi
 
Web worker in your angular application
Web worker in your angular applicationWeb worker in your angular application
Web worker in your angular application
Suresh Patidar
 
Usable Software Design
Usable Software DesignUsable Software Design
Usable Software Design
Alexandru Bolboaca
 
Foster - Getting started with Angular
Foster - Getting started with AngularFoster - Getting started with Angular
Foster - Getting started with Angular
MukundSonaiya1
 
AngularJS in Production (CTO Forum)
AngularJS in Production (CTO Forum)AngularJS in Production (CTO Forum)
AngularJS in Production (CTO Forum)
Alex Ross
 
Introduction to AngularJS
Introduction to AngularJSIntroduction to AngularJS
Introduction to AngularJS
Shyjal Raazi
 
Introduction to AngularJs
Introduction to AngularJsIntroduction to AngularJs
Introduction to AngularJs
murtazahaveliwala
 
Dust.js
Dust.jsDust.js
Deccan ruby-conf-talk
Deccan ruby-conf-talkDeccan ruby-conf-talk
Deccan ruby-conf-talk
prchaudhari
 
Sample Project using design patterns and agile
Sample Project using design patterns and agileSample Project using design patterns and agile
Sample Project using design patterns and agile
Vicente Bolea
 
Microservice Workshop Hands On
Microservice Workshop Hands On Microservice Workshop Hands On
Microservice Workshop Hands On
Ram G Suri
 
Angular js 1.3 presentation for fed nov 2014
Angular js 1.3 presentation for fed   nov 2014Angular js 1.3 presentation for fed   nov 2014
Angular js 1.3 presentation for fed nov 2014
Sarah Hudson
 
Getting Started to take an architectural decision in AngularJs.
Getting Started to take an architectural decision in AngularJs.Getting Started to take an architectural decision in AngularJs.
Getting Started to take an architectural decision in AngularJs.
Cauê Alves
 
Thin Controllers Fat Models - How to Write Better Code
Thin Controllers Fat Models - How to Write Better CodeThin Controllers Fat Models - How to Write Better Code
Thin Controllers Fat Models - How to Write Better Code
Dr. Syed Hassan Amin
 
Developing high performance and responsive web apps using web worker
Developing high performance and responsive web apps using web workerDeveloping high performance and responsive web apps using web worker
Developing high performance and responsive web apps using web worker
Suresh Patidar
 
Angular js
Angular jsAngular js
Angular js
ymtech
 

Similar to Real World AngularJS recipes: beyond TodoMVC - Carlo Bonamico, Sonia Pini - Codemotion Rome 2015 (20)

Angular.ppt
Angular.pptAngular.ppt
Angular.ppt
 
Introduction to Angular Js
Introduction to Angular JsIntroduction to Angular Js
Introduction to Angular Js
 
Top 7 Angular Best Practices to Organize Your Angular App
Top 7 Angular Best Practices to Organize Your Angular AppTop 7 Angular Best Practices to Organize Your Angular App
Top 7 Angular Best Practices to Organize Your Angular App
 
Gatling - Bordeaux JUG
Gatling - Bordeaux JUGGatling - Bordeaux JUG
Gatling - Bordeaux JUG
 
Dive into Angular, part 5: Experience
Dive into Angular, part 5: ExperienceDive into Angular, part 5: Experience
Dive into Angular, part 5: Experience
 
Web worker in your angular application
Web worker in your angular applicationWeb worker in your angular application
Web worker in your angular application
 
Usable Software Design
Usable Software DesignUsable Software Design
Usable Software Design
 
Foster - Getting started with Angular
Foster - Getting started with AngularFoster - Getting started with Angular
Foster - Getting started with Angular
 
AngularJS in Production (CTO Forum)
AngularJS in Production (CTO Forum)AngularJS in Production (CTO Forum)
AngularJS in Production (CTO Forum)
 
Introduction to AngularJS
Introduction to AngularJSIntroduction to AngularJS
Introduction to AngularJS
 
Introduction to AngularJs
Introduction to AngularJsIntroduction to AngularJs
Introduction to AngularJs
 
Dust.js
Dust.jsDust.js
Dust.js
 
Deccan ruby-conf-talk
Deccan ruby-conf-talkDeccan ruby-conf-talk
Deccan ruby-conf-talk
 
Sample Project using design patterns and agile
Sample Project using design patterns and agileSample Project using design patterns and agile
Sample Project using design patterns and agile
 
Microservice Workshop Hands On
Microservice Workshop Hands On Microservice Workshop Hands On
Microservice Workshop Hands On
 
Angular js 1.3 presentation for fed nov 2014
Angular js 1.3 presentation for fed   nov 2014Angular js 1.3 presentation for fed   nov 2014
Angular js 1.3 presentation for fed nov 2014
 
Getting Started to take an architectural decision in AngularJs.
Getting Started to take an architectural decision in AngularJs.Getting Started to take an architectural decision in AngularJs.
Getting Started to take an architectural decision in AngularJs.
 
Thin Controllers Fat Models - How to Write Better Code
Thin Controllers Fat Models - How to Write Better CodeThin Controllers Fat Models - How to Write Better Code
Thin Controllers Fat Models - How to Write Better Code
 
Developing high performance and responsive web apps using web worker
Developing high performance and responsive web apps using web workerDeveloping high performance and responsive web apps using web worker
Developing high performance and responsive web apps using web worker
 
Angular js
Angular jsAngular js
Angular js
 

More from Codemotion

Fuzz-testing: A hacker's approach to making your code more secure | Pascal Ze...
Fuzz-testing: A hacker's approach to making your code more secure | Pascal Ze...Fuzz-testing: A hacker's approach to making your code more secure | Pascal Ze...
Fuzz-testing: A hacker's approach to making your code more secure | Pascal Ze...
Codemotion
 
Pompili - From hero to_zero: The FatalNoise neverending story
Pompili - From hero to_zero: The FatalNoise neverending storyPompili - From hero to_zero: The FatalNoise neverending story
Pompili - From hero to_zero: The FatalNoise neverending story
Codemotion
 
Pastore - Commodore 65 - La storia
Pastore - Commodore 65 - La storiaPastore - Commodore 65 - La storia
Pastore - Commodore 65 - La storia
Codemotion
 
Pennisi - Essere Richard Altwasser
Pennisi - Essere Richard AltwasserPennisi - Essere Richard Altwasser
Pennisi - Essere Richard Altwasser
Codemotion
 
Michel Schudel - Let's build a blockchain... in 40 minutes! - Codemotion Amst...
Michel Schudel - Let's build a blockchain... in 40 minutes! - Codemotion Amst...Michel Schudel - Let's build a blockchain... in 40 minutes! - Codemotion Amst...
Michel Schudel - Let's build a blockchain... in 40 minutes! - Codemotion Amst...
Codemotion
 
Richard Süselbeck - Building your own ride share app - Codemotion Amsterdam 2019
Richard Süselbeck - Building your own ride share app - Codemotion Amsterdam 2019Richard Süselbeck - Building your own ride share app - Codemotion Amsterdam 2019
Richard Süselbeck - Building your own ride share app - Codemotion Amsterdam 2019
Codemotion
 
Eward Driehuis - What we learned from 20.000 attacks - Codemotion Amsterdam 2019
Eward Driehuis - What we learned from 20.000 attacks - Codemotion Amsterdam 2019Eward Driehuis - What we learned from 20.000 attacks - Codemotion Amsterdam 2019
Eward Driehuis - What we learned from 20.000 attacks - Codemotion Amsterdam 2019
Codemotion
 
Francesco Baldassarri - Deliver Data at Scale - Codemotion Amsterdam 2019 -
Francesco Baldassarri  - Deliver Data at Scale - Codemotion Amsterdam 2019 - Francesco Baldassarri  - Deliver Data at Scale - Codemotion Amsterdam 2019 -
Francesco Baldassarri - Deliver Data at Scale - Codemotion Amsterdam 2019 -
Codemotion
 
Martin Förtsch, Thomas Endres - Stereoscopic Style Transfer AI - Codemotion A...
Martin Förtsch, Thomas Endres - Stereoscopic Style Transfer AI - Codemotion A...Martin Förtsch, Thomas Endres - Stereoscopic Style Transfer AI - Codemotion A...
Martin Förtsch, Thomas Endres - Stereoscopic Style Transfer AI - Codemotion A...
Codemotion
 
Melanie Rieback, Klaus Kursawe - Blockchain Security: Melting the "Silver Bul...
Melanie Rieback, Klaus Kursawe - Blockchain Security: Melting the "Silver Bul...Melanie Rieback, Klaus Kursawe - Blockchain Security: Melting the "Silver Bul...
Melanie Rieback, Klaus Kursawe - Blockchain Security: Melting the "Silver Bul...
Codemotion
 
Angelo van der Sijpt - How well do you know your network stack? - Codemotion ...
Angelo van der Sijpt - How well do you know your network stack? - Codemotion ...Angelo van der Sijpt - How well do you know your network stack? - Codemotion ...
Angelo van der Sijpt - How well do you know your network stack? - Codemotion ...
Codemotion
 
Lars Wolff - Performance Testing for DevOps in the Cloud - Codemotion Amsterd...
Lars Wolff - Performance Testing for DevOps in the Cloud - Codemotion Amsterd...Lars Wolff - Performance Testing for DevOps in the Cloud - Codemotion Amsterd...
Lars Wolff - Performance Testing for DevOps in the Cloud - Codemotion Amsterd...
Codemotion
 
Sascha Wolter - Conversational AI Demystified - Codemotion Amsterdam 2019
Sascha Wolter - Conversational AI Demystified - Codemotion Amsterdam 2019Sascha Wolter - Conversational AI Demystified - Codemotion Amsterdam 2019
Sascha Wolter - Conversational AI Demystified - Codemotion Amsterdam 2019
Codemotion
 
Michele Tonutti - Scaling is caring - Codemotion Amsterdam 2019
Michele Tonutti - Scaling is caring - Codemotion Amsterdam 2019Michele Tonutti - Scaling is caring - Codemotion Amsterdam 2019
Michele Tonutti - Scaling is caring - Codemotion Amsterdam 2019
Codemotion
 
Pat Hermens - From 100 to 1,000+ deployments a day - Codemotion Amsterdam 2019
Pat Hermens - From 100 to 1,000+ deployments a day - Codemotion Amsterdam 2019Pat Hermens - From 100 to 1,000+ deployments a day - Codemotion Amsterdam 2019
Pat Hermens - From 100 to 1,000+ deployments a day - Codemotion Amsterdam 2019
Codemotion
 
James Birnie - Using Many Worlds of Compute Power with Quantum - Codemotion A...
James Birnie - Using Many Worlds of Compute Power with Quantum - Codemotion A...James Birnie - Using Many Worlds of Compute Power with Quantum - Codemotion A...
James Birnie - Using Many Worlds of Compute Power with Quantum - Codemotion A...
Codemotion
 
Don Goodman-Wilson - Chinese food, motor scooters, and open source developmen...
Don Goodman-Wilson - Chinese food, motor scooters, and open source developmen...Don Goodman-Wilson - Chinese food, motor scooters, and open source developmen...
Don Goodman-Wilson - Chinese food, motor scooters, and open source developmen...
Codemotion
 
Pieter Omvlee - The story behind Sketch - Codemotion Amsterdam 2019
Pieter Omvlee - The story behind Sketch - Codemotion Amsterdam 2019Pieter Omvlee - The story behind Sketch - Codemotion Amsterdam 2019
Pieter Omvlee - The story behind Sketch - Codemotion Amsterdam 2019
Codemotion
 
Dave Farley - Taking Back “Software Engineering” - Codemotion Amsterdam 2019
Dave Farley - Taking Back “Software Engineering” - Codemotion Amsterdam 2019Dave Farley - Taking Back “Software Engineering” - Codemotion Amsterdam 2019
Dave Farley - Taking Back “Software Engineering” - Codemotion Amsterdam 2019
Codemotion
 
Joshua Hoffman - Should the CTO be Coding? - Codemotion Amsterdam 2019
Joshua Hoffman - Should the CTO be Coding? - Codemotion Amsterdam 2019Joshua Hoffman - Should the CTO be Coding? - Codemotion Amsterdam 2019
Joshua Hoffman - Should the CTO be Coding? - Codemotion Amsterdam 2019
Codemotion
 

More from Codemotion (20)

Fuzz-testing: A hacker's approach to making your code more secure | Pascal Ze...
Fuzz-testing: A hacker's approach to making your code more secure | Pascal Ze...Fuzz-testing: A hacker's approach to making your code more secure | Pascal Ze...
Fuzz-testing: A hacker's approach to making your code more secure | Pascal Ze...
 
Pompili - From hero to_zero: The FatalNoise neverending story
Pompili - From hero to_zero: The FatalNoise neverending storyPompili - From hero to_zero: The FatalNoise neverending story
Pompili - From hero to_zero: The FatalNoise neverending story
 
Pastore - Commodore 65 - La storia
Pastore - Commodore 65 - La storiaPastore - Commodore 65 - La storia
Pastore - Commodore 65 - La storia
 
Pennisi - Essere Richard Altwasser
Pennisi - Essere Richard AltwasserPennisi - Essere Richard Altwasser
Pennisi - Essere Richard Altwasser
 
Michel Schudel - Let's build a blockchain... in 40 minutes! - Codemotion Amst...
Michel Schudel - Let's build a blockchain... in 40 minutes! - Codemotion Amst...Michel Schudel - Let's build a blockchain... in 40 minutes! - Codemotion Amst...
Michel Schudel - Let's build a blockchain... in 40 minutes! - Codemotion Amst...
 
Richard Süselbeck - Building your own ride share app - Codemotion Amsterdam 2019
Richard Süselbeck - Building your own ride share app - Codemotion Amsterdam 2019Richard Süselbeck - Building your own ride share app - Codemotion Amsterdam 2019
Richard Süselbeck - Building your own ride share app - Codemotion Amsterdam 2019
 
Eward Driehuis - What we learned from 20.000 attacks - Codemotion Amsterdam 2019
Eward Driehuis - What we learned from 20.000 attacks - Codemotion Amsterdam 2019Eward Driehuis - What we learned from 20.000 attacks - Codemotion Amsterdam 2019
Eward Driehuis - What we learned from 20.000 attacks - Codemotion Amsterdam 2019
 
Francesco Baldassarri - Deliver Data at Scale - Codemotion Amsterdam 2019 -
Francesco Baldassarri  - Deliver Data at Scale - Codemotion Amsterdam 2019 - Francesco Baldassarri  - Deliver Data at Scale - Codemotion Amsterdam 2019 -
Francesco Baldassarri - Deliver Data at Scale - Codemotion Amsterdam 2019 -
 
Martin Förtsch, Thomas Endres - Stereoscopic Style Transfer AI - Codemotion A...
Martin Förtsch, Thomas Endres - Stereoscopic Style Transfer AI - Codemotion A...Martin Förtsch, Thomas Endres - Stereoscopic Style Transfer AI - Codemotion A...
Martin Förtsch, Thomas Endres - Stereoscopic Style Transfer AI - Codemotion A...
 
Melanie Rieback, Klaus Kursawe - Blockchain Security: Melting the "Silver Bul...
Melanie Rieback, Klaus Kursawe - Blockchain Security: Melting the "Silver Bul...Melanie Rieback, Klaus Kursawe - Blockchain Security: Melting the "Silver Bul...
Melanie Rieback, Klaus Kursawe - Blockchain Security: Melting the "Silver Bul...
 
Angelo van der Sijpt - How well do you know your network stack? - Codemotion ...
Angelo van der Sijpt - How well do you know your network stack? - Codemotion ...Angelo van der Sijpt - How well do you know your network stack? - Codemotion ...
Angelo van der Sijpt - How well do you know your network stack? - Codemotion ...
 
Lars Wolff - Performance Testing for DevOps in the Cloud - Codemotion Amsterd...
Lars Wolff - Performance Testing for DevOps in the Cloud - Codemotion Amsterd...Lars Wolff - Performance Testing for DevOps in the Cloud - Codemotion Amsterd...
Lars Wolff - Performance Testing for DevOps in the Cloud - Codemotion Amsterd...
 
Sascha Wolter - Conversational AI Demystified - Codemotion Amsterdam 2019
Sascha Wolter - Conversational AI Demystified - Codemotion Amsterdam 2019Sascha Wolter - Conversational AI Demystified - Codemotion Amsterdam 2019
Sascha Wolter - Conversational AI Demystified - Codemotion Amsterdam 2019
 
Michele Tonutti - Scaling is caring - Codemotion Amsterdam 2019
Michele Tonutti - Scaling is caring - Codemotion Amsterdam 2019Michele Tonutti - Scaling is caring - Codemotion Amsterdam 2019
Michele Tonutti - Scaling is caring - Codemotion Amsterdam 2019
 
Pat Hermens - From 100 to 1,000+ deployments a day - Codemotion Amsterdam 2019
Pat Hermens - From 100 to 1,000+ deployments a day - Codemotion Amsterdam 2019Pat Hermens - From 100 to 1,000+ deployments a day - Codemotion Amsterdam 2019
Pat Hermens - From 100 to 1,000+ deployments a day - Codemotion Amsterdam 2019
 
James Birnie - Using Many Worlds of Compute Power with Quantum - Codemotion A...
James Birnie - Using Many Worlds of Compute Power with Quantum - Codemotion A...James Birnie - Using Many Worlds of Compute Power with Quantum - Codemotion A...
James Birnie - Using Many Worlds of Compute Power with Quantum - Codemotion A...
 
Don Goodman-Wilson - Chinese food, motor scooters, and open source developmen...
Don Goodman-Wilson - Chinese food, motor scooters, and open source developmen...Don Goodman-Wilson - Chinese food, motor scooters, and open source developmen...
Don Goodman-Wilson - Chinese food, motor scooters, and open source developmen...
 
Pieter Omvlee - The story behind Sketch - Codemotion Amsterdam 2019
Pieter Omvlee - The story behind Sketch - Codemotion Amsterdam 2019Pieter Omvlee - The story behind Sketch - Codemotion Amsterdam 2019
Pieter Omvlee - The story behind Sketch - Codemotion Amsterdam 2019
 
Dave Farley - Taking Back “Software Engineering” - Codemotion Amsterdam 2019
Dave Farley - Taking Back “Software Engineering” - Codemotion Amsterdam 2019Dave Farley - Taking Back “Software Engineering” - Codemotion Amsterdam 2019
Dave Farley - Taking Back “Software Engineering” - Codemotion Amsterdam 2019
 
Joshua Hoffman - Should the CTO be Coding? - Codemotion Amsterdam 2019
Joshua Hoffman - Should the CTO be Coding? - Codemotion Amsterdam 2019Joshua Hoffman - Should the CTO be Coding? - Codemotion Amsterdam 2019
Joshua Hoffman - Should the CTO be Coding? - Codemotion Amsterdam 2019
 

Recently uploaded

Alt. GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using ...
Alt. GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using ...Alt. GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using ...
Alt. GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using ...
James Anderson
 
Encryption in Microsoft 365 - ExpertsLive Netherlands 2024
Encryption in Microsoft 365 - ExpertsLive Netherlands 2024Encryption in Microsoft 365 - ExpertsLive Netherlands 2024
Encryption in Microsoft 365 - ExpertsLive Netherlands 2024
Albert Hoitingh
 
Video Streaming: Then, Now, and in the Future
Video Streaming: Then, Now, and in the FutureVideo Streaming: Then, Now, and in the Future
Video Streaming: Then, Now, and in the Future
Alpen-Adria-Universität
 
Free Complete Python - A step towards Data Science
Free Complete Python - A step towards Data ScienceFree Complete Python - A step towards Data Science
Free Complete Python - A step towards Data Science
RinaMondal9
 
Securing your Kubernetes cluster_ a step-by-step guide to success !
Securing your Kubernetes cluster_ a step-by-step guide to success !Securing your Kubernetes cluster_ a step-by-step guide to success !
Securing your Kubernetes cluster_ a step-by-step guide to success !
KatiaHIMEUR1
 
Quantum Computing: Current Landscape and the Future Role of APIs
Quantum Computing: Current Landscape and the Future Role of APIsQuantum Computing: Current Landscape and the Future Role of APIs
Quantum Computing: Current Landscape and the Future Role of APIs
Vlad Stirbu
 
FIDO Alliance Osaka Seminar: Passkeys at Amazon.pdf
FIDO Alliance Osaka Seminar: Passkeys at Amazon.pdfFIDO Alliance Osaka Seminar: Passkeys at Amazon.pdf
FIDO Alliance Osaka Seminar: Passkeys at Amazon.pdf
FIDO Alliance
 
FIDO Alliance Osaka Seminar: The WebAuthn API and Discoverable Credentials.pdf
FIDO Alliance Osaka Seminar: The WebAuthn API and Discoverable Credentials.pdfFIDO Alliance Osaka Seminar: The WebAuthn API and Discoverable Credentials.pdf
FIDO Alliance Osaka Seminar: The WebAuthn API and Discoverable Credentials.pdf
FIDO Alliance
 
The Metaverse and AI: how can decision-makers harness the Metaverse for their...
The Metaverse and AI: how can decision-makers harness the Metaverse for their...The Metaverse and AI: how can decision-makers harness the Metaverse for their...
The Metaverse and AI: how can decision-makers harness the Metaverse for their...
Jen Stirrup
 
GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...
GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...
GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...
James Anderson
 
UiPath Community Day Dubai: AI at Work..
UiPath Community Day Dubai: AI at Work..UiPath Community Day Dubai: AI at Work..
UiPath Community Day Dubai: AI at Work..
UiPathCommunity
 
Dev Dives: Train smarter, not harder – active learning and UiPath LLMs for do...
Dev Dives: Train smarter, not harder – active learning and UiPath LLMs for do...Dev Dives: Train smarter, not harder – active learning and UiPath LLMs for do...
Dev Dives: Train smarter, not harder – active learning and UiPath LLMs for do...
UiPathCommunity
 
Smart TV Buyer Insights Survey 2024 by 91mobiles.pdf
Smart TV Buyer Insights Survey 2024 by 91mobiles.pdfSmart TV Buyer Insights Survey 2024 by 91mobiles.pdf
Smart TV Buyer Insights Survey 2024 by 91mobiles.pdf
91mobiles
 
Enhancing Performance with Globus and the Science DMZ
Enhancing Performance with Globus and the Science DMZEnhancing Performance with Globus and the Science DMZ
Enhancing Performance with Globus and the Science DMZ
Globus
 
PHP Frameworks: I want to break free (IPC Berlin 2024)
PHP Frameworks: I want to break free (IPC Berlin 2024)PHP Frameworks: I want to break free (IPC Berlin 2024)
PHP Frameworks: I want to break free (IPC Berlin 2024)
Ralf Eggert
 
Le nuove frontiere dell'AI nell'RPA con UiPath Autopilot™
Le nuove frontiere dell'AI nell'RPA con UiPath Autopilot™Le nuove frontiere dell'AI nell'RPA con UiPath Autopilot™
Le nuove frontiere dell'AI nell'RPA con UiPath Autopilot™
UiPathCommunity
 
Epistemic Interaction - tuning interfaces to provide information for AI support
Epistemic Interaction - tuning interfaces to provide information for AI supportEpistemic Interaction - tuning interfaces to provide information for AI support
Epistemic Interaction - tuning interfaces to provide information for AI support
Alan Dix
 
Pushing the limits of ePRTC: 100ns holdover for 100 days
Pushing the limits of ePRTC: 100ns holdover for 100 daysPushing the limits of ePRTC: 100ns holdover for 100 days
Pushing the limits of ePRTC: 100ns holdover for 100 days
Adtran
 
SAP Sapphire 2024 - ASUG301 building better apps with SAP Fiori.pdf
SAP Sapphire 2024 - ASUG301 building better apps with SAP Fiori.pdfSAP Sapphire 2024 - ASUG301 building better apps with SAP Fiori.pdf
SAP Sapphire 2024 - ASUG301 building better apps with SAP Fiori.pdf
Peter Spielvogel
 
Leading Change strategies and insights for effective change management pdf 1.pdf
Leading Change strategies and insights for effective change management pdf 1.pdfLeading Change strategies and insights for effective change management pdf 1.pdf
Leading Change strategies and insights for effective change management pdf 1.pdf
OnBoard
 

Recently uploaded (20)

Alt. GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using ...
Alt. GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using ...Alt. GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using ...
Alt. GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using ...
 
Encryption in Microsoft 365 - ExpertsLive Netherlands 2024
Encryption in Microsoft 365 - ExpertsLive Netherlands 2024Encryption in Microsoft 365 - ExpertsLive Netherlands 2024
Encryption in Microsoft 365 - ExpertsLive Netherlands 2024
 
Video Streaming: Then, Now, and in the Future
Video Streaming: Then, Now, and in the FutureVideo Streaming: Then, Now, and in the Future
Video Streaming: Then, Now, and in the Future
 
Free Complete Python - A step towards Data Science
Free Complete Python - A step towards Data ScienceFree Complete Python - A step towards Data Science
Free Complete Python - A step towards Data Science
 
Securing your Kubernetes cluster_ a step-by-step guide to success !
Securing your Kubernetes cluster_ a step-by-step guide to success !Securing your Kubernetes cluster_ a step-by-step guide to success !
Securing your Kubernetes cluster_ a step-by-step guide to success !
 
Quantum Computing: Current Landscape and the Future Role of APIs
Quantum Computing: Current Landscape and the Future Role of APIsQuantum Computing: Current Landscape and the Future Role of APIs
Quantum Computing: Current Landscape and the Future Role of APIs
 
FIDO Alliance Osaka Seminar: Passkeys at Amazon.pdf
FIDO Alliance Osaka Seminar: Passkeys at Amazon.pdfFIDO Alliance Osaka Seminar: Passkeys at Amazon.pdf
FIDO Alliance Osaka Seminar: Passkeys at Amazon.pdf
 
FIDO Alliance Osaka Seminar: The WebAuthn API and Discoverable Credentials.pdf
FIDO Alliance Osaka Seminar: The WebAuthn API and Discoverable Credentials.pdfFIDO Alliance Osaka Seminar: The WebAuthn API and Discoverable Credentials.pdf
FIDO Alliance Osaka Seminar: The WebAuthn API and Discoverable Credentials.pdf
 
The Metaverse and AI: how can decision-makers harness the Metaverse for their...
The Metaverse and AI: how can decision-makers harness the Metaverse for their...The Metaverse and AI: how can decision-makers harness the Metaverse for their...
The Metaverse and AI: how can decision-makers harness the Metaverse for their...
 
GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...
GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...
GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...
 
UiPath Community Day Dubai: AI at Work..
UiPath Community Day Dubai: AI at Work..UiPath Community Day Dubai: AI at Work..
UiPath Community Day Dubai: AI at Work..
 
Dev Dives: Train smarter, not harder – active learning and UiPath LLMs for do...
Dev Dives: Train smarter, not harder – active learning and UiPath LLMs for do...Dev Dives: Train smarter, not harder – active learning and UiPath LLMs for do...
Dev Dives: Train smarter, not harder – active learning and UiPath LLMs for do...
 
Smart TV Buyer Insights Survey 2024 by 91mobiles.pdf
Smart TV Buyer Insights Survey 2024 by 91mobiles.pdfSmart TV Buyer Insights Survey 2024 by 91mobiles.pdf
Smart TV Buyer Insights Survey 2024 by 91mobiles.pdf
 
Enhancing Performance with Globus and the Science DMZ
Enhancing Performance with Globus and the Science DMZEnhancing Performance with Globus and the Science DMZ
Enhancing Performance with Globus and the Science DMZ
 
PHP Frameworks: I want to break free (IPC Berlin 2024)
PHP Frameworks: I want to break free (IPC Berlin 2024)PHP Frameworks: I want to break free (IPC Berlin 2024)
PHP Frameworks: I want to break free (IPC Berlin 2024)
 
Le nuove frontiere dell'AI nell'RPA con UiPath Autopilot™
Le nuove frontiere dell'AI nell'RPA con UiPath Autopilot™Le nuove frontiere dell'AI nell'RPA con UiPath Autopilot™
Le nuove frontiere dell'AI nell'RPA con UiPath Autopilot™
 
Epistemic Interaction - tuning interfaces to provide information for AI support
Epistemic Interaction - tuning interfaces to provide information for AI supportEpistemic Interaction - tuning interfaces to provide information for AI support
Epistemic Interaction - tuning interfaces to provide information for AI support
 
Pushing the limits of ePRTC: 100ns holdover for 100 days
Pushing the limits of ePRTC: 100ns holdover for 100 daysPushing the limits of ePRTC: 100ns holdover for 100 days
Pushing the limits of ePRTC: 100ns holdover for 100 days
 
SAP Sapphire 2024 - ASUG301 building better apps with SAP Fiori.pdf
SAP Sapphire 2024 - ASUG301 building better apps with SAP Fiori.pdfSAP Sapphire 2024 - ASUG301 building better apps with SAP Fiori.pdf
SAP Sapphire 2024 - ASUG301 building better apps with SAP Fiori.pdf
 
Leading Change strategies and insights for effective change management pdf 1.pdf
Leading Change strategies and insights for effective change management pdf 1.pdfLeading Change strategies and insights for effective change management pdf 1.pdf
Leading Change strategies and insights for effective change management pdf 1.pdf
 

Real World AngularJS recipes: beyond TodoMVC - Carlo Bonamico, Sonia Pini - Codemotion Rome 2015

  • 1. Sonia Pini – Carlo Bonamico Real World AngularJS recipes: beyond TodoMVC sonia.pini@nispro.it - NIS s.r.l. carlo.bonamico@nispro.it - NIS s.r.l. carlo.bonamico@gmail.com – Genova Java User Group Twitter: @carlobonamico @nis_srl ROME 27-28 march 2015
  • 2. We all love TodoMVC ● Great resource – discover and approach new front-end technologies http://todomvc.com/examples/angularjs    ● You got captured by Angular power and simplicity – have chosen it for your next project – or thinking about it
  • 3. While in the “Write App” step... ● But it's difficult! ● Angular is not suited to production, then? ● What's the matter? http://www.bennadel.com/
  • 4. Data Binding is just the beginning It doesn’t just magically generate maintainable and extensible apps ● How to design and implement a robust HTML5 SPA? {{ iceberg.tip }} Modules test Routing directives
  • 5. The questions we all ask... ● Which language do we use? ● How do we split the app in modules? ● How do we organize our App's structure? ● Do I really need to learn directives? ● How do we package our App for development and production? ● How do we test our App? – this talk shares practical recipes from our real world Angular development experience
  • 6. Which language do I use? But don't you just need to use plain javascript?
  • 7. ES5 vs ES6 vs TypeScript ● First of all: know your JavaScript (ES5) – do not use it like Java / C#! – learn variable scopes, closures, object-based inheritance, idioms – some starting points at the end ● JS is not the only choice: – ES6 – the future of Web – TypeScript – typed superset of ES5 → ES6 ● Angular 2.0 will fully support ES5 – But will make even more things for you in ES6 and TS ● error detection, IDE support, easier Dependency Injection Angular 2.0 friendly
  • 8. Examples ● ES6 - Controller ● TypeScript - Controller
  • 9. How do we split the app in modules?
  • 10. Modularization guidelines Modularity is the separation of a system’s into a set of logically indipendent pieces Common design principles a module should follow: ● High Cohesion - Single Responsibility Principle (SOLID Principle) ● Low Coupling - low dependency ● See also R.Martin's Principles of Package Design – CCP The Common Closure Principle ● Classes that change together are packaged together – CRP The Common Reuse Principle ● Classes that are used together are packaged together – And more http://butunclebob.com/ArticleS.UncleBob.PrinciplesOfOod
  • 11. How do we can map functionalities into Angular Modules?
  • 12. Modularity – Style Guide ● Separate Module in category as described in John Papa’s AngularJs Styleguide – Reusable Blocks - common service e.g. exception handling, logging, security – Feature Modules - app specific features – App Module - thin module used for pulling together the application Webmail App Logging Auth UI Widgets Message  List  Reader Message  Composer Contacts
  • 13. How do we arrange source code?
  • 14. Typical Hello World folder Structure A directory for each type of object app/ ----- controllers/ ---------- main.controller.js ---------- other.controller.js ----- directives/ ---------- main.directive.js ---------- other.directive.js ----- services/ ---------- user.service.js ---------- item.service.js ----- js/ ---------- bootstrap.js ---------- jquery.js ----- app.js views/ ----- mainView.html ----- otherView.html ----- index.html Finding files and debugging becomes difficult as the application grows in size
  • 15. Modular Structure ● Feature-based – a module / folder for each feature or macro-component app/ ----- app.module.js ----- app.config.js ----- components/ ---------- calendar.directive.js ---------- calendar.directive.html ---------- user-profile.directive.js ---------- user-profile.directive.html ----- people ---------- people.module.js ---------- people.config.js ---------- attendees.html ---------- attendees.controller.js ---------- attendees.controller.spec.js ---------- speakers.html ---------- speakers.controller.js ---------- speakers.controller.spec.js ----- services/ Features are the high- level section of the application, often corresponding to top- level routes
  • 16. What is the right size of controllers?
  • 17. Controller Granularity: from this Image courtesy of Todd Motto's very interesting tutorial https://www.thinkful.com/learn/angularjs-tutorial-build-a-gmail-clone     WebMailController
  • 19. Controller tips ● Controllers should be as small as possible – used just to prepare the model and react to user inputs – avoid DOM manipulation ● Prefer the new Controller As syntax <div ng­controller=”MsgController as msgCtrl”> {{msgCtrl.message.subject}} function MsgController()  //no $scope! { this.message = { subject : “Hello World” }; } Easier to test, maintain, Reduces code duplication (DRY) Angular 2.0 friendly
  • 20. How can many small Controllers / Components interact?
  • 21. Collaborating Controllers – Through the Scope hierarchy ● Child controller reads/write its parent scope (or vice-versa) ● ONLY suited for controllers of tightly coupled parts ● Avoid if possible – Through a common Service ● Best used within a module – MessageListController   MessageListService→ – NavigationController   MessageListService→ – Through events ● Best used across modules or independent functionalities ● e.g. from in Contact module choose one from list $broadcast(“composeEmail”,          {action: “compose”, to: currentContact}) ● Message Composer module listens and creates a new mail – $on(“composeEmail”, function (event) {...})
  • 22. Do I really need to write Directives?
  • 23. Directive Roles ● Directives (together with Dependency Injection) are the key to Angular powers – initial learning step but definitely worth doing! ● First concept: directive have different roles – Element → creates a new tag <my­autocomplete> – Decorator → adds behaviour to an existing tag ng­hide – Template → manipulate the page structure ng­repeat ● Containers are a special type of template <my­panel>  ● There are standard “recipes” and tips for each role – See http://ng-book.com Will be explicit in Angular 2.0
  • 24. Directive tips ● Progressively implement a hierarchy of Directives – Utility directives – show­tooltip­on=”warning” – Ui elements <contact­autocomplete></contact­autocomplete> – Reusable Components ● Tip – learn transclusion! – <message­composer message=”newMessage”                    on­send=”wmCtrl.sent()”> <my­custom­message­action­bar></...> – </message­composer> – Macro-component (optional, but...)
  • 25. Thinking in Components: from this      ng­controller=”WebMailController” ng­controller=”MessageListController” MessageList.html Ng­controller = ”FolderList Controller” MsgAction Controller
  • 26. Thinking in Components – more references on how to do this at the end <message­list><folder­list> <message­actions> <message­details> <message­search­box> Angular 2.0 Friendly !!
  • 27. So we are done now :-) let's just copy the folder in our production web server...
  • 28. Some things are missing! ● Security ● Logging ● Packaging and Optimizations ● Testing
  • 29. Authentication & Authorization ● Traditional Request-Response web applications (think JSP, ASP, PHP) typically use – cookies with session ID – session data on the server – login opens a new session on the server ● You can technically do this in a Single Page App – but not a good match to REST (stateless) services ● Use Token-based authentication – and remember to check access permissions in the REST endpoints!
  • 30. JWT - http://jwt.io/ ● JWT = encoded & signed Json object containing – Access token – Signed Claims (customizable!) ● Username ● Expiration ● Returned by login REST service ● Sent as header at each request – Authentication: bearer eyJhbGciO.eyJzdWIiOWV9.eoaDV ● Checked by REST backed at each request – can also be used with websockets ● Angular Library https://github.com/auth0/angular­jwt  {   “user”: “sonia”,    “company”: “NIS”  } + HMACSHA256
  • 31. Logging ● If you move a significant part of your app to the client side, you need to know what's happening – are there errors? ● Our approach: – intercept all exception on the client ● $exceptionHandler service – represent exception as event JSON object { event: “exception”, date: …, message: , severity: } – LogService which sends events to REST endpoint ● Can also be used to collect and send metrics to the server
  • 32. Packaging: different needs Development Time ● Live reload ● No caching ● No minify for debug ● A file for each class/controller/service ● Mock REST services Production Time ● Image Optimizations ● CSS Optimizations ● Minify ● A few files to speed up download ● Real REST services
  • 33. Solution: use workflow tools ● Gulp – http://gulpjs.com/ ● Grut – http://gruntjs.com/ ● Tips – Use workflow tool from the beginning – Generators helps you to kickstart new App ● Customize the result following your needs – http://yeoman.io/ – We use – https://github.com/Swiip/generator­gulp­angular 
  • 34. But do I need to test my app? Testing is nice – BDD even more in theory, but... Testing web / Javascript applications is difficult...
  • 35. Testing Angular Apps is easier ● Unit test = Karma & Jasmine – it isn't a waste of time → has saved us HOURS – use dump(var) instead of console.log(var) – use mocking – angular­mocks.js ● Integration test – test controllers with services – use mock of backend ● $httpBackend 
  • 36. Testing Angular Apps is easier ● Functional / E2E Test = Protractor – emulates user actions / search elements in the page – special Angular support ● Automatically waits for async actions & match by model
  • 37. BDD with Protractor + Cucumber ● Acceptance Test → Focus on the Customer – sit down with your customers – describe the feature in natural language and review it – use the result as blueprint to guide your development
  • 38. Page Object ● Using Page Objects to organize tests – encapsulate information about your page structure – reusable across multiple tests – if the template of your App changes, you only need to update the Page Object
  • 39. Test pyramid vs cupcake http://martinfowler.com/bliki/TestPyramid.html
  • 40. References ● StyleGuide – https://github.com/johnpapa/angular­styleguide  ● SOLID Principles – http://butunclebob.com/ArticleS.UncleBob.PrinciplesOf Ood ● Javascript by Yakov Fain – http://enterprisewebbook.com/appendix_a_advancedjs.html – https://www.youtube.com/watch?v=X1J0oMayvC0 ● Axel Rauschmayer Speaking Javascript – http://speakingjs.com/  ● TypeScript – http://www.typescriptlang.org/ ● ES6 – http://www.2ality.com/2014/08/es6­today.html
  • 41. References ● Component based directives – http://tech.opentable.com/2015/02/10/reusable­components­an gular/ – https://leanpub.com/web­component­development­with­angularj s/read ● Angular 2.0 – http://angular.io/ ● NG-Conf 2015 Playlist – https://www.youtube.com/playlist?list=PLOETEcp3DkCoNnlhE­7f ovYvqwVPrRiY7 ● Cucumber ● https://cukes.info/  ● https://github.com/cucumber/cucumber­js 
  • 42. Thank you! ● Other presentations – http://www.slideshare.net/carlo.bonamico/presentations ● Follow us on Twitter – @carlobonamico @nis_srl ● updates on AngularJS! ● and some Docker, Ansible, Continuous Delivery ● Contact us – carlo.bonamico@gmail.com / carlo.bonamico@nispro.it – Sonia.pini@nispro.it ● Our company – http://www.nispro.it Leave your feedback on Joind.in! https://joind.in/event/view/3347