SlideShare a Scribd company logo
1 of 124
Download to read offline
Instant

Loading
Add to 

Home Screen
Push

Noti8cations
Fast Secure Responsive
Responsive
Secure
Secure
Trust
Data integrity
User privacy
HTTP
attackerssensitive
data
HTTP
Best deal!
Only today.
inject advertisement
Instant loading
P R P L
Push critical resources
for the initial URL route
Render initial route
Pre-cache remaining
routes
Lazy-load and create
remaining routes on
demand
App shell Content
<app-drawer-layout>

<app-drawer>

<app-toolbar>Menu</app-toolbar>

<iron-selector selected="[[page]]">

<a name="view1" href="/view1">View One</a>

...

</iron-selector>

</app-drawer>



<app-header-layout>

...

</app-header-layout>

</app-drawer-layout>
<iron-pages selected="[[page]]" attr-for-selected="name">

<my-view1 name="view1"></my-view1>

<my-view2 name="view2"></my-view2>

<my-view3 name="view3"></my-view3>

<my-view404 name="view404"></my-view404>

</iron-pages>
class MyApp extends Polymer.Element {
static get is() {
return ‘my-app';
}
static get properties() {
return {
page: {
type: String,
observer: '_pageChanged',
},
};
}
_pageChanged(page) {
const resolvedPageUrl = this.resolveUrl('my-' + page + '.html');
this.importHref(resolvedPageUrl, null, this._showPage404, true);
}
_showPage404() {
this.page = 'view404';
}
}
HTTP/2
Server Push
h>ps://shop.polymer-project.org
Demo time
Add to Home Screen
<html lang="en">

<head>

<meta charset="utf-8">

<title>GDG DevFest Ukraine 2017</title>

