SlideShare a Scribd company logo
Hotfixing iOS apps
with Javascript
Sergio Padrino Recio
About me…
• Sergio Padrino (@sergiou87)
• Started working on iOS on 2010
• Worked atTuenti as iOS engineer (2012-2013)
• Worked at Fever as iOS Lead engineer (2014)
• Working at Plex since July 2014 – Current iOSTeam Lead
About Plex
About Plex
Example case
Example case
• Submit to Apple.
• Wait for review: 7 days.
• In review: 3 hours.
• Release!
Example case
WTF??
8 days later…
We are all Peter
Example case
• Extreme case, workflow full of flaws:
• Coder failed.
• Code reviewer failed.
• Testers failed.
• Apple… didn’t say anything.
Plex:The Monster
• Too many moving parts:
• Plex Media Server version
• User network setup
• Interoperability with other Plex players
• Audio/Video/Subtitle format
Fixes are usually quick, but…
Apple App Review process
• Used to be 1 week.
• Now reduced to 1-3 days.
• Still not reliable…
• Reviewer testing the wrong binary.
• App rejected because… Apple 😒
• Christmas holidays.
• Sometimes just gets longer.
appreviewtimes.com
Can we improve this?
Can we improve this?
• Android and Web apps can be updated at any time.
• Native iOS apps need to bypass Apple review:
• Use a remote configuration (GroundControl).
• Embedded web pages can be updated.
• Or…
rollout.io
• Service to hotfix apps without Apple review:
• Surround method with try…catch
• Replace method argument or return value
• No-op a method
• Basic scripting
rollout.io
• Main problems (for us):
• Their platform has the ability to change our app
remotely. If they’re compromised… 😱
• “Expensive” post-build script to upload dSym.
• Our dSym is massive and they had trouble
processing it 😆
DIY
• Can we do it ourselves… better?
• Recent pain working on AppleTV app:
• Too much Javascript 😖
• Objective-C magic
• My own solution… SPHotPatch
plex.tv
DIY
Configuration
file
(hotfixes)
Plex for iOS
MAGIC
✨
But… how??
But… how??
Method Swizzling!
Method Swizzling
An Example
- (void)doSomethingWrong {

self.array[self.array.count];

}











Method Swizzling
An Example
- (void)doSomethingWrong {

self.array[self.array.count];

}



- (void)safe_doSomethingWrong {

@try { 

[self safe_doSomethingWrong];

} @catch(…) { }

}
Method Swizzling
An Example
- (void)doSomethingWrong {

self.array[self.array.count];

}



- (void)safe_doSomethingWrong {

@try { 

[self safe_doSomethingWrong];

} @catch(…) { }

}
INFINITE
RECURSION?!
Method Swizzling
An Example
- (void)doSomethingWrong {

self.array[self.array.count];

}



- (void)safe_doSomethingWrong {

@try { 

[self safe_doSomethingWrong];

} @catch(…) { }

}
INFINITE
RECURSION?!
doSomethingWrong
Method Swizzling
An Example
array[array.count]
safe_doSomethingWrong
@try {



[self 

safe_doSomethingWrong];



} @catch(…) {}
doSomethingWrong
Method Swizzling
An Example
array[array.count]
safe_doSomethingWrong
@try {



[self 

safe_doSomethingWrong];



} @catch(…) {}
safe_doSomethingWrongdoSomethingWrong
@try {



[self 

safe_doSomethingWrong];



} @catch(…) {}
Method Swizzling
An Example
array[array.count]
doSomethingWrong
@try {



[self 

safe_doSomethingWrong];



} @catch(…) {}
Method Swizzling
An Example
array[array.count]
safe_doSomethingWrong
Where is my Javascript??
• JavascriptCore since iOS 7.
• Run JS scripts from Objective-C.
• Bridging: call Objective-C code from JS.
• More Objective-C runtime magic.
Javascript Core
• Run Javascript scripts from Objective-C:
Bridging
• Invoke Objective-C code from Javascript:
MyCrashyClass
doSomethingWrong
Combine all that…
array[array.count]
MyCrashyClass
safe_doSomethingWrongdoSomethingWrong
JSContext *context = …

