SlideShare a Scribd company logo
1 of 129
Download to read offline
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
http://nodejs.org
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
$
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'
},
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
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'],
}
}
}
Gruntfile.js
grunt.registerTask(
[
'clean:revcss'
'concat:css'
'cssmin:css'
'clean:combinedcss'
'rev:css'
'clean:mincss'
]);
'injector:css'
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
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
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
Thank you!
Matt Gifford
@coldfumonkeh
monkehworks.com

More Related Content

What's hot

Icinga2 Hacking Session 2014-10-10
Icinga2 Hacking Session 2014-10-10Icinga2 Hacking Session 2014-10-10
Icinga2 Hacking Session 2014-10-10Icinga
 
Gradle build tool that rocks with DSL JavaOne India 4th May 2012
Gradle build tool that rocks with DSL JavaOne India 4th May 2012Gradle build tool that rocks with DSL JavaOne India 4th May 2012
Gradle build tool that rocks with DSL JavaOne India 4th May 2012Rajmahendra Hegde
 
Zero Downtime Deployment with Ansible
Zero Downtime Deployment with AnsibleZero Downtime Deployment with Ansible
Zero Downtime Deployment with AnsibleStein Inge Morisbak
 
Zero Downtime Deployment with Ansible
Zero Downtime Deployment with AnsibleZero Downtime Deployment with Ansible
Zero Downtime Deployment with AnsibleStein Inge Morisbak
 
Understanding the Node.js Platform
Understanding the Node.js PlatformUnderstanding the Node.js Platform
Understanding the Node.js PlatformDomenic Denicola
 
[Image Results] Java Build Tools: Part 2 - A Decision Maker's Guide Compariso...
[Image Results] Java Build Tools: Part 2 - A Decision Maker's Guide Compariso...[Image Results] Java Build Tools: Part 2 - A Decision Maker's Guide Compariso...
[Image Results] Java Build Tools: Part 2 - A Decision Maker's Guide Compariso...ZeroTurnaround
 
Into The Box 2018 Going live with commandbox and docker
Into The Box 2018 Going live with commandbox and dockerInto The Box 2018 Going live with commandbox and docker
Into The Box 2018 Going live with commandbox and dockerOrtus Solutions, Corp
 
Docker Demo @ IuK Seminar
Docker Demo @ IuK SeminarDocker Demo @ IuK Seminar
Docker Demo @ IuK SeminarMartin Scharm
 
Grunt & Front-end Workflow
Grunt & Front-end WorkflowGrunt & Front-end Workflow
Grunt & Front-end WorkflowPagepro
 
From Dev to DevOps
From Dev to DevOpsFrom Dev to DevOps
From Dev to DevOpsAgile Spain
 
Design & Performance - Steve Souders at Fastly Altitude 2015
Design & Performance - Steve Souders at Fastly Altitude 2015Design & Performance - Steve Souders at Fastly Altitude 2015
Design & Performance - Steve Souders at Fastly Altitude 2015Fastly
 
Jenkins and Groovy
Jenkins and GroovyJenkins and Groovy
Jenkins and GroovyKiyotaka Oku
 
Puppeteer can automate that! - Frontmania
Puppeteer can automate that! - FrontmaniaPuppeteer can automate that! - Frontmania
Puppeteer can automate that! - FrontmaniaÖnder Ceylan
 
Gradle - time for another build
Gradle - time for another buildGradle - time for another build
Gradle - time for another buildIgor Khotin
 
MeaNstack on Docker
MeaNstack on DockerMeaNstack on Docker
MeaNstack on DockerDaniel Ku
 
Get Ahead with HTML5 on Moible
Get Ahead with HTML5 on MoibleGet Ahead with HTML5 on Moible
Get Ahead with HTML5 on Moiblemarkuskobler
 

What's hot (18)

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

Viewers also liked

Dependency Injection: Why is awesome and why should I care?
Dependency Injection: Why is awesome and why should I care?Dependency Injection: Why is awesome and why should I care?
Dependency Injection: Why is awesome and why should I care?devObjective
 
