SlideShare a Scribd company logo
Rails + iOS with RestKit
@andrewculver
The Evolution of iOS Tools
Before iCloud
After iCloud
Syncing is ... hard?
Keep it simple.
Topics
• Rails API Versioning
• RestKit Installation
• Mapping Configuration
• Pulling and Pushing Data
• Offline Mode and Other Syncing
• Authentication
Goals
• Understand some basics.
• Keep it as simple as possible.
Our Example App
“ClipQueue”
“ClipQueue”
• Helps with workflow automation.
• Detects content in the clipboard.
• Prompts to save it as a “Clip”, categorize it.
• Server processes it.
• Dispatches webhooks, sends emails, etc.
Rails JSON API
Rails JSON API
• Keep your API separate from your core app.
• Doing this efficiently requires thin controllers.
• Creating resources to represent actions that would
otherwise be custom controller actions helps, too.
class Clip < ActiveRecord::Base
attr_accessible :content, :created_at
end
Clip Model
Clipqueue::Application.routes.draw do
namespace :api do
namespace :v1 do
resources :clips
end
end
end
Setting up a Router
class Api::V1::ClipsController < ApplicationController
load_and_authorize_resource :clip
respond_to :json
...
end
API Controller
class Api::V1::ClipsController < ApplicationController
load_and_authorize_resource :clip
respond_to :json
...
def index
respond_with @clips
end
...
end
API Controller Actions
class Api::V1::ClipsController < ApplicationController
load_and_authorize_resource :clip
respond_to :json
...
def show
respond_with @clip
end
...
end
API Controller Actions
class Api::V1::ClipsController < ApplicationController
load_and_authorize_resource :clip
respond_to :json
...
def create
@clip.save
redirect_to [:api, :v1, @clip]
end
...
end
API Controller Actions
class Ability
include CanCan::Ability
// Guest users can do anything.
def initialize(user)
user ||= User.new
can :manage, :all
end
end
Single User System
RestKit Installation
Installation
• Use CocoaPods.
• This tutorial includes great installation steps for
new projects.
• https://github.com/RestKit/RKGist/blob/master/
TUTORIAL.md
Rails API Versioning
Rails JSON API Versioning
• If your API changes, older apps will crash.
• Your ranking in the App Store will crash, too.
• Does anyone have a Gem they use for this?
• Maintaining old versions of your API is easy:
• Make a separate copy for each new version.
$ cp -R v1/ v2/
Setting up a Router
Clipqueue::Application.routes.draw do
namespace :api do
namespace :v1 do
resources :clips
end
namespace :v2 do
resources :clips
resources :categories
end
end
end
Setting up a Router
Pulling Data
RESTKit ‘GET’ Lifecycle
• Issues HTTP GET request for URL.
• Receives XML/JSON response.
• Converts to NSDictionary + NSArray structure.
• Matches response URL to defined entity mapping.
• Maps response data to entity.
RKEntityMapping *clipMapping = [RKEntityMapping
mappingForEntityForName: @"Clip"
inManagedObjectStore: managedObjectStore];
[clipMapping addAttributeMappingsFromDictionary:@{
@"id": @"clipId",
@"content": @"content",
@"created_at": @"createdAt"}];
A Mapping
RKResponseDescriptor *clipsResponseDescriptor =
[RKResponseDescriptor
responseDescriptorWithMapping: clipMapping
pathPattern: @"/api/v1/clips"
keyPath: nil
statusCodes: RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)];
[objectManager addResponseDescriptor:clipsResponseDescriptor];
‘Index’ Response Descriptor
RKResponseDescriptor *clipResponseDescriptor =
[RKResponseDescriptor
responseDescriptorWithMapping: clipMapping
pathPattern: @"/api/v1/clips/:id"
keyPath: nil
statusCodes: RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)];
[objectManager addResponseDescriptor:clipResponseDescriptor];
‘Show’ Response Descriptor
- (void)loadClips
{
[[RKObjectManager sharedManager]
getObjectsAtPath:@"/api/v1/clips"
parameters:nil
success:nil
failure:nil];
}
Fetching Objects
(UITableViewController)
- (void)loadClips
{
[[RKObjectManager sharedManager]
getObjectsAtPath:@"/api/v1/clips"
parameters:nil
success:
^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {}
failure:
^(RKObjectRequestOperation *operation, NSError *error) {}
];
}
Fetching Objects
(UITableViewController)
The View
• How does this information get to the user?
• A NSFetchedResultsController is handling the heavy
lifting.
Pull to Refresh
// In your UITableViewController.
UIRefreshControl *refreshControl = [UIRefreshControl new];
[refreshControl
addTarget:self
action:@selector(loadClips)
forControlEvents:UIControlEventValueChanged];
self.refreshControl = refreshControl;
Adding Pull to Refresh
(UITableViewController)
Pushing Data
RESTKit ‘POST’ Lifecycle
• Issues HTTP POST request to URL.
• Rails creates the object and redirects to it.
• From here it’s the same as before:
• Receives XML/JSON response.
• Converts to NSDictionary + NSArray structure.
• Matches redirected URL to defined entity mapping.
• Maps response data to entity.
Clip *clip = (Clip *)[NSEntityDescription
insertNewObjectForEntityForName:@"Clip"
inManagedObjectContext:self.managedObjectContext];
clip.content = [[UIPasteboard generalPasteboard] string];
Creating a New Clip
[[RKObjectManager sharedManager] postObject:clip
path:@"/api/v1/clips"
parameters:nil
success:nil
failure:nil];
Posting a New Clip
[[RKObjectManager sharedManager] postObject:clip
path:@"/api/v1/clips"
parameters:nil
success:
^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {}
failure:
^(RKObjectRequestOperation *operation, NSError *error) {}
];
Posting a New Clip
RKRequestDescriptor *newClipRequestDescriptor =
[RKRequestDescriptor
requestDescriptorWithMapping:[clipMapping inverseMapping]
objectClass:[Clip class]
rootKeyPath:@"clip"];
[objectManager addRequestDescriptor:newClipRequestDescriptor];
A Request Descriptor
Mass-Assignment
• Rails’ new mass-assignment defaults are good, but
they cause issues for us here.
• RESTKit sends the ‘id’ and ‘created_at’ attributes
across in the request.
• This triggers an exception in development by default,
because of this:
config.active_record.mass_assignment_sanitizer = :strict
Offline Mode
Offline Mode
• The server is the authority, but is not always
available.
• We want to be able to work and save data locally even
in the absence of an Internet connection.
• We don’t want to lose our work.
• When a connection is available, we’d like our local
work to be pushed up to the server.
A VerySimple Example
• In this app, “Clips” are read-only.
• Don’t have to worry about resolving conflicting
changes from two sources.
• How simple a solution can you get away with?
A VerySimple Solution
• Try saving to the server.
• If that doesn’t work, just save it locally.
• It won’t have a “Clip ID”, but that doesn’t matter
for CoreData, even with relationships.
• When a connection becomes available, push it up.
A VerySimple Solution
• Try saving to the server.
• If that doesn’t work, just save it locally.
• It won’t have a “Clip ID”, but that doesn’t matter
for CoreData, even with relationships.
• When a connection becomes available:
• Push it up to the server.
• Claim our shiny new “Clip ID”.
A VerySimple Solution
• The only question is, how will the new ID get mapped
to the locally stored object?
• It can’t be matched by primary key ID, because it
didn’t have one locally.
• We’ll use a globally unique ID.
NSString *dataBaseString = [RKApplicationDataDirectory()
stringByAppendingPathComponent:@"ClipQueue.sqlite"];
NSPersistentStore __unused *persistentStore =
[managedObjectStore
addSQLitePersistentStoreAtPath:dataBaseString
fromSeedDatabaseAtPath:nil
withConfiguration:nil
options:nil
error:nil];
Adding Local Storage
RKEntityMapping *clipMapping = [RKEntityMapping
mappingForEntityForName: @"Clip"
inManagedObjectStore: managedObjectStore];
[clipMapping addAttributeMappingsFromDictionary:@{
@"id": @"clipId",
@"content": @"content",
@"uuid": @"uuid",
@"created_at": @"createdAt",
@"deleted_at": @"deletedAt"}];
clipMapping.identificationAttributes = @[ @"uuid" ];
An Improved Mapping
clip.uuid = [self getUUID];
[[RKObjectManager sharedManager] postObject:clip
path:@"/api/v1/clips" parameters:nil
success: ^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {}
failure: ^(RKObjectRequestOperation *operation, NSError *error) {
NSError *localError = nil;
if (![self.managedObjectContext save:&localError]) {
// Show UIAlertView to user.
[self showErrorAlert:[localError localizedDescription]];
}
}];
Queuing Up Locally
NSFetchRequest *request = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Clip"
inManagedObjectContext:self.managedObjectContext];
[request setEntity:entity];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"clipId == 0"];
[request setPredicate:predicate];
...
for (Clip *clip in mutableFetchResults) {
[[RKObjectManager sharedManager] postObject:clip path:@"/api/v1/clips"
parameters:nil success:nil failure: nil];
}
Syncing Up
class Clip < ActiveRecord::Base
...
before_validation do
self.uuid = UUIDTools::UUID.random_create.to_s if uuid.nil?
end
end
Updating API Logic
Sync Friendly Deletes
Sync Friendly Deletes
• An object exists locally, but not on the server.
• Was it created locally or deleted remotely?
• An object exists remotely, but not locally.
• Was it created remotely or deleted locally?
• Let’s look at a really easy way to deal with this.
class Clip < ActiveRecord::Base
...
scope :not_deleted, where('deleted_at IS NULL')
def destroy
self.update_column(:deleted_at, Time.zone.now)
end
end
Soft Delete
- (NSFetchedResultsController *)fetchedResultsController
{
...
// Filter out deleted results.
NSPredicate *predicate =
[NSPredicate predicateWithFormat:@"deletedAt == nil"];
[fetchRequest setPredicate:predicate];
...
}
Filtering Deleted Items
Added Bonus
• NSFetchedResultsController makes this an other UI
updates really pleasant to the user by default, even
when they’re triggered by results from the server.
Authentication
Authentication Goals
• Require username and password.
• Scope all data by user.
Authentication
• Prompt for credentials.
• Store them in iOS Keychain.
• Delay loading until credentials are provided.
• Configure the credentials for RestKit.
• Implement data scoping on the server based on the
session.
Devise.setup do |config|
...
config.http_authenticatable = true
...
end
HTTP Authentication
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
if ([self shouldDisplayLoginModal]) {
[self performSegueWithIdentifier:@"ShowLogin" sender:self];
}
}
Show Sign-In Modal
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
if (![self shouldDisplayLoginModal]) {
[self loadObjectsFromDataStore];
}
}
Delay Loading
RKObjectManager* objectManager = [RKObjectManager sharedManager];
objectManager.client.username = emailAddressField.text;
objectManager.client.password = passwordField.text;
Configure Credentials
Add User-Clips Relationship
• Add “user_id” attribute to Clip.
• Add “has_one :user” relationship to Clip.
• Add “has_many :clips” relationship to User.
class Ability
include CanCan::Ability
def initialize(user)
user ||= User.new
if user.persisted?
can :manage, :clip, {user_id: user.id}
end
end
end
HTTP Authentication
class Api::V1::ClipsController < ApplicationController
before_filter :authenticate_user!
load_and_authorize_resource :clip, through: current_user
...
end
Scoping Controller Results
What We’ve Covered
• Rails API Versioning
• RestKit Installation
• Mapping Configuration
• Pulling and Pushing Data
• Offline Mode and Other Syncing
• Authentication
Goals
• Understand some basics.
• Keep it as simple as possible.
Additional Resources
Blake Watters’ RESTKit 0.20.0 “Gist” Tutorial
https://github.com/RestKit/RKGist/blob/master/TUTORIAL.md
(A work in progress.)
Thanks! Questions?
@andrewculver
Rails and iOS with RestKit