<link rel="manifest" href="manifest.json">
...
{

"name": “GDG DevFest Ukraine 2016",

"short_name": “GDG DevFest",

"icons": [{

"src": "images/icons/splash-icon-128.png",

"sizes": "128x128",

"type": "image/png"

},{

"src": "images/icons/splash-icon-192.png",

"sizes": "192x192",

"type": "image/png"

},{

"src": "images/icons/splash-icon-384.png",

"sizes": "384x384",

"type": "image/png"

}],

"start_url": "/",

"display": "standalone",

"background_color": "#607d8b",

"theme_color": "#607d8b"

}
{

"name": “GDG DevFest Ukraine 2016",

"short_name": “GDG DevFest",

"icons": [{

"src": "images/icons/splash-icon-128.png",

"sizes": "128x128",

"type": "image/png"

},{

"src": "images/icons/splash-icon-192.png",

"sizes": "192x192",

"type": "image/png"

},{

"src": "images/icons/splash-icon-384.png",

"sizes": "384x384",

"type": "image/png"

}],

"start_url": "/",

"display": "standalone",

"background_color": "#607d8b",

"theme_color": "#607d8b"

}
{

"name": “GDG DevFest Ukraine 2016",

"short_name": “GDG DevFest",

"icons": [{

"src": "images/icons/splash-icon-128.png",

"sizes": "128x128",

"type": "image/png"

},{

"src": "images/icons/splash-icon-192.png",

"sizes": "192x192",

"type": "image/png"

},{

"src": "images/icons/splash-icon-384.png",

"sizes": "384x384",

"type": "image/png"

}],

"start_url": "/",

"display": "standalone",

"background_color": "#607d8b",

"theme_color": "#607d8b"

}
{

"name": “GDG DevFest Ukraine 2016",

"short_name": “GDG DevFest",

"icons": [{

"src": "images/icons/splash-icon-128.png",

"sizes": "128x128",

"type": "image/png"

},{

"src": "images/icons/splash-icon-192.png",

"sizes": "192x192",

"type": "image/png"

},{

"src": "images/icons/splash-icon-384.png",

"sizes": "384x384",

"type": "image/png"

}],

"start_url": "/",

"display": "standalone",

"background_color": "#607d8b",

"theme_color": "#607d8b"

}
{

"name": “GDG DevFest Ukraine 2016",

"short_name": “GDG DevFest",

"icons": [{

"src": "images/icons/splash-icon-128.png",

"sizes": "128x128",

"type": "image/png"

},{

"src": "images/icons/splash-icon-192.png",

"sizes": "192x192",

"type": "image/png"

},{

"src": "images/icons/splash-icon-384.png",

"sizes": "384x384",

"type": "image/png"

}],

"start_url": "/",

"display": "standalone",

"background_color": "#607d8b",

"theme_color": "#607d8b"

}
{

"name": “GDG DevFest Ukraine 2016",

"short_name": “GDG DevFest",

"icons": [{

"src": "images/icons/splash-icon-128.png",

"sizes": "128x128",

"type": "image/png"

},{

"src": "images/icons/splash-icon-192.png",

"sizes": "192x192",

"type": "image/png"

},{

"src": "images/icons/splash-icon-384.png",

"sizes": "384x384",

"type": "image/png"

}],

"start_url": "/",

"display": "browser",

"background_color": "#607d8b",

"theme_color": "#607d8b"

}
{

"name": “GDG DevFest Ukraine 2016",

"short_name": “GDG DevFest",

"icons": [{

"src": "images/icons/splash-icon-128.png",

"sizes": "128x128",

"type": "image/png"

},{

"src": "images/icons/splash-icon-192.png",

"sizes": "192x192",

"type": "image/png"

},{

"src": "images/icons/splash-icon-384.png",

"sizes": "384x384",

"type": "image/png"

}],

"start_url": "/",

"display": "standalone",

"background_color": "#607d8b",

"theme_color": "#607d8b"

}
{

"name": “GDG DevFest Ukraine 2016",

"short_name": “GDG DevFest",

"icons": [{

"src": "images/icons/splash-icon-128.png",

"sizes": "128x128",

"type": "image/png"

},{

"src": "images/icons/splash-icon-192.png",

"sizes": "192x192",

"type": "image/png"

},{

"src": "images/icons/splash-icon-384.png",

"sizes": "384x384",

"type": "image/png"

}],

"start_url": "/",

"display": "browser",

"background_color": "#607d8b",

"theme_color": "#607d8b"

}
{

"name": “GDG DevFest Ukraine 2016",

"short_name": “GDG DevFest",

"icons": [{

"src": "images/icons/splash-icon-128.png",

"sizes": "128x128",

"type": "image/png"

},{

"src": "images/icons/splash-icon-192.png",

"sizes": "192x192",

"type": "image/png"

},{

"src": "images/icons/splash-icon-384.png",

"sizes": "384x384",

"type": "image/png"

}],

"start_url": "/",

"display": "browser",

"background_color": "#607d8b",

"theme_color": "#607d8b"

}
h>ps://devfest.gdg.org.ua
Demo time
56.83%
Source (Mar 2017): http://caniuse.com/#feat=web-app-manifest
IN DEV IN DEV
OOine access
navigator.serviceWorker.register('/service-worker.js')
.then(reg => {
console.log('Service Worker Registered', reg);
})
.catch(err => {
console.log('Error registering Service Worker', err);
});
Register Service Worker
const cacheName = 'app-shell-cache-v1';
const filesToCache = ['/', '/index.html', ...];
self.addEventListener('install', event => {
event.waitUntil(caches.open(cacheName)
.then(cache => cache.addAll(filesToCache))
.then(() => self.skipWaiting())
);
});
Cache Files
const cacheName = 'app-shell-cache-v1';
const filesToCache = ['/', '/index.html', ...];
self.addEventListener('install', event => {
event.waitUntil(caches.open(cacheName)
.then(cache => cache.addAll(filesToCache))
.then(() => self.skipWaiting())
);
});
Cache Files
self.addEventListener('activate', event => {
event.waitUntil(caches.keys()
.then(keyList => {
return Promise.all(keyList.map(key => {
if (key !== cacheName) {
return caches.delete(key);
}
}));
}));
return self.clients.claim();
});
Remove Outdated Resources
self.addEventListener('activate', event => {
event.waitUntil(caches.keys()
.then(keyList => {
return Promise.all(keyList.map(key => {
if (key !== cacheName) {
return caches.delete(key);
}
}));
}));
return self.clients.claim();
});
Remove Outdated Resources
self.addEventListener('fetch', event => {
event.respondWith(caches.match(event.request)
.then(response => {
return response || fetch(event.request);
}));
});
Return Resources from Cache
self.addEventListener('fetch', event => {
event.respondWith(caches.match(event.request)
.then(response => {
return response || fetch(event.request);
}));
});
Return Resources from Cache
Amsterdam, NL - Go Daddy - Chrome - 3G
First View (3.7s)
Repeat View (0.6s)
h>ps://devfest.gdg.org.ua
Demo time
Browser quota limits
6% of free disk
space per
origin
10% of free
disk space
(shared
across
eTLD+1)
at least 10%
of free disk
space
8GB: 10MB
32GB: 50MB
128GB: 250MB
>128GB: 500MB
62.8%
Source (Mar 2017): http://caniuse.com/#feat=serviceworkers
CONS. IN DEV
Push Noti8cations
Timely Precise Relevant
Check if User
is Subscribed
Ask User
To Subscribe
User
Subscribes
Send
Subscription
Save
Subscription
Browser Server
Subscribing Users
navigator.serviceWorker.register('/service-worker.js')
.then(reg => {
reg.pushManager.getSubscription()
.then(sub => {
console.log('Subscription Info', sub);
});
});
Check for Subscriptions
navigator.serviceWorker.register('/service-worker.js')
.then(reg => {
reg.pushManager.getSubscription()
.then(sub => {
console.log('Subscription Info', sub);
});
});
Check for Subscription
const opts = { userVisibleOnly: true, applicationServerKey: pubKey };
navigator.serviceWorker.getRegistration()
.then(reg => {
reg.pushManager.subscribe(opts)
.then(sub => {
console.log('Update Server with sub obj', sub);
})
.catch(error => {
console.log('Unable to subscribe user', error);
});
});
Subscribe the User
JSONi8ed Subscription Object
{

"endpoint": "https://example.com/push/ddj4Sk3abw:A49b...",

"keys": {

"auth": "qLAYRzG9TnUwbprns6H2Ew==",

"p256dh": "BILXd-c1-zuEQYXH_tc3qmLcqZclw7-Xs0Nlu/sG..."

}

}
navigator.serviceWorker.getRegistration()
.then(reg => {
reg.pushManager.getSubscription()
.then(sub => {
if (sub) {
sub.unsubscribe();
console.log('Update our server to remove subscription');
}
});
})
.catch(error => {
console.log('Error while trying to unsubscribe', error);
});
Unsubscribe the User
Generate
Message
Send to
End Point
Send to
Browser
Received
by Browser
Server BrowserEnd Point
Sending Messages
Push Arrives SW Starts Handle
Message
Show
Notification
Browser
Receiving Messages
self.addEventListener('push', event => {
let data;
if (event.data) {
data = event.data.json();
} else {
// fetch data from server
}
self.registration.showNotification(data.title, {
body: data.body, icon: data.icon, tag: data.tag
});
});
Listen For Messages
self.addEventListener('push', event => {
let data;
if (event.data) {
data = event.data.json();
} else {
// fetch data from server
}
self.registration.showNotification(data.title, {
body: data.body, icon: data.icon, tag: data.tag
});
});
Listen For Messages
{

"body": "Did you make a $1,000,000 purchase at Dr. Evil...",

"icon": "images/card.png",

"vibrate": [200, 100, 200, 100, 200, 100, 400],

"tag": "request",

"actions": [

{ "action": "yes", "title": "Yes", "icon": "images/yes.png" },

{ "action": "no", "title": "No", "icon": "images/no.png" }

]

}
self.registration.showNotification(data.title, {

body: data.body,

icon: data.icons,

tag: data.tag,

actions: [

{action: 'like', title: 'Like', icon: ic_li},

{action: 'reshare', title: 'Reshare', icon: ic_re}

]

});
Add Action Bu>ons
Respond To The User
self.addEventListener('notificationclick', event => {

if (event.action === 'like') {

event.waitUntil(fetch('/like-from-notification'));

} else if (event.action === 'reshare') {

event.waitUntil(fetch('/reshare-from-notification'));

} else {

clients.openWindow(event.srcElement.location.origin);

}

});
h>ps://tests.peter.sh/noti8cation-generator
Demo time
62.33%
Source (Mar 2017): http://caniuse.com/#feat=push-api
IN DEV
Responsive
— 100%
Secure
— 100%
Fast
— 100%
Instant Loading
— 62.8%
Push Noti8cations
— 62.33%
Add to Home Screen
— 56.83%
Lighthouse
Project page: https://github.com/GoogleChrome/lighthouse
Project page: https://github.com/GoogleChrome/lighthouse
Project page: https://github.com/GoogleChrome/lighthouse
Maximize reach
Source (June 2015): https://goo.gl/nArG5B
2.5x
Monthly unique visitors on mobile
8.9
3.3
BROWSER APP
Fewer clicks,
more patience
A seamless
inter-app
experience
Is this the end of 

