028 iPhreaks Show – New iOS APIs
Panel Andrew Madsen (twitter github blog) Jaim Zuber (twitter Sharp Five Software) Pete Hodgson (twitter github blog) Ben Scheirman (twitter github blog NSSreencast) Charles Max Wood (twitter github Teach Me To Code Rails Ramp Up) Discus...
JAIM: We’ve lost Pete! Where is Pete? Come back![Intro Music] CHUCK: Hey everybody and welcome to Episode 28 of the iPhreaks Show! This week on our panel, we have Andrew Madsen. ANDREW: Hi from Salt Lake City! CHUCK: Jaim Zuber. JAIM: I got a feeling that this would be the best show ever, guys. I’m ready. CHUCK: Pete Hodgson. PETE: [Laughs] No pressure. CHUCK: Ben Scheirman. BEN: BRB coalesce in timers. [Chuckles] CHUCK: I’m Charles Max Wood from DevChat.tv. This week, we’re going to be talking about some of the “New APIs out there in Mac OS and iOS”. How much of you guys had a chance to really play with some of the new stuff in some of the new operating systems? BEN: We got access to it June, and some things changed a little bit. In June, there is almost no documentation. You basically had to go off of what the header said or what you saw in the WWDC presentations. A lot of that stuff I just got the ideas from the videos and I just kept watching the videos, but I didn’t really dig in deep until maybe August or something, when it was drawing a little bit closer. But since then, I just been running through a lot of the networking stuff, a lot of multitasking stuff. PETE: Presumably, the networking stuff is important for you in your day job. BEN: Yeah. Pretty much every app that we do, it has to deal with networking in some form of fashion, considering that NSURLConnection which is like the central class in iOS 6 to do networking (it’s what AFNetworking is based on) is now deprecated. This is a class that was first designed in around the year 2000. It was made public in 2003 so this class is more than 10 year old. So it started to make sense that it’s not really suitable for today’s applications. One of the problems with them, its URLConnection is, if you were to bring in like a third-party framework that had its own like cookie storage policy or its own custom protocol or something, that configuration is global to the application so if you wanted to disable cache for instance for a third-party framework, you would like interfere with the application settings. Now we have NSURLSession, which is based on NSURL Configuration, and it’s in isolated container so you can have multiple configurations, multiple sessions, typically that one session per API, per endpoint probably. So like my own endpoint, I’m probably have a way to manage a session for that, and it would have things like – the session configuration you can set like default headers that can go along with every request. So if you wanted to pass along like the hardware version of the device that the request is coming from as a header, you could do that there. PETE: Does that mean each one has its own kind of cookie jar and things like that? BEN: Yup, exactly. And easy methods you can use on NSURLSession Configuration to create a sensible configuration. The default give to you pretty much what you have today with NSURLConnection like caches enable that’s got some pretty conservative cache settings for memory capacity and disc capacity. But you can further customize it. If you say NSURLSession Configuration default configuration, you can further customize it because that returns to you a copy. And there’s also another build in one called “Ephemeral Configuration” which is the equivalent in private browsing. Those two pretty much handy for most cases, and if you need to customize it for the weekend… PETE: Does this mean that for someone making a new application, starting a green field application today, they might consider just using the API that Apple gives you rather than looking at AFNetworking or something like that? BEN: I’ve taken not necessarily newsstands,, but this is an opportunity to sort of reevaluate what’s important to you. It’s not just cargo coating a library. I have like tremendous respect for AFNetworking and it made a little lot of networking code clean and simple in iOS 6. I went about this path of like building a few applications just for myself just with iOS 7’s networking stack. And it’s then see AFNetworking 2.0 supports this new design that uses these new classes. But in order to know if this is worth or not is what is it actually providing. I think that’s a valid question to raise. One other things that I get annoyed with is, in NSURLSession, there are NSURLSession tasks which represent the request. You have like a data task which would be like anything like Get, Put, Post, or Delete where you’re expecting some JSON or XML data back, that would be data task, and you have download task and upload task, or like streaming bytes to inform disc. So the completion codex for those, there’s block-based ones and delegate-based one, you get the NSURLResponse as one of the arguments. And NSURLResponse, it’s like a super class that is generic to network connections not specific to HTTP. So if you’re making an HTTP request – PETE: Oh! I hate when API is try abd do this with it, it’s – err! BEN: [Laughs] Yeah. I’ve never dealt with any of these classes and not been talking HTTP over the wire. PETE: Yep. BEN: So I’m okay with saying, “Let me just assume for a minute…” PETE: [Laughs] BEN: [Laughs] That I’m dealing with HTTP request. So, in order to get something useful out of the response like headers or status code, you have to cast what they give you to an HTTP response. PETE: Ugh! BEN: That really bugs me. So, like AFNetworking has an HTTP, AFHTTPSessionManager, I don’t think currently it does the casting for you, but it certainly could, say any reason I couldn’t. And maybe I’m wrong; I might need to check that up while somebody else is talking a little bit. So that’s one opportunity. In addition like the callback that you get for network connections, you get one callback and it’s did complete with error, which kind of sounds like it failed, but the error that it gives you is nil if it succeeded. CHUCK: [Laughs] BEN: So you can check to see if the error is nil. Dig up low there, the error will be nil. If the error is non-nil, then you can say, “Okay, something happened with the connection,” like a timed out or redirected too many times or the DNS like the name was bad or there’s like a 2 or 3 dozen error conditions. That could happen where the physical request can’t even be made. If you successfully make the request to the server and you get a response, and the response happens to be a 500 in the eyes of NSURLSession, that’s a successful request like the plumbing and everything held up for the life of that request. But in AFNetworking, you have 2 callbacks – you have success and failure. And in AFNetworking, if they decide to lump any non-200 response as an error condition [unclear] condition as a failure condition. So I think it doesn’t necessarily bug me either way, but neither framework sort of makes that crystal clear. I just gave a talk on this stuff at CocoaConf in Boston, and I made a point to call this out in both cases like NSURLSession. If you get an error, that means like the request can’t be made at all. And in AFNetworking, if you got a 4 or 1 unauthorized, that would go through the failure callback. PETE: I feel like you’ve described the 2 things that I always get an eye bite with HTTP APIs. The, “Oh! We’ll make it work the same for FTP and HTTP [chuckles]…] BEN: [Laughs] PETE: Because everyone wants to do that. BEN: Golfer, don’t forget golfer. PETE: Okay, [chuckles] yeah. And the whole like network level errors versus application level errors, it’s pretty really hard to get a good API for that. But that’s frustrating that the 2 ways that you could have get it one way and one with the other way. BEN: Yeah. I think, where AFNetworking is still providing value is that there’s a new design in AFNetworking 2.0 where instead of having AFJSONRequestOperation which expects a JSON response, and there’s sort of some duplication in the different types of request operation classes. Now, there’s a request and a response serializer so you just have one class that is your SessionManager, AFHTTPSessionManager, and it hangs on to your session for you and all the configuration, and then you just tell it, Get, Put, Post, or Delete. It will return to you the data task that you just requested so that you could cancel it or whatever. And you will encode the request parameters according to the request serializer type so you have an AF form and coded serializer and an AFJSONRequestSerializer. So if you wanted to make your API accept like a login form as opposed to where the post body is actually JSON, not form and coded data, you could do that by just setting the request serializer to an AFJSONRequestSerializer. So I think it’s really a nice design. PETE: Yeah. BEN: It’s super easy to set. And the response, by default is AFJSONResponseSerializer so the data coming down on wire gets encoded into a JSON dictionary or array with NSJSONSerialization. It’s also an XML Response Serializer and a PropertyListResponseSerializer, and you can create your own API for that; it’s easy to understand interface. I actually like that. So in the callback, instead of getting an NSData pointer, I get a response object that is either in array or dictionary, so say [unclear] a little bit of boil play code that you’re typically writing. PETE: I’ve got a random question, or not that random I guess, but do you think any of the API design for this new Apple API was influenced by AFNetworking? BEN: I don’t know to what extent. I’m sure that they have seen it. I don’t think that they’ve got their head in the sand or anything while they’re on an island. However, I think that…I don’t know! It just sounds to have some weird design aspects. So if you want to use the block based completion, which I think is definitely something that’s sort of in vogue like everything is block-based completion. PETE: Yeah. BEN: If you want ultimate control, then you have to pass like just gobs of parameters to the block, and then that becomes like kind of unwieldy mess with indentation in like the way Xcode breaks lines, and it becomes hard to read. I think there’s a lot of AFNetworking code out there that looks like that. So if you want any more detail, then the request completed with error and here’s the response and the data, you have to set the delegate of your session. If you set up the delegate of your session and you use the completion block variant, then it will not call your delegate methods for that request because the block itself is handling it. Does that make sense? So if you want to receive more detailed information about a response like if you’re downloading data and you want to receive the progress callbacks, then you have to use the delegate methods and you cannot pass in the completion block. PETE: Oh, wow. So passing in the completion like breaks? BEN: I don’t say necessarily breaks, but it’s an either/or situation, and it can be confusing that, “I set myself up as a delegate, I implemented the methods in this break, when it isn’t firing,” and that’s because you are using the completion – PETE: And also, presumably, that’d be pretty frustrating if you’ve gone through and done stuff using blocks and then suddenly you realized, “Oh, I need to handle this thing…” BEN: Right. So in one of my demos, I went through and converted one to the other so that I could track progress and show progress neither for a download. It turn out that I have like all ‘if’ conditions for like, if there’s an error, then I’m just going to log the error because that’s how you handle errors. [Laughter] BEN: And then in the else block, you indent a little bit and then I cast the response to an HTTPResponse and then check status code. And if the status code is 200, then I have this success case code. And then having else, where I indent again and handle the non-200 response. It turns out that if you convert that block-based completion into the delegate methods, one of the common things is turning off the network indicator when the request finishes. So you start it before you execute the request, and then in both failure and success conditions, you have to turn off the network indicator. So you can actually do that. There’s one delegate method did complete with error like URLSession did complete with error. And if you’re using the download tasks, then you’re going to get a different callback before that the download finished and download it to a specific file URL. So I would put the network activity indicator disabling code in the did complete with error, and I don’t even need to check to see if there’s an error. This is just like it completed. PETE: Yeah, either way. BEN: So it just seem like there were more buckets for behavior. And all those like various conditions that I had on my block turn out to sort of sift nicely into each of the buckets. So I don’t necessarily think delegate methods need to be like hated on all the time. Sometimes, it actually cleans things up quite a bit. PETE: Well, I think that if it’s a simple thing where its either going to succeed or fail, then a block is great. But if you need more than 2 chunks of behavior – BEN: Yeah. PETE: Yeah, than you more than just like – BEN: And what’s your typical trick? Extract method, right? “This method looks gross, I’m just going to take everything inside the f block for success and make a new method.” If you’re doing that already, then maybe the delegate callbacks would be cleaner anyway. So there’s that. And I think the NSURLSession design sort of dub tells nicely with the new multitasking stuff. One thing you can do is turn on a background mode for your app for background fetch. So if you had something like a weather app or a Twitter app or a news app or Stack app or anything that just sort of periodically updated. In iOS 6, you would have to launch the application and the user is staring at stale content while the request is made to update it. So in background fetch, in your AppDelegate when your app wakes up, you would likely say something like application set minimum background fetch interval. So if you’re doing like a Stack app, maybe the minimum interval, there’s a constant you can specify the minimum interval so that will cause your application to be called as much as possible for background fetch. And then if you had something that was only updated like once or twice a day, then you would specify that interval in seconds like, “At the minimum, I need to be called every hour.” You’re not really guaranteed a specific time on when you’d be called – PETE: I like the way when Apple described that they’re kind of a little bit cagey that is kind of like, “Well, if there’s an algorithm and it does stuff and you can control –“ BEN: Right. You can kind of see where your code sort of fits into that algorithm because they’d give you a call, they wake your application up, and they’ll say, “Okay, perform your background fetch.” So in my application, I would say, “I’m going to go fetch the weather for the user’s current location.” So when they fetch the weather, I’m going to save it because I’m caching whatever I got last time, then I need to tell if basically they pass in a completion handler and you’re supposed to call the completion handler and you’re supposed to call the completion handler and let it know if you got any new data or if there is no new data or you failed. So if there’s like no network, then you’d have to report that you failed. If they call you like 15x in a row and every time, you’re saying “I have no new data” then they’re going to scale your application back. PETE: Right. BEN: So it’s kind of like be a good citizen because the OS has the ability to slow down background fetch updates for your application. PETE: Yup! BEN: So I like that a lot. The other multitasking thing I think is really interesting and it fits in with NSURLSession, actually, is the background downloads. It’s kind of magical how it works. So instead of using the default session configuration or the FMRollConfiguration, there’s a background one and you can give it an identifier so you probably do something like com.whatever.image download, or something that uniquely identifies that particular background session. And if your app is downloading stuff and then goes into the background, the download itself like your code that is getting executed is actually paused. But the download magically happens somewhere else. And then when it’s finished, it will notify your application and you have AppDelegate callback of handle events for background session. And basically what need to the background session is about to complete so it wakes your application up so that you can do something, and then there’s a final callback called URLSession background transfer did complete or something like that, so your app can even crash. They did a cool demo at dubdub where the guy was downloading an image and then crash the application by dereferencing all pointer, and then waited a few minutes or few seconds or whatever so that we could be reasonably certain that the image that actually been downloaded, and he just double tap the Home button which brings up the multitasking display with all the screenshots of your apps and the app that display the image was already showing the image even though the app had crashed middle download. So what it’s actually doing is the background transfer daemon is waking up the application, in this case, from a crash state so it’s launching it anew and goes to the handle background transfer in an instant. It repaints the UI with the image and everything, does the snapshot, and all that’s happening in the background. So it’s kind of magical and there’s a lot of pieces involved. But by using NSURLSession, all the new stuff, it enables these types of interactions. I think these are really, really important to this overall experience of iOS. A lot of apps that they launch nowadays, they just already have content, which is really nice. PETE: That’s cool. I like the way that Apple are kind of seeing all of the things that people…there’s some things I think Android fans complain about what Apple have like – you can’t do multitasking, you can’t do whatever. I like that Apple haven’t just done in me to kind of thing and just said, “Okay, well, I guess we’ll have to allow multitasking,” they’ve just found other ways to solve the same problem while still staying in control of the platforms so they can do optimizations. Now, I sound like an Apple fanboy. BEN: [Laughs] Yeah, it’s definitely different than just allowing apps to run in the background. PETE: Yeah. BEN: Because honestly, you can’t trust half of the developers to do the right thing. PETE: I would say 3 quarters. BEN: Yeah [laughs]. JAIM: I just need to download stuff every 30 seconds on my app in the background. BEN: Yeah! If you give them the permission to do that, people will do it, and that’s why you have devices out there or other platforms which I don’t have this good battery life. It means we have to sort of escape through this slalom poles or whatever in order to conform to these APIs. But at least, to a much better experience, you’re really not sacrificing much in terms of background app activity. PETE: I like Jaim’s idea. I’m sure there’s someone who has done some experiments of like different ways of trying to gain the algorithm of like…if I say I got new data every sick of time, then [chuckles] I always get cold and I can calculate my bit coins in the background. BEN: [Laughs] JAIM: My customers are demanding this. This is a much ‘to-have’ feature. PETE: [Laughs][crosstalk] BEN: [Chuckles] It also gets rid some of those hacks that people did, like Instapaper wanted to do like a daily download of your articles maybe in the morning so that you could have them in. That was sort of a newstand only type of feature. So what was done something like you could put a geofence around your house so when you went to your house, it would wake you up via location updates. PETE: Yeah. BEN: But that means that Instapaper needs to know your location, and it’s definitely a hack. And I think that these new APIs allow much more apps to do the right thing in the right way. PETE: I’ve heard of people doing or used to do the same thing with Voice Over IP entitlement. Like if you have that flipped on, then you can leave stuff running in the background for networking. BEN: Right. There was – Paceboard had the thing where they wanted to continue running in the background all the time so that it could monitor your Paceboard. In order to do that, they turned on audio or playing silence and eventually got rejected for that. PETE: [Laughs] Yeah. I tried the exact same trick where from my testing tools it keeps running in the background. BEN: Oh yeah, that’s right. PETE: But it doesn’t work in the simulator. Really annoying. BEN: Another thing you can do now, which used to be a stand-only feature is a send a silent push notification where instead of you have like a push notification which has a little JSON hash and one of the keys is like alert and that’s what would be displayed to the user like, “Please play my game. You haven’t launched me in 2 weeks.” And then there’s also sound so you can pass in the name of the sound and it will play that sound. And then there’s like whatever other metadata you might want in the push. There’s a new one content available in which you return one or zero in there so you don’t even have to have an alert. You can say content available. So if I am building a social app and I have accepted your friend request, so the state of your application right now because it’s in your pocket is you’re waiting on me to confirm the friendship and your friends list does not reflect my row. If the server would send you a push notification saying there’s content available for that data or whatever, then the app in the background can go fetch it, refresh those 2 list. And then once that refresh is completed, then it issues a local notification which alerts you that I accepted your friend request. So when you swipe to open your phone, the 2 lists are already up-to-date. [Crosstalk] BEN: Yeah! So if you’re done with few double tap and go to multitasking view, I would already to be in your friends list so it seems quite magical. PETE: There’s so much more. BEN: So those are sort of areas that I have been focusing on. There’s so many new APIs that is really difficult to be an expert on all of them. PETE: So I guess we have, in the time we have available, we could either rush through Mac OS X stuff or we could talk more on iOS 7 stuff and then do picks. ANDREW: I’m sort of curious about the custom transitions. PETE: Me, too. BEN: Okay. ANDREW: New custom transition stuff in iOS 7 if you heard or you have any experience with them. BEN: I do [laughs]. Is anybody else just saw I’m not hogging the mic. PETE: [Laughs] Special guest, Ben Scheirman. BEN: [Laughs] CHUCK: There we go [laughs]. BEN: I’ll just go out and say that the documentation is severely lacking in this area. Like a month ago, there was like no resources. I was like, “Oh, I know! I’ll do a screencast on ViewController transitions,” and literally went back in red or watched the dubdub video on this topic; it must have been more than 10x. And the guy in the video, smart guy, but he makes his comment in the session. A lot of people have told me that this is complicated, though it’s really not. And the fact that I watched it 10x, I had to tell that it is more complicated than you give it credit for, and that joke started to get really old every time I present – PETE: [Laughs] CHUCK: [Chuckles] BEN: The idea is, your Tab bar for instance, you have 4 Tabs at the bottom and you tap them, and it’s literally like flipping Tabs in your browser; there’s no animation, it just flip to the new content. And that sort of make sense because you get flip back and forth between any of the tabs instantly. And in Navigation Transition, you tap and it sort of pushes on AV controllers. It’s animated so you can sort of envision the hierarchy or sort of landscape of the navigation of your app. So when you tap back, you know which way the animation is going to go. And then theres’s a third on which is modal. You tap and it typically slides down from the top. And when you dismiss the same thing, what else is there? There’s cross dissolve and uplift. But it was not so easy to sort of take 2 ViewControllers and create a custom transition between them without a lot of code before. So one of the things that you might do is not move between 2 screens, keep the same screen, which has changed the content up a little bit. Like photos in iOS 7, it shows you a collection of in this group to bio like dates and where you were, so it kind of categorizes your photos for you in logical events. If you top on that, it doesn ‘push to a new ViewController or show a modal ViewController on top with the new content,it actually changes the CollectionView layout to the new layout which just sort of a zoomed-in look of, “Okay, now, that was like this day, and this day,” instead of a grouping of one month. So you can do like layout-to-layout transitions on the same screen. And if you conform to the interactive part of the transition protocol, then you can actually drag your finger from the left edge of the screen to the right edge of the screen, just like you would be going back in Navigation controller, and it’ll actually animate the transition between the 2 layouts so like these small tiny squares become bigger squares and they layout exactly where there in the new View. To do that, you actually just provide it 2 different layouts and say, “Tell it to animate between the 2,” and it’s easier than it sounds. I’m trying to think of exactly the best way to describe this on a podcast, but it sort of has ramifications on your design like how you design your controllers because at some point, you have to provide a transitioning delegate, and the transitioning delegate is the one who’s going to return the appropriate interactive transition or custom transition if you have set the transitioning delegate of a ViewController to some object. Then it’s going to ask that object for your transition. So, all of the objects, none of them are concrete objects or are protocols. So you have, I think it’s UIViewController interactive transitioning is the protocol that you would implement in our custom transition. And you’re basically given the tube to use and you can ask the context object that it passes you for ‘what is my starting frame’ and ‘what is my ending frame’. Now, maybe I’m like animate along the [unclear] path to get to the ending frame. Or maybe I just – in the case of the example I built, it was “Let me position one ViewController, I’m going to rotate it 90 degrees counterclockwise,” so that is sort of positioned off-screen, and then I’m going to animate it back to no transform. If you can imagine like – PETE: [unclear] BEN: Exactly. Yeah, like rotating from the upper left hand corner sort of rotates in place, and you can make that interactive. What I like about the interactive portion of this is it’s literally almost no code. Typically, you would have like a UI…not a SwipeGestureRecognizer, but the UIPanGestureRecognizer. So UIPanGestureRecognizer is going to call back many times as your finger moves across the screen. And you would typically put that on your ViewController. But in the case of an interactive transition, you probably want the transition class itself who manage the gesture because you need to be able to get the callbacks of the gesture in the transition so you can update the transition’s progress. So what I did was, as you pan closer to the right, it calculates your distance that you’ve travelled and figures out a percentage of how far along you are along the transition. And if you’re sufficiently far, then it will complete it for you. So I don’t actually have to do any of the interpolation or animation in between. The beginning state of the rotated view and the end state of the view is perfectly centered on the screen that the gesture recognizer just updates the percentage of the interaction and the framework figures out the rest. PETE: That’s really neat. So I’m guessing this makes it super easy to do things like kind of fading something out a few or just swiping, all those kind of things? BEN: Yeah. Like the view that is going away sort of falls back into the device a little bit so you scale it down a little… PETE: Right. BEN: You can just only do that. There’s so many things you can do. PETE: Or change the color or something as it comes in. BEN: Yeah. Tweetbot is a good example of – there’s a lot of things in Tweetbot that are custom, but specifically, they are interactive. ViewController transitions, I think there are probably 2 or 3 that are in there. PETE: So this delegate protocols, does it seem like most of the time they end up being implemented on a ViewController? Or, do you end up kind of creating a custom class to manage this stuff? BEN: I don’t think there’s enough good guidance out there yet for this. Apple sample code puts a ridiculous amount of code in the AppDelegate. PETE: Yeah. BEN: And I am never okay with that. It’s like if you mix that with Core Data and everything else that you’re supposed to attach to this thing becomes somewhat of a god object. In addition, you see code all over the place that if you take Core Data sample code for example, the NSManageObjectContext is living in the AppDelegate. So a lot of ViewControllers would just reach into the AppDelegate and grab it. And that’s a design you might take. But if in the same design, you have your AppDelegate reaching back into your ViewController to perform some operation, then I absolutely don’t like that design because you rated a super tight coupling between your AppDelegate, the ViewController, and your ViewController in the AppDelegate. I much prefer raising notifications in the AppDelegate and having other classes handle it sort of in a much more decoupled way. So I think these transitions should be their own objects. But if you do that, then you’re sort of like, “Well, I need to know what the ViewController is at this point,” so you have to – PETE: Yeah, you’re kind of coupling… BEN: Yeah, you have to provide the right context. PETE: It’s fundamentally need to know that stuff, right? BEN: Yeah. So I ran to a place…I’m trying to remember exactly where it is…a place where I didn’t know what I needed to know at the moment so I had to raise a notification which kind of felt wonky, a little bit wonky. I have 2 screencasts, not to force people to subscribe, but there’s some sample code associated with each of them so I will link to those in the show notes on creating the initial transition and then the interactive portion of that. So if you take a look at the sample code for those, it’s not too much code. But what I really like about this particular feature in iOS 7 is the interactive portion where literally, you just say, “Update interactive transition,” and you pass in a percent and it figures out everything else. It looks like I talked for about 30 minutes [laughs]… PETE: [Laughs] BEN: Networking, multitasking, and interactive transitions. I wonder if we could save the Mac OS X stuff because I’m super naïve about all of the new stuff in Cocoa so I’d like to devote more stuff to that. PETE: Yeah, I want to hear about that stuff, not just cram it in at the end of an episode. ANDREW: Next time, we have a guest [that] would show…or maybe we can get a guest that… JAIM: I think they would hear our next guest. CHUCK: There we go [laughs]. JAIM: Next week show, we get to do it. BEN: [Laughs] ANDREW: [Chuckles] CHUCK: I have a few questions related to some of the announcements they made at the last event. They changed the screen size I guess back to the same aspect ratio as the original iPhone with the 5S and 5C, did I misunderstand that? BEN: No, it’s the same as the… CHUCK: The 5? ANDREW: The 5. BEN: Yeah, same as the 5. CHUCK: Okay. ANDREW: Where did you hear that, Chuck? BEN: [Chuckles] CHUCK: I don’t know. I heard people talking. PETE: Chuck has inside knowledge of the iPhone 7. CHUCK: There we go. BEN: [Laughs] CHUCK: And the other thing that I’m curious about is the iPad Air. Do any of the hardware changes affect anything? BEN: What’s interesting about that is it’s literally the same screen resolution as the other iPad. It’s just way thinner and its bezel is considerably smaller, so it feels like they shed a whole bunch of excess material as it’s a lot lighter. But the screen size, it’s the same. And in the iPad Mini Retina is I think is just a smaller screen. But pixel wise, it’s the same. Is that correct? ANDREW: Yeah, that’s right; the same number of pixels on the iPad Mini as on the iPad Air. BEN: Just switch means it’s like super retina. CHUCK: [Laughs] ANDREW: Yeah, it’s actually higher pixels per inch than the full [unclear]. BEN: I was really hoping that they would have that in the Apple stores already so I could play with them, but no such luck; we’ll have to wait a couple more days. ANDREW: Well, the iPad Mini, the Retina iPad Mini is “later in November” or [unclear]. BEN: Oh! I thought that was on the first 2 thing, because I really want to try them both. I have an iPad 3 right now, and my wife has an iPad Mini. Literally, the Mini feel so much better. It’s lighter, it’s more – like you’re reading in bed and you’re holding that thing above your head and not sort of fatiguing. The iPad 3 is somewhat heavier than the mini. ANDREW: I have iPad 3 and iPad Mini, and we moved in July and I seriously do not know where my iPad 3 is. CHUCK: [Chuckles] ANDREW: I’m sure I could find it, but I just have no reason to use it; the Mini is so much nicer. CHUCK: Yeah, I have an iPad 1. If I’m doing anything, it’s usually on either my phone or my Kindle just because the same thing – the form factor is just smaller and a little easier to deal with. JAIM: I must be the only person left. I use this full-size iPad. CHUCK: I watch movies on my [unclear]. PETE: I just use my MacBook Air which is about iPad sized. CHUCK: There you go. BEN: I write all my code in my iPad. Don’t you guys? [Laughter] PETE: I’m getting lots for using my MacBook Air for writing all of my codes. It’s like the little 11” MacBook Air but does the job for me. CHUCK: It looks like I’m going to be able to go to RubyConf, it’s kind of been on again, off again. But I’m going to be speaking there about how to do development in the Cloud so all you need is an SSH client and an internet connection on your iPad. BEN: I did that at dubdub; somebody had one of the keyboards like the keyboard cases, I think it was the Logitech one. And he was interested in learning a little bit of Rails while we’re waiting in the Keynote line. And literally, tethered to my phone and SSH into one of the box and went to [unclear]. PETE: That’s awesome. BEN: It was fun! The little lock of escape key was the biggest problem. I forget what is the CTRL + right bracket or something to do escape in Vim or to lock exit in certain mode of Vim without escape… CHUCK: Well, that’s your problem, you’re using Vim. I use Emacs, which is fun. BEN: [Laughs] PETE: [Laughs] I would love to see someone using a touch screen to use Emacs. CHUCK: Oh, dear! [Laughter][crosstalk] BEN: Multitasking would be necessary, right? CHUCK: What was that? PETE: Are you going to do your presentation on an iPad Mini? CHUCK: No. What I’m probably going to do, this is totally off-topic, but what I’m probably going to do is I’m probably going to just do all the stuff on my laptop. And then from there, I’ll either turn on reflector app and connect my iPad to it if I can, if the WiFi is good enough, and if I can’t, then I’ll just have a video for backup. PETE: I’d make a video. I mean like that seems like you are tempting so many demogods by trying create demo of like live demo of this needs to the internet in order to work [laughs]. CHUCK: It not only needs the internet, but it needs like working WiFi, and WiFi that allows you to see other machines on the network. PETE: Oh, wow! CHUCK: Yeah. So like I said, I’m probably going to have a video to back it up [laughs]. PETE: [Laughs] JAIM: You’ll probably need to sacrifice your iPad to make it all work right. CHUCK: There we go. PETE: Yeah, but [unclear] live on stage. CHUCK: Yeah, one of my sponsors for Ruby Rogues came through and said that they would pay for my airfare and hotel, which is way it’s on again [laughs]. BEN: Awesome. PETE: You should probably name that sponsor because they’ve just given you some wonderful sponsorship. BEN: Yeah! CHUCK: Yeah, it’s New Relic. BEN: Nice! PETE: You know who works at New Relic now? CHUCK: Who? PETE: Ward Cunningham. CHUCK: Oh really? BEN: Oh, really? Wow! PETE: As far as I know, he does. At least he’s been showing me around the office. In Portland, they have street view inside the New Relic building. I was trying to [unclear] something and he was like telling me to drive around the New Relic building office, inside it was street view, and it was very surreal. They have very, very beautiful views of downtown Portland from their offices. CHUCK: Oh nice! PETE: And also, a wonderful service! CHUCK: Anyway, is there anything else we need to cover on the new APIs front [chuckles]? PETE: [Laughs] And he have a tangents for [unclear]. BEN: There were like 1500 new APIs, I think I covered a dozen or so. And still, there’s lots more that we could potentially cover, but maybe we’ll get Mr. “NSHipster” Mattt Thompson in here talk about maybe some of the more esoteric ones. CHUCK: Yeah. We should also point out that if you, the listener, have any in particular that you want us to cover, and/or you know somebody that could cover it, just send me an email, Chuck@DevChat.tv and we’ll see if could get them on the show. BEN: Somebody at CocoaConf Boston came up and said they liked the show. I guess that means that people actually listen to the show. I thought you were just keeping all the recordings for yourself, Chuck. CHUCK: That’s right, this is my ongoing tutorial into iOS. [Laughter] CHUCK: And things have been going really well with a lot of the shows, and I know that the listeners are sometimes curious about this so let me pull up numbers and I can actually tell you, and then we’ll get into the picks. BEN: Anybody have any jokes? [Laughs] CHUCK: Last month, we had 3,455, this month so far we have 3,892 listeners, and the month isn’t over yet; we have like 2 more days. And it’s picking up. In August, we had 2,867 so picked up about 600 listeners in September, and it looks like we’ll pick up another like 500 in October. BEN: Nice! JAIM: Go on straight to the top! CHUCK: Yup! So thanks everybody for sharing the show, and letting us know that you like it. It’s always fun to go to the conferences and stuff and find people who are enjoying the show. JAIM: We’re coming for you TedTalks. [Chuckles] CHUCK: Alright, well, let’s go ahead and do the picks. Pete, you want to go first? PETE: I would love to go first. I have a random selection of picks today, none of which are related to what we’ve been talking about, neither the tangents, nor the actual topic. My first pick is “Git”, because it’s amazing. I just had a one full of experience the other day where I had to do some crazy gymnastics with code, and I was explaining to someone else on my team how to do it with Git and the active explaining it to them made me realize just how powerful and how elegant a model it is. I don’t I thought it’s really worth picking because I’m sure most people use it by now. If you don’t, then you should use Git or Mercurial I guess; Mercurial is cool, but Git is better. BEN: [Laughs] PETE: And if you are stalking of where the best SVN, then Git-SVN Bridge is a very, very simple, not very, very simple, but very, very workable solution for having SVN as your main repo for using Git on your dev machine. I did that for several years and it was all good. My next pick is a competitor podcast just because…it’s a podcast called “Build Phase” from the guys at thoughtbot. I should never pick thoughtbot things because I get annoyed when people think I work for thoughtbot not ThoughtWorks, but I think they’re great bunch of guys anyway [chuckles]. CHUCK: [Laughs] PETE: They also said very nice things about Frank, one of our podcasts. It’s a good podcast; just kind of conversational chitchat kind of thing. I really like it. My third pick is a application called “1Password”. I’ve been trying to get better at passwords recently and not having showing passwords across accounts, and having better passwords and stuff. I tried another app and didn’t really like it, it kind of got in my way too much. But 1Password, it really, really, it’s seamless enough and frictionless enough that I don’t dislike using it. It kind of just gets out of the way, but let’s you actually be secure with your passwords and stuff. And it has an iOS app and a Mac app and it integrates with all your browser; makes it very, very simple. It’s actually pretty expensive, but I think it’s worth the money. And my last pick is beer. This week, I had on tap a “Maibock” from Bear Republic. The only of a Maibock I’ve ever had is Dead Guy from Rogue, which I think quite a lot of people have heard of. This is kind of an obscure German style called the Maibock, but Dead Guy is a well-known beer in Bear Republic in Hillsburgh in California also making Maibock, and it’s very yummy. So if you happen to live in the Bay Area or Northern California Area, then you seek it out. I think it’s on tap, I don’t think you can get it in bottles, but highly recommended by me. That’s it! CHUCK: Alright. Ben, what are your picks? BEN: I was a long-time Instapaper user, like a couple of months ago, actually it was around dubdub time so the summer, I just decided to try Pocket, and after about 4 months, I don’t really like the Pocket, so I went back to Instapaper. It’s under new ownership, and these people are taking the product forward and I really like the changes they’ve made. In particular, I think it’s just in general better at parsing blog post with code in them, than Pocket was. So, I’d like to pick that. And then for a booze pick, I am trying a “Glenmorangie Quinta Ruban”. It’s s Scotch that is aged in oak casks and it is quite good. And then I don’t know if anti-picks or anything, but I had a just ridiculously bad pumpkin beer in Boston called Pumpkinhead Beer, and I would stay away from that. It tasted like Bud Light with Nutmeg. CHUCK: [Laughs] Okay! JAIM: Pumpkin Spies Bud Light, fantastic. BEN: [Laughs] CHUCK: Alright. Jaim, what are your picks? JAIM: I’m going to piggyback on what Pete was doing with Git, and it was at the Twin Cities Code Camp a few weeks ago. Keith Dahlby did a talk on Git, “Git More Done”, it goes of few more advanced things because basically, what I’ve been doing for Git for a couple of years is just doing SVN with Git – pull-commit-push. He goes over some actually some really cool thing is that it help you can understand kind of power like doing a partial commits. So if you’re working long in something and you find a nasty bug and you want to fix it but you felt this other code kind of mixed it up; you could do partial commit and just commit the one part that you actually changed in the honk; a lot of times you just do that and keep going on your way. There’s video for that, not from the Norwegians Developer conference that’s online so it’s up there for everyone to see, I’ll paste the link to it. It’s called Git More Done. CHUCK: Alright! Andrew, what are your picks? ANDREW: I feel like picking “Mercurial to get picks, but I won’t do that. [Laughter] BEN: Everybody [unclear] opinion. ANDREW: Yeah, we use Mercurial and the next thing, the team actually really like it when they have nothing against skit. My first pick is an app – I hope this hasn’t been picked before, but I use it almost every dance so I thought I would pick, and it’s called “xScope”, and it’s by the guys that Icon Factory. This is an app for UI designers and developers, It has got a bunch of tools that you can use to help you with those tasks, things like on-screen rulers, magnifying loop with a color measurement tool, but then generate NSColor and UIColor decorations automatically. One really cool feature that I like is they have a companion app for iOS that lets you mirror a phototshop window or a portion of your screen to your iOS device so you can make changes in photoshop and immediately see how that look on the iOS device. Its’s part of the Icon factory who are long-standing, well-known, Mac and iOS developers and also designers. It’s a great app. The next one is maybe obvious, but I look forward to these every year or every OS X release, and this is John Siracusa’s review of “Mavericks” for Ars Technica”. It’s 24 pages long. I think I read around 24,000 words, but it’s well worth reading. It’s an in-depth of [unclear] of all the new stuff in Mavericks. And then finally, my last pick is a talk of “Cabel Sasser” gave at XOXO this year. It’s not a technical talk. Cabel is a great guy and a good speaker and fun to listen to. But this talk was sort of serious and about some experiences he has had recently and how he dealt with them, and it’s well-worth watching. Those are my picks! CHUCK: Alright! I’ve got a couple of picks. The first one is a system that I’ve been using for comments on my blogs and podcast for a while, it’s called “Lyvefire”. I’ve been working on moving everything over to one site and I’ve got the site just about ready to go. I realized that all of these different sets of comments are in their own little sub-account on my account, and I wanted to be able to merge them all so I can put them all on one site. So I emailed Lyvefire support, and keep in mind, this is a free service, and they turned around it immediately said, “Yeah, we can do that for you, just let us know when you’re ready and what you want us to do,” so props to them for giving great support on a free product. My Dad on Sunday also got me hooked on a couple of games for the iPhone, one is called “DragonVale”. You basically just breathe and raise dragons. And the other is actually called, “Dragon City”. They’re pretty similar, they’re a little bit different, they’re kind of the FarmVille type app except that you don’t have log in every 10 minutes and check on it. I’ve been enjoying those so when I get a few minutes every few hours, it’s just like, “Okay, I’ll check it,” and do whatever and then I’m off of it in like 2 minutes. Anyway, it’s a lot of fun. So, I’ll put links to those in the show notes as well. Those are my picks! With that, we’ll wrap up. Thanks guys for coming! ANDREW: Thank you! CHUCK: Thanks for being our expert guest today, Ben. BEN: Thanks for having me on the show! [Laughs] JAIM: This was the best episode ever. CHUCK: There you go! BEN: Thanks, Jaim! Appreciate it. [Laughs] CHUCK: Alright, we will catch you all next week! JAIM: Bye! ANDREW: See you!