My SQL Skills Killed the Server
My SQL Skills Killed the ServerMy SQL Skills Killed the Server
My SQL Skills Killed the ServerdevObjective
 
Refactor Large apps with Backbone
Refactor Large apps with BackboneRefactor Large apps with Backbone
Refactor Large apps with BackbonedevObjective
 
Marketing for developers tim cunningham
Marketing for developers tim cunninghamMarketing for developers tim cunningham
Marketing for developers tim cunninghamdevObjective
 
Paying off emotional debt
Paying off emotional debtPaying off emotional debt
Paying off emotional debtdevObjective
 
Our application got popular and now it breaks
Our application got popular and now it breaksOur application got popular and now it breaks
Our application got popular and now it breaksdevObjective
 
Authentication Control
Authentication ControlAuthentication Control
Authentication ControldevObjective
 
Building Multi-Tenant SaaS Apps
Building Multi-Tenant SaaS AppsBuilding Multi-Tenant SaaS Apps
Building Multi-Tenant SaaS AppsdevObjective
 
Api management from the Trenches
Api management from the TrenchesApi management from the Trenches
Api management from the TrenchesdevObjective
 
Building software products in a weekend
Building software products in a weekendBuilding software products in a weekend
Building software products in a weekenddevObjective
 
Rethink Async with RXJS
Rethink Async with RXJSRethink Async with RXJS
Rethink Async with RXJSdevObjective
 
I'm a Team Lead Now What?
I'm a Team Lead Now What?I'm a Team Lead Now What?
I'm a Team Lead Now What?devObjective
 
Garbage First and You!
Garbage First and You!Garbage First and You!
Garbage First and You!devObjective
 
React & The Art of Managing Complexity
React &  The Art of Managing ComplexityReact &  The Art of Managing Complexity
React & The Art of Managing ComplexityRyan Anklam
 
Effective version control
Effective version controlEffective version control
Effective version controldevObjective
 
Front end-modernization
Front end-modernizationFront end-modernization
Front end-modernizationdevObjective
 

Viewers also liked (20)

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

Similar to Get Grulping with Javascript task runners

Automating Front-End Workflow
Automating Front-End WorkflowAutomating Front-End Workflow
Automating Front-End WorkflowDimitris Tsironis
 
What makes me "Grunt"?
What makes me "Grunt"? What makes me "Grunt"?
What makes me "Grunt"? Fabien Doiron
 
The Fairy Tale of the One Command Build Script
The Fairy Tale of the One Command Build ScriptThe Fairy Tale of the One Command Build Script
The Fairy Tale of the One Command Build ScriptDocker, Inc.
 
Single Page JavaScript WebApps... A Gradle Story
Single Page JavaScript WebApps... A Gradle StorySingle Page JavaScript WebApps... A Gradle Story
Single Page JavaScript WebApps... A Gradle StoryKon Soulianidis
 
Grunt Continuous Development of the Front End Tier
Grunt Continuous Development of the Front End TierGrunt Continuous Development of the Front End Tier
Grunt Continuous Development of the Front End TierErick Brito
 
Moving from Jenkins 1 to 2 declarative pipeline adventures
Moving from Jenkins 1 to 2 declarative pipeline adventuresMoving from Jenkins 1 to 2 declarative pipeline adventures
Moving from Jenkins 1 to 2 declarative pipeline adventuresFrits Van Der Holst
 
Take control of your Jenkins jobs via job DSL.
Take control of your Jenkins jobs via job DSL.Take control of your Jenkins jobs via job DSL.
Take control of your Jenkins jobs via job DSL.Łukasz Proszek
 
Building Performance - ein Frontend-Build-Prozess für Java mit Maven
Building Performance - ein Frontend-Build-Prozess für Java mit MavenBuilding Performance - ein Frontend-Build-Prozess für Java mit Maven
Building Performance - ein Frontend-Build-Prozess für Java mit MavenOliver Ochs
 
Antons Kranga Building Agile Infrastructures
Antons Kranga   Building Agile InfrastructuresAntons Kranga   Building Agile Infrastructures
Antons Kranga Building Agile InfrastructuresAntons Kranga
 