Native apps?
BROWSERBROWSERBROWSERBROWSERBROWSER
14%
10% 9% 8%
20%
158 162
220
251
300
Q1 2013 Q1 2014 Q2 2015 Q4 2015 Q4 2016
Source (Feb 2017): http://flurrymobile.tumblr.com
US Daily Mobile Time Spent
Progressive web apps have limited
capabilities when it comes to offering
integration with a smartphone or
tablet’s hardware features
Auth
navigator.credentials.get()

navigator.credentials.store()

navigator.credentials.requireUserMediation()
Credential Management API
const cred = new FederatedCredential({

id: id, 

name: name, 

provider: 'https://accounts.google.com', 

iconURL: iconUrl 

});


navigator.credentials.store(cred);
Credential Management API
navigator.credentials.get({

password: true,

federated: {

providers: [

'https://accounts.google.com',

'https://www.facebook.com'

]

},

unmediated: true // `unmediated: true` lets the user automatically sign in

}).then(cred => {

if (cred) // auto sign-in possible

else // auto sign-in not possible

});
Credential Management API
navigator.credentials.get().then(cred => {

if (cred.type === 'federated'

&& cred.provider === 'https://accounts.google.com') {

const auth2 = gapi.auth2.getAuthInstance();



return auth2.signIn({

login_hint: cred.id || ''

}).then(profile => {

...

});

}

});
Credential Management API
Enable users to sign in with just one
tap
Remember the federated account
the user has used to sign in with
Sign users back in when a session
expires
h>ps://credential-management-sample.appspot.com
Demo time
50.08%
Source (Mar 2017): http://caniuse.com/#feat=credential-management
CONS.CONS.
Payments
const request = new PaymentRequest(
methodData, // required payment method data
details, // required information about transaction
options // optional parameter for things like shipping, etc.
);
Payment Request API
const methodData = [{
supportedMethods: [ "basic-card" ],
data: {
supportedNetworks: [ "visa", "mastercard" ]
}
}];
Payment Request API
const details = {
displayItems: [{
label: "Original donation amount",
amount: { currency: "USD", value : "65.00" }, // US$65.00
},
{
label: "Friends and family discount",
amount: { currency: "USD", value : "-10.00" }, // -US$10.00
pending: true // The price is not determined yet
}],
total: {
label: "Total",
amount: { currency: "USD", value : "55.00" }, // US$55.00
}
};
Payment Request API
const options = {
requestShipping: true,
shippingType: "shipping" // "shipping"(default), "delivery" or "pickup"
};
Payment Request API
const request = new PaymentRequest(methodData, details, options);
request.show()
.then(paymentResponse => {
// Process paymentResponse here
paymentResponse.complete("success");
})
.catch(err => {
console.error("Uh oh, something bad happened", err.message);
});
Payment Request API
Standardize the payment
communication flow as much as
possible
Support different secure payment
methods
Integrates into existing checkout
flow
h>ps://emerald-eon.appspot.com
Demo time
25.64%
Source (Mar 2017): http://caniuse.com/#feat=payment-request
FLAGFLAG
Bluetooth
navigator.bluetooth.requestDevice({
acceptAllDevices: true, optionalServices: ['generic_access']
})
.then(device => device.gatt.connect())
.then(server => {
...
})
.catch(error => {
console.log(error);
});
Web Bluetooth API
h>ps://beaufodfrancois.github.io/sandbox/web-bluetooth/eddystone-url-con8g
Demo time
43.32%
Source (Mar 2017): http://caniuse.com/#feat=web-bluetooth
VR
navigator.getVRDisplays().then(displays => {
displays = displays.filter(display => display.capabilities.canPresent);
if (displays.length === 0) {
console.warn('No devices available able to present.');
return;
}
this._vr.display = displays[0];
this._vr.display.depthNear = DemoVR.CAMERA_SETTINGS.near;
this._vr.display.depthFar = DemoVR.CAMERA_SETTINGS.far;
});
WebVR API
h>ps://ad-socks.herokuapp.com/demo.html
Demo time
0%
Source (Mar 2017): http://caniuse.com/#feat=webvr
FLAG FLAG
Share
navigator.share({

title: 'Web Share API Demo',

text: 'Hello, United Dev Conf. #pwa #webShareAPI #webrocks',

url: 'https://web-today.firebaseapp.com/share'

})