[context evaluate:hotfixString]
Combine all that…
array[array.count]
doSomethingWrong
MyCrashyClass
JSContext *context = …

[context evaluate:hotfixString]
…fixed!
array[array.count]
safe_doSomethingWrong
More Objective-C runtime?
• “Proxy” object that gives access to Obj-C stuff
from JS.
More Objective-C runtime?
• Box method parameters to JSValue.
• Unbox return value from JSValue ⚠
• A lot of boilerplate to support as many types as
possible.
• Took some “inspiration” from OCMockito.
Unboxing return value…
IMP newImp = imp_implementationWithBlock(^(id self, ...) 

{

va_list args;



// Box parameters from args and prepare script

NSString *script = ...;

JSValue *result = [context evaluateScript:script];



if ([result isString])

return [result toString];

else if ([result isNumber])

return [result toInt32];

}
Unboxing return value…
• Method parameters are easy: variadic arguments.
• There is no “wild card” for return types.
• The only option… override forwardInvocation:
• NSInvocation is the key!
Unboxing return value…
IMP newImp = imp_implementationWithBlock(^(id self,

NSInvocation *inv) 

{

// Box parameters from invocation and prepare script

NSString *script = ...;

JSValue *result = [context evaluateScript:script];



if (inv.methodSignature.methodReturnType == ‘@’)

[inv setReturnValue:[result toObject]];

else if (inv.methodSignature.methodReturnType == ‘i’)

[inv setReturnValue:[result toInt32]];

}
MyCrashyClass
doSomethingWrong
Real Life™
array[array.count]
forwardInvocation:
original implementation
MyCrashyClass
ORIGdoSomethingWrongdoSomethingWrong
_objc_msgForward
Real Life™
forwardInvocation:
original implementation
array[array.count]
MyCrashyClass
ORIGdoSomethingWrongdoSomethingWrong
_objc_msgForward
Real Life™
forwardInvocation:
original implementation
array[array.count]
MyCrashyClass
ORIGdoSomethingWrongdoSomethingWrong
_objc_msgForward
Real Life™
forwardInvocation:
original implementation
array[array.count]
ORIGforwardInvocation:
JSContext *context = …

[context evaluate:hotfixString]
MyCrashyClass
ORIGdoSomethingWrongdoSomethingWrong
_objc_msgForward
Real Life™
array[array.count]
ORIGforwardInvocation:forwardInvocation:
JSContext *context = …

[context evaluate:hotfixString]
original implementation
DEMO
SPHotPatch
• Share it with friends to show off…
• …until someone tells me about JSPatch
• Open Source
• Better JS syntax (pre-processing)
• Extensions to use C stuff (CoreGraphics…)
JSPatch
JSPatch in Plex
• Remote configuration file declares available patches.
• Patches belong to a:
• App version.
• App build.
• Patch channel (default: production).
JSPatch in Plex
• Multiple “channels” allow:
• Testing hotfixes before “releasing” them.
• Create custom patches for users if needed.
JSPatch in Plex
JSPatch in Plex
• More features:
• Safe patching: if the app crashes before the
patch can be downloaded and applied, next time
the whole patching process will be synchronous.
• Skip patching in the next run.
• Clear last patch.
Things you can do
Hotfixing
of course
Gather data
• For bugs hard/impossible to reproduce.
• Create specific patch channel for affected users.
• Deploy patches for those users.
• Ask them for feedback in the forums.
Gather data
• Example 1:
• Video stalls and stuttering.
• Patches to log more info.
• Patches to change different settings of the video
player.
Gather data
• Example 2:
• Weird AutoLayout crash on old devices.
• Crash stacktrace impossible to read: all Apple
code.
• Patches to change different bits of broken layout.
Rewrite the whole app in JS
Rewrite the whole app in JS
Things you CAN’T fix
Things you CAN’T fix
seriously…
• Virtually nothing?
• You REALLY can write your whole app with JSPatch!
• Create extensions for C stuff you need.
• Apply patches as soon as you can.
• At Plex, we leave out +load methods.
What about Swift?
• Depends on Objective-C runtime so…
• Only works with NSObject.
• No structs or primitive types.
• No classes not inheriting from NSObject.
What about Apple?
3.3.2 Except as set forth in the next paragraph, an Application may not
download or install executable code. Interpreted code may only be
used in an Application if all scripts, code and interpreters are packaged
in the Application and not downloaded. The only exceptions to the
foregoing are scripts and code downloaded and run by Apple's
built-in WebKit framework or JavascriptCore, provided that
such scripts and code do not change the primary purpose of
the Application by providing features or functionality that are
inconsistent with the intended and advertised purpose of the
Application as submitted to the App Store
What about Apple?
• Just Javascript code that runs in JavascriptCore.
• Small fixes, not changing the whole app.
Security
• Avoid downloading patches from unknown
sources.
• Don’t run JS scripts without a valid signature.
• Only allow to sign patches to a handful of people.
Good practices
• Don’t abuse JS patching. It’s just your safe net.
• Establish a proper workflow to catch bugs before
the release.
• Test, test, test.Automate as much as you can.
Good practices
• QA should find nothing. If they do, it should be a big
thing.
• If all the above fails and the bug has a huge impact,
hotfix it.
• JS hotfixes should be reviewed and tested too.
• Immediately after, submit another build. Never rely on
those hotfixes.
Questions?
Thank you!

More Related Content

What's hot

JavaFX - Sketch Board to Production
JavaFX - Sketch Board to ProductionJavaFX - Sketch Board to Production
JavaFX - Sketch Board to Production
Yoav Aharoni
 
Angular Unit Testing from the Trenches
Angular Unit Testing from the TrenchesAngular Unit Testing from the Trenches
Angular Unit Testing from the Trenches
Justin James
 
Angular Unit Testing
Angular Unit TestingAngular Unit Testing
Angular Unit Testing
Alessandro Giorgetti
 
Beyond Unit Testing
Beyond Unit TestingBeyond Unit Testing
Beyond Unit Testing
Steve Loughran
 
Angular Unit Testing NDC Minn 2018
Angular Unit Testing NDC Minn 2018Angular Unit Testing NDC Minn 2018
Angular Unit Testing NDC Minn 2018
Justin James
 
QA Fest 2018. Adam Stasiak. React Native is Coming – the story of hybrid mobi...
QA Fest 2018. Adam Stasiak. React Native is Coming – the story of hybrid mobi...QA Fest 2018. Adam Stasiak. React Native is Coming – the story of hybrid mobi...
QA Fest 2018. Adam Stasiak. React Native is Coming – the story of hybrid mobi...
QAFest
 
Extending burp with python
Extending burp with pythonExtending burp with python
Extending burp with python
Hoang Nguyen
 
Effective testing with pytest
Effective testing with pytestEffective testing with pytest
Effective testing with pytest
Hector Canto
 
Testing React Applications
Testing React ApplicationsTesting React Applications
Testing React Applications
stbaechler
 
Don't Be Mocked by your Mocks - Best Practices using Mocks
Don't Be Mocked by your Mocks - Best Practices using MocksDon't Be Mocked by your Mocks - Best Practices using Mocks
Don't Be Mocked by your Mocks - Best Practices using Mocks
Victor Rentea
 
[Mac] automation testing technical sharing - 2013 dec
[Mac] automation testing  technical sharing - 2013 dec[Mac] automation testing  technical sharing - 2013 dec
[Mac] automation testing technical sharing - 2013 dec
Chloe Chen
 
Client side unit tests - using jasmine & karma
Client side unit tests - using jasmine & karmaClient side unit tests - using jasmine & karma
Client side unit tests - using jasmine & karma
Adam Klein
 
Google mock for dummies
Google mock for dummiesGoogle mock for dummies
Google mock for dummies
Harry Potter
 
Polyglot automation - QA Fest - 2015
Polyglot automation - QA Fest - 2015Polyglot automation - QA Fest - 2015
Polyglot automation - QA Fest - 2015
Iakiv Kramarenko
 
Unit Test Your Database
Unit Test Your DatabaseUnit Test Your Database
Unit Test Your Database
David Wheeler
 
Invoke dynamite in Java EE with invoke dynamic
Invoke dynamite in Java EE with invoke dynamicInvoke dynamite in Java EE with invoke dynamic
Invoke dynamite in Java EE with invoke dynamic
Antoine Sabot-Durand
 
Writing usableap isinpractice
Writing usableap isinpracticeWriting usableap isinpractice
Writing usableap isinpractice
Giovanni Asproni
 
Anatomy of a Gem: Bane
Anatomy of a Gem: BaneAnatomy of a Gem: Bane
Anatomy of a Gem: Bane
Daniel Wellman
 

What's hot (18)

JavaFX - Sketch Board to Production
JavaFX - Sketch Board to ProductionJavaFX - Sketch Board to Production
JavaFX - Sketch Board to Production
 
Angular Unit Testing from the Trenches
Angular Unit Testing from the TrenchesAngular Unit Testing from the Trenches
Angular Unit Testing from the Trenches
 
Angular Unit Testing
Angular Unit TestingAngular Unit Testing
Angular Unit Testing
 
Beyond Unit Testing
Beyond Unit TestingBeyond Unit Testing
Beyond Unit Testing
 
Angular Unit Testing NDC Minn 2018
Angular Unit Testing NDC Minn 2018Angular Unit Testing NDC Minn 2018
Angular Unit Testing NDC Minn 2018
 
QA Fest 2018. Adam Stasiak. React Native is Coming – the story of hybrid mobi...
QA Fest 2018. Adam Stasiak. React Native is Coming – the story of hybrid mobi...QA Fest 2018. Adam Stasiak. React Native is Coming – the story of hybrid mobi...
QA Fest 2018. Adam Stasiak. React Native is Coming – the story of hybrid mobi...
 
Extending burp with python
Extending burp with pythonExtending burp with python
Extending burp with python
 
Effective testing with pytest
Effective testing with pytestEffective testing with pytest
Effective testing with pytest
 
Testing React Applications
Testing React ApplicationsTesting React Applications
Testing React Applications
 
Don't Be Mocked by your Mocks - Best Practices using Mocks
Don't Be Mocked by your Mocks - Best Practices using MocksDon't Be Mocked by your Mocks - Best Practices using Mocks
Don't Be Mocked by your Mocks - Best Practices using Mocks
 
[Mac] automation testing technical sharing - 2013 dec
[Mac] automation testing  technical sharing - 2013 dec[Mac] automation testing  technical sharing - 2013 dec
[Mac] automation testing technical sharing - 2013 dec
 
Client side unit tests - using jasmine & karma
Client side unit tests - using jasmine & karmaClient side unit tests - using jasmine & karma
Client side unit tests - using jasmine & karma
 
Google mock for dummies
Google mock for dummiesGoogle mock for dummies
Google mock for dummies
 
Polyglot automation - QA Fest - 2015
Polyglot automation - QA Fest - 2015Polyglot automation - QA Fest - 2015
Polyglot automation - QA Fest - 2015
 
Unit Test Your Database
Unit Test Your DatabaseUnit Test Your Database
Unit Test Your Database
 
Invoke dynamite in Java EE with invoke dynamic
Invoke dynamite in Java EE with invoke dynamicInvoke dynamite in Java EE with invoke dynamic
Invoke dynamite in Java EE with invoke dynamic
 
Writing usableap isinpractice
Writing usableap isinpracticeWriting usableap isinpractice
Writing usableap isinpractice
 
Anatomy of a Gem: Bane
Anatomy of a Gem: BaneAnatomy of a Gem: Bane
Anatomy of a Gem: Bane
 

Similar to Hotfixing iOS apps with Javascript

Jest: Frontend Testing richtig gemacht @WebworkerNRW
Jest: Frontend Testing richtig gemacht @WebworkerNRWJest: Frontend Testing richtig gemacht @WebworkerNRW
Jest: Frontend Testing richtig gemacht @WebworkerNRW
Holger Grosse-Plankermann
 
Javascript Everywhere
Javascript EverywhereJavascript Everywhere
Javascript Everywhere
Pascal Rettig
 
How I learned to stop worrying and love embedding JavaScript
How I learned to stop worrying and love embedding JavaScriptHow I learned to stop worrying and love embedding JavaScript
How I learned to stop worrying and love embedding JavaScript
Kevin Read
 
Embedding V8 in Android apps with Ejecta-V8
Embedding V8 in Android apps with Ejecta-V8Embedding V8 in Android apps with Ejecta-V8
Embedding V8 in Android apps with Ejecta-V8
Kevin Read
 
Testing Ext JS and Sencha Touch
Testing Ext JS and Sencha TouchTesting Ext JS and Sencha Touch
Testing Ext JS and Sencha Touch
Mats Bryntse
 
Google mock for dummies
Google mock for dummiesGoogle mock for dummies
Google mock for dummies
Tony Nguyen
 
Google mock for dummies
Google mock for dummiesGoogle mock for dummies
Google mock for dummies
Luis Goldster
 
Google mock for dummies
Google mock for dummiesGoogle mock for dummies
Google mock for dummies
James Wong
 
Google mock for dummies
Google mock for dummiesGoogle mock for dummies
Google mock for dummies
Fraboni Ec
 
Google mock for dummies
Google mock for dummiesGoogle mock for dummies
Google mock for dummies
Hoang Nguyen
 
Google mock for dummies
Google mock for dummiesGoogle mock for dummies
Google mock for dummies
Young Alista
 
The Many Ways to Test Your React App
The Many Ways to Test Your React AppThe Many Ways to Test Your React App
The Many Ways to Test Your React App
All Things Open
 
The Cowardly Test-o-Phobe's Guide To Testing
The Cowardly Test-o-Phobe's Guide To TestingThe Cowardly Test-o-Phobe's Guide To Testing
The Cowardly Test-o-Phobe's Guide To Testing
Tim Duckett
 
Appsec usa2013 js_libinsecurity_stefanodipaola
Appsec usa2013 js_libinsecurity_stefanodipaolaAppsec usa2013 js_libinsecurity_stefanodipaola
Appsec usa2013 js_libinsecurity_stefanodipaola
drewz lin
 
TDD super mondays-june-2014
TDD super mondays-june-2014TDD super mondays-june-2014
TDD super mondays-june-2014
Alex Kavanagh
 
Java Performance Tuning
Java Performance TuningJava Performance Tuning
Java Performance Tuning
Atthakorn Chanthong
 
New Ideas for Old Code - Greach
New Ideas for Old Code - GreachNew Ideas for Old Code - Greach
New Ideas for Old Code - Greach
HamletDRC
 
iOS,From Development to Distribution
iOS,From Development to DistributioniOS,From Development to Distribution
iOS,From Development to Distribution
Tunvir Rahman Tusher
 
Building Hermetic Systems (without Docker)
Building Hermetic Systems (without Docker)Building Hermetic Systems (without Docker)
Building Hermetic Systems (without Docker)
William Farrell
 
Android programming-basics
Android programming-basicsAndroid programming-basics
Android programming-basics
Aravindharamanan S
 

Similar to Hotfixing iOS apps with Javascript (20)

Jest: Frontend Testing richtig gemacht @WebworkerNRW
Jest: Frontend Testing richtig gemacht @WebworkerNRWJest: Frontend Testing richtig gemacht @WebworkerNRW
Jest: Frontend Testing richtig gemacht @WebworkerNRW
 
Javascript Everywhere
Javascript EverywhereJavascript Everywhere
Javascript Everywhere
 
How I learned to stop worrying and love embedding JavaScript
How I learned to stop worrying and love embedding JavaScriptHow I learned to stop worrying and love embedding JavaScript
How I learned to stop worrying and love embedding JavaScript
 
Embedding V8 in Android apps with Ejecta-V8
Embedding V8 in Android apps with Ejecta-V8Embedding V8 in Android apps with Ejecta-V8
Embedding V8 in Android apps with Ejecta-V8
 
Testing Ext JS and Sencha Touch
Testing Ext JS and Sencha TouchTesting Ext JS and Sencha Touch
Testing Ext JS and Sencha Touch
 
Google mock for dummies
Google mock for dummiesGoogle mock for dummies
Google mock for dummies
 
Google mock for dummies
Google mock for dummiesGoogle mock for dummies
Google mock for dummies
 
Google mock for dummies
Google mock for dummiesGoogle mock for dummies
Google mock for dummies
 
Google mock for dummies
Google mock for dummiesGoogle mock for dummies
Google mock for dummies
 
Google mock for dummies
Google mock for dummiesGoogle mock for dummies
Google mock for dummies
 
Google mock for dummies
Google mock for dummiesGoogle mock for dummies
Google mock for dummies
 
The Many Ways to Test Your React App
The Many Ways to Test Your React AppThe Many Ways to Test Your React App
The Many Ways to Test Your React App
 
The Cowardly Test-o-Phobe's Guide To Testing
The Cowardly Test-o-Phobe's Guide To TestingThe Cowardly Test-o-Phobe's Guide To Testing
The Cowardly Test-o-Phobe's Guide To Testing
 
Appsec usa2013 js_libinsecurity_stefanodipaola
Appsec usa2013 js_libinsecurity_stefanodipaolaAppsec usa2013 js_libinsecurity_stefanodipaola
Appsec usa2013 js_libinsecurity_stefanodipaola
 
TDD super mondays-june-2014
TDD super mondays-june-2014TDD super mondays-june-2014
TDD super mondays-june-2014
 
Java Performance Tuning
Java Performance TuningJava Performance Tuning
Java Performance Tuning
 
New Ideas for Old Code - Greach
New Ideas for Old Code - GreachNew Ideas for Old Code - Greach
New Ideas for Old Code - Greach
 
iOS,From Development to Distribution
iOS,From Development to DistributioniOS,From Development to Distribution
iOS,From Development to Distribution
 
Building Hermetic Systems (without Docker)
Building Hermetic Systems (without Docker)Building Hermetic Systems (without Docker)
Building Hermetic Systems (without Docker)
 
Android programming-basics
Android programming-basicsAndroid programming-basics
Android programming-basics
 

Recently uploaded

Need for Speed: Removing speed bumps from your Symfony projects ⚡️
Need for Speed: Removing speed bumps from your Symfony projects ⚡️Need for Speed: Removing speed bumps from your Symfony projects ⚡️
Need for Speed: Removing speed bumps from your Symfony projects ⚡️
Łukasz Chruściel
 
Microservice Teams - How the cloud changes the way we work
Microservice Teams - How the cloud changes the way we workMicroservice Teams - How the cloud changes the way we work
Microservice Teams - How the cloud changes the way we work
Sven Peters
 
GOING AOT WITH GRAALVM FOR SPRING BOOT (SPRING IO)
GOING AOT WITH GRAALVM FOR  SPRING BOOT (SPRING IO)GOING AOT WITH GRAALVM FOR  SPRING BOOT (SPRING IO)
GOING AOT WITH GRAALVM FOR SPRING BOOT (SPRING IO)
Alina Yurenko
 
Transform Your Communication with Cloud-Based IVR Solutions
Transform Your Communication with Cloud-Based IVR SolutionsTransform Your Communication with Cloud-Based IVR Solutions
Transform Your Communication with Cloud-Based IVR Solutions
TheSMSPoint
 
Introducing Crescat - Event Management Software for Venues, Festivals and Eve...
Introducing Crescat - Event Management Software for Venues, Festivals and Eve...Introducing Crescat - Event Management Software for Venues, Festivals and Eve...
Introducing Crescat - Event Management Software for Venues, Festivals and Eve...
Crescat
 
Enterprise Resource Planning System in Telangana
Enterprise Resource Planning System in TelanganaEnterprise Resource Planning System in Telangana
Enterprise Resource Planning System in Telangana
NYGGS Automation Suite
 
Mobile App Development Company In Noida | Drona Infotech
Mobile App Development Company In Noida | Drona InfotechMobile App Development Company In Noida | Drona Infotech
Mobile App Development Company In Noida | Drona Infotech
Drona Infotech
 
Why Choose Odoo 17 Community & How it differs from Odoo 17 Enterprise Edition
Why Choose Odoo 17 Community & How it differs from Odoo 17 Enterprise EditionWhy Choose Odoo 17 Community & How it differs from Odoo 17 Enterprise Edition
Why Choose Odoo 17 Community & How it differs from Odoo 17 Enterprise Edition
Envertis Software Solutions
 
Hand Rolled Applicative User Validation Code Kata
Hand Rolled Applicative User ValidationCode KataHand Rolled Applicative User ValidationCode Kata
Hand Rolled Applicative User Validation Code Kata
Philip Schwarz
 
E-commerce Development Services- Hornet Dynamics
E-commerce Development Services- Hornet DynamicsE-commerce Development Services- Hornet Dynamics
E-commerce Development Services- Hornet Dynamics
Hornet Dynamics
 
Top Features to Include in Your Winzo Clone App for Business Growth (4).pptx
Top Features to Include in Your Winzo Clone App for Business Growth (4).pptxTop Features to Include in Your Winzo Clone App for Business Growth (4).pptx
Top Features to Include in Your Winzo Clone App for Business Growth (4).pptx
rickgrimesss22
 
OpenMetadata Community Meeting - 5th June 2024
OpenMetadata Community Meeting - 5th June 2024OpenMetadata Community Meeting - 5th June 2024
OpenMetadata Community Meeting - 5th June 2024
OpenMetadata
 
Using Xen Hypervisor for Functional Safety
Using Xen Hypervisor for Functional SafetyUsing Xen Hypervisor for Functional Safety
Using Xen Hypervisor for Functional Safety
Ayan Halder
 
Empowering Growth with Best Software Development Company in Noida - Deuglo
Empowering Growth with Best Software  Development Company in Noida - DeugloEmpowering Growth with Best Software  Development Company in Noida - Deuglo
Empowering Growth with Best Software Development Company in Noida - Deuglo
Deuglo Infosystem Pvt Ltd
 
Fundamentals of Programming and Language Processors
Fundamentals of Programming and Language ProcessorsFundamentals of Programming and Language Processors
Fundamentals of Programming and Language Processors
Rakesh Kumar R
 
Graspan: A Big Data System for Big Code Analysis
Graspan: A Big Data System for Big Code AnalysisGraspan: A Big Data System for Big Code Analysis
Graspan: A Big Data System for Big Code Analysis
Aftab Hussain
 
Artificia Intellicence and XPath Extension Functions
Artificia Intellicence and XPath Extension FunctionsArtificia Intellicence and XPath Extension Functions
Artificia Intellicence and XPath Extension Functions
Octavian Nadolu
 
socradar-q1-2024-aviation-industry-report.pdf
socradar-q1-2024-aviation-industry-report.pdfsocradar-q1-2024-aviation-industry-report.pdf
socradar-q1-2024-aviation-industry-report.pdf
SOCRadar
 
GraphSummit Paris - The art of the possible with Graph Technology
GraphSummit Paris - The art of the possible with Graph TechnologyGraphSummit Paris - The art of the possible with Graph Technology
GraphSummit Paris - The art of the possible with Graph Technology
Neo4j
 
A Study of Variable-Role-based Feature Enrichment in Neural Models of Code
A Study of Variable-Role-based Feature Enrichment in Neural Models of CodeA Study of Variable-Role-based Feature Enrichment in Neural Models of Code
A Study of Variable-Role-based Feature Enrichment in Neural Models of Code
Aftab Hussain
 

Recently uploaded (20)

Need for Speed: Removing speed bumps from your Symfony projects ⚡️
Need for Speed: Removing speed bumps from your Symfony projects ⚡️Need for Speed: Removing speed bumps from your Symfony projects ⚡️
Need for Speed: Removing speed bumps from your Symfony projects ⚡️
 
Microservice Teams - How the cloud changes the way we work
Microservice Teams - How the cloud changes the way we workMicroservice Teams - How the cloud changes the way we work
Microservice Teams - How the cloud changes the way we work
 
GOING AOT WITH GRAALVM FOR SPRING BOOT (SPRING IO)
GOING AOT WITH GRAALVM FOR  SPRING BOOT (SPRING IO)GOING AOT WITH GRAALVM FOR  SPRING BOOT (SPRING IO)
GOING AOT WITH GRAALVM FOR SPRING BOOT (SPRING IO)
 
Transform Your Communication with Cloud-Based IVR Solutions
Transform Your Communication with Cloud-Based IVR SolutionsTransform Your Communication with Cloud-Based IVR Solutions
Transform Your Communication with Cloud-Based IVR Solutions
 
Introducing Crescat - Event Management Software for Venues, Festivals and Eve...
Introducing Crescat - Event Management Software for Venues, Festivals and Eve...Introducing Crescat - Event Management Software for Venues, Festivals and Eve...
Introducing Crescat - Event Management Software for Venues, Festivals and Eve...
 
Enterprise Resource Planning System in Telangana
Enterprise Resource Planning System in TelanganaEnterprise Resource Planning System in Telangana
Enterprise Resource Planning System in Telangana
 
Mobile App Development Company In Noida | Drona Infotech
Mobile App Development Company In Noida | Drona InfotechMobile App Development Company In Noida | Drona Infotech
Mobile App Development Company In Noida | Drona Infotech
 
Why Choose Odoo 17 Community & How it differs from Odoo 17 Enterprise Edition
Why Choose Odoo 17 Community & How it differs from Odoo 17 Enterprise EditionWhy Choose Odoo 17 Community & How it differs from Odoo 17 Enterprise Edition
Why Choose Odoo 17 Community & How it differs from Odoo 17 Enterprise Edition
 
Hand Rolled Applicative User Validation Code Kata
Hand Rolled Applicative User ValidationCode KataHand Rolled Applicative User ValidationCode Kata
Hand Rolled Applicative User Validation Code Kata
 
E-commerce Development Services- Hornet Dynamics
E-commerce Development Services- Hornet DynamicsE-commerce Development Services- Hornet Dynamics
E-commerce Development Services- Hornet Dynamics
 
Top Features to Include in Your Winzo Clone App for Business Growth (4).pptx
Top Features to Include in Your Winzo Clone App for Business Growth (4).pptxTop Features to Include in Your Winzo Clone App for Business Growth (4).pptx
Top Features to Include in Your Winzo Clone App for Business Growth (4).pptx
 
OpenMetadata Community Meeting - 5th June 2024
OpenMetadata Community Meeting - 5th June 2024OpenMetadata Community Meeting - 5th June 2024
OpenMetadata Community Meeting - 5th June 2024
 
Using Xen Hypervisor for Functional Safety
Using Xen Hypervisor for Functional SafetyUsing Xen Hypervisor for Functional Safety
Using Xen Hypervisor for Functional Safety
 
Empowering Growth with Best Software Development Company in Noida - Deuglo
Empowering Growth with Best Software  Development Company in Noida - DeugloEmpowering Growth with Best Software  Development Company in Noida - Deuglo
Empowering Growth with Best Software Development Company in Noida - Deuglo
 
Fundamentals of Programming and Language Processors
Fundamentals of Programming and Language ProcessorsFundamentals of Programming and Language Processors
Fundamentals of Programming and Language Processors
 
Graspan: A Big Data System for Big Code Analysis
Graspan: A Big Data System for Big Code AnalysisGraspan: A Big Data System for Big Code Analysis
Graspan: A Big Data System for Big Code Analysis
 
Artificia Intellicence and XPath Extension Functions
Artificia Intellicence and XPath Extension FunctionsArtificia Intellicence and XPath Extension Functions
Artificia Intellicence and XPath Extension Functions
 
socradar-q1-2024-aviation-industry-report.pdf
socradar-q1-2024-aviation-industry-report.pdfsocradar-q1-2024-aviation-industry-report.pdf
socradar-q1-2024-aviation-industry-report.pdf
 
GraphSummit Paris - The art of the possible with Graph Technology
GraphSummit Paris - The art of the possible with Graph TechnologyGraphSummit Paris - The art of the possible with Graph Technology
GraphSummit Paris - The art of the possible with Graph Technology
 
A Study of Variable-Role-based Feature Enrichment in Neural Models of Code
A Study of Variable-Role-based Feature Enrichment in Neural Models of CodeA Study of Variable-Role-based Feature Enrichment in Neural Models of Code
A Study of Variable-Role-based Feature Enrichment in Neural Models of Code
 

Hotfixing iOS apps with Javascript