More Related Content

What's hot

React Native Firebase Realtime Database + Authentication
React Native Firebase Realtime Database + AuthenticationReact Native Firebase Realtime Database + Authentication
React Native Firebase Realtime Database + Authentication
Kobkrit Viriyayudhakorn
 
Containerless in the Cloud with AWS Lambda
Containerless in the Cloud with AWS LambdaContainerless in the Cloud with AWS Lambda
Containerless in the Cloud with AWS Lambda
Ryan Cuprak
 
Combining R With Java For Data Analysis (Devoxx UK 2015 Session)
Combining R With Java For Data Analysis (Devoxx UK 2015 Session)Combining R With Java For Data Analysis (Devoxx UK 2015 Session)
Combining R With Java For Data Analysis (Devoxx UK 2015 Session)
Ryan Cuprak
 
Building APIs in an easy way using API Platform
Building APIs in an easy way using API PlatformBuilding APIs in an easy way using API Platform
Building APIs in an easy way using API Platform
Antonio Peric-Mazar
 
06 integrate elasticsearch
06 integrate elasticsearch06 integrate elasticsearch
06 integrate elasticsearch
Erhwen Kuo
 
Mcknight well built extensions
Mcknight well built extensionsMcknight well built extensions
Mcknight well built extensions
Richard McKnight
 
