Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
BubbleWrap
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
Marin Usalj
March 29, 2013
Programming
360
3
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
BubbleWrap
Slides for my talk at #inspect 2013 - the first RubyMotion conference in Bruselles.
Marin Usalj
March 29, 2013
More Decks by Marin Usalj
See All by Marin Usalj
Code signing on iOS/OSX
supermarin
2
500
Launch Arguments - the mysteries
supermarin
1
260
Swift for CLI tools
supermarin
16
25k
CocoaPods intro
supermarin
2
260
Private pods - best practices
supermarin
1
190
CLI apps. For fun and profit
supermarin
4
16k
Alcatraz internals
supermarin
2
350
ObjectiveSugar & ObjectiveRecord
supermarin
5
590
Alcatraz - Xcode package manager
supermarin
3
350
Other Decks in Programming
See All in Programming
Vite+ Unified Toolchain for the Web
naokihaba
0
720
技術記事、 専門家としてのプログラマ、 言語化
mizchi
14
7.3k
音楽のための関数型プログラミング言語mimiumにおける多段階計算の活用
tomoyanonymous
1
290
Performance Engineering for Everyone
elenatanasoiu
0
260
過去最大のMCPアップデート! 2026-07-28 RC版の謎に迫る
licux
6
460
TypeScript+Orvalで実現する型安全かつ堅牢でスケーラブルなマルチチャネル通知基盤 / TSKaigi Night talks ~after conference~
d0riven
0
390
なぜ型を書くのか? TSKaigi2026で改めて考える #tskaigi_smarthr
kajitack
0
270
これからAgentCoreを触る方へトレンドはGatewayです
har1101
6
480
Contextとはなにか
chiroruxx
1
390
Claude Opus 4.6以後の受託開発エンジニアの変化(Claude Code開発ノウハウ大公開スペシャルbyクラスメソッド)
iidatakuma
1
390
エンジニア向け会社紹介/Findy Company Profile
findyinc
6
360k
地域 SRE コミュニティ最前線 - ホンマでっかSRE勉強会
tk3fftk
0
200
Featured
See All Featured
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
46
2.9k
How to Align SEO within the Product Triangle To Get Buy-In & Support - #RIMC
aleyda
2
1.6k
Being A Developer After 40
akosma
91
590k
How to Get Subject Matter Experts Bought In and Actively Contributing to SEO & PR Initiatives.
livdayseo
0
150
Getting science done with accelerated Python computing platforms
jacobtomlinson
2
260
How People are Using Generative and Agentic AI to Supercharge Their Products, Projects, Services and Value Streams Today
helenjbeal
1
230
The Impact of AI in SEO - AI Overviews June 2024 Edition
aleyda
5
1.1k
Reality Check: Gamification 10 Years Later
codingconduct
0
2.2k
Skip the Path - Find Your Career Trail
mkilby
1
160
sira's awesome portfolio website redesign presentation
elsirapls
0
300
The AI Revolution Will Not Be Monopolized: How open-source beats economies of scale, even for LLMs
inesmontani
PRO
3
3.6k
A Modern Web Designer's Workflow
chriscoyier
698
190k
Transcript
BubbleWrap Marin Usalj @mneorr Tuesday, April 2, 13
iOS consultant Ruby <3 Tuesday, April 2, 13
ObjectiveRecord ObjectiveSugar Kiwi Bubblewrap Tuesday, April 2, 13
[@3 times:^{ NSLog(@"Hello!"); }]; // Hello! // Hello! // Hello!
NSDate *future = @(24).days.fromNow; // 2012-12-25 20:49:05 +0000 NSDate *past = @(1).month.ago; // 2012-11-01 20:50:28 +00:00 NSString *sentence = NSStringWithFormat(@"This is a text-with- argument %@", @1234); [sentence split:@"-"] // array = this is a text, with, argument 1234 ObjectiveSugar github.com/mneorr/ObjectiveSugar Tuesday, April 2, 13
[cars each:^(id object) { NSLog(@"Car: %@", object); }]; // Car:
Testarossa // Car: F50 // Car: F458 Italia [cars map:^id(id car){ return @([[car substringToIndex:1] isEqualToString:@"F"]); }]; // NO (Testarossa) // YES (F50) // YES (F458 Italia) ObjectiveSugar github.com/mneorr/ObjectiveSugar Tuesday, April 2, 13
// creating [Person create:@{ @"name" : @"John", @"age" : @12
}]; Person *john = [Person create]; john.name = @"John"; // save/delete [john save]; [john delete]; // querying Person *johnDoe = [Person where:@"name == 'John' AND surname = 'Doe'"].first; NSArray *people = [Person where:@{ @"age" : @18 }]; ObjectiveRecord github.com/mneorr/ObjectiveRecord Tuesday, April 2, 13
“ActiveSupport for RubyMotion” Tuesday, April 2, 13
Tuesday, April 2, 13
Motivation Tuesday, April 2, 13
AFJSONRequestOperation.JSONOperationWithReuqest( NSURLRequest.requestWithURL( NSURL.URLWithString(‘http://mneorr.com’)), success: ? failure: ? ).start Tuesday, April
2, 13
AFJSONRequestOperation.JSONOperationWithReuqest( NSURLRequest.requestWithURL( NSURL.URLWithString(‘http://mneorr.com’)), success:^{ # handle good response } failure:^{
# handle bad response }).start Tuesday, April 2, 13
Tuesday, April 2, 13
AFJSONRequestOperation.JSONOperationWithReuqest( NSURLRequest.requestWithURL( NSURL.URLWithString(‘http://mneorr.com’)), success: lambda{|response| # handle good response }
failure: lambda{|response, error| # handle bad response }).start Tuesday, April 2, 13
Tuesday, April 2, 13
AFJSONRequestOperation.JSONOperationWithReuqest( NSURLRequest.requestWithURL( NSURL.URLWithString(‘http://mneorr.com’)), success: lambda{ |request, response, json| # handle
good response } failure: lambda{ |request, response, error, json| # handle bad response }).start Tuesday, April 2, 13
BW::HTTP Tuesday, April 2, 13
HTTP.get(‘http://mneorr.com’) do |response| if response.ok? # handle good response else
# handle failure end end Tuesday, April 2, 13
params = { foo: ‘bar’, baz: [:bang, :zsh] } HTTP.post(‘http://mneorr.com’,
payload: params) do |response| if response.ok? # handle good response else # handle failure end end Tuesday, April 2, 13
BW::Core Tuesday, April 2, 13
> Device.iphone? # true > Device.ipad? # false > Device.front_camera?
# true > Device.orientation # :portrait > Device.simulator? # true > Device.ios_version # "6.0" Tuesday, April 2, 13
JSON.parse("{\"foo\":1,\"bar\": [1,2,3],\"baz\":\"awesome\"}") => { foo: 1, bar: [1,2,3], baz: “awesome”
} JSON.generate({ foo: 1, bar: [1,2,3], baz: “awesome” }) => "{\"foo\":1,\"bar\":[1,2,3],\"baz\": \"awesome\"}" Tuesday, April 2, 13
BW.create_uuid => "68ED21DB-82E5-4A56-ABEB-73650C0DB701" '#FF8A19'.to_color => #<UIDeviceRGBColor:0x8d54110> App.open_url("http://mneorr.com") # Opens the
url using the device's browser. (accepts a string url or an instance of Tuesday, April 2, 13
Persistence Tuesday, April 2, 13
[Client]: hey, how hard is it to store some user
data? We may need to keep track of Foo and Bar! Tuesday, April 2, 13
Tuesday, April 2, 13
NSUserDefaults.standardUserDefaults .setValue(“Inspect”, forKey:”conference”) conf = NSUserDefaults.standardUserDefaults .valueForKey(“conference”) Tuesday, April 2,
13
Y U NO SAVE? Tuesday, April 2, 13
You didn’t #synchronize. Tuesday, April 2, 13
NSUserDefaults.standardUserDefaults .setValue(“Inspect”, forKey:”conference”) NSUserDefaults.standardUserDefaults .synchronize Tuesday, April 2, 13
include App Persistence[‘conference’] = “Inspect” conf = Persistence[‘conference’] Tuesday, April
2, 13
BW::Location Tuesday, April 2, 13
BW::Location.get do |result| result[:to].longitude result[:from].longitude end BW::Location.get_significant BW::Location.get_once Tuesday, April
2, 13
BW::UI Tuesday, April 2, 13
Tuesday, April 2, 13
view.when_swiped view.when_pressed view.when_panned view.when_pinched view.when_rotated view.when_tapped Tuesday, April 2, 13
@recognizer = view.when_swiped Tuesday, April 2, 13
BW::Media Tuesday, April 2, 13
@playa = BW::Media::Player.new @playa.play_modal(@local_file) Tuesday, April 2, 13
BW::Reactor (EventMachine) Tuesday, April 2, 13
“There is a ton of great stuff in BubbleWrap.” “If
you’re doing any RubyMotion work, I think you should definitely checkout BubbleWrap!” - the changelog Tuesday, April 2, 13
“To make our networking code painless, we’ll use BubbleWrap” -
smashingmagazine.com “Lots of good stuff in BubbleWrap” - Darrin Holst Tuesday, April 2, 13
“If there’s any one thing you can do after starting
a RubyMotion project, it’s immediately drop BubbleWrap into your repo.” - Nick, 37 Signals Tuesday, April 2, 13
github.com/rubymotion/bubblewrap bubblewrap.io Tuesday, April 2, 13
Questions Tuesday, April 2, 13
Thanks HipByte! Tuesday, April 2, 13