Progressive Web Applications

Size: px
Start display at page:

Download "Progressive Web Applications"

Transcription

1 Introduction Progressive Web Applications Progressive Web Applications (PWAs for short) are a new type of application that represents a hybrid application type. A PWA is not only able to work without a connection (offline), but it also performs relatively well on a slow network connection. In this handbook, we ll build a sample application that highlights some of the critical features of progressive web applications. To put it in simple terms, a PWA should act as a native mobile application, bringing specific features from the mobile world to the web: things like offline availability. The term progressive in the name means that the user experience for the application is progressively enhanced by other factors such as the speed of the network connection. (The term relates back to the era of progressive JavaScript when JavaScript was used as a progressive enhancement for websites. The lack of JavaScript support did not affect the user s experience, but having JavaScript enabled meant that additional things were possible). The same theory is applicable for progressive applications having a slow network connection should still allow users to interact with the application but having a faster network should progressively enhance the user s experience. PWAs are enabled by some great and recent technologies available in browsers such as Service Workers, the Push API and local storage (or IndexedDB). Reader requirements The reader should be familiar with web related technologies, including HTML, CSS and JavaScript (preferably ES 2015), Node.js and its ecosystem to entirely be able to absorb the knowledge provided by the handbook. New to JavaScript ES 2015? We got you covered. Check out this free course! / 1

2 Get the code Get the source code of the application from GitHub: The Progressive Web Application checklist Let s take a look at all the properties of Progressive Web Apps, as set out by Google: - App-like o There s a separation between the application s functionality and content. The shell of the app can load separately from the data - Connectivity independent o By using service workers, the application can work offline or on lowquality networks - Discoverable o The web application can be used as a mobile application via a manifest file, also allowing search engines to find it - Fresh o The application is always up-to-date because of the service worker update process - Installable o Users of the application should be able to place an icon to their home screens to access the app, without having to visit an app store - Linkable o The application should be shareable via a link and it shouldn t require complex installation (see earlier point) - Progressive o Regardless of what device, browser and network connection a user has, the application works and provides the same experience - Re-engageable o Engaging (and re-engaging) with the application should be available via push notifications. - Responsive o The application s design is responsive it works on desktop, mobile and tablet. - Safe o The application is served over HTTPS The above list nicely sums up what progressive web applications should try to achieve. Google has also developed a tool called Lighthouse that we can use to test our applications it takes some of the previously mentioned points into consideration, and it does give an overall score for our application (it also scores it for usability, SEO, Accessibility and Performance). / 2

3 Figure 1 - A report generated by Lighthouse Requirements of the application In this handbook, we ll put together an application to display news coming from an API. (The API is something that we ll be running locally) These are the high-level requirements for our application: On the first load of the application: o If there s no network connection (offline mode): Only display the application shell (HTML) Cache the HTML and other assets Naturally, no data is going to be displayed o If there s a network connection (online mode): Load data from the API and display news cards Cache the data Upon consecutive application loads: o If there s no network connection available (i.e. offline): The data is retrieved from the application cache, results shown If the application cache is empty, no match results should be displayed o If there s an available network connection (i.e. online): Make a call to the API to see if new data is available Add new items to the HTML Refresh the cache, if necessary The application should act as native app as well o It should be possible to add an application icon to a mobile device (Android, ios, Windows) o If the API gets a new news item added, a push notification should notify the user about this fact / 3

4 As you can see from the list above it s not a full-featured application that is not the point of this handbook but rather to show you the core principles of PWAs. You can of develop the application further to add extra functionality. Let s revise what is that we d like to achieve. We would like to create an application and make an API call and display some information. We would like to make sure that we adhere to the main points outlined earlier in this document regarding progressive web applications most importantly, in this first round, we d like to make sure that data is available in the application even when there s no network connectivity (i.e. we are working offline). Before you start Before you get started, please make sure that you have your environment setup correctly. This means that you should have the latest version of Node.js installed (either LTS or Current) and that you have cloned the source code of the application from GitHub. Please make sure that you set up the dependencies for the project, so after getting the files from GitHub make sure to execute npm i from the project s root folder. The API For this handbook, we have decided to create a simple API which is also part of the codebase provided to you. The API uses Node.js and Restify. In order to start the API, please navigate to the api folder and execute node api.js. To test the API, please use a tool like curl, Postman or Insomnia. Opening in your browser should also work, and you should see data returned by the API. / 4

5 Launching the application Figure 2 - Sample API call using Insomnia Starting the application is possible via npm scripts npm start fires up the sample application as well as the API. The command npm run server starts the HTTP server running the progressive web app, and npm run api starts the API server. Are you new to Node.js? For 15 you can learn the basics of Node.js and everything that you need to know to start being a productive Node.js developer. / 5