Deep dive into AWS fargate
Deep dive into AWS fargateDeep dive into AWS fargate
Deep dive into AWS fargate
Amazon Web Services
 
spray: REST on Akka
spray: REST on Akkaspray: REST on Akka
spray: REST on Akka
sirthias
 
Amazon ECS Deep Dive
Amazon ECS Deep DiveAmazon ECS Deep Dive
Amazon ECS Deep Dive
Amazon Web Services
 
04 integrate entityframework
04 integrate entityframework04 integrate entityframework
04 integrate entityframework
Erhwen Kuo
 
[React Native] Lecture 4: Basic Elements and UI Layout by using FlexBox
[React Native] Lecture 4: Basic Elements and UI Layout by using FlexBox[React Native] Lecture 4: Basic Elements and UI Layout by using FlexBox
[React Native] Lecture 4: Basic Elements and UI Layout by using FlexBox
Kobkrit Viriyayudhakorn
 
Docker and java
Docker and javaDocker and java
Docker and java
Anthony Dahanne
 
2011 aug-gdd-mexico-city-high-replication-datastore
2011 aug-gdd-mexico-city-high-replication-datastore2011 aug-gdd-mexico-city-high-replication-datastore
2011 aug-gdd-mexico-city-high-replication-datastore
ikailan
 
05 integrate redis
05 integrate redis05 integrate redis
05 integrate redis
Erhwen Kuo
 
