##Web App Tools ###Server Provisioning Solutions: Vagrant
###Virtualization Solutions: VirtualBox, Docker, Parallels, VMWare
###Continuous Integration Solutions: Jenkins, Travis, Codeship
##Directory Structure
|--test/ | |--spec/ | | |--test.js |--public/ | |--scripts/ | | |--project_name/ | | | |--models/ | | | |--views/
| <!doctype html> | |
| <html> | |
| <head> | |
| <!-- Run in full-screen mode. --> | |
| <meta name="apple-mobile-web-app-capable" content="yes"> | |
| <!-- Make the status bar black with white text. --> | |
| <meta name="apple-mobile-web-app-status-bar-style" content="black"> |
| function loadScript(url, callback){ | |
| var script = document.createElement("script"); | |
| script.type = "text/javascript"; | |
| if (script.readyState) { // IE | |
| script.onreadystatechange = function () { | |
| if (script.readyState == "loaded" || script.readyState == "complete"){ | |
| script.onreadystatechange = null; | |
| callback(); | |
| } |
| var CompositeView = Marionette.CompositeView.extend({ | |
| _initialEvents: function(){ | |
| this._isLoading = true; | |
| if (this.collection){ | |
| this.listenTo(this.collection, "add", this.addChildView); | |
| this.listenTo(this.collection, "remove", this.removeItemView); | |
| this.listenTo(this.collection, "reset", this.render); | |
| this.listenTo(this.collection, "sync", function () { | |
| this._isLoading = false; | |
| }); |
function Person(name) {| <!-- For iPad with high-resolution Retina display running iOS ≥ 7: --> | |
| <link rel="apple-touch-icon-precomposed" sizes="152x152" href="apple-touch-icon-152x152-precomposed.png"> | |
| <!-- For iPad with high-resolution Retina display running iOS ≤ 6: --> | |
| <link rel="apple-touch-icon-precomposed" sizes="144x144" href="apple-touch-icon-144x144-precomposed.png"> | |
| <!-- For iPhone with high-resolution Retina display running iOS ≥ 7: --> | |
| <link rel="apple-touch-icon-precomposed" sizes="120x120" href="apple-touch-icon-120x120-precomposed.png"> | |
| <!-- For iPhone with high-resolution Retina display running iOS ≤ 6: --> | |
| <link rel="apple-touch-icon-precomposed" sizes="114x114" href="apple-touch-icon-114x114-precomposed.png"> | |
| <!-- For the iPad mini and the first- and second-generation iPad on iOS ≥ 7: --> | |
| <link rel="apple-touch-icon-precomposed" sizes="76x76" href="apple-touch-icon-76x76-precomposed.png"> |
| { | |
| "version": "0.2.0", | |
| "configurations": [ | |
| { | |
| "type": "node", | |
| "request": "launch", | |
| "name": "Launch Dev Server", | |
| "runtimeExecutable": "npm", | |
| "runtimeArgs": [ | |
| "run-script", |
| { | |
| "version": "0.2.0", | |
| "configurations": [ | |
| { | |
| "name": "Launch Chrome", | |
| "type": "chrome", | |
| "request": "launch", | |
| "url": "http://localhost:3000", | |
| "webRoot": "${workspaceFolder}/src", | |
| "preLaunchTask": "start", |
| import querystring from 'querystring'; | |
| import { RSAA } from 'redux-api-middleware'; | |
| function queryKey(obj) { | |
| const ordered = {}; | |
| Object.keys(obj).sort().forEach(function(key) { | |
| ordered[key] = obj[key]; | |
| }); |