SlideShare ist ein Scribd-Unternehmen logo
1 von 100
Downloaden Sie, um offline zu lesen
Host your own
Over-the-air update service
Roadmap
Buggy Valley App
GloriïŹed cURLing App
Designing an OTA Service
Hosting Your Own Service
OTA Assets
Announcements
Pillar Valley
Pillar Valley
Pillar Valley
My Awesome App
Standing on the shoulders
of giants
Pillar Valley
Buggy Valley
Buggy Valley
$
p = 0.5
$$
Nothingp = 0.5
Buggy Valley
p = 0.5
p = 0.5
Android Java Implementation
String redScreenPath = “file:///red-screen.js”;
String pillarValleyPath = “file:///pillar-valley.js”;
Android Java Implementation
String redScreenPath = “file:///red-screen.js”;
String pillarValleyPath = “file:///pillar-valley.js”;
int randNum = getRandom();
if (isEven(randNum)){
loadApp(redScreenPath);
} else {
loadApp(pillarValleyPath);
}
Android Java Implementation
String redScreenPath = “file:///red-screen.js”;
String pillarValleyPath = “file:///pillar-valley.js”;
int randNum = getRandom();
if (isEven(randNum)){
loadApp(redScreenPath);
} else {
loadApp(pillarValleyPath);**
}
** how does loadApp work?
Quick Recap
String redScreenPath = “file:///red-screen.js”;
String pillarValleyPath = “file:///pillar-valley.js”;
int randNum = getRandom();
if (isEven(randNum)){
loadApp(redScreenPath);
} else {
loadApp(pillarValleyPath);**
}
** how does loadApp work?
Roadmap
Buggy Valley App
GloriïŹed cURLing App
Designing an OTA Service
Hosting Your Own Service
OTA Assets
Announcements
Buggy Valley fits in perfectly with my use case.
Your MVP was just what I needed!
One small suggestion tho...
Original Buggy Valley
String redScreenPath = “file:///red-screen.js”;
String pillarValleyPath = “file:///pillar-valley.js”;
int randNum = getRandom();
if (isEven(randNum)){
loadApp(redScreenPath);
} else {
loadApp(pillarValleyPath);
}
ModiïŹed Buggy Valley
String redScreenPath = “file:///red-screen.js”;
String aliceAppPath = “file:///alice-app.js”;
int randNum = getRandom();
if (isEven(randNum)){
loadApp(redScreenPath);
} else {
loadApp(aliceAppPath);
}
ModiïŹed Buggy Valley
String redScreenPath = “file:///red-screen.js”;
String aliceAppPath = “file:///alice-app.js”;
int randNum = getRandom();
if (isEven(randNum)){
loadApp(redScreenPath);
} else {
loadApp(aliceAppPath);
}
ModiïŹed Buggy Valley
String newAliceAppPath
String aliceAppPath = “file:///alice-app.js”;
int randNum = getRandom();
if (isEven(randNum)){
loadApp(newAliceAppPath);
} else {
loadApp(aliceAppPath);
}
ModiïŹed Buggy Valley
String newAliceAppPath = cURLToDisk(“https://expo.io/@alice/app”);
String aliceAppPath = “file:///alice-app.js”;
int randNum = getRandom();
if (isEven(randNum)){
loadApp(newAliceAppPath);
} else {
loadApp(aliceAppPath);
}
ModiïŹed Buggy Valley
String newAliceAppPath = cURLToDisk(“https://expo.io/@alice/app”);
String aliceAppPath = “file:///alice-app.js”;
int randNum = getRandom();
if (isEven(randNum)){
loadApp(newAliceAppPath);
} else {
loadApp(aliceAppPath);
}
GloriïŹed cURL
String newAliceAppPath = cURLToDisk(“https://expo.io/@alice/app”);
String aliceAppPath = “file:///alice-app.js”;
if (newAliceAppPath != null){
loadApp(newAliceAppPath);
} else {
loadApp(aliceAppPath);
}
Wait but how does this benefit me?
JS Bundle
Native Modules
Currently on disk:
JS Bundle
Native Modules
Currently on disk:
Traditional update
New JS Bundle
New Native Modules
JS Bundle
Native Modules
Currently on disk:
Traditional update
New JS Bundle
New Native Modules
Avg binary size ~30Mb
JS Bundle
Native Modules
Currently on disk:
JS Bundle
Native Modules
Currently on disk:
GloriïŹed cURL update
New JS Bundle
Native Modules
Roadmap
Buggy Valley App
GloriïŹed cURLing App
Designing an OTA Service
Hosting Your Own Service
OTA Assets
Announcements
Glorified cURL fits in perfectly with my use case.
Your MVP was just what I needed!
It’s not very performant tho...
GloriïŹed cURL
String newBobAppPath = cURLToDisk(“https://expo.io/@bob/app”);
String bobAppPath = “file:///bob-app.js”;
if (newBobAppPath != null){
loadApp(newBobAppPath);
} else {
loadApp(bobAppPath);
}
GloriïŹed cURL
String newBobAppPath = cURLToDisk(“https://expo.io/@bob/app”);
String bobAppPath = “file:///bob-app.js”;
if (newBobAppPath != null){
loadApp(newBobAppPath);
} else {
loadApp(bobAppPath);
}
JS Bundle
We don’t want to load the JS bundle unnecessarily.
We only want to load the JS bundle if there’s a new change available.
Let’s take a step back
And think about how the web
works for a sec
The Web
<script src=“bundle.js” />
Big JS bundle
bundle.js
index.html
Taking a page out of the web book
{bundleUrl: ‘bundle.js’}
Big JS bundle
bundle.js
index.json
Taking a page out of the web book
{bundleUrl: ‘ios-1a2b3c.js’}
Big JS bundle
ios-1a2b3c.js
index.json
Bundle name is based oïŹ€ its md5 hash
Taking a page out of the web book
{bundleUrl: ‘ios-7a8b9c’}
Big JS bundle
ios-7a8b9c.js
index.json
Cache the bundleUrl
Only download bundleUrl
if we don’t have it cached
How do I use an OTA service in my app?
^ these are my app ïŹles
^ this is what my app looks like
How do I use an OTA service in my app?
dev tools GUI
^ push this button to upload app to expo server
How do I use an OTA service in my app?
Or use the cli if you prefer
> expo publish
Run this command in your project directory to upload to expo servers
How often is the server polled for updates?
The default behavior is to poll the server when the app starts up
What if I don’t like the default behavior?
You can use the Updates module to customize when you’d to update your app
^ from the docs page
Roadmap
Buggy Valley App
GloriïŹed cURLing App
Designing an OTA Service
Hosting Your Own Service
OTA Assets
Announcements
I’m in a country where network latency
to your CDNs are really high
I’m in a country where network latency
to your CDNs are really high
How about hosting your own app then?
I’m in a country where network latency
to your CDNs are really high
How about hosting your own app then?*
* in our upcoming SDK release
How do I host my own app?
^ these are my app ïŹles
^ this is what my app looks like
> expo export
Run this command in your project directory
to dump your app to disk
How do I host my own app?
This is what gets dumped to disk
How do I host my own app?
.
├── android-index.json
├── ios-index.json
├── assets
│   └── 1ecc2
└── bundles
      ├── android-01ee6.js
      └── ios-ee820.js
How do I host my own app?
.
├── android-index.json
├── ios-index.json
├── assets
│   └── 1ecc2
└── bundles
      ├── android-01ee6.js
      └── ios-ee820.js
How do I host my own app?
.
├── android-index.json
├── ios-index.json
├── assets
│   └── 1ecc2
└── bundles
      ├── android-01ee6.js
      └── ios-ee820.js
{bundleUrl: ‘ios-ee820.js’}
Big JS bundle
ios-ee820.js
ios-index.json
How do I host my own app?
.
├── android-index.json
├── ios-index.json
├── assets
│   └── 1ecc2
└── bundles
      ├── android-01ee6.js
      └── ios-ee820.js
git push master
I pushed to GitHub because it has free static hosting.
You can host your app from any server.
How do I build my app binary?
> expo build:ios
Run this command in your project directory
How do I build my app binary?
> expo build:ios —public-url https://quinlanj.github.io/self-hosting/ios-index.json
Run this command in your project directory
How do I build my app binary?
> expo build:ios —public-url https://quinlanj.github.io/self-hosting/ios-index.json
{bundleUrl: ‘ios-ee820.js’}
Big JS bundle
ios-ee820.js
ios-index.json
^ This ïŹle is served ïŹrst
Press this button
To download
How do I use this in development?
https://quinlanj.github.io/selfhost/ios-index.json
Convert to QR code
How do I use this in development?
Scan the QR code into the expo dev app
How do I use this in development?
http://localhost:8000/ios-index.json
Convert to QR code
How do I use this in development?
Scan the QR code into the expo dev app
Roadmap
Buggy Valley App
GloriïŹed cURLing App
Designing an OTA Service
Hosting Your Own Service
OTA Assets
Announcements
This is what my app looks like.
I’ve installed it on my phone.
In development, let’s make a change by adding another pic
Push changes to GitHub
This is what my app looks like.
I’ve installed it on my phone.
This is what my app looks like.
I’ve installed it on my phone.
Currently on ïŹlesystem:
JS Bundle
This is what my app looks like.
I’ve installed it on my phone.
Currently on ïŹlesystem:
JS Bundle
quinlanj.github.io
Here is the server hosting my app
This is what my app looks like.
I’ve installed it on my phone.
Currently on ïŹlesystem:
JS Bundle
quinlanj.github.io
An update is ready!
This is what my app looks like.
I’ve installed it on my phone.
Currently on ïŹlesystem:
JS Bundle
quinlanj.github.io
An update is ready!
Files to be served:
New
JS Bundle
This is what my app looks like.
I’ve installed it on my phone.
Currently on ïŹlesystem:
JS Bundle
quinlanj.github.io
An update is ready!
Files to be served:
New
JS Bundle
JS Bundle
This is what my app looks like.
I’ve installed it on my phone.
Currently on ïŹlesystem:
quinlanj.github.io
An update is ready!
Files to be served:
New
JS Bundle
New
JS Bundle
<Image source={require(‘cat.png’} />
<Image source={require(‘dog.png’} />
This is what my app looks like.
I’ve installed it on my phone.
Currently on ïŹlesystem:
quinlanj.github.io
An update is ready!
Files to be served:
New
JS Bundle
?
dog.png is pulled down to ïŹlesystem?
New
JS Bundle
<Image source={require(‘cat.png’} />
<Image source={require(‘dog.png’} />
But how? It looks like these assets are fetched from ïŹlesystem
New
JS Bundle
<Image source={require(‘cat.png’} />
<Image source={require(‘dog.png’} />
We wrote a module to override asset resolution
New
JS Bundle
<Image source={require(‘cat.png’} />
<Image source={require(‘dog.png’} />
Module Logic:
Look for asset in the ïŹlesystem
If it’s not there, look for it from the server
This is what my app looks like.
I’ve installed it on my phone.
Currently on ïŹlesystem:
quinlanj.github.io
An update is ready!
Files to be served:
New
JS Bundle
?
dog.png is pulled down to ïŹlesystem?
This is what my app looks like.
I’ve installed it on my phone.
Currently on ïŹlesystem:
quinlanj.github.io
An update is ready!
Files to be served:
New
JS Bundle
?
dog.png is not on the ïŹlesystem
This is what my app looks like.
I’ve installed it on my phone.
Currently on ïŹlesystem:
quinlanj.github.io
An update is ready!
Files to be served:
New
JS Bundle
?
Let’s grab dog.png from server then!
This is what my app looks like.
I’ve installed it on my phone.
Currently on ïŹlesystem:
quinlanj.github.io
An update is ready!
Files to be served:
New
JS Bundle
This is what my app looks like.
I’ve installed it on my phone.
Currently on ïŹlesystem:
quinlanj.github.io
An update is ready!
Files to be served:
New
JS Bundle
Cached for future use
How come assets are stored by hash?
.
├── android-index.json
├── ios-index.json
├── assets
│   └── 1ecc2
└── bundles
      ├── android-01ee6.js
      └── ios-ee820.js
JS Bundle
<Image source={require(‘cat.png’)} />
We are requiring assets by their name, not by their hash
JS Bundle
require(‘cat.png’)
React native packager
{assetName: ‘cat.png’, hash:’1ecc2’}
App packaging
App.js
JS Bundle
<Image source={require(‘cat.png’} />
Module Logic:
Look for cat.png in the ïŹlesystem
If it’s not there, look for cat.png from the server
Recall
JS Bundle
Module Logic:
Look for 1ecc2 in the ïŹlesystem
If it’s not there, look for 1ecc2 from the server
Actual Implementation
{assetName: ‘cat.png’, hash:’1ecc2’}
How does this benefit me?
<Image source={require(‘cat1.png’} />
<Image source={require(‘crazy-cat.png’} />
<Image source={require(‘lime-cat.png’} />


This app displays the same cat picture
These cat pictures are all named something diïŹ€erent
{assetName: ‘cat1.png’, hash:’1ecc2’}
{assetName: ‘crazy-cat.png’, hash:’1ecc2’}
{assetName: ‘lime-cat.png’, hash:’1ecc2’}


They all resolve to the same ïŹle on disk: 1ecc2
Roadmap
Buggy Valley App
GloriïŹed cURLing App
Designing an OTA Service
Hosting Your Own Service
OTA Assets
Announcements
Announcements
We made a web application called Snack
Snack is like a JS Fiddle for react native apps
Snack is now open source, check it out at https://github.com/expo/snack-web

Weitere Àhnliche Inhalte

Was ist angesagt?

MicroProfile 5ă§è¶…æ‰‹è»œă«ć§‹ă‚ă‚‹ä»Šă©ăăźă‚Żăƒ©ă‚Šăƒ‰ćźŒć…šćŻŸćżœă‚šăƒłă‚żăƒŒăƒ—ăƒ©ă‚€ă‚șă‚·ă‚čテム
MicroProfile 5ă§è¶…æ‰‹è»œă«ć§‹ă‚ă‚‹ä»Šă©ăăźă‚Żăƒ©ă‚Šăƒ‰ćźŒć…šćŻŸćżœă‚šăƒłă‚żăƒŒăƒ—ăƒ©ă‚€ă‚șă‚·ă‚čテムMicroProfile 5ă§è¶…æ‰‹è»œă«ć§‹ă‚ă‚‹ä»Šă©ăăźă‚Żăƒ©ă‚Šăƒ‰ćźŒć…šćŻŸćżœă‚šăƒłă‚żăƒŒăƒ—ăƒ©ă‚€ă‚șă‚·ă‚čテム
MicroProfile 5ă§è¶…æ‰‹è»œă«ć§‹ă‚ă‚‹ä»Šă©ăăźă‚Żăƒ©ă‚Šăƒ‰ćźŒć…šćŻŸćżœă‚šăƒłă‚żăƒŒăƒ—ăƒ©ă‚€ă‚șă‚·ă‚čテムHirofumi Iwasaki
 
Docker Ecosystem on Azure
Docker Ecosystem on AzureDocker Ecosystem on Azure
Docker Ecosystem on AzurePatrick Chanezon
 
CI/CD with AWS Code Services
CI/CD with AWS Code ServicesCI/CD with AWS Code Services
CI/CD with AWS Code ServicesPulkit Gupta
 
AngularずSpring Bootă§äœœă‚‹SPA + RESTful Web ServiceケプăƒȘă‚±ăƒŒă‚·ăƒ§ăƒł
AngularずSpring Bootă§äœœă‚‹SPA + RESTful Web ServiceケプăƒȘă‚±ăƒŒă‚·ăƒ§ăƒłAngularずSpring Bootă§äœœă‚‹SPA + RESTful Web ServiceケプăƒȘă‚±ăƒŒă‚·ăƒ§ăƒł
AngularずSpring Bootă§äœœă‚‹SPA + RESTful Web ServiceケプăƒȘă‚±ăƒŒă‚·ăƒ§ăƒłssuser070fa9
 
æ„­ć‹™ăŠă‚™ ISUCON するこずにăȘăŁăŸè©±.pdf
æ„­ć‹™ăŠă‚™ ISUCON するこずにăȘăŁăŸè©±.pdfæ„­ć‹™ăŠă‚™ ISUCON するこずにăȘăŁăŸè©±.pdf
æ„­ć‹™ăŠă‚™ ISUCON するこずにăȘăŁăŸè©±.pdfTakuyaFukuoka2
 
ă‚·ă‚čăƒ†ăƒ ăźăƒąăƒ€ăƒŠă‚€ă‚ș èœăĄăŠă‚‚è‰Żă„ă‚ąăƒ—ăƒȘăźäœœă‚Šæ–č
ă‚·ă‚čăƒ†ăƒ ăźăƒąăƒ€ăƒŠă‚€ă‚ș èœăĄăŠă‚‚è‰Żă„ă‚ąăƒ—ăƒȘăźäœœă‚Šæ–čă‚·ă‚čăƒ†ăƒ ăźăƒąăƒ€ăƒŠă‚€ă‚ș èœăĄăŠă‚‚è‰Żă„ă‚ąăƒ—ăƒȘăźäœœă‚Šæ–č
ă‚·ă‚čăƒ†ăƒ ăźăƒąăƒ€ăƒŠă‚€ă‚ș èœăĄăŠă‚‚è‰Żă„ă‚ąăƒ—ăƒȘăźäœœă‚Šæ–čChihiro Ito
 
ă‚Șンプレミă‚čă‹ă‚‰ă‚Żăƒ©ă‚Šăƒ‰ăžïŒšOracle Databaseăźç§»èĄŒăƒ™ă‚čăƒˆăƒ—ăƒ©ă‚Żăƒ†ă‚Łă‚čă‚’è§ŁèȘŹ (Oracle Cloudă‚Šă‚§ăƒ“ăƒŠăƒŒă‚·ăƒȘăƒŒă‚ș: 2021ćčŽ2月18æ—„)
ă‚Șンプレミă‚čă‹ă‚‰ă‚Żăƒ©ă‚Šăƒ‰ăžïŒšOracle Databaseăźç§»èĄŒăƒ™ă‚čăƒˆăƒ—ăƒ©ă‚Żăƒ†ă‚Łă‚čă‚’è§ŁèȘŹ (Oracle Cloudă‚Šă‚§ăƒ“ăƒŠăƒŒă‚·ăƒȘăƒŒă‚ș: 2021ćčŽ2月18æ—„)ă‚Șンプレミă‚čă‹ă‚‰ă‚Żăƒ©ă‚Šăƒ‰ăžïŒšOracle Databaseăźç§»èĄŒăƒ™ă‚čăƒˆăƒ—ăƒ©ă‚Żăƒ†ă‚Łă‚čă‚’è§ŁèȘŹ (Oracle Cloudă‚Šă‚§ăƒ“ăƒŠăƒŒă‚·ăƒȘăƒŒă‚ș: 2021ćčŽ2月18æ—„)
ă‚Șンプレミă‚čă‹ă‚‰ă‚Żăƒ©ă‚Šăƒ‰ăžïŒšOracle Databaseăźç§»èĄŒăƒ™ă‚čăƒˆăƒ—ăƒ©ă‚Żăƒ†ă‚Łă‚čă‚’è§ŁèȘŹ (Oracle Cloudă‚Šă‚§ăƒ“ăƒŠăƒŒă‚·ăƒȘăƒŒă‚ș: 2021ćčŽ2月18æ—„)ă‚Șăƒ©ă‚Żăƒ«ă‚šăƒłă‚žăƒ‹ă‚ąé€šäżĄ
 
ă‚łăƒłăƒ†ăƒŠăƒăƒŒă‚żăƒ“ăƒȘăƒ†ă‚ŁăźæŒŻă‚Šèż”ă‚ŠăšăƒăƒžăŁăŸäș‹äŸ‹çŽč介
ă‚łăƒłăƒ†ăƒŠăƒăƒŒă‚żăƒ“ăƒȘăƒ†ă‚ŁăźæŒŻă‚Šèż”ă‚ŠăšăƒăƒžăŁăŸäș‹äŸ‹çŽčä»‹ă‚łăƒłăƒ†ăƒŠăƒăƒŒă‚żăƒ“ăƒȘăƒ†ă‚ŁăźæŒŻă‚Šèż”ă‚ŠăšăƒăƒžăŁăŸäș‹äŸ‹çŽč介
ă‚łăƒłăƒ†ăƒŠăƒăƒŒă‚żăƒ“ăƒȘăƒ†ă‚ŁăźæŒŻă‚Šèż”ă‚ŠăšăƒăƒžăŁăŸäș‹äŸ‹çŽč介Ryo Yamaoka
 
ă‚”ăƒăƒŒăƒˆ スンゾニケが Azure Networking ă‚’ă˜ăŁăă‚ŠăŸăŁă·ă‚ŠèȘžă‚Šă€ăă™äŒš
ă‚”ăƒăƒŒăƒˆ スンゾニケが Azure Networking ă‚’ă˜ăŁăă‚ŠăŸăŁă·ă‚ŠèȘžă‚Šă€ăă™äŒšă‚”ăƒăƒŒăƒˆ スンゾニケが Azure Networking ă‚’ă˜ăŁăă‚ŠăŸăŁă·ă‚ŠèȘžă‚Šă€ăă™äŒš
ă‚”ăƒăƒŒăƒˆ スンゾニケが Azure Networking ă‚’ă˜ăŁăă‚ŠăŸăŁă·ă‚ŠèȘžă‚Šă€ăă™äŒšShuheiUda
 
Automating nist 800 171 compliance in AWS Govcloud (US)
Automating nist 800 171 compliance in AWS Govcloud (US)Automating nist 800 171 compliance in AWS Govcloud (US)
Automating nist 800 171 compliance in AWS Govcloud (US)Amazon Web Services
 
Core Concept: Software Defined Everything
Core Concept: Software Defined EverythingCore Concept: Software Defined Everything
Core Concept: Software Defined EverythingThanakrit Lersmethasakul
 
Terraform modules and (some of) best practices
Terraform modules and (some of) best practicesTerraform modules and (some of) best practices
Terraform modules and (some of) best practicesAnton Babenko
 
Infrastructure as Code
Infrastructure as CodeInfrastructure as Code
Infrastructure as CodeRobert Greiner
 
WSUSç§»èĄŒă‚’ă—ăŠăżăŸè©±
WSUSç§»èĄŒă‚’ă—ăŠăżăŸè©±WSUSç§»èĄŒă‚’ă—ăŠăżăŸè©±
WSUSç§»èĄŒă‚’ă—ăŠăżăŸè©±DaikiYonekawa
 
Server virtualization by VMWare
Server virtualization by VMWareServer virtualization by VMWare
Server virtualization by VMWaresgurnam73
 
OCI èłŒć…„ăƒąăƒ‡ăƒ«ăźæ•Žç†ăš Universal Credit æœ€æ–°æƒ…ć ±(2021ćčŽ2月17旄版)
OCI èłŒć…„ăƒąăƒ‡ăƒ«ăźæ•Žç†ăš Universal Credit æœ€æ–°æƒ…ć ±(2021ćčŽ2月17旄版)OCI èłŒć…„ăƒąăƒ‡ăƒ«ăźæ•Žç†ăš Universal Credit æœ€æ–°æƒ…ć ±(2021ćčŽ2月17旄版)
OCI èłŒć…„ăƒąăƒ‡ăƒ«ăźæ•Žç†ăš Universal Credit æœ€æ–°æƒ…ć ±(2021ćčŽ2月17旄版)ă‚Șăƒ©ă‚Żăƒ«ă‚šăƒłă‚žăƒ‹ă‚ąé€šäżĄ
 
[A31]AWS侊でOracleă‚’ćˆ©ç”šă™ă‚‹ăŸă‚ăźăŻă˜ă‚ăźäž€æ­©ïŒby Masatoshi Yoshida
[A31]AWS侊でOracleă‚’ćˆ©ç”šă™ă‚‹ăŸă‚ăźăŻă˜ă‚ăźäž€æ­©ïŒby Masatoshi Yoshida[A31]AWS侊でOracleă‚’ćˆ©ç”šă™ă‚‹ăŸă‚ăźăŻă˜ă‚ăźäž€æ­©ïŒby Masatoshi Yoshida
[A31]AWS侊でOracleă‚’ćˆ©ç”šă™ă‚‹ăŸă‚ăźăŻă˜ă‚ăźäž€æ­©ïŒby Masatoshi YoshidaInsight Technology, Inc.
 
Inspirage Webinar on Epm integration agent
Inspirage Webinar on Epm integration agentInspirage Webinar on Epm integration agent
Inspirage Webinar on Epm integration agentDayalan Punniyamoorthy
 
GitOps 101 Presentation.pdf
GitOps 101 Presentation.pdfGitOps 101 Presentation.pdf
GitOps 101 Presentation.pdfssuser31375f
 

Was ist angesagt? (20)

MicroProfile 5ă§è¶…æ‰‹è»œă«ć§‹ă‚ă‚‹ä»Šă©ăăźă‚Żăƒ©ă‚Šăƒ‰ćźŒć…šćŻŸćżœă‚šăƒłă‚żăƒŒăƒ—ăƒ©ă‚€ă‚șă‚·ă‚čテム
MicroProfile 5ă§è¶…æ‰‹è»œă«ć§‹ă‚ă‚‹ä»Šă©ăăźă‚Żăƒ©ă‚Šăƒ‰ćźŒć…šćŻŸćżœă‚šăƒłă‚żăƒŒăƒ—ăƒ©ă‚€ă‚șă‚·ă‚čテムMicroProfile 5ă§è¶…æ‰‹è»œă«ć§‹ă‚ă‚‹ä»Šă©ăăźă‚Żăƒ©ă‚Šăƒ‰ćźŒć…šćŻŸćżœă‚šăƒłă‚żăƒŒăƒ—ăƒ©ă‚€ă‚șă‚·ă‚čテム
MicroProfile 5ă§è¶…æ‰‹è»œă«ć§‹ă‚ă‚‹ä»Šă©ăăźă‚Żăƒ©ă‚Šăƒ‰ćźŒć…šćŻŸćżœă‚šăƒłă‚żăƒŒăƒ—ăƒ©ă‚€ă‚șă‚·ă‚čテム
 
Docker Ecosystem on Azure
Docker Ecosystem on AzureDocker Ecosystem on Azure
Docker Ecosystem on Azure
 
CI/CD with AWS Code Services
CI/CD with AWS Code ServicesCI/CD with AWS Code Services
CI/CD with AWS Code Services
 
AngularずSpring Bootă§äœœă‚‹SPA + RESTful Web ServiceケプăƒȘă‚±ăƒŒă‚·ăƒ§ăƒł
AngularずSpring Bootă§äœœă‚‹SPA + RESTful Web ServiceケプăƒȘă‚±ăƒŒă‚·ăƒ§ăƒłAngularずSpring Bootă§äœœă‚‹SPA + RESTful Web ServiceケプăƒȘă‚±ăƒŒă‚·ăƒ§ăƒł
AngularずSpring Bootă§äœœă‚‹SPA + RESTful Web ServiceケプăƒȘă‚±ăƒŒă‚·ăƒ§ăƒł
 
æ„­ć‹™ăŠă‚™ ISUCON するこずにăȘăŁăŸè©±.pdf
æ„­ć‹™ăŠă‚™ ISUCON するこずにăȘăŁăŸè©±.pdfæ„­ć‹™ăŠă‚™ ISUCON するこずにăȘăŁăŸè©±.pdf
æ„­ć‹™ăŠă‚™ ISUCON するこずにăȘăŁăŸè©±.pdf
 
ă‚·ă‚čăƒ†ăƒ ăźăƒąăƒ€ăƒŠă‚€ă‚ș èœăĄăŠă‚‚è‰Żă„ă‚ąăƒ—ăƒȘăźäœœă‚Šæ–č
ă‚·ă‚čăƒ†ăƒ ăźăƒąăƒ€ăƒŠă‚€ă‚ș èœăĄăŠă‚‚è‰Żă„ă‚ąăƒ—ăƒȘăźäœœă‚Šæ–čă‚·ă‚čăƒ†ăƒ ăźăƒąăƒ€ăƒŠă‚€ă‚ș èœăĄăŠă‚‚è‰Żă„ă‚ąăƒ—ăƒȘăźäœœă‚Šæ–č
ă‚·ă‚čăƒ†ăƒ ăźăƒąăƒ€ăƒŠă‚€ă‚ș èœăĄăŠă‚‚è‰Żă„ă‚ąăƒ—ăƒȘăźäœœă‚Šæ–č
 
ă‚Șンプレミă‚čă‹ă‚‰ă‚Żăƒ©ă‚Šăƒ‰ăžïŒšOracle Databaseăźç§»èĄŒăƒ™ă‚čăƒˆăƒ—ăƒ©ă‚Żăƒ†ă‚Łă‚čă‚’è§ŁèȘŹ (Oracle Cloudă‚Šă‚§ăƒ“ăƒŠăƒŒă‚·ăƒȘăƒŒă‚ș: 2021ćčŽ2月18æ—„)
ă‚Șンプレミă‚čă‹ă‚‰ă‚Żăƒ©ă‚Šăƒ‰ăžïŒšOracle Databaseăźç§»èĄŒăƒ™ă‚čăƒˆăƒ—ăƒ©ă‚Żăƒ†ă‚Łă‚čă‚’è§ŁèȘŹ (Oracle Cloudă‚Šă‚§ăƒ“ăƒŠăƒŒă‚·ăƒȘăƒŒă‚ș: 2021ćčŽ2月18æ—„)ă‚Șンプレミă‚čă‹ă‚‰ă‚Żăƒ©ă‚Šăƒ‰ăžïŒšOracle Databaseăźç§»èĄŒăƒ™ă‚čăƒˆăƒ—ăƒ©ă‚Żăƒ†ă‚Łă‚čă‚’è§ŁèȘŹ (Oracle Cloudă‚Šă‚§ăƒ“ăƒŠăƒŒă‚·ăƒȘăƒŒă‚ș: 2021ćčŽ2月18æ—„)
ă‚Șンプレミă‚čă‹ă‚‰ă‚Żăƒ©ă‚Šăƒ‰ăžïŒšOracle Databaseăźç§»èĄŒăƒ™ă‚čăƒˆăƒ—ăƒ©ă‚Żăƒ†ă‚Łă‚čă‚’è§ŁèȘŹ (Oracle Cloudă‚Šă‚§ăƒ“ăƒŠăƒŒă‚·ăƒȘăƒŒă‚ș: 2021ćčŽ2月18æ—„)
 
ă‚łăƒłăƒ†ăƒŠăƒăƒŒă‚żăƒ“ăƒȘăƒ†ă‚ŁăźæŒŻă‚Šèż”ă‚ŠăšăƒăƒžăŁăŸäș‹äŸ‹çŽč介
ă‚łăƒłăƒ†ăƒŠăƒăƒŒă‚żăƒ“ăƒȘăƒ†ă‚ŁăźæŒŻă‚Šèż”ă‚ŠăšăƒăƒžăŁăŸäș‹äŸ‹çŽčä»‹ă‚łăƒłăƒ†ăƒŠăƒăƒŒă‚żăƒ“ăƒȘăƒ†ă‚ŁăźæŒŻă‚Šèż”ă‚ŠăšăƒăƒžăŁăŸäș‹äŸ‹çŽč介
ă‚łăƒłăƒ†ăƒŠăƒăƒŒă‚żăƒ“ăƒȘăƒ†ă‚ŁăźæŒŻă‚Šèż”ă‚ŠăšăƒăƒžăŁăŸäș‹äŸ‹çŽč介
 
ă‚”ăƒăƒŒăƒˆ スンゾニケが Azure Networking ă‚’ă˜ăŁăă‚ŠăŸăŁă·ă‚ŠèȘžă‚Šă€ăă™äŒš
ă‚”ăƒăƒŒăƒˆ スンゾニケが Azure Networking ă‚’ă˜ăŁăă‚ŠăŸăŁă·ă‚ŠèȘžă‚Šă€ăă™äŒšă‚”ăƒăƒŒăƒˆ スンゾニケが Azure Networking ă‚’ă˜ăŁăă‚ŠăŸăŁă·ă‚ŠèȘžă‚Šă€ăă™äŒš
ă‚”ăƒăƒŒăƒˆ スンゾニケが Azure Networking ă‚’ă˜ăŁăă‚ŠăŸăŁă·ă‚ŠèȘžă‚Šă€ăă™äŒš
 
Automating nist 800 171 compliance in AWS Govcloud (US)
Automating nist 800 171 compliance in AWS Govcloud (US)Automating nist 800 171 compliance in AWS Govcloud (US)
Automating nist 800 171 compliance in AWS Govcloud (US)
 
Core Concept: Software Defined Everything
Core Concept: Software Defined EverythingCore Concept: Software Defined Everything
Core Concept: Software Defined Everything
 
Terraform modules and (some of) best practices
Terraform modules and (some of) best practicesTerraform modules and (some of) best practices
Terraform modules and (some of) best practices
 
Infrastructure as Code
Infrastructure as CodeInfrastructure as Code
Infrastructure as Code
 
Terraform
TerraformTerraform
Terraform
 
WSUSç§»èĄŒă‚’ă—ăŠăżăŸè©±
WSUSç§»èĄŒă‚’ă—ăŠăżăŸè©±WSUSç§»èĄŒă‚’ă—ăŠăżăŸè©±
WSUSç§»èĄŒă‚’ă—ăŠăżăŸè©±
 
Server virtualization by VMWare
Server virtualization by VMWareServer virtualization by VMWare
Server virtualization by VMWare
 
OCI èłŒć…„ăƒąăƒ‡ăƒ«ăźæ•Žç†ăš Universal Credit æœ€æ–°æƒ…ć ±(2021ćčŽ2月17旄版)
OCI èłŒć…„ăƒąăƒ‡ăƒ«ăźæ•Žç†ăš Universal Credit æœ€æ–°æƒ…ć ±(2021ćčŽ2月17旄版)OCI èłŒć…„ăƒąăƒ‡ăƒ«ăźæ•Žç†ăš Universal Credit æœ€æ–°æƒ…ć ±(2021ćčŽ2月17旄版)
OCI èłŒć…„ăƒąăƒ‡ăƒ«ăźæ•Žç†ăš Universal Credit æœ€æ–°æƒ…ć ±(2021ćčŽ2月17旄版)
 
[A31]AWS侊でOracleă‚’ćˆ©ç”šă™ă‚‹ăŸă‚ăźăŻă˜ă‚ăźäž€æ­©ïŒby Masatoshi Yoshida
[A31]AWS侊でOracleă‚’ćˆ©ç”šă™ă‚‹ăŸă‚ăźăŻă˜ă‚ăźäž€æ­©ïŒby Masatoshi Yoshida[A31]AWS侊でOracleă‚’ćˆ©ç”šă™ă‚‹ăŸă‚ăźăŻă˜ă‚ăźäž€æ­©ïŒby Masatoshi Yoshida
[A31]AWS侊でOracleă‚’ćˆ©ç”šă™ă‚‹ăŸă‚ăźăŻă˜ă‚ăźäž€æ­©ïŒby Masatoshi Yoshida
 
Inspirage Webinar on Epm integration agent
Inspirage Webinar on Epm integration agentInspirage Webinar on Epm integration agent
Inspirage Webinar on Epm integration agent
 
GitOps 101 Presentation.pdf
GitOps 101 Presentation.pdfGitOps 101 Presentation.pdf
GitOps 101 Presentation.pdf
 

Ähnlich wie Hosting Your Own OTA Update Service

Deploying Symfony | symfony.cat
Deploying Symfony | symfony.catDeploying Symfony | symfony.cat
Deploying Symfony | symfony.catPablo Godel
 
TLS303 How to Deploy Python Applications on AWS Elastic Beanstalk - AWS re:In...
TLS303 How to Deploy Python Applications on AWS Elastic Beanstalk - AWS re:In...TLS303 How to Deploy Python Applications on AWS Elastic Beanstalk - AWS re:In...
TLS303 How to Deploy Python Applications on AWS Elastic Beanstalk - AWS re:In...Amazon Web Services
 
AWS CodeDeploy - basic intro
AWS CodeDeploy - basic introAWS CodeDeploy - basic intro
AWS CodeDeploy - basic introAnton Babenko
 
ĐžĐ±Ń…ĐŸĐŽ ĐżŃ€ĐŸĐČДрĐșĐž Đ±Đ”Đ·ĐŸĐżĐ°ŃĐœĐŸŃŃ‚Đž ĐČ ĐŒĐ°ĐłĐ°Đ·ĐžĐœĐ°Ń… ĐŒĐŸĐ±ĐžĐ»ŃŒĐœŃ‹Ń… ĐżŃ€ĐžĐ»ĐŸĐ¶Đ”ĐœĐžĐč про ĐżĐŸĐŒĐŸŃ‰Đž платф...
ĐžĐ±Ń…ĐŸĐŽ ĐżŃ€ĐŸĐČДрĐșĐž Đ±Đ”Đ·ĐŸĐżĐ°ŃĐœĐŸŃŃ‚Đž ĐČ ĐŒĐ°ĐłĐ°Đ·ĐžĐœĐ°Ń… ĐŒĐŸĐ±ĐžĐ»ŃŒĐœŃ‹Ń… ĐżŃ€ĐžĐ»ĐŸĐ¶Đ”ĐœĐžĐč про ĐżĐŸĐŒĐŸŃ‰Đž платф...ĐžĐ±Ń…ĐŸĐŽ ĐżŃ€ĐŸĐČДрĐșĐž Đ±Đ”Đ·ĐŸĐżĐ°ŃĐœĐŸŃŃ‚Đž ĐČ ĐŒĐ°ĐłĐ°Đ·ĐžĐœĐ°Ń… ĐŒĐŸĐ±ĐžĐ»ŃŒĐœŃ‹Ń… ĐżŃ€ĐžĐ»ĐŸĐ¶Đ”ĐœĐžĐč про ĐżĐŸĐŒĐŸŃ‰Đž платф...
ĐžĐ±Ń…ĐŸĐŽ ĐżŃ€ĐŸĐČДрĐșĐž Đ±Đ”Đ·ĐŸĐżĐ°ŃĐœĐŸŃŃ‚Đž ĐČ ĐŒĐ°ĐłĐ°Đ·ĐžĐœĐ°Ń… ĐŒĐŸĐ±ĐžĐ»ŃŒĐœŃ‹Ń… ĐżŃ€ĐžĐ»ĐŸĐ¶Đ”ĐœĐžĐč про ĐżĐŸĐŒĐŸŃ‰Đž платф...Positive Hack Days
 
Appium workship, Mobile Web+Dev Conference
Appium workship,  Mobile Web+Dev ConferenceAppium workship,  Mobile Web+Dev Conference
Appium workship, Mobile Web+Dev ConferenceIsaac Murchie
 
Appium mobile web+dev conference
Appium   mobile web+dev conferenceAppium   mobile web+dev conference
Appium mobile web+dev conferenceIsaac Murchie
 
Cannibalising The Google App Engine
Cannibalising The  Google  App  EngineCannibalising The  Google  App  Engine
Cannibalising The Google App Enginecatherinewall
 
(ARC402) Deployment Automation: From Developers' Keyboards to End Users' Scre...
(ARC402) Deployment Automation: From Developers' Keyboards to End Users' Scre...(ARC402) Deployment Automation: From Developers' Keyboards to End Users' Scre...
(ARC402) Deployment Automation: From Developers' Keyboards to End Users' Scre...Amazon Web Services
 
Torquebox @ Raleigh.rb - April 2011
Torquebox @ Raleigh.rb - April 2011Torquebox @ Raleigh.rb - April 2011
Torquebox @ Raleigh.rb - April 2011tobiascrawley
 
[QE 2018] Adam Stasiak – Nadchodzi React Native – czyli o testowaniu mobilnyc...
[QE 2018] Adam Stasiak – Nadchodzi React Native – czyli o testowaniu mobilnyc...[QE 2018] Adam Stasiak – Nadchodzi React Native – czyli o testowaniu mobilnyc...
[QE 2018] Adam Stasiak – Nadchodzi React Native – czyli o testowaniu mobilnyc...Future Processing
 
Symfony Deployments on Heroku
Symfony Deployments on HerokuSymfony Deployments on Heroku
Symfony Deployments on HerokuStefan Adolf
 
Node Summit 2018: Cloud Native Node.js
Node Summit 2018: Cloud Native Node.jsNode Summit 2018: Cloud Native Node.js
Node Summit 2018: Cloud Native Node.jsChris Bailey
 
Silicon Valley Code Camp 2019 - Reaching the Cloud Native World
Silicon Valley Code Camp 2019 - Reaching the Cloud Native WorldSilicon Valley Code Camp 2019 - Reaching the Cloud Native World
Silicon Valley Code Camp 2019 - Reaching the Cloud Native WorldChris Bailey
 
Torquebox Asheville.rb April 2011
Torquebox Asheville.rb April 2011Torquebox Asheville.rb April 2011
Torquebox Asheville.rb April 2011Lance Ball
 
Running Microservices and Docker on AWS Elastic Beanstalk - August 2016 Month...
Running Microservices and Docker on AWS Elastic Beanstalk - August 2016 Month...Running Microservices and Docker on AWS Elastic Beanstalk - August 2016 Month...
Running Microservices and Docker on AWS Elastic Beanstalk - August 2016 Month...Amazon Web Services
 
Running Microservices on AWS Elastic Beanstalk
Running Microservices on AWS Elastic BeanstalkRunning Microservices on AWS Elastic Beanstalk
Running Microservices on AWS Elastic BeanstalkAmazon Web Services
 
Nodejs Intro - Part2 Introduction to Web Applications
Nodejs Intro - Part2 Introduction to Web ApplicationsNodejs Intro - Part2 Introduction to Web Applications
Nodejs Intro - Part2 Introduction to Web ApplicationsBudh Ram Gurung
 
Can I Contain This?
Can I Contain This?Can I Contain This?
Can I Contain This?Eficode
 
Modern Web Application Development Workflow - EclipseCon France 2014
Modern Web Application Development Workflow - EclipseCon France 2014Modern Web Application Development Workflow - EclipseCon France 2014
Modern Web Application Development Workflow - EclipseCon France 2014Stéphane Bégaudeau
 

Ähnlich wie Hosting Your Own OTA Update Service (20)

Deploying Symfony | symfony.cat
Deploying Symfony | symfony.catDeploying Symfony | symfony.cat
Deploying Symfony | symfony.cat
 
TLS303 How to Deploy Python Applications on AWS Elastic Beanstalk - AWS re:In...
TLS303 How to Deploy Python Applications on AWS Elastic Beanstalk - AWS re:In...TLS303 How to Deploy Python Applications on AWS Elastic Beanstalk - AWS re:In...
TLS303 How to Deploy Python Applications on AWS Elastic Beanstalk - AWS re:In...
 
AWS CodeDeploy - basic intro
AWS CodeDeploy - basic introAWS CodeDeploy - basic intro
AWS CodeDeploy - basic intro
 
ĐžĐ±Ń…ĐŸĐŽ ĐżŃ€ĐŸĐČДрĐșĐž Đ±Đ”Đ·ĐŸĐżĐ°ŃĐœĐŸŃŃ‚Đž ĐČ ĐŒĐ°ĐłĐ°Đ·ĐžĐœĐ°Ń… ĐŒĐŸĐ±ĐžĐ»ŃŒĐœŃ‹Ń… ĐżŃ€ĐžĐ»ĐŸĐ¶Đ”ĐœĐžĐč про ĐżĐŸĐŒĐŸŃ‰Đž платф...
ĐžĐ±Ń…ĐŸĐŽ ĐżŃ€ĐŸĐČДрĐșĐž Đ±Đ”Đ·ĐŸĐżĐ°ŃĐœĐŸŃŃ‚Đž ĐČ ĐŒĐ°ĐłĐ°Đ·ĐžĐœĐ°Ń… ĐŒĐŸĐ±ĐžĐ»ŃŒĐœŃ‹Ń… ĐżŃ€ĐžĐ»ĐŸĐ¶Đ”ĐœĐžĐč про ĐżĐŸĐŒĐŸŃ‰Đž платф...ĐžĐ±Ń…ĐŸĐŽ ĐżŃ€ĐŸĐČДрĐșĐž Đ±Đ”Đ·ĐŸĐżĐ°ŃĐœĐŸŃŃ‚Đž ĐČ ĐŒĐ°ĐłĐ°Đ·ĐžĐœĐ°Ń… ĐŒĐŸĐ±ĐžĐ»ŃŒĐœŃ‹Ń… ĐżŃ€ĐžĐ»ĐŸĐ¶Đ”ĐœĐžĐč про ĐżĐŸĐŒĐŸŃ‰Đž платф...
ĐžĐ±Ń…ĐŸĐŽ ĐżŃ€ĐŸĐČДрĐșĐž Đ±Đ”Đ·ĐŸĐżĐ°ŃĐœĐŸŃŃ‚Đž ĐČ ĐŒĐ°ĐłĐ°Đ·ĐžĐœĐ°Ń… ĐŒĐŸĐ±ĐžĐ»ŃŒĐœŃ‹Ń… ĐżŃ€ĐžĐ»ĐŸĐ¶Đ”ĐœĐžĐč про ĐżĐŸĐŒĐŸŃ‰Đž платф...
 
Appium workship, Mobile Web+Dev Conference
Appium workship,  Mobile Web+Dev ConferenceAppium workship,  Mobile Web+Dev Conference
Appium workship, Mobile Web+Dev Conference
 
Appium mobile web+dev conference
Appium   mobile web+dev conferenceAppium   mobile web+dev conference
Appium mobile web+dev conference
 
Cannibalising The Google App Engine
Cannibalising The  Google  App  EngineCannibalising The  Google  App  Engine
Cannibalising The Google App Engine
 
(ARC402) Deployment Automation: From Developers' Keyboards to End Users' Scre...
(ARC402) Deployment Automation: From Developers' Keyboards to End Users' Scre...(ARC402) Deployment Automation: From Developers' Keyboards to End Users' Scre...
(ARC402) Deployment Automation: From Developers' Keyboards to End Users' Scre...
 
Mojolicious
MojoliciousMojolicious
Mojolicious
 
Torquebox @ Raleigh.rb - April 2011
Torquebox @ Raleigh.rb - April 2011Torquebox @ Raleigh.rb - April 2011
Torquebox @ Raleigh.rb - April 2011
 
[QE 2018] Adam Stasiak – Nadchodzi React Native – czyli o testowaniu mobilnyc...
[QE 2018] Adam Stasiak – Nadchodzi React Native – czyli o testowaniu mobilnyc...[QE 2018] Adam Stasiak – Nadchodzi React Native – czyli o testowaniu mobilnyc...
[QE 2018] Adam Stasiak – Nadchodzi React Native – czyli o testowaniu mobilnyc...
 
Symfony Deployments on Heroku
Symfony Deployments on HerokuSymfony Deployments on Heroku
Symfony Deployments on Heroku
 
Node Summit 2018: Cloud Native Node.js
Node Summit 2018: Cloud Native Node.jsNode Summit 2018: Cloud Native Node.js
Node Summit 2018: Cloud Native Node.js
 
Silicon Valley Code Camp 2019 - Reaching the Cloud Native World
Silicon Valley Code Camp 2019 - Reaching the Cloud Native WorldSilicon Valley Code Camp 2019 - Reaching the Cloud Native World
Silicon Valley Code Camp 2019 - Reaching the Cloud Native World
 
Torquebox Asheville.rb April 2011
Torquebox Asheville.rb April 2011Torquebox Asheville.rb April 2011
Torquebox Asheville.rb April 2011
 
Running Microservices and Docker on AWS Elastic Beanstalk - August 2016 Month...
Running Microservices and Docker on AWS Elastic Beanstalk - August 2016 Month...Running Microservices and Docker on AWS Elastic Beanstalk - August 2016 Month...
Running Microservices and Docker on AWS Elastic Beanstalk - August 2016 Month...
 
Running Microservices on AWS Elastic Beanstalk
Running Microservices on AWS Elastic BeanstalkRunning Microservices on AWS Elastic Beanstalk
Running Microservices on AWS Elastic Beanstalk
 
Nodejs Intro - Part2 Introduction to Web Applications
Nodejs Intro - Part2 Introduction to Web ApplicationsNodejs Intro - Part2 Introduction to Web Applications
Nodejs Intro - Part2 Introduction to Web Applications
 
Can I Contain This?
Can I Contain This?Can I Contain This?
Can I Contain This?
 
Modern Web Application Development Workflow - EclipseCon France 2014
Modern Web Application Development Workflow - EclipseCon France 2014Modern Web Application Development Workflow - EclipseCon France 2014
Modern Web Application Development Workflow - EclipseCon France 2014
 

KĂŒrzlich hochgeladen

Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024The Digital Insurer
 
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...Jeffrey Haguewood
 
MS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectorsMS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectorsNanddeep Nachan
 
Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...
Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...
Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...apidays
 
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...Drew Madelung
 
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost SavingRepurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost SavingEdi Saputra
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Miguel AraĂșjo
 
ICT role in 21st century education and its challenges
ICT role in 21st century education and its challengesICT role in 21st century education and its challenges
ICT role in 21st century education and its challengesrafiqahmad00786416
 
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...apidays
 
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc
 
GenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdfGenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdflior mazor
 
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ..."I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...Zilliz
 
Manulife - Insurer Transformation Award 2024
Manulife - Insurer Transformation Award 2024Manulife - Insurer Transformation Award 2024
Manulife - Insurer Transformation Award 2024The Digital Insurer
 
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWEREMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWERMadyBayot
 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoffsammart93
 
AXA XL - Insurer Innovation Award Americas 2024
AXA XL - Insurer Innovation Award Americas 2024AXA XL - Insurer Innovation Award Americas 2024
AXA XL - Insurer Innovation Award Americas 2024The Digital Insurer
 
FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024The Digital Insurer
 
DBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor PresentationDBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor PresentationDropbox
 
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 WoodJuan lago vĂĄzquez
 

KĂŒrzlich hochgeladen (20)

Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024
 
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
 
MS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectorsMS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectors
 
Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...
Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...
Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...
 
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...
 
+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...
 
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost SavingRepurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
 
ICT role in 21st century education and its challenges
ICT role in 21st century education and its challengesICT role in 21st century education and its challenges
ICT role in 21st century education and its challenges
 
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...
 
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
 
GenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdfGenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdf
 
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ..."I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
 
Manulife - Insurer Transformation Award 2024
Manulife - Insurer Transformation Award 2024Manulife - Insurer Transformation Award 2024
Manulife - Insurer Transformation Award 2024
 
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWEREMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
 
AXA XL - Insurer Innovation Award Americas 2024
AXA XL - Insurer Innovation Award Americas 2024AXA XL - Insurer Innovation Award Americas 2024
AXA XL - Insurer Innovation Award Americas 2024
 
FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024
 
DBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor PresentationDBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor Presentation
 
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
 

Hosting Your Own OTA Update Service

  • 1. Host your own Over-the-air update service
  • 2. Roadmap Buggy Valley App GloriïŹed cURLing App Designing an OTA Service Hosting Your Own Service OTA Assets Announcements
  • 7. Standing on the shoulders of giants
  • 10. Buggy Valley $ p = 0.5 $$ Nothingp = 0.5
  • 11. Buggy Valley p = 0.5 p = 0.5
  • 12. Android Java Implementation String redScreenPath = “file:///red-screen.js”; String pillarValleyPath = “file:///pillar-valley.js”;
  • 13. Android Java Implementation String redScreenPath = “file:///red-screen.js”; String pillarValleyPath = “file:///pillar-valley.js”; int randNum = getRandom(); if (isEven(randNum)){ loadApp(redScreenPath); } else { loadApp(pillarValleyPath); }
  • 14. Android Java Implementation String redScreenPath = “file:///red-screen.js”; String pillarValleyPath = “file:///pillar-valley.js”; int randNum = getRandom(); if (isEven(randNum)){ loadApp(redScreenPath); } else { loadApp(pillarValleyPath);** } ** how does loadApp work?
  • 15.
  • 16.
  • 17. Quick Recap String redScreenPath = “file:///red-screen.js”; String pillarValleyPath = “file:///pillar-valley.js”; int randNum = getRandom(); if (isEven(randNum)){ loadApp(redScreenPath); } else { loadApp(pillarValleyPath);** } ** how does loadApp work?
  • 18. Roadmap Buggy Valley App GloriïŹed cURLing App Designing an OTA Service Hosting Your Own Service OTA Assets Announcements
  • 19.
  • 20. Buggy Valley fits in perfectly with my use case. Your MVP was just what I needed!
  • 22. Original Buggy Valley String redScreenPath = “file:///red-screen.js”; String pillarValleyPath = “file:///pillar-valley.js”; int randNum = getRandom(); if (isEven(randNum)){ loadApp(redScreenPath); } else { loadApp(pillarValleyPath); }
  • 23. ModiïŹed Buggy Valley String redScreenPath = “file:///red-screen.js”; String aliceAppPath = “file:///alice-app.js”; int randNum = getRandom(); if (isEven(randNum)){ loadApp(redScreenPath); } else { loadApp(aliceAppPath); }
  • 24. ModiïŹed Buggy Valley String redScreenPath = “file:///red-screen.js”; String aliceAppPath = “file:///alice-app.js”; int randNum = getRandom(); if (isEven(randNum)){ loadApp(redScreenPath); } else { loadApp(aliceAppPath); }
  • 25. ModiïŹed Buggy Valley String newAliceAppPath String aliceAppPath = “file:///alice-app.js”; int randNum = getRandom(); if (isEven(randNum)){ loadApp(newAliceAppPath); } else { loadApp(aliceAppPath); }
  • 26. ModiïŹed Buggy Valley String newAliceAppPath = cURLToDisk(“https://expo.io/@alice/app”); String aliceAppPath = “file:///alice-app.js”; int randNum = getRandom(); if (isEven(randNum)){ loadApp(newAliceAppPath); } else { loadApp(aliceAppPath); }
  • 27. ModiïŹed Buggy Valley String newAliceAppPath = cURLToDisk(“https://expo.io/@alice/app”); String aliceAppPath = “file:///alice-app.js”; int randNum = getRandom(); if (isEven(randNum)){ loadApp(newAliceAppPath); } else { loadApp(aliceAppPath); }
  • 28. GloriïŹed cURL String newAliceAppPath = cURLToDisk(“https://expo.io/@alice/app”); String aliceAppPath = “file:///alice-app.js”; if (newAliceAppPath != null){ loadApp(newAliceAppPath); } else { loadApp(aliceAppPath); }
  • 29. Wait but how does this benefit me?
  • 31. JS Bundle Native Modules Currently on disk: Traditional update New JS Bundle New Native Modules
  • 32. JS Bundle Native Modules Currently on disk: Traditional update New JS Bundle New Native Modules Avg binary size ~30Mb
  • 34. JS Bundle Native Modules Currently on disk: GloriïŹed cURL update New JS Bundle Native Modules
  • 35. Roadmap Buggy Valley App GloriïŹed cURLing App Designing an OTA Service Hosting Your Own Service OTA Assets Announcements
  • 36.
  • 37. Glorified cURL fits in perfectly with my use case. Your MVP was just what I needed!
  • 38. It’s not very performant tho...
  • 39. GloriïŹed cURL String newBobAppPath = cURLToDisk(“https://expo.io/@bob/app”); String bobAppPath = “file:///bob-app.js”; if (newBobAppPath != null){ loadApp(newBobAppPath); } else { loadApp(bobAppPath); }
  • 40. GloriïŹed cURL String newBobAppPath = cURLToDisk(“https://expo.io/@bob/app”); String bobAppPath = “file:///bob-app.js”; if (newBobAppPath != null){ loadApp(newBobAppPath); } else { loadApp(bobAppPath); } JS Bundle We don’t want to load the JS bundle unnecessarily. We only want to load the JS bundle if there’s a new change available.
  • 41. Let’s take a step back And think about how the web works for a sec
  • 42. The Web <script src=“bundle.js” /> Big JS bundle bundle.js index.html
  • 43. Taking a page out of the web book {bundleUrl: ‘bundle.js’} Big JS bundle bundle.js index.json
  • 44. Taking a page out of the web book {bundleUrl: ‘ios-1a2b3c.js’} Big JS bundle ios-1a2b3c.js index.json Bundle name is based oïŹ€ its md5 hash
  • 45. Taking a page out of the web book {bundleUrl: ‘ios-7a8b9c’} Big JS bundle ios-7a8b9c.js index.json Cache the bundleUrl Only download bundleUrl if we don’t have it cached
  • 46. How do I use an OTA service in my app? ^ these are my app ïŹles ^ this is what my app looks like
  • 47. How do I use an OTA service in my app? dev tools GUI ^ push this button to upload app to expo server
  • 48. How do I use an OTA service in my app? Or use the cli if you prefer > expo publish Run this command in your project directory to upload to expo servers
  • 49. How often is the server polled for updates? The default behavior is to poll the server when the app starts up
  • 50. What if I don’t like the default behavior? You can use the Updates module to customize when you’d to update your app ^ from the docs page
  • 51. Roadmap Buggy Valley App GloriïŹed cURLing App Designing an OTA Service Hosting Your Own Service OTA Assets Announcements
  • 52. I’m in a country where network latency to your CDNs are really high
  • 53. I’m in a country where network latency to your CDNs are really high How about hosting your own app then?
  • 54. I’m in a country where network latency to your CDNs are really high How about hosting your own app then?* * in our upcoming SDK release
  • 55. How do I host my own app? ^ these are my app ïŹles ^ this is what my app looks like
  • 56. > expo export Run this command in your project directory to dump your app to disk How do I host my own app?
  • 57. This is what gets dumped to disk How do I host my own app? . ├── android-index.json ├── ios-index.json ├── assets │   └── 1ecc2 └── bundles       ├── android-01ee6.js       └── ios-ee820.js
  • 58. How do I host my own app? . ├── android-index.json ├── ios-index.json ├── assets │   └── 1ecc2 └── bundles       ├── android-01ee6.js       └── ios-ee820.js
  • 59. How do I host my own app? . ├── android-index.json ├── ios-index.json ├── assets │   └── 1ecc2 └── bundles       ├── android-01ee6.js       └── ios-ee820.js {bundleUrl: ‘ios-ee820.js’} Big JS bundle ios-ee820.js ios-index.json
  • 60. How do I host my own app? . ├── android-index.json ├── ios-index.json ├── assets │   └── 1ecc2 └── bundles       ├── android-01ee6.js       └── ios-ee820.js git push master
  • 61. I pushed to GitHub because it has free static hosting. You can host your app from any server.
  • 62. How do I build my app binary? > expo build:ios Run this command in your project directory
  • 63. How do I build my app binary? > expo build:ios —public-url https://quinlanj.github.io/self-hosting/ios-index.json Run this command in your project directory
  • 64. How do I build my app binary? > expo build:ios —public-url https://quinlanj.github.io/self-hosting/ios-index.json {bundleUrl: ‘ios-ee820.js’} Big JS bundle ios-ee820.js ios-index.json ^ This ïŹle is served ïŹrst
  • 66. How do I use this in development? https://quinlanj.github.io/selfhost/ios-index.json Convert to QR code
  • 67. How do I use this in development? Scan the QR code into the expo dev app
  • 68. How do I use this in development? http://localhost:8000/ios-index.json Convert to QR code
  • 69. How do I use this in development? Scan the QR code into the expo dev app
  • 70. Roadmap Buggy Valley App GloriïŹed cURLing App Designing an OTA Service Hosting Your Own Service OTA Assets Announcements
  • 71. This is what my app looks like. I’ve installed it on my phone.
  • 72. In development, let’s make a change by adding another pic
  • 73. Push changes to GitHub
  • 74. This is what my app looks like. I’ve installed it on my phone.
  • 75. This is what my app looks like. I’ve installed it on my phone. Currently on ïŹlesystem: JS Bundle
  • 76. This is what my app looks like. I’ve installed it on my phone. Currently on ïŹlesystem: JS Bundle quinlanj.github.io Here is the server hosting my app
  • 77. This is what my app looks like. I’ve installed it on my phone. Currently on ïŹlesystem: JS Bundle quinlanj.github.io An update is ready!
  • 78. This is what my app looks like. I’ve installed it on my phone. Currently on ïŹlesystem: JS Bundle quinlanj.github.io An update is ready! Files to be served: New JS Bundle
  • 79. This is what my app looks like. I’ve installed it on my phone. Currently on ïŹlesystem: JS Bundle quinlanj.github.io An update is ready! Files to be served: New JS Bundle JS Bundle
  • 80. This is what my app looks like. I’ve installed it on my phone. Currently on ïŹlesystem: quinlanj.github.io An update is ready! Files to be served: New JS Bundle
  • 81. New JS Bundle <Image source={require(‘cat.png’} /> <Image source={require(‘dog.png’} />
  • 82. This is what my app looks like. I’ve installed it on my phone. Currently on ïŹlesystem: quinlanj.github.io An update is ready! Files to be served: New JS Bundle ? dog.png is pulled down to ïŹlesystem?
  • 83. New JS Bundle <Image source={require(‘cat.png’} /> <Image source={require(‘dog.png’} /> But how? It looks like these assets are fetched from ïŹlesystem
  • 84. New JS Bundle <Image source={require(‘cat.png’} /> <Image source={require(‘dog.png’} /> We wrote a module to override asset resolution
  • 85. New JS Bundle <Image source={require(‘cat.png’} /> <Image source={require(‘dog.png’} /> Module Logic: Look for asset in the ïŹlesystem If it’s not there, look for it from the server
  • 86. This is what my app looks like. I’ve installed it on my phone. Currently on ïŹlesystem: quinlanj.github.io An update is ready! Files to be served: New JS Bundle ? dog.png is pulled down to ïŹlesystem?
  • 87. This is what my app looks like. I’ve installed it on my phone. Currently on ïŹlesystem: quinlanj.github.io An update is ready! Files to be served: New JS Bundle ? dog.png is not on the ïŹlesystem
  • 88. This is what my app looks like. I’ve installed it on my phone. Currently on ïŹlesystem: quinlanj.github.io An update is ready! Files to be served: New JS Bundle ? Let’s grab dog.png from server then!
  • 89. This is what my app looks like. I’ve installed it on my phone. Currently on ïŹlesystem: quinlanj.github.io An update is ready! Files to be served: New JS Bundle
  • 90. This is what my app looks like. I’ve installed it on my phone. Currently on ïŹlesystem: quinlanj.github.io An update is ready! Files to be served: New JS Bundle Cached for future use
  • 91. How come assets are stored by hash? . ├── android-index.json ├── ios-index.json ├── assets │   └── 1ecc2 └── bundles       ├── android-01ee6.js       └── ios-ee820.js
  • 92. JS Bundle <Image source={require(‘cat.png’)} /> We are requiring assets by their name, not by their hash
  • 93. JS Bundle require(‘cat.png’) React native packager {assetName: ‘cat.png’, hash:’1ecc2’} App packaging App.js
  • 94. JS Bundle <Image source={require(‘cat.png’} /> Module Logic: Look for cat.png in the ïŹlesystem If it’s not there, look for cat.png from the server Recall
  • 95. JS Bundle Module Logic: Look for 1ecc2 in the ïŹlesystem If it’s not there, look for 1ecc2 from the server Actual Implementation {assetName: ‘cat.png’, hash:’1ecc2’}
  • 96. How does this benefit me?
  • 97. <Image source={require(‘cat1.png’} /> <Image source={require(‘crazy-cat.png’} /> <Image source={require(‘lime-cat.png’} /> 
 This app displays the same cat picture These cat pictures are all named something diïŹ€erent
  • 98. {assetName: ‘cat1.png’, hash:’1ecc2’} {assetName: ‘crazy-cat.png’, hash:’1ecc2’} {assetName: ‘lime-cat.png’, hash:’1ecc2’} 
 They all resolve to the same ïŹle on disk: 1ecc2
  • 99. Roadmap Buggy Valley App GloriïŹed cURLing App Designing an OTA Service Hosting Your Own Service OTA Assets Announcements
  • 100. Announcements We made a web application called Snack Snack is like a JS Fiddle for react native apps Snack is now open source, check it out at https://github.com/expo/snack-web