2011 august-gdd-mexico-city-rest-json-oauth
2011 august-gdd-mexico-city-rest-json-oauth2011 august-gdd-mexico-city-rest-json-oauth
2011 august-gdd-mexico-city-rest-json-oauth
ikailan
 
Angular Owin Katana TypeScript
Angular Owin Katana TypeScriptAngular Owin Katana TypeScript
Angular Owin Katana TypeScript
Justin Wendlandt
 
Why we chose mongodb for guardian.co.uk
Why we chose mongodb for guardian.co.ukWhy we chose mongodb for guardian.co.uk
Why we chose mongodb for guardian.co.uk
Graham Tackley
 
What is App Engine? O
What is App Engine? OWhat is App Engine? O
What is App Engine? Oikailan
 
Advanced Container Management and Scheduling
Advanced Container Management and SchedulingAdvanced Container Management and Scheduling
Advanced Container Management and Scheduling
Amazon Web Services
 

What's hot (20)

React Native Firebase Realtime Database + Authentication
React Native Firebase Realtime Database + AuthenticationReact Native Firebase Realtime Database + Authentication
React Native Firebase Realtime Database + Authentication
 
Deep Dive into AWS Fargate
Deep Dive into AWS FargateDeep Dive into AWS Fargate
Deep Dive into AWS Fargate
 
Containerless in the Cloud with AWS Lambda
Containerless in the Cloud with AWS LambdaContainerless in the Cloud with AWS Lambda
Containerless in the Cloud with AWS Lambda
 
Combining R With Java For Data Analysis (Devoxx UK 2015 Session)
Combining R With Java For Data Analysis (Devoxx UK 2015 Session)Combining R With Java For Data Analysis (Devoxx UK 2015 Session)
Combining R With Java For Data Analysis (Devoxx UK 2015 Session)
 
Building APIs in an easy way using API Platform
Building APIs in an easy way using API PlatformBuilding APIs in an easy way using API Platform
Building APIs in an easy way using API Platform
 
06 integrate elasticsearch
06 integrate elasticsearch06 integrate elasticsearch
06 integrate elasticsearch
 
Mcknight well built extensions
Mcknight well built extensionsMcknight well built extensions
Mcknight well built extensions
 
Deep dive into AWS fargate
Deep dive into AWS fargateDeep dive into AWS fargate
Deep dive into AWS fargate
 
spray: REST on Akka
spray: REST on Akkaspray: REST on Akka
spray: REST on Akka
 
Amazon ECS Deep Dive
Amazon ECS Deep DiveAmazon ECS Deep Dive
Amazon ECS Deep Dive
 
04 integrate entityframework
04 integrate entityframework04 integrate entityframework
04 integrate entityframework
 
[React Native] Lecture 4: Basic Elements and UI Layout by using FlexBox
[React Native] Lecture 4: Basic Elements and UI Layout by using FlexBox[React Native] Lecture 4: Basic Elements and UI Layout by using FlexBox
[React Native] Lecture 4: Basic Elements and UI Layout by using FlexBox
 
Docker and java
Docker and javaDocker and java
Docker and java
 
2011 aug-gdd-mexico-city-high-replication-datastore
2011 aug-gdd-mexico-city-high-replication-datastore2011 aug-gdd-mexico-city-high-replication-datastore
2011 aug-gdd-mexico-city-high-replication-datastore
 
05 integrate redis
05 integrate redis05 integrate redis
05 integrate redis
 
2011 august-gdd-mexico-city-rest-json-oauth
2011 august-gdd-mexico-city-rest-json-oauth2011 august-gdd-mexico-city-rest-json-oauth
2011 august-gdd-mexico-city-rest-json-oauth
 
Angular Owin Katana TypeScript
Angular Owin Katana TypeScriptAngular Owin Katana TypeScript
Angular Owin Katana TypeScript
 
Why we chose mongodb for guardian.co.uk
Why we chose mongodb for guardian.co.ukWhy we chose mongodb for guardian.co.uk
Why we chose mongodb for guardian.co.uk
 
What is App Engine? O
What is App Engine? OWhat is App Engine? O
What is App Engine? O
 
Advanced Container Management and Scheduling
Advanced Container Management and SchedulingAdvanced Container Management and Scheduling
Advanced Container Management and Scheduling
 

Similar to Rails and iOS with RestKit

SharePoint Saturday The Conference DC - How the client object model saved the...
SharePoint Saturday The Conference DC - How the client object model saved the...SharePoint Saturday The Conference DC - How the client object model saved the...
SharePoint Saturday The Conference DC - How the client object model saved the...Liam Cleary [MVP]
 
SQL to NoSQL: Top 6 Questions
SQL to NoSQL: Top 6 QuestionsSQL to NoSQL: Top 6 Questions
SQL to NoSQL: Top 6 Questions
Mike Broberg
 
RESTful apps and services with ASP.NET MVC
RESTful apps and services with ASP.NET MVCRESTful apps and services with ASP.NET MVC
RESTful apps and services with ASP.NET MVC
bnoyle
 