.then(() => console.log('Successful share'))

.catch(error => console.log('Error sharing:', error));
Web Share API
h>ps://justmarkup.com/log/2016/10/using-the-web-share-api
Demo time
0%
Source (Mar 2017): https://paul.kinlan.me/navigator.share
FLAG
Credential Management API
— 50.08%
Payment Request API
— 25.64%
Web Bluetooth API
— 43.32%
WebVR API
— 0%
Web Share API
— 0%
Reduce
development
time
Simple updates
Unified
customer
experience
Easier access
and increased
engagement
104% for new users across all browsers
82% increase in iOS conversion rate
2X more pages visited per session
74% increase in time spent per session
across all browsers
Live: https://aliexpress.com Source: https://developers.google.com/web/showcase/2016/aliexpress
76% higher conversions across browsers
14% more monthly active users on iOS,
30% on Android
4X higher interaction rate from Add to
Homescreen
Live: http://www.alibaba.com Source: https://developers.google.com/web/showcase/2016/alibaba
38% more conversions
40% lower bounce rate
10% longer average session
30% faster page load
Live: https://housing.com Source: https://developers.google.com/web/showcase/2016/housing
Source: https://developers.google.com/web/progressive-web-apps/checklist
Site is served over HTTPS
Pages are responsive on tablets &
mobile devices
The start URL (at least) loads while
offline
Metadata provided for Add to Home
screen
First load fast even on 3G
Site works cross-browser
Page transitions don't feel like they
block on the network
Each page has a URL
Progressive Web App Checklist
https://developers.google.com/web/progressive-web-apps
https://www.youtube.com/user/ChromeDevelopers
https://whatwebcando.today
Learn More
Thank you
Oleh Zasadnyy

