
022 iPhreaks Show â Networking with Steve Madsen
Show Notes
Panel
Steve Madsen (twitter github Light Year Software) Andrew Madsen (twitter github blog) Ben Scheirman (twitter github blog NSSreencast) Jaim Zuber (twitter Sharp Five Software) Pete Hodgson (twitter github blog) Rod Schmidt (twitter github infiniteNIL) Charles Max Wood (twitter github Teach Me To Code Rails Ramp Up)
Discussion
00:45 - Going Rogue Video
01:21 - Steve Madsen Introduction
00:45 - Going Rogue Video
01:21 - Steve Madsen Introduction
Light Year Software
02:00 - Networking with iOS
WiFi Connection Speedtest.net HTTP Live Streaming
07:58 - Bandwidth and Quality of Connection
12:23 - Network Link Conditioner
15:29 - Reachability
24:27 - Networking Gotchas
26:54 - NSOperation Dependency
29:41 - AFNetworking
12:23 - Network Link Conditioner
15:29 - Reachability
24:27 - Networking Gotchas
26:54 - NSOperation Dependency
29:41 - AFNetworking
RestKit
33:54 - Logging of Networking Requests and Response
Runscope
38:49 - Networking Technologies
41:27 - WebSockets
41:27 - WebSockets
faye SocketRocket
45:48 - Fallacies of Distributed Computing
Picks
ARC vs. MRC Performance (Andrew) Machine language: how Siri found its voice (Andrew) Philips hue (Ben) hue (Ben) CopyPasteCharacter.com (Ben) Glyphboard (Andrew) Lawyers (Jaim) Runscope (Pete) estimote (Pete) Acme Pale Ale from North Coast Brewing (Pete) XCOM Enemy Unknown (Pete) RubyConf (Chuck) Airbnb (Chuck) Platform University (Chuck) Little Snitch (Steve) Upton Tea (Steve) Clojure: Enemy of the State (Rod) Hire Rod (Rod)
Next Week
Build Automation with Patrick Burleson
Transcript
Build Automation with Patrick Burleson
Transcript
CHUCK: Hey everybody and welcome to Episode 22 of The iPhreaks Show! This week on our panel, we have Andrew Madsen.
ANDREW: Hi! Iâm not a robot; Iâm just going to [unclear]
[Laughter]
CHUCK: Ben Scheirman.
BEN: Hello! Iâm eagerly waiting of the arrival of GTA 5. So if the doorbell rings, I may run to go get it.
CHUCK: Alright! Jaim Zuber.
JAIM: Hello from Minneapolis! And also, not a robot.
CHUCK: Pete Hodgson.
PETE: Good morning fromâŚI am not a robot.
[Laughter]
CHUCK: Rod Schmidt.
ROD: Hello from Salt Lake!
CHUCK: Iâm Charles Max Wood from DevChat.tv. Before I introduce our guest, I just want to make a real quick announcement. This Friday, meaning last Friday when you get this episode, was my âFreedom Dayâ. It was the day I was laid off from my job 3 years ago and went freelance. Iâm celebrating that by putting up a free video that kind of chronicles my journey through freelancing and going from laid off to actually making enough money to live on. Iâm going to have a lot of lessons that I learned in there and stuff, so if youâre interested, you can get that at GoingRogueVideo.com.
BEN: Whoo-hoo! Congrats!
CHUCK: Thanks! We also have a special guest, and that is Steve Madsen.
STEVE: Hello from the Columbus, Ohio.
CHUCK: Can we get you to introduce yourself real quick?
STEVE: Sure! I own Light Year Software, which is a small consultancy here in Columbus specializing in Rails and iOS development. Iâve been doing that for about 7 years now since relocating back from the San Francisco Bay Area.
CHUCK: Was it named after the unit of measure, or the cartoon character?
STEVE: Unit of measure.
CHUCK: Okay.
STEVE: I was looking for something science-y.
CHUCK: Awesome.
PETE: Whatâs the cartoon character?
CHUCK: Toy Story. Buzz Lightyear.
PETE: Oh! Oh, yeah.
CHUCK: Alright, we brought you on to talk about âNetworkingâ.
STEVE: Yes! Thatâs a big topic!
CHUCK: I was going to say [laughs] it was kind of a broad topic. What in particular is interesting about networking with iOS or Cocoa?
STEVE: Specifically about iOS, obviously, weâre talking about mobile devices. I think itâs safe to say that since mobile devices became as popular as they did with the introduction of the iPhone, the possibilities on how for us to build apps that communicate back to servers or communicate with people nearby have gone up a lot.
CHUCK: Yeah, that makes sense.
Transcript
CHUCK:
Hey everybody and welcome to Episode 22 of The iPhreaks Show! This week on our panel, we have Andrew Madsen.
ANDREW:
Hi! Iâm not a robot; Iâm just going to [unclear] [Laughter]
CHUCK:
Ben Scheirman.
BEN:
Hello! Iâm eagerly waiting of the arrival of GTA 5. So if the doorbell rings, I may run to go get it.
CHUCK:
Alright! Jaim Zuber.
JAIM:
Hello from Minneapolis! And also, not a robot.
CHUCK:
Pete Hodgson.
PETE:
Good morning fromâŚI am not a robot. [Laughter]
CHUCK:
Rod Schmidt.
ROD:
Hello from Salt Lake!
CHUCK:
Iâm Charles Max Wood from DevChat.tv. Before I introduce our guest, I just want to make a real quick announcement. This Friday, meaning last Friday when you get this episode, was my âFreedom Dayâ. It was the day I was laid off from my job 3 years ago and went freelance. Iâm celebrating that by putting up a free video that kind of chronicles my journey through freelancing and going from laid off to actually making enough money to live on. Iâm going to have a lot of lessons that I learned in there and stuff, so if youâre interested, you can get that at GoingRogueVideo.com.
BEN:
Whoo-hoo! Congrats!
CHUCK:
Thanks! We also have a special guest, and that is Steve Madsen.
STEVE:
Hello from the Columbus, Ohio.
CHUCK:
Can we get you to introduce yourself real quick?
STEVE:
Sure! I own Light Year Software, which is a small consultancy here in Columbus specializing in Rails and iOS development. Iâve been doing that for about 7 years now since relocating back from the San Francisco Bay Area.
CHUCK:
Was it named after the unit of measure, or the cartoon character?
STEVE:
Unit of measure.
CHUCK:
Okay.
STEVE:
I was looking for something science-y.
CHUCK:
Awesome.
PETE:
Whatâs the cartoon character?
CHUCK:
Toy Story. Buzz Lightyear.
PETE:
Oh! Oh, yeah.
CHUCK:
Alright, we brought you on to talk about âNetworkingâ.
STEVE:
Yes! Thatâs a big topic!
CHUCK:
I was going to say [laughs] it was kind of a broad topic. What in particular is interesting about networking with iOS or Cocoa?
STEVE:
Specifically about iOS, obviously, weâre talking about mobile devices. I think itâs safe to say that since mobile devices became as popular as they did with the introduction of the iPhone, the possibilities on how for us to build apps that communicate back to servers or communicate with people nearby have gone up a lot.
CHUCK:
Yeah, that makes sense. Does it change much if youâre talking over cellular data versus WiFi? Or, most of your apps just not care?
STEVE:
I donât think most apps care. From an app developerâs point of view, the APIs are exactly the same; you have to do some work to actually find out if youâre on WiFi or cellular. Of course, thereâs all kinds of issues about âdo you even want to knowâ because Google and other places, or even airplanes, are famous for having WiFi in their transportation, but the link back to the actual internet behind that WiFi is either a satellite connection or cellular. So if you make assumptions about what you can do with the network based on the fact that your iPhone thinks itâs on WiFi, you may find it.
The reality of situation is extremely different.
PETE:
Yeah, same thing with my phone, like this little pocket WiFi thing. If you got an iPad that doesnât have cellular, then you might be using that most of the time, but youâre still on the cellular network; it just looks like itâs a fast network until you â
BEN:
Yeah! A lot of us have been at conferences where you have WiFi â I use BackBox to backup my Mac â I was at CocoaConf recently and realized that it was trying to back up like 18 gigs of stuff on a conference WiFi. It was a little disappointing; do you have to turn that stuff off. But yeah, how are you really going to know what type of connection that youâre going to get?
STEVE:
You canât. If your use case really does depend upon something to do with the network and in terms of its latency youâre dependent with, youâre much better off to try and measure those things within the app and then make decisions based on what you measure as opposed to assumptions about what you think you have based on a connection type.
PETE:
I guess thereâs different kinds of performance gotchas as well because thereâs the role bandwidth, but then thereâs also latency and stuff like that. So even if it seems like youâre getting really good connection, it might be very bursty where you get like chunks and chunks of data and then nothing comes through for a while, then you get chunks and chunks of data. So I think even doing something that measuring bandwidth or measuring latency is actually quite â thereâs some subtlety to that beyond just like going to Speedtest.com or whatever and seeing all the little [unclear] I told you.
STEVE:
Exactly. Actually, itâs something you would have to measure sort of ongoing, not something you could do once and then just forget about it and assume that nothing changes. The network is a really interesting thing for us to develop against because you can never make any assumptions about it; things are constantly changing. Unlike a lot of other things where you can test, and you can test, and you can test, you can be relatively sure that things work, the network will always bite you [laughs]. Things will always fail in weird and non-predictable ways. HTTP Live Streaming that the Apple does for all of its videos and stuff actually does more or less what Iâm talking about. The publisher on the server side actually publishes multiple streams at varying bit rates. And at runtime when youâre playing a video, the frameworks will actually switch to a lower or a higher bandwidth stream, depending upon the conditions that itâs absorbing and whether or not itâs able to keep up or whether itâs losing packets and falling behind, it kind of does exactly that.
JAIM:
I wonder if [unclear] that help you do this sort of thing?
STEVE:
Iâm not aware of any off the top of my head.
BEN:
Do you mean specifically like consuming HTTP Live Streaming?
JAIM:
Not Live Streaming youâre talking about. A lot of us just do kind of weâre on WiFi or cellular, but next weâre checking, your bandwidth, your latency, if youâre dropping packets, and kind of adjusting your app accordingly, are there any kind of toolkits that help you with this? Or, what APIs youâre actually using to figure this stuff out?
PETE:
I wonder what the HTTP Live Streaming, whether itâs a private API that Apple has access to that we donât or whether theyâre just doing the same stuff that we could do if we took the time to do it.
BEN:
I think theyâre using the same, like theyâre starting at a much lower level like measuring the packet loss and that sort of thing. But specifically for HTTP Live Streaming, you can inspect like keep the log and you can use that log for introspection to see like what type of rate you were getting specifically for an HTTP Live Stream. Itâs interesting, but thatâs not going to help you out if youâre just dealing with like a general API. I work on a streaming radio app and we have to determine whether or not to send a high-quality content and weâre not yet using HTTP Live Streaming. So right now, we make that determination on whether or not youâre on WiFi, which is sometimes a mistake depending on how good your connection is.
PETE:
It sounds like the best solution there is to be streaming a video over cats doing a funny dance in the background. [Laughter]
PETE:
And then you watch the log, and then if the logs says youâve got bad network, then you stop streaming the video of the cat.
BEN:
Yeah, and you can show it to the mess and heâs dragged.
CHUCK:
[Laughs] All joking aside, though, how do you figure out what kind of quality bandwidth do you have? Is it something like that? Or, youâre requesting something that requires a fair bit of bandwidth and then seeing how much is stutters?
STEVE:
If I were building a video app, and for some reason you couldnât use HTTP Live Streaming, first of all, youâre probably get rejected from the App Store [laughs], but that aside, I think youâd watch how much data youâre getting back because itâs the request you made. If you ask for what you expect to be about maybe, say, 10 seconds worth of data and you can buffer that in 5, then you should be able to assume then, âWell, youâve got a pretty good connection, maybe move up to a higher quality bit stream, or stay where you are.
CHUCK:
That makes sense.
PETE:
I kind of feel like the most robust way of doing this is to follow that same principle of like âDonât check WiFi to see if youâve got a good connectionâ because really, you donât care whether youâre on WiFi or not; you care about the quality of the connection. Iâd always tag it as the same with the latency and the bandwidth stuff donât explicitly measure that, but look at how much whether youâre able to keep up with the amount of days you need, and if youâre not, then adapt a bit or whatever, for the video example. But trying to develop some super sophisticated heuristic seems pointless when you can actually just find out whether youâre keeping up or not by seeing if youâre keeping up or not, like look at the Android â
ANDREW:
Yup, exactly.
BEN:
And thereâs no like scaling down quality of like a full JSON response so this only matters for media in which you have multiple encodings so that you can adapt. But if youâre just like consuming an API, you still need all that data so it doesnât necessarily matter. But you might record failures or something so that you know like maybe youâre just treated as offline if all these requests are failing.
PETE:
I think thatâs the â I guess maybe this is often a slightly different tangent â but from a user experience point of view, what I would really like to do is be able to fail fast if I know that Iâve got a network connection thatâs not really going to work. So the thing is really frustrating for me as a consumer, as a user of applications, is when Iâm on public transit or something and Iâve got a really spotty cellular connection and I go to load something and it doesnât say, âYou donât have a network,â it just sits there and doesnât do anything. Unfortunately, I donât think this is really a solvable problem. But really, what I want my apps to do is to tell me when I donât have a network connection so I donât sit there staring at this kind of bar thatâs like perpetually at 20% across their host system.
BEN:
Thatâs particularly problematic with Verizon in an elevator. Iâm on Verizon and it works in my house, yay! So thatâs why I am on Verizon. But in my elevator â I have 2 elevator rides when I go to work â it just doesnât work at all so Iâve just gotten used to not even opening it. One of the problems it has is recovering from being inside of an elevator, it takes a long time to just switch back to like an active cell tower so I can see that the request are going to fail; just one of those things you learn to avoid. But yeah, it would be nice if I can just [unclear] cancel everything youâre doing and I will start to begin later.
ROD:
Are you saying you have a connection but itâs really slow? Or, you just have no connection?
BEN:
Yeah, I have like 2 bars and it drops from LTE to 3G, and sometimes from 3G down to like GPRS or something. On iOS 7, it says 1x, I donât know what that means, but Iâm guessing thatâs GPRS, and it just never finishes anything. It takes about probably almost a full minute after I get out of the elevator to reestablish a good connection.
PETE:
Itâs kind of like the opposite of Denial of Service Attack⌠[Laughter]
PETE:
This is service that doing a Denial. Theyâre like kind of slow rolling you where theyâre like, âOh, yeah! Hereâs a bit,â and itâs there comes up. [Laughter]
PETE:
The other one right here somewhere, let me just look around. Yup! There is another bit.
CHUCK:
Itâs a Denial of Service because your service is denied.
PETE:
Yeah.
JAIM:
I think the one access actually carry your pigeon.
[Laughter]
ANDREW:
It does help, like working on a streaming radio app, it helps me test scenarios like that. But we rely heavily on the Network Link Conditioner as well. Once youâve solved this problem, where itâs good enough in most cases, you donât necessarily have to continue testing it, Network Link Conditioner on iOS is super, super handy. Just remember to turn it off when youâre done.
PETE:
[Chuckles] I think weâve talked briefly about that in another episode, but we should probably, since this is in an episode about networking, we should probably talk about in more detail because itâs a super useful tool.
CHUCK:
Yeah.
PETE:
But I havenât used it.
STEVE:
It used to work for me. I have Xcode 5 gm on my main machine now, and I sat down and do something with the Network Link Conditioner last night. It turns out that it seems like there needs to be a very specific matchup between your tools and the prefPane and I donâtâ have that right now, so it just utterly does not work, so be forewarned. If it works for you, donât touch anything.
PETE:
How would I even use this Network Link Conditioner thing? Where is it and what do I do with it?
STEVE:
Itâs in 2 places actually. It started life on the Mac as part of the Xcode tools, and I think they â I donât know if they came with the Xcode bundle originally, but itâs in what they call the âHardware IO Toolsâ now which is a separate download. You just install it to prefPane, it shows up in System Preferences, and then you can go in and turn it on or off. When you turn it on, you can pick a profile that dictates the downlink and the uplink bandwidth as well as the latency of packets, and you can even have a drop rate so you can make a link glossy to see what will happen if youâre on, say, a bad cellular connection where 1% or 2% of packets just never arrives. When it works, it works perfectly well; it gates all traffic in and out of your Mac, though. So again, if you have it on and then you forget about it and you go on Safari, and you wonder why everything is taking forever to load, itâs probably because you forgot. And then I donât remember if it was iOS 5 or iOS 6, but app thatâll actually bundle the Network Link Conditioner and iOS as well so now itâs buried under the â I donât remember whichâŚDoes anyone remember which menu it is under Settings?
BEN:
I think you have to enable your phone for development, and then thereâs a Develop Menu somewhere in there.
STEVE:
Yeah. And so you get all the same options there, but then for traffic in or out of your device, which is really great.
ANDREW:
Yeah, itâs under Developer so that you get a developer section of System Preferences if you turn on developer mode, and the Network Link Conditioner is one of the things is in there.
PETE:
I think on OS X, the Network Link Conditioner is just a GUI in front of the iptables or whatever the FreeBSD or the BSD equivalent of iptables is; itâs just messing with your Firewall thatâs built in to the Mac basically.
STEVE:
I thought that last night, and Iâm not so sure anymore.
PETE:
Oh, really?
STEVE:
Yeah.
PETE:
Interesting.
STEVE:
When I started getting the [unclear], it wasnât working for me. I dug in the console, and then dug into the prefPane bundle itself, and theyâre actually using XPC services in there, sort of like a helper application that runs. I donât know what theyâre doing [laughs], but itâs not a simple wrapper around PF or whatever the packet filter that OS X uses now.
PETE:
Oh, interesting. Okay, well, my information is out of date.
CHUCK:
So what libraries do you guys use for networking?
ROD:
One thing that might come in handy for the situations weâre talking about is the Reachability CocoaPod that you can use that will tell you if you have a connection or not. If you donât have a connection, you can display UI and it says âI donât have a network connectionâ. Iâm not sure if that will work with a really slow connection; theyâll probably not.
STEVE:
I donât think so. Iâm relatively sure that Reachability basically just monitors the routing table so itâs not a âI can reach the serverâ but itâs an âI should be able toâ based on the routes.
ANDREW:
Alright, weâd confirm that. So Reachability wonât tell you if you have a network connection thatâs just not working; it will only tell you if the phone truly thinks you donât have connection.
BEN:
Do you guys have like a good strategy for managing Reachability in your app? Because a lot of times, youâll say, âPush this buttonâ and then it will like execute some network request or maybe unviewed load, Iâm going to load some data for the screen. You want to check at that moment, âDo I have a network connection?â But Reachability is an asynchronous call so you can get a callback if Reachability changed, but thatâs not guaranteed to ever change. So as soon as you initialize the Reachability API, youâre not necessarily guaranteed to have a realistic answer whether or not you have network, correct? So one of the things that Iâve done is just keep like a global Reachability monitor in the app and just consult that. That way, if app start up, I maintain the state of Reachability callbacks. Is that something that you guys do? Or, is there a different way you handle that?
ANDREW:
Thatâs the same approach Iâve taken, so I have nothing to add [unclear].
ROD:
Yeah.
JAIM:
I do the same thing. I do the same thing.
CHUCK:
What do you do in the case where you do a Reachability test or whatever you verify that your server is there and it can connect, and then mid-response, it goes away? So you only got half of the response, and you donât really know if itâs going to come back or not.
BEN:
In that case, you will get the failure callback in Reachability so you can mark your own flag as âIâm offline nowâ. And then the request thatâs in flight will fail, so your failure callback handler will happen and youâre probably present alert saying, âSorry, this connection failed. Try again later.â Or, if network connection sort of gets interrupted in the middle and then comes back, by the time the failure callback happens, you should probably check if you have network connection again so that you can automatically retry the request, because there are times like me stepping in an elevator where I might have the internet interrupted for a minute, but then it will come back on its own. One of the piece of advice that I got from WWDC Session â I donât remember which one it was, it was one on networking â the Apple engineer was saying, âIf somebody is sitting there and staring at a screen, go ahead and retry the request,â you donât necessarily have to present on alert every time a connection fails, because people realize that they fail, they realize that theyâre in a tunnel or in an elevator or whatever.
CHUCK:
What if it doesnât go all the way the way, but just slows down to the point where itâs pretty much useless? So youâre still getting packets in, does that trigger the Reachability? Or, does it keep [unclear] in that bandwidth?
BEN:
Iâm guessing is Reachability just like a DNS query or a ping or whatever? I think if you can reach it, Reachability is going to say you can reach it and itâll tell you on which radio you can reach it like reachable view at WiFi or cellular.
ANDREW:
Right.
BEN:
But itâs not going to give you any indication of speed.
ROD:
Right.
BEN:
I think itâs important to, like if youâre sitting there staring at the screen and youâre waiting for the screen to load content like if you hit the Back button to cancel current requests so that the user is no longer interested in whatever data that was. So we should stop spending any system resources trying to go get it.
STEVE:
Yup, that seems like a wise advice. Specifically, at Reachability, Iâm not sure that any packets actually go out on the network when you configure Reachability. I think itâs all based on the routing table so when you get a cellular connection, iOs, at a very low level at a route that knows how to get to the internet through that cellular connection. So Reachability is very much a theoretical like âI believe I had a route that I can use to reach a given host, or I donâtâ, but there is no guarantee that the server is up or if thereâs something along the way that would keep the packets from getting more than you need to go. So itâs a very much sort of a preflight check, but thereâs no guarantee itâs going to succeed. So if bytes are dribbling over an extremely slow connection, then Reachability should still tell you that you have a connection because you do. The question of whether or not itâs fast enough for the purposes that you have is really, I guess ultimately, is up to a user.
BEN:
Yeah. And the user I can tell whether or not theyâre getting a good connection because the Network Spinner at the top will actually slow down depending on whether or not youâre getting a fast connection or a slow connection.
CHUCK:
Do you ever just give them like the blatant button that says, âIf it takes too long to load, do you want to keep waiting or do you want to move on?â Or, do you just do that for them and intelligently decide to try again and let them know that itâs not working?
STEVE:
I think it depends on your app. I think itâs probably the same WWDC Session from a couple of years ago that the advice they gave at the time, which I think is really sound advice, is âYou donât know the situation that your user is in.â They could be in an elevator, they could be coming out of a tunnel; you just donât know the situation there. So really, if you can give your user the choice to either continue to let a connection proceed or a template proceed or to cancel it or to retry, being able to make those decisions in your app, you never really know what your user wants. So giving them the control to retry and to cancel is often the best choice because only they know the situation that theyâre in.
CHUCK:
Yeah, that makes sense. So do you just assume the screen should load within so many seconds or milliseconds and then give them a button that says âMove onâ? How do you usually handle that?
STEVE:
I guess it depends on the app. A lot of the apps Iâve done lately, the networking tends to be sort of a background thing so the user isnât explicitly telling it to go do stuff; it tends to be more like data is getting created and itâs getting the stuff into a Core Data store or database somewhere. And then later on, when time permits and the network is up and available, Iâll try to sync that up to a server somewhere. But if itâs something else like a newsfeed and then app or something, itâs some way to pull the Refresh maybe like in Twitter clients, or a button somewhere that lets you cancel. It just really depends on the app.
PETE:
I think thatâs a really good point. This isnât me being smart, itâs me listening to someone else being smart, but someone was saying that you should really change the way that your axis based on whether itâs an intentional action or a kind of a background thing. Like if youâre loading in the background and thereâs a bad connection, all of a sudden you say to the user while theyâre in the middle of doing something else, âHey, the network is down!â Itâs like, âI donât care right now, thank you.â But if the user is explicitly down to pull to refresh, then you want to show it that youâre doing some loading and you want to tell them that their explicit action has failed.
BEN:
Amen.
STEVE:
Yup!
JAIM:
And you donât want to be reading like halfway through an article and say, âYour network is down,â like, âI donât care right now.â
PETE:
Thatâs my pet â absolute most irritating thing about my iPhone is when Iâm halfway through, Iâm like using the iPhone and Iâm scrolling for something, and that freaking WiFi notification comes up and says, âThereâs 17 locked private WiFi networks near you. Would you like to try and go one a night,â and I accidentally tap on one.
[Laughter] [Crosstalk]
PETE:
Yeah.
BEN:
Thatâs like the first thing I turn off.
PETE:
I donât know whyâŚIâm going to turn off right now. [Laughter]
JAIM:
That happened to me driving to a neighborhood once. Iâm like, âWhat?â
PETE:
It happens to me all the time.
BEN:
[Chuckles] You got to be useful for about 4 seconds.
PETE:
You know what, though, itâs useful for finding out what buses are nearby. The Google Bus always shows up on my WiFi â itâs the GBus. So maybe I will turn it off.
CHUCK:
Itâs always fun looking at the WiFi in my neighborhood and trying to figure out which neighbor is which WiFi.
ANDREW:
There is some terrible WiFi networks around here like names that are horrible.
CHUCK:
My favorites are Linksys and Netgear⌠[Chuckles]
CHUCK:
I love those WiFi networks.
ANDREW:
Yeah, Iâm not talking about that [chuckles].
CHUCK:
[Laughs]
PETE:
I know the kind that youâre talking about; there are some of those near my house, too. [Laughter]
PETE:
Me and my kid are going to have a conversation as soon as he gets his first iPhone. [Laughter]
CHUCK:
So what are some of the gotchas with networking that you guys run into? Weâve talked about some of the connection issues, are there other gotchas that people mess up?
STEVE:
Oh, yeah [chuckles].
BEN:
I think I was talking about cancelling request; I think this is one of the reasons why I really like AFNetworking because itâs built upon NSOperations, and NSOperations can be inherently cancelled. So if youâre just using like an NSURLConnection that use one of the black based ones, thereâs no cancelling that request as far as I know. And I would say another anti-patternsâ probably any use whatsoever of NSString stringWithContentsOfURL. What do you guys think?
ROD:
Any other contents with URL. [Crosstalk]
STEVE:
Well, if thereâs a bunch of them, too.
ANDREW:
I think the first day I started trying to write Cocoa, I wanted to pull some data from the web and I use that NSString stringWithContentsOfURL and I was just amazed of how easy it was.
BEN:
I know. Itâs so easy and so tempting to use it.
ANDREW:
[Laughs]
BEN:
But every time I see it, Iâm like, âThere is just literally no good use case for it.â
ANDREW:
Right.
BEN:
People will be like, âWell, Iâm just going to dispatch async and then do it.â But you have no failure callback, you have no progress, you have no cancel, like I really canât think of a single use other than itâs easier.
ANDREW:
And even then youâve got that queue tied up waiting for your synchronous request for no reason. [Crosstalk]
ANDREW:
Right. And NSURLConnection has synchronous request support anyway. So if you really truly want to be the synchronous request if itâs â
BEN:
I think if it was literally like you have to only do this once, then you should probably look into the GCD barrier blocks so that you can still have async, but nothing else runs during that time. I havenât personally had a need for that, but the GCD WWDC video talks about barrier blocks, and that seems like it would be a better use case so youâre not tying up a queue for any period of time.
ANDREW:
Right. And if youâre using AFNetworking or some other NSOperation base system, you can set up the tendencies between blocks that way, too, or between operations.
BEN:
Maybe this is a topic for a future show, but the whole NSOperation dependency stuff, Iâve never found a use for that. Do you guys use that a lot?
ANDREW:
Yes, Iâve used it occasionally.
BEN:
One of the things I would say â Iâm trying to think of a good example we can maybe describe the scenario â but once this thing is done, then I want to do this other thing. One thing we do in DeliRadio is like if you use *Band and youâre not logged in, then we prompt you to log in or sign up, but we carry along a block or what to do when that sign up is finished so that we can * it once you have signed in. I think that that might be a good use, but we just retain the block, pass that along with the operation, and if that block is present afterwards, we execute it. So Iâm wondering what are maybe some benefits of doing the dependent operations; does it get scenario where I should have looked at using dependency?
ANDREW:
It seems like what you just described sounds reasonable for me. But one place Iâve used it is we have a bunch of concurrent operations that are quite CPU intensive and also have a network request components. So they do a bunch of work on the CPU that takes a long time, and then they take that data and do a network request and get some data back, and then youâre done. And the data that they get back, it wasnât to a Core Data database, and we want to save as soon as theyâre all [unclear] or as soon as a certain number of them are done periodically. So we set up an operation to save the Core Data store; I see dependency of those operations.
BEN:
So like the input of one of those jobs depends on the output of the first job, right? So once youâve downloaded the file, then you want to process the file, and then you want to save it or something like that.
ANDREW:
Sure.
BEN:
Why wouldnât one operation just throw like a delegate callback and then whoever is handling that would then queue up the second operation? Because it seems like if one of them is dependent on the data from the first, then queuing it up, youâd be queuing up an operation that canât run because you donât have the data. Iâm wondering how you even create it.
ANDREW:
Actually, the operations Iâm talking about to do that entire thing in a single NSOperation; they do the local processing, network request, get the data back from the server, and put that in Core Data.
The only thing I was saying we make dependent is the calling save on the managedObjectContextâŚ
BEN:
Oh, okay.
ANDREW:
And we sort of [unclear] thereâŚ
BEN:
So theyâre already kind of decoupledâŚ
ANDREW:
Right.
BEN:
Alright. Sorry for that little drive on NSOperations.
ANDREW:
I actually wanted to hear Steven talk a little bit about AFNetworking and if there are any other libraries. I think somebody asks question, but it really didnât get answered other than Reachability, but do you use AFNetworking or other third-party networking libraries? If so, what are the advantages? If not, why not?
STEVE:
I do use AFNetworking. At this point, I think itâs pretty much the undisputed king of the hill in terms of third-party open source networking libraries. I still use NSURLConnection directly for pretty simple things like if I only need to fetch, say, one or two URLs to grab some data dead apps start, I typically wonât retry AFNetworking just because the needs are so simple. But if Iâm integrating with an API or anything on the backend that I need to do more stuff with, then AFNetworking is just the obvious choice. Itâs so well-supported at this point; itâs so well-tested that itâs another one of those things where if I can use a chunk of somebody elseâs code and have a very high confidence that it works and it does what it says it does, then one last thing I have to think about.
JAIM:
Do you use any other libraries that kind of build on AFNetworking like a RESTKit or something like that?
STEVE:
I donât. I looked at RESTKit once a while back, and I forget why, but it didnât seem particularly appropriate for my needs at the time. A lot of times, Iâm sending in and consuming JSON data, and in the past, Iâve written a couple of categories thatâs in NSManagedObject that will take care of serializing attributes from a Core Data object into something for JSON and then back. Thatâs done the job pretty well. But I know thereâs RESTKit and then there was something â I canât remember what it was â but there was something objective resource maybe I want to say. There was something a few years ago that they would integrate with Railsâ backend specifically so it fall all at the same naming conventions and weâd sort of just make everything magically hook up with very, very little effort. But I havenât used any of that stuff myself recently.
BEN:
I spent a little bit of time learning RESTKit and I did 3 NSScreencast episodes on it. At the end of it all, it kind of appreciated some of the little pieces involved, but what is required to take advantage of those is really confusing. Going back over that code, itâs no longer obvious why certain things were done. I donât know. I think there are pieces certainly that could learn from. I think the mapping is really, really powerful so you can like flatten hierarchies of JSON into like a differently shaped NSManagedObject, but I probably wonât ever use it in the shipping app.
JAIM:
I found that documentation kind of very powerful once you understand it, but easy to forget what those things do.
BEN:
One of the largest entry point into NSScreencast is in terms of searches because thereâs no documentation so thereâs like a Stack Overflow question like, âAnybody using RESTKit, too?â and like tons of traffic coming into that episode because Iâm apparently the only resource of RESTKit, too. I had to figure all that crap myself, which was frustrating without any documentation. So a lot of people email me asking questions about RESTKit, Iâm like, âI am not at all an expert. I just figured out enough to cover the topic.â Anyway, itâs interesting that itâs kind of a useful idea. But in practice, I think itâs too complex.
JAIM:
Yeah. And they can put to change the API perform version 2. So most of the stuff that you see on the Stack Overflow is not quite up to date, and almost useless.
STEVE:
That is frustrating.
CHUCK:
Yeah, but if the API gets better, then I guess you can argue whether or not the tradeoff is worth it.
JAIM:
Yeah. I used it heavily on my last project, and it was very powerful; once you kind of get the corks, I could wire up a new end-to-end point in like 20 minutes and itâs ready to go and it got my JSON objects, and I can go. In that case, once you kind of figured it out, it worked pretty well.
CHUCK:
So do you guys do much logging of network request in response, or only in the context of having to debug something?
STEVE:
I constantly. One of the things about networking that makes debugging such a frustrating experience at times is that we test things in our desktops, in our WiFis, in our offices, and then we get out in the real world and things are very different. Itâs not even a series of steps. If a user in the field has a beta version of our app or even a production version and they say, âI did this, this, and this,â and you can do that network just fine, itâs because where they were, their network was a little wonky, and a request failed and we didnât handle it properly, thatâs why theyâre having problems. So I found that logging is critical to debugging those kinds of issues.
BEN:
Yeah, but you probably shouldnât ship with your NSLogs visible because anybody could just plugin their phone and see request and response. Not that itâs really difficult to get at it for like a determined individual, but certainly, you donât want to make things that blatantly obvious of how your API is talking to the server.
STEVE:
Yeah, thatâs true.
BEN:
So I usually conditionally compile those out in Release builds.
ROD:
Yup, I do the same thing. Yeah.
STEVE:
Depending on the app, if itâs a mass market app and youâre talking about hundreds of thousands of downloads, then obviously, your support gets trickier. But if youâre building an app for business customer and you can shift somebody from an App Store version to an Ad Hoc version, then you can Instrument the build and get a lot more information out of it.
BEN:
Have you guys looked at Runscope at all? Itâs a complete path through a proxy of your own API; it will forward all headers and whatever else parameters to the real API, but log and provide instrumentation metrics and whatever so that you can see whatâs going on out in the field. That kind of gives you that same approach; you can inspect or request some responses.
STEVE:
What was that called?
BEN:
Itâs called Runscope. If you had an API kind of like myAPI.com, then you would be myAPI.com.runscope.com; itâs complete passer; itâs really pretty cool technology.
PETE:
There goes one of my picks.
[Laughter]
BEN:
Iâm really good at this game.
PETE:
[Laughs] Yeah.
CHUCK:
[Laughs]
PETE:
Would you use Runscope in kind of in production, the shipping app?
BEN:
No, I will definitely not. I like the idea and I would love to see the data, but youâre completely dependent upon their uptimeâŚ
PETE:
Right.
BEN:
I donât know. Iâve chosen dependencies like AWS for instance or Heroku, and they go down or whatever. But those are kind of conscious decisions that I make and the more of those types of like kind of massive dependencies you have on uptime. What if your app became as popular as Angry Bird, all of the sudden, they have to have the scaling to support that? I donât know what their pricing models like, but theyâd probably want you to not run it in production.
PETE:
Because theyâre paying for all the backworks, right?
BEN:
Yeah.
ANDREW:
Price.
BEN:
Yeah. Maybe they just charge you enough to support that. But I donât know. I know one of the founders and heâs a really smart guy and Iâm sure theyâre up to the task of scaling it, but you want to be in-control of your own destiny. So I think for an Ad hoc build, definitely; but not for a shipping app.
[Crosstalk]
ANDREW:
Privacy concerns are there, too. You wouldnât want to rat all your API calls and responses through somebody else if you didnât have to.
BEN:
Right. Iâm guessing theyâve got to have some sort of way of saying, âWell, this time of parameter, I donât want you to log.â Unlike Rails for instance, it automatically filters out fields that are called âPasswordâ because you donât want that stuff to be logged in. Iâm guessing they have something similar to that so that you donât log secrets.
CHUCK:
What is your Social Security number?
BEN:
[Laughs]
CHUCK:
What is your bank account number? What is your motherâs maiden name? Be back in a minute. [Crosstalk]
BEN:
That practice of like bank saying, âWhatâs your username? Let me show you an image that you picked along with a phrase,â I have no idea why they think thatâs secure. That bugs the crap out of me because I were to be the spammer, I would just set up a page that looks just like it, you would type in your username, and Iâll be like, âOkay, hang on one second and let me go that page,â login as you. I donât know.
CHUCK:
Download the image, yeah.
BEN:
Yeah! It bugs me! Itâs just like you could justâŚanyway.
ANDREW:
Yeah, itâs like secret questions; theyâre not really very secure.
CHUCK:
Yup.
BEN:
Most of them are public info anyway.
ANDREW:
Right.
CHUCK:
And you can socially engineer your way into the rest of the room.
JAIM:
So Steve, for a long time, most of what weâve talked about network is like streaming media, or itâs getting data over HTTP either with XML or JSON, but I started doing like heavy data stuff; weâre pretty more low-level sockets â TCP, UDP, that kind of thing. Is there any use for kind of the different networking technologies for todayâs app developers?
STEVE:
Absolutely. Most of what we do, we are talking about talking to web services so HTTP works just fine for that. But if you were to sit down and write a multiplayer game or build another mail client or something like that, then none of the NSURLConnection stuff or AFNetworking helps you at all because theyâre designed to talk at web servers. So Apple has given us â we actually still have access to that Rob Berkeley sockets through Foundation Networking so weâve got NSString and then thereâs the CFString counterpart, and thereâs CFSockets; we can still do all that stuff if we need to. Itâs not nearly as nice as NSURLConnection is; you still have to push and pull all the bytes yourself. With the low-level stuff, if you tell it âWrite a thousand bytesâ, it may come back and say, âWell, Iâm done, but I only wrote 500,â so you have to buffer the rest yourself. So itâs not nearly as user friendly, but they definitely give us the ability to still get down to that level if we need to. And then actually GameKit introduced some pure-to-pure networking stuff that if youâre just talking about devices in close proximity, thereâs a whole API that lets you discover other devices that are running your same app, and you can get them to join a session and then you can send data packets back and forth among of the peers, and itâs really easy to use. I think in iOS 7, that work basically getting that, but rebranded under this multi pure connectivity, so it seems like itâs mostly the same API with some new additions, but the same sort of âI want to be able to discover and talk,â without actually having to dip down to the socket level. I used that a couple of years ago to do some rudimentary syncing in an iOS app, and it was great! It made that job fantastically easy compared to doing the raw sockets myself.
JAIM:
You know what protocol that uses under the hood?
STEVE:
I believe it uses either TCP or UDP, depending on whether or not you tell it that you want a reliable transmission or not.
JAIM:
Okay.
ROD:
Has anyone used WebSockets? Or, was that kind of the same thing?
PETE:
WebSockets is not the sameâŚWebSockets is like trendy people rediscovering UDP. [Laughter]
STEVE:
Well, not quite.
PETE:
That was like instantly triggered my annoyance at WebSockets. WebSockets donât scale just like Rails. [Laughter]
JAIM:
We need [unclear] DBE WebSockets.
STEVE:
I actually just [unclear] WebSockets in a production app right now, and itâs working pretty well for the use case.
PETE:
Thatâs good [unclear], whatâs the use case? Maybe I can have someone that has actually used them to tell me one big irrational.
STEVE:
The use case that weâre using it for is we have an app that communicates to a backend and data can change on that backend in lots of different ways, not just through a single instance of the app. So you want to be able to get that data up to date on the app, but I didnât want to have to build the app to constantly be pulling because the load on the server would scale up pretty fast as the app got popular. So WebSockets, and Iâm actually using something called âfayeâ on the backend. WebSockets allows the app to make a single connection to the server that just stays up forever. And then as the server gets new data coming in from other sources, it can push that data down to the client through that WebSocket connection, and keep the client up to date so I can have a piece of data change on the server and it shows up in the app within a second; itâs really great.
PETE:
Presumably this is a web app, not a native app?
STEVE:
No, itâs a native iPad app, but then there are other ways to inject it into the backend that thereâs a web component, thereâs iPhone and Android components, so data can feed in a lot of different ways.
PETE:
Interesting. Has anyone of you using WebSockets on a native with a non-web browser client.
JAIM:
I think there are some libraries that do it with WebSockets for iOS, I canât remember what they are.
ROD:
Are they socket level? Or, are you using some kind of HTTP to do that?
PETE:
WebSockets is technicallyâŚis it technically HTTP or is it not HTTP, thatâs confusing to me.
STEVE:
Itâs initiated over HTTP and then I believe it uses some sort of â itâs kind of like more esoteric part of the HTTP spec where you can tell the connection to shift into a slightly different mode. So they kind of shift it from HTTP into something else. At the level Iâm using that out, actually Iâm just jamming based on down the pipe from the server of client. Technically, itâs by directional.
PETE:
That use case of warning to have a connection open so that you can instantly update all of your clients when something changes, it makes sense to me. The thing that doesnât make sense to me quite so much is having a connection open to every single client. That means (a) youâre going to run out of connections pretty soon if youâre using Ruby, and (b) website due to the battery life of the client.
STEVE:
So this particular application, itâs designed that the iPad would be sitting in one place for the most part. So the theory is that it should be plugged in because the app is designed to be used for 6+ hours at the time.
PETE:
That makes sense.
JAIM:
So socket rocket is the Objective C library for WebSockets.
STEVE:
Yeah. Then another thing called âFayeObjCâ that it didnât use socket rocket originally. The thing it did use, itâs sort of not been maintained so I forked it and Iâm using socket rocket now on my fork. Itâs great and it just works fabulously well. I think weâve had it in production for like a year or 1 ½ now and we havenât had a single problem with that component.
CHUCK:
Cool. Looks like that one is written by square. Any other questions or comments or bits of wisdom you want to share about this before we get into the picks?
STEVE:
I guess the only thing I wanted to mention is thereâs an interesting list of the fallacies of distributed computing that I always talk about when I do this â I do a networking talk for CocoaConf â and itâs something that was I think originally drafted up by somebody at Sun, I believe but Iâm not sure about that. Itâs an interesting read of like all the things you may assume going into building a distributed system, and really were apps that talked to web services. Well, Iâll send the link out. Itâs an interesting read to go through and just really to fundamentally understand how evil and how dangerous the network environment is when we sit down to use it.
CHUCK:
Awesome. Are you going to be speaking at any CocoaConfs coming up?
STEVE:
I am. We have another CocoaConf here Columbus in a week and a half. I think this would be the third one CocoaConf. I believe it originally started here in Columbus and theyâve come back the last 2 falls so weâve got another one coming up. But Iâm really, please, that Apple listen to my please to release iOS 7 so that I can talk about some new stuff this year.
CHUCK:
Awesome. Alright, well, letâs go ahead and do the picks then. Andrew, why donât you start this off this week?
ANDREW:
Sure. I have 2 picks. The first is kind of an article, itâs really a summary of some other peopleâs stuff by Michael (I donât know how to say his name) Tsai about possible performance implications of using art. I just thought it was interesting because I think the line from Apple and the general has spent that ARC â among its many other benefits can produce performance improvements and this is sort of counterpoint to that. Itâs just an article called âARC vs. MRC Performanceâ. I think anyone, even the people who are bringing this up would say itâs not a reason to ditch ARC â there are a lot of benefits to ARC â Iâm not saying that, but I just thought it was interesting to know about. Then second one is actually an article on the verge about Siri and sort of the history, and the girl in that Siri, âMachine learningâ but natural language processing that I thought was interesting. I donât know if too many people know, but Siri actually started â Siri was an app that was on the App Store before Apple bought it and that was a project from the SRI, Stanford Research Institute. Itâs surely interesting technology and an interesting history of the company, and how does she learning language processing in general. There you go.
BEN:
Is Siri still in beta?
ANDREW:
No, itâs officially out of beta as of tomorrow, iOS 7.
CHUCK:
Who do you think they are, Google?
ANDREW:
[Laughs] Yeah.
BEN:
Well, when they launched it, it was 6 there like, âYeah, itâs in beta.â
ANDREW:
Well, iOS 5.
ANDREW:
Oh, yeah. Itâs been a long time, and it was kind of weird because Apple doesnât really stings at their beta. But Siri did.
ROD:
Yes, no longer on the web page; no more beta.
BEN:
Maps certainly didnât have the beta moniker at all.
CHUCK:
[Laughs] Are you crying about that?
BEN:
Perhaps. I live in Houston and it was pretty darn accurate here, but I recognize that other places were not so fortunate.
CHUCK:
Yeah, the maps on my iPhone got me lost a few times. Ben, what are your picks?
BEN:
I have 3 picks today. One of them client came by the office and dropped off a package of hue light bulbs, the âPhillips Hueâ theyâre WiFi enabled then you can change the color and color temperature and saturation and brightness, and itâs got a programmable API. They said âDo something cool with it,â so I grabbed the âhue gemâ by Sam Soffes and I had to modify a little bit to use UPnPâs assess DP simple service device protocol or something like that in order to discover the bridge IP address of the unit. Once you do that, you can just use the command-line to set the color, temperature, or whatever. We hooked this up to our Jenkins build so now we have like a deep-rich-red lamp when the build is broken, which is pretty awesome.
ROD:
Or make it green one; breaking band is on or something. [Laughter]
BEN:
We have 2 others weâre trying to find GUIs for them. Theyâre a little pricey, but itâs pretty fun. Itâll only take an hour or so to get it up and running with a Ruby API. So that was pretty cool. And then my last pick is âCopyPasteCharacter.comâ. If you are looking to paste like the Alt symbol on the Mac or the Command symbol or some of these other symbols that are not frequently used or easily accessible on your keyboard, you can go there and just copy and paste it from that site.
CHUCK:
Awesome.
ANDREW:
Thereâs also a â if I can rift off that a little bit â thereâs also kind of cool little web app that was written by Neven Mrgan, the designer of Mechanic, called âGlyphboardâ, sort of similar thing. I donât know if it has the Alt symbol, but itâs meant to be an app that you add to your iOS homescreen so itâs one of those rare made it looking web apps for iOS.
BEN:
Yeah, thatâs cool.
CHUCK:
Nice! Jaim, what are your picks?
JAIM:
My pick today is a âLawyerâ or âLawyersâ in general. [Laughter]
JAIM:
I used to be of the opinion that lawyers are like hand guns; you donât really need one unless the other guy has one. But I found them, especially if youâre independent developer like me, so you have someone on your court and your side that can look over things before you sign them, and Iâm finding out that they can be very valuable and keep you out of a lot of trouble. So rethink your possible opinion on lawyers.
CHUCK:
So true. Pete, what are your picks?
PETE:
I had one pick that someone stole from me⌠[Laughter]
BEN:
Sorry.
PETE:
I wonât name names. So âRunscopeâ is going to be one of my picks, weâve already talked about that. And I was at Tech Ranch last week and a very cool stuff up there â actually itâs really cool [unclear] called âEstimoteâ. These guys are making these little i-beacon things â have you guys heard of i-beacon?
ROD:
Yes.
PETE:
Itâs this low-powered Bluetooth thing that is coming out in iOS 7. I never even heard about it until I saw these guys. Itâs a really cool technology, you can get this developer kit from them from $99 box which includes 3 little Estimote things which are made of soft silicons so theyâre very fun to fundle while youâre talking to the guys at Estimote at their booth, a little side bar. My third pick is a beer pick; Iâm going to pick âAcme Pale Aleâ from North Coast Brewing. It is very good. Almost every beer from North Coast Brewing is very good, but the particular one Iâm going to pick this week is Acme Pale Ale. And then my last pick is a game called âXCOM Enemy Unknownâ.
BEN:
Yes.
PETE:
Yeah. If youâre at my age, then you may have played the original version of this, which came out like 10 years ago or 20 years ago, long time ago. They basically remade the game; itâs almost the exact same mechanic, the same awesome game, but with awesome graphics using unrail, something rather graphics. So itâs like awesome 3D graphics, but the same original game. Itâs like, in my mind, the perfect game remake where you have all of the fun that it actually is you have kind of hazy memories of what the graphics look like or actually in hearts into like awesome modern graphics artist. So XCOM Enemy Unknown is my next pick.
BEN:
Youâre playing that on the iPad? Or, on the Mac?
PETE:
I got a new work laptop so I have this tiny little 11â MacBook which I use for all of my work and no one believes me, but I really do. And then I got this like big honking MacBook Pro with rest in the display from my company, the only thing Iâve used it for is playing XCOM. [Laughter]
CHUCK:
Nice.
BEN:
I bought XCOM on the iPad and itâs nice. I like the touch controls, but itâs not quite as fluid as I would expect an iPad app to be. The other thing is itâs not very friendly to just like quitting out and doing something else because you actually have to save your game, which I thought was really weird.
PETE:
Yeah, thatâs weird.
BEN:
I bought it; it was like $20 on the iPad. I guess itâs the same on the Mac App Store or at Steam.
PETE:
Itâs like more expensive on Steam.
BEN:
But it is definitely fun to play; I just wish it was more like friendly to the I-have-to-go-do-somethinglet-me-just-quit or multitask or whatever.
CHUCK:
Awesome. Sounds like fun!
PETE:
It is.
CHUCK:
[Laughs] Alright, Iâve got a couple of picks. My first pick is another shameless self-promotion; Iâm going to be speaking at âRubyConfâ this year. So if you want to learn about some Ruby and enjoy some Miami Beach, then go sign up at RubyConf.org. While booking the trip, I actually was looking at âAirBnBâ, and I found several places that are whole lot cheaper than a hotel. So Iâm going to pick them as well. Iâve used them once or twice before, and I always had a good experience with it, so AirBnB.com is my second pick. My last pick is more along the lines of marketing and business. Thereâs a fellow out there named Michael Hyatt, he has podcast called This is Your Life, but he also has a paid membership site called âPlatform Universityâ because he wrote a book called Platform. It talks about building your platform and using it to make sales for business and things like that. I highly recommend it. He just raised the price to $30 a month, but itâs well-worth every penny. You can get that at PlatformUniversity.com. Steve, what are your picks?
STEVE:
I have 2 picks. The first one, Iâm going stick with the theme of the show and itâs âLittle Snitchâ. Little Snitch is a little application that you can install on your Mac that will actually monitor outgoing network connections. Itâs kind of got 2 menus for me. The first is that Iâm naturally curious and I like to know what other apps are trying to do on my machine behind my back, so this actually tells me and it gives me the option to block or allow kind of consoling app by app basis and then to a particular host. The other useful that I have for it is that, since I also do a lot of Rails backend work, itâs very handy for actually speeding up integration test because I can actually block outgoing connections to things like a W tight kit or edge fonts so that itâs not bothered and actually going pull that data across for a test that doesnât need to use it. That was my first one. My second pick is not computer-related, and itâs âUptonTea.comâ. Upton Tea is a tea company. I sort of back the trend on coffee and nerds because when I first started working in the Valley about 15 years, maybe more, startup companies bought decent coffee, but almost nobody there seem to know how to make it properly. I found that loose leaf tea was a much better way of getting my caffeine fixed without having to drink something that was brewed by someone who didnât know what they were doing.
Thatâs my second pick.
CHUCK:
Awesome. Well, thanks for coming on the show Steve, it was a pleasure to have you and â
ROD:
Donât forget my picks.
CHUCK:
Oh, did I not let you go, Rod?
ROD:
Nope.
BEN:
Burn.
CHUCK:
[Laughs] Rod, what are your picks?
ROD:
Alright, my first pick is a talk around across the internet called âClojure: Enemy of the Stateâ and itâs about how functional programming teaches data, treats data, and how to mutable versus [unclear] and all that stuff. Itâs the first video that kind of let me see how the functional approached the data might be better than the object during end approach. So I found that very interesting. My second will be âmyselfâ. Iâm looking for full-time work or contract work in Salt Lake or if youâre open to remote work anywhere. So thatâs it.
CHUCK:
Alright. Now weâll wrap up the show. Thanks for coming, Steve.
STEVE:
Thanks for having me.
BEN:
Yeah, thanks!
CHUCK:
Alright, well, weâll look forward to show next week!

022 iPhreaks Show â Networking with Steve Madsen
0:00
Playback Speed: