SlideShare a Scribd company logo
Get Grulping with JavaScript Task Runners
Matt Gifford
@coldfumonkeh
monkehworks.com
OBLIGATORY QUOTE
FROM HISTORICAL FIGURE
COMING UP
“life is really simple,
but we insist on making
it complicated”
Confucius
WTF?
IT HURTS
almost all quality improvement comes via
simplification of design, manufacturing, layout,
processes and procedures.
Tom Peters
almost all quality improvement comes via
simplification of design, manufacturing, layout,
processes and procedures.
Tom Peters
Get Grulping with Javascript task runners
Get Grulping with Javascript task runners
Get Grulping with Javascript task runners
http://nodejs.org
Get Grulping with Javascript task runners
https://github.com/tvooo/sublime-grunt
http://gruntjs.com
@gruntjs
0.4.x
http://gruntjs.com/plugins
4,403
as of 22:00pm 14th May 2015
package.json
Gruntfile.js
YOU NEED
Get Grulping with Javascript task runners
$
This utility will walk you through creating a
package.json file.
It only covers the most common items,
and tries to guess sane defaults.
Press ^C at any time to quit.
name: (grunt_project)
version: (0.0.0)
grunting_away
description:
entry point: (index.js)
test command:
npm init
.... etc
0.0.1
package.json
{
"name": "grunting_away",
"version": "0.0.1",
"description": "",
"main": "index.js",
"author": "Matt Gifford",
"license": "ISC"
}
package.json
{
"name": "grunting_away",
"version": "0.0.1"
}
INSTALLING GRUNT
$ npm install < whatever the module name is >
Use npm to install the required modules
You may need sudo or Administrative rights
INSTALLING GRUNT
Grunt 0.3 requires a global install of the library
Grunt 0.4 changed... a lot (for the better)
Now has the ability to run different local versions
$ npm install grunt-cli -g
-g installs the CLI package globally. Good times
INSTALLING GRUNT
We have the global CLI. Now we need a local Grunt
$ npm install grunt --save-dev
$
grunt-cli v0.1.13
grunt --version
grunt v0.4.5
package.json
{
"name": "grunting_away",
"version": "0.0.1",
"devDependencies": {
"grunt": "^0.4.5"
}
}
{
}
"devDependencies": {
"grunt": "^0.4.5"
}
package.json
Gruntfile.js
Lives in the root directory of your project
Commit it into your source control repo!
Holds your task configurations
Can be written as Gruntfile.coffee
(if that floats your boat)
Gruntfile.js
module.exports = function(grunt) {
grunt.initConfig({
// Pure awesomeness will live here
});
};
VERSION CONTROL
| -- package.json
| -- Gruntfile.js
commit these and share the wealth
TEAM GRUNTING
$ npm install
THE CODE BASE
| -- javascripts
-- main.js
-- formControls.js
| -- stylesheets
-- form.css
-- main.css
can be managed more effectively
CSS CONCATENATION
$ npm install grunt-contrib-concat --save-dev
package.json
{
"name"
"version"
"devDependencies"
}
}
"grunt-contrib-concat": "^0.4.0"
Gruntfile.js
module.exports = function(grunt) {
grunt.initConfig({
// Pure awesomeness will live here
});
grunt.loadNpmTasks('grunt-contrib-concat');
};
Gruntfile.js
grunt.initConfig({
concat : {
css: {
files: {
'stylesheets/engage.css' :
['stylesheets/*.css']
}
}
}
});
Gruntfile.js
grunt.initConfig({
concat : {
css: {
files: {
'stylesheets/engage.css' :
[
'stylesheets/main.css',
'stylesheets/form.css'
]
}
}
}
});
$ grunt concat
Running "concat:css" (concat) task
File stylesheets/engage.css created.
Done, without errors.
$ grunt concat:css
Running "concat:css" (concat) task
File stylesheets/engage.css created.
Done, without errors.
THE CODE BASE
| -- stylesheets
-- engage.css
-- form.css
-- main.css
new file generated by Grunt
Gruntfile.js
grunt.initConfig({
options: {
banner: '/* Combined CSS file */n'
},
options: {
banner: '/* Combined CSS file */n'
},
Gruntfile.js
grunt.initConfig({
pkg: grunt.file.readJSON(
concat : {
css: {
/* snip */
pkg: grunt.file.readJSON('package.json'),
options: {
banner: '/* <%= pkg.name %> combined file
generated @
<%= grunt.template.today("dd-mm-yyyy") %> */n'
},
Get Grulping with Javascript task runners
CSS MINIFICATION
$ npm install grunt-contrib-cssmin --save-dev
package.json
{
"name"
"version"
"devDependencies"
}
}
"grunt-contrib-cssmin": "^0.9.0"
Gruntfile.js
module.
grunt.initConfig({
});
grunt.loadNpmTasks(
grunt.loadNpmTasks(
};
grunt.loadNpmTasks('grunt-contrib-cssmin');
Gruntfile.js
grunt.initConfig({
/* snip */
css: {
files: {
'stylesheets/engage.min.css'
[ 'stylesheets/engage.css'
}
}
},
});
cssmin: {
css: {
files: {
'stylesheets/engage.min.css' :
[ 'stylesheets/engage.css' ]
}
}
},
$ grunt cssmin
Running "cssmin:css" (cssmin) task
File stylesheets/engage.min.css created:
29.73 kB → 23.62 kB
Done, without errors.
THE CODE BASE
| -- stylesheets
-- engage.css
-- engage.min.css
-- form.css
minified file
-- main.css
Get Grulping with Javascript task runners
CACHE BUSTING
$ npm install grunt-rev --save-dev
Gruntfile.js
grunt.loadNpmTasks('grunt-rev');
rev: {
css: {
files: {
src: ['stylesheets/engage.min.css']
}
}
},
$ grunt rev:css
Running "rev:css" (rev) task
stylesheets/engage.min.css >> 73a5cf64.engage.min.css
Done, without errors.
THE CODE BASE
| -- stylesheets
-- 73a5cf64.engage.min.css
-- engage.css
-- engage.min.css
-- form.css
-- main.css
hashed minified file
THE CODE BASE
| -- stylesheets
-- 73a5cf64.engage.min.css
-- engage.css
-- engage.min.css
-- form.css
-- main.css
we don’t need these
CLEAN UP OPERATION
$ npm install grunt-contrib-clean --save-dev
Gruntfile.js
grunt.loadNpmTasks('grunt-contrib-clean');
clean: {
combinedcss: {
src: ['stylesheets/engage.css']
},
mincss: {
src: ['stylesheets/engage.min.css']
},
revcss: {
src: ['stylesheets/*engage.min.css']
}
},
TOO MANY TASKS
We already have a load of tasks to run
What happens when we need to run them all?
Type each command out?
simplification of processes and procedures
REMEMBER
Gruntfile.js
grunt.registerTask('css',
[
'clean:revcss',
'concat:css',
'cssmin:css',
'clean:combinedcss',
'rev:css',
'clean:mincss'
]);
$ grunt css
Running "clean:revcss" (clean) task
Cleaning stylesheets/73a5cf64.engage.min.css...OK
Running "concat:css" (concat) task
File stylesheets/engage.css created.
Running "cssmin:css" (cssmin) task
File stylesheets/engage.min.css created: 29.73 kB → 23.62 kB
Running "clean:combinedcss" (clean) task
Cleaning stylesheets/engage.css...OK
Running "rev:css" (rev) task
stylesheets/engage.min.css >> 73a5cf64.engage.min.css
Running "clean:mincss" (clean) task
Done, without errors.
THE CODE BASE
| -- stylesheets
-- 73a5cf64.engage.min.css
-- form.css
-- main.css
WATCHING..
.ALWAYS
WATCHING
WATCHING FOR FILE
CHANGES
$ npm install grunt-contrib-watch --save-dev
Gruntfile.js
grunt.loadNpmTasks('grunt-contrib-watch');
watch: {
css: {
files: [
'stylesheets/form.css',
'stylesheets/main.css'
],
tasks: ['css']
}
},
Gruntfile.js
grunt.registerTask('default', ['watch']);
$ grunt
Running "watch" task
Waiting...
Running "clean:revcss" (clean) task
Cleaning stylesheets/73a5cf64.engage.min.css...OK
Running "concat:css" (concat) task
File stylesheets/engage.css created.
Running "cssmin:css" (cssmin) task
File stylesheets/engage.min.css created: 29.73 kB → 23.62 kB
Running "clean:combinedcss" (clean) task
Cleaning stylesheets/engage.css...OK
Running "rev:css" (rev) task
stylesheets/engage.min.css >> 73a5cf64.engage.min.css
Running "clean:mincss" (clean) task
Done, without errors.
Completed in 0.485s at Mon Jun 02 2014 02:26:21 GMT+0100 (BST) - Waiting...
>> File "stylesheets/main.css" changed.
THE CODE BASE
| -- javascripts
-- main.js
-- formControls.js
JAVASCRIPT MANAGEMENT
$ npm install grunt-contrib-jshint --save-dev
$ npm install grunt-contrib-uglify --save-dev
$ npm install grunt-remove-logging --save-dev
GRUNTFILE.JS
grunt.loadNpmTasks('grunt-contrib-jshint');
jshint: {
options: {
curly: true,
eqeqeq: true,
eqnull: true,
browser: true,
globals: {
jQuery: true
},
},
all: ['Gruntfile.js','javascripts/main.js']
},
GRUNTFILE.JS
grunt.loadNpmTasks('grunt-contrib-uglify');
uglify : {
js: {
files: {
'javascripts/engage.min.js' :
[ 'javascripts/main.js' ]
}
}
},
GRUNTFILE.JS
grunt.loadNpmTasks('grunt-remove-logging');
removelogging: {
dist: {
src: 'javascripts/engage.min.js',
dest: 'javascripts/engage.min.js'
}
},
GRUNTFILE.JS
rev: {
css: {
files: {
src: ['stylesheets/engage.min.css']
}
},
js: {
files: {
src: ['javascripts/engage.min.js']
}
}
},
GRUNTFILE.JS
rev: {
css: {
files: {
src: [
},
js: {
src: [
},
js: {
files: {
src: ['javascripts/engage.min.js']
}
}
simplification of processes and procedures
REMEMBER
GRUNTFILE.JS
grunt.registerTask('js',
[
'jshint',
'clean:jsrev',
'uglify:js',
'removelogging',
'rev:js',
'clean:minjs'
]);
GRUNTFILE.JS
watch: {
js: {
files: ['javascripts/main.js'],
tasks: ['js']
},
css: {
files: [
'stylesheets/form.css',
'stylesheets/main.css'
],
tasks: ['css']
}
},
GRUNTFILE.JS
watch: {
js: {
files: [
tasks: [
},
js: {
files: ['javascripts/main.js'],
tasks: ['js']
}
$ grunt
Running "watch" task
Waiting...
Running "jshint:all" (jshint) task
javascripts/main.js
1 |console.log('monkeh love is good love')
^ Missing semicolon.
>> 1 error in 2 files
Warning: Task "jshint:all" failed. Use --force to continue.
Aborted due to warnings.
Completed in 2.090s at Mon Jun 02 2014 03:13:55 GMT+0100 (BST) - Waiting...
>> File "javascripts/main.js" changed.
$ grunt
Running "watch" task
Waiting...
Running "jshint:all" (jshint) task
>> 2 files lint free.
Running "clean:jsrev" (clean) task
Cleaning javascripts/engage.min.js...OK
Running "uglify:js" (uglify) task
File javascripts/engage.min.js created: 21 B → 21 B
Running "removelogging:dist" (removelogging) task
Removed 1 logging statements from javascripts/engage.min.js
Running "rev:js" (rev) task
javascripts/engage.min.js >> 0c115107.engage.min.js
Running "clean:minjs" (clean) task
Done, without errors.
Completed in 0.721s at Mon Jun 02 2014 03:14:05 GMT+0100 (BST) - Waiting...
>> File "javascripts/main.js" changed.
RELOADING YOUR APP
PERFORMING HTTP
REQUESTS
$ npm install grunt-http --save-dev
Gruntfile.js
grunt.loadNpmTasks('grunt-http');
http: {
reload: {
options: {
url: 'http://127.0.0.1:8000/index.cfm?reload=true'
}
}
},
Gruntfile.js
grunt.initConfig({
pkg: grunt.file.readJSON(
local_settings: {
local_url:
},
...
http: {
reload: {
options: {
url: '<%= local_settings.local_url %>'
}
}
},
local_settings: {
local_url: ''
},
Gruntfile.js
grunt.registerTask('default', ['checklocalconf']);
Gruntfile.js
grunt.registerTask('checklocalconf', 'Check if the local config JSON file exists', function(arg) {
if(grunt.file.exists('grunt_local_settings.json')) {
grunt.task.run('watch');
} else {
grunt.log.errorlns('');
grunt.log.errorlns('The grunt_local_settings.json file does not appear to exist.');
grunt.log.errorlns('');
grunt.log.errorlns('{');
grunt.log.errorlns(' "local_url": "http://your_local_server/?reload"');
grunt.log.errorlns('}');
grunt.log.errorlns('');
grunt.fail.fatal('Please create and save the grunt_local_settings.json file.');
};
});
Gruntfile.js
grunt.registerTask('http_watcher',
'Set the local url before running the watch command',
function() {
var jsonLocalSettings = grunt.file.readJSON("grunt_local_settings.json");
grunt.config.set('local_settings', jsonLocalSettings);
grunt.config.requires('local_settings');
grunt.task.run('http:reload');
});
Gruntfile.js
watch: {
js: {
files: [
tasks: [
},
css: {
files: [
'stylesheets/form.css'
'stylesheets/main.css'
],
tasks: [
},
cfcs: {
files: [
tasks: [
}
},
cfcs: {
files: ['cfcs/*.cfc'],
tasks: ['http_watcher']
}
$ grunt
Running "checklocalconf" task
Waiting...
>>
>> The grunt_local_settings.json file does not appear to exist.
>> Please create it in this directory with the following content (the URL
>> for your local app with reload action):
>>
>> {
>> "local_url": "http://your_local_server/?reload"
>> }
>>
Fatal error: Please create and save the grunt_local_settings.json file then
re-run this command.
$ grunt
Running "checklocalconf" task
Running "watch" task
Waiting...
Running "http_watcher" task
Running "http:reload" (http) task
>> 200
Done, without errors.
Completed in 2.061s at Tue Jun 03 2014 12:01:44 GMT+0100 (BST) - Waiting...
>> File "cfcs/test.cfc" changed.
$ npm install grunt-injector --save-dev
INJECTING ASSETS
Gruntfile.js
grunt.loadNpmTasks('grunt-injector');
injector: {
options: {},
css: {
files: {
'layout.cfm': ['stylesheets/*engage.min.css'],
}
},
js: {
files: {
'layout.cfm': ['javascripts/*engage.min.js'],
}
}
}
Get Grulping with Javascript task runners
Gruntfile.js
grunt.registerTask(
[
'clean:revcss'
'concat:css'
'cssmin:css'
'clean:combinedcss'
'rev:css'
'clean:mincss'
]);
'injector:css'
Get Grulping with Javascript task runners
TIDY UP
There are no limits to the number
of plugins you can use
Your Gruntfile could get messy quickly
You may also be duplicating file paths a lot
Gruntfile.js
grunt.loadNpmTasks('grunt-contrib-clean');
grunt.loadNpmTasks('grunt-contrib-concat');
grunt.loadNpmTasks('grunt-contrib-csslint');
grunt.loadNpmTasks('grunt-contrib-cssmin');
grunt.loadNpmTasks('grunt-http');
grunt.loadNpmTasks('grunt-injector');
grunt.loadNpmTasks('grunt-contrib-jshint');
grunt.loadNpmTasks('grunt-contrib-uglify');
grunt.loadNpmTasks('grunt-contrib-watch');
grunt.loadNpmTasks('grunt-remove-logging');
grunt.loadNpmTasks('grunt-rev');
grunt.loadNpmTasks('grunt-notify');
TIDY UP
$ npm install matchdep --save-dev
Gruntfile.js
require('matchdep')
.filterDev('grunt-*')
.forEach(grunt.loadNpmTasks);
ASSIGN VARIABLES
Use the variable system to reduce duplicate text
Gruntfile.js
grunt.initConfig({
pkg: grunt.file.readJSON('package.json'),
minCSS: 'stylesheets/engage.min.css',
});
cssmin: {
css: {
files: {
'<%= minCSS %>' : [ 'stylesheets/engage.css' ]
}
}
},
clean: {
mincss: {
src: ['<%= minCSS %>']
}
}
WHAT ELSE CAN IT DO?
image optimisation and resizing
git integration
run unit tests (e.g. Jasmine)
templating
...
WHAT ELSE CAN IT DO?
pretty much anything you want it to
http://gruntjs.com/plugins
Get Grulping with Javascript task runners
http://gulpjs.com
@gulpjs
http://gulpjs.com/plugins/
1583
as of 22:00pm 14th May 2015
INSTALLING GULP
As a system wide module
$ npm install gulp -g
INSTALLING GULP
$ npm install gulp --save-dev
Getting a local gulp version for the project
gulpfile.js
Lives in the root directory of your project
Commit it into your source control repo!
Holds your task configurations
Lowercase file name!
gulpfile.js
// Include gulp
var gulp = require('gulp');
gulp.task('default', function() {
// place code for your default task here
});
PIPES AND
STREAMS
GRUNT
GULP
gulpfile.js
// Include gulp
var gulp = require('gulp');
// Include Our Plugins
var jshint = require('gulp-jshint');
var concat = require('gulp-concat');
var uglify = require('gulp-uglify');
var rename = require('gulp-rename');
var header = require('gulp-header');
gulpfile.js
// Default Task
gulp.task('default', ['watch']);
// Watch Files For Changes
gulp.task('watch', function() {
gulp.watch('js/*.js', ['lint', 'scripts']);
});
gulpfile.js
// Lint Task
gulp.task('lint', function() {
return gulp.src('js/*.js')
.pipe(jshint())
.pipe(jshint.reporter('default'));
});
gulpfile.js
// Concatenate & Minify JS
gulp.task('scripts', function() {
var headerValue = "Evaluated by gulp.n";
return gulp.src('js/*.js')
.pipe(concat('combined.js'))
.pipe(header(headerValue))
.pipe(gulp.dest('dist'))
.pipe(rename('combined.min.js'))
.pipe(uglify())
.pipe(header(headerValue))
.pipe(gulp.dest('dist'));
});
http://gulpfiction.divshot.io
Get Grulping with Javascript task runners
Get Grulping with Javascript task runners
Streaming and piping give speed enhancements
Code over configuration
Still early adoption - plugins limited
JS / Node exposure beneficial (?)
Sub tasks easily managed
Impressive number of plugins and extensions
I/O issues and speed (in comparison)
Configuration could get messy
ITS NOT A CONTEST
HAPPY
Save your config files (repo)
Use skeleton variation across your projects
FINAL WORDS
Create
Employ
Refine
Relax
Has the potential to be addictive
Check for updates and improved methods
Use your time wisely
FINAL WORDS
Get Grulping with Javascript task runners
Get Grulping with Javascript task runners
Get Grulping with Javascript task runners
Get Grulping with Javascript task runners
Thank you!
Matt Gifford
@coldfumonkeh
monkehworks.com

More Related Content

PDF
Get Grulping with JavaScript Task Runners
PDF
Get Grulping with JavaScript Task Runners (Matt Gifford)
PDF
Let Grunt do the work, focus on the fun! [Open Web Camp 2013]
PDF
Front-end tools
PDF
Big query - Command line tools and Tips - (MOSG)
PPTX
The world of gradle - an introduction for developers
PDF
Let Grunt do the work, focus on the fun!
PDF
Introduction to Express and Grunt
Get Grulping with JavaScript Task Runners
Get Grulping with JavaScript Task Runners (Matt Gifford)
Let Grunt do the work, focus on the fun! [Open Web Camp 2013]
Front-end tools
Big query - Command line tools and Tips - (MOSG)
The world of gradle - an introduction for developers
Let Grunt do the work, focus on the fun!
Introduction to Express and Grunt

What's hot (18)

PDF
Icinga2 Hacking Session 2014-10-10
PDF
Gradle build tool that rocks with DSL JavaOne India 4th May 2012
PDF
Zero Downtime Deployment with Ansible
PDF
Zero Downtime Deployment with Ansible
PDF
Understanding the Node.js Platform
PDF
[Image Results] Java Build Tools: Part 2 - A Decision Maker's Guide Compariso...
PDF
Into The Box 2018 Going live with commandbox and docker
PDF
Docker Demo @ IuK Seminar
PDF
Grunt & Front-end Workflow
PPTX
Grunt and Bower
PDF
From Dev to DevOps
PDF
Design & Performance - Steve Souders at Fastly Altitude 2015
PDF
Jenkins and Groovy
PDF
Gradle Introduction
PDF
Puppeteer can automate that! - Frontmania
ODP
Gradle - time for another build
PDF
MeaNstack on Docker
PDF
Get Ahead with HTML5 on Moible
Icinga2 Hacking Session 2014-10-10
Gradle build tool that rocks with DSL JavaOne India 4th May 2012
Zero Downtime Deployment with Ansible
Zero Downtime Deployment with Ansible
Understanding the Node.js Platform
[Image Results] Java Build Tools: Part 2 - A Decision Maker's Guide Compariso...
Into The Box 2018 Going live with commandbox and docker
Docker Demo @ IuK Seminar
Grunt & Front-end Workflow
Grunt and Bower
From Dev to DevOps
Design & Performance - Steve Souders at Fastly Altitude 2015
Jenkins and Groovy
Gradle Introduction
Puppeteer can automate that! - Frontmania
Gradle - time for another build
MeaNstack on Docker
Get Ahead with HTML5 on Moible
Ad

Viewers also liked (20)

PDF
Dependency Injection: Why is awesome and why should I care?
PPTX
My SQL Skills Killed the Server
PDF
Refactor Large apps with Backbone
PDF
Marketing for developers tim cunningham
PDF
Paying off emotional debt
PDF
Our application got popular and now it breaks
PDF
Authentication Control
PDF
Building Multi-Tenant SaaS Apps
PDF
Api management from the Trenches
PDF
Building software products in a weekend
PPTX
Preso slidedeck
PDF
Rethink Async with RXJS
PDF
I'm a Team Lead Now What?
PDF
Garbage First and You!
PDF
Command box
PDF
I am-designer
PDF
React & The Art of Managing Complexity
PDF
How we REST
PDF
Effective version control
PDF
Front end-modernization
Dependency Injection: Why is awesome and why should I care?
My SQL Skills Killed the Server
Refactor Large apps with Backbone
Marketing for developers tim cunningham
Paying off emotional debt
Our application got popular and now it breaks
Authentication Control
Building Multi-Tenant SaaS Apps
Api management from the Trenches
Building software products in a weekend
Preso slidedeck
Rethink Async with RXJS
I'm a Team Lead Now What?
Garbage First and You!
Command box
I am-designer
React & The Art of Managing Complexity
How we REST
Effective version control
Front end-modernization
Ad

Similar to Get Grulping with Javascript task runners (20)

PDF
Automating Front-End Workflow
PDF
What makes me "Grunt"?
PDF
The Fairy Tale of the One Command Build Script
PPTX
Single Page JavaScript WebApps... A Gradle Story
PPTX
Dev ops meetup
PPTX
Job DSL Plugin for Jenkins
PPTX
Grunt Continuous Development of the Front End Tier
PPTX
Grunt to automate JS build
PPTX
Moving from Jenkins 1 to 2 declarative pipeline adventures
PDF
Grunt All Day
PDF
Take control of your Jenkins jobs via job DSL.
PDF
Building Performance - ein Frontend-Build-Prozess für Java mit Maven
PDF
PDF
Antons Kranga Building Agile Infrastructures
PDF
Continuous Integration Testing in Django
PPTX
Frontend Workflow
PDF
Grunt.js and Yeoman, Continous Integration
PDF
Gradleintroduction 111010130329-phpapp01
KEY
Railsconf2011 deployment tips_for_slideshare
PDF
Scott Jehl - Delivering Responsibly - beyond tellerrand Düsseldorf 2015
Automating Front-End Workflow
What makes me "Grunt"?
The Fairy Tale of the One Command Build Script
Single Page JavaScript WebApps... A Gradle Story
Dev ops meetup
Job DSL Plugin for Jenkins
Grunt Continuous Development of the Front End Tier
Grunt to automate JS build
Moving from Jenkins 1 to 2 declarative pipeline adventures
Grunt All Day
Take control of your Jenkins jobs via job DSL.
Building Performance - ein Frontend-Build-Prozess für Java mit Maven
Antons Kranga Building Agile Infrastructures
Continuous Integration Testing in Django
Frontend Workflow
Grunt.js and Yeoman, Continous Integration
Gradleintroduction 111010130329-phpapp01
Railsconf2011 deployment tips_for_slideshare
Scott Jehl - Delivering Responsibly - beyond tellerrand Düsseldorf 2015

More from devObjective (15)

PDF
Lets git together
PDF
Raspberry Pi a la CFML
PDF
Using type script to build better apps
PDF
Csp and http headers
PDF
Who owns Software Security
PDF
Naked and afraid Offline mobile
PDF
Web hackingtools 2015
PDF
Node without servers aws-lambda
PDF
Fusion Reactor
PDF
Multiply like rabbits with rabbit mq
PDF
Intro to TDD & BDD
PDF
Hey! My website is slow where is the problem?
PDF
Adaptive Development in a Creative World
PDF
How do I write testable javascript?
PDF
The Future of CSS with Web components
Lets git together
Raspberry Pi a la CFML
Using type script to build better apps
Csp and http headers
Who owns Software Security
Naked and afraid Offline mobile
Web hackingtools 2015
Node without servers aws-lambda
Fusion Reactor
Multiply like rabbits with rabbit mq
Intro to TDD & BDD
Hey! My website is slow where is the problem?
Adaptive Development in a Creative World
How do I write testable javascript?
The Future of CSS with Web components

Recently uploaded (20)

PDF
Empathic Computing: Creating Shared Understanding
PPTX
A Presentation on Artificial Intelligence
PDF
Agricultural_Statistics_at_a_Glance_2022_0.pdf
PPTX
Big Data Technologies - Introduction.pptx
PDF
Diabetes mellitus diagnosis method based random forest with bat algorithm
PPTX
20250228 LYD VKU AI Blended-Learning.pptx
PDF
Approach and Philosophy of On baking technology
PDF
cuic standard and advanced reporting.pdf
PDF
Encapsulation_ Review paper, used for researhc scholars
PDF
gpt5_lecture_notes_comprehensive_20250812015547.pdf
PDF
A comparative analysis of optical character recognition models for extracting...
PDF
Getting Started with Data Integration: FME Form 101
PDF
Assigned Numbers - 2025 - Bluetooth® Document
PDF
Profit Center Accounting in SAP S/4HANA, S4F28 Col11
PDF
Unlocking AI with Model Context Protocol (MCP)
PDF
Mobile App Security Testing_ A Comprehensive Guide.pdf
PDF
Spectral efficient network and resource selection model in 5G networks
PDF
NewMind AI Weekly Chronicles - August'25-Week II
PPTX
SOPHOS-XG Firewall Administrator PPT.pptx
PPTX
Group 1 Presentation -Planning and Decision Making .pptx
Empathic Computing: Creating Shared Understanding
A Presentation on Artificial Intelligence
Agricultural_Statistics_at_a_Glance_2022_0.pdf
Big Data Technologies - Introduction.pptx
Diabetes mellitus diagnosis method based random forest with bat algorithm
20250228 LYD VKU AI Blended-Learning.pptx
Approach and Philosophy of On baking technology
cuic standard and advanced reporting.pdf
Encapsulation_ Review paper, used for researhc scholars
gpt5_lecture_notes_comprehensive_20250812015547.pdf
A comparative analysis of optical character recognition models for extracting...
Getting Started with Data Integration: FME Form 101
Assigned Numbers - 2025 - Bluetooth® Document
Profit Center Accounting in SAP S/4HANA, S4F28 Col11
Unlocking AI with Model Context Protocol (MCP)
Mobile App Security Testing_ A Comprehensive Guide.pdf
Spectral efficient network and resource selection model in 5G networks
NewMind AI Weekly Chronicles - August'25-Week II
SOPHOS-XG Firewall Administrator PPT.pptx
Group 1 Presentation -Planning and Decision Making .pptx

Get Grulping with Javascript task runners