Esri Dev Summit 2009 Rest and Mvc Final
Esri Dev Summit 2009 Rest and Mvc FinalEsri Dev Summit 2009 Rest and Mvc Final
Esri Dev Summit 2009 Rest and Mvc Final
guestcd4688
 
AngularJS 1.x - your first application (problems and solutions)
AngularJS 1.x - your first application (problems and solutions)AngularJS 1.x - your first application (problems and solutions)
AngularJS 1.x - your first application (problems and solutions)
Igor Talevski
 
e-KTP Information Extraction with Google Cloud Function & Google Cloud Vision
e-KTP Information Extraction with Google Cloud Function & Google Cloud Visione-KTP Information Extraction with Google Cloud Function & Google Cloud Vision
e-KTP Information Extraction with Google Cloud Function & Google Cloud Vision
Imre Nagi
 
Medium TechTalk — iOS
Medium TechTalk — iOSMedium TechTalk — iOS
Medium TechTalk — iOS
jimmyatmedium
 
Rails in the Cloud
Rails in the CloudRails in the Cloud
Rails in the Cloud
iwarshak
 
Data-Analytics using python (Module 4).pptx
Data-Analytics using python (Module 4).pptxData-Analytics using python (Module 4).pptx
Data-Analytics using python (Module 4).pptx
DRSHk10
 
Станислав Сидоренко «DeviceHive Java Server – миграция на Spring Boot»
Станислав Сидоренко «DeviceHive Java Server – миграция на Spring Boot»Станислав Сидоренко «DeviceHive Java Server – миграция на Spring Boot»
Станислав Сидоренко «DeviceHive Java Server – миграция на Spring Boot»DataArt
 
Crafting Evolvable Api Responses
Crafting Evolvable Api ResponsesCrafting Evolvable Api Responses
Crafting Evolvable Api Responses
darrelmiller71
 
Icinga 2009 at OSMC
Icinga 2009 at OSMCIcinga 2009 at OSMC
Icinga 2009 at OSMC
Icinga
 
AngularJSTO presentation
AngularJSTO presentationAngularJSTO presentation
AngularJSTO presentationAlan Hietala
 
ASP .Net Core SPA Templates
ASP .Net Core SPA TemplatesASP .Net Core SPA Templates
ASP .Net Core SPA Templates
Eamonn Boyle
 
Elements for an iOS Backend
Elements for an iOS BackendElements for an iOS Backend
Elements for an iOS Backend
Laurent Cerveau
 
Tutorial, Part 2: SharePoint 101: Jump-Starting the Developer by Rob Windsor ...
Tutorial, Part 2: SharePoint 101: Jump-Starting the Developer by Rob Windsor ...Tutorial, Part 2: SharePoint 101: Jump-Starting the Developer by Rob Windsor ...
Tutorial, Part 2: SharePoint 101: Jump-Starting the Developer by Rob Windsor ...
SPTechCon
 
CocoaHeads PDX 2014 01 23 : CoreData and iCloud Improvements iOS7 / OSX Maver...
CocoaHeads PDX 2014 01 23 : CoreData and iCloud Improvements iOS7 / OSX Maver...CocoaHeads PDX 2014 01 23 : CoreData and iCloud Improvements iOS7 / OSX Maver...
CocoaHeads PDX 2014 01 23 : CoreData and iCloud Improvements iOS7 / OSX Maver...
smn-automate
 
NoSQL and MySQL: News about JSON
NoSQL and MySQL: News about JSONNoSQL and MySQL: News about JSON
NoSQL and MySQL: News about JSON
Mario Beck
 

Similar to Rails and iOS with RestKit (20)

SharePoint Saturday The Conference DC - How the client object model saved the...
SharePoint Saturday The Conference DC - How the client object model saved the...SharePoint Saturday The Conference DC - How the client object model saved the...
SharePoint Saturday The Conference DC - How the client object model saved the...
 
SQL to NoSQL: Top 6 Questions
SQL to NoSQL: Top 6 QuestionsSQL to NoSQL: Top 6 Questions
SQL to NoSQL: Top 6 Questions
 
RESTful apps and services with ASP.NET MVC
RESTful apps and services with ASP.NET MVCRESTful apps and services with ASP.NET MVC
RESTful apps and services with ASP.NET MVC
 
Esri Dev Summit 2009 Rest and Mvc Final
Esri Dev Summit 2009 Rest and Mvc FinalEsri Dev Summit 2009 Rest and Mvc Final
Esri Dev Summit 2009 Rest and Mvc Final
 
AngularJS 1.x - your first application (problems and solutions)
AngularJS 1.x - your first application (problems and solutions)AngularJS 1.x - your first application (problems and solutions)
AngularJS 1.x - your first application (problems and solutions)
 
e-KTP Information Extraction with Google Cloud Function & Google Cloud Vision
e-KTP Information Extraction with Google Cloud Function & Google Cloud Visione-KTP Information Extraction with Google Cloud Function & Google Cloud Vision
e-KTP Information Extraction with Google Cloud Function & Google Cloud Vision
 
