Todd werth

Motion Meetup - Todd Werth - RMQ



17:08 <span class="sender" _type="normal" oncontextmenu="onnick()" identified="false" colornumber="14" first="true">jamonholmgren: Here's what everyone should do:
17:09 Markvilla: colinta: \o_ Hello!
17:10 boberetezeke has left IRC (Ping timeout: 260 seconds)
17:11 markrickert: We're all fighting for that top spot where people confuse "our gem name" with RubyMotion just like people confuse "Rails" and "Ruby" :P
17:11 jamonholmgren: I think there's a lot of value in the fact that there isn't a Rails right now.
17:11 markrickert: lol @jamon
17:12 colinta: ug yeah i hope we don't get a rails... i like being able to pick a few gems off the shelf
17:12 jamonholmgren: I see the RubyMotion ecosystem more like the client-side JS ecosystem than Ruby's.
17:12 markrickert: Question: can you give me an example of why Xcode is ridiculous? :P
17:13 lrz: markrickert: i can give you 1000 reasons :) (re-facebook-paper-app)
17:13 <span class="sender" _type="normal" oncontextmenu="onnick()" identified="false" colornumber="10" first="true">markrickert: OOH! Good tip about contacts in the sim!
17:13 jamonholmgren: What was the tip? I missed it.
17:14 markrickert: you can set up icloud in the simulator and it'll import all your contacts.
17:14 jamonholmgren: oh cool
17:15 markrickert: i just secured the domain ""
17:15 mattsgarrison: peter cooper, if they dont read my chat notes
17:15 markrickert: @lrz, please don't sue me and seize my new domain.
17:16 lrz: lol
<div _type="privmsg" highlight="false" alternate="even" nick="lrz" class="line text" id="line66">17:16 lrz: can we get
17:16 <span class="sender" _type="normal" oncontextmenu="onnick()" identified="false" colornumber="10" first="true">markrickert: oooohhhh
17:16 relix has left IRC (Quit: My MacBook Pro has gone to sleep. ZZZzzz…)
17:17 mattsgarrison: ?
17:17 jamonholmgren: lol
17:17 jamonholmgren:
17:18 jamonholmgren: ooh i like that
17:19 markrickert: i did that today... laid out two views ontop of each other with padding
17:19 markrickert: had to manually figure out the frames
17:20 jamonholmgren: colinta: Does Teacup do something similar to that, where you can say "10pts below X element" ?
17:20 markrickert: Question: what are your favorite non-infinitered gems?
17:20 colinta: @jamonholmgren constraints: [ constrain(:top).equals(:other_element).plus(10) ]
17:21 colinta: @jamonholmgren constraints: [ constrain(:top).equals(:other_element, :bottom).plus(10) ]
17:21 lrz: Question: where should rubymotion be at the end of this year?
17:21 <span class="sender" _type="normal" oncontextmenu="onnick()" identified="false" colornumber="14" first="true">jamonholmgren: What's :otherelement referring to?
<div _type="privmsg" highlight="false" alternate="odd" nick="lrz" class="line text" id="line81">17:21 lrz: (maybe i will regret having asked that question)
17:21 <span class="sender" _type="normal" oncontextmenu="onnick()" identified="false" colornumber="1" first="true">colinta: but the "previous element" pseudo-selector doesn't exist
17:21 colinta: :otherelement would have to be a unique stylename
17:21 <span class="sender" _type="normal" oncontextmenu="onnick()" identified="false" colornumber="14" first="true">jamonholmgren: lrz: AndroidMotion
17:22 jamonholmgren: colinta: Got it. Not bad at all.
17:22 jamonholmgren: I need to spend a couple days just learning Teacup. I've only scratched the surface.
17:22 Markvilla: lrz: I want to run Rubymotion in my Nest.
<div _type="privmsg" highlight="false" alternate="even" nick="lrz" class="line text" id="line88">17:23 lrz: i'm sure i could make a pun here but it's damn too late
17:23 <span class="sender" _type="normal" oncontextmenu="onnick()" identified="false" colornumber="10" first="true">markrickert: @lrz_ I'd like to see that referral program that @twerth and I were talking to you a few months pack :P
17:23 lrz: markrickert: we will get to that :)
17:24 <span class="sender" _type="normal" oncontextmenu="onnick()" identified="false" colornumber="12" first="true">Markvilla: @lrz_ it'd surely heat up license sales
17:24 Markvilla: :-)
17:25 markrickert: Protip: you can open the Temple.ipa and see the different stylesheets that are unlocked with in app purchases :P
17:25 jamonholmgren: I recommend markrickert
17:25 jamonholmgren: for marketin
17:26 markrickert: @jamonholmgren <3
17:26 markrickert: however, you can't actually USE the templates, jsut look at the assets. It's cool to look at how the templates for the app is put together
17:29 Markvilla: BTW if anyone is using MotionDataWrapper I've been extending it a lot in my fork
17:29 Markvilla: In case anyone wants to take a look:
17:29 Markvilla: Hopefully I will align with macfanatic to merge it :)
17:30 venkat has left IRC (Read error: Connection reset by peer)
17:30 markrickert: @jamonholmgren wrote a great tutorial on moving from BubbleWrap:HTTP -> AFMotion
17:30 venkat has joined (
17:30 markrickert: Flurry is a great anayltics service
17:30 markrickert: I've used them for years
17:31 colinta: yeah BW::HTTP needs to go away... the BW guys are wondering how to get people off of it
17:31 thinkclay has joined (
17:31 markrickert: @colinta stop making it so damn easy to use :P
17:31 mattsgarrison: hello thinkclay
17:31 thinkclay: hey matt
17:31 markrickert: Also, if they remove it from their documentation, people twill likely stop using it
17:31 mattsgarrison: more chatting goes on here than twitter during the meetup :)
17:31 jamonholmgren: Just send them this:
17:31 colinta: well that's true :-)
17:32 thinkclay: Well i figured twitter would be some free marketing :P
17:32 jamonholmgren: It doesn't cover everything that BW/AFM does, but by the end of it I think everyone will be confident enough to do the rest.
17:34 jamonholmgren: ProMotion's styling is really just an easy way to apply a hash of properties to an arbitrary object and some suggestions on how to organize your styles. A few helpers but not much.
17:34 jamonholmgren: I definitely don't recommend using it for heavily customized UIs.
17:34 colinta: thanks Todd!
17:35 jballanc: thanks Todd! for RMQ too!
17:35 jamonholmgren: Thanks, Todd, very cool.
17:35 colinta: and in fairness, Teacup needs some love.  I'd like to write an app from scratch, and take a stab at making it leaner and meaner.
17:35 lrz: colinta: i tried it once but it's not my cup of tea
17:35 <span class="sender" _type="normal" oncontextmenu="onnick()" identified="false" colornumber="1" first="true">colinta: heyooo
17:35 markrickert: gotta head home from work. have a great night everyone, and thanks for staying up REALLY late, @lrz!
17:36 <span class="sender" _type="normal" oncontextmenu="onnick()" identified="false" colornumber="14" first="true">jamonholmgren: cya mark!
17:36 lrz: see you mark!
17:36 <span class="sender" _type="myself" oncontextmenu="onnick()" identified="true" first="true">mattsgarrison: bye
17:36 markrickert has left IRC (Quit: Textual IRC Client:
17:36 colinta: matt, when do you arrive in denver?
17:36 Markvilla: colinta: did that 2x in the past few weeks. You'll hear from me soon :P
17:36 colinta: sweet!
17:37 colinta: the overall design of teacup hasn't fundamentally changed since it was started... by conrad and i, neither of whom were "real" ios developers at the time
17:37 colinta: so... yeah...
17:37 bryancp has left IRC (Remote host closed the connection)
17:37 colinta: but i think we should embrace auto-layout, for all its quirkiness
17:38 jamonholmgren: One thing that I wonder about rmq
17:38 jballanc: heh...if markrickert thinks this is "really late" for lrz, I wonder if he really knows lrz at all! :P
17:39 Markvilla: colinta I started using Autolayout, but really percentage attributes do the trick for me all the time
17:39 jamonholmgren: Most of the time when I build views I can hang onto references pretty easily and manipulate them later via ivars. I rarely need to traverse to find things.
17:39 Markvilla: although I only do iPhone, iPad probably benefits more from AL
17:39 jamonholmgren: Unlike the DOM in websites which is built from separate markup.
17:39 colinta: Markvilla: yeah and autolayout is hard to animate :-/
17:40 colinta: but that's the kinda stuff I want to make easier, too
17:40 jamonholmgren: Is Todd in here?
17:40 mattsgarrison: no
17:41 mattsgarrison: we're still actually talking to him on video
17:41 mattsgarrison: :)
17:41 jamonholmgren: OK, cool. Maybe ask him a question for me?
17:41 mattsgarrison: want me to send him this way?
17:41 mattsgarrison: sure
17:42 apeiros has left IRC (Remote host closed the connection)
17:42 jamonholmgren: I'm just wondering what instances he's found where using rmq to find and manipulate a UI element is easier/more convenient than just hanging onto a reference to the view when you create it with an ivar.
17:42 apeiros has joined (
17:45 mattsgarrison: he said he'll hop over in a minute
17:45 jamonholmgren: great
17:52 ToddWerth has joined (
17:52 ToddWerth: Hi all
17:53 colinta: there's the man of the hour! :-)  great talk, Todd!
17:53 mattsgarrison: hi again
17:53 ToddWerth: Thank you very much
17:53 ToddWerth: Hey Matt, sorry, had to install an IRC client :-) Took me a while to get over here
17:54 ToddWerth: Anyone have a questions for me, something I mentioned in the meetup, etc?
17:57 colinta: Well, for one, Teacup is very likely to get a "fresh face" in the next month or so; anything you think it should address?
17:57 jamonholmgren: Hey Todd
17:57 jamonholmgren: I did have a question
17:57 ToddWerth: Hey Jamon
17:57 jamonholmgren: I'm just wondering what instances you've found where using rmq to find and manipulate a UI element is easier/more convenient than just hanging onto a reference to the view (with an ivar).
17:58 ToddWerth: For teacup, my main complaints are: it's hard to know when things are going to happen sometimes. The exception problem I mentioned
17:59 ToddWerth: Good question Jamon, so selecting and traversing aren't used as much as they are in jQuery because of the way the DOM works. So they aren't used that often. However, when you need them, they rock
17:59 ToddWerth: I actually created traversing last in RMQ
17:59 ToddWerth: selecting was great for tests and in the console
17:59 jamonholmgren: I was thinking tests would be great with rmq
18:00 ToddWerth: yeah, that's a good place for selecting and traversing
18:00 ToddWerth: Mind you RMQ is also events, animations, styles
18:00 ToddWerth: events were the first thing I created
18:01 jamonholmgren: Secondly, and don't take this as a criticism, but it seems like RMQ has a lot of stuff lumped into one gem where separate gems would be nice. (This from the author of ProMotion which has a lot of things lumped in...)
18:01 jamonholmgren: Any plans to split into different modules BubbleWrap-style?
18:01 ToddWerth: Yeah, that's a good criticism
18:01 ToddWerth: It really has everything that a "front-end" RM developer would want, other than specialized stuff
18:02 ToddWerth: I actually am going to create a plugin system, for example, I want integration between rmq and cdq
18:02 ToddWerth: but that would make a good plugin
18:02 ToddWerth: The only thing I'd separate is the stylesheets
18:02 ToddWerth: Maybe the tempting system
18:03 ToddWerth: But the stylesheets are so light weight, I'm not sure what it would gain
18:03 jamonholmgren: I think ProMotion, rmq, and cdq is actually a pretty good mix. PM handles manipulating UIViewControllers but doesn't do a lot for actual views and nothing with data.
18:03 ToddWerth: It's designed to not load anything you don't use
18:03 ToddWerth: It's pretty stateless
18:03 ToddWerth: yeah, I think those 3 would make a good package
18:03 ToddWerth: For example, when you traverse something it does it live
18:04 ToddWerth: until you do that the first time, nothing happens
18:04 ToddWerth: so just adding RMQ to your project won't slow it down or anything
18:04 jamonholmgren: I do want to spend a bunch of time learning Teacup, because every time I ask @colinta how to do something complex there's an easy way in Teacup.
18:04 ToddWerth: yeah, Teacup has it all for sure
18:04 jamonholmgren: Probalby the same for rmq's styling
18:04 Markvilla: I'm currently using ProMotion, MotionDataWrapper and Tecup in an app, and it works nicely :)
18:04 ToddWerth: I assumed that a lot more people would use RMQ than would use RMQ's stylesheets
18:05 jamonholmgren: Nice, @Markvilla
18:05 jamonholmgren: Another question, Todd: Can I steal your generator code for PM? ;)
18:05 ToddWerth: @Markvilla, check out CDQ for Core Data, you'll like it:
18:05 ToddWerth: yeah, Ken stole it for CDQ :-)
18:05 Markvilla: And as previously said, RMQ for getting some views in tests
18:06 ToddWerth: So yes, normally you want to hold on to references, this isn't a web app
18:06 ToddWerth: however, you can select an actually view
18:06 ToddWerth: foo = rmq.append(UIView)
18:06 ToddWerth: later you can rmq(foo).dostuff
18:07 willraxfreenode has joined (~willraxf@<span class="address" oncontextmenu="onaddr()">
18:07 ToddWerth: But imagine you have a bund of controls on a screen
18:07 ToddWerth: And imagine you want to group them, not visually, but logically
18:07 ToddWerth: You'd have to create an array and keep their references
18:07 ToddWerth: Or you could tag them, or use their style name, or use an attribute value to select them
18:08 ToddWerth: rmq(:selected).hide
18:08 jamonholmgren: Good point
18:08 ToddWerth: this is when selectors are nice
18:08 jamonholmgren: Didn't think of handling multiple at once.
18:08 ToddWerth: you know you can do this too:
18:08 jamonholmgren: I can see how that would be really handy.
18:08 ToddWerth: rmq(text: 'foo').animations.throb
18:09 jamonholmgren: nice
18:09 Markvilla: pretty cool
18:09 ToddWerth: text being a method of the view
18:09 ToddWerth: if it happens to have it
18:09 Markvilla: although I'm a bit concerned with performance :(
18:09 ToddWerth: so, some things are very fast
18:09 ToddWerth: traversing can be very fast
18:09 willrax has left IRC (Ping timeout: 245 seconds)
18:10 colinta: it doesn't traverse the whole window, right?  I seem to remember that 'rmq' starts at the controller view property...
18:10 ToddWerth: obviously rmq(text: 'foo') will take the speed it would normally take to go through all the views, check it has that method, and comparing the values. No way around that
18:10 ToddWerth: It traverses the controller
18:10 ToddWerth: Every controller has it's own rmq view tree
18:10 ToddWerth: like a DOM
18:10 ToddWerth: rmq.viewcontroller
18:11 <span class="sender" _type="normal" oncontextmenu="onnick()" identified="false" colornumber="14" first="false">ToddWerth: rmq.rootview
18:11 <span class="sender" _type="normal" oncontextmenu="onnick()" identified="false" colornumber="14" first="false">ToddWerth: rmq.find(UIButton)
18:11 ToddWerth: apply apply to the view controller you're in
18:11 ToddWerth: of course you can use another controller's rmq
18:11 ToddWerth: anothercontroller.rmq.find(UIImage, UIButton, :foo)
18:11 <span class="sender" _type="normal" oncontextmenu="onnick()" identified="false" colornumber="14" first="true">jamonholmgren: Does rmq use weak references in the view tree to avoid causing memory leaks?
18:12 ToddWerth: yes
18:12 ToddWerth: I'm happy to say I found about 3 bugs in WeakRef
18:12 ToddWerth: :-)
18:12 jamonholmgren: :)
18:12 jamonholmgren: I want a .weak method
18:12 jamonholmgren: so
18:12 ToddWerth: yes, god yes
18:12 jamonholmgren: v =
18:12 ToddWerth: or .weak?
18:12 jamonholmgren: yeah for sure
18:13 ToddWerth: here is another example of traversing
18:13 ToddWerth: You're in a cell
18:13 ToddWerth: tap a button
18:13 tapH20guru has joined (
18:14 ToddWerth: actually let me show you something, that's better
18:14 jamonholmgren: sure
18:14 bryancp has joined (~bryancp@
18:15 <span class="sender" _type="normal" oncontextmenu="onnick()" identified="false" colornumber="14" first="false">ToddWerth: look at imagepopup
18:15 <span class="sender" _type="normal" oncontextmenu="onnick()" identified="false" colornumber="14" first="false">ToddWerth: this is when you tap an image in the app, and it shows the image zoomed, with a dim overlay
18:15 ToddWerth: tap the image or the overlay, close the "popup"
18:16 ToddWerth: that one method is feature complete
18:16 ToddWerth: this has selecting and traversing
18:17 jamonholmgren: what does .wrap do?
18:17 ToddWerth: rmq(self).siblings.andself.move(left: 10).distribute(:vertical)
18:17 <span class="sender" _type="normal" oncontextmenu="onnick()" identified="false" colornumber="14" first="false">ToddWerth: traversing
18:18 jamonholmgren: like $("#parent").find(...)
18:18 jamonholmgren: ?
18:18 ToddWerth: that would be rmq(self).parent.find(...)
18:18 ToddWerth: well, in jQuery, it would be $(this).parent.find(...)
18:19 ToddWerth: o.append(UIView, :overlay).animations.fadein.on(:tap) do |sender|
18:19 <span class="sender" _type="normal" oncontextmenu="onnick()" identified="false" colornumber="14" first="false">ToddWerth:        o.find(sender, :overlaynote, :overlayphoto).hide.remove
18:19 jamonholmgren: I'm not understanding .wrap then?
18:19 ToddWerth:      end
18:19 ToddWerth: so I want to add the window
18:19 ToddWerth: which is not in the DOM,  or UIView tree of this controller
18:20 ToddWerth: but I want to use rmq with it, so I .wrap it
18:20 ToddWerth: special case
18:20 jamonholmgren: Oh, got it.
18:20 ToddWerth: the main point is a functional style
18:20 ToddWerth: o.append(UIView, :overlay).animations.fadein.on(:tap) do
18:21 <span class="sender" _type="normal" oncontextmenu="onnick()" identified="false" colornumber="14" first="false">ToddWerth: append a new view to whatever "o" is, style it wit the :overlay style, then fade it in, then on tap do this block
18:21 colinta has left IRC (Quit: Leaving.)
18:21 ToddWerth: is a functional style "right", no, it's a style I enjoy though
18:22 ToddWerth: ya know
18:22 jamonholmgren: "if you enjoy it, it's right" -- every Ruby dev ever
18:22 ToddWerth: heh
18:22 ToddWerth: so true
18:22 jamonholmgren: That's why I built PM
18:23 ToddWerth: PM looks cool, I haven't tried it yet
18:23 jamonholmgren: did not enjoy pushViewController:animated:
18:23 ToddWerth: I should, understand what you're doing to inform what I'm doing
18:23 jamonholmgren: do enjoy open MyScreen
18:23 jamonholmgren: Yeah, I'd be happy to intro you
18:23 ToddWerth: yeah, I need to add loading controllers to MRQ
18:23 jamonholmgren: It's not as heavy as it looks
18:23 ToddWerth: RMQ
18:24 ToddWerth: yeah, sometime I'll check it out and ask you questions
18:24 jamonholmgren: Feel free to add me on chat: is my GChat handle
18:25 jamonholmgren: I'm sure I'll be hitting you with RMQ questions from time to time
18:25 ToddWerth: done
18:26 ToddWerth: so I want to change this self.navigationController.pushViewController(controller, animated: true)
18:26 ToddWerth: to rmq.opencontroller(controller)
18:26 <span class="sender" _type="normal" oncontextmenu="onnick()" identified="false" colornumber="14" first="false">ToddWerth: and have it work, if you're in a nav controller, it pushes, if not, it opens model
18:26 ToddWerth: with you able to change that behaviour
18:26 ToddWerth: UIColor.redColorForTheUI arg!
18:27 willraxfreenode: So many interesting gems to check out so little time
18:27 willraxfreenode is now known as willrax
18:27 willrax: need to lock myself in a cabin for a week
18:27 ToddWerth: Indeed
18:27 ToddWerth: Yeah
18:28 jamonholmgren: That's essentially what PM's open does, although it opens at root if not in a nav. You use openmodal for modals.
18:28 <span class="sender" _type="normal" oncontextmenu="onnick()" identified="false" colornumber="14" first="true">ToddWerth: ic
18:29 jamonholmgren: Then it aliases a lot of methods, e.g., on_appear rather than viewDidAppear:
18:29 ToddWerth: yeah, it's cool
18:29 ToddWerth: I see RMQ as base front-end library
18:30 ToddWerth: something like PM as higher-level component system
18:30 ToddWerth: like Table Screen
18:30 ToddWerth: I do have generators, but that's it, but it just is boilerplate, doesn't do anything special
18:31 jamonholmgren: Yeah, I'd like some generators for sure.
18:31 jamonholmgren: We have a lot of PM2.0 talk going on right now.
18:31 jamonholmgren: I don't think the API will change all that much, but just taking a look at where we can refactor and slim down the code base.
18:31 ToddWerth: yeah, I'd love to sit down for 2 weeks and add everythying
18:32 ToddWerth: Sadly I get less time to work on RMQ than I'd like
18:32 ToddWerth: ic
18:32 ToddWerth: PM seems popular
18:34 ToddWerth: Anyone wants to chat, hit me up at @twerth
18:34 ToddWerth: I'll hang out here for a while
18:39 bryancp has left IRC (Remote host closed the connection)
18:42 srji__ has joined (
18:42 jamonholmgren has left IRC (Quit: jamonholmgren)
18:45 thinkclay has left IRC (Quit: Leaving.)
18:45 justinxreese has left IRC (Ping timeout: 246 seconds)
18:45 srji has left IRC (Ping timeout: 252 seconds)
18:49 tapH20guru has left IRC (Remote host closed the connection)
18:49 thinkclay has joined (
18:52 colinta has joined (
18:56 Markvilla has left IRC (Quit: ["Textual IRC Client:"])
18:57 colinta has left IRC (Ping timeout: 252 seconds)
18:57 bryancp has joined (~bryancp@
19:03 bryancp has left IRC (Remote host closed the connection)
19:06 lrz_ has left IRC (Remote host closed the connection)
19:07 jamonholmgren has joined (~jh@
19:08 jamonholmgren has left IRC (Client Quit)
19:19 ToddWerth has left IRC (Quit: ToddWerth)
19:25 watson1978 has left IRC ()
19:33 jipiboily has joined (
19:43 bzalasky has left IRC (Remote host closed the connection)
19:53 colinta has joined (

Published on February 6th, 2014