@ozasadnyy

More Related Content

What's hot

JAX-RS JavaOne Hyderabad, India 2011
JAX-RS JavaOne Hyderabad, India 2011JAX-RS JavaOne Hyderabad, India 2011
JAX-RS JavaOne Hyderabad, India 2011
Shreedhar Ganapathy
 
High Performance JavaScript (CapitolJS 2011)
High Performance JavaScript (CapitolJS 2011)High Performance JavaScript (CapitolJS 2011)
High Performance JavaScript (CapitolJS 2011)
Nicholas Zakas
 
Hybrid Apps (Native + Web) via QtWebKit
Hybrid Apps (Native + Web) via QtWebKitHybrid Apps (Native + Web) via QtWebKit
Hybrid Apps (Native + Web) via QtWebKit
Ariya Hidayat
 
SF JUG - GWT Can Help You Create Amazing Apps - 2009-10-13
SF JUG - GWT Can Help You Create Amazing Apps - 2009-10-13SF JUG - GWT Can Help You Create Amazing Apps - 2009-10-13
SF JUG - GWT Can Help You Create Amazing Apps - 2009-10-13
Fred Sauer
 

What's hot (20)

A Gentle Introduction to Angular Schematics - Devoxx Belgium 2019
A Gentle Introduction to Angular Schematics - Devoxx Belgium 2019A Gentle Introduction to Angular Schematics - Devoxx Belgium 2019
A Gentle Introduction to Angular Schematics - Devoxx Belgium 2019
 
A Gentle Introduction to Angular Schematics - Angular SF 2019
A Gentle Introduction to Angular Schematics - Angular SF 2019A Gentle Introduction to Angular Schematics - Angular SF 2019
A Gentle Introduction to Angular Schematics - Angular SF 2019
 
JAX-RS JavaOne Hyderabad, India 2011
JAX-RS JavaOne Hyderabad, India 2011JAX-RS JavaOne Hyderabad, India 2011
JAX-RS JavaOne Hyderabad, India 2011
 
Progressive Web Apps
Progressive Web AppsProgressive Web Apps
Progressive Web Apps
 
Spark IT 2011 - Developing RESTful Web services with JAX-RS
Spark IT 2011 - Developing RESTful Web services with JAX-RSSpark IT 2011 - Developing RESTful Web services with JAX-RS
Spark IT 2011 - Developing RESTful Web services with JAX-RS
 
High Performance JavaScript (CapitolJS 2011)
High Performance JavaScript (CapitolJS 2011)High Performance JavaScript (CapitolJS 2011)
High Performance JavaScript (CapitolJS 2011)
 
Building an HTML5 Video Player
Building an HTML5 Video PlayerBuilding an HTML5 Video Player
Building an HTML5 Video Player
 
Keypoints html5
Keypoints html5Keypoints html5
Keypoints html5
 
webcomponents (Jfokus 2015)
webcomponents (Jfokus 2015)webcomponents (Jfokus 2015)
webcomponents (Jfokus 2015)
 
High Performance JavaScript - jQuery Conference SF Bay Area 2010
High Performance JavaScript - jQuery Conference SF Bay Area 2010High Performance JavaScript - jQuery Conference SF Bay Area 2010
High Performance JavaScript - jQuery Conference SF Bay Area 2010
 
How to Webpack your Django!
How to Webpack your Django!How to Webpack your Django!
How to Webpack your Django!
 
Web Components
Web ComponentsWeb Components
Web Components
 
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
 
Learning from the Best jQuery Plugins
Learning from the Best jQuery PluginsLearning from the Best jQuery Plugins
Learning from the Best jQuery Plugins
 
Java REST API Framework Comparison - PWX 2021
Java REST API Framework Comparison - PWX 2021Java REST API Framework Comparison - PWX 2021
Java REST API Framework Comparison - PWX 2021
 
The Role of Python in SPAs (Single-Page Applications)
The Role of Python in SPAs (Single-Page Applications)The Role of Python in SPAs (Single-Page Applications)
The Role of Python in SPAs (Single-Page Applications)
 
Hybrid Apps (Native + Web) via QtWebKit
Hybrid Apps (Native + Web) via QtWebKitHybrid Apps (Native + Web) via QtWebKit
Hybrid Apps (Native + Web) via QtWebKit
 