Medium TechTalk — iOS
Medium TechTalk — iOSMedium TechTalk — iOS
Medium TechTalk — iOS
 
Rails in the Cloud
Rails in the CloudRails in the Cloud
Rails in the Cloud
 
Data-Analytics using python (Module 4).pptx
Data-Analytics using python (Module 4).pptxData-Analytics using python (Module 4).pptx
Data-Analytics using python (Module 4).pptx
 
Станислав Сидоренко «DeviceHive Java Server – миграция на Spring Boot»
Станислав Сидоренко «DeviceHive Java Server – миграция на Spring Boot»Станислав Сидоренко «DeviceHive Java Server – миграция на Spring Boot»
Станислав Сидоренко «DeviceHive Java Server – миграция на Spring Boot»
 
Crafting Evolvable Api Responses
Crafting Evolvable Api ResponsesCrafting Evolvable Api Responses
Crafting Evolvable Api Responses
 
Icinga 2009 at OSMC
Icinga 2009 at OSMCIcinga 2009 at OSMC
Icinga 2009 at OSMC
 
Real World MVC
Real World MVCReal World MVC
Real World MVC
 
Wider than rails
Wider than railsWider than rails
Wider than rails
 
AngularJSTO presentation
AngularJSTO presentationAngularJSTO presentation
AngularJSTO presentation
 
ASP .Net Core SPA Templates
ASP .Net Core SPA TemplatesASP .Net Core SPA Templates
ASP .Net Core SPA Templates
 
Elements for an iOS Backend
Elements for an iOS BackendElements for an iOS Backend
Elements for an iOS Backend
 
Tutorial, Part 2: SharePoint 101: Jump-Starting the Developer by Rob Windsor ...
Tutorial, Part 2: SharePoint 101: Jump-Starting the Developer by Rob Windsor ...Tutorial, Part 2: SharePoint 101: Jump-Starting the Developer by Rob Windsor ...
Tutorial, Part 2: SharePoint 101: Jump-Starting the Developer by Rob Windsor ...
 
CocoaHeads PDX 2014 01 23 : CoreData and iCloud Improvements iOS7 / OSX Maver...
CocoaHeads PDX 2014 01 23 : CoreData and iCloud Improvements iOS7 / OSX Maver...CocoaHeads PDX 2014 01 23 : CoreData and iCloud Improvements iOS7 / OSX Maver...
CocoaHeads PDX 2014 01 23 : CoreData and iCloud Improvements iOS7 / OSX Maver...
 
NoSQL and MySQL: News about JSON
NoSQL and MySQL: News about JSONNoSQL and MySQL: News about JSON
NoSQL and MySQL: News about JSON
 

Recently uploaded

De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...
De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...
De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...
Product School
 
Welocme to ViralQR, your best QR code generator.
Welocme to ViralQR, your best QR code generator.Welocme to ViralQR, your best QR code generator.
Welocme to ViralQR, your best QR code generator.
ViralQR
 
When stars align: studies in data quality, knowledge graphs, and machine lear...
When stars align: studies in data quality, knowledge graphs, and machine lear...When stars align: studies in data quality, knowledge graphs, and machine lear...
When stars align: studies in data quality, knowledge graphs, and machine lear...
Elena Simperl
 
FIDO Alliance Osaka Seminar: Passkeys at Amazon.pdf
FIDO Alliance Osaka Seminar: Passkeys at Amazon.pdfFIDO Alliance Osaka Seminar: Passkeys at Amazon.pdf
FIDO Alliance Osaka Seminar: Passkeys at Amazon.pdf
FIDO Alliance
 
Observability Concepts EVERY Developer Should Know -- DeveloperWeek Europe.pdf
Observability Concepts EVERY Developer Should Know -- DeveloperWeek Europe.pdfObservability Concepts EVERY Developer Should Know -- DeveloperWeek Europe.pdf
Observability Concepts EVERY Developer Should Know -- DeveloperWeek Europe.pdf
Paige Cruz
 
By Design, not by Accident - Agile Venture Bolzano 2024
By Design, not by Accident - Agile Venture Bolzano 2024By Design, not by Accident - Agile Venture Bolzano 2024
By Design, not by Accident - Agile Venture Bolzano 2024
Pierluigi Pugliese
 
Dev Dives: Train smarter, not harder – active learning and UiPath LLMs for do...
Dev Dives: Train smarter, not harder – active learning and UiPath LLMs for do...Dev Dives: Train smarter, not harder – active learning and UiPath LLMs for do...
Dev Dives: Train smarter, not harder – active learning and UiPath LLMs for do...
UiPathCommunity
 
UiPath Test Automation using UiPath Test Suite series, part 4
UiPath Test Automation using UiPath Test Suite series, part 4UiPath Test Automation using UiPath Test Suite series, part 4
UiPath Test Automation using UiPath Test Suite series, part 4
DianaGray10
 
