SlideShare uma empresa Scribd logo
1 de 145
Baixar para ler offline
OFFLINE WEB COM 
SERVICE WORKERS
sergiolopes.org 
@sergio_caelum
WEB. OFFLINE?
os primórdios do HTML5 offline 
Application Cache API
Minha página offline… 
<html manifest="demo.appcache">
O manifesto… 
CACHE MANIFEST 
/index.html 
/imagens/logo.png 
/javascript/script.js 
/css/estilo.css
O manifesto… 
CACHE MANIFEST 
/index.html 
/imagens/logo.png 
/javascript/script.js 
/css/estilo.css 
NETWORK: 
http://www.google-analytics.com/ga.js
O manifesto… 
CACHE MANIFEST 
/index.html 
/imagens/logo.png 
/javascript/script.js 
/css/estilo.css 
NETWORK: 
http://www.google-analytics.com/ga.js 
FALLBACK: 
/img/avatares/ /img/avatar-generico.png
Pronto! 
O maravilhoso AppCache entra em ação.
Tem que acertar o mime-type no servidor.
Tem que acertar o mime-type no servidor. 
Não posso esquecer nenhuma URL.
Tem que acertar o mime-type no servidor. 
Não posso esquecer nenhuma URL. 
Sempre cacheia a página.
Tem que acertar o mime-type no servidor. 
Não posso esquecer nenhuma URL. 
Sempre cacheia a página. 
Nada pode dar erro 404 ou 500.
Tem que acertar o mime-type no servidor. 
Não posso esquecer nenhuma URL. 
Sempre cacheia a página. 
Nada pode dar erro 404 ou 500. 
Cuidado pra não cachear o manifesto.
Tem que acertar o mime-type no servidor. 
Não posso esquecer nenhuma URL. 
Sempre cacheia a página. 
Nada pode dar erro 404 ou 500. 
Cuidado pra não cachear o manifesto. 
Usuário não pode controlar nada.
Tem que acertar o mime-type no servidor. 
Não posso esquecer nenhuma URL. 
Sempre cacheia a página. 
Nada pode dar erro 404 ou 500. 
Cuidado pra não cachear o manifesto. 
Usuário não pode controlar nada. 
Impossível escolher o que cachear.
Tem que acertar o mime-type no servidor. 
Não posso esquecer nenhuma URL. 
Sempre cacheia a página. 
Nada pode dar erro 404 ou 500. 
Cuidado pra não cachear o manifesto. 
Usuário não pode controlar nada. 
Impossível escolher o que cachear. 
Potencial para detonar o 3G do usuário.
Tem que acertar o mime-type no servidor. 
Não posso esquecer nenhuma URL. 
Sempre cacheia a página. 
Nada pode dar erro 404 ou 500. 
Cuidado pra não cachear o manifesto. 
Usuário não pode controlar nada. 
Impossível escolher o que cachear. 
Potencial para detonar o 3G do usuário. 
Remover o cache é um parto.
Tem que acertar o mime-type no servidor. 
Não posso esquecer nenhuma URL. 
Sempre cacheia a página. 
Nada pode dar erro 404 ou 500. 
Cuidado pra não cachear o manifesto. 
Usuário não pode controlar nada. 
Impossível escolher o que cachear. 
Potencial para detonar o 3G do usuário. 
Remover o cache é um parto. 
Não posso impedir update automático.
Tem que acertar o mime-type no servidor. 
Não posso esquecer nenhuma URL. 
Sempre cacheia a página. 
Nada pode dar erro 404 ou 500. 
Cuidado pra não cachear o manifesto. 
Usuário não pode controlar nada. 
Impossível escolher o que cachear. 
Potencial para detonar o 3G do usuário. 
Remover o cache é um parto. 
Não posso impedir update automático. 
Terrível pra desenvolver e debugar.
Tem que acertar o mime-type no servidor. 
Não posso esquecer nenhuma URL. 
Sempre cacheia a página. 
Nada pode dar erro 404 ou 500. 
Cuidado pra não cachear o manifesto. 
Usuário não pode controlar nada. 
Impossível escolher o que cachear. 
Potencial para detonar o 3G do usuário. 
Remover o cache é um parto. 
Não posso impedir update automático. 
Terrível pra desenvolver e debugar. …
Tem que acertar o mime-type no servidor. 
Não posso esquecer nenhuma URL. 
Sempre cacheia AppCache a página. 
é 
Nada pode dar erro limitado 404 ou 500. 
e 
Cuidado pra não cachear o manifesto. 
Usuário não pode controlar nada. 
Impossível chato, escolher complicado. 
o que cachear. 
Potencial para detonar o 3G do usuário. 
Remover o cache é um parto. 
Não posso impedir update automático. 
Terrível pra desenvolver e debugar. …
http://sergiolopes.org/palestra-appcache-html5-offline/
Declarativo e Mágico.
SERVICE 
WORKERS
<!DOCTYPE html> 
<html> 
<head> 
</head> 
<body> 
<h1>Página offline</h1> 
</body> 
</html>
<!DOCTYPE html> 
<html> 
<head> 
<script> 
navigator.serviceWorker.register('o-futuro.js'); 
</script> 
</head> 
<body> 
<h1>Página offline</h1> 
</body> 
</html>
this.onfetch = function(event) { 
console.log(event.request.url); 
};
this.onfetch = function(event) { 
event.respondWith( 
new Response("<h1>Página offline!</h1>") 
); 
};
SERVICE 
WORKER 
É um Worker orientado a eventos, que controla as 
páginas em background. Lá, tudo é assíncrono, e 
ele pode interceptar chamadas de rede e usar um 
cache de recursos.
JAVASCRIPT COMUM 
<script src="script.js" async></script>
JAVASCRIPT COMUM 
<script src="script.js" async></script> 
DOM 
CSSOM 
LAYOUT 
EVENTOS 
SCROLL
JAVASCRIPT COMUM 
<script src="script.js" async></script> 
DOM 
script 
CSSOM 
script 
LAYOUT 
script 
EVENTOS 
script 
SCROLL
WEB WORKERS 
<script> new Worker('worker.js'); </script>
WEB WORKERS 
<script> new Worker('worker.js'); </script> 
DOM 
CSSOM 
LAYOUT 
EVENTOS 
SCROLL
WEB WORKERS 
<script> new Worker('worker.js'); </script> 
script 
script 
script 
script 
DOM 
CSSOM 
LAYOUT 
EVENTOS 
SCROLL
WEB WORKERS 
PÁGINA 
#1
PÁGINA 
#1 
web worker A 
WEB WORKERS
PÁGINA 
#1 
web worker A 
WEB WORKERS 
web worker B
PÁGINA 
#1 
web worker A 
WEB WORKERS 
web worker B 
PÁGINA 
#2 
web worker A 
web worker B
WEB WORKERS 
PÁGINA 
#2 
web worker A 
web worker B
WEB WORKERS
<script>navigator.serviceWorker.register('sw.js');</PÁGINA 
#1 
Service Worker 
PÁGINA 
#2 
PÁGINA 
#3 
SERVICE WORKER
SERVICE WORKER 
<script>navigator.serviceWorker.register('sw.js');</PÁGINA 
#1 
Service Worker 
PÁGINA 
#2
SERVICE WORKER 
<script>navigator.serviceWorker.register('sw.js');</PÁGINA 
#1 
Service Worker
SERVICE WORKER 
<script>navigator.serviceWorker.register('sw.js');</Service Worker
SERVICE 
WORKER 
É um Worker orientado a eventos, que controla as 
páginas em background. Lá, tudo é assíncrono, e 
ele pode interceptar chamadas de rede e usar um 
cache de recursos.
PROMISES 
navigator.serviceWorker.register('sw.js').then(function(){ 
console.log('Registrado!'); 
}, function(erro) { 
console.log('Problemas', erro); 
});
EVENTOS 
this.oninstall = function(event) { 
console.log('instalou'); 
}; 
this.onactivate = function(event) { 
console.log('ativou'); 
}; 
this.onfetch = function(event) { 
event.respondWith( 
new Response("<h1>Página offline!</h1>”) 
); 
};
CACHE API
caches.open('aplicacao');
caches.open('aplicacao').then(function(cache) { 
});
caches.open('aplicacao').then(function(cache) { 
cache.add('pg.html'); 
});
caches.open('aplicacao').then(function(cache) { 
cache.put('pg.html', new Response("Página offline")); 
});
caches.open('aplicacao').then(function(cache) { 
cache.add('pg.html'); 
cache.add('style.css'); 
});
caches.open('aplicacao').then(function(cache) { 
cache.addAll([ 
'/index.html', 
'/style.css', 
'/logo.png', 
'/contato.html', 
'http://code.jquery.com/jquery-2.1.1.min.js' 
]); 
})
caches.open('aplicacao').then(function(cache) { 
return cache.addAll([ 
'/index.html', 
'/style.css', 
'/logo.png', 
'/contato.html', 
'http://code.jquery.com/jquery-2.1.1.min.js' 
]); 
})
this.oninstall = function(event) { 
caches.open('aplicacao').then(function(cache) { 
return cache.addAll([ 
'/index.html', 
'/style.css', 
'/logo.png', 
'/contato.html', 
'http://code.jquery.com/jquery-2.1.1.min.js' 
]); 
}) 
};
this.oninstall = function(event) { 
event.waitUntil( 
caches.open('aplicacao').then(function(cache) { 
return cache.addAll([ 
'/index.html', 
'/style.css', 
'/logo.png', 
'/contato.html', 
'http://code.jquery.com/jquery-2.1.1.min.js' 
]); 
}) 
); 
};
CACHE 
programático & controlável
CACHE 
programático & controlável 
Cacheio URLs como quero.
CACHE 
programático & controlável 
Cacheio URLs como quero. 
Gero endereços num for com certa regra.
CACHE 
programático & controlável 
Cacheio URLs como quero. 
Gero endereços num for com certa regra. 
Recursos diferentes dependendo do browser.
CACHE 
programático & controlável 
Cacheio URLs como quero. 
Gero endereços num for com certa regra. 
Recursos diferentes dependendo do browser. 
Levo em conta alguma preferência do usuário.
CACHE 
programático & controlável 
Cacheio URLs como quero. 
Gero endereços num for com certa regra. 
Recursos diferentes dependendo do browser. 
Levo em conta alguma preferência do usuário. 
Mudo de acordo com hardware e contexto.
RESPOSTA OFFLINE
this.onfetch = function(event) { 
console.log(event.request.url); 
};
this.onfetch = function(event) { 
event.respondWith( 
new Response(‘conteúdo!') 
); 
};
this.onfetch = function(event) { 
event.respondWith( 
caches.match(event.request) 
); 
};
RESPOSTA DO CACHE
RESPOSTA DO CACHE 
E se não existir?
this.onfetch = function(event) { 
event.respondWith( 
caches.match(event.request).then(function(response){ 
}) 
); 
};
this.onfetch = function(event) { 
event.respondWith( 
caches.match(event.request).then(function(response){ 
return response || event.default(); 
}) 
); 
};
BAIXA NA REDE
BAIXA NA REDE 
E se estiver offline?
this.onfetch = function(event) { 
event.respondWith( 
caches.match(event.request).then(function(response){ 
return response || event.default(); 
}).catch(function() { 
return caches.match('/contato.html'); 
}) 
); 
};
FALLBACK DE URLs
RESPOSTA 
programática & controlável
RESPOSTA 
programática & controlável 
Busco no cache.
RESPOSTA 
programática & controlável 
Busco no cache. 
Busco na rede.
RESPOSTA 
programática & controlável 
Busco no cache. 
Busco na rede. 
Devolvo fallback.
RESPOSTA 
programática & controlável 
Busco no cache. 
Busco na rede. 
Devolvo fallback. 
Construo resposta na mão.
RESPOSTA 
programática & controlável 
Busco no cache. 
Busco na rede. 
Devolvo fallback. 
Construo resposta na mão. 
Tudo com a lógica e a sequência que eu quiser.
ATUALIZAÇÕES
Mudo o worker.js
Mudo o worker.js 
Detecta na próxima navegação.
Mudo o worker.js 
Detecta na próxima navegação. 
Dispara instalação (oninstall) em background.
Mudo o worker.js 
Detecta na próxima navegação. 
Dispara instalação (oninstall) em background. 
(worker original ainda comanda a página)
Mudo o worker.js 
Detecta na próxima navegação. 
Dispara instalação (oninstall) em background. 
(worker original ainda comanda a página) 
Fecho a página.
Mudo o worker.js 
Detecta na próxima navegação. 
Dispara instalação (oninstall) em background. 
(worker original ainda comanda a página) 
Fecho a página. 
Worker velho é desativado.
Mudo o worker.js 
Detecta na próxima navegação. 
Dispara instalação (oninstall) em background. 
(worker original ainda comanda a página) 
Fecho a página. 
Worker velho é desativado. 
Novo worker é ativado (onactivate).
Mudo o worker.js 
Detecta na próxima navegação. 
Dispara instalação (oninstall) em background. 
(worker original ainda comanda a página) 
Fecho a página. 
Worker velho é desativado. 
Novo worker é ativado (onactivate). 
(novo worker em ação)
Mudo o worker.js 
Detecta na próxima navegação. 
Dispara instalação (oninstall) em background. 
(worker original ainda comanda a página) 
Fecho a página. 
Worker velho é desativado. 
Novo worker é ativado (onactivate). 
(novo worker em ação) 
Abro a página de novo.
this.oninstall = function(event) { 
event.waitUntil( 
caches.open('aplicacao-v2').then(function(cache) return cache.addAll([ 
'/index.html', 
'/style.css', 
'/logo.png', 
'/contato.html', 
'http://code.jquery.com/jquery-2.1.1.min.js' 
]); 
}) 
); 
};
this.onactivate = function(event) { 
event.waitUntil( 
caches.delete('aplicacao-v1') 
); 
};
ATUALIZAÇÃO
ATUALIZAÇÃO 
Totalmente em background.
ATUALIZAÇÃO 
Totalmente em background. 
Não incomoda o usuário.
ATUALIZAÇÃO 
Totalmente em background. 
Não incomoda o usuário. 
Só troca no próximo acesso.
ATUALIZAÇÃO 
Totalmente em background. 
Não incomoda o usuário. 
Só troca no próximo acesso. 
Chrome-like.
detalhes dos 
SERVICE 
WORKERS
controle de escopo
navigator.serviceWorker.register('worker.js');
navigator.serviceWorker.register('worker.js', { 
scope: '/blog/' 
});
HTTPS only
tudo assíncrono
pode ser morto a 
qualquer momento
muito mais poderoso 
muito mais complicado
ainda não existe 
em nenhum browser
FUTURO FANTÁSTICO
BACKGROUND 
SYNC
postaTweet(texto);
try { 
postaTweet(texto); 
} catch (err) { 
}
try { 
postaTweet(texto); 
} catch (err) { 
salvaTweet(texto); 
registration.sync.register('envia-tweet'); 
}
postaTweet(texto).catch(function(){ 
});
postaTweet(texto).catch(function(){ 
salvaTweet(texto).then(function(){ 
}).then(function(){ 
}); 
});
postaTweet(texto).catch(function(){ 
return salvaTweet(texto).then(function(){ 
return navigator.serviceWorker.ready; 
}).then(function(registration){ 
return registration.sync.register('envia-tweet'); 
}); 
});
this.onsync = function (event) { 
if (event.id === 'envia-tweet') { 
} 
};
this.onsync = function (event) { 
if (event.id === 'envia-tweet') { 
event.waitUntil( 
carregaTweet().then(function(texto){ 
postaTweet(texto); 
}) 
); 
} 
};
registration.sync.register('atualiza-inbox', { 
minInterval: 60 * 60 * 1000 
});
PUSH 
NOTIFICATION
registration.pushRegistrationManager.register()
registration.pushRegistrationManager.register() 
.then(function(detalhes) { 
});
registration.pushRegistrationManager.register() 
.then(function(detalhes) { 
return avisaServidor(detalhes); 
});
this.onpush = function(event) { 
if (event.message.data == 'nova-mensagem') { 
} 
};
this.onpush = function(event) { 
if (event.message.data == 'nova-mensagem') { 
event.waitUntil( 
atualizaMensagens().then(function(){ 
}) 
); 
} 
};
this.onpush = function(event) { 
if (event.message.data == 'nova-mensagem') { 
event.waitUntil( 
atualizaMensagens().then(function(){ 
new Notification("Chegou mensagem!"); 
}) 
); 
} 
};
this.onnotificationclick = function(event) { 
};
this.onnotificationclick = function(event) { 
new ServiceWorkerClient('/mensagens.html'); 
};
GEOFENCING
ALARMES 
TEMPORAIS
SERVICE 
WORKERS 
hoje, depois do evento
estude Service Workers 
hoje. esse é o futuro.
brinque no Chrome 
Chrome Canary - chrome://flags 
#enable-experimental-web-platform-features
vote no 
status.modern.ie
use AppCache 
como fallback
offline como 
progressive enhancement 
if ('serviceWorker' in navigator) { 
}
pense offline first
OFFLINE WEB COM 
SERVICE WORKERS
OBRIGADO! 
sergiolopes.org 
@sergio_caelum

Mais conteúdo relacionado

Mais procurados

O melhor da monitoração de web performance
O melhor da monitoração de web performanceO melhor da monitoração de web performance
O melhor da monitoração de web performanceDavidson Fellipe
 
A evolução do AngularJS
A evolução do AngularJSA evolução do AngularJS
A evolução do AngularJSRodrigo Branas
 
Introdução ao AngularJS
Introdução ao AngularJSIntrodução ao AngularJS
Introdução ao AngularJSRodrigo Branas
 
React + Flux (Alt)
React + Flux (Alt)React + Flux (Alt)
React + Flux (Alt)Cezar Luiz
 
VueJS - Uma alternativa elegante
VueJS - Uma alternativa eleganteVueJS - Uma alternativa elegante
VueJS - Uma alternativa eleganteJonathan Bijos
 
Vue.js - o framework progressivo
Vue.js - o framework progressivoVue.js - o framework progressivo
Vue.js - o framework progressivoVinicius Reis
 
Desenvolvendo aplicacoes mobile_com_html_css_
Desenvolvendo aplicacoes mobile_com_html_css_Desenvolvendo aplicacoes mobile_com_html_css_
Desenvolvendo aplicacoes mobile_com_html_css_Rodrigo Urubatan
 
Performance e boas_praticas_de_web
Performance e boas_praticas_de_webPerformance e boas_praticas_de_web
Performance e boas_praticas_de_webThiago Verly
 
[Curso Phonegap / Cordova] Aula 01: Introdução ao Phonegap
[Curso Phonegap / Cordova] Aula 01: Introdução ao Phonegap[Curso Phonegap / Cordova] Aula 01: Introdução ao Phonegap
[Curso Phonegap / Cordova] Aula 01: Introdução ao PhonegapLoiane Groner
 
Criando um Web Service Restful com Jersey, Eclipse, JBoss, Tomcat, WebSphere
Criando um Web Service Restful com Jersey, Eclipse, JBoss, Tomcat, WebSphereCriando um Web Service Restful com Jersey, Eclipse, JBoss, Tomcat, WebSphere
Criando um Web Service Restful com Jersey, Eclipse, JBoss, Tomcat, WebSphereJuliano Martins
 
Mini curso: Ionic Framework
Mini curso: Ionic FrameworkMini curso: Ionic Framework
Mini curso: Ionic FrameworkLoiane Groner
 
Performance - Acelere seu site! Na web tempo é mais que dinheiro.
Performance - Acelere seu site! Na web tempo é mais que dinheiro.Performance - Acelere seu site! Na web tempo é mais que dinheiro.
Performance - Acelere seu site! Na web tempo é mais que dinheiro.Gustavo Corrêa Alves
 
Desenvolvimento Front end (AngularJS e Bootstrap)
Desenvolvimento Front end (AngularJS e Bootstrap)Desenvolvimento Front end (AngularJS e Bootstrap)
Desenvolvimento Front end (AngularJS e Bootstrap)Julian Cesar
 
Java script em 2016 - Como sobreviver a essa sopa de letrinhas com vue.js
Java script em 2016 - Como sobreviver a essa sopa de letrinhas com vue.jsJava script em 2016 - Como sobreviver a essa sopa de letrinhas com vue.js
Java script em 2016 - Como sobreviver a essa sopa de letrinhas com vue.jsVinicius Reis
 
Master App - Porque menos é mais!
Master App - Porque menos é mais!Master App - Porque menos é mais!
Master App - Porque menos é mais!Rodrigo Serradura
 

Mais procurados (20)

O melhor da monitoração de web performance
O melhor da monitoração de web performanceO melhor da monitoração de web performance
O melhor da monitoração de web performance
 
A evolução do AngularJS
A evolução do AngularJSA evolução do AngularJS
A evolução do AngularJS
 
Introdução ao AngularJS
Introdução ao AngularJSIntrodução ao AngularJS
Introdução ao AngularJS
 
React + Flux (Alt)
React + Flux (Alt)React + Flux (Alt)
React + Flux (Alt)
 
VueJS - Uma alternativa elegante
VueJS - Uma alternativa eleganteVueJS - Uma alternativa elegante
VueJS - Uma alternativa elegante
 
Vue.js - o framework progressivo
Vue.js - o framework progressivoVue.js - o framework progressivo
Vue.js - o framework progressivo
 
Jdk
JdkJdk
Jdk
 
Curso AngularJS - Parte 2
Curso AngularJS - Parte 2Curso AngularJS - Parte 2
Curso AngularJS - Parte 2
 
Desenvolvendo aplicacoes mobile_com_html_css_
Desenvolvendo aplicacoes mobile_com_html_css_Desenvolvendo aplicacoes mobile_com_html_css_
Desenvolvendo aplicacoes mobile_com_html_css_
 
Performance e boas_praticas_de_web
Performance e boas_praticas_de_webPerformance e boas_praticas_de_web
Performance e boas_praticas_de_web
 
ASP.NET MVC
ASP.NET MVCASP.NET MVC
ASP.NET MVC
 
[Curso Phonegap / Cordova] Aula 01: Introdução ao Phonegap
[Curso Phonegap / Cordova] Aula 01: Introdução ao Phonegap[Curso Phonegap / Cordova] Aula 01: Introdução ao Phonegap
[Curso Phonegap / Cordova] Aula 01: Introdução ao Phonegap
 
React - Introdução
React - IntroduçãoReact - Introdução
React - Introdução
 
Criando um Web Service Restful com Jersey, Eclipse, JBoss, Tomcat, WebSphere
Criando um Web Service Restful com Jersey, Eclipse, JBoss, Tomcat, WebSphereCriando um Web Service Restful com Jersey, Eclipse, JBoss, Tomcat, WebSphere
Criando um Web Service Restful com Jersey, Eclipse, JBoss, Tomcat, WebSphere
 
Mini curso: Ionic Framework
Mini curso: Ionic FrameworkMini curso: Ionic Framework
Mini curso: Ionic Framework
 
Performance - Acelere seu site! Na web tempo é mais que dinheiro.
Performance - Acelere seu site! Na web tempo é mais que dinheiro.Performance - Acelere seu site! Na web tempo é mais que dinheiro.
Performance - Acelere seu site! Na web tempo é mais que dinheiro.
 
Curso AngularJS - Parte 1
Curso AngularJS - Parte 1Curso AngularJS - Parte 1
Curso AngularJS - Parte 1
 
Desenvolvimento Front end (AngularJS e Bootstrap)
Desenvolvimento Front end (AngularJS e Bootstrap)Desenvolvimento Front end (AngularJS e Bootstrap)
Desenvolvimento Front end (AngularJS e Bootstrap)
 
Java script em 2016 - Como sobreviver a essa sopa de letrinhas com vue.js
Java script em 2016 - Como sobreviver a essa sopa de letrinhas com vue.jsJava script em 2016 - Como sobreviver a essa sopa de letrinhas com vue.js
Java script em 2016 - Como sobreviver a essa sopa de letrinhas com vue.js
 
Master App - Porque menos é mais!
Master App - Porque menos é mais!Master App - Porque menos é mais!
Master App - Porque menos é mais!
 

Destaque

Progressive Web Apps: o melhor da Web appficada
Progressive Web Apps: o melhor da Web appficadaProgressive Web Apps: o melhor da Web appficada
Progressive Web Apps: o melhor da Web appficadaCaelum
 
Monografia - Mobile Web Apps vs Native Apps
Monografia - Mobile Web Apps vs Native AppsMonografia - Mobile Web Apps vs Native Apps
Monografia - Mobile Web Apps vs Native AppsLuiz Oliveira
 
Service worker - Offline Web
Service worker - Offline WebService worker - Offline Web
Service worker - Offline WebBruno Oliveira
 
Event Driven Architecture &amp; Complex Event Processing
Event Driven Architecture &amp; Complex Event ProcessingEvent Driven Architecture &amp; Complex Event Processing
Event Driven Architecture &amp; Complex Event Processinglogus2k
 
A Validation Model of Data Input for Web Services
A Validation Model of Data Input for Web ServicesA Validation Model of Data Input for Web Services
A Validation Model of Data Input for Web ServicesRafael Brinhosa
 
Developing event-driven microservices with event sourcing and CQRS (phillyete)
Developing event-driven microservices with event sourcing and CQRS (phillyete)Developing event-driven microservices with event sourcing and CQRS (phillyete)
Developing event-driven microservices with event sourcing and CQRS (phillyete)Chris Richardson
 
Material design para web
Material design para webMaterial design para web
Material design para webAugusto Sandim
 
Progressive Web Apps e o futuro do desenvolvimento Web na Plataforma .NET
Progressive Web Apps e o futuro do desenvolvimento Web na Plataforma .NETProgressive Web Apps e o futuro do desenvolvimento Web na Plataforma .NET
Progressive Web Apps e o futuro do desenvolvimento Web na Plataforma .NETAndre Baltieri
 
ASP .NET CORE, Angular 2, e Typescript com Scaffolding Yeoman | Seminário
ASP .NET CORE, Angular 2, e Typescript com Scaffolding Yeoman  | Seminário ASP .NET CORE, Angular 2, e Typescript com Scaffolding Yeoman  | Seminário
ASP .NET CORE, Angular 2, e Typescript com Scaffolding Yeoman | Seminário Osmar Petry
 
Microservice Architecture with CQRS and Event Sourcing
Microservice Architecture with CQRS and Event SourcingMicroservice Architecture with CQRS and Event Sourcing
Microservice Architecture with CQRS and Event SourcingBen Wilcock
 
Introduction to Nodejs
Introduction to NodejsIntroduction to Nodejs
Introduction to NodejsGabriele Lana
 
Mobile First Responsive Web Design
Mobile First Responsive Web DesignMobile First Responsive Web Design
Mobile First Responsive Web DesignUIEpreviews
 
Developing event-driven microservices with event sourcing and CQRS (svcc, sv...
Developing event-driven microservices with event sourcing and CQRS  (svcc, sv...Developing event-driven microservices with event sourcing and CQRS  (svcc, sv...
Developing event-driven microservices with event sourcing and CQRS (svcc, sv...Chris Richardson
 

Destaque (16)

Progressive Web Apps: o melhor da Web appficada
Progressive Web Apps: o melhor da Web appficadaProgressive Web Apps: o melhor da Web appficada
Progressive Web Apps: o melhor da Web appficada
 
Monografia - Mobile Web Apps vs Native Apps
Monografia - Mobile Web Apps vs Native AppsMonografia - Mobile Web Apps vs Native Apps
Monografia - Mobile Web Apps vs Native Apps
 
Service worker - Offline Web
Service worker - Offline WebService worker - Offline Web
Service worker - Offline Web
 
Boas práticas de API Design
Boas práticas de API DesignBoas práticas de API Design
Boas práticas de API Design
 
Event Driven Architecture &amp; Complex Event Processing
Event Driven Architecture &amp; Complex Event ProcessingEvent Driven Architecture &amp; Complex Event Processing
Event Driven Architecture &amp; Complex Event Processing
 
A Validation Model of Data Input for Web Services
A Validation Model of Data Input for Web ServicesA Validation Model of Data Input for Web Services
A Validation Model of Data Input for Web Services
 
React Redux
React ReduxReact Redux
React Redux
 
Developing event-driven microservices with event sourcing and CQRS (phillyete)
Developing event-driven microservices with event sourcing and CQRS (phillyete)Developing event-driven microservices with event sourcing and CQRS (phillyete)
Developing event-driven microservices with event sourcing and CQRS (phillyete)
 
Material design para web
Material design para webMaterial design para web
Material design para web
 
Progressive Web Apps e o futuro do desenvolvimento Web na Plataforma .NET
Progressive Web Apps e o futuro do desenvolvimento Web na Plataforma .NETProgressive Web Apps e o futuro do desenvolvimento Web na Plataforma .NET
Progressive Web Apps e o futuro do desenvolvimento Web na Plataforma .NET
 
ASP .NET CORE, Angular 2, e Typescript com Scaffolding Yeoman | Seminário
ASP .NET CORE, Angular 2, e Typescript com Scaffolding Yeoman  | Seminário ASP .NET CORE, Angular 2, e Typescript com Scaffolding Yeoman  | Seminário
ASP .NET CORE, Angular 2, e Typescript com Scaffolding Yeoman | Seminário
 
Microservice Architecture with CQRS and Event Sourcing
Microservice Architecture with CQRS and Event SourcingMicroservice Architecture with CQRS and Event Sourcing
Microservice Architecture with CQRS and Event Sourcing
 
Introduction to Nodejs
Introduction to NodejsIntroduction to Nodejs
Introduction to Nodejs
 
Mobile First Responsive Web Design
Mobile First Responsive Web DesignMobile First Responsive Web Design
Mobile First Responsive Web Design
 
Developing event-driven microservices with event sourcing and CQRS (svcc, sv...
Developing event-driven microservices with event sourcing and CQRS  (svcc, sv...Developing event-driven microservices with event sourcing and CQRS  (svcc, sv...
Developing event-driven microservices with event sourcing and CQRS (svcc, sv...
 
reveal.js 3.0.0
reveal.js 3.0.0reveal.js 3.0.0
reveal.js 3.0.0
 

Semelhante a Offline Web com Service Workers - Sérgio Lopes

RubyConfBr 2015 - Rails & Javascript: faça isso direito
RubyConfBr 2015 - Rails & Javascript: faça isso direitoRubyConfBr 2015 - Rails & Javascript: faça isso direito
RubyConfBr 2015 - Rails & Javascript: faça isso direitoCezinha Anjos
 
Como Perder Peso (no browser)
Como Perder Peso (no browser)Como Perder Peso (no browser)
Como Perder Peso (no browser)Zeno Rocha
 
Spring MVC Framework
Spring MVC FrameworkSpring MVC Framework
Spring MVC Frameworkelliando dias
 
Introdução ao framework CakePHP
Introdução ao framework CakePHPIntrodução ao framework CakePHP
Introdução ao framework CakePHPigorpimentel
 
Hibernate efetivo (IA-2014 / Disturbing the Mind)
Hibernate efetivo (IA-2014 / Disturbing the Mind)Hibernate efetivo (IA-2014 / Disturbing the Mind)
Hibernate efetivo (IA-2014 / Disturbing the Mind)Rafael Ponte
 
Os 10 maus hábitos dos desenvolvedores JSF
Os 10 maus hábitos dos desenvolvedores JSFOs 10 maus hábitos dos desenvolvedores JSF
Os 10 maus hábitos dos desenvolvedores JSFRafael Ponte
 
Workshop Ruby on Rails dia 2 ruby-pt
Workshop Ruby on Rails dia 2  ruby-ptWorkshop Ruby on Rails dia 2  ruby-pt
Workshop Ruby on Rails dia 2 ruby-ptPedro Sousa
 
DevDay - O elo perdido: sincronizando webapps
DevDay - O elo perdido: sincronizando webappsDevDay - O elo perdido: sincronizando webapps
DevDay - O elo perdido: sincronizando webappsSuissa
 
JS Experience 2017 - Armazenamentos offline. APIs para PWA (Progressive Web A...
JS Experience 2017 - Armazenamentos offline. APIs para PWA (Progressive Web A...JS Experience 2017 - Armazenamentos offline. APIs para PWA (Progressive Web A...
JS Experience 2017 - Armazenamentos offline. APIs para PWA (Progressive Web A...iMasters
 
Pense no futuro: PHP com Zend Framework
Pense no futuro: PHP com Zend FrameworkPense no futuro: PHP com Zend Framework
Pense no futuro: PHP com Zend FrameworkFlávio Lisboa
 
Desenvolvendo com Dojo Toolkit
Desenvolvendo com Dojo ToolkitDesenvolvendo com Dojo Toolkit
Desenvolvendo com Dojo ToolkitFlávio Lisboa
 
Utilizando cache com WordPress: tenha o seu website decolando sem sair do lugar
Utilizando cache com WordPress: tenha o seu website decolando sem sair do lugarUtilizando cache com WordPress: tenha o seu website decolando sem sair do lugar
Utilizando cache com WordPress: tenha o seu website decolando sem sair do lugarmeetupwordpressfln
 
InterCon 2017 - Segredos não ditos de PWA - muito além do Web App Manifest - ...
InterCon 2017 - Segredos não ditos de PWA - muito além do Web App Manifest - ...InterCon 2017 - Segredos não ditos de PWA - muito além do Web App Manifest - ...
InterCon 2017 - Segredos não ditos de PWA - muito além do Web App Manifest - ...iMasters
 
Google Analytics Reporting API: Bebendo água direto da fonte
Google Analytics Reporting API: Bebendo água direto da fonteGoogle Analytics Reporting API: Bebendo água direto da fonte
Google Analytics Reporting API: Bebendo água direto da fonteJohann Vivot
 
JasperReports Tecnicas de geracao_de_relatorios1
JasperReports  Tecnicas de geracao_de_relatorios1JasperReports  Tecnicas de geracao_de_relatorios1
JasperReports Tecnicas de geracao_de_relatorios1Sliedesharessbarbosa
 
Edição de conteúdo web usando Javascript de ponta a ponta
Edição de conteúdo web usando Javascript de ponta a pontaEdição de conteúdo web usando Javascript de ponta a ponta
Edição de conteúdo web usando Javascript de ponta a pontaJorge Walendowsky
 

Semelhante a Offline Web com Service Workers - Sérgio Lopes (20)

RubyConfBr 2015 - Rails & Javascript: faça isso direito
RubyConfBr 2015 - Rails & Javascript: faça isso direitoRubyConfBr 2015 - Rails & Javascript: faça isso direito
RubyConfBr 2015 - Rails & Javascript: faça isso direito
 
Como Perder Peso (no browser)
Como Perder Peso (no browser)Como Perder Peso (no browser)
Como Perder Peso (no browser)
 
Spring MVC Framework
Spring MVC FrameworkSpring MVC Framework
Spring MVC Framework
 
Web Offline
Web OfflineWeb Offline
Web Offline
 
Introdução ao framework CakePHP
Introdução ao framework CakePHPIntrodução ao framework CakePHP
Introdução ao framework CakePHP
 
Hibernate efetivo (IA-2014 / Disturbing the Mind)
Hibernate efetivo (IA-2014 / Disturbing the Mind)Hibernate efetivo (IA-2014 / Disturbing the Mind)
Hibernate efetivo (IA-2014 / Disturbing the Mind)
 
Os 10 maus hábitos dos desenvolvedores JSF
Os 10 maus hábitos dos desenvolvedores JSFOs 10 maus hábitos dos desenvolvedores JSF
Os 10 maus hábitos dos desenvolvedores JSF
 
Desempenho web
Desempenho webDesempenho web
Desempenho web
 
Workshop Ruby on Rails dia 2 ruby-pt
Workshop Ruby on Rails dia 2  ruby-ptWorkshop Ruby on Rails dia 2  ruby-pt
Workshop Ruby on Rails dia 2 ruby-pt
 
DevDay - O elo perdido: sincronizando webapps
DevDay - O elo perdido: sincronizando webappsDevDay - O elo perdido: sincronizando webapps
DevDay - O elo perdido: sincronizando webapps
 
Web Performance Client Side
Web Performance Client SideWeb Performance Client Side
Web Performance Client Side
 
Ruby On Rails Regis
Ruby On Rails RegisRuby On Rails Regis
Ruby On Rails Regis
 
JS Experience 2017 - Armazenamentos offline. APIs para PWA (Progressive Web A...
JS Experience 2017 - Armazenamentos offline. APIs para PWA (Progressive Web A...JS Experience 2017 - Armazenamentos offline. APIs para PWA (Progressive Web A...
JS Experience 2017 - Armazenamentos offline. APIs para PWA (Progressive Web A...
 
Pense no futuro: PHP com Zend Framework
Pense no futuro: PHP com Zend FrameworkPense no futuro: PHP com Zend Framework
Pense no futuro: PHP com Zend Framework
 
Desenvolvendo com Dojo Toolkit
Desenvolvendo com Dojo ToolkitDesenvolvendo com Dojo Toolkit
Desenvolvendo com Dojo Toolkit
 
Utilizando cache com WordPress: tenha o seu website decolando sem sair do lugar
Utilizando cache com WordPress: tenha o seu website decolando sem sair do lugarUtilizando cache com WordPress: tenha o seu website decolando sem sair do lugar
Utilizando cache com WordPress: tenha o seu website decolando sem sair do lugar
 
InterCon 2017 - Segredos não ditos de PWA - muito além do Web App Manifest - ...
InterCon 2017 - Segredos não ditos de PWA - muito além do Web App Manifest - ...InterCon 2017 - Segredos não ditos de PWA - muito além do Web App Manifest - ...
InterCon 2017 - Segredos não ditos de PWA - muito além do Web App Manifest - ...
 
Google Analytics Reporting API: Bebendo água direto da fonte
Google Analytics Reporting API: Bebendo água direto da fonteGoogle Analytics Reporting API: Bebendo água direto da fonte
Google Analytics Reporting API: Bebendo água direto da fonte
 
JasperReports Tecnicas de geracao_de_relatorios1
JasperReports  Tecnicas de geracao_de_relatorios1JasperReports  Tecnicas de geracao_de_relatorios1
JasperReports Tecnicas de geracao_de_relatorios1
 
Edição de conteúdo web usando Javascript de ponta a ponta
Edição de conteúdo web usando Javascript de ponta a pontaEdição de conteúdo web usando Javascript de ponta a ponta
Edição de conteúdo web usando Javascript de ponta a ponta
 

Mais de Caelum

Performance Web além do carregamento
Performance Web além do carregamentoPerformance Web além do carregamento
Performance Web além do carregamentoCaelum
 
Desafios de Performance Web - BrazilJS
Desafios de Performance Web - BrazilJSDesafios de Performance Web - BrazilJS
Desafios de Performance Web - BrazilJSCaelum
 
Performance na web: o modelo RAIL e outras novidades
Performance na web: o modelo RAIL e outras novidadesPerformance na web: o modelo RAIL e outras novidades
Performance na web: o modelo RAIL e outras novidadesCaelum
 
Tudo que você precisa saber sobre picture e srcset
Tudo que você precisa saber sobre picture e srcsetTudo que você precisa saber sobre picture e srcset
Tudo que você precisa saber sobre picture e srcsetCaelum
 
Como o HTTP/2 vai mudar sua vida
Como o HTTP/2 vai mudar sua vidaComo o HTTP/2 vai mudar sua vida
Como o HTTP/2 vai mudar sua vidaCaelum
 
Métricas e a automatização do controle de qualidade
Métricas e a automatização do controle de qualidadeMétricas e a automatização do controle de qualidade
Métricas e a automatização do controle de qualidadeCaelum
 
HTTP/2, SPDY e Otimizações Web - Front In Maceió 2014 - Sérgio Lopes
HTTP/2, SPDY e Otimizações Web - Front In Maceió 2014 - Sérgio LopesHTTP/2, SPDY e Otimizações Web - Front In Maceió 2014 - Sérgio Lopes
HTTP/2, SPDY e Otimizações Web - Front In Maceió 2014 - Sérgio LopesCaelum
 
Design Responsivo - MobCamp 2014
Design Responsivo - MobCamp 2014Design Responsivo - MobCamp 2014
Design Responsivo - MobCamp 2014Caelum
 
Além do responsive design: a mudança de paradigma do design adaptativo e os m...
Além do responsive design: a mudança de paradigma do design adaptativo e os m...Além do responsive design: a mudança de paradigma do design adaptativo e os m...
Além do responsive design: a mudança de paradigma do design adaptativo e os m...Caelum
 
Por trás dos frameworks e além do reflection
Por trás dos frameworks e além do reflectionPor trás dos frameworks e além do reflection
Por trás dos frameworks e além do reflectionCaelum
 
Introducao a inteligencia artificial na educacao
Introducao a inteligencia artificial na educacaoIntroducao a inteligencia artificial na educacao
Introducao a inteligencia artificial na educacaoCaelum
 
Otimizando o time to market - do zero a produção em poucas iterações
Otimizando o time to market - do zero a produção em poucas iteraçõesOtimizando o time to market - do zero a produção em poucas iterações
Otimizando o time to market - do zero a produção em poucas iteraçõesCaelum
 
All you need to know about JavaScript loading and execution in the browser - ...
All you need to know about JavaScript loading and execution in the browser - ...All you need to know about JavaScript loading and execution in the browser - ...
All you need to know about JavaScript loading and execution in the browser - ...Caelum
 
Wsrest 2013
Wsrest 2013Wsrest 2013
Wsrest 2013Caelum
 
Design Responsivo por uma Web única
Design Responsivo por uma Web únicaDesign Responsivo por uma Web única
Design Responsivo por uma Web únicaCaelum
 
Os Caminhos de uma Estratégia Mobile
Os Caminhos de uma Estratégia MobileOs Caminhos de uma Estratégia Mobile
Os Caminhos de uma Estratégia MobileCaelum
 
Porque você deveria usar CDI nos seus projetos Java! - JavaOne LA 2012 - Sérg...
Porque você deveria usar CDI nos seus projetos Java! - JavaOne LA 2012 - Sérg...Porque você deveria usar CDI nos seus projetos Java! - JavaOne LA 2012 - Sérg...
Porque você deveria usar CDI nos seus projetos Java! - JavaOne LA 2012 - Sérg...Caelum
 
[FrontInBH 2012] Por uma web mais rápida: técnicas de otimizações de sites - ...
[FrontInBH 2012] Por uma web mais rápida: técnicas de otimizações de sites - ...[FrontInBH 2012] Por uma web mais rápida: técnicas de otimizações de sites - ...
[FrontInBH 2012] Por uma web mais rápida: técnicas de otimizações de sites - ...Caelum
 
Plataforma java: detalhes da JVM
Plataforma java: detalhes da JVMPlataforma java: detalhes da JVM
Plataforma java: detalhes da JVMCaelum
 
CDI e as ideias pro futuro do VRaptor
CDI e as ideias pro futuro do VRaptorCDI e as ideias pro futuro do VRaptor
CDI e as ideias pro futuro do VRaptorCaelum
 

Mais de Caelum (20)

Performance Web além do carregamento
Performance Web além do carregamentoPerformance Web além do carregamento
Performance Web além do carregamento
 
Desafios de Performance Web - BrazilJS
Desafios de Performance Web - BrazilJSDesafios de Performance Web - BrazilJS
Desafios de Performance Web - BrazilJS
 
Performance na web: o modelo RAIL e outras novidades
Performance na web: o modelo RAIL e outras novidadesPerformance na web: o modelo RAIL e outras novidades
Performance na web: o modelo RAIL e outras novidades
 
Tudo que você precisa saber sobre picture e srcset
Tudo que você precisa saber sobre picture e srcsetTudo que você precisa saber sobre picture e srcset
Tudo que você precisa saber sobre picture e srcset
 
Como o HTTP/2 vai mudar sua vida
Como o HTTP/2 vai mudar sua vidaComo o HTTP/2 vai mudar sua vida
Como o HTTP/2 vai mudar sua vida
 
Métricas e a automatização do controle de qualidade
Métricas e a automatização do controle de qualidadeMétricas e a automatização do controle de qualidade
Métricas e a automatização do controle de qualidade
 
HTTP/2, SPDY e Otimizações Web - Front In Maceió 2014 - Sérgio Lopes
HTTP/2, SPDY e Otimizações Web - Front In Maceió 2014 - Sérgio LopesHTTP/2, SPDY e Otimizações Web - Front In Maceió 2014 - Sérgio Lopes
HTTP/2, SPDY e Otimizações Web - Front In Maceió 2014 - Sérgio Lopes
 
Design Responsivo - MobCamp 2014
Design Responsivo - MobCamp 2014Design Responsivo - MobCamp 2014
Design Responsivo - MobCamp 2014
 
Além do responsive design: a mudança de paradigma do design adaptativo e os m...
Além do responsive design: a mudança de paradigma do design adaptativo e os m...Além do responsive design: a mudança de paradigma do design adaptativo e os m...
Além do responsive design: a mudança de paradigma do design adaptativo e os m...
 
Por trás dos frameworks e além do reflection
Por trás dos frameworks e além do reflectionPor trás dos frameworks e além do reflection
Por trás dos frameworks e além do reflection
 
Introducao a inteligencia artificial na educacao
Introducao a inteligencia artificial na educacaoIntroducao a inteligencia artificial na educacao
Introducao a inteligencia artificial na educacao
 
Otimizando o time to market - do zero a produção em poucas iterações
Otimizando o time to market - do zero a produção em poucas iteraçõesOtimizando o time to market - do zero a produção em poucas iterações
Otimizando o time to market - do zero a produção em poucas iterações
 
All you need to know about JavaScript loading and execution in the browser - ...
All you need to know about JavaScript loading and execution in the browser - ...All you need to know about JavaScript loading and execution in the browser - ...
All you need to know about JavaScript loading and execution in the browser - ...
 
Wsrest 2013
Wsrest 2013Wsrest 2013
Wsrest 2013
 
Design Responsivo por uma Web única
Design Responsivo por uma Web únicaDesign Responsivo por uma Web única
Design Responsivo por uma Web única
 
Os Caminhos de uma Estratégia Mobile
Os Caminhos de uma Estratégia MobileOs Caminhos de uma Estratégia Mobile
Os Caminhos de uma Estratégia Mobile
 
Porque você deveria usar CDI nos seus projetos Java! - JavaOne LA 2012 - Sérg...
Porque você deveria usar CDI nos seus projetos Java! - JavaOne LA 2012 - Sérg...Porque você deveria usar CDI nos seus projetos Java! - JavaOne LA 2012 - Sérg...
Porque você deveria usar CDI nos seus projetos Java! - JavaOne LA 2012 - Sérg...
 
[FrontInBH 2012] Por uma web mais rápida: técnicas de otimizações de sites - ...
[FrontInBH 2012] Por uma web mais rápida: técnicas de otimizações de sites - ...[FrontInBH 2012] Por uma web mais rápida: técnicas de otimizações de sites - ...
[FrontInBH 2012] Por uma web mais rápida: técnicas de otimizações de sites - ...
 
Plataforma java: detalhes da JVM
Plataforma java: detalhes da JVMPlataforma java: detalhes da JVM
Plataforma java: detalhes da JVM
 
CDI e as ideias pro futuro do VRaptor
CDI e as ideias pro futuro do VRaptorCDI e as ideias pro futuro do VRaptor
CDI e as ideias pro futuro do VRaptor
 

Último

Concurso Caixa TI - Imersão Final - Rogério Araújo.pdf
Concurso Caixa TI - Imersão Final - Rogério Araújo.pdfConcurso Caixa TI - Imersão Final - Rogério Araújo.pdf
Concurso Caixa TI - Imersão Final - Rogério Araújo.pdfGuilhermeRodrigues896381
 
Apresentação Power Embedded - Descubra uma nova forma de compartilhar relatór...
Apresentação Power Embedded - Descubra uma nova forma de compartilhar relatór...Apresentação Power Embedded - Descubra uma nova forma de compartilhar relatór...
Apresentação Power Embedded - Descubra uma nova forma de compartilhar relatór...Dirceu Resende
 
[ServiceNow] Upgrade de versão - 2ª edição (Revisada, atualizada e ampliada)
[ServiceNow] Upgrade de versão - 2ª edição (Revisada, atualizada e ampliada)[ServiceNow] Upgrade de versão - 2ª edição (Revisada, atualizada e ampliada)
[ServiceNow] Upgrade de versão - 2ª edição (Revisada, atualizada e ampliada)Alessandro Almeida
 
Apresentação Comercial VITAL DATA 2024.pdf
Apresentação Comercial VITAL DATA 2024.pdfApresentação Comercial VITAL DATA 2024.pdf
Apresentação Comercial VITAL DATA 2024.pdfCarlos Gomes
 
From_SEH_Overwrite_with_Egg_Hunter_to_Get_a_Shell_PT-BR.pdf
From_SEH_Overwrite_with_Egg_Hunter_to_Get_a_Shell_PT-BR.pdfFrom_SEH_Overwrite_with_Egg_Hunter_to_Get_a_Shell_PT-BR.pdf
From_SEH_Overwrite_with_Egg_Hunter_to_Get_a_Shell_PT-BR.pdfRodolpho Concurde
 
Certificado - Data Analytics - CoderHouse.pdf
Certificado - Data Analytics - CoderHouse.pdfCertificado - Data Analytics - CoderHouse.pdf
Certificado - Data Analytics - CoderHouse.pdfLarissa Souza
 

Último (6)

Concurso Caixa TI - Imersão Final - Rogério Araújo.pdf
Concurso Caixa TI - Imersão Final - Rogério Araújo.pdfConcurso Caixa TI - Imersão Final - Rogério Araújo.pdf
Concurso Caixa TI - Imersão Final - Rogério Araújo.pdf
 
Apresentação Power Embedded - Descubra uma nova forma de compartilhar relatór...
Apresentação Power Embedded - Descubra uma nova forma de compartilhar relatór...Apresentação Power Embedded - Descubra uma nova forma de compartilhar relatór...
Apresentação Power Embedded - Descubra uma nova forma de compartilhar relatór...
 
[ServiceNow] Upgrade de versão - 2ª edição (Revisada, atualizada e ampliada)
[ServiceNow] Upgrade de versão - 2ª edição (Revisada, atualizada e ampliada)[ServiceNow] Upgrade de versão - 2ª edição (Revisada, atualizada e ampliada)
[ServiceNow] Upgrade de versão - 2ª edição (Revisada, atualizada e ampliada)
 
Apresentação Comercial VITAL DATA 2024.pdf
Apresentação Comercial VITAL DATA 2024.pdfApresentação Comercial VITAL DATA 2024.pdf
Apresentação Comercial VITAL DATA 2024.pdf
 
From_SEH_Overwrite_with_Egg_Hunter_to_Get_a_Shell_PT-BR.pdf
From_SEH_Overwrite_with_Egg_Hunter_to_Get_a_Shell_PT-BR.pdfFrom_SEH_Overwrite_with_Egg_Hunter_to_Get_a_Shell_PT-BR.pdf
From_SEH_Overwrite_with_Egg_Hunter_to_Get_a_Shell_PT-BR.pdf
 
Certificado - Data Analytics - CoderHouse.pdf
Certificado - Data Analytics - CoderHouse.pdfCertificado - Data Analytics - CoderHouse.pdf
Certificado - Data Analytics - CoderHouse.pdf
 

Offline Web com Service Workers - Sérgio Lopes