6 Developing the application The application shell The application is going to be a straightforward one we ll have only a few lines of HTML code and a few lines of JavaScript. Don t forget, this time we are only highlighting the fundamental concepts. This is how our HTML looks like for now: <!doctype html> <html> <head> <link rel="stylesheet" href=" beta/css/materialize.min.css"> </head> <body> <div class="navbar-fixed"> <nav> <div class="nav-wrapper"> <a href="#!" class="brand-logo">pwa News</a> </div> </nav> </div> <main id="main"> <div class="row template"> <div class="col s12"> <div class="card darken-1"> <div class="card-content"> <span class="card-title">breaking! PWA are on the rise</span> <p class="card-content-text">pwas, also known as, Progressive Web Applications are taking over the internet. Embrace this new piece of technology coming your way!</p> </div> <div class="card-action"> <a class="read-more">read more</a> </div> </div> </div> </div> </main> </body> </html> If you load this application now (providing the fact that you have an active internet connection to let the browser download the materialize CSS framework, this is what you should be presented with: / 6

7 Figure 3 - The application shell with sample, test data Now of course what we see here is some static data we did this step to verify that the application indeed looks as expected. Please go ahead and delete the sample title and the same card content. Going forward we ll be adding this data from the API. / 7

8 A call to the API It is now time to add some JavaScript code and load news data. Go ahead and create a file called app.js and add the content below. For the time being it is going to be a very simple request. Here s what we ll do: take the first div, use that as a template and we ll clone that for each news article received from the API. We will then take the returned data and populate the card title, description and read more link: const url = ' const newscard = document.queryselector('.template'); fetch(url).then(response => response.json()).then(news => { news.foreach(newsitem => { const main = document.getelementbyid('main'); const card = newscard.clonenode(true); card.queryselector('.card-title').innerhtml = `<strong>${newsitem.title</strong> by ${newsitem.author on ${newsitem.publishedat`; card.queryselector('.card-content-text').textcontent = newsitem.description; card.queryselector('.read-more').setattribute('href', newsitem.url); main.appendchild(card); ); newscard.style.display = 'none'; ).catch(error => console.error(error)); In the above code, we use the Fetch API to retrieve information from our API. Let s not forget to add the following line just before the closing </body> tag in our index.html file: <script src="app.js"></script> Take a look at the output on the screenshot below this is how our application looks like at the moment. / 8

9 Figure 4 - The application displaying data from the API At this point, we have a working application that displays information when the network is available. Bringing the network offline in the browser will, of course, present us the infamous downasaur, and no data will be visible at all. That s not an app like functionality. / 9

10 Figure 5 - The dreaded downausur - this is what we see if the application is offline You can bring the network offline by selecting the highlighted option using the Chrome DevTools under the Network tab. To get an application ready for offline functionality, we need to introduce a service worker. In light of this, let s create another JavaScript file for the sake of simplicity, let s call this file service-worker.js. The Service Worker is going to be responsible for caching parts of our application as well as making sure that data (if cached) is returned to the user so that even though there s no active network connection, the application can be visible. The first thing that we ll do in this service worker file is to give our cache a name and install the service worker itself. We will be using two caches, one to cache the application shell and the other to cache the data. We ll start by caching the application files. / 10

11 const cachename = 'pwa-news-cache'; const files = [ '/', '/index.html', '/app.js', ' beta/css/materialize.min.css' ]; self.addeventlistener('install', event => { event.waituntil( caches.open(cachename).then(cache => cache.addall(files)) ); ); Notice the usage of self. This is guaranteed to point to the ServiceWorkerGlobalScope where we can find properties related to the service worker itself (The ServiceWorkerGlobalScope is an interface of the ServiceWorker API.). We could have used this as well, but that adheres to the same binding rules that the rest of your environment, therefore since we explicitly want to access the Service Worker scope, it makes sense to use self. What we are caching during the installation of the service worker is the shell of the application: the files required the display the app itself. For this very basic application, all we need is index.html, app.js and the materialize CSS framework. Notice how we also add / to the files array this needs to be done because our application could be requested both as and Also notice that when adding files for caching, we can not only add files from the local filesystem but also files over https that our application requires. We then go ahead, open the cache (with the name of pwa-news-cache) and populate it with the files. If the promise to add the files to the cache resolves successfully, the installation of the service worker is complete. So far so good. Let s now add the functionality that would return us the application shell from the cache. To achieve this, we ll add an event listener for the fetch event. If there s a match for our request in the cache we return it, otherwise we ll attempt to fetch the data regularly. From this, we can deduce that the Service Worker acts as a proxy between the browser and the network. We can capture the network request, and act on it, for example, modify it. / 11

12 self.addeventlistener('fetch', event => { console.log( [SW] Fetching:, event.request); event.respondwith( caches.match(event.request).then(response => { if (response) { return response; return fetch(event.request); ) ); ); We can simplify the above code so that instead of the if conditional, we have an or statement in the return statement, or, even better, we can remove the curly brackets, and since we are using an arrow function, the return statement is going to be implicit:.then(response => response fetch(event.request)) We now have a service worker ready albeit very simple. (Don t worry we ll extend it soon enough). The last step that we need to make is to register the service worker. So, going back to our app.js file we need first to check if service worker is available in the browser, and if it is, we can register it: if ('serviceworker' in navigator) { navigator.serviceworker.register('./service-worker.js').then(() => console.log('registered Service Worker')).catch(error => console.log(error)); Now, if we bring the application offline, we still get some errors, but the browser can serve app.js without a problem since it s coming from the cache. Remember, earlier no files were shown in fact, we only saw downausur, now index.html, app.js as well as the materialise CSS framework are loaded from the cache meaning that the application shell is visible, without any data. / 12

13 Figure 6 - The application shell loaded from the cache Figure 7 - Network requests showing that some requests were successful / 13

14 Of course, the request to the API errors out because we haven t cached the returned data yet. To implement this, we ll be using what is called a cache-firstthen-network strategy. This strategy attempts to retrieve data from the cache, and if it s not available, it ll try the network. Please note that there are various caching strategies available and each has a different use case. For an exhaustive list of use cases, please consult this page: To develop this part of our application, we need to modify the service worker and intercept requests to our API and make sure that the response is stored in the cache remembering that this cache should be a different one. Having a cache for the application shell (the files) and another cache for the data makes sense, and it allows us to manage these caches separately. In light of this, we ll add a new cache name in our service worker: const datacachename = 'pwa-news-data-cache'; We ll then go ahead and separate the fetch request to the API from the request to the application shell files essentially we are extending the previously created event listener: self.addeventlistener('fetch', event => { console.log('[sw] Fetching:', event.request); const api = ' if (event.request.url.indexof(api) > -1) { event.respondwith( caches.open(datacachename).then(cache => { return fetch(event.request).then(response => { cache.put(event.request.url, response.clone()); return response; ).catch(error => console.error('error with cache fetch', error)); ).catch(error => console.error('error opening cache', error)) ); else { event.respondwith( caches.match(event.request).then(response => response fetch(event.request)).catch(error => console.error('error during network fetch', error)) ); ); Notice response.clone() above. We need to clone the response because it comes back as a stream and therefore it can be consumed once. Since we are going to be / 14

15 using it more than once (return it to the browser as well as add it to the data cache) we need to clone it. At the moment we are listening for fetch events, and if the event is a request to the API, we open the cache, update it and return the response itself. This is what constitutes a cache-first-then-network strategy. At this moment we can explore our service worker and see if the API requests (as well as the application shell) is cached: Figure 8 - The application shell cache Figure 9 - The application data cache Courses If you re interested in learning more about JavaScript, TypeScript, Node.js or even the MEAN stack please visit our site for a range of free and paid courses: Articles If you d like to read about the latest and greatest advancements in web related technologies, please visit our blog: Before we make our application entirely offline capable, let s do some code refactoring so that we can have a neater and cleaner codebase. It d be great to know when a network request happened so that we can differentiate between when to return data from the network (that could be more up to date) vs when to return data from the cache. / 15

16 Let s introduce a new variable in app.js: let datafromnetwork = false; Let s also create a separate function as well to create the cards for the news that arrive via the API: function generatenewscard(newsitem) { const main = document.getelementbyid('main'); const card = newscard.clonenode(true); card.queryselector('.card-title').innerhtml = `<strong>${newsitem.title</strong> by ${newsitem.author on ${newsitem.publishedat`; card.queryselector('.card-content-text').textcontent = newsitem.description; card.queryselector('.read-more').setattribute('href', newsitem.url); main.appendchild(card); Also, update the fetch call and place it within another function so that later we can call this as well: function makenetworkrequest() { return fetch(url).then(response => response.json()).then(news => { news.foreach(newsitem => generatenewscard(newsitem)); newscard.style.display = 'none'; ).catch(error => console.error(error)); This allows us to call both the makenetworkrequest() function multiple times when we are required to make a fetch call, and we can also re-use the generatenewscard() method here to render the cards. This separation of concern is going to pay off in the long term especially if we were to build a much larger, complex application. So now the last bit of making the application fully functional offline: the service worker part of our code is ready, but now we need to make sure that the application itself uses data from the cache if it s available. Therefore, the last bit that we need to modify is app.js: function start() { if ('caches' in window) { caches.match(url).then(response => { if (!response) { throw Error('No cached data!') return response.json(); / 16

17 ).then(news => { if (!datafromnetwork) { news.foreach(newsitem => generatenewscard(newsitem)) newscard.style.display = 'none'; ).catch(() => makenetworkrequest()).catch(error => console.error(error)); else { makenetworkrequest(); Remember that in the service worker we have placed a clone of the response to the cache using the URL as the key: cache.put(event.request.url, response.clone()); The start() function is going to be responsible for checking the existence of the cache in the browser. If it s available, we try to match the API request to an entry in the cache and if we have a response we serve that, iterate through them and build the cards. If the cache is not available, or if the cache does not contain data, we call the makenetworkrequest() function which attempts to make a fetch call to the API itself. Also notice how we are reusing the datafromnetwork variable if it s not false, meaning that if we do have data from the network we make sure not to overwrite this newer network data. Note the first catch block as well. This works in conjunction with the throw statement in the first promise. If the cache doesn t have a response (i.e. there s no cached data available) we throw an error, and that error is caught by the first catch block, which in turn calls networkrequest that attempts to get data from the network. This is how we can do the lookup in the start() function for the requests made in our application. Congratulations, we have just completed our first ever progressive web application that works offline and uses a service worker. We can completely disable the network, we can even stop the API (if there s one running locally), and our site still works and displays data coming from the data cache, as shown below. / 17

18 Figure 10 - The application still displays data even though the network is offline Let s also make a test. Add a new news item to the API and refresh the site in offline mode. We should not see the new item displayed of course. Once the application is brought online again, and once it is refreshed, the new news article is immediately going to be visible. Bringing the application offline again displays this latest article now since it has been placed in the cache. Discoverable Now it s time to make the application discoverable. What we mean by this is that the application should be easy to launch again by the user. This, of course, means that an app icon can be placed on the user s mobile and tapping that icon would launch the application. We can achieve this via a manifest file. manifest.json The application manifest is a JSON file that allows us to define how the application looks like when it s placed on the home screen of the user s mobile. In this JSON file, we can define many things, including the name of the application (what is / 18

19 going to be displayed on the home screen) along with the application icon as well as the URL to launch the application. { "name": "PWA News", "short_name": "News", "icons": [{ "src": "assets/news-100.png", "sizes": "100x100", "type": "image/png" ], "start_url": "/index.html", "display": "standalone", "background_color": "#fff", "theme_color": "#000" The last step is to tell the application about this manifest file, and we can very quickly do that by adding a <link> element in the <head> of our HTML page. <link rel="manifest" href="/manifest.json"> If we have done everything correctly, the details of the manifest file should also show up in the Chrome DevTools under Applications > Manifest. / 19

20 Figure 11 - The manifest file as seen by Chrome DevTools ios, Windows What we have done is excellent so far, but this manifest file is only relevant to Android devices. If we want to test against phones running ios and Windows, we need to make additional changes to our HTML file. Namely, we need to add a <meta> elements to tell the application about the apple touch icon as well as the Windows Tile Image. <meta name="apple-mobile-web-app-capable" content="yes"> <meta name="apple-mobile-web-app-status-bar-style" content="black"> <meta name="apple-mobile-web-app-title" content="shopping List"> <link rel="apple-touch-icon" href="assets/ios.png"> <meta name="msapplication-tileimage" content="assets/others.png"> <meta name="msapplication-tilecolor" content="#fff"> And now we are done. Users can add the icon to their home screens and launch the application from there. / 20

21 This free handbook has been brought to you by Tamas Piros Here are a few screenshots from an ios device. Notice how the icon from the manifest file looks like just another app installed from the App Store. Figure 12 - The application seen on a mobile device / 21

22 Push API Please note that the Push API is an experimental technology and each browser handles them slightly differently due to a lack of standards. In the list of requirements for an application to be considered progressive, we have mentioned that it should be re-engageable meaning that the user should be notified of changes to the application via push notifications. To achieve this functionality, we can rely on the Push API that is supported in the browsers. The Push API allows us to send push notifications to the users these work in the same way as notification would work on a mobile device. One of the critical requirements for an application to work with the Push API is to have an active service worker and luckily this is something that we already have. Just like how the service worker allowed us to add an event listener for fetch, we can do the same for a push as well. An active service worker can subscribe to push notifications. The process flow is simple. There s a server in place that sends a notification to the client, and if the right permissions are granted (via a popup when first initialising / launching the application), the client can receive the push event. The subscription object contains a few things amongst which we can find the endpoint and a public key. The endpoint is different for each browser, and the public key is used to encrypt the message. The endpoint URL plays an essential part in this whole process as it contains a unique identifier which identifies the route to the right device and it also helps the browser to select the appropriate service worker to handle the request. Since the Push notification contains some text, the server also adds this data as a payload which we can easily extract on the client side. Now, the Web Push API protocol is complex, and luckily there s an implementation of it already which we can use. It s a package called web-push available in npm. Note that some websites do not use Push Notifications correctly they ask for permission to send notifications upon the first load, which is usually a bad idea since the user didn t even have a chance to know what the site is about. Be wary of such user experience related quirks. Updating the Service Worker We ll need to make a few updates in our application, let s start with the easiest one the service worker. As mentioned earlier an active service worker is required for the Push notifications to work and in order to achieve this we need to add an event listener for the push events: / 22

23 self.addeventlistener('push', event => { console.log('[sw] Push received'); console.log('[sw] Push data', event.data); const payload = JSON.parse(event.data.text()); event.waituntil( self.registration.shownotification('pwa News', { body: `${payload.title (by ${payload.author)` ) ); ); Whenever the server sends a new notification, it does so with a payload. It goes without saying that it is possible to extract that payload and effectively access the properties of it providing the fact of course that it is a valid JSON object. The shownotification() method displayed above accepts a few parameters, the first one is the title of the notification, and as part of the options parameter, we pass in a body which is the notification s next. Other optional parameters include things like a badge, an icon as well as vibrate specifying a vibration pattern. Let s modify our API server so that it can be ready to handle Push Notifications for us. As mentioned earlier we need to have a signature and therefore a public and a private key pair as well. Luckily the web-push package can create that for us as well. const webpush = require('web-push'); const keys = webpush.generatevapidkeys(); webpush.setvapiddetails( ' keys.publickey, keys.privatekey ); function vapidpublickey(request, response) { response.json(keys.publickey); module.exports = { vapidpublickey ; Under the hood the Push API uses JSON Web Tokens (JWT) a detailed discussion of this topic is outside the scope of this handbook, but you can find an excellent explanation of it here: / 23

24 Next, we need to update our app.js file we need to add some push notification related checks as well, in this first round, we ll be asking for the user s permission. The push notification can only arrive if the user has authorised our application to send notifications. Note that you may not see the popup if you have, in the past, allowed the domain and port combination to display notifications. You can check this by going to Settings > Advanced > Content Settings > Notifications. We ll enable the Push Manager once the service worker has been registered. Since with every push notification that we want to send we ll also need to send a valid subscription, we ll need a way to save this subscription for later use. Therefore, we ll first modify our service worker registration code: if ('serviceworker' in navigator && 'PushManager' in window) { navigator.serviceworker.register('./service-worker.js').then(() => console.log('registered Service Worker')).catch(error => console.log(error)); navigator.serviceworker.ready.then(async registration => { serviceworkerregistration = registration; const subscription = await createsubscription(); const response = await fetch(' { method: 'post', headers: { 'Content-type': 'application/json', body: JSON.stringify({ subscription ) ); ).catch(error => console.log(error)); The above code first registers the service worker, then waits for it to be successful and then calls the function that creates a subscription: async function createsubscription() { const publickeyrequest = await fetch(`${baseurl/api/getpublickey`); const publickey = await publickeyrequest.json(); const finalkey = urlbase64touint8array(publickey); return serviceworkerregistration.pushmanager.subscribe({ uservisibleonly: true, applicationserverkey: finalkey ); / 24

25 Please note that at the moment Chrome doesn t support the vapidpublickey (the key generated by the server) in a base64-encoded string format. Therefore, we need to convert it to a Uint8 Array this function was taken from Google s implementation of the Push API. Calling savesubscription() for the first time asks the user if they want to start receiving notifications from our application. Figure 13 - Notification asking for the user's permission Once the user has accepted to receive notifications, we need to make sure that we store this subscription as we ll need to reuse that later. To achieve this, the following code needs to be added to the server: / 25

26 let savedsubscription = null; function savesubscription(request, response) { const subscription = request.body.subscription; savedsubscription = JSON.stringify(subscription); return response.json(); function getsubscription() { return savedsubscription; Note that here we save the subscription in a variable, in a production app this would have to be saved to a database for example. We d like to send notifications to the users if a new article arrives, and for demonstration purposes, we ll enable this functionality at the API level. When a new article arrives, we ll update the list of articles returned by the API, and if there s a valid subscription, we ll send a notification as well, which is going to be displayed by the browser. function addnews(request, response) { const freshnews = request.body; news.push(freshnews); const subscription = JSON.parse(pushRoutes.getSubscription()); if (subscription) { webpush.sendnotification(subscription, JSON.stringify(freshNews)).then(() => response.json(news)).catch(error => console.error('push notification error', error)); else { return response.json(news); That s all the code that we need to make our app re-engageable. / 26

27 Figure 14 - A push notification received HTTPS One last thought about progressive web applications one of the key requirements is that they should always run in a secure environment, this means that an application should always be running via HTTPS. This is an absolute necessity, and there s not much more to say about this always, always use HTTPS. Debugging tips The best way to debug service workers is to use Chrome DevTools in fact in some of the screenshots seen in this handbook show the use-cases for it. The most important tab is the Application tab, under which you can find a Service Worker menu this is where you can take a look at the service worker settings. / 27

28 Figure 15 - Chrome DevTools On the screenshot, some of the most important items are highlighted. Using the Application > Service Workers menu we see the currently active service worker as well as bring the service worker offline. Note the Update on reload option this is an important feature since this makes sure that the browser loads the latest version of the service worker upon refresh. Under Application > Manifest we can take a look at the manifest file details providing the fact that a manifest.json file has been provided to the application. Under Application > Cache we can explore the cache itself and see what it contains exactly. / 28

29 Also, note the Application > Clear Storage menu. When developing progressive web applications, we store some data in the cache, create manifest files, push notifications, register service workers. Clearing these up manually is quite a tedious task, but this option helps us to remove all storage items at one go. And last but not least, a practical thing would be to separate console.log() statements and have some prefix added to the log entries coming from the service worker vs the application so that it s easier to follow which message is logged from where. Throughout this handbook, the following notation applied: no prefix for logs coming from the application related files, [SW] prefix for logs coming from the service worker. Lighthouse Test We talked about a tool called Lighthouse before it scores an application based on a variety of things amongst which one is how progressive the application is. We can run a test on our application to see how well it s done. To get started with lighthouse, make sure that it s installed globally via npm: npm i -g lighthouse It s straightfoward to use this tool, and we can get it to auto-generate a report for us. Make sure that the application is up and running and execute the following command (replace the protocol and domain if needed): lighthouse view Figure 16 - Lighthouse PWA score The returned score for PWA is 91 and the only reason why we don t get a 100 is that the HTTP server doesn t do proper redirects to HTTPS. This is because a local development server is running. / 29

30 Conclusion Progressive Web Applications certainly have great use cases, and they help users who are not always connected to a network or who have some slow connection available to them. Over the past years there have been many ideologies around whether the application should be mobile first, element first, responsive, desktop first and probably a countless number of options. Even though this handbook is trying to highlight why progressive web applications are great they can be run on both desktop and mobile (and on mobile they do act like an actual application) as developers we need to make sure that we pick and choose the right technology to solve the right problem. In my opinion, this is the hardest thing to solve. Courses If you re interested in learning more about JavaScript, TypeScript, Node.js or even the MEAN stack please visit our site for a range of free and paid courses: Articles If you d like to read about the latest and greatest advancements in web related technologies, please visit our blog: / 30

Eme03. Mobilise your Applications as Progressive Web Apps

Eme03. Mobilise your Applications as Progressive Web Apps Eme03. Mobilise your Applications as Progressive Web Apps Paul Harrison (Eight Dot Three) @PaulHarrison Knut Herrman (Leonso GmbH) @KnutHerrman 22nd May 2018 #engageug 1 Paul Harrison Consultant at own

More information

Building Mobile Apps with the ArcGIS API for JavaScript. Andy Gup, Lloyd Heberlie, Thomas Other

Building Mobile Apps with the ArcGIS API for JavaScript. Andy Gup, Lloyd Heberlie, Thomas Other Building Mobile Apps with the ArcGIS API for JavaScript Andy Gup, Lloyd Heberlie, Thomas Other Agenda Capabilities Managing app life-cycle Working with locally hosted builds Working from JS frameworks

More information

Deep User Engagement:

Deep User Engagement: Deep User Engagement: Add to Home Screen and Web Push Notifications ROADSHOW Progressive Web Apps Reliable Fast loading, work offline and on flaky networks Fast Smooth animation, jank-free scrolling and

More information

PWA-ifying Santa Tracker. Sam

PWA-ifying Santa Tracker. Sam PWA-ifying Santa Tracker Sam Thorogood @samthor About Sam Developer Relations on "Web" Varied projects: polyfills, apps, demos, videos, talks, internal + public advocacy Demo Why? Open-Source Education

More information

Lab 1: Introducing HTML5 and CSS3

Lab 1: Introducing HTML5 and CSS3 CS220 Human- Computer Interaction Spring 2015 Lab 1: Introducing HTML5 and CSS3 In this lab we will cover some basic HTML5 and CSS, as well as ways to make your web app look and feel like a native app.

More information

PROGRESSIVE WEB APPS & EDUCATION

PROGRESSIVE WEB APPS & EDUCATION PROGRESSIVE WEB APPS & EDUCATION How Developers Can Build Web Sites With Native App User Experience and the Natural Advantages the Web Offers Businesses and Customers CHRIS LOVE http://bit.ly/2j3salg @chrislove

More information

Quick.JS Documentation

Quick.JS Documentation Quick.JS Documentation Release v0.6.1-beta Michael Krause Jul 22, 2017 Contents 1 Installing and Setting Up 1 1.1 Installation................................................ 1 1.2 Setup...................................................

More information

Unifer Documentation. Release V1.0. Matthew S

Unifer Documentation. Release V1.0. Matthew S Unifer Documentation Release V1.0 Matthew S July 28, 2014 Contents 1 Unifer Tutorial - Notes Web App 3 1.1 Setting up................................................. 3 1.2 Getting the Template...........................................

More information

Offline-first PWA con Firebase y Vue.js

Offline-first PWA con Firebase y Vue.js Offline-first PWA con Firebase y Vue.js About me Kike Navalon, engineer Currently working at BICG playing with data You can find me at @garcianavalon 2 We live in a disconnected & battery powered world,

More information

Client Side JavaScript and AJAX

Client Side JavaScript and AJAX Client Side JavaScript and AJAX Client side javascript is JavaScript that runs in the browsers of people using your site. So far all the JavaScript code we've written runs on our node.js server. This is

More information

GETTING STARTED GUIDE

GETTING STARTED GUIDE SETUP GETTING STARTED GUIDE About Benchmark Email Helping you turn your email list into relationships and sales. Your email list is your most valuable marketing asset. Benchmark Email helps marketers short

More information

SAMPLE CHAPTER. Dean Alan Hume. FOREWORD BY Addy Osmani MANNING

SAMPLE CHAPTER. Dean Alan Hume. FOREWORD BY Addy Osmani MANNING SAMPLE CHAPTER Dean Alan Hume FOREWORD BY Addy Osmani MANNING Progressive Web Apps by Dean Alan Hume Chapter 3 Copyright 2018 Manning Publications brief contents PART 1 DEFINING PROGRESSIVE WEB APPS...1

More information

How To Present Progressive Web Apps To Your Clients

How To Present Progressive Web Apps To Your Clients How To Present Progressive Web Apps To Your Clients AND HELP THEM WIN THE MOBILE WEB TABLE OF CONTENTS 01 And Then There Were Three PAGE 03 05 The Major Benefits of PWAs PAGE 07 02 Introducing PWAs PAGE

More information

Serverless Single Page Web Apps, Part Four. CSCI 5828: Foundations of Software Engineering Lecture 24 11/10/2016

Serverless Single Page Web Apps, Part Four. CSCI 5828: Foundations of Software Engineering Lecture 24 11/10/2016 Serverless Single Page Web Apps, Part Four CSCI 5828: Foundations of Software Engineering Lecture 24 11/10/2016 1 Goals Cover Chapter 4 of Serverless Single Page Web Apps by Ben Rady Present the issues

More information

CSCU9B2 Practical 1: Introduction to HTML 5

CSCU9B2 Practical 1: Introduction to HTML 5 CSCU9B2 Practical 1: Introduction to HTML 5 Aim: To learn the basics of creating web pages with HTML5. Please register your practical attendance: Go to the GROUPS\CSCU9B2 folder in your Computer folder

More information

Evolution of the "Web

Evolution of the Web Evolution of the "Web App" @HenrikJoreteg @Hoarse_JS THIS USED TO BE SIMPLE! 1. WRITE SOME HTML 2. LAY IT OUT WITH FRAMES OR TABLES 3. FTP IT TO A SERVER! 4. BAM! CONGRATULATIONS, YOU RE A WEB DEVELOPER!

More information

Evaluation and Implementation of Progressive Web Application

Evaluation and Implementation of Progressive Web Application Parbat Thakur Evaluation and Implementation of Progressive Web Application Helsinki Metropolia University of Applied Sciences Bachelor of Engineering Information Technology Thesis 6 April, 2018 Abstract

More information

Introduction, Notepad++, File Structure, 9 Tags, Hyperlinks 1

Introduction, Notepad++, File Structure, 9 Tags, Hyperlinks 1 Introduction, Notepad++, File Structure, 9 Tags, Hyperlinks 1 Introduction to HTML HTML, which stands for Hypertext Markup Language, is the standard markup language used to create web pages. HTML consists

More information

Privacy and Security in Online Social Networks Department of Computer Science and Engineering Indian Institute of Technology, Madras

Privacy and Security in Online Social Networks Department of Computer Science and Engineering Indian Institute of Technology, Madras Privacy and Security in Online Social Networks Department of Computer Science and Engineering Indian Institute of Technology, Madras Lecture 07 Tutorial 2 Part 1 Facebook API Hi everyone, welcome to the

More information

Using Development Tools to Examine Webpages

Using Development Tools to Examine Webpages Chapter 9 Using Development Tools to Examine Webpages Skills you will learn: For this tutorial, we will use the developer tools in Firefox. However, these are quite similar to the developer tools found

More information

Chapter 6: Creating and Configuring Menus. Using the Menu Manager

Chapter 6: Creating and Configuring Menus. Using the Menu Manager Chapter 6: Creating and Configuring Menus The Menu Manager provides key information about each menu, including: Title. The name of the menu. Type. Its unique name used in programming. Menu Item. A link

More information

Getting started with Tabris.js Tutorial Ebook

Getting started with Tabris.js Tutorial Ebook Getting started with Tabris.js 2.3.0 Tutorial Ebook Table of contents Introduction...3 1 Get started...4 2 Tabris.js in action...5 2.1 Try the examples...5 2.2 Play with the examples...7 2.3 Write your

More information

Getting started with Convertigo Mobilizer

Getting started with Convertigo Mobilizer Getting started with Convertigo Mobilizer First Sencha-based project tutorial CEMS 6.0.0 TABLE OF CONTENTS Convertigo Mobilizer overview...1 Introducing Convertigo Mobilizer... 1-1 Convertigo Mobilizer

More information

Web Push Notification

Web Push Notification Web Push Notification webkul.com/blog/web-push-notification-for-magento2/ On - January 13, 2017 This impressive module allows you to send push notification messages directly to the web browser. The biggest

More information

Techniques for Optimizing Reusable Content in LibGuides

Techniques for Optimizing Reusable Content in LibGuides University of Louisville From the SelectedWorks of Terri Holtze April 21, 2017 Techniques for Optimizing Reusable Content in LibGuides Terri Holtze, University of Louisville Available at: https://works.bepress.com/terri-holtze/4/

More information

AngularJS Fundamentals

AngularJS Fundamentals AngularJS Fundamentals by Jeremy Zerr Blog: http://www.jeremyzerr.com LinkedIn: http://www.linkedin.com/in/jrzerr Twitter: http://www.twitter.com/jrzerr What is AngularJS Open Source Javascript MVC/MVVM

More information

We are assuming you have node installed!

We are assuming you have node installed! Node.js Hosting We are assuming you have node installed! This lesson assumes you've installed and are a bit familiar with JavaScript and node.js. If you do not have node, you can download and install it

More information

VIDEO 1: WHAT ARE THE SMART CONTENT TOOLS? VIDEO 2: HOW DO YOU CREATE A SMART CTA?

VIDEO 1: WHAT ARE THE SMART CONTENT TOOLS? VIDEO 2: HOW DO YOU CREATE A SMART CTA? VIDEO 1: WHAT ARE THE SMART CONTENT TOOLS? Hello again! I m Angela with HubSpot Academy. Now that you have a contextual marketing strategy in place with segmentation and personalization, you re ready to

More information

How to get a perfect 100 in Google PageSpeed Insights

How to get a perfect 100 in Google PageSpeed Insights How to get a perfect 100 in Google PageSpeed Insights And what might happen if you don't Follow Along http://goo.gl/fqfwyj @mcarper @NickWilde1990 Your site just went live after being under construction

More information

SIS offline. Getting Started

SIS offline. Getting Started SIS offline We highly recommend using Firefox version 3.0 or newer with the offline SIS. Internet Explorer is specifically not recommended because of its noncompliance with internet standards. Getting

More information

owncloud Android App Manual

owncloud Android App Manual owncloud Android App Manual Release 2.7.0 The owncloud developers October 30, 2018 CONTENTS 1 Release Notes 1 1.1 Changes in 2.7.0............................................. 1 1.2 Changes in 2.6.0.............................................

More information

Firefox for Nokia N900 Reviewer s Guide

Firefox for Nokia N900 Reviewer s Guide Firefox for Nokia N900 Table of Contents Bringing Firefox to the Nokia N900 1 1. About Mozilla 2 2. Introducing Firefox for Mobile 2 3. Mozilla s Mobile Vision 3 4. Getting Started 4 5. Personalize Your

More information

Azure Developer Immersion Getting Started

Azure Developer Immersion Getting Started Azure Developer Immersion Getting Started In this walkthrough, you will get connected to Microsoft Azure and Visual Studio Team Services. You will also get the code and supporting files you need onto your

More information

Quick Desktop Application Development Using Electron

Quick Desktop Application Development Using Electron Quick Desktop Application Development Using Electron Copyright Blurb All rights reserved. No part of this book may be reproduced in any form or by any electronic or mechanical means including information

More information

Nodes Tech Slides - Progressive Web Apps, 2018

Nodes Tech Slides - Progressive Web Apps, 2018 Nodes Tech Slides - Progressive Web Apps, 2018 Our belief Gone are the days where companies spend fortunes on building digital products that users don t want. Or at least they should be. And by now many

More information

Copyright 2018 MakeUseOf. All Rights Reserved.

Copyright 2018 MakeUseOf. All Rights Reserved. 15 Power User Tips for Tabs in Firefox 57 Quantum Written by Lori Kaufman Published March 2018. Read the original article here: https://www.makeuseof.com/tag/firefox-tabs-tips/ This ebook is the intellectual

More information

Catbook Workshop: Intro to NodeJS. Monde Duinkharjav

Catbook Workshop: Intro to NodeJS. Monde Duinkharjav Catbook Workshop: Intro to NodeJS Monde Duinkharjav What is NodeJS? NodeJS is... A Javascript RUNTIME ENGINE NOT a framework NOT Javascript nor a JS package It is a method for running your code in Javascript.

More information

The Road to the Native Mobile Web. Kenneth Rohde Christiansen

The Road to the Native Mobile Web. Kenneth Rohde Christiansen The Road to the Native Mobile Web Kenneth Rohde Christiansen Kenneth Rohde Christiansen Web Platform Architect at Intel Europe Blink core owner and former active WebKit reviewer Works on Chromium, Crosswalk

More information

AngularJS Intro Homework

AngularJS Intro Homework AngularJS Intro Homework Contents 1. Overview... 2 2. Database Requirements... 2 3. Navigation Requirements... 3 4. Styling Requirements... 4 5. Project Organization Specs (for the Routing Part of this

More information

Mobile Web Applications. Gary Dubuque IT Research Architect Department of Revenue

Mobile Web Applications. Gary Dubuque IT Research Architect Department of Revenue Mobile Web Applications Gary Dubuque IT Research Architect Department of Revenue Summary Times are approximate 10:15am 10:25am 10:35am 10:45am Evolution of Web Applications How they got replaced by native

More information

Recipes. Marketing For Bloggers. List Building, Traffic, Money & More. A Free Guide by The Social Ms Page! 1 of! 24

Recipes.  Marketing For Bloggers. List Building, Traffic, Money & More. A Free Guide by The Social Ms Page! 1 of! 24 16 Recipes Email Marketing For Bloggers List Building, Traffic, Money & More A Free Guide by The Social Ms Page 1 of 24 Brought to you by: Jonathan Gebauer, Susanna Gebauer INTRODUCTION Email Marketing

More information

Burning CDs in Windows XP

Burning CDs in Windows XP B 770 / 1 Make CD Burning a Breeze with Windows XP's Built-in Tools If your PC is equipped with a rewritable CD drive you ve almost certainly got some specialised software for copying files to CDs. If

More information

Full Stack boot camp

Full Stack boot camp Name Full Stack boot camp Duration (Hours) JavaScript Programming 56 Git 8 Front End Development Basics 24 Typescript 8 React Basics 40 E2E Testing 8 Build & Setup 8 Advanced JavaScript 48 NodeJS 24 Building

More information

CONVERSION TRACKING PIXEL GUIDE

CONVERSION TRACKING PIXEL GUIDE Conversion Tracking Pixel Guide A Step By Step Guide to Installing a conversion tracking pixel for your next Facebook ad. Go beyond clicks, and know who s converting. PRESENTED BY JULIE LOWE OF SOCIALLY

More information

Backend Development. SWE 432, Fall Web Application Development

Backend Development. SWE 432, Fall Web Application Development Backend Development SWE 432, Fall 2018 Web Application Development Review: Async Programming Example 1 second each Go get a candy bar Go get a candy bar Go get a candy bar Go get a candy bar Go get a candy

More information

BindTuning Installations Instructions, Setup Guide. Invent Setup Guide

BindTuning Installations Instructions, Setup Guide. Invent Setup Guide BindTuning Installations Instructions, Setup Guide Invent Setup Guide This documentation was developed by, and is property of Bind Lda, Portugal. As with any software product that constantly evolves, our

More information

Aware IM Version 8.2 Aware IM for Mobile Devices

Aware IM Version 8.2 Aware IM for Mobile Devices Aware IM Version 8.2 Copyright 2002-2018 Awaresoft Pty Ltd CONTENTS Introduction... 3 General Approach... 3 Login... 4 Using Visual Perspectives... 4 Startup Perspective... 4 Application Menu... 5 Using

More information

How APEXBlogs was built

How APEXBlogs was built How APEXBlogs was built By Dimitri Gielis, APEX Evangelists Copyright 2011 Apex Evangelists apex-evangelists.com How APEXBlogs was built By Dimitri Gielis This article describes how and why APEXBlogs was

More information

VisualSP Help System 2013 Installation Procedure. Rehmani Consulting, Inc.

VisualSP Help System 2013 Installation Procedure. Rehmani Consulting, Inc. Rehmani Consulting, Inc. VisualSP Help System 2013 Installation Procedure http://www.visualsp.com vsp-support@visualsp.com 630-786-7026 Rev 6.2 for VSP 5.2.0.0 Contents Contents... 1 Introduction... 2

More information

Getting Started with HCA and Client Server

Getting Started with HCA and Client Server Getting Started with HCA and Client Server This Getting Started Guide continues from the previous Getting Started sections that covered installation, adding devices, and checkbox control. This guide assumes

More information

Progressive Web Apps

Progressive Web Apps Progressive Web Apps The web isready, but what about the users? Version: 1.8 Orientation in Objects GmbH Weinheimer Str. 68 68309 Mannheim www.oio.de info@oio.de Your Speaker Loris Bachert Trainer, Consultant,

More information

Human-Computer Interaction Design

Human-Computer Interaction Design Human-Computer Interaction Design COGS120/CSE170 - Intro. HCI Instructor: Philip Guo Lab 4 - Simulating a backend without needing a server (2017-11-03) made by Philip Guo, derived from labs by Michael

More information

leveraging your Microsoft Calendar Browser for SharePoint Administrator Manual

leveraging your Microsoft Calendar Browser for SharePoint Administrator Manual CONTENT Calendar Browser for SharePoint Administrator manual 1 INTRODUCTION... 3 2 REQUIREMENTS... 3 3 CALENDAR BROWSER FEATURES... 4 3.1 BOOK... 4 3.1.1 Order Supplies... 4 3.2 PROJECTS... 5 3.3 DESCRIPTIONS...

More information

EmberJS A Fitting Face for a D8 Backend. Taylor Solomon

EmberJS A Fitting Face for a D8 Backend. Taylor Solomon EmberJS A Fitting Face for a D8 Backend Taylor Solomon taylor.solomon @jtsolomon http://interactivestrategies.com 2 Years Ago 2 Years Ago URL Ember Data assumes a few things. - Your API format is JSON

More information

One of the fundamental kinds of websites that SharePoint 2010 allows

One of the fundamental kinds of websites that SharePoint 2010 allows Chapter 1 Getting to Know Your Team Site In This Chapter Requesting a new team site and opening it in the browser Participating in a team site Changing your team site s home page One of the fundamental

More information

Angular 2 Programming

Angular 2 Programming Course Overview Angular 2 is the next iteration of the AngularJS framework. It promises better performance. It uses TypeScript programming language for type safe programming. Overall you should see better

More information

FORMS. The Exciting World of Creating RSVPs and Gathering Information with Forms in ClickDimensions. Presented by: John Reamer

FORMS. The Exciting World of Creating RSVPs and Gathering Information with Forms in ClickDimensions. Presented by: John Reamer FORMS The Exciting World of Creating RSVPs and Gathering Information with Forms in ClickDimensions Presented by: John Reamer Creating Forms Forms and Surveys: When and What to Use them For Both Allow you

More information

Contents FORMAT 3. Specifications STATIC ADVERTISING 4. Interstitial HTML5 ADVERTISING 5-12

Contents FORMAT 3. Specifications STATIC ADVERTISING 4. Interstitial HTML5 ADVERTISING 5-12 Advertising specs Contents FORMAT 3 Specifications STATIC ADVERTISING 4 Interstitial HTML5 ADVERTISING 5-12 Interstitial Responsive Technical info Testing Environment Quality assurance Best practice DESIGN

More information

Before you begin, make sure you have the images for these exercises saved in the location where you intend to create the Nuklear Family Website.

Before you begin, make sure you have the images for these exercises saved in the location where you intend to create the Nuklear Family Website. 9 Now it s time to challenge the serious web developers among you. In this section we will create a website that will bring together skills learned in all of the previous exercises. In many sections, rather

More information

Workshare Desktop App. User Guide

Workshare Desktop App. User Guide Workshare Desktop App User Guide February 2018 Workshare Desktop App User Guide Table of Contents Introducing the Workshare Desktop App...4 What is the Desktop App?... 5 Key features of the Workshare desktop

More information

Learning and Development. UWE Staff Profiles (USP) User Guide

Learning and Development. UWE Staff Profiles (USP) User Guide Learning and Development UWE Staff Profiles (USP) User Guide About this training manual This manual is yours to keep and is intended as a guide to be used during the training course and as a reference

More information

Contents. Last updated: 18 th August 2017

Contents. Last updated: 18 th August 2017 DRM Lite in Firefox DRM Lite is the new way for British Library to deliver electronic documents securely. When a document is requested via this service the document is locked so that only one user can

More information

Indium Documentation. Release Nicolas Petton

Indium Documentation. Release Nicolas Petton Indium Documentation Release 1.2.0 Nicolas Petton Nov 23, 2018 Contents 1 Table of contents 3 1.1 Installation................................................ 3 1.2 Getting up and running..........................................

More information

What is Node.js? Tim Davis Director, The Turtle Partnership Ltd

What is Node.js? Tim Davis Director, The Turtle Partnership Ltd What is Node.js? Tim Davis Director, The Turtle Partnership Ltd About me Co-founder of The Turtle Partnership Working with Notes and Domino for over 20 years Working with JavaScript technologies and frameworks

More information

CONTENTS PAGE. Top Tip: Hold down the Ctrl key on your keyboard and using your mouse click on the heading below to be taken to the page

CONTENTS PAGE. Top Tip: Hold down the Ctrl key on your keyboard and using your mouse click on the heading below to be taken to the page USER GUIDE CONTENTS PAGE Top Tip: Hold down the Ctrl key on your keyboard and using your mouse click on the heading below to be taken to the page Part 1) How to create a new account...2 Part 2) How to

More information

Siteforce Pilot: Best Practices

Siteforce Pilot: Best Practices Siteforce Pilot: Best Practices Getting Started with Siteforce Setup your users as Publishers and Contributors. Siteforce has two distinct types of users First, is your Web Publishers. These are the front

More information

HTML and CSS a further introduction

HTML and CSS a further introduction HTML and CSS a further introduction By now you should be familiar with HTML and CSS and what they are, HTML dictates the structure of a page, CSS dictates how it looks. This tutorial will teach you a few

More information

Software. Full Stack Web Development Intensive, Fall Lecture Topics. Class Sessions. Grading

Software. Full Stack Web Development Intensive, Fall Lecture Topics. Class Sessions. Grading Full Stack Web Development Intensive, Fall 2017 There are two main objectives to this course. The first is learning how to build websites / web applications and the assets that compose them. The second

More information

Web Community Manager 2.20 Release Notes

Web Community Manager 2.20 Release Notes New or Changed Functionality or User Experience GENERAL Sign-in with Google Login You can now allow users to sign-in with their Google TM login information. The user s Google email address must be associated

More information

MEAP Edition Manning Early Access Program WebAssembly in Action Version 1

MEAP Edition Manning Early Access Program WebAssembly in Action Version 1 MEAP Edition Manning Early Access Program WebAssembly in Action Version 1 Copyright 2018 Manning Publications For more information on this and other Manning titles go to www.manning.com welcome Thank you

More information

Smart Bulk SMS & Voice SMS Marketing Script with 2-Way Messaging. Quick-Start Manual

Smart Bulk SMS & Voice SMS Marketing Script with 2-Way Messaging. Quick-Start Manual Mobiketa Smart Bulk SMS & Voice SMS Marketing Script with 2-Way Messaging Quick-Start Manual Overview Mobiketa Is a full-featured Bulk SMS and Voice SMS marketing script that gives you control over your

More information

Pro Events. Functional Specification. Name: Jonathan Finlay. Student Number: C Course: Bachelor of Science (Honours) Software Development

Pro Events. Functional Specification. Name: Jonathan Finlay. Student Number: C Course: Bachelor of Science (Honours) Software Development Pro Events Functional Specification Name: Jonathan Finlay Student Number: C00193379 Course: Bachelor of Science (Honours) Software Development Tutor: Hisain Elshaafi Date: 13-11-17 Contents Introduction...

More information

Using AJAX to Easily Integrate Rich Media Elements

Using AJAX to Easily Integrate Rich Media Elements 505 Using AJAX to Easily Integrate Rich Media Elements James Monroe Course Developer, WWW.eLearningGuild.com The Problem: How to string together several rich media elements (images, Flash movies, video,

More information

CIS 3308 Logon Homework

CIS 3308 Logon Homework CIS 3308 Logon Homework Lab Overview In this lab, you shall enhance your web application so that it provides logon and logoff functionality and a profile page that is only available to logged-on users.

More information

HTML/CSS Lesson Plans

HTML/CSS Lesson Plans HTML/CSS Lesson Plans Course Outline 8 lessons x 1 hour Class size: 15-25 students Age: 10-12 years Requirements Computer for each student (or pair) and a classroom projector Pencil and paper Internet

More information

Ecocion Facility Management System Alex Anderson Niles Hacking Ryan Shipp June 16, 2015

Ecocion Facility Management System Alex Anderson Niles Hacking Ryan Shipp June 16, 2015 Ecocion Facility Management System Alex Anderson Niles Hacking Ryan Shipp June 16, 2015 1 Table of Contents 1. Introduction 2 1.1. Client Description 1.2. Product Vision 2. Requirements. 2 2.1. Functional

More information

Printing Envelopes in Microsoft Word

Printing Envelopes in Microsoft Word Printing Envelopes in Microsoft Word P 730 / 1 Stop Addressing Envelopes by Hand Let Word Print Them for You! One of the most common uses of Microsoft Word is for writing letters. With very little effort

More information

REWARD POINTS PLUG-IN USER GUIDE

REWARD POINTS PLUG-IN USER GUIDE support@simicart.com Phone: +84.3217.1357 REWARD POINTS PLUG-IN USER GUIDE Table of Contents 1. INTRODUCTION... 3 2. HOW TO INSTALL... 5 3. HOW TO CONFIGURE... 6 3.1 For those who are using Reward Point

More information

Using Dreamweaver CC. 6 Styles in Websites. Exercise 1 Linked Styles vs Embedded Styles

Using Dreamweaver CC. 6 Styles in Websites. Exercise 1 Linked Styles vs Embedded Styles Using Dreamweaver CC 6 So far we have used CSS to arrange the elements on our web page. We have also used CSS for some limited formatting. In this section we will take full advantage of using CSS to format

More information

Using GitHub to Share with SparkFun a

Using GitHub to Share with SparkFun a Using GitHub to Share with SparkFun a learn.sparkfun.com tutorial Available online at: http://sfe.io/t52 Contents Introduction Gitting Started Forking a Repository Committing, Pushing and Pulling Syncing

More information

Human-Computer Interaction Design

Human-Computer Interaction Design Human-Computer Interaction Design COGS120/CSE170 - Intro. HCI Instructor: Philip Guo Lab 6 - Connecting frontend and backend without page reloads (2016-11-03) by Michael Bernstein, Scott Klemmer, and Philip

More information

End User Manual. theicn.org/elearning-how-to

End User Manual. theicn.org/elearning-how-to End User Manual theicn.org/elearning-how-to Welcome to ICN s elearning Portal. This manual is an end user guide, explaining how you as a user can navigate the features and functions of the elearning platform.

More information

Full Website Audit. Conducted by Mathew McCorry. Digimush.co.uk

Full Website Audit. Conducted by Mathew McCorry. Digimush.co.uk Full Website Audit Conducted by Mathew McCorry Digimush.co.uk 1 Table of Contents Full Website Audit 1 Conducted by Mathew McCorry... 1 1. Overview... 3 2. Technical Issues... 4 2.1 URL Structure... 4

More information

ethnio tm IMPLEMENTATION GUIDE ETHNIO, INC W SUNSET BLVD LOS ANGELES, CA TEL (888) VERSION NO. 3 CREATED JUL 14, 2017

ethnio tm IMPLEMENTATION GUIDE ETHNIO, INC W SUNSET BLVD LOS ANGELES, CA TEL (888) VERSION NO. 3 CREATED JUL 14, 2017 ethnio tm IMPLEMENTATION GUIDE VERSION NO. 3 CREATED JUL 14, 2017 ETHNIO, INC. 6121 W SUNSET BLVD LOS ANGELES, CA 90028 TEL (888) 879-7439 SUMMARY Getting Ethnio working means placing one line of JavaScript

More information

QuickBooks 2008 Software Installation Guide

QuickBooks 2008 Software Installation Guide 12/11/07; Ver. APD-1.2 Welcome This guide is designed to support users installing QuickBooks: Pro or Premier 2008 financial accounting software, especially in a networked environment. The guide also covers

More information

Dreamweaver MX The Basics

Dreamweaver MX The Basics Chapter 1 Dreamweaver MX 2004 - The Basics COPYRIGHTED MATERIAL Welcome to Dreamweaver MX 2004! Dreamweaver is a powerful Web page creation program created by Macromedia. It s included in the Macromedia

More information

The Path to a Successful Website

The Path to a Successful Website CREATIVE DESIGN STUDIO Website Checklist: The Path to a Successful Website Get Traffic to Your Website Organic search Keyword optimization Target only one keyword per page Use keywords in: URL Meta title

More information

Your . A setup guide. Last updated March 7, Kingsford Avenue, Glasgow G44 3EU

Your  . A setup guide. Last updated March 7, Kingsford Avenue, Glasgow G44 3EU fuzzylime WE KNOW DESIGN WEB DESIGN AND CONTENT MANAGEMENT 19 Kingsford Avenue, Glasgow G44 3EU 0141 416 1040 hello@fuzzylime.co.uk www.fuzzylime.co.uk Your email A setup guide Last updated March 7, 2017

More information

Managing your content with the Adobe Experience Manager Template Editor. Gabriel Walt Product Manager twitter.com/gabrielwalt

Managing your content with the Adobe Experience Manager Template Editor. Gabriel Walt Product Manager twitter.com/gabrielwalt Managing your content with the Adobe Experience Manager Template Editor Gabriel Walt Product Manager twitter.com/gabrielwalt Table of Contents 1. Introduction 3 1.1 Overview 3 1.2 Prerequisites 3 2. Getting

More information

Creating a multilingual site in WebPlus

Creating a multilingual site in WebPlus Creating a multilingual site in WebPlus One of the problems faced by a number of WebPlus users involves organizing a multilingual website. Ordinarily, the easiest way to do this is to create your primary

More information

Comprehensive AngularJS Programming (5 Days)

Comprehensive AngularJS Programming (5 Days) www.peaklearningllc.com S103 Comprehensive AngularJS Programming (5 Days) The AngularJS framework augments applications with the "model-view-controller" pattern which makes applications easier to develop

More information

GOOGLE APPS. If you have difficulty using this program, please contact IT Personnel by phone at

GOOGLE APPS. If you have difficulty using this program, please contact IT Personnel by phone at : GOOGLE APPS Application: Usage: Program Link: Contact: is an electronic collaboration tool. As needed by any staff member http://www.google.com or http://drive.google.com If you have difficulty using

More information

CSCE 120: Learning To Code

CSCE 120: Learning To Code CSCE 120: Learning To Code Module 11.0: Consuming Data I Introduction to Ajax This module is designed to familiarize you with web services and web APIs and how to connect to such services and consume and

More information

Week 8 Google Maps. This week you ll learn how to embed a Google Map into a web page and add custom markers with custom labels.

Week 8 Google Maps. This week you ll learn how to embed a Google Map into a web page and add custom markers with custom labels. Introduction Hopefully by now you ll have seen the possibilities that jquery provides for rich content on web sites in the form of interaction and media playback. This week we ll be extending this into

More information

Before you use EBIS for the first time or every time you replace your PC/Laptop please follow the guidance below:

Before you use EBIS for the first time or every time you replace your PC/Laptop please follow the guidance below: Workers Educational Association ebis Requisitions Set Up Guide Before you use EBIS for the first time or every time you replace your PC/Laptop please follow the guidance below: Content Please ensure your

More information

About 1. Chapter 1: Getting started with odata 2. Remarks 2. Examples 2. Installation or Setup 2. Odata- The Best way to Rest 2

About 1. Chapter 1: Getting started with odata 2. Remarks 2. Examples 2. Installation or Setup 2. Odata- The Best way to Rest 2 odata #odata Table of Contents About 1 Chapter 1: Getting started with odata 2 Remarks 2 Examples 2 Installation or Setup 2 Odata- The Best way to Rest 2 Chapter 2: Azure AD authentication for Node.js

More information

Xchange for Samsung MAC User Guide. Version 2.4

Xchange for Samsung MAC User Guide. Version 2.4 Xchange for Samsung MAC User Guide Version 2.4 Contents Welcome to Xchange for Samsung Mac Desktop Client... 32 How to Install Xchange... 3 Where is it?... 43 The Dock menu... 4 The menu bar... 4 Preview

More information

Things to note: Each week Xampp will need to be installed. Xampp is Windows software, similar software is available for Mac, called Mamp.

Things to note: Each week Xampp will need to be installed. Xampp is Windows software, similar software is available for Mac, called Mamp. Tutorial 8 Editor Brackets Goals Introduction to PHP and MySql. - Set up and configuration of Xampp - Learning Data flow Things to note: Each week Xampp will need to be installed. Xampp is Windows software,

More information

Keep Track of Your Passwords Easily

Keep Track of Your Passwords Easily Keep Track of Your Passwords Easily K 100 / 1 The Useful Free Program that Means You ll Never Forget a Password Again These days, everything you do seems to involve a username, a password or a reference

More information

Understanding Angular Directives By Jeffry Houser

Understanding Angular Directives By Jeffry Houser Understanding Angular Directives By Jeffry Houser A DotComIt Whitepaper Copyright 2016 by DotComIt, LLC Contents A Simple Directive... 4 Our Directive... 4 Create the App Infrastructure... 4 Creating a

More information