GenAISummit 2024 May 28 Sri Ambati Keynote: AGI Belongs to The Community in O...
GenAISummit 2024 May 28 Sri Ambati Keynote: AGI Belongs to The Community in O...GenAISummit 2024 May 28 Sri Ambati Keynote: AGI Belongs to The Community in O...
GenAISummit 2024 May 28 Sri Ambati Keynote: AGI Belongs to The Community in O...
Sri Ambati
 
Monitoring Java Application Security with JDK Tools and JFR Events
Monitoring Java Application Security with JDK Tools and JFR EventsMonitoring Java Application Security with JDK Tools and JFR Events
Monitoring Java Application Security with JDK Tools and JFR Events
Ana-Maria Mihalceanu
 
Le nuove frontiere dell'AI nell'RPA con UiPath Autopilot™
Le nuove frontiere dell'AI nell'RPA con UiPath Autopilot™Le nuove frontiere dell'AI nell'RPA con UiPath Autopilot™
Le nuove frontiere dell'AI nell'RPA con UiPath Autopilot™
UiPathCommunity
 
Empowering NextGen Mobility via Large Action Model Infrastructure (LAMI): pav...
Empowering NextGen Mobility via Large Action Model Infrastructure (LAMI): pav...Empowering NextGen Mobility via Large Action Model Infrastructure (LAMI): pav...
Empowering NextGen Mobility via Large Action Model Infrastructure (LAMI): pav...
Thierry Lestable
 
PHP Frameworks: I want to break free (IPC Berlin 2024)
PHP Frameworks: I want to break free (IPC Berlin 2024)PHP Frameworks: I want to break free (IPC Berlin 2024)
PHP Frameworks: I want to break free (IPC Berlin 2024)
Ralf Eggert
 
SAP Sapphire 2024 - ASUG301 building better apps with SAP Fiori.pdf
SAP Sapphire 2024 - ASUG301 building better apps with SAP Fiori.pdfSAP Sapphire 2024 - ASUG301 building better apps with SAP Fiori.pdf
SAP Sapphire 2024 - ASUG301 building better apps with SAP Fiori.pdf
Peter Spielvogel
 
A tale of scale & speed: How the US Navy is enabling software delivery from l...
A tale of scale & speed: How the US Navy is enabling software delivery from l...A tale of scale & speed: How the US Navy is enabling software delivery from l...
A tale of scale & speed: How the US Navy is enabling software delivery from l...
sonjaschweigert1
 
LF Energy Webinar: Electrical Grid Modelling and Simulation Through PowSyBl -...
LF Energy Webinar: Electrical Grid Modelling and Simulation Through PowSyBl -...LF Energy Webinar: Electrical Grid Modelling and Simulation Through PowSyBl -...
LF Energy Webinar: Electrical Grid Modelling and Simulation Through PowSyBl -...
DanBrown980551
 
Transcript: Selling digital books in 2024: Insights from industry leaders - T...
Transcript: Selling digital books in 2024: Insights from industry leaders - T...Transcript: Selling digital books in 2024: Insights from industry leaders - T...
Transcript: Selling digital books in 2024: Insights from industry leaders - T...
BookNet Canada
 
Securing your Kubernetes cluster_ a step-by-step guide to success !
Securing your Kubernetes cluster_ a step-by-step guide to success !Securing your Kubernetes cluster_ a step-by-step guide to success !
Securing your Kubernetes cluster_ a step-by-step guide to success !
KatiaHIMEUR1
 
State of ICS and IoT Cyber Threat Landscape Report 2024 preview
State of ICS and IoT Cyber Threat Landscape Report 2024 previewState of ICS and IoT Cyber Threat Landscape Report 2024 preview
State of ICS and IoT Cyber Threat Landscape Report 2024 preview
Prayukth K V
 
Epistemic Interaction - tuning interfaces to provide information for AI support
Epistemic Interaction - tuning interfaces to provide information for AI supportEpistemic Interaction - tuning interfaces to provide information for AI support
Epistemic Interaction - tuning interfaces to provide information for AI support
Alan Dix
 

Recently uploaded (20)

De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...
De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...
De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...
 
Welocme to ViralQR, your best QR code generator.
Welocme to ViralQR, your best QR code generator.Welocme to ViralQR, your best QR code generator.
Welocme to ViralQR, your best QR code generator.
 
When stars align: studies in data quality, knowledge graphs, and machine lear...
When stars align: studies in data quality, knowledge graphs, and machine lear...When stars align: studies in data quality, knowledge graphs, and machine lear...
When stars align: studies in data quality, knowledge graphs, and machine lear...
 
FIDO Alliance Osaka Seminar: Passkeys at Amazon.pdf
FIDO Alliance Osaka Seminar: Passkeys at Amazon.pdfFIDO Alliance Osaka Seminar: Passkeys at Amazon.pdf
FIDO Alliance Osaka Seminar: Passkeys at Amazon.pdf
 