Continuous Integration Testing in Django
Continuous Integration Testing in DjangoContinuous Integration Testing in Django
Continuous Integration Testing in DjangoKevin Harvey
 
Frontend Workflow
Frontend WorkflowFrontend Workflow
Frontend WorkflowDelphiCon
 
Grunt.js and Yeoman, Continous Integration
Grunt.js and Yeoman, Continous IntegrationGrunt.js and Yeoman, Continous Integration
Grunt.js and Yeoman, Continous IntegrationDavid Amend
 
Gradleintroduction 111010130329-phpapp01
Gradleintroduction 111010130329-phpapp01Gradleintroduction 111010130329-phpapp01
Gradleintroduction 111010130329-phpapp01Tino Isnich
 
Railsconf2011 deployment tips_for_slideshare
Railsconf2011 deployment tips_for_slideshareRailsconf2011 deployment tips_for_slideshare
Railsconf2011 deployment tips_for_slidesharetomcopeland
 
Scott Jehl - Delivering Responsibly - beyond tellerrand Düsseldorf 2015
Scott Jehl - Delivering Responsibly - beyond tellerrand Düsseldorf 2015Scott Jehl - Delivering Responsibly - beyond tellerrand Düsseldorf 2015
Scott Jehl - Delivering Responsibly - beyond tellerrand Düsseldorf 2015beyond tellerrand
 

Similar to Get Grulping with Javascript task runners (20)

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

More from devObjective

Raspberry Pi a la CFML
Raspberry Pi a la CFMLRaspberry Pi a la CFML
Raspberry Pi a la CFMLdevObjective
 
Using type script to build better apps
Using type script to build better appsUsing type script to build better apps
Using type script to build better appsdevObjective
 
Csp and http headers
Csp and http headersCsp and http headers
Csp and http headersdevObjective
 
Who owns Software Security
Who owns Software SecurityWho owns Software Security
Who owns Software SecuritydevObjective
 
Naked and afraid Offline mobile
Naked and afraid Offline mobileNaked and afraid Offline mobile
Naked and afraid Offline mobiledevObjective
 
Web hackingtools 2015
Web hackingtools 2015Web hackingtools 2015
Web hackingtools 2015devObjective
 
Node without servers aws-lambda
Node without servers aws-lambdaNode without servers aws-lambda
Node without servers aws-lambdadevObjective
 
Multiply like rabbits with rabbit mq
Multiply like rabbits with rabbit mqMultiply like rabbits with rabbit mq
Multiply like rabbits with rabbit mqdevObjective
 
Intro to TDD & BDD
Intro to TDD & BDDIntro to TDD & BDD
Intro to TDD & BDDdevObjective
 
Hey! My website is slow where is the problem?
Hey! My website is slow where is the problem?Hey! My website is slow where is the problem?
Hey! My website is slow where is the problem?devObjective
 
Adaptive Development in a Creative World
Adaptive Development in a Creative WorldAdaptive Development in a Creative World
Adaptive Development in a Creative WorlddevObjective
 
How do I write testable javascript?
How do I write testable javascript?How do I write testable javascript?
How do I write testable javascript?devObjective
 
The Future of CSS with Web components
The Future of CSS with Web componentsThe Future of CSS with Web components
The Future of CSS with Web componentsdevObjective
 

More from devObjective (15)

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

Recently uploaded

Swan(sea) Song – personal research during my six years at Swansea ... and bey...
Swan(sea) Song – personal research during my six years at Swansea ... and bey...Swan(sea) Song – personal research during my six years at Swansea ... and bey...
Swan(sea) Song – personal research during my six years at Swansea ... and bey...Alan Dix
 
Snow Chain-Integrated Tire for a Safe Drive on Winter Roads
Snow Chain-Integrated Tire for a Safe Drive on Winter RoadsSnow Chain-Integrated Tire for a Safe Drive on Winter Roads
Snow Chain-Integrated Tire for a Safe Drive on Winter RoadsHyundai Motor Group
 
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...shyamraj55
 
