You Have to Know When to Stop

Episode 97 • Released December 26, 2014 • Speakers detected

Episode 97 artwork
00:00:00 Casey: So, John, I may not talk to you before your birthday, it sounds like.
00:00:04 Casey: So if I don't, have a happy 40th, sir.
00:00:10 Marco: Can we make that the beginning of the show, please?
00:00:12 Marco: Absolutely.
00:00:12 Marco: Is it a secret that you're turning 40, John?
00:00:14 John: No, I don't think so.
00:00:15 John: It's crappy, though.
00:00:16 Marco: If we need to talk about something, I both bought my first iPad in a while and have a new opinion on the iPad.
00:00:26 Marco: I also did something in a new programming language for the first time in a while.
00:00:30 Casey: Okay.
00:00:31 Casey: I am...
00:00:32 John: genuinely oh yeah i saw your i saw your tweet tantrum about php yeah yeah i i genuinely want to hear about this so let's put that in both of them actually so let's put that right you can even write them in the notes to remind us that's exactly what i was going to do not you marco well naturally i won't do it you need to i'm coughing too much i gotta keep my hand on the mute button i was coughing a little bit last night and i was like is it possible to catch it i i blame i blamed you like somehow you transmitted this to me over the internet
00:00:59 Casey: All right.
00:01:00 Casey: Do you want to do some follow-up?
00:01:01 Marco: Do we have any follow-up since we last recorded two days ago?
00:01:04 Marco: We should point out also we are recording this show almost a week in advance of when it's going to likely be released.
00:01:10 Marco: So please pardon us if anything we say is out of date or if we miss some giant news that for some reason happens during Christmas week.
00:01:17 John: And the last episode was just released, what, yesterday, right?
00:01:19 John: So we've only had like one day to accumulate follow-up, but we got two items.
00:01:25 John: All right, so the first one is from S. Mike Lewis, unless that S is his typo and his name is actually Mike Lewis.
00:01:31 John: Maybe his name is Smyke Lewis.
00:01:33 John: Yeah, could be.
00:01:34 John: The Super Mikey.
00:01:35 John: On Twitter.
00:01:37 John: He pointed us to an article from this summer, actually, and I remember hearing about this at the time that Google is going to start taking HTTPS into account for their search ranking.
00:01:47 John: So they will give you a slightly higher rank if your site is SSL.
00:01:51 John: They said it's not going to be a big boost and it should only affect fewer than 1% of global queries.
00:01:58 John: But they're trying to encourage sites to switch from HTTP to HTTPS.
00:02:01 John: And this is exactly what we were talking about last show about marking things as secure, insecure for customers.
00:02:09 John: Instead, I was suggesting that
00:02:11 John: They need to work on the people who own the websites.
00:02:14 John: And the best way to do that, this is a great way to do that, to hit them where it hurts.
00:02:16 John: Hey, we will ever so slightly hurt your search ranking if you don't use HTTPS.
00:02:20 John: So suddenly having a secure server becomes something that every SEO person says, oh, you just got to do that.
00:02:27 John: You get that extra whatever percent boost.
00:02:29 John: And anyway, yeah, this is a using their power for good instead of evil, I think.
00:02:36 Marco: The best part is they don't have to actually ever change it.
00:02:40 Marco: All they have to do is say, we will probably change it starting on this date.
00:02:44 Marco: Because SEO is all based on some evidence and mostly intuition and guessing and outdated information and all sorts of voodoo and BS that is common wisdom or everything else.
00:02:58 Marco: So...
00:03:00 John: so yeah they don't have to actually d rank or plus rank anything they just have to say they will and that's that's enough and they said it's going to be like a lightweight thing was these are these quotes from them uh less weight than other signals such as high quality content in terms of the search ranking but they also said they may decide to strengthen the signal because they want to encourage website you know so they're threatening to like this oh it's only gonna be a small effect you know that's to not scare people who you know are worried that they need to get a sell right now but they said but we may decide to strengthen i mean they can do whatever they want like
00:03:29 John: They could change their search algorithm to favor whatever the hell they want.
00:03:32 John: If it doesn't work for customers, that'll be bad.
00:03:34 John: But website owners will do whatever it takes because Google is still pretty much the only important game in town when it comes to website search.
00:03:42 Casey: So let me ask a genuine question.
00:03:44 Casey: For a website like mine or either of yours where there's no interactivity, it's just a series of pages and there's no forms or anything like that, what's the advantage of going secure?
00:03:55 Casey: What is going to get snooped?
00:03:57 Marco: Well, there are a handful of privacy advantages to it.
00:04:02 Marco: I think one of the biggest... Is it still the case, chat room, that HTTPS pages don't serve referrers when you link out of them or into them?
00:04:09 Marco: I forget.
00:04:09 Marco: I think there's no referrers data, which is annoying for analytics packages, but I don't know if that's out of date.
00:04:15 Marco: But anyway, I think it's mostly... There are some benefits here, but for pure content sites like blogs and everything, I think the benefit is pretty small.
00:04:27 Casey: Right.
00:04:27 Casey: That's what I thought.
00:04:29 John: Yeah, I probably wouldn't do it.
00:04:30 John: Even if they say, oh, your search ranking is going to go down by whatever.
00:04:33 John: Like, I mean, well, it's kind of unfair for me, I think, because no one reads my site and it's small.
00:04:38 John: But like Casey said, there's nothing – there's no login.
00:04:42 John: There's no authentication.
00:04:43 John: There's no cookies on my site.
00:04:44 John: There's nothing related to my site that –
00:04:47 John: would need to be kept from prying eyes and so i probably wouldn't go ssl but that's mostly because it's kind of a hassle and usually costs money and there i mentioned last show about the eff electronic frontier foundations plan to give away uh free ssl certificates to anybody who wants them to try to encourage more people to to uh
00:05:09 John: have certificates and this is other site unless it's the same exact one i don't think it is i again two days worth of follow-up i haven't had a chance to look at this stuff but a couple people said that it's let's encrypt.org and the the tagline says here let's encrypt is a new certificate authority it's free automated and open arriving summer 2015
00:05:26 John: Well, it says brought to you by EFF.
00:05:28 John: Maybe it is that thing that I was talking about.
00:05:30 John: Anyway, if SSL certificates were free and slightly less hassle, I probably would do it because what the hell?
00:05:37 John: Like I can set it up, you know, and and I would probably redirect people to HTTPS.
00:05:41 John: Like, why not?
00:05:42 John: You know, why not get the free tiny Google boost?
00:05:44 John: Why not make people feel slightly better?
00:05:47 John: The only reason why not is because it's expensive and a hassle.
00:05:49 John: And hopefully if they could reduce those down to about the same hassle as, you know, just having a hosting account at all, then I'd probably do it.
00:05:56 Marco: on some level i do kind of uh i'm a little skeptical about the possible effect this might have on smaller self-hosted sites because it's it's now like you know if if there if it wasn't a hard enough battle to be like a self-run self-owned site now you have to deal with oh if you don't have ssl you're not like you're not ranking with the big kids anymore so now it's i feel like in in a small way
00:06:21 Marco: not not maybe not a huge way but in a small way this is going to reinforce like the the mediums of the world and and make it that much harder for so many people out there to to have an independent presence on the web well don't you think it'll just raise the bar like then you know hosting providers like you know the various wordpress blog hosting services and squarespace and stuff they'll just say okay well if that's where the bar is now
00:06:46 John: Then we basically have to kind of like how, you know, Squarespace or whatever, like give you a free domain name and stuff that didn't used to be the bar.
00:06:52 John: You just have, you know, markerarman.edithispage.com.
00:06:55 John: And that felt fine.
00:06:55 John: And it's like, oh, no, I got to have my own domain.
00:06:57 John: And now the hosting provider said, all right, if that's where the bar is now, we'll give you a domain with your hosting purchase and we'll set it up for you.
00:07:04 John: And like, you know, it's all right.
00:07:05 John: Well, if SSL is a thing, we'll set that up for you.
00:07:07 John: Like there's no reason they can't automate going through this, you know, let's encrypt.org or whatever.
00:07:12 John: And just...
00:07:12 John: It makes it harder to be a full-featured hosting provider that provides everything you want, but I think kind of raising the bar for the entire web is the whole point of this, so I don't think it'll be that bad.
00:07:23 Casey: All right.
00:07:25 Casey: So any other follow up about perhaps Google Authenticator?
00:07:29 John: Yeah, this is about them putting the space between the six digit number.
00:07:32 John: A couple of people asked, I didn't mention this, but it's worth addressing because people have this question.
00:07:38 John: What if they put a space between the three digit numbers?
00:07:42 John: And the answer to that is it shouldn't matter because that's another example of like, say, you know, if you're doing some simple task,
00:07:51 John: And you ask yourself for even a moment, what about this simple task?
00:07:56 John: What things about the simple task do I look at to decide whether I did a good job on it?
00:08:00 John: And there's usually very few things.
00:08:02 John: And so if the thing you're doing is showing a number, one of the things you could think about is, hey, it's kind of hard to transcribe a six digit number.
00:08:08 John: Let me split it up.
00:08:09 John: Another thing you might think about if you have a text field that's accepting a six digit number.
00:08:14 John: uh don't worry about spaces like get rid of the spaces you know this is one of this is like perhaps the oldest frustration of web developers in the entire web of the old the websites that want you to enter a telephone number a credit card number anything and they're like please enter digits only no hyphens no parentheses like you must use this format right if you know the yeah or like dates date parsing is a little bar but the credit card numbers and phone numbers are the worst it's like
00:08:38 John: perhaps the simplest programming task possible to strip everything except digits and it's inexcusable both on the client side and the server side not to do that so any web form that tells you write digits only here like immediately you just think that entire website and everyone who made it is terrible and there's no excuse for that so so wait which do you think is worse out of these three options that so like a numeric field that requires a certain format otherwise it'll reject it the ones that don't let you type lumbers is that the next one or
00:09:07 John: a reset button on a form oh i haven't seen those in years or a checkbox that does not have a label set so that you can't just click the label you have to click the actual checkbox that browsers used to do that did you know back in the olden days like even if you did the label for you know id whatever so on and so forth it still wouldn't work that was actually a i remember like preferring i don't remember which one it was this i remember preferring one browser or another because one browser did let you click the label and the other one didn't you know with the same markup
00:09:36 John: did you lose it in all your windows yeah i i think that no i think the uh the one you didn't list is like where it's a numeric field and either it beeps or puts up an alert or just simply doesn't or like back auto backspaces for you when you type anything that's not a letter you ever see those
00:09:51 Casey: No, I haven't seen that.
00:09:53 Casey: My favorite is when you're starting to type a phone number and there's just a blank field.
00:09:58 Casey: And as you start typing, suddenly a parenthesis appears.
00:10:01 Casey: And as you continue to type hyphens appear or even better yet, actually is automatic tabbing between fields.
00:10:09 John: Yeah, when you get to the end of the field, it jumps to the other one, yeah.
00:10:12 Casey: Uh-huh.
00:10:12 Casey: Oh, it drives me nuts.
00:10:14 John: Right, and if you made a mistake, you can't backspace into the other one.
00:10:17 John: Oh, it drives me crazy.
00:10:18 John: People think they're being clever with those, but all those things are hostile.
00:10:22 John: At least the ones that are active show that someone thought about it.
00:10:24 John: They made bad choices, but they thought about it.
00:10:26 John: But the worst are the ones that things are so aggressive that...
00:10:30 John: they're yelling at you for entering incorrect data when it's like just remove things that aren't numbers so i haven't even tested this but i just assume that every place you can type in a google authenticator number thing you can put spaces in it doesn't matter because if that's not true then those applications need to be burned to the ground and i'm assuming it is true because that's just that's like 101 web 101 stuff um so that's why i'm not worried about people typing the space because they should be allowed to type the space it shouldn't be a big deal
00:10:57 Casey: All right.
00:10:58 Casey: Why don't you tell us about something that's cool, Marco?
00:11:00 Marco: I would love to.
00:11:01 Marco: It's our friends, once again, at Backblaze.
00:11:05 Marco: Or maybe you pronounce it.
00:11:07 Marco: It's probably pronounced Backblaze.
00:11:08 Marco: Yeah, I'm pretty sure it's Backblaze.
00:11:10 Marco: All right.
00:11:10 Marco: Backblaze is unlimited, unthrottled online backup for $5 a month.
00:11:16 Marco: Really, truly unlimited disk space and unthrottled meeting.
00:11:19 Marco: They will take your files as fast as you're willing to upload them.
00:11:22 Marco: truly five bucks a month for unlimited space uh per computer of course i got to set a limit somewhere so it's per computer so really backblaze is awesome they have ios and android apps you can access your files when you're on the go uh you can restore files individually or of course the whole thing they'll leave you know they'll do all the options like mail you a hard drive or something if you need to restore a
00:11:43 Marco: um backblaze was founded by x apple engineers and so they respect the mac as a platform and so they their app runs in native code this is not a java app this is not some kind of like weird you know flash or any other kind of runtime it is a real native mac app runs great on every version of mac os that i've had in the last i don't know four years that i've been a customer something like that
00:12:04 Marco: um including on day one yosemite they were there um there's no add-ons there's no gimmicks there's no additional charges really this is truly it five dollars a month per computer for unlimited unthrottled backup and it's so it's just so simple let me tell you i mean backblaze again i've been a customer of them long since long before they sponsored the show since before that we even started the show and i've tried other other online backup solutions backblaze is by far my favorite and let me tell you if you don't have an online backup solution
00:12:33 Marco: Right now, we're going to release this during the holiday week, I think.
00:12:37 Marco: You should really consider giving this to your family if they don't have online backup.
00:12:41 Marco: If you're visiting family over this break, for God's sake, install online backup.
00:12:46 Marco: It is so easy.
00:12:47 Marco: It's so inexpensive.
00:12:49 Marco: And it can save you from a world of trouble.
00:12:50 Marco: Like back when Apple introduced Time Machine, you know, probably all of us nerds had the idea, oh, we'll go visit our parents and we'll set up a Time Machine drive.
00:12:57 Marco: And maybe some of us actually did that.
00:12:59 Marco: But there's so many possible issues with that.
00:13:02 Marco: Backblaze is automatic and it doesn't matter what happens in your house or what happens to your electricity supply or what happens to a single hard drive sitting on your desk that you may or may not remember to plug in.
00:13:14 Marco: It is just automatic.
00:13:15 Marco: It even emails you periodically to say, hey, just so you know, here's our current backup status.
00:13:20 Marco: If it doesn't see you for a while, it'll email you and say, hey, you know what?
00:13:23 Marco: We haven't seen this computer or this disk connected to it in a while.
00:13:26 Marco: It'll back up all your drives that are connected to your computer, external, internal, whatever you want to back up,
00:13:31 Marco: It'll back that up.
00:13:33 Marco: Really, it is the simplest online backup program to use.
00:13:35 Marco: Just install it, and it does the rest.
00:13:37 Marco: Go to backblaze.com slash ATP to learn more.
00:13:41 Marco: That is backblaze.com slash ATP.
00:13:45 Marco: Unlimited, unthrottled online backup for just $5 a month.
00:13:47 Marco: I use it.
00:13:48 Marco: My wife uses it.
00:13:49 Marco: We put it on my mom's computer.
00:13:50 Marco: She uses it.
00:13:51 Marco: My whole family uses it.
00:13:52 Marco: It is amazing, and I highly recommend them.
00:13:54 Marco: Thanks a lot to Backblaze for sponsoring.
00:13:56 John: People ask about this sometimes.
00:13:57 John: You can make Backblaze backup anything you want.
00:14:00 John: I don't know if this is supported, so I'm not going to say that Backblaze recommends this.
00:14:03 John: But it's just an XML file that says which file should be included or excluded.
00:14:07 John: And you can just edit that XML file.
00:14:09 John: So if there are people, a lot of listeners out there who are like, I don't want to get Backblaze because I heard it doesn't backup X.
00:14:14 John: As of right now and as of the entire history of backblades, you can make it back up anything.
00:14:17 John: Like I have my thing back up user local for me.
00:14:19 John: I have a backup slash applications.
00:14:21 John: I have a backup tons of stuff that by default it doesn't do and will sort of, you know, it's hard coded to exclude.
00:14:27 John: It's not hard coded in the sense that you can't change it.
00:14:29 John: It's hard coded and it's not visible in the GUI.
00:14:31 John: But if you just go to the XML file and edit it, you can.
00:14:33 Marco: And the UI has added options over the years.
00:14:36 Marco: There used to be, I think, a 5 gig file limit, something like that, 8 gig maybe.
00:14:41 Marco: You could change that too.
00:14:42 Marco: Even when that was the limit, you could just go change that.
00:14:44 Marco: Right.
00:14:44 Marco: But now that's even in the GUI.
00:14:46 Marco: Now you can even set that to unlimited if you want to.
00:14:49 Casey: So you were complaining about PHP recently, which in and of itself is not terribly remarkable, but you were complaining with a vigor and an angst that I don't recall having seen from you in a long time.
00:15:05 Casey: And I was curious, what was the issue, if you can share, and have you tried anything different or are you still just stuck in PHP hell?
00:15:15 Marco: So remember when the Poodle attack was coming around?
00:15:19 Marco: The Poodle attack was, for those of you who missed it, it was basically one of the many SSL shortcomings and vulnerabilities discovered in the past year.
00:15:27 Marco: And it basically completely breaks SSL v3 so that you really should disable SSL 3 and force people to use TLS.
00:15:38 Marco: That's the gross overview.
00:15:40 Marco: Please research it if you want more details than that.
00:15:42 Marco: It's called Poodle.
00:15:42 Marco: Anyway...
00:15:43 Marco: The problem I had, which I discovered last night when somebody kept tweeting at me saying, hey, my podcast feed doesn't work in Overcast.
00:15:51 Marco: It's not getting updates.
00:15:52 Marco: And they had recently upgraded their SSL Cypher suite and they are serving a podcast feed over SSL because they wanted to go all SSL.
00:16:00 Marco: So, you know, as we were saying 10 minutes ago, that makes some sense.
00:16:04 Marco: Anyway, I discovered through this that my PHP feed crawlers, which are using libcurl and which itself uses OpenSSL somewhere along the line, basically refuse to use anything but SSL v3 and seem to be totally ignoring any configuration flags I pass them to the contrary.
00:16:25 Marco: And doing some quick searching around the web last night and trying to fix this problem, I discovered there's actually quite a lot of people complaining about this problem that
00:16:32 Marco: Like, whatever they're doing with their PHP apps that are using curl to crawl something, they keep breaking under sites that have disabled SSL v3.
00:16:41 Marco: Which is really obnoxious, and basically there is no good fix yet that I can find.
00:16:47 Marco: I'm hoping to find at least a crappy fix in the meantime, but right now there's basically no good fix.
00:16:51 Marco: Like, I basically can't make this work.
00:16:54 Marco: This is not the first problem I've had with PHP's version of SSL as curl using it being totally out of date and being a problem like this.
00:17:02 Marco: Secondarily, Overcast right now crawls something along the lines of 240,000 RSS feeds every few minutes.
00:17:12 Marco: It's doing a lot of crawling of these feeds.
00:17:16 Marco: It does the basic web stuff to hopefully get a 304 response with most fetches, but...
00:17:23 Marco: Obviously, it's still doing a whole lot of network requests and then a whole lot of feeds come back.
00:17:28 Marco: And then I do basic MD5 checking to see if this is actually changed and then decode all the XML and do everything there and so on.
00:17:38 Marco: The feed crawlers are by far the vast majority of the cost of running Overcast.
00:17:46 Marco: They take up almost all the server resources, almost all the RAM, almost all the CPU power on all the servers.
00:17:53 Marco: It's almost all being taken up by feed crawling.
00:17:56 Marco: The actual serving of the application and doing the sync requests and everything is almost nothing.
00:18:01 Marco: It's nothing on the servers at all.
00:18:05 Marco: This is all doing feed crawling.
00:18:06 Marco: To try to solve both of these problems at once, I did an experiment last night.
00:18:11 Marco: I tried writing a basic feed puller in Node.
00:18:15 Marco: What?
00:18:16 Marco: The main problem I have with this feed crawling problem with PHP... You know, PHP is single-threaded.
00:18:23 Marco: You know, it's single-processed, single-threaded.
00:18:25 Marco: The crawlers all run on the... You know, as background tasks, like terminal tasks, being run by Supervisor, which is a great little Python thing, SupervisorD...
00:18:35 Marco: um so it's all being run by that uh and then beanstalk queue manages the whole thing so the beanstalk queue has all these tasks and then these php queue processing processes basically uh are there popping stuff off the beanstalk queue and then reenco or then reencoving things when it's done right now this is running something along the lines of 240 processes simultaneously across i think seven vps's seven uh line of instances and
00:18:59 Marco: So roughly 240 simultaneous consumers making this happen.
00:19:04 Marco: And that's crushing these servers and taking up so much RAM.
00:19:08 Marco: And it's just really, really obnoxious.
00:19:10 Marco: And if this was the best way to do it, I would just suck it up and just deal with the cost accordingly and deal with all that complexity accordingly.
00:19:17 Marco: um but i decided you know what maybe php is not the best tool for this job why is it taking up so much ram and why do you need seven machines to have 240 processes like how big are these processes uh i i off the top of my head i don't know i i think there's something like 40 or 50 megs each something like that but it's um you know it's i think it's under 100 but still
00:19:36 John: but like the math isn't working out like so why can't you have 240 50 meg processes on one machine how much ram is that not a lot and they should it should be even less because if you're forking all the memory from the parent process is shared and the only thing that's different is the pages you dirty during the the child process is doing its work right
00:19:54 Marco: um i'm not doing a fork situation here maybe i should be maybe i look into that right now it's literally just running independent processes all right all right go ahead go so anyway i uh so and this is just you know it's crushing the cpus in the machine cpu seems to be the main limiting factor here not ram ram ram prevents me from running too many of them on one box uh economically but it seems like cpu power is my main limiting factor here
00:20:21 Marco: And honestly, I haven't looked into exactly what the single biggest function is, because PHP is notoriously very hard to profile.
00:20:30 Marco: There's no PHP profiler, not even with the Facebook thing?
00:20:34 Marco: There is one.
00:20:36 Marco: There are actually a couple of profilers, but they all kind of suck in different ways, and they're hard to run in production.
00:20:41 Marco: Yeah, it's kind of a mess, the whole situation with PHP and profiling and debugging.
00:20:46 Marco: Anyway, which is itself a problem, but...
00:20:48 Marco: Anyway, so what I really wanted here was some kind of parallelism that was not just process parallelism.
00:20:56 Marco: There's no reason I need to have a process sitting there, taking up RAM, taking up all the OS overhead of having another process, to just be sitting there waiting for each feed individually that it's processing.
00:21:09 Marco: Now, you can do... The one way you can do parallelism in PHP is you can do curl multi.
00:21:15 Marco: And I actually, a while ago, I wrote the feed crawler to do this.
00:21:20 Marco: And it's a mess.
00:21:22 Marco: It is really not a good implementation.
00:21:25 Marco: That is the one thing PHP can do multiple things at once is you can execute a multi-handled curl resource
00:21:33 Marco: together at once but there's so many issues that the main the main reason is that it's incredibly inefficient because you know you can't you can't provide it a constant pipeline a constant queue saying okay as soon as you finish one add one from this list to it you have to like you know queue up 10 run through all 10 the slowest one will block all everything else
00:21:54 Marco: And then once you've finished all 10, then I can give you more things to do.
00:21:58 Marco: So there's just a whole bunch of little problems.
00:22:00 Marco: Like PHP, again, is really not the best tool for this job.
00:22:03 Marco: I heard Node was good at this stuff.
00:22:05 Marco: And the reason I started looking into Node was because... Two reasons.
00:22:09 Marco: Number one, this GitHub...
00:22:12 Marco: camo project the atmos camo project that i mentioned last week to do an ssl proxy for serving big files that's written in node and i figured i want to at least look into what it takes to host this if i wanted to host it myself because i can do it on heroku but it's probably going to be really expensive and so yeah i want to look into what it takes to host it
00:22:29 Marco: Also, secondarily, I'm a huge fan of the event-driven parallelism kind of model.
00:22:35 Marco: I like that a lot.
00:22:37 Marco: I've seen it work a lot.
00:22:38 Marco: Almost every good web tool these days that scales really well is the event-driven model.
00:22:46 Marco: If you look at Memcache, look at Nginx, obviously Node itself, this is really a very good model.
00:22:51 Marco: And it's very practical for hosting big things like this because...
00:22:54 Marco: You're able to make very, very good use of server resources without risking overrunning them too much.
00:23:01 Marco: I decided, let me see how... I already know JavaScript a little bit.
00:23:06 Marco: I'm not a JavaScript expert by any means.
00:23:08 Marco: The whole thing people do these days with all the crazy prototype stuff and try to force an object system onto JavaScript, I think it's clunky as crap.
00:23:16 Marco: That's more than these days.
00:23:17 Marco: I know, I know.
00:23:18 Marco: Okay, thanks.
00:23:19 Marco: Okay.
00:23:20 Marco: I know Opera did it in the 70s, but it's a terrible language for many things.
00:23:24 Marco: But I wanted to try Node.
00:23:26 Marco: And one thing, this sounds really stupid.
00:23:28 Marco: When I installed Node on, you know, brew install Node, huh, that was easy.
00:23:33 Marco: And then I did a little, you know, console.log hello world.
00:23:38 Marco: I didn't even know that console.log existed in Node.
00:23:41 Marco: I just knew it from browsers.
00:23:42 Marco: Let me see if this exists.
00:23:44 Marco: And I did that, and I ran it from the command line.
00:23:47 Marco: And just running that program on the command line was so freaking fast.
00:23:55 Marco: That is faster than PHP.
00:23:57 Marco: If you do Hello World and PHP, it loads the whole interpreter.
00:23:59 Marco: And it's not... I wouldn't describe PHP as slow before I tried this.
00:24:05 Marco: But once I saw that, I immediately recognized, oh my god, this is a different level of speed.
00:24:10 Marco: Like, this is insane how fast, how quickly that Hello World thing just launched and ran.
00:24:15 Marco: And again, I know that's a stupid way to measure things, but it was noticeable.
00:24:20 Marco: After using PHP for years, believe me, that's noticeable.
00:24:23 Casey: Let me interrupt you right
00:24:38 Casey: And I believe at the time what we were looking to get was a Pentium Pro.
00:24:43 Casey: Nice.
00:24:43 Casey: And I will never forget going in to the Dell outlet store.
00:24:48 Casey: And the way we benchmarked all of the computers they had on display was watching them deal solitaire hands.
00:24:58 Casey: Because the ones that were really quick at dealing solitaire...
00:25:01 Casey: At the time, as far as I knew, that was a CPU-bound operation.
00:25:06 Casey: And so those that dealt the solitaire hands really, really fast, you knew that was the computer you wanted.
00:25:11 Casey: And sure enough, the Pentium Pro dealt those things.
00:25:14 Casey: It was so fast.
00:25:16 Casey: Dude, I couldn't even see it.
00:25:17 Casey: It was so fast.
00:25:18 Casey: It was amazing.
00:25:19 Marco: that's awesome so i know what you mean yeah so anyway so i decide you know what let me just see you know i i'm not i really don't want to have to go and rewrite the entire feed parser the entire feed handler the decoder how it normalizes everything how it puts in my database how it you know like i parse all the i parse the episode descriptions to remove harmful html tags and try to summarize them and make them all nice and everything and
00:25:43 Marco: There's so much processing that's all written in PHP that has so many built-up over time bug fixes and capabilities and dealing with crappy feeds.
00:25:51 Marco: I have so much of that over time, I really don't want to have to rewrite that.
00:25:54 Marco: But I suspect I can get a big savings out of having a thing in the front that fetches all the feeds.
00:26:00 Marco: It's written in something faster than PHP for this purpose.
00:26:03 Marco: Something in the front that pulls and fetches all the feeds and then only sends to the PHP processes the actual changed feeds.
00:26:10 Marco: because most of the requests, as I said, are not resulting in new information.
00:26:14 Marco: So that, I bet, would cut things down by enough that it would be worth the hassle of running something else in front of it.
00:26:23 Marco: I decided to write this thing up, and I stumbled through most of the day in Node, figuring out how it works, getting the whole HTTP request thing, the URL parsing nonsense, getting all this stuff in.
00:26:35 Marco: I guess I know...
00:26:36 Marco: There's a million different libraries that make it simpler, blah, blah, blah.
00:26:39 Marco: But I just wanted to do things in, you know, in a most low level way possible.
00:26:44 Marco: So I knew what was going on.
00:26:45 Marco: And so using as many, the way I do things, using as many core modules as possible and trying to minimize my reliance on infrequently used third party code.
00:26:54 Marco: So I made a thing that would pull the feeds every X seconds or every X minutes and do basic 304 tracking and then, you know, call a callback function when it has new information for one of the feeds.
00:27:05 Marco: And I load it up, and it starts flying through all of them.
00:27:11 Marco: And it was incredible until it just seemed to stop.
00:27:17 Marco: And I noticed, all of a sudden, it went to 100% CPU usage, and it stopped.
00:27:22 Marco: And it was using approximately 1.7 gigs of RAM.
00:27:25 Marco: Do you know what happened, Casey?
00:27:26 Marco: Because you know JavaScript.
00:27:28 Casey: I'm guessing that something wasn't cleaned up.
00:27:31 Casey: But no, I don't know specifically what happened.
00:27:34 Casey: John?
00:27:36 John: I don't know.
00:27:37 John: I don't do a lot.
00:27:37 John: I don't do any Node.js programming.
00:27:39 John: I only do JavaScript in the browser.
00:27:41 John: And in that case, I would say you accidentally kept a reference to a DOM node that's no longer in the DOM.
00:27:46 John: Or you're using IE, which has an amazing set of Byzantine rules about what you can and can't reference from JavaScript that will end up leaking memory.
00:27:54 John: But no, I don't know.
00:27:55 Marco: Turns out the V8 engine, which I believe note is based on the Chrome JavaScript V8 engine, just has a RAM limit of like roughly 1.6 to 1.7 gigs that like the garbage collector just kind of dies at that point.
00:28:09 John: It's like Java where you have to give an argument on the command line to tell it how much heap space to use.
00:28:13 John: I had this hilarious experience recently at work where I was trying to run a Java command to tell me what version of Java I have, you know, whether it's Java 7 or whatever.
00:28:20 John: If you just do Java minus version, it says, sorry, not enough memory.
00:28:23 John: You have to get on our system.
00:28:25 John: This could be a configuration thing.
00:28:26 John: It could be a file in Etsy.
00:28:28 John: It could be a dot file.
00:28:29 John: It could be an environment variable.
00:28:30 John: I don't have set, but whatever it is, the situation on our work computer was you type Java minus version and it has not enough memory and heat for you to do that for you.
00:28:37 John: So.
00:28:39 Marco: that's amazing so i know i did not know that that was a thing though marco that is news to me yeah and and you know the reality is like you you're just not expected to use more than one and a half gigs of ram in a node process but anyway that's a thing and you can't change it you know obviously you can just run multiple processes and split the load and everything so there's ways around it but it's still annoying and again not like php doesn't have its own set of obnoxious limitations and badly documented uh options and
00:29:06 Marco: One thing I like is that everything in Node is stream and callback based.
00:29:10 Marco: And so even like the MD5 calculator is a streamable thing.
00:29:15 Marco: And so in the data callback for each URL request, I'm like, you know, if I don't actually need the body of the feed, if I just need to know whether it has changed, I can just pipe it through the MD5 hasher and just never keep any part of it in RAM.
00:29:30 Marco: That could really cut this down.
00:29:31 Marco: So I did that.
00:29:32 Marco: It cut it down substantially.
00:29:33 John: You weren't doing that in PHP?
00:29:35 Marco: Yeah.
00:29:35 Marco: no in php i was loading the whole thing i mean i was doing like you know basic e-tag and if modified since but if the server gave me a 200 and gave me the whole page then i would do an md5 over the whole body to make sure like do i actually need to do anything is this actually new if you know if it is new i need to process it so there's no reason for me to feed it all in and then immediately fetch it again like that i figured you know i might as well just process it
00:29:59 Marco: Anyway, so I decided, let me see for this node thing.
00:30:02 Marco: Maybe I don't have to do that.
00:30:03 Marco: If I remove that, and if I say that, well, anything that actually is new, I'll just fetch a second time from PHP.
00:30:10 Marco: That's not the best scenario, but let me see what that does to RAM usage.
00:30:14 Marco: Ran it again, and same thing.
00:30:16 Marco: Slam into that 1.6 gig limit pretty quickly.
00:30:19 Marco: If I make a node process only do, say, a quarter of the feeds, I can make this entire thing run.
00:30:26 Marco: and do that entire polling thing where it crawls them every, depending on how many subscribers, every 2 to 30 minutes roughly.
00:30:35 Marco: One process can crawl 60,000 feeds like that and tell me when each one has actually changed with about 20% CPU power on one core and about 600 megs of RAM.
00:30:48 John: Why did you have to split it up into processes, though?
00:30:51 John: Couldn't you just have your single process have a window of a quarter of like a maximum window of a quarter of a thing?
00:30:56 John: I'm still not quite sure where the memory is going, because if they're all just streaming things through, there's just like...
00:31:01 John: one buffer's worth of stuff and so you just that's just how many web requests do you have in flight at once and if you just keep that limit small then it should work through you know you basically you're trading oh yeah i see i see what you mean you know like just have the just have the if anyway if four processes isn't that much but now you've got like a sharding problem where you're divvying up the workload like manually between them whereas if you just make one process that
00:31:22 John: Or one master process that divvies them up into Java.
00:31:25 John: Anyway, go on.
00:31:25 Marco: So the problem there is... So when I first did this, I initially went, okay, well, how do you... Let me look for a node-based message queue.
00:31:34 Marco: So maybe I can get rid of the Beanstalk queue that I run this on because Beanstalk has a number of limitations that make this kind of thing annoying to do with it.
00:31:41 Marco: So...
00:31:42 Marco: Let me just see, like, hey, what can I do here?
00:31:44 Marco: And I looked up some of the node message queues, and I looked at the source to one of them, and it was like, you know, 100 lines.
00:31:51 Marco: I'm like, what is this doing?
00:31:53 Marco: And then, of course, it's just doing setTimeout.
00:31:57 Marco: And I'm like, oh, like, duh.
00:31:59 Marco: And so I tried, okay, let me write this entire thing using setTimeout as my queuing method, and then when the function finishes, it just queues the next one, and it works great.
00:32:10 Marco: Now, the problem is I then have no way, well, I have no straightforward way to limit the number of simultaneous requests that are kept in memory at once.
00:32:20 John: Where are you getting your work, your queue of work from?
00:32:22 John: You're pulling it from a database?
00:32:24 John: Yeah.
00:32:24 John: So why don't you just pull from the database in chunks and, you know, just work on your chunk.
00:32:30 John: And as things fall off the end, pull in new things, you know, like you just need a window size of like, this is my current set of things that I'm working on.
00:32:37 John: And as soon as you complete one, a new one comes in and you could chunk the pulls from the database.
00:32:42 John: So you're not selecting a single row at the time.
00:32:43 John: But other than that.
00:32:45 John: oh i'm actually selecting all the rows at once like at the beginning like every every so often it's just like you know select id comma url from database and gets give me this giant didn't working at tumblr make you like never want to do those queries like always say like if anything if anything what would happen if i multiplied my traffic by 100 and if the answer is it blows up like you know like the discipline of saying never have everything in memory always always be limited by just by your buffer size like
00:33:11 John: I don't care how big the file is because I'm only going to be working on X amount of it at a time.
00:33:15 John: I don't care how many jobs there are because I'm only going to have this many at a time.
00:33:18 John: I don't care how many there are in the database.
00:33:20 John: I'm never going to select them all.
00:33:21 John: I'm always going to go Windows.
00:33:22 Marco: No, in most cases, I would agree with you.
00:33:24 Marco: However, the fact is the role of podcasts is so damn small.
00:33:28 Marco: Every podcast feed that I know about in all of Overcast, 240,000 of them.
00:33:35 Marco: And they grow very slowly.
00:33:36 Marco: Two months ago, it was probably 220,000.
00:33:39 Marco: The fact is, from what I've heard, I've heard the entire iTunes directory is somewhere along the order of 400,000 to 500,000.
00:33:47 Marco: In the world of database stuff, these are tiny numbers, really.
00:33:49 Marco: This is not a big deal.
00:33:51 Marco: I can do, like, queries for stats and stuff with these ridiculous group buys and ridiculous joins that, you know, on something like the size of Tumblr, you just can't even do.
00:34:02 Marco: But I can do that on these tables because everything is just so damn tiny.
00:34:05 John: If you weren't limited by the crazy node memory limit, you wouldn't have to do any windowing at all, probably.
00:34:09 John: You're right.
00:34:10 John: You know, but...
00:34:11 John: KJ Healy posted in the chat room the text from what I assume is the Node site, and it seems to confirm that, yeah, there's a limit.
00:34:18 John: And it's less.
00:34:19 John: It's one gigabyte in 32-bit machines, 1.7 and 64-bit.
00:34:22 John: And it's recommended that you split your single process into several workers if you're hitting memory limits, which I think is pretty lame.
00:34:28 John: You should write in Go.
00:34:29 John: You don't have to deal with that crap.
00:34:30 Marco: actually i i am interested in go you know theoretically however the as stupid as it is the fact that i already know all the javascript syntax even if i don't know a lot of languages like nitty-gritty details the fact i already know all the syntax and a lot of the basic functions made it a lot more a lot easier for me to just jump in and start making something productive here all right well how about this marco you're familiar with ns url session
00:34:53 John: I thought about that too.
00:34:54 John: Because you can write it in Swift as a command line script.
00:34:58 Marco: I thought about that too, but where would I run it?
00:35:00 Marco: I'd have to get a Mac Mini Colo kind of thing.
00:35:02 Marco: If I can't just run it on my Linode boxes in my existing setup, that's kind of annoying.
00:35:08 John: I forgot that Swift doesn't cross-compile, does it?
00:35:10 John: Nope.
00:35:12 John: It's not even open source yet.
00:35:13 Marco: And also, I don't think there's a lot of reason to do it in Swift or Objective-C over Node.
00:35:20 Marco: Because the model would be the same.
00:35:22 Marco: You'd have basically single-threader networking with all this event-based callback stuff.
00:35:28 Marco: That would basically be the way to do it in Objective-C also.
00:35:31 Marco: That'd be the smart way to do it.
00:35:32 Marco: Whether it's that or Node, there's not a huge gain to one or the other, except that Node I can host anywhere.
00:35:38 Casey: So in the end, you tried something new, which admittedly was new-ish insofar as, like you said, you knew the language.
00:35:46 Casey: But you tried something new.
00:35:48 Marco: It was a little jarring when I went to some of the pages for some of the modules on their GitHub page.
00:35:53 Marco: It's like, last modified four years ago.
00:35:56 Marco: I'm like, man, this is so not new.
00:36:01 Casey: But either way, you tried something new to you, and it sounds like so far so good.
00:36:07 Marco: I haven't deployed it to the servers yet because that'll take a little bit more work and I'm actually about to go traveling so I figured this would be a bad time to start messing with things but I suspect as soon as I get back from this trip I'm most likely going to install this front end in place and have it take over all the polling and
00:36:24 Marco: maybe even the initial crawling, if I can get, if I can figure out how to do the memory in a relatively efficient way or somehow overcome those limits.
00:36:33 Marco: But we'll see.
00:36:34 Marco: But yeah, so far I would say it was a big success.
00:36:36 Marco: It was exciting.
00:36:38 Marco: I was very happy the whole day.
00:36:39 Marco: Like I was, I was satisfied with what I was doing.
00:36:42 Marco: I'm a sucker for speed.
00:36:44 Marco: That's it.
00:36:46 Marco: I've always been a low-level nerd.
00:36:47 Marco: I love C. I love programming things in C. I love using the crazy vector functions.
00:36:51 Marco: I love all this crazy stuff that makes things super, super fast.
00:36:55 Marco: PHP can't do that for me.
00:36:58 Marco: It's like, this is a need.
00:36:59 Marco: It's not serving for me.
00:37:00 Marco: PHP is not... I wouldn't call it slow.
00:37:03 Marco: It is not a slow language as things generally go.
00:37:06 Marco: But when it comes to massive parallel tasks like this, there's just no good way to do it in PHP.
00:37:13 Marco: And Node is made for stuff like this.
00:37:16 Marco: It's really good at stuff like this.
00:37:18 Marco: And so to have something with really pretty little effort that is very easy to host that, I think, I'll find out about that.
00:37:26 Marco: I'll report back on how easy it is to host later.
00:37:28 Marco: But it hit all the boxes for me.
00:37:31 Marco: And the fact that all the crazy, everything is a callback kind of stuff, to write a whole web app in this, I think would be pretty clunky.
00:37:38 Marco: I think it would definitely be callback hell, lots of weird spaghetti code type things.
00:37:42 Marco: I can't imagine writing a whole web app in it, and I don't plan to.
00:37:46 Marco: But for components or for simple things, I can definitely see the value of it here.
00:37:52 Marco: And so I think I'm going to start mixing it in in places and see what happens.
00:37:57 Casey: I am extremely happy about this, although it would be remiss of me not to point out that you've said in basically the same breath that you love low-level stuff, and you love speed, and then you talked about Node, which is about as far away from low-level as you can get.
00:38:11 John: Well, it's not like PHP was failing here because the quote-unquote language is slow, because JavaScript, like you said, is also another high-level language.
00:38:18 John: Neither one of them is directly dealing with memory.
00:38:20 John: They all have these dynamic types and all this other stuff.
00:38:22 John: That is generally slow.
00:38:24 John: The thing that was falling down is that PHP either doesn't provide, or Marco wasn't willing to try to make happen, the control at sort of the infrastructure level, the process level.
00:38:37 John: If you could do something event-driven like that in PHP, it sounds like you can't, except for that one curl thing.
00:38:43 John: It's not...
00:38:44 John: not sort of part of the language or not a language supported thing.
00:38:48 John: I'm assuming forking and everything is a language supported thing.
00:38:51 John: So you could have done that.
00:38:52 John: And that would have been sort of a, a half step towards this.
00:38:54 John: It is.
00:38:55 John: But yeah, like node, you know, sort of the event driven thing is baked into the language.
00:38:59 John: The example I'm familiar with is Pearl, where of course you can do the forking thing.
00:39:02 John: And there are multiple event driven languages that are,
00:39:04 John: based on various event libraries.
00:39:07 John: Or you could do it yourself in Perl if you wanted because it gives you full access to all the unique system calls that these things are all implemented in.
00:39:13 John: So you could just do it that way as well.
00:39:16 John: So in all those cases, all the languages we're talking about are slow compared to CC++ and stuff like that.
00:39:20 John: But that's not the limiting factor.
00:39:21 John: The limiting factor is you're...
00:39:24 John: your thing was wasting time and resources not doing anything, you know, like processes would be stuck in IO weight or something like that.
00:39:30 John: Right.
00:39:30 Marco: It's very inefficiently using the resources.
00:39:33 John: Right.
00:39:33 John: And the event driven thing is like, well, I can't do anything more with this thing.
00:39:36 John: I'll move on to the next thing.
00:39:37 John: Oh, I can actually do a little work on this.
00:39:38 John: What about you?
00:39:39 John: I can do some work on that.
00:39:39 John: Oh, but this has some data ready for me because compared to the speed of the CPU, the speed that IO happens across the network is just glacial.
00:39:46 John: So the CPU is always just like twiddling its thumb saying, you know, give me something to do.
00:39:52 John: Because I sent this HTTP request and it's not going to come back for another few million or billion cycles.
00:39:57 John: So I would like to spend those cycles doing something.
00:40:00 Marco: Exactly.
00:40:01 Marco: And also, you know, you mentioned, yeah, these are all high-level languages.
00:40:05 Marco: They're all going to be slow compared to something like C. But my biggest frustration with PHP over the years has been everybody else who uses it and the people who make it.
00:40:16 Marco: I'm not actually joking.
00:40:21 Marco: It is that bad.
00:40:25 Marco: A handful of people are able to use PHP in a reasonable way, and they mostly keep quiet and don't participate in the community and aren't contributors to the PHP project.
00:40:35 Marco: Yeah.
00:40:35 Marco: PHP itself has been so erratically and relatively poorly maintained over the years.
00:40:41 Marco: Third-party code for it is a disaster.
00:40:43 Marco: It's all over the map, mostly being pretty bad.
00:40:46 Marco: It's getting a little bit better these days, although it's also getting really Java-y.
00:40:51 Marco: The whole composer era of PHP and the Zend framework era and all this stuff.
00:40:57 Marco: oh they're turning into java it's horrible and the freaking backslash how did how did how did that get through who seriously the backslash as a as an operator as a namespace divider like why is the backslash anything but an escape character anyway php is is not maintained in a direction or to a level of quality that i have much confidence in
00:41:19 Marco: The Chrome JavaScript engine, on the other hand, is really good.
00:41:23 Marco: And there's a fantastic engineering company behind it that even though I think Google is creepy as hell most of the time, and I don't use many of their products because I'm just a little creeped out by them,
00:41:35 Marco: You can't deny their engineering prowess is just insanely good.
00:41:39 Marco: The Chrome JavaScript engine is something that gets a lot of attention.
00:41:42 Marco: There's a lot of incentive for Google to keep that being awesome.
00:41:46 Marco: Like their whole company basically depends on that being awesome.
00:41:50 Marco: So you have this company with fantastic engineering resources and throughput having a really good incentive to maintain this one component this language is based on.
00:41:59 Marco: Then you look at PHP and it's just kind of all over the place.
00:42:02 Marco: It's sloppily maintained.
00:42:05 Marco: Deploying it is weird.
00:42:06 Marco: There's still so many language shortcomings that will never be fixed.
00:42:11 Marco: A lot of the new directions language is taking have really been questionable and I don't have a lot of confidence in.
00:42:17 Marco: Facebook's whole thing with hack and HHVM is its own pile of
00:42:22 Marco: gains and losses um you know that that just shows how bad php is maintained that facebook decided they had to do that and they were probably right even though this is all you know the same class of language generally speaking i have a lot more faith in the in the technical prowess and the and the long term long-term stability and and long-term efficiency of node than i do of php
00:42:47 Casey: So if you were to write Overcast today, I think the obvious answer is you'd probably write it the exact same way you did.
00:42:55 Casey: But assume that you're maybe a little more comfortable with Node than you are today, but you're equally impressed by it.
00:43:03 Casey: What pieces of Overcast do you think you would write in Node, if any?
00:43:07 Casey: Like, for example, the Overcast web interface that I would use, it probably stands to reason you would still do that in PHP, would you not?
00:43:15 Marco: I'm not sure it would make sense to maintain large portions of the app in two different languages.
00:43:22 Marco: I think that would just be kind of a deployment nightmare.
00:43:25 Marco: Generally, I'd like to do things all in one language.
00:43:28 Marco: As I said, I don't like JavaScript enough and its weird object system enough, and I don't like Node's lack of blocking calls in many ways to do a lot of common web app type tasks.
00:43:41 Marco: Honestly, I probably wouldn't pick either of them if I had to pick just one language for the whole project.
00:43:45 Marco: Or in reality, if the reality is, if I was writing Overcast from scratch today, I would probably write it with CloudKit and just not even have servers.
00:43:53 Marco: If I can be honest, I mean, that like, and I've thought about too, like, do I really need to still maintain the servers for much?
00:43:59 Marco: Like, could I move all of the user data to CloudKit?
00:44:03 Marco: and then just have the servers doing feed crawling and have them be publicly available to all the app installations.
00:44:08 Marco: I could do that.
00:44:10 Marco: Right now, there's not a lot of reason to do that, but if I was writing it from scratch today and I didn't already have all the server stuff in place and written, I would probably do it that way instead.
00:44:20 Marco: That's interesting.
00:44:21 Marco: And if I was going to learn a brand new language to replace PHP as my main web language of something I was going to use for the next 15 years, hopefully not, but something I was going to use for the next long time in my web development career.
00:44:38 Marco: i'm not entirely sure i would pick either of them for that either like i think again like i don't i love the whole event-driven model a lot uh i don't love javascript or some parts of node enough and again i've been using it for a few days so this you know this opinion could change but
00:44:58 Marco: So Go is very interesting to me.
00:45:00 Marco: I don't know enough about it to know whether it would be substantially better in this regard.
00:45:06 Marco: I like the idea of Go being kind of this almost C-level language and being very fast and very efficient.
00:45:14 Marco: I like that a lot.
00:45:15 Marco: I kind of wish Swift could be that language and there could be a server.
00:45:19 Marco: So that way I could kind of consolidate my language expertise for the next generation and just have this one language I can really deeply master and have it be available in both places.
00:45:27 Marco: I would love that.
00:45:29 Marco: But right now, Swift can't reasonably be a web language because there is no open tools for it and everything.
00:45:35 Marco: So maybe in the future.
00:45:36 Marco: I don't know.
00:45:37 Marco: We'll see.
00:45:37 Marco: Maybe Node can carry me over until you can run Swift on the server if that can ever happen.
00:45:41 Marco: But I wouldn't count on that happening anytime soon.
00:45:44 Casey: Well, that's reasonable.
00:45:45 Casey: I was just curious.
00:45:46 Casey: And, you know, I think that Node is really good at doing proof of concepts.
00:45:52 Casey: It's really good at, you know, event-driven stuff, which is exactly what you're talking about using it for.
00:45:57 Casey: You can definitely get into callback hell, and it can get really ugly really quickly.
00:46:02 Casey: Yeah.
00:46:02 Casey: Even as someone who really likes Node, I completely concur with pretty much everything you just said.
00:46:08 Casey: So, yeah, that makes a lot of sense.
00:46:10 Casey: But I am genuinely very proud of you for trying something new.
00:46:13 Casey: And it's as self-serving as it may have been.
00:46:16 Casey: You typically are not too enthusiastic about getting outside the PHP comfort zone.
00:46:22 Casey: So kudos to you, my friend.
00:46:23 Marco: Oh, you can say it.
00:46:24 Marco: I never do it.
00:46:25 Marco: I never leave my comfort zone.
00:46:26 Marco: You can say it.
00:46:27 Marco: That's correct.
00:46:28 Casey: And so kudos to you, my friend, for trying something new.
00:46:31 Casey: Thank you.
00:46:32 Casey: All right, why don't you tell us about something else that's awesome?
00:46:35 Marco: Let me tell you about Automatic.
00:46:36 Marco: Automatic is your smart driving assistant on your smartphone.
00:46:39 Marco: You may remember Automatic from last week's show, where they sponsored us then too.
00:46:43 Marco: I'm going to tell you about them again because they're just that good.
00:46:45 Marco: Go to automatic.com slash ATP.
00:46:48 Marco: That's spelled the usual way, automatic.com slash ATP.
00:46:52 Marco: Automatic monitors how you drive, so you can monitor your fuel economy, read check engine error codes, automatically signal for help in a crash, and more.
00:47:00 Marco: But the best part is that this intelligently monitors how you drive to tell you how to optimize your fuel economy.
00:47:05 Marco: This gives you all the data you need to track your costs and efficiency every week, and it can give you tips on small changes you can make to save a lot of money in the long run.
00:47:13 Marco: Automatic can even make subtle audio cues when you drive in efficiently to help guide you towards better habits or to reach the goals you've set for economy.
00:47:21 Marco: If you accelerate too hard, if you really slam it or you break too hard, it can beep if you want it to and it can kind of guide you towards these better habits.
00:47:30 Marco: i was trying to keep this level of average gas mileage i was trying to keep my fuel cost to below x dollars a month and if you're not reaching those goals with the way you're driving you can have it gently remind you if you want to again this is all optional you can have it gently remind you to guide you towards the goal automatic can help you save hundreds hundreds of dollars in gas it can diagnose your check engine light code so you don't have to go necessarily immediately to get your car serviced if it's a really minor error um
00:47:54 Marco: And also the getting help in a serious crash thing, this is pretty cool.
00:47:57 Marco: So this, you know, if you're in a crash, God forbid, if you're in a crash, it can use your phone because it communicates with your phone over Bluetooth.
00:48:04 Marco: It can use your phone to call for help automatically because, of course, the name is automatic.
00:48:09 Marco: So it would be weird if it wasn't automatic.
00:48:11 Marco: Automatically radio for help in a crash.
00:48:13 Marco: And this could, I mean, no joke, this could save somebody's life.
00:48:16 Marco: This is a big deal.
00:48:18 Marco: Anyway.
00:48:19 Marco: There's even less serious things.
00:48:21 Marco: There's like a parking locator that automatically remembers where you park.
00:48:24 Marco: Great stuff like this.
00:48:25 Marco: The app supports both iPhone and Android, and there's no monthly fees to use it.
00:48:30 Marco: There's no monthly service charge.
00:48:32 Marco: All you have to do is buy the automatic...
00:48:35 Marco: i don't know what is what do you call these things dongles plugins yeah dongle buy the automatic dongle up front normally it was 100 bucks now they're running a holiday promotion that brings it down to 80 bucks but even better than that they're running a promotion for atp listeners it's just 60 bucks so go to automatic.com slash atp this is a special limited time offer automatic.com slash atp
00:48:59 Marco: Just $60 you can get this thing.
00:49:02 Marco: No monthly fees after that.
00:49:03 Marco: It's literally just $60 one time forever.
00:49:06 Marco: And there's free shipping, ships in two business days, 45-day return policy.
00:49:11 Marco: So there's no risk here.
00:49:13 Marco: It's fantastic.
00:49:14 Marco: Automatic.com slash ATP, your smart driving assistant on your smartphone.
00:49:17 Marco: Thanks a lot to Automatic.com.
00:49:19 Casey: All right.
00:49:21 Casey: So this episode will be coming out during Christmas week, and a lot of people are traveling home during that time.
00:49:29 Casey: So, John, what do you recommend people do if you're of a particularly nerdy and technological bent for your family who may not be quite so nerdy?
00:49:40 John: I think this is a question that comes up for tech nerds all the time, visiting for the holidays or any time.
00:49:45 John: when you visit relatives or friends even, but mostly relatives who are less technically savvy than you, sometimes there's an expectation, formal or informal, that you're going to help them with whatever problems they're having.
00:50:01 John: Because you have to understand the life of someone who is not tech savvy, but who is also a tech enthusiast, and I think we each know some of those people,
00:50:10 John: who are interested in gadgets, but aren't really that interested enough to like learn a lot about them.
00:50:15 John: So they'll have a bunch of gadgets.
00:50:17 John: Maybe they have an iPad.
00:50:18 John: Maybe they have a smartphone.
00:50:19 John: They have a computer, you know, TV, whatever.
00:50:21 John: They're interested in all these things.
00:50:23 John: And when they have problems, they, you know, like, I can't quite figure out why it's not working.
00:50:27 John: Maybe they spend some time in tech support.
00:50:29 John: Maybe that solves it.
00:50:30 John: Maybe it doesn't.
00:50:30 John: But they can tend to suffer in silence until a tech savvy friend or relative shows up.
00:50:35 John: And then it's like, depending on what the relationship is between these people,
00:50:38 John: oh, maybe you can help me with this thing.
00:50:40 John: And the formal version is just like parents who will say, you just build up a big queue of broken things in their house.
00:50:46 John: And like, well, next time you visit, here's the things you're going to do.
00:50:48 John: You're going to fix this for me, fix that for me.
00:50:50 John: Look at that.
00:50:50 John: Tell me why this is doing that.
00:50:53 John: Some people like that responsibility.
00:50:54 John: Some people don't like it.
00:50:57 John: i think it's you know it's kind of our duty as tech nerds to help those in need and obviously we can't help everybody but if it's like your family especially your immediate family is definitely something you should do uh so this topic is say you're you're going to a friend or relative's house and there is some expectation that you're going to help them with stuff you know like that like they actually want this from you uh what things should or shouldn't you do sort of on your own as part of your work in there like they say i'm having problems with my computer it's slow or
00:51:26 John: I can't get something to work or whatever.
00:51:29 John: You know, what should you do?
00:51:31 John: What should you look for in their house?
00:51:32 John: Potential problem areas.
00:51:33 John: Again, you talk to these people, you get their permission, you tell them what you're doing.
00:51:35 John: You're not going screwing with their stuff without their permission.
00:51:37 John: This is the assumption that they want you to help them.
00:51:40 John: And then you could offer other services.
00:51:41 John: And I'll start off with the one that I talked about last year, which I still think is a good idea.
00:51:46 John: There's a blog post about it back when I used to write it by blog called Fill Your TV.
00:51:50 John: This is about high-division television sets, most of which are configured out of the box not to show the full 1080p or 720p picture.
00:51:58 John: They're configured to cut off the top, bottom, right, and left edges by a certain amount.
00:52:02 John: So you are buying an HD television, and then they're zooming the picture and cutting off parts of the picture and effectively running in slightly zoomed
00:52:10 John: uh you call it non-native resolution that's not quite accurate for plasmas and stuff but anyway uh that's bad and these days almost all shows and all appliances that you buy at the very least have some expectation that maybe this person isn't running their tv in a screwed up mode to give you an example uh playstation 4 i just got when you first launch like the applications or when you first launch certain things in games it will prompt you to say
00:52:37 John: you know, push this button on your controller to adjust the size of the visible image of your screen.
00:52:42 John: And it starts out with, it shows like a rectangle that did not fill my TV screen, of course, because my television is configured to show the actual signal and not cut off the things.
00:52:51 John: And you basically hold down the joystick or the D-pad, I forget which one it is.
00:52:54 John: And it zooms this thing out until the rectangle actually fills your entire TV screen.
00:52:57 John: And I had to do that twice, once for applications, once for, you know, game UI or something like that, maybe once for video or whatever.
00:53:05 John: That's what you want.
00:53:05 John: So this setting, you know, this goes into this blog post.
00:53:08 John: Most televisions have a setting in the television itself that says, how do you want me to display the signal I'm getting?
00:53:14 John: And like I said, the default is, oh, make it a little bit bigger and cut off all the edges.
00:53:18 John: You don't want that default.
00:53:20 John: You have to find your way to whatever setting.
00:53:21 John: Sometimes it's like size number one, size number two.
00:53:24 John: Sometimes it's called Zoom.
00:53:25 John: Sometimes it's called overscan support on off.
00:53:29 John: you have to google for it most almost all televisions have a way to find this setting and to change you know disable the zooming so it displays natively this is a feature you can usually sell to people when you visit if you're visiting a relative you say hey uh can i just adjust the size on your television so you can see more of the picture and it's great if uh it's great if you're showing a program like maybe a football game or something where these days the football things will
00:53:54 John: get closer to the edges they won't go all the way to the edge because then it would be cut off on everybody's tv but if you can show them hey there's a little part of this play that was broadcast but that you are not seeing like if it's if it's instant replay and they're you know you can pause it during instant replay and you can say if you want to see an extra inch on the right edge of the screen where you're wondering what's happening over there
00:54:11 John: you know i think you can sell this feature to people uh and there usually aren't any harmful effects and it used to be more more the case with like analog cable and stuff like that where you might get noise in the fringes uh that doesn't happen as much these days with digital hd tv so that's my suggestion for one of the things you should suggest to read this blog post uh internalize it explain it to your relatives offer to make this adjustment this is a one-time adjustment they never need to change it again you do it once and you've essentially quote unquote fixed their television set
00:54:41 Casey: Yeah.
00:54:41 Casey: I don't have any go-to impressive, let me show you a whole new world sort of recommendation.
00:54:50 Casey: And in fact, so my family is split not only in terms of in-laws versus my actual family, but split in terms of Apple users and non-Apple users.
00:55:03 Casey: So my
00:55:03 Casey: Most of my family uses Apple products.
00:55:07 Casey: Most of Aaron's family uses not Apple products.
00:55:11 Casey: They mostly have PCs, mostly have Android phones.
00:55:14 Casey: And it's gotten to the point that even though Aaron's family is local and even though I do something that they think of as basically tech support for a living –
00:55:26 Casey: I will not fix any of their computer issues because I'm tired of dealing with Windows problems.
00:55:31 Casey: I've told them a thousand times, if you really don't want to have these problems, just get a Mac.
00:55:36 Casey: And they always snicker and say, no, it's too expensive.
00:55:39 Casey: And so it's gotten to the point that I've told them, I will not fix your problems until you buy a Mac.
00:55:43 Casey: And yes, that's obnoxious.
00:55:44 Casey: And no, that's not very helpful.
00:55:46 Casey: But...
00:55:47 Casey: Sure enough, I don't get bothered by all of their stupid Windows issues.
00:55:53 Casey: So if you're a jerk like me, that's the approach I would recommend.
00:55:58 John: The jerky version of my – I'm just looking at my fill your TV post.
00:56:01 John: The jerky version of this is you're suggested and don't tell them, which is implied by the last paragraph of my blog post.
00:56:07 John: It's like just make the adjustment for your own peace of mind and –
00:56:11 John: They probably won't notice at all, but you'll just feel better about it.
00:56:14 John: The nice thing to do is to talk to them about it.
00:56:16 John: If their eyes glaze over, like you just want to get permission to mess with their things.
00:56:21 John: My other suggestion is like the obvious one, which is it's usually on my queue for whenever I visit my parents or they visit me.
00:56:28 John: It's update all their computers to the latest version of everything, which you would think, oh, you don't want to do that.
00:56:32 John: They're going to get angry.
00:56:33 John: They know version X. Don't update their stuff.
00:56:35 John: Everything will break.
00:56:37 John: If you subscribe to that policy of giving in to people's sort of conservative notion of like, this works for me, just don't change anything.
00:56:47 John: That will work for a while, but eventually they're going to be using things that are so incredibly old.
00:56:52 John: And the transition from that super old thing to the super new thing is much more painful than a series of small ones.
00:56:56 John: So the policy I take with my family is continual small updates and leading eventually to replacing their computers every like five years or something reasonable like that.
00:57:05 John: If that's viable in your family, I recommend that approach.
00:57:09 John: You have to know when to stop.
00:57:10 John: Obviously, you know, my dad has like a white MacBook that we're not updating that anymore.
00:57:15 John: Like even if their updates are available for it, you just you have to stop at some point.
00:57:18 John: So like two gigs of RAM or something insane like that.
00:57:20 John: So you have to know when to stop.
00:57:22 John: But during the useful lifetime of, like, fairly recent hardware, keep the updates going.
00:57:26 John: Install the security updates.
00:57:28 John: Update their flash for them because, yes, they need to have flash installed.
00:57:31 John: You know, make sure, you know, check their disks for HFS Plus errors.
00:57:36 John: Repair their disks.
00:57:37 John: Do a full backup for them.
00:57:38 John: Do a full backup for them before they do anything.
00:57:40 John: Whenever my parents visit, I backup their computers to my Synology.
00:57:43 John: You know, just for peace of mind.
00:57:45 John: And like, lo and behold, recently my mother emailed me and said, I think I deleted my whole iPhone library.
00:57:49 John: Well, good news.
00:57:49 John: I have her entire 40-something gig iPhone library sitting in my Synology.
00:57:54 John: I have no way to get it to her until the next time we see each other because I'm not going to try to upload 48 gigs over her insane, terrible cable connection.
00:58:01 John: But, you know, sort of like changing the oil, changing all the fluids, swapping out the air filters, checking the tire pressure, the equivalent of that.
00:58:10 John: And my main recommendation is if you're going to do those type of things, try to make a complete backup of their system before you start doing that stuff.
00:58:19 John: So worst case scenario, and you totally host their system, which can happen, you can just be like, well, this visit is a wash.
00:58:25 John: I'm just going to restore you from the backup that I made.
00:58:28 John: The only tricky thing in there is do you do HFS plus repair before or after you do the backup?
00:58:32 John: And that's a tough choice either way.
00:58:34 John: wait so what is the right answer i'm curious uh i usually do the backup before because it is possible to make things worse by trying to repair hfs plus corruption i like to just say this is the state the disc is in i'm going to try to back it up in this state if i do the repair after that and it finds tons of errors and it successfully repairs them you can do a second backup after that and just ditch your first backup and
00:58:59 John: If it tries to do an incremental repair after that and hoses things, at least you can restore from whatever you had before.
00:59:04 John: There's no perfect answer because there are still situations where the disc could be so hosed that the backup doesn't catch this entire directory tree because it's like some kind of corruption.
00:59:12 John: And then you can't get it from backup because you didn't back it up and trying to repair it also hoses the disc.
00:59:16 John: I mean, what are you going to do?
00:59:17 John: If you have a disc in this situation, there's no move that is safe.
00:59:19 John: Like there is no way forward except for maybe disc warrior, which is the king of, I will resurrect this disc from HFS plus corruption.
00:59:27 John: Um,
00:59:28 John: Yeah, tough choices.
00:59:29 John: But if you keep doing that on a regular basis, and especially because people who aren't like us don't have literally 4 million files on their boot disks, they have a smaller number of files, and they don't have as much stuff.
00:59:41 John: So it's a tractable amount of stuff.
00:59:43 Casey: All right, Marco, do you have any such tips?
00:59:45 Casey: I know that you've talked in the past about how going and visiting your mom can be a little challenging in this department.
00:59:52 Casey: So anything you would like to share?
00:59:55 Marco: I don't really need to ever do anything anymore.
00:59:57 Marco: Like, occasionally she'll have a problem.
00:59:59 Marco: Like, hey, you know, by the way, my computer hasn't been charging for the last two weeks.
01:00:04 Marco: And I've just been, you know, using it for five minutes a day and hoping it doesn't die.
01:00:08 Marco: And can you maybe do something?
01:00:09 Marco: Yeah, okay.
01:00:10 Marco: Yeah.
01:00:10 John: You can tell me earlier.
01:00:11 John: That's what I talk about.
01:00:12 John: The people who will like silently suffer and limp along with like a situation like that.
01:00:16 John: They like you wouldn't think that's acceptable, but it's like, well, so what do you mean?
01:00:20 John: It won't charge.
01:00:20 John: How have you been using it?
01:00:21 John: I just use it a little bit each day.
01:00:22 John: Right.
01:00:22 John: Yeah.
01:00:22 John: It's crazy.
01:00:23 John: But people will do that because they'll be like, I'll just wait until next time I see Marco.
01:00:26 Marco: Right.
01:00:26 Marco: Yeah, it'll probably last.
01:00:29 Marco: Yeah, so there's stuff like that occasionally.
01:00:30 Marco: But really, it's pretty rare.
01:00:32 Marco: A while ago, she first learned how to use a computer maybe seven or eight years ago.
01:00:39 Marco: Somebody handed her down an old iBook.
01:00:42 Marco: And I mean, it was, it was old and in terrible shape, even when she got it.
01:00:46 Marco: Cause you know, she got it from some friend who was handing it down and it was, it was pretty worthless even then.
01:00:50 Marco: And she used it like into the ground.
01:00:52 Marco: I mean, it was, it was really, really bad.
01:00:56 Marco: Um, but she, she learned how to use it.
01:00:58 Marco: And so one, one time I was there for Thanksgiving, um, a couple, I don't know, a few years ago, I think 2011 ish era.
01:01:05 Marco: Cause I'm thinking what we got her.
01:01:07 Marco: Um, and we, uh,
01:01:09 Marco: We decided to just get her a new MacBook Air, because it was right after, it was like the 2011 model, I think.
01:01:14 Marco: Was that the one where the MacBook Air became really good, like the second generation?
01:01:17 Marco: Anyway, around then.
01:01:18 Marco: So we just got her a new MacBook Air, and she's still using that one, and it's been fine.
01:01:22 Marco: It's been awesome.
01:01:24 Marco: The one thing I would recommend, as I said during the ad read, and as I said in the past, is install an online backup program.
01:01:29 Marco: I use Backblaze, and so that's what I install.
01:01:31 Marco: That covers a lot of your Synology restoration.
01:01:34 Marco: Obviously, it's not perfect and it wouldn't help you restore 40 gigs faster to her computer necessarily if the problem is her connection.
01:01:43 Marco: But I installed Backblaze on my mom's computer.
01:01:45 Marco: The entire backup set of what she really needs to be backed up was only like 28 gigs or 30 gigs.
01:01:51 Marco: It was not a whole lot.
01:01:52 Marco: It's mostly just photos and a handful of documents and emails.
01:01:57 Marco: It wasn't a whole lot of data.
01:01:58 Marco: So yeah, I think it was like 30 gigs.
01:02:00 Marco: And that's it.
01:02:01 John: Probably online backups is unless it's a relative that you're close enough to that you're going to pay the bill for them, trying to convince someone that it's worth five dollars a month to do a backup is actually surprisingly hard because it's like, you know, you know, who buys batteries again all over again?
01:02:16 John: Like it just seems like something you shouldn't have to spend money for, even though it is a tiny amount of money and you cannot express to them how important it is to have backups.
01:02:22 John: And
01:02:23 John: how this is such a small amount of money, but you just sound like you're selling like the extended warranty at Best Buy to them because they're inherently suspicious of this.
01:02:29 John: So if it's your parents, you can just buy it for them and just say, this is a new thing you have now.
01:02:34 John: Don't worry.
01:02:35 John: Don't even tell them it costs money.
01:02:36 John: They don't need to know it costs money, right?
01:02:38 John: But if it's, you know, a distant cousin or something, maybe you don't feel like paying their $5 a month bill and then you're stuck with like trying to have that argument.
01:02:45 John: Time machine is even harder because they have to have a second disc and yeah, backup is still...
01:02:51 John: a bit of a challenge but but it's something you should at least at least discuss depending on how you know it's like the uh what was that thing casey the uh messaging medium pyramid what was it called communication pyramid it's i think what we called it communication pyramid yeah this is like the uh the technology pyramid like depending on how close you are to the person should you talk to them about backups should you talk to them about security updates should you talk to them about flash uh
01:03:19 John: The closer you are, the more sensitive subjects you can bring up.
01:03:22 John: Mom, we have to talk.
01:03:23 John: The other thing these days is that I think most, you know, not everyone has a computer that they maintain or care about, but increasing number people have things like smartphones or, you know, iPads and stuff like that.
01:03:33 John: And dealing with that, especially when the advent of iOS 8, when my parents visited recently, I updated them to iOS 8 and I had to do it through iTunes because they were at their storage limits.
01:03:42 John: or close to them or thought they were at their storage limits and they really just had a bunch of crap that they could delete and they really weren't using even half of the space.
01:03:49 John: But anyway, doing those type of updates, either because they've been dismissing them and not allowing them to happen because they've been nervous or because they think they're out of space or because they're legitimately out of space, helping people with their big yellow other bar in iTunes that they can't figure out how to get rid of.
01:04:03 John: you know uh updating their apps looking look at the apps that are installed in their ios device are they running like a free ad festooned disgusting ios app that you know there is a really awesome 99 cent alternative for buy them the 99 cent alternative you know like you can at least you know you're not getting rid of their other one or whatever but if you know that there is a better
01:04:25 John: whatever app out there that does this job better a better free one or a better 99 cent one just just you know have them enter their password stuff a dollar bill in their pocket and you know you can you can make their life a lot better that way and if they don't like it ios is easy enough they can still delete the thing you just bought for them and go back to their old terrible ad festoon piece of crap
01:04:44 John: uh but i mean you just because people go to the app store and they they don't know which applications are good or bad and they just do a search and you know what comes up in the search we've talked about this before just terrible keyword spam fake applications that i mean it's not malware they're not viruses but they're as close as you can get without actually being a malware or virus they're just and they'll only ever use free apps so they go to that first yeah right and they're just at a front a front to all of your senses like you
01:05:10 John: audio visual and just performance wise and oh yeah so that is a uh a nice thing you can do for their ios devices and ios devices are just so much more resilient and easy that you can be more free with what you're doing a because like i said you can just keep stuffing dollar bills into their pockets as you buy 99 cent apps you don't have to worry about the money everything is so cheap uh they usually in my experience most people usually know how to delete an app
01:05:36 John: If they've done it once, they figure it out and they're not afraid of it.
01:05:38 John: They're just like, oh, it makes the icon go away.
01:05:40 John: Visually, it seems simple.
01:05:41 John: So conceptually, they are comfortable with it, despite that it's under the covers, slightly more complicated than that.
01:05:49 John: And you can always restore it, too.
01:05:50 John: I mean, your press purchases are always there.
01:05:51 John: You don't have to worry about, did I buy it in the Mac App Store?
01:05:53 John: Did I not buy it in the Mac App Store?
01:05:54 John: So all the advantages of the iOS ecosystem mean you can be slightly more aggressive there with your helping hand.
01:06:02 Casey: All right.
01:06:03 Casey: Why don't you tell us about one last thing that's awesome, Marco?
01:06:06 Marco: I would love to.
01:06:06 Marco: We are finally sponsored this week by Warby Parker.
01:06:09 Marco: Warby Parker believes that prescription glasses simply should not cost $300 or more.
01:06:14 Marco: They bypass the traditional channels and sell higher quality, better looking prescription eyeglasses online at a fraction of the usual retail prices, starting at just $95.
01:06:23 Marco: Go to warbyparker.com slash ATP.
01:06:27 Marco: W-A-R-B-Y parker.com slash ATP.
01:06:31 Marco: Warby Parker's designs are vintage-inspired with a contemporary twist.
01:06:34 Marco: Every pair is custom-fit with anti-reflective, anti-glare, polycarbonate prescription lenses.
01:06:40 Marco: And every pair comes with a very nice hard case and cleaning cloth, so you don't need to buy any overpriced accessories.
01:06:45 Marco: They now offer progressive lenses.
01:06:47 Marco: Is that like their replacement for bifocals?
01:06:49 Marco: I think that's what they mean.
01:06:51 Marco: I'm not quite at the bifocal stage yet, but I'm getting close.
01:06:53 Marco: Progressive lenses have a distance prescription at the top and transition to a reading lens near the bottom.
01:06:58 Marco: Yeah, it sounds like a modern bifocal, but a better version because it's gradual.
01:07:02 Marco: Worry Park progressive lenses are digital freeform lenses, which is the most advanced progressive technology with higher precision and a larger field of vision than traditional progressive lenses.
01:07:10 Marco: Now, buying glasses online sounds like it would be risky.
01:07:13 Marco: How would you know, for instance, whether they would fit or how they would look on you?
01:07:17 Marco: Well, Warby Parker's website has a helpful tool that uses your computer's webcam to give you a preview of how the glasses will look on your face.
01:07:24 Marco: They can even help measure your eyes and face with the webcam thing to help get your fit exactly right.
01:07:29 Marco: In fact, that's how... I don't wear glasses, but we did this for my wife back when they first sponsored us, and she measured with the webcam thing.
01:07:36 Marco: And the measurements... We then later on got the official measurements from her eye doctor, and the ones that Worry Parker took were perfect.
01:07:44 Marco: They were exactly the right measurements.
01:07:46 Marco: Anyway...
01:07:47 Marco: The best part of all this is their home try-on program.
01:07:50 Marco: You can borrow up to five pairs of glasses, risk-free, they ship to you for free, and then you try them on in the comfort of your home for five days.
01:07:58 Marco: Then you can send them back with a prepay return label.
01:08:01 Marco: So you've paid nothing this whole time.
01:08:02 Marco: They ship them to you for free, you get to keep them for five days, send them back with a prepay return label, and there's no obligation to buy after that.
01:08:09 Marco: So you can get the five frames, try them out for five days, send them back, and never buy anything again.
01:08:15 Marco: They're confident, though, that you probably will.
01:08:17 Marco: That's why they offer this.
01:08:18 Marco: And I got to say, this stuff is great.
01:08:20 Marco: My wife now has, I think, three pairs of their glasses, and they're really good.
01:08:24 Marco: They also have sunglasses.
01:08:25 Marco: They have prescription and non-prescription polarized sunglasses.
01:08:29 Marco: Lots of great options there.
01:08:30 Marco: I love polarized sunglasses.
01:08:32 Marco: If you have not ever worn polarized sunglasses or if you've only worn bad polarized sunglasses, you don't know what you're missing.
01:08:37 Marco: You got to try it.
01:08:39 Marco: And $95, even for good polarized sunglasses, is a really good price.
01:08:43 Marco: Anyway, go to warbyparker.com slash ATP.
01:08:47 Marco: Check out their great selection of premium quality, affordable eyewear.
01:08:51 Marco: Get a home try-on kit risk-free.
01:08:54 Marco: Thanks a lot to Warby Parker for sponsoring our show once again.
01:08:57 Casey: So I wanted to talk about something really quickly, and I wish I could do a really good Italian accent, because if I could, I would do this entire small segment in an Italian accent.
01:09:07 Casey: but I cannot, so I'll just do it as me.
01:09:10 Casey: I've been playing with Workflow lately, which is an app for iOS that lets you automate stuff.
01:09:15 Casey: Have either of you guys played with this?
01:09:17 John: I keep hearing about it, and here's my problem, and maybe you can help me with it.
01:09:21 John: I'm trying to think of things I do with my iOS devices, whether it's a phone or iPad or whatever, that are repetitive and tedious that I could automate.
01:09:34 John: and i'm having trouble coming up with one i'm i'm sure they're there but like i have blind spots either i have blind spots for them or i've trained myself not to do even remotely complicated things with my ios devices because like it's too tedious so i'm still working on it but i haven't even downloaded the app but as soon as i can think of one i will download it because i want to try it out
01:09:51 Casey: Can I have it automatically delete all my support email?
01:09:55 Casey: I don't think so, but I like where your head's at.
01:09:58 Casey: So the reason I didn't download it for a long time, even after Federico Vatici said a thousand times that it was amazing, and it is his influence that makes me wish that I could do this entire segment in an Italian accent.
01:10:13 Casey: But anyway.
01:10:14 Casey: We would love to hear you attempt it.
01:10:16 Casey: No, it's not happening.
01:10:17 Casey: The thing is that I wanted to download it just to see what the hubbub was about.
01:10:21 Casey: And when I downloaded it, I completely agree with you, John.
01:10:24 Casey: I didn't really know what I was going to do with this.
01:10:28 Casey: I started fiddling and just kind of seeing what I could do.
01:10:30 Casey: And I ended up trying to think of, well, what do I do a lot on my iOS device that is kind of a pain?
01:10:39 Casey: What I came up with was I like to download all the copies of ATP and analog that have ever been posted.
01:10:46 Casey: So if for some reason the internet disappeared tomorrow,
01:10:51 Casey: I would still have a copy of all of these, and I have them on my Synology.
01:10:55 Casey: Yes, it's a little bit weird.
01:10:56 Casey: Yes, it's a little crazy, but just bear with me.
01:10:58 Casey: And granted, all I'm really talking about is going to either of these pages, the analog show page or the ATP show page, and
01:11:09 Casey: copying the link that's on that page.
01:11:11 Casey: But it was a really good example of, hmm, how could I do this using workflow?
01:11:18 Casey: And what I ended up doing was writing two very different workflows to do exactly that.
01:11:23 Casey: So I can jump into workflow and I have a download the latest ATP workflow and I can run it.
01:11:29 Casey: And what it does is it goes to the RSS feed, gets the most recent item, figures out what episode number it is, and then
01:11:37 Casey: Because Marco is a gentleman and he uses extremely consistent file names for every single episode, all I need to do is figure out what number it is.
01:11:47 Casey: And I build a URL out of that.
01:11:49 Casey: And then I can open it in the Synology DS download app, or maybe it's DS file.
01:11:55 Casey: It doesn't matter.
01:11:55 Casey: One of the Synology apps.
01:11:57 Casey: And it will download it for me.
01:12:00 Casey: Stupid?
01:12:01 Casey: Yes.
01:12:02 Casey: Okay.
01:12:02 Casey: Pretty simple?
01:12:03 Casey: Yes.
01:12:04 Casey: Freaking cool that you can do that with an iOS device?
01:12:07 Casey: Yes.
01:12:08 Casey: And so that's a great example.
01:12:10 Marco: So would you say you've been using Workflow for a few days now and you really like it?
01:12:14 Marco: I would say that.
01:12:15 John: I like the idea that you can make your own extensions.
01:12:17 John: Yes.
01:12:18 John: People talk about you can make a little icon appear in one of the little sheet type things, because that's when I was trying to think of things I do that are annoying and repetitive.
01:12:24 John: It's usually because like I'm in one application and I want to do something, but some piece of information is in some other applications.
01:12:29 John: I got to go back and forth or, you know, like and it's like, well, in iOS 8 or in a lot of these applications, now I can bring up that little sheet with a little set of icons.
01:12:38 John: And if I could put an icon there that would instead of, you know, send Instapaper, for example, which is great that that's everywhere now.
01:12:43 John: I could also, you know, run this workflow on this thing that I've selected type of thing.
01:12:47 John: So I'm looking for something like that.
01:12:48 John: Like your case where you're downloading the things, that's a thing that you can do with workflow, but I wouldn't do that all server side.
01:12:53 John: I wouldn't, you know, your iOS device doesn't need to be involved in that process at all, except that you just wanted to do, you just wanted to try out workflow app.
01:13:00 John: It's a good thing to play around with it.
01:13:01 John: But like, why is the iOS device involved in that process at all?
01:13:04 Casey: And that's a fair point.
01:13:05 Casey: So let me give you a more concrete example that I think you might be interested in is I made one to generate affiliate links for Amazon.
01:13:12 Casey: So if I'm on Amazon and I want to post about something or maybe I just want to send a link to somebody and hope I get a small kickback.
01:13:21 Casey: I have one of the extension style workflows that will look at the current URL in Safari because I'm going to run it from Safari.
01:13:31 Casey: And it will generate an Amazon affiliate link based on that URL.
01:13:36 Casey: And so it's like two taps in order to generate an affiliate link.
01:13:40 Casey: Now, what I'm not mentioning is I had a JavaScript bookmarklet that did the same thing, but at least the workflow one automatically copies it to my clipboard rather than me having to do the whole hover and select or the tap and hold and select all and copy dance.
01:13:55 Casey: And that's really nice.
01:13:57 Casey: The one thing, though, that I should make clear about what you were talking about, John, is that when when you have an extension, basically there is only one icon that is run a workflow.
01:14:08 Casey: And then you tap that icon in the extension sheet or whatever it is.
01:14:13 Casey: And then workflow pops up and says, okay, of all of the workflows that you have, these are the workflows that you've specified as extension workflows.
01:14:23 Casey: So the ATP workflow, for example, and the analog workflow are not extension workflows.
01:14:28 Casey: So I don't see those as options.
01:14:30 Casey: However, the Amazon one is.
01:14:31 Casey: And so I do see that as an option.
01:14:33 John: That makes sense.
01:14:34 John: But I had it in my head that you could actually put your own icons there.
01:14:37 John: I'm like, how are they getting away with that?
01:14:38 John: I guess, you know, the answer is they're not.
01:14:40 Casey: Right.
01:14:40 Casey: Now that you can do that with home screen icons.
01:14:44 Casey: And I will say that I thought it was really neat.
01:14:47 Casey: And I'm probably going to butcher the technical details, but it was something along the lines of when you go to create that home screen icon, what it does is it gives you a URL with a whole bunch of HTML in a...
01:14:58 Casey: In a data blob, you know, like you can do in CSS to like put an image actually within CSS.
01:15:05 Casey: It was like, you know, base 64 encoded binary data or something like that, which I thought was kind of neat.
01:15:10 Casey: But anyway, I don't really have a particular angle here, to be honest with you, other than to say it's really, really cool that you can do this on iOS.
01:15:20 Casey: And I've actually really enjoyed the technical challenge of doing something that would probably take me five lines of code in any given programming language.
01:15:28 Casey: It doesn't matter which one you're talking about, but doing it with the limited tools that workflow gives you.
01:15:34 Casey: And to be fair, I mean, the tools that workflow gives you are impressive for sure, but they're still very limited.
01:15:43 Casey: You know, I think the most
01:15:44 Casey: basically you have a for each block and an if block, and that's about as complex as it gets in terms of control structures.
01:15:52 Casey: But just being challenging myself to figure out ways to do this with these primitive tools.
01:15:59 Casey: I've actually really enjoyed it almost like a game, but yeah, I don't know if it's, it's probably one of those things where I now have a hammer.
01:16:08 Casey: So everything looks like a nail, but it's been fun.
01:16:11 Casey: And I definitely encourage everyone to try it out.
01:16:13 Casey: It's a really cool app.
01:16:14 Marco: Thanks a lot to our three sponsors this week, Backblaze, Automatic, and Warby Parker.
01:16:19 Marco: And we will see you next week.
01:16:24 John: Now the show is over.
01:16:26 John: They didn't even mean to begin.
01:16:28 John: Because it was accidental.
01:16:31 John: Accidental.
01:16:32 John: Oh, it was accidental.
01:16:33 Casey: Accidental.
01:16:34 John: John didn't do any research.
01:16:36 John: Marco and Casey wouldn't let him.
01:16:39 John: Cause it was accidental.
01:16:42 John: It was accidental.
01:16:44 John: And you can find the show notes at atp.fm.
01:16:50 John: And if you're into Twitter, you can follow them at C-A-S-E-Y-L-I-S-S.
01:16:59 Marco: So that's Casey Liss, M-A-R-C-O-A-R-M-N-T-M-A-R-C-O-R-M-N-T-M-A-R-C-O-R-M-N-S-I-R-A-C-U-S-A-C-U-S-A-C-U-S-A-C-U-S-A-C-U-S-A-C-U-S-A-C-U-S-A-C-U-S-A-C-U-S-A-C-U-S-A-C-U-S-A-C-U-S-A-C-U-S-A-C-U-S-A-C-U-S-A-C-U-S
01:17:16 John: A little tiny bit of real-time follow-up from Slade401 in the chat room that we should have talked about in the people suffering in silence.
01:17:31 John: One more thing to add to the list.
01:17:33 John: Slade says, today I found out that my mother's white MacBook battery has been bulging for a month without telling me.
01:17:38 John: Oh, my God.
01:17:39 John: So add this to the list.
01:17:40 John: Do do the thing that you do like in driver ed where you walk around the car to make sure that there is no, you know, metal sticking out of the wheels, that everything is OK, that there's no small children or cats under the wheels that you're going to run over.
01:17:54 John: Like check the hardware.
01:17:55 John: Is the battery bulging?
01:17:56 John: Like, is there, you know, is there water on the keyboard?
01:17:59 John: Does it look like, you know, just give the thing.
01:18:02 John: And in my parents' case, I don't understand why they can't keep their laptops clean, but they are filthy.
01:18:06 John: So I clean them, you know, clean the thing from top to bottom, scrub off all this stuff, like check the hardware, check for hardware problems and check for hardware condition.
01:18:13 John: And the second thing that just came to mind when Casey was talking about the programming thing, what was it?
01:18:20 John: Workflows of being able to do programmer-y type stuff.
01:18:23 John: cut this this is vaguely tangentially related uh there's an ios app called hopscotch that i've had on my kid's ipad for a long time it's supposed to be like a teach kids programming type of thing and they haven't been into it i'm like fine i'll just let it sit there and i launched it recently to try to show my son who i think maybe he'd be interested in it you know whatever
01:18:42 John: And I was trying to show him something.
01:18:44 John: Let me launch this, you know, my first little programming thing.
01:18:46 John: It's got a little, you can drag out a little loop block and you can drag out a little action thing and you can make variables and the variables will become little draggable things.
01:18:53 John: And, you know, like it's supposed to be really nice.
01:18:56 John: It starts off with like these little sprites of like a little monster.
01:18:58 John: And then, you know, you'd say when I hit the play button, the monster should.
01:19:01 John: And you could say like move to XY coordinate or whatever, save something in a variable.
01:19:06 John: So I tried to make the simplest possible program you can make, which is I wanted to have two monsters chase each other around the screen.
01:19:12 John: Yeah.
01:19:15 John: in the one sitting that i had with this for five minutes i could not for the life of me figure out how to do this i'm pretty sure hopscotch is not turing complete because it doesn't have a conditional it has a loop but it doesn't have a conditional and you need if and while i don't think it's even freaking turing complete you could not i could not get their position and save them into variables i could not i couldn't i couldn't do math as far i mean i'm not saying the program doesn't do this i'm saying i could not as an actual programmer with like 20 years experience figure out how to do math on the x y coordinates to say move towards notification center
01:19:44 John: to move towards the, yeah, right.
01:19:47 John: There's no calculations or a lot to make one character move towards another, right?
01:19:51 John: I can make them chase each other, but, but they would only, they would warp to their positions.
01:19:55 John: Like I had, I had them sort of chasing, but I couldn't make it move smoothly because I needed to like, you know, draw a line between where they are now in their destination and move along that line in an increment.
01:20:04 John: So they move smoothly.
01:20:05 John: Yeah.
01:20:05 John: The best I could do was make them chase each other by sort of like teleporting around the board, you know, like they're warping.
01:20:12 John: And then I said, you know what?
01:20:13 John: I can't recommend this.
01:20:15 John: I was talking with my children.
01:20:16 John: I'm like, you know what?
01:20:16 John: Screw this program.
01:20:17 John: I'm sorry to the hopscotch people if conditionals are in there and I couldn't figure it out.
01:20:21 John: Maybe it's like a mental block where actual programmers should never use this program.
01:20:25 John: But that was super disappointing.
01:20:28 Casey: Yeah, I've never tried that.
01:20:30 John: You should download it.
01:20:31 John: I think it's free.
01:20:31 John: You should download it anyway and just try it to see, like, can you use a kid's programming program to do anything useful?
01:20:37 John: And I failed.
01:20:38 John: I could not.
01:20:39 Marco: Nice.
01:20:40 Marco: I would also add, did we mention to the parent tech checklist thing, did we mention iCloud backups for on-device photos?
01:20:47 John: That's a good idea to see what the deal... I mean, that falls into the category of backups, but yeah.
01:20:51 John: See what the deal is with their pictures.
01:20:52 Marco: Right, because don't assume that your family members ever actually sync their phone to their computer.
01:20:58 Marco: Set up iCloud backup on their device because I've known so many friends and family members who have lost photos of their kids and stuff because they lost a phone or a phone broke and it was never backed up anywhere.
01:21:10 Marco: It was never synced to anything.
01:21:11 Marco: It was never backed up to iCloud.
01:21:12 Marco: A lot of times this preceded iCloud backup being a thing, but...
01:21:16 John: really i mean that's that's that's an easy one because you know they can probably get away with the free plan so that's an easy one like make sure their devices are configured for icloud photo backup that is a really good call yeah another topic related to a follow-up thing uh one of you had put into the follow-up about when we were talking about the spaces in the google authenticator thing uh and someone said did we mention that you can uh copy and paste those numbers
01:21:40 John: And in last week's show that came up, I was talking about having to remember the numbers to transcribe them, which is what I would have to do with that without a copy of paste utility when I'm going between Mac and, you know, some other device and my my phone.
01:21:52 John: But when you're on the iOS device, you can just, you know, hold down the thing and copy and paste the thing, which I'd forgotten.
01:21:56 John: And so that happened in the show.
01:21:58 John: And like.
01:21:59 John: I think it was maybe like a minute or half a minute after we discussed that, I relayed that information.
01:22:04 John: So at one point I said, oh, I had to remember the numbers and it was a pain and blah, blah, blah.
01:22:07 John: And then I said, oh, someone in the chat room has just reminded me that you can just copy and paste them if you're doing it on iOS, right?
01:22:12 John: The show came out, what, yesterday sometime?
01:22:15 John: Or was it Thursday?
01:22:16 John: Yesterday, I think.
01:22:17 John: And now I'm just watching the litany of tweets of people telling me, did you know you can copy and paste the numbers in Google Authenticator?
01:22:22 John: Hey, did you know you can just copy them?
01:22:24 John: Hey, dummy, you can copy and paste the numbers in Google Authenticator, right?
01:22:27 John: And every time this happens, I am just... So there's two things here.
01:22:30 John: One, I'm surprised at how many people tweet like in real time.
01:22:33 John: And I know the temptation.
01:22:35 John: I listen to Roderick online all the time and I say...
01:22:37 John: do not tweet anything at them wait until you hear the whole show because you have no idea if they're going to get to this you know i know it's difficult but just wait for the next hour hear the whole show then send your snarky tweet because you don't know i should build the same as an overcast feature of delayed tweeting yeah like i i mean you can take it back all right so so here's the thing with that so i see these tweets right
01:22:58 John: Now I'm faced with this decision.
01:23:00 John: Do I send a reply to the tweet that says, just keep listening to the show because I'm a Twitter completionist?
01:23:08 John: I haven't yet seen the three tweets from now.
01:23:10 John: They're going to say, oh, I guess you just said that on the show.
01:23:12 John: Sorry.
01:23:13 John: So then I would be replying to their tweet before they before they get.
01:23:17 John: And here's where I think I came down this after thinking about it for a while.
01:23:20 John: I think it's OK.
01:23:23 John: I'm going to I'm going to say that it's OK for me to send that tweet, even though seven tweets up that could be saying that because Twitter is much more real time than a recorded podcast.
01:23:32 John: Like we're talking, you know, I'm only like five minutes from maybe I'm actually literally in real time at all.
01:23:38 John: And just maybe as I'm typing the tweet there, you know, thing comes in because they're listening in real time while they're tweeting, too.
01:23:44 John: It's obvious they are not there.
01:23:45 John: Pause the program or didn't pause it.
01:23:46 John: As soon as they heard it, they sent the tweet.
01:23:48 John: Right.
01:23:49 John: I think that is a real time medium that there's it's a reasonable expectation for me to be able to reply to them just because I'm not completely caught up in this five tweets above my timeline I think it's okay to reply to that one whereas if you are listening to a thing that was recorded two days ago that's an hour long that time gap is too big and you should wait for the program to be complete most of the time I don't send a reply I just wait I just wait and scroll up and then see if they I assume they feel an appropriate amount of shame when 30 seconds later
01:24:17 John: on the podcast we described this, but I think it's two different things there.
01:24:20 John: If I'm super far behind, if I'm catching up from a day, then I should probably hold off until I'm caught up.
01:24:25 John: But the problem with that is my Twitter client doesn't have a good way to sort of
01:24:28 John: Oh, remember, you're supposed to reply to this tweet from five hours ago later.
01:24:32 John: Like it doesn't have a good sort of drafts bin where I can say when I catch up.
01:24:35 John: Yes, this tweet is still legitimate.
01:24:36 John: I'll send it or whatever.
01:24:37 John: Anyway, the moral of the story is the only thing I can say unambiguously is if you are listening to a recorded but not, you know, not live, an actual prerecorded podcast, wait until you're done listening to the podcast to send snarky tweets or email to the people because you don't know what they might have talked about later in the show.
01:24:53 Casey: I am so guilty of doing this.
01:24:55 Casey: And I agree with you.
01:24:57 Casey: Nothing you said is wrong, but I do this all the time.
01:25:00 Casey: Like poor Faith and Jason especially.
01:25:02 Casey: I feel like they get it the worst.
01:25:03 Casey: And luckily for them, I am really behind on IRL Talk.
01:25:08 Casey: So, well, maybe that's unlucky actually because I've forgotten when they tweet about something relevant to that week's episode.
01:25:15 Casey: But I do this all the time and I need to not do it.
01:25:17 John: I think it's okay if you're listening to an old episode.
01:25:20 John: Like if you are three episodes behind and you complete an episode, as long as you say in the tweet, I'm not caught up yet, but I just listened to episode whatever, whatever, and so on and so forth.
01:25:31 John: Because that shows them that you listened to the whole episode.
01:25:34 John: You're not replying in real time.
01:25:36 John: You're admitting you're not caught up.
01:25:37 John: So there's a possibility that this was talked about later, but you really feel like you really, really need to get this out of your system.
01:25:41 John: like that's probably the only way you can do that but that's that's i still feel like that's different than in the middle of the show especially if the if the correction comes like a couple of seconds later a minute later oh hey someone sent me a link to uh something in the url says hopscotch is now turing complete so i guess it wasn't i just i don't understand how you can have a programming thing i mean i it could have been like turing complete in the same way that c++ templates are turing complete like not intentionally so but like or send them out send mail is turing complete but
01:26:11 John: We've added conditional statements.
01:26:13 John: Good job, guys.
01:26:13 John: I mean, presumably hopscotch is written by programmers.
01:26:16 John: I know that's kind of, you know, a tautology, but like they know about programming, right?
01:26:21 John: The question is, can you write hopscotch using hopscotch?
01:26:24 John: No, no.
01:26:25 John: I couldn't even make two monsters chase each other.
01:26:28 John: i don't know if let's do math yet so i probably still can't do motion grab i mean maybe that's too complicated like once you give something give me something visual i end up trying to like write a game like i want to off yeah i want to i'm not trying to give people like velocity vectors and stuff i'm just trying to you know statically move them around a grid uh you know in in at some speed so they smoothly animate but anyway maybe i'll run the updater and see if it gets any better
01:26:51 John: Hey, you want to do titles?
01:26:53 John: None of these are particularly holiday-ish, are they, huh?
01:26:56 Marco: That's true.
01:26:56 Marco: We didn't really talk.
01:26:57 Marco: I mean, besides the fact that we said we were going to be traveling and you should fix your parents' stuff.
01:27:01 John: Oh, we talk about things you do when you go to your family.
01:27:03 John: I guess we didn't say anything family really.
01:27:04 John: We just had a bunch of tech nerd crap.
01:27:07 Marco: Yeah, that's us.
01:27:08 John: Also tell your family that you love them.
01:27:10 Marco: I guess.
01:27:11 John: Do that too.
01:27:13 John: After you update the roles.
01:27:16 John: You've got to have priorities.

You Have to Know When to Stop

00:00:00 / --:--:--