Observability Concepts EVERY Developer Should Know -- DeveloperWeek Europe.pdf
Observability Concepts EVERY Developer Should Know -- DeveloperWeek Europe.pdfObservability Concepts EVERY Developer Should Know -- DeveloperWeek Europe.pdf
Observability Concepts EVERY Developer Should Know -- DeveloperWeek Europe.pdf
 
By Design, not by Accident - Agile Venture Bolzano 2024
By Design, not by Accident - Agile Venture Bolzano 2024By Design, not by Accident - Agile Venture Bolzano 2024
By Design, not by Accident - Agile Venture Bolzano 2024
 
Dev Dives: Train smarter, not harder – active learning and UiPath LLMs for do...
Dev Dives: Train smarter, not harder – active learning and UiPath LLMs for do...Dev Dives: Train smarter, not harder – active learning and UiPath LLMs for do...
Dev Dives: Train smarter, not harder – active learning and UiPath LLMs for do...
 
UiPath Test Automation using UiPath Test Suite series, part 4
UiPath Test Automation using UiPath Test Suite series, part 4UiPath Test Automation using UiPath Test Suite series, part 4
UiPath Test Automation using UiPath Test Suite series, part 4
 
GenAISummit 2024 May 28 Sri Ambati Keynote: AGI Belongs to The Community in O...
GenAISummit 2024 May 28 Sri Ambati Keynote: AGI Belongs to The Community in O...GenAISummit 2024 May 28 Sri Ambati Keynote: AGI Belongs to The Community in O...
GenAISummit 2024 May 28 Sri Ambati Keynote: AGI Belongs to The Community in O...
 
Monitoring Java Application Security with JDK Tools and JFR Events
Monitoring Java Application Security with JDK Tools and JFR EventsMonitoring Java Application Security with JDK Tools and JFR Events
Monitoring Java Application Security with JDK Tools and JFR Events
 
Le nuove frontiere dell'AI nell'RPA con UiPath Autopilot™
Le nuove frontiere dell'AI nell'RPA con UiPath Autopilot™Le nuove frontiere dell'AI nell'RPA con UiPath Autopilot™
Le nuove frontiere dell'AI nell'RPA con UiPath Autopilot™
 
Empowering NextGen Mobility via Large Action Model Infrastructure (LAMI): pav...
Empowering NextGen Mobility via Large Action Model Infrastructure (LAMI): pav...Empowering NextGen Mobility via Large Action Model Infrastructure (LAMI): pav...
Empowering NextGen Mobility via Large Action Model Infrastructure (LAMI): pav...
 
PHP Frameworks: I want to break free (IPC Berlin 2024)
PHP Frameworks: I want to break free (IPC Berlin 2024)PHP Frameworks: I want to break free (IPC Berlin 2024)
PHP Frameworks: I want to break free (IPC Berlin 2024)
 
SAP Sapphire 2024 - ASUG301 building better apps with SAP Fiori.pdf
SAP Sapphire 2024 - ASUG301 building better apps with SAP Fiori.pdfSAP Sapphire 2024 - ASUG301 building better apps with SAP Fiori.pdf
SAP Sapphire 2024 - ASUG301 building better apps with SAP Fiori.pdf
 
A tale of scale & speed: How the US Navy is enabling software delivery from l...
A tale of scale & speed: How the US Navy is enabling software delivery from l...A tale of scale & speed: How the US Navy is enabling software delivery from l...
A tale of scale & speed: How the US Navy is enabling software delivery from l...
 
LF Energy Webinar: Electrical Grid Modelling and Simulation Through PowSyBl -...
LF Energy Webinar: Electrical Grid Modelling and Simulation Through PowSyBl -...LF Energy Webinar: Electrical Grid Modelling and Simulation Through PowSyBl -...
LF Energy Webinar: Electrical Grid Modelling and Simulation Through PowSyBl -...
 
Transcript: Selling digital books in 2024: Insights from industry leaders - T...
Transcript: Selling digital books in 2024: Insights from industry leaders - T...Transcript: Selling digital books in 2024: Insights from industry leaders - T...
Transcript: Selling digital books in 2024: Insights from industry leaders - T...
 
Securing your Kubernetes cluster_ a step-by-step guide to success !
Securing your Kubernetes cluster_ a step-by-step guide to success !Securing your Kubernetes cluster_ a step-by-step guide to success !
Securing your Kubernetes cluster_ a step-by-step guide to success !
 
State of ICS and IoT Cyber Threat Landscape Report 2024 preview
State of ICS and IoT Cyber Threat Landscape Report 2024 previewState of ICS and IoT Cyber Threat Landscape Report 2024 preview
State of ICS and IoT Cyber Threat Landscape Report 2024 preview
 
Epistemic Interaction - tuning interfaces to provide information for AI support
Epistemic Interaction - tuning interfaces to provide information for AI supportEpistemic Interaction - tuning interfaces to provide information for AI support
Epistemic Interaction - tuning interfaces to provide information for AI support
 

Rails and iOS with RestKit