Enhancing Worker Digital Experience: A Hands-on Workshop for Partners
Enhancing Worker Digital Experience: A Hands-on Workshop for PartnersEnhancing Worker Digital Experience: A Hands-on Workshop for Partners
Enhancing Worker Digital Experience: A Hands-on Workshop for PartnersThousandEyes
 
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...Neo4j
 
Hyderabad Call Girls Khairatabad ✨ 7001305949 ✨ Cheap Price Your Budget
Hyderabad Call Girls Khairatabad ✨ 7001305949 ✨ Cheap Price Your BudgetHyderabad Call Girls Khairatabad ✨ 7001305949 ✨ Cheap Price Your Budget
Hyderabad Call Girls Khairatabad ✨ 7001305949 ✨ Cheap Price Your BudgetEnjoy Anytime
 
SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024Scott Keck-Warren
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking MenDelhi Call girls
 
Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreterPresentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreternaman860154
 
How to Remove Document Management Hurdles with X-Docs?
How to Remove Document Management Hurdles with X-Docs?How to Remove Document Management Hurdles with X-Docs?
How to Remove Document Management Hurdles with X-Docs?XfilesPro
 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking MenDelhi Call girls
 
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure serviceWhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure servicePooja Nehwal
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking MenDelhi Call girls
 
Pigging Solutions Piggable Sweeping Elbows
Pigging Solutions Piggable Sweeping ElbowsPigging Solutions Piggable Sweeping Elbows
Pigging Solutions Piggable Sweeping ElbowsPigging Solutions
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonetsnaman860154
 
Key Features Of Token Development (1).pptx
Key  Features Of Token  Development (1).pptxKey  Features Of Token  Development (1).pptx
Key Features Of Token Development (1).pptxLBM Solutions
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationMichael W. Hawkins
 
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticsKotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticscarlostorres15106
 
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Patryk Bandurski
 
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...HostedbyConfluent
 

Recently uploaded (20)

Swan(sea) Song – personal research during my six years at Swansea ... and bey...
Swan(sea) Song – personal research during my six years at Swansea ... and bey...Swan(sea) Song – personal research during my six years at Swansea ... and bey...
Swan(sea) Song – personal research during my six years at Swansea ... and bey...
 
Snow Chain-Integrated Tire for a Safe Drive on Winter Roads
Snow Chain-Integrated Tire for a Safe Drive on Winter RoadsSnow Chain-Integrated Tire for a Safe Drive on Winter Roads
Snow Chain-Integrated Tire for a Safe Drive on Winter Roads
 
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
 
Enhancing Worker Digital Experience: A Hands-on Workshop for Partners
Enhancing Worker Digital Experience: A Hands-on Workshop for PartnersEnhancing Worker Digital Experience: A Hands-on Workshop for Partners
Enhancing Worker Digital Experience: A Hands-on Workshop for Partners
 
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
 
Hyderabad Call Girls Khairatabad ✨ 7001305949 ✨ Cheap Price Your Budget
Hyderabad Call Girls Khairatabad ✨ 7001305949 ✨ Cheap Price Your BudgetHyderabad Call Girls Khairatabad ✨ 7001305949 ✨ Cheap Price Your Budget
Hyderabad Call Girls Khairatabad ✨ 7001305949 ✨ Cheap Price Your Budget
 
SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men
 
Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreterPresentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreter
 
How to Remove Document Management Hurdles with X-Docs?
How to Remove Document Management Hurdles with X-Docs?How to Remove Document Management Hurdles with X-Docs?
How to Remove Document Management Hurdles with X-Docs?
 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men
 
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure serviceWhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
 
Pigging Solutions Piggable Sweeping Elbows
Pigging Solutions Piggable Sweeping ElbowsPigging Solutions Piggable Sweeping Elbows
Pigging Solutions Piggable Sweeping Elbows
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonets
 
Key Features Of Token Development (1).pptx
Key  Features Of Token  Development (1).pptxKey  Features Of Token  Development (1).pptx
Key Features Of Token Development (1).pptx
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day Presentation
 
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticsKotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
 
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
 
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
 

Get Grulping with Javascript task runners