Java Web Application Security with Java EE, Spring Security and Apache Shiro ...
Java Web Application Security with Java EE, Spring Security and Apache Shiro ...Java Web Application Security with Java EE, Spring Security and Apache Shiro ...
Java Web Application Security with Java EE, Spring Security and Apache Shiro ...
 
Progressive Enhancement 2.0 (Conference Agnostic)
Progressive Enhancement 2.0 (Conference Agnostic)Progressive Enhancement 2.0 (Conference Agnostic)
Progressive Enhancement 2.0 (Conference Agnostic)
 
SF JUG - GWT Can Help You Create Amazing Apps - 2009-10-13
SF JUG - GWT Can Help You Create Amazing Apps - 2009-10-13SF JUG - GWT Can Help You Create Amazing Apps - 2009-10-13
SF JUG - GWT Can Help You Create Amazing Apps - 2009-10-13
 

Similar to Oleh Zasadnyy "Progressive Web Apps: line between web and native apps become thinner"

[convergese] Adaptive Images in Responsive Web Design
[convergese] Adaptive Images in Responsive Web Design[convergese] Adaptive Images in Responsive Web Design
[convergese] Adaptive Images in Responsive Web Design
Christopher Schmitt
 
[cssdevconf] Adaptive Images in RWD
[cssdevconf] Adaptive Images in RWD[cssdevconf] Adaptive Images in RWD
[cssdevconf] Adaptive Images in RWD
Christopher Schmitt
 
[rwdsummit2012] Adaptive Images in Responsive Web Design
[rwdsummit2012] Adaptive Images in Responsive Web Design[rwdsummit2012] Adaptive Images in Responsive Web Design
[rwdsummit2012] Adaptive Images in Responsive Web Design
Christopher Schmitt
 
[cssdevconf] Adaptive Images in Responsive Web Design
[cssdevconf] Adaptive Images in Responsive Web Design[cssdevconf] Adaptive Images in Responsive Web Design
[cssdevconf] Adaptive Images in Responsive Web Design
Christopher Schmitt
 
[refreshaustin] Adaptive Images in Responsive Web Design
[refreshaustin] Adaptive Images in Responsive Web Design[refreshaustin] Adaptive Images in Responsive Web Design
[refreshaustin] Adaptive Images in Responsive Web Design
Christopher Schmitt
 
[rwdsummit] Adaptive Images in Responsive Web Design
[rwdsummit] Adaptive Images in Responsive Web Design[rwdsummit] Adaptive Images in Responsive Web Design
[rwdsummit] Adaptive Images in Responsive Web Design
Christopher Schmitt
 
Honeynet Project Workshop 2014 - Thug: a low-interaction honeyclient
Honeynet Project Workshop 2014 - Thug: a low-interaction honeyclientHoneynet Project Workshop 2014 - Thug: a low-interaction honeyclient
Honeynet Project Workshop 2014 - Thug: a low-interaction honeyclient
Angelo Dell'Aera
 
[HEWEBAR 2012] Adaptive Images in Responsive Web Design
[HEWEBAR 2012] Adaptive Images in Responsive Web Design[HEWEBAR 2012] Adaptive Images in Responsive Web Design
[HEWEBAR 2012] Adaptive Images in Responsive Web Design
Christopher Schmitt
 

Similar to Oleh Zasadnyy "Progressive Web Apps: line between web and native apps become thinner" (20)

[convergese] Adaptive Images in Responsive Web Design
[convergese] Adaptive Images in Responsive Web Design[convergese] Adaptive Images in Responsive Web Design
[convergese] Adaptive Images in Responsive Web Design
 
[cssdevconf] Adaptive Images in RWD
[cssdevconf] Adaptive Images in RWD[cssdevconf] Adaptive Images in RWD
[cssdevconf] Adaptive Images in RWD
 
[rwdsummit2012] Adaptive Images in Responsive Web Design
[rwdsummit2012] Adaptive Images in Responsive Web Design[rwdsummit2012] Adaptive Images in Responsive Web Design
[rwdsummit2012] Adaptive Images in Responsive Web Design
 
Introduction to Html5
Introduction to Html5Introduction to Html5
Introduction to Html5
 
[html5tx] Adaptive Images in Responsive Web Design
[html5tx] Adaptive Images in Responsive Web Design[html5tx] Adaptive Images in Responsive Web Design
[html5tx] Adaptive Images in Responsive Web Design
 
How We Build NG-MY Websites: Performance, SEO, CI, CD (Thai version)
How We Build NG-MY Websites: Performance, SEO, CI, CD (Thai version)How We Build NG-MY Websites: Performance, SEO, CI, CD (Thai version)
How We Build NG-MY Websites: Performance, SEO, CI, CD (Thai version)
 
