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
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
250
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
340
Other Decks in Programming
See All in Programming
Java × distroless で 軽量なコンテナイメージを / Java on Distroless
contour_gara
0
550
Inside Stream API
skrb
1
720
スマートグラスで並列バイブコーディング
hyshu
0
150
dRuby over BLE
makicamel
2
340
Lessons from Spec-Driven Development
simas
PRO
0
200
気圧・高度・GPSを記録&可視化するアプリ「Koudo」を作った話
hjmkth
1
270
キャリア迷子上等 ─ "ない道"は自分で作ればいい
16bitidol
3
2.1k
DynamoDBには集計系のクエリがないけどなんとかしたい
musan
1
140
Datadog × OpenTelemetry 入門と実践のあいだ
kn_to_maxpno
1
160
不変条件と整合性境界—ビジネスが決める設計判断と実現パターン / Invariants and Consistency Boundaries
nrslib
13
5.2k
技術記事、AIに書かせるか、自分で書くか? 〜それでも私が自分の手で書く理由〜 / #QiitaConference
jnchito
2
1.4k
過去最大のMCPアップデート! 2026-07-28 RC版の謎に迫る
licux
6
340
Featured
See All Featured
Odyssey Design
rkendrick25
PRO
2
700
Principles of Awesome APIs and How to Build Them.
keavy
128
18k
Introduction to Domain-Driven Design and Collaborative software design
baasie
1
840
The Curious Case for Waylosing
cassininazir
1
390
Everyday Curiosity
cassininazir
0
230
SEOcharity - Dark patterns in SEO and UX: How to avoid them and build a more ethical web
sarafernandez
0
200
Beyond borders and beyond the search box: How to win the global "messy middle" with AI-driven SEO
davidcarrasco
3
160
Are puppies a ranking factor?
jonoalderson
1
3.6k
Building Better People: How to give real-time feedback that sticks.
wjessup
370
20k
Building the Perfect Custom Keyboard
takai
2
800
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
254
22k
We Have a Design System, Now What?
morganepeng
55
8.2k
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