How We Build NG-MY Websites: Performance, SEO, CI, CD
How We Build NG-MY Websites: Performance, SEO, CI, CDHow We Build NG-MY Websites: Performance, SEO, CI, CD
How We Build NG-MY Websites: Performance, SEO, CI, CD
 
Pinkoi Mobile Web
Pinkoi Mobile WebPinkoi Mobile Web
Pinkoi Mobile Web
 
[cssdevconf] Adaptive Images in Responsive Web Design
[cssdevconf] Adaptive Images in Responsive Web Design[cssdevconf] Adaptive Images in Responsive Web Design
[cssdevconf] Adaptive Images in Responsive Web Design
 
[refreshaustin] Adaptive Images in Responsive Web Design
[refreshaustin] Adaptive Images in Responsive Web Design[refreshaustin] Adaptive Images in Responsive Web Design
[refreshaustin] Adaptive Images in Responsive Web Design
 
Responsive Web in Brief
Responsive Web in BriefResponsive Web in Brief
Responsive Web in Brief
 
Progressive What Apps?
Progressive What Apps?Progressive What Apps?
Progressive What Apps?
 
HTML5 New and Improved
HTML5   New and ImprovedHTML5   New and Improved
HTML5 New and Improved
 
[rwdsummit] Adaptive Images in Responsive Web Design
[rwdsummit] Adaptive Images in Responsive Web Design[rwdsummit] Adaptive Images in Responsive Web Design
[rwdsummit] Adaptive Images in Responsive Web Design
 
Honeynet Project Workshop 2014 - Thug: a low-interaction honeyclient
Honeynet Project Workshop 2014 - Thug: a low-interaction honeyclientHoneynet Project Workshop 2014 - Thug: a low-interaction honeyclient
Honeynet Project Workshop 2014 - Thug: a low-interaction honeyclient
 
AspNetWhitePaper
AspNetWhitePaperAspNetWhitePaper
AspNetWhitePaper
 
AspNetWhitePaper
AspNetWhitePaperAspNetWhitePaper
AspNetWhitePaper
 
Implementation of GUI Framework part3
Implementation of GUI Framework part3Implementation of GUI Framework part3
Implementation of GUI Framework part3
 
[HEWEBAR 2012] Adaptive Images in Responsive Web Design
[HEWEBAR 2012] Adaptive Images in Responsive Web Design[HEWEBAR 2012] Adaptive Images in Responsive Web Design
[HEWEBAR 2012] Adaptive Images in Responsive Web Design
 
Presentation Tier optimizations
Presentation Tier optimizationsPresentation Tier optimizations
Presentation Tier optimizations
 

More from IT Event

More from IT Event (20)

Denis Radin - "Applying NASA coding guidelines to JavaScript or airspace is c...
Denis Radin - "Applying NASA coding guidelines to JavaScript or airspace is c...Denis Radin - "Applying NASA coding guidelines to JavaScript or airspace is c...
Denis Radin - "Applying NASA coding guidelines to JavaScript or airspace is c...
 
Sara Harkousse - "Web Components: It's all rainbows and unicorns! Is it?"
Sara Harkousse - "Web Components: It's all rainbows and unicorns! Is it?"Sara Harkousse - "Web Components: It's all rainbows and unicorns! Is it?"
Sara Harkousse - "Web Components: It's all rainbows and unicorns! Is it?"
 
Max Voloshin - "Organization of frontend development for products with micros...
Max Voloshin - "Organization of frontend development for products with micros...Max Voloshin - "Organization of frontend development for products with micros...
Max Voloshin - "Organization of frontend development for products with micros...
 
Roman Romanovsky, Sergey Rak - "JavaScript в IoT "
Roman Romanovsky, Sergey Rak - "JavaScript в IoT "Roman Romanovsky, Sergey Rak - "JavaScript в IoT "
Roman Romanovsky, Sergey Rak - "JavaScript в IoT "
 
Konstantin Krivlenia - "Continuous integration for frontend"
Konstantin Krivlenia - "Continuous integration for frontend"Konstantin Krivlenia - "Continuous integration for frontend"
Konstantin Krivlenia - "Continuous integration for frontend"
 
Illya Klymov - "Vue.JS: What did I swap React for in 2017 and why?"
Illya Klymov - "Vue.JS: What did I swap React for in 2017 and why?"Illya Klymov - "Vue.JS: What did I swap React for in 2017 and why?"
Illya Klymov - "Vue.JS: What did I swap React for in 2017 and why?"
 
Evgeny Gusev - "A circular firing squad: How technologies drag frontend down"
Evgeny Gusev - "A circular firing squad: How technologies drag frontend down"Evgeny Gusev - "A circular firing squad: How technologies drag frontend down"
Evgeny Gusev - "A circular firing squad: How technologies drag frontend down"
 
Vladimir Grinenko - "Dependencies in component web done right"
Vladimir Grinenko - "Dependencies in component web done right"Vladimir Grinenko - "Dependencies in component web done right"
Vladimir Grinenko - "Dependencies in component web done right"
 
Dmitry Bartalevich - "How to train your WebVR"
Dmitry Bartalevich - "How to train your WebVR"Dmitry Bartalevich - "How to train your WebVR"
Dmitry Bartalevich - "How to train your WebVR"
 
James Allardice - "Building a better login with the credential management API"
James Allardice - "Building a better login with the credential management API"James Allardice - "Building a better login with the credential management API"
James Allardice - "Building a better login with the credential management API"
 
Fedor Skuratov "Dark Social: as messengers change the market of social media ...
Fedor Skuratov "Dark Social: as messengers change the market of social media ...Fedor Skuratov "Dark Social: as messengers change the market of social media ...
Fedor Skuratov "Dark Social: as messengers change the market of social media ...
 
Андрей Зайчиков "Архитектура распределенных кластеров NoSQL на AWS"
Андрей Зайчиков "Архитектура распределенных кластеров NoSQL на AWS"Андрей Зайчиков "Архитектура распределенных кластеров NoSQL на AWS"
Андрей Зайчиков "Архитектура распределенных кластеров NoSQL на AWS"
 
Алексей Рагозин "Java и linux борьба за микросекунды"
Алексей Рагозин "Java и linux борьба за микросекунды"Алексей Рагозин "Java и linux борьба за микросекунды"
Алексей Рагозин "Java и linux борьба за микросекунды"
 
Volodymyr Lyubinets "Introduction to big data processing with Apache Spark"
Volodymyr Lyubinets "Introduction to big data processing with Apache Spark"Volodymyr Lyubinets "Introduction to big data processing with Apache Spark"
Volodymyr Lyubinets "Introduction to big data processing with Apache Spark"
 
Наш ответ Uber’у
Наш ответ Uber’уНаш ответ Uber’у
Наш ответ Uber’у
 
Александр Крашенинников "Hadoop High Availability: опыт Badoo"
Александр Крашенинников "Hadoop High Availability: опыт Badoo"Александр Крашенинников "Hadoop High Availability: опыт Badoo"
Александр Крашенинников "Hadoop High Availability: опыт Badoo"
 
Leonid Vasilyev "Building, deploying and running production code at Dropbox"
Leonid Vasilyev  "Building, deploying and running production code at Dropbox"Leonid Vasilyev  "Building, deploying and running production code at Dropbox"
Leonid Vasilyev "Building, deploying and running production code at Dropbox"
 
Анатолий Пласковский "Миллионы карточных платежей за месяц, или как потерять ...
Анатолий Пласковский "Миллионы карточных платежей за месяц, или как потерять ...Анатолий Пласковский "Миллионы карточных платежей за месяц, или как потерять ...
Анатолий Пласковский "Миллионы карточных платежей за месяц, или как потерять ...
 
Mete Atamel "Resilient microservices with kubernetes"
Mete Atamel "Resilient microservices with kubernetes"Mete Atamel "Resilient microservices with kubernetes"
Mete Atamel "Resilient microservices with kubernetes"
 
Andrew Stain "User acquisition"
Andrew Stain "User acquisition"Andrew Stain "User acquisition"
Andrew Stain "User acquisition"
 

Recently uploaded

+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
?#DUbAI#??##{{(☎️+971_581248768%)**%*]'#abortion pills for sale in dubai@
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Safe Software
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
Joaquim Jorge
 
Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire business
panagenda
 

Recently uploaded (20)

+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
Top 5 Benefits OF Using Muvi Live Paywall For Live Streams
Top 5 Benefits OF Using Muvi Live Paywall For Live StreamsTop 5 Benefits OF Using Muvi Live Paywall For Live Streams
Top 5 Benefits OF Using Muvi Live Paywall For Live Streams
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
 
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin WoodPolkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
 
Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024
 
Real Time Object Detection Using Open CV
Real Time Object Detection Using Open CVReal Time Object Detection Using Open CV
Real Time Object Detection Using Open CV
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
 
Deploy with confidence: VMware Cloud Foundation 5.1 on next gen Dell PowerEdg...
Deploy with confidence: VMware Cloud Foundation 5.1 on next gen Dell PowerEdg...Deploy with confidence: VMware Cloud Foundation 5.1 on next gen Dell PowerEdg...
Deploy with confidence: VMware Cloud Foundation 5.1 on next gen Dell PowerEdg...
 
Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt Robison
 
Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
 
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
 
Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire business
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
 
GenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdfGenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdf
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
 

Oleh Zasadnyy "Progressive Web Apps: line between web and native apps become thinner"