338: Double Chunking


00:00:00   I need to find that episode where we talked about self-driving so I can send it to people because I feel like my warnings are not being heeded.

00:00:06   Keith Pastron's warnings. Drive your cars, people.

00:00:11   You've been ripping some test flight builds like it's your job.

00:00:16   I am yet again procrastinating by making iOS 12 builds better.

00:00:23   Yeah, I've been doing the same thing except you've been doing a much better job of it than me. For people who aren't on a test flight,

00:00:29   first of all, if you want to join the beta, please join the beta. What happens with betas, this happens with every app, every beta, is

00:00:35   no matter how many testers you get,

00:00:38   you get like a couple of good installations out of each one and then they start fading and they don't install the betas anymore.

00:00:43   And I understand, I'm the same way when I'm on betas. I'll install the first couple,

00:00:47   I'll give some feedback and then I'll kind of just forget to do the updates after that and I'll never do it again. Anyway,

00:00:51   so however big your beta group is, it'll start, you know,

00:00:55   tapering off with like every build you ship will have fewer installations than the one before it did.

00:01:01   So my beta group is like I think about

00:01:05   3,800 people now. Apple allows up to 10,000, but I was only getting like 800 installs on the latest builds. By the way,

00:01:13   this is also why I occasionally reset my entire beta group.

00:01:16   I just like delete everybody and make everybody to re-sign up if they want to

00:01:19   because, you know, most of the time you gotta like cycle through people because they, you know, they fall off.

00:01:26   Anyway, in this build I am changing the sync protocol to the servers in a pretty substantial way.

00:01:32   So I wanted to get as many people testing it as possible.

00:01:35   So when most of my beta group has fallen off, I had to add new ones. Anyway,

00:01:38   so if you want to join my beta, please feel free. The link will be in the show notes.

00:01:42   Anyway,

00:01:44   Don't just skim past that. So what's the

00:01:47   reasoning behind the grandiose sync server protocol changes and to the best you're willing to share,

00:01:53   what is the executive summary of what you've done? Sure. So I mean none of this is really secret.

00:01:58   There's been a couple of challenges I've faced.

00:02:00   So the previous sync system, the, you know,

00:02:03   if you figure like a podcast has a feed, the feed has episodes in it, every time you would sync before,

00:02:08   before I had these two different methods of sync. There was the

00:02:12   complete like full sync and the

00:02:15   some objects sync. The some objects sync was a small method that would just like, as

00:02:20   you were listening to a podcaster, if you would like pause or seek or delete or recommend it, any kind of like small change to

00:02:26   a podcast, the client could send just that to the server.

00:02:29   So it was a lightweight operation and that was fine.

00:02:31   There was a whole bunch of complex logic in the app though about like,

00:02:34   how many times do you send those before you send a full sync? How often do you send a full sync?

00:02:39   Do you wait for certain delays or whatever else? Because without a full sync,

00:02:43   you can't get like entirely new things and everything. The full sync operation was very

00:02:47   heavyweight on both the app and the server side. The full sync, the app would

00:02:52   would basically send a record to the server of every episode it knew about in all of your podcasts and

00:03:00   every detail about all your podcasts too. So it would send like, you know,

00:03:03   e-tags for each one and then all the parameter values for like what you've like the user, the user set of all parts.

00:03:09   So deleted, progress, etc.

00:03:11   It would send all that to the server. Then the server would load

00:03:16   every podcast you subscribe to,

00:03:18   every episode in every podcast you subscribe to, and would filter through and try to see, all right,

00:03:23   do you have anything you shouldn't have and do I have anything you don't have that you need to have?

00:03:28   So it was this very heavy operation. You can imagine, you know, on the client side you're going through at that point possibly,

00:03:35   you know, tens or hundreds of episodes if you had a big backlog. And on the server side you were going through all

00:03:42   episodes of all your feeds. So you could have, it could be going through thousands of records easily.

00:03:47   And so it was a very very heavy operation on both sides and

00:03:52   there were two problems I wanted to solve. Number one is I wanted to get to a point where the app could have

00:03:59   locally downloaded records of all episodes of all your podcasts. Not just the current ones,

00:04:05   but their entire back catalogs. And this is for a few reasons that, you know,

00:04:09   it helps enable certain features down the road like having a list of all your start episodes,

00:04:12   things like that that people have wanted for a while. It also helps enable much better search

00:04:17   because you could, the search, the local search index on your app, on the device can index all

00:04:23   back catalog content of all your podcasts, not just the current unlisted two episodes.

00:04:27   So there were a bunch of reasons why I wanted to have everything stored locally.

00:04:30   It makes a lot of things easier and enable some cool features.

00:04:33   But to do that with the old sync system would just explode in memory and CPU usage on both sides

00:04:39   for people who had a lot of a lot of subscriptions. And a lot could be like

00:04:43   50 or more and you think that's weird, but like I have 90 and I don't think I have too many.

00:04:48   It's just, you know, they accumulate.

00:04:50   It's a lot of them are old shows that no longer update, but I still have them in my list, etc.

00:04:53   Anyway, so problem number one was I wanted to be able to store everything on the device about all your podcasts for lots of various reasons.

00:05:01   Problem number two is that this heaviness on both sides made it so that the servers were doing way more work than they should have.

00:05:09   They were using way more memory for some of these requests. People were hitting the PHP memory limit all the time.

00:05:15   Like whenever I'd set it out, like I currently have it set at

00:05:17   256 megs per request, which is a very high memory limit for a web request.

00:05:22   That's no web app in 2019 should need that much RAM to do most requests.

00:05:27   But I just had to set that high because I had to for people who had big subscription lists.

00:05:31   And, you know, just to have enough memory to do that sync operation where it loads all of their episodes of all their podcasts into memory and

00:05:38   parses through them and everything. And, you know, I did some things in the server side to help alleviate that a little bit.

00:05:43   But it wasn't as good as it could be. Like I would like stream out the JSON

00:05:47   response and everything like object by object. And so I wasn't storing it all in memory at once.

00:05:51   But it was still doing a bunch of very heavy operations.

00:05:54   The other problem is that this would explode memory usage on the client side, too.

00:05:59   And so I want to have a locally synced version that can run on the Apple Watch.

00:06:04   I want to make like a full-blown first-class overcast sync client that runs on the Apple Watch and syncs directly to my servers

00:06:11   instead of having to go through the phone because that's unreliable.

00:06:13   The only way to do that is to fit the entire sync engine in the Apple Watch's resource constraints.

00:06:18   And that was never gonna happen with the old system.

00:06:20   I decided to solve this problem with a new system that instead of making

00:06:25   one giant request to do everything, it basically makes individual requests per podcast.

00:06:30   And so it does a main sync request at the beginning.

00:06:33   I totally got rid of the some object sync. The like the two different kinds of sync request to the app, like depending on

00:06:38   severity, got rid of that completely. Greatly simplified the app code.

00:06:41   And now it just makes one request at first that is like list of podcasts. That list request tells the app

00:06:48   which podcasts it needs to update. Then the app can fetch those podcasts individually.

00:06:53   And so it turns out the sync ends up taking a little bit longer on the client side.

00:07:00   But no one notices. I can do it way more often.

00:07:04   I can do it with way less throttling, way less delay, because it's such a simple operation on both sides.

00:07:10   The memory usage on the server dropped from like something like 90 megs from my account to 8.

00:07:17   I'm a little scared that I am generating more requests.

00:07:20   So I'm a little scared like how this will scale on launch day.

00:07:23   And in fact, I will probably phase this release out with the App Store phase release feature,

00:07:29   which I've never used before. My expectation is that it's gonna be actually way less load on the servers than the current version.

00:07:34   And this enables, you know, I haven't done the the start episodes section yet,

00:07:39   because that's just more UI work that I'm deferring for now.

00:07:42   But this did enable me to hopefully fix syncing of large libraries.

00:07:47   And also I did the local search feature where now you can search everything and it's fine.

00:07:51   So anyway, once you get this version everybody,

00:07:55   the initial sync might be a little slow while it downloads all those bat catalog data blobs for the first time ever.

00:08:01   But once it has that, it's fine. Another interesting thing I did,

00:08:04   I kind of defined my own data format, which is usually not a good idea.

00:08:10   But in this case, I mentioned I use JSON for most of the server communication.

00:08:15   Yes, I know about protocol buffers. I'm very aware of things like that.

00:08:19   And there's a couple other like data formats that I'm theoretically supposed to use instead of JSON.

00:08:24   But the fact is they all have

00:08:27   requirements that I don't want to meet and they don't achieve enough of a gain

00:08:32   for me to want to tackle their complexity and requirements. So I use JSON because it's everywhere.

00:08:39   It's easy to read and write on both ends from both Apple's frameworks and from the built-in PHP stuff.

00:08:45   And I don't need anybody's weirdo libraries. I don't need to define anybody's weirdo schema or anything like that.

00:08:49   It's just super easy. So I use JSON. It compresses really well. It performs really well. The main problem though

00:08:54   is that when you are parsing on the client side, when you're parsing a big list such as

00:09:01   say a podcast has a thousand episodes and you're posting a thousand entries of that like in like the response from my server request of like

00:09:08   "Hey, what episode do I need?"

00:09:10   The client has to, when it's decoding that big blob of JSON, has to decode the entire thing in memory at once.

00:09:16   Most JSON libraries including Apple's built-in one don't have what in the XML world was called a SAX parser.

00:09:23   Basically, they don't have like a streaming JSON parser. You can't like stream out one object at a time

00:09:29   from a giant response or a file.

00:09:32   You have to load the whole thing into like one giant dictionary in memory and then access it.

00:09:37   And this again would go against my memory requirements for like having things be very small and sparse so that they could fit on the Apple Watch.

00:09:44   So I just defined a very slight modification where my servers are still sending JSON,

00:09:50   but they are sending it in a streamed format.

00:09:53   So they basically send a little tiny header to identify it as this format and then they send blobs that

00:09:59   they first send the size of the following JSON blob and

00:10:04   then they send the JSON blob. And then the next is another one of those integers

00:10:07   that's the size of the next one and they send the next one. And so it allows on the client side very, very easy

00:10:12   stream parsing of JSON data. So I read, if I see this header, I know it's a stream and so I

00:10:20   read that size, read that chunk, parse it, deal with it, throw it away, read the next size, read the next chunk.

00:10:26   It'll be great if these responses are being sent with transfer encoding chunked.

00:10:31   Because that's what you basically have. Did I just reinvent something there?

00:10:34   Yeah, but HTTP has a protocol where it does exactly that. The size of the next chunk, then a chunk of the size of the next chunk.

00:10:41   It may be happening right now, it depends on what your client and server support, but I don't think that would help you because you'd have to

00:10:47   interact. First of all, you wouldn't get to choose where the chunks are, I think. Right, which for JSON parsing would ruin the entire thing.

00:10:53   Right, but you should check what's going over the wire. You may actually be double chunking this, which would be fun.

00:11:00   Yeah, you know, I've seen the chunked encoding thing go by in headers here and there in my career.

00:11:06   I never knew the details of what that was.

00:11:08   Now I know, thank you.

00:11:11   So anyway, though I may be double chunking, it does actually work.

00:11:15   I'm keeping it very, very simple.

00:11:18   I thought, oh, should I be fancier and maybe serialize

00:11:22   some more of the common fields that are in my JSON objects into binary fields?

00:11:27   And I thought, no, stop right there. That's crazy town. I don't want to reinvent protocol buffers.

00:11:31   Like I just want to have a very simple streamable JSON format.

00:11:36   And that's what I have. It took minimal modification to either side. And here we go.

00:11:41   So that's what I've been doing. It's almost done.

00:11:44   I will probably submit to the App Store in the next week or so. And that's it.

00:11:48   Busy bee.

00:11:51   Yep.

00:11:51   Making me feel bad. That's a good thing.

00:11:54   So I'm curious, how is your photo hashing problem coming?

00:11:57   I haven't had much time to look at it since we last spoke.

00:12:00   I did, however, I wasn't actually planning on bringing this up,

00:12:04   but I did get some very useful feedback from a couple of people who had said,

00:12:08   hey, and well, and they were both very polite, which is very nice,

00:12:11   because this is totally the sort of thing that your typical, you know, internet jerk would be like,

00:12:17   didn't you know that, but that was not the emails I got, which I very much appreciated.

00:12:21   The emails I got were, hey, man, did you know that I think it was session 222,

00:12:26   I'll put a link in the show notes, of this past WWDC,

00:12:30   Apple actually had a very brief part of a vision framework presentation wherein they said,

00:12:36   hey, here's how you can figure out duplicate images.

00:12:39   And I watched, which was at first very frustrating,

00:12:42   I watched that it seemed way more complex and maybe not as useful as it was painted to be.

00:12:53   In a perfect world, it will be useful and it will replace my kind of homegrown hashing algorithm thing.

00:13:00   But I'm unconvinced it is an exact fit for what I want.

00:13:05   And this was in the context, this session was largely about classifying things within images.

00:13:10   So if you have a picture of a cat, you know that there's a cat in a bowl of something,

00:13:13   I was going to say bowl of milk, but I guess all you would know is that there's a bowl there,

00:13:16   and a kitty cat, and a person or whatever the case may be.

00:13:19   And so they obviously, with duplicate detection, they talk about more than just, you know, classification.

00:13:27   So yeah, two cat images are by no means necessarily the same.

00:13:31   But anyway, I got to look at this again and see if it's useful.

00:13:35   But I was just thinking to myself earlier tonight that I really need to stop procrastiworking about iOS 12 stuff

00:13:42   and really got to get into like dark mode and a couple of the kind of low hanging fruit pieces of iOS 13.

00:13:48   And I've been trying to convince myself to really try SwiftUI again,

00:13:55   which I tried briefly earlier in the summer and wanted to go bald and rip all my hair out because it was so frustrating.

00:14:01   And I really, the siren call is strong, gentlemen, but I know the adult in me knows it's just too early for that.

00:14:07   You know, this is like jumping in Swift, and I love Swift, and I am a Swift apologist,

00:14:11   but this is like jumping onto Swift when it was Swift 1 timeframe.

00:14:15   You can do it. I would recommend it, but you can do it.

00:14:19   In some way, sometimes, somehow I might get into a deeper rant about SwiftUI,

00:14:23   but I think Syracuse is going to give me the Apollo hook if we don't get to follow up soon.

00:14:28   But in summary, I got some stuff to look at, and I very genuinely, I very much appreciate the emails that came in,

00:14:32   not only just pointing me in that direction, like it would have been useful even if these people were jerks,

00:14:37   and said, "You dummy, look at this."

00:14:40   But I doubly appreciate that they were nice and said, "Hey man, check this out." So I need to look again.

00:14:45   And there were also, there were a bunch of recommendations for like simple algorithms,

00:14:48   and I didn't mention during it, but I think I've talked about it before,

00:14:51   but I actually wrote a similar algorithm for an overcast feature, I think it's still there,

00:14:57   where sometimes a podcast would embed in its MP3 the same image as its cover art, but in worse quality.

00:15:08   And so I wanted to detect whether the embedded image was the cover art,

00:15:13   and then if it was, I would pick whichever had like the bigger pixel size to be the one that I actually showed.

00:15:20   And so a number of people wrote in to basically suggest what I ended up doing, you know, five years ago,

00:15:25   which was I would resize the image down to some very small size, I think it was like 16 by 16 or something like that,

00:15:32   resize both images down to a very small size, and then go through pixel by pixel, and just track like,

00:15:37   and I think I did it in the HSB space, so you know, hue, saturation, brightness, instead of RGB,

00:15:44   because it was easier to detect, you know, certain differences, and just say like, you know,

00:15:48   what percentage different are these pixels in these two images?

00:15:52   And is this pixel, you know, a 50% difference in saturation from the other one, et cetera?

00:15:57   And then like you take the average of like how different these values are across these two very small scaled down versions.

00:16:03   And you can do all this very, very quickly on modern hardware, like even five years ago, that was nothing to do.

00:16:09   It isn't incredibly sophisticated, like it wouldn't detect things like 90 degree rotations,

00:16:13   or like, you know, having an image have like a different crop on it, but be like two parts of the same image.

00:16:19   Like it wouldn't detect a major difference like that.

00:16:21   But if it's just like two different versions of the same picture, just like with different services, sizes,

00:16:27   and crappy JPEG compressions, it detects those flawlessly.

00:16:32   I assume, like when you said, you were talking about like an image hashing thing,

00:16:36   I assume that was the kind of thing you were talking about?

00:16:38   - Well, so it's similar, so I can go into slightly more detail about this, and this was,

00:16:43   based on algorithm, I'll put a link in the show notes to the source, not as in source code,

00:16:47   but sources in the webpage that had instruction about this algorithm

00:16:51   that a dear friend of the show, Craig Hockenberry, had pointed me to.

00:16:54   The general gist of the algorithm, it's similar but not the same.

00:16:57   So the first thing I do is I shrink them to the images to 16 by 16.

00:17:01   Then I convert to grayscale.

00:17:03   Then I take an average of what those,

00:17:06   like the float values of those colors, and I average it out, and I'm making this up.

00:17:11   Let's say, you know, the average is five,

00:17:13   and I'm dramatically oversimplifying,

00:17:15   but let's just say the average is five.

00:17:17   Well, any of the colors on each of those pixels,

00:17:21   any of the colors that are above or equal to five gets treated as a one.

00:17:25   Any of the colors that are below or less than five,

00:17:28   oh, that's the same thing, below five gets treated as a zero,

00:17:31   and suddenly I now have a 64-bit numeral,

00:17:36   because I've got a 16 by 16, I did that math right,

00:17:39   a 16 by 16 image that I've now

00:17:43   gotten one bit per pixel.

00:17:47   So now I have a 256-bit integer,

00:17:51   and that is the hash.

00:17:53   And then once I have two of those integers,

00:17:56   I compute what's called the Hamming distance,

00:17:57   which is to say how many of these ones or zeros match each other.

00:18:02   So if you look at the zeroth position of both integers,

00:18:05   are they both one or are they both zero?

00:18:08   If you look at the first position, are they both one or are they both zero?

00:18:10   And the amount of non-matching positions is the distance.

00:18:17   So if you have five non-matching positions,

00:18:19   which is I think the threshold I'm using right now,

00:18:21   which I probably have to tweak as we spoke about last time,

00:18:23   if you have five as the distance,

00:18:25   those are probably pretty damn similar images.

00:18:28   If you have 50 out of 64 as your distance,

00:18:32   they're probably not the same.

00:18:33   And again, I'm oversimplifying a little bit,

00:18:35   because it's kind of hard to paint a word picture here,

00:18:37   but I'll put a link in the show notes

00:18:39   so you can dig a little deeper into it.

00:18:40   I do like what I've done.

00:18:42   I think, I'm not saying it's flawless,

00:18:43   but I think it's a pretty solid way of approaching the problem.

00:18:46   To your point earlier, Mark,

00:18:47   it wouldn't handle rotation or things like that.

00:18:50   And it's not flawless, as John has pointed out,

00:18:52   with things as simple as JPEG compression.

00:18:54   Now, I think some of that I could tweak with,

00:18:56   you know, by tweaking the threshold

00:18:58   between what I consider to be the same

00:18:59   and what I consider to be different.

00:19:01   It seems to be going okay so far,

00:19:03   but I definitely need to do more tweaking.

00:19:05   As a quick side note before I let you guys comment on this algorithm,

00:19:08   I had written this so that, you know,

00:19:11   when I had these two, you know,

00:19:13   these two 64-bit integers, I needed to, you know,

00:19:16   figure out, well, what bits match and what bits don't?

00:19:20   And I wanted to know when one or the other was,

00:19:25   you know, when they were not matching, basically.

00:19:27   So I have one, if I have two bits,

00:19:30   one is one and one is zero, or one is zero and one is one.

00:19:33   And I wrote this like super, super ridiculous,

00:19:36   like I think it was a nested loop to figure this out.

00:19:39   And then it occurred to me, wait, wait, wait, wait, wait.

00:19:41   - You forgot what, that XOR exists?

00:19:43   - Then, as I was telling my father about this,

00:19:45   'cause he happened to be there right as I'd finished this up,

00:19:48   I was like, wait a second, this sounds, oh God,

00:19:51   I can definitely use an XOR here, can't I?

00:19:53   So I felt like such a damn fool

00:19:57   when I realized they were in my ways.

00:19:58   Thankfully, I realized it before I shipped to anyone.

00:20:01   - You're reinventing it from first principles, Casey.

00:20:04   - I mean, to be fair, like,

00:20:05   I bet the majority of working programmers

00:20:07   don't know what XOR is.

00:20:08   Second of all, even those who know what it is,

00:20:12   I'm pretty sure I've had zero times

00:20:14   when I actually had to use it in my career.

00:20:16   - Exactly, exactly.

00:20:18   - I've totally used it.

00:20:19   - Of course you have.

00:20:20   - Of course you have.

00:20:20   - Back in the day, you were looking for an excuse

00:20:22   to do bitwise operations in C.

00:20:24   It was like, what clever, you know,

00:20:26   it was like your first option.

00:20:27   - I do bitwise operations all the time.

00:20:29   I just have never had a use for XOR.

00:20:32   I even do them in PHP.

00:20:34   - It's funny to me that both of you picked it out

00:20:36   as I was starting down this path.

00:20:37   - I've used it in conditional expressions.

00:20:40   As in, you know, you can do like double ampersand

00:20:44   and double pipe for the OR, like in a big if or whatever.

00:20:47   Well, Perl, no surprise, has XOR operations.

00:20:50   So does C for that matter, but Perl has logical XOR,

00:20:53   not just bitwise.

00:20:54   And I've used logical XOR.

00:20:55   - Oh, you're so fancy.

00:20:57   - Yep, and then you have a big comment at the top

00:20:59   that says, look how clever I am, did you know this?

00:21:01   (laughing)

00:21:03   So anyway, so I was both humiliated

00:21:06   and then ultimately proud of myself

00:21:08   for having realized as I was just kind of walking Dad

00:21:10   through the general gist of the algorithm.

00:21:13   'Cause Dad has never written code,

00:21:14   but he's a reasonably tech-savvy guy.

00:21:17   And so if I give him the broad strokes of something,

00:21:19   he can usually follow along.

00:21:20   And yeah, as I was describing it, I was like,

00:21:22   wait, holy crap, I think that's an XOR.

00:21:24   I gotta double check that and look that up.

00:21:26   So turns out that made that code a lot quicker

00:21:28   and a lot smaller.

00:21:29   Who'd have thunk it?

00:21:30   - I'm glad none of us say XOR.

00:21:32   - Does anybody say that?

00:21:33   Let's just celebrate that.

00:21:34   - That sounds like something I would do,

00:21:36   be it deliberately or otherwise, but no.

00:21:39   It's an XOR, thank you very much.

00:21:41   - Yeah, your description of that algorithm

00:21:43   just makes me think of all the ways it can fail.

00:21:44   But setting that aside, it's a perfect opportunity

00:21:49   for you to make unit tests.

00:21:50   Every time someone sends you a pair of images that fail,

00:21:54   you add it to the test data and you tweak the thing.

00:21:56   And then if you end up chasing your tail

00:21:58   and you can't get it to pass on all the images,

00:22:00   then maybe it is actually time to dive in

00:22:03   and try to get some kind of machine learning thing.

00:22:06   'Cause by then you'll have a good data set

00:22:08   of images that you think are the same,

00:22:09   and then you can train the thing

00:22:10   to also think they're the same.

00:22:12   - You know, I know that you are correct.

00:22:15   I don't think I am smart enough to handle

00:22:18   anything related to machine learning.

00:22:19   I'm sure that it's not as complex as I'm painting it, but--

00:22:22   - Oh, really?

00:22:23   You could use that GUI app that Mike Mattis makes

00:22:25   or whatever, you just connect a bunch of boxes together

00:22:27   and throw a bunch of images at it

00:22:29   and click on things and correct it,

00:22:30   and then it out pops a model that you just jam into CoreML

00:22:33   and you just run it.

00:22:33   - Just like that.

00:22:34   Small matter of programming.

00:22:35   - And then it gets bizarre results that you can't explain.

00:22:38   But you're already getting bizarre results

00:22:40   that you can't explain, so it's like you're already there.

00:22:42   - I do wanna also echo your thoughts

00:22:46   before we leave this entire genre of topics on SwiftUI.

00:22:49   It is very similar to what you said

00:22:52   of it's just like the first year of Swift,

00:22:55   where it obviously is changing constantly.

00:22:59   And there's a lot of people having a lot of fun

00:23:02   and getting a lot of stuff done,

00:23:04   like writing tutorials and playing with it

00:23:07   and making test apps or making real apps.

00:23:10   But it is so not for me,

00:23:13   because it is still so much in flux

00:23:18   that you have to, the things that are changing

00:23:21   between betas are pretty significant things still.

00:23:25   I am very tempted to rewrite my entire watch app in SwiftUI.

00:23:29   I haven't started that yet.

00:23:30   I'm very, very tempted.

00:23:31   But there's so much churn in using SwiftUI right now.

00:23:36   And the tools are so early and the frameworks are so early,

00:23:38   and all of this is gonna be so much better next year

00:23:42   when next year's betas come out and they fix all the,

00:23:45   well, they fix many of the problems

00:23:46   with this version of SwiftUI.

00:23:48   I'm probably not gonna write any SwiftUI until next year,

00:23:51   because it'll just be so much easier then.

00:23:54   - Yeah, that's the thing.

00:23:55   So I don't remember if it was Swift 2 or Swift 1

00:23:59   where I really started, it was 2016,

00:24:01   so it might have even been three.

00:24:02   What was the awful, I can't ask you to,

00:24:04   but whatever the awful transition was,

00:24:07   I think that was three to four maybe?

00:24:09   Maybe it was two to three, I forget now.

00:24:10   But I was writing Swift professionally

00:24:14   when there was that god-awful transition

00:24:16   where everything under the sun changed names.

00:24:18   And that's where Swift, I think,

00:24:19   really got a bad reputation.

00:24:21   The chat room was saying it was two to three,

00:24:24   because everyone had to rewrite

00:24:25   like half their darn code base,

00:24:26   and it was very frustrating.

00:24:27   Nevertheless, I had been writing Swift,

00:24:30   so starting maybe Swift 2.

00:24:32   And early on, the tooling was bad.

00:24:34   I'm not trying to say it wasn't bad,

00:24:36   but the thing that drove me most nuts about it

00:24:38   was even if we did get an error message,

00:24:41   the error messages were completely and utterly inscrutable.

00:24:45   There was no way to look at these error messages

00:24:49   and figure out what in the name of Zeus's butthole

00:24:51   they were talking about.

00:24:53   And that was frustrating, but eventually--

00:24:54   - Is that much better now?

00:24:56   - Well, so that was very frustrating,

00:24:58   but I actually feel, and I mean, granted,

00:25:00   maybe this has to do with me getting to be a much more,

00:25:03   I'm just gonna say senior,

00:25:04   but I don't know if that's really what I mean,

00:25:05   but a more experienced Swift developer.

00:25:07   And now I feel like with normal, like vanilla Swift,

00:25:11   I can look at a Swift error message,

00:25:12   and not always, not always,

00:25:13   but I'd say 60 to 80% of the time, which is not great,

00:25:17   but 60 to 80% of the time,

00:25:19   I can put together what the actual issue is.

00:25:22   And when I can't, you just add type annotations

00:25:24   all over the place, and usually it figures it out.

00:25:27   But nevertheless, with Swift UI,

00:25:30   all this is to say with Swift UI,

00:25:32   I look at these error messages

00:25:34   and I don't have a (beep) clue what is happening.

00:25:37   Like what, huh?

00:25:39   What, where?

00:25:40   What are you talking about?

00:25:42   And so often the error is many lines away

00:25:46   from where the error is being reported,

00:25:49   which also happens in regular vanilla Swift from time to time

00:25:51   but it is bad with Swift UI.

00:25:54   And that's really frustrating

00:25:56   because it feels in so many ways,

00:25:58   as a Swift person, it feels like a regression.

00:26:01   You know, I'm like, I'm getting all of these,

00:26:05   I'm getting all of these bad feelings

00:26:07   from early days of Swift coming back

00:26:09   and they're not welcome here and I don't want them.

00:26:11   So that's the tough thing, right?

00:26:13   'Cause when Swift UI is going well,

00:26:14   and this is, I mean, like so many things

00:26:16   in both computing and in life,

00:26:17   when it's going well, it is incredibly fun.

00:26:21   And I mean that, I mean that word deliberately.

00:26:24   I'm using that word deliberately.

00:26:25   It is incredibly fun to be writing these UIs

00:26:28   and watching them refresh instantly.

00:26:30   And it's so fast and so enjoyable and declarative and great.

00:26:35   And then you put one thing in the wrong spot

00:26:38   and everything falls apart.

00:26:40   And it falls apart in ways that are,

00:26:42   I would argue impossible to understand.

00:26:45   And that's the thing that just sucks all the fun out of it.

00:26:49   It sucks all the air out of the room

00:26:50   and makes me agree with you, Marco,

00:26:51   that yeah, you could, one, could write very good

00:26:56   user interfaces with Swift UI today.

00:26:59   But if you wanna do that without ripping all your hair out

00:27:02   and causing yourself to go bald, eh, maybe wait a year.

00:27:05   - Even if you're already bald,

00:27:06   I can highly recommend waiting a year.

00:27:07   (laughing)

00:27:08   Because everything you just mentioned

00:27:11   is going to be better next year.

00:27:14   To some degree, just because of the nature of Swift

00:27:16   and because of the nature of compilers,

00:27:18   there's always going to be some degree of obtuseness

00:27:21   and weird error messages possible

00:27:23   if you put a character in the wrong spot

00:27:25   or miss one thing in the language.

00:27:27   Right now, I think it's probably as bad

00:27:30   as it's ever going to be because it's brand new.

00:27:32   The tooling still hasn't really caught up

00:27:33   very much yet to it.

00:27:35   Everything is very early.

00:27:36   And so over time, the tooling is gonna get a lot better,

00:27:40   which means the error reporting's gonna get a lot better.

00:27:43   You'll have more of those little fix it buttons

00:27:45   that you could just click a button

00:27:46   to have to fix a typo or something like that, hopefully.

00:27:48   But also, this is an incredibly complex pile of hacks

00:27:53   on top of an incredibly complex language.

00:27:58   And so I think there's only ever going to be

00:28:01   a certain amount of niceness that is possible to give

00:28:05   in things like error messages in Swift UI

00:28:08   because Swift UI, it isn't some native thing

00:28:13   that came easily to the language.

00:28:15   It's very much like a very complicated pile of complexity.

00:28:20   - Well, I both agree and disagree there.

00:28:22   Swift UI is built out of Swift, and that sounds stupid,

00:28:28   but there's no, there's magic-ish there,

00:28:33   but if you follow, like you can see

00:28:35   how the magic is held together, you know?

00:28:36   And that's not just because Swift is open source.

00:28:38   I'm not talking about digging into like

00:28:40   the Swift C++ compiler, God help me, no.

00:28:42   - No. (laughs)

00:28:43   - So a lot of Swift UI and like the DSL,

00:28:46   it is screwtable if you're willing to put in the work,

00:28:50   but I agree with you, Marco, that no regular human being,

00:28:54   myself very much included, is going to put in the work

00:28:57   to really and truly understand how the Swift UI DSL works.

00:29:01   And so in that sense--

00:29:02   - What do you mean no regular human being?

00:29:04   Anybody who knows?

00:29:06   I think, I don't want to talk about Swift UI yet

00:29:09   'cause I still have some more research

00:29:10   and session viewing that I'm watching,

00:29:13   but the features that the Swift UI,

00:29:17   that make the Swift UI DSL possible are language features.

00:29:20   And anybody who knows Swift and is interested

00:29:25   in writing Swiftie code, if making your own DSLs

00:29:28   becomes a Swiftie thing, which I think it might,

00:29:30   will know how it works and will be able

00:29:32   to write their own DSLs that look just like Swift UI,

00:29:35   but do their own cool things.

00:29:36   And so I don't think, I mean, it may not be common,

00:29:39   most people won't know, but anybody sort of skilled

00:29:42   in the art will not be afraid, in the same way

00:29:44   that people know how React works.

00:29:47   Like not most of them don't, most of them

00:29:49   are just futzing around, but if you start actually working

00:29:51   with React in a serious way, you learn all the language

00:29:54   features that it's using in JavaScript.

00:29:56   So I don't think it is, I don't think it's gonna remain

00:30:00   magical for very long.

00:30:01   Once the normal people who know all the different corners

00:30:04   of languages will also know this corner

00:30:06   'cause it's part of the language, it's not some one-off

00:30:08   thing that was just done for Swift UI.

00:30:10   - Well, I do think that there's a certain amount of

00:30:13   obsession with minimalism that we've had across

00:30:17   the entire industry in the last decade or two

00:30:21   that has crept into programming languages in a way

00:30:24   that it seems at first like a good thing,

00:30:28   but what actually has happened, there's this huge downside

00:30:32   of when there's so much complexity beneath the surface,

00:30:38   it makes it harder to understand what the system is doing

00:30:41   and it makes it harder for new programmers to get up to speed

00:30:45   with the language and to be productive

00:30:46   in the face of problems.

00:30:47   Now, granted, I'm not saying the languages of yesteryear

00:30:50   were easy in those ways all the time.

00:30:52   I mean, I still remember, we all probably remember

00:30:54   the first time we were programming something in C

00:30:56   in comp sci 200 whatever and you build something

00:31:01   and run it and you see segmentation fault.

00:31:03   And like, well that could be anything.

00:31:06   And like, there's lots of hard learning

00:31:11   in becoming an expert in programming.

00:31:13   But I feel like a lot of our modern languages,

00:31:17   and I think this even started with like Rails,

00:31:21   so not even that modern, but especially when you look

00:31:23   at things like modern frameworks, modern JavaScript

00:31:25   frameworks, Swift, Swift UI, they seem to obsess over

00:31:30   minimal amount of code possible in the ideal case.

00:31:35   And in some ways that's good because minimal amount

00:31:37   of user-facing code shoving all the complexity

00:31:40   to frameworks and stuff means you have less code

00:31:43   to maintain, so in some ways that's great.

00:31:45   But when you need to like break outside

00:31:48   of the bounds slightly or when you need to know

00:31:51   how something works under the hood or when you hit an error

00:31:54   or a bug that is because of something happening

00:31:57   under the hood, it seems like these days we have

00:32:01   more complexity than ever under that hood

00:32:04   in this effort to make what's above it seem so minimal.

00:32:07   And I feel like we've raised the bar so much

00:32:11   for what new programmers have to understand

00:32:14   in order to understand everything their app is doing

00:32:16   and be able to diagnose tricky problems.

00:32:19   - Yeah, I completely agree with you.

00:32:20   And I was thinking about this a few days ago

00:32:22   when I was also trying to work in the car

00:32:23   when we were traveling somewhere else.

00:32:25   And it occurred to me after having fought,

00:32:29   and some of this was my own fault, but I had spent

00:32:32   a trip to and from, an hour each direction from home.

00:32:37   So we drove an hour and I was working on this

00:32:39   and then I put it away for a while and then when we came

00:32:41   back home I was working on this for another hour.

00:32:43   So that was like 130 miles or 200 kilometers

00:32:46   of me just fighting with Carthage and Git and GitHub issues,

00:32:50   which happens very rarely, but it happens to me

00:32:52   like once or twice a year where everything just decides

00:32:54   to crap the bed and I just have to like rebuild everything

00:32:58   from scratch and it is incredibly frustrating.

00:33:01   And again, like okay, you shouldn't use

00:33:03   third party libraries, yeah.

00:33:04   Okay, whatever, I use third party libraries,

00:33:07   I don't use a lot, I only use a few.

00:33:09   They're extremely well tested, they work for me.

00:33:11   May not work for you, works for me.

00:33:12   And yeah, okay, CocoaPods is a thing, I understand that.

00:33:15   I've had even worse experiences with CocoaPods.

00:33:17   I prefer Carthage.

00:33:18   - CocoaPods is the worst.

00:33:20   The only thing worse than CocoaPods is Homebrew.

00:33:22   (laughing)

00:33:25   - Oh, Homebrew has gotten so aggressive lately,

00:33:27   but let's leave that for another time.

00:33:29   But anyway, so yeah, I spent 130 miles, 200 kilometers,

00:33:32   as a passenger, just fighting, balls, fighting bull crap.

00:33:37   And it's so, so frustrating because it shouldn't

00:33:41   be this hard.

00:33:42   Now on the flip side of the coin, I can suck in thousands

00:33:45   of lines of code that hundreds of other people

00:33:48   have toiled over for thousands upon thousands of hours

00:33:51   in no time, so there are benefits that come from this.

00:33:54   But yeah, I agree with you, Marco.

00:33:55   Like the whole way up and down the stack has gotten,

00:33:58   even in my career, which has only been what, like 15 years,

00:34:02   however long, Marco, you and I have been working at this,

00:34:04   you know, it's only been 10, 15, 20 years

00:34:06   that we've been doing this, and it has gotten

00:34:08   just way harder than it used to be.

00:34:11   And before I give John a chance to teach us youngsters

00:34:14   what's going on, I wanted to call out,

00:34:16   I think John had said a minute ago,

00:34:19   well, people will be creating their own DSLs.

00:34:21   I've been fascinated by watching John Sundell

00:34:24   talk about rebuilding his own website

00:34:28   by using server-side Swift and writing his own custom DSL

00:34:31   to do it, and he has said numerous times

00:34:34   that he's going to open source this eventually.

00:34:36   And when I say eventually, it sounds like it's gonna be soon,

00:34:39   just not yet, and I'll put a tweet in the show notes

00:34:41   of an example of this that, to me,

00:34:43   is just extremely, extremely cool.

00:34:46   And I don't know if I have the wherewithal to understand

00:34:49   what, how, I understand what's happening,

00:34:51   but the how, I'm unconvinced I would be able to figure out.

00:34:55   But I feel like if I can look through John's code

00:34:58   when he open sources it, that'll really help me understand

00:35:00   how this is all held together.

00:35:02   Anyway, John, tell us why we're young and stupid.

00:35:05   - So the general point about abstraction

00:35:09   and the more stuff than ever beneath you,

00:35:11   that's been true at every point of computers, obviously.

00:35:14   Now, the sum total is still larger,

00:35:16   so that point stands, like as time marches on,

00:35:19   the amount of stuff that you're building

00:35:22   on top of increases and we get to higher level stuff.

00:35:26   That's just always going to be true,

00:35:27   and it's just a question of, as we were discussing before,

00:35:30   how mature are those abstractions,

00:35:32   how mature is the tooling surrounding them,

00:35:33   because back in the day, it was like,

00:35:35   how the hell am I gonna deal with this C compiler,

00:35:37   whatever, I can't even tell what the CPU is doing,

00:35:39   I have no access to the registers, this is garbage,

00:35:41   when something really goes wrong,

00:35:42   I really need to get down to them anyway,

00:35:43   and I have an account, but you know,

00:35:45   so it's the same exact complaints,

00:35:46   you just change around all the nouns and everything.

00:35:49   But the stack does get bigger, right?

00:35:51   And at various times, like oh, now C is mature,

00:35:54   and people forget about the lower abstraction,

00:35:56   it's so good that you don't really need to worry

00:35:57   about that stuff, except for in a few weird cases,

00:35:59   and we march up the stack, and as you guys both pointed out,

00:36:02   SwiftUI is super young, so of course,

00:36:03   it's gonna be the most painful time

00:36:05   to be doing anything with it.

00:36:06   The flip side of that, which I think I mentioned

00:36:07   with Swift as well, is if you're into this type of thing,

00:36:10   this is the time to be able to influence SwiftUI,

00:36:13   give your input on how you think it should work,

00:36:14   introduce your ideas into the community,

00:36:16   you know, contribute your code to it,

00:36:18   whatever you want it to be,

00:36:19   because Swift is open, the evolution process is open,

00:36:21   if that's something you're interested in,

00:36:24   language for language's sake,

00:36:25   frameworks for frameworks' sake,

00:36:27   if you're one of those type people

00:36:28   who likes to develop those,

00:36:29   you would definitely get in early,

00:36:30   and yes, it would be super painful and everything,

00:36:32   but this is the time where you could have the most influence

00:36:34   just as you could have back in Swift 1 and 2 or whatever.

00:36:37   But if you just wanna use it as a tool,

00:36:39   then wait for it to mature.

00:36:40   And Marco's other point about the sort of fashion

00:36:44   and culture of minimalism and the whole phrase of DSL,

00:36:48   which I should really put scare quotes around,

00:36:49   'cause I've never liked that phrase,

00:36:51   and it is tied up with a bunch of specific fads or whatever,

00:36:54   that is also a thing,

00:36:56   and those kind of fashion trends in the tech world

00:36:59   come and go.

00:37:01   I think SwiftUI is,

00:37:04   it's a little bit in the vein of that kind of minimalism,

00:37:07   but I think it's more in the vein of adopting

00:37:10   some of the fads from the web world and bringing them over,

00:37:12   but you know, like I said, I'm still digging into SwiftUI,

00:37:16   and I wanna sort of get my brain around it

00:37:18   in a more significant way before I have

00:37:21   anything more particularly intelligent to say about it.

00:37:24   There was, speaking of Sundell,

00:37:28   Brent Simmons was on, oh, it's Swift by Sundell,

00:37:32   the same one you were on, Casey,

00:37:33   what's the name of that podcast?

00:37:34   - Yeah, it's Swift by Sundell.

00:37:36   - Yeah, and they were talking about SwiftUI a little bit,

00:37:39   and they were mentioning like,

00:37:41   thinking off into the future,

00:37:43   how, what a great fit it will be

00:37:45   that I don't think it's gonna be next year,

00:37:46   they're optimistic thinking it'll be next year,

00:37:48   but I think like in two years,

00:37:50   when the sort of Swiftified equivalent of core data comes

00:37:54   and ties into SwiftUI,

00:37:56   so you can sort of define your models

00:37:57   with a domain-specific language, quote, unquote,

00:38:00   and tie that to your SwiftUI views in a cool way,

00:38:03   you know what I mean?

00:38:04   Like, you can see how it might come together.

00:38:06   If you buy into this way of programming

00:38:08   and assume the tooling will get better

00:38:09   and assume all the blah, blah, blah,

00:38:11   you can see how a Swifty SwiftUI data layer

00:38:16   would fit together with the UI layer in a really cool way.

00:38:19   And again, I don't think that's coming next year.

00:38:21   Next year, they should just work on SwiftUI

00:38:22   and get the tools and everything better,

00:38:23   and maybe the year after that there's a data layer,

00:38:25   but I'm already looking forward to that.

00:38:27   - See, for me, like, I have a hard time getting excited

00:38:29   about that kind of stuff, usually,

00:38:30   because like, it's actually kind of similar to SwiftUI,

00:38:34   although not, a little bit worse in this way.

00:38:37   Usually, you can only really take advantage of it

00:38:39   if you're like starting an app from scratch.

00:38:41   Like, there's usually not a lot of like,

00:38:43   easy ways to take an existing code base

00:38:45   and migrate it to a whole new data layer.

00:38:47   - That's the beauty of this approach, though.

00:38:49   Like, just like with SwiftUI,

00:38:50   you can just use it in one place.

00:38:52   It's not that you have to recommit your entire app to it,

00:38:54   right, so if done in the right way,

00:38:57   you don't have to say, oh, I've gotta just throw away

00:38:59   all my model code and replace it all with this.

00:39:01   You might be able to take your existing model code

00:39:03   and like, have a shim or a series of protocols

00:39:06   that allow it to conform so you can just chuck it

00:39:08   over the wall to something that understands

00:39:09   how to bind it to a SwiftUI view,

00:39:11   but really, it's your model underneath,

00:39:12   you know what I mean?

00:39:13   There are ways to do it that won't be as painful,

00:39:17   and they're not easy, right,

00:39:18   but the job they've been able to do with SwiftUI,

00:39:21   making it so you can adopt it in small chunks

00:39:25   makes me hope that that philosophy will imbue

00:39:27   whatever hypothetical Swifty data layer

00:39:31   that we're speculating about.

00:39:33   - I just wanted to reiterate what you said.

00:39:35   The episode with Brent Simmons of the Swift by Sloane Dell

00:39:38   podcast I thought was very good.

00:39:39   I really enjoy listening to Brent's take on things

00:39:43   because he has the experienced and learned opinion

00:39:48   that I long to get better at having,

00:39:51   but am too young and stupid to have yet.

00:39:53   - I mean, he has wisdom.

00:39:54   Like, what you need--

00:39:55   - Wisdom is a better word for it, yep.

00:39:57   - So much of success or failure in this business

00:40:01   is not about specific language or technical achievements.

00:40:06   It's about bigger picture strategies,

00:40:09   figuring out what to do, what not to do,

00:40:11   what's important, what's not important,

00:40:13   and listening to Brent and reading his blog posts

00:40:17   and everything, I learn a lot about that kind of stuff,

00:40:19   so I suggest we'll put it into his blog as well.

00:40:21   It's always a good read.

00:40:22   We are sponsored this week by Clearbank.

00:40:26   Clearbank is changing the way entrepreneurs raise money

00:40:29   with equity-free capital.

00:40:31   Co-founder Michelle Romano, star of Canada's Dragon's Den,

00:40:34   which is the Canadian version of Shark Tank,

00:40:36   co-founded Clearbank with her partner, Andrew D'Souza,

00:40:38   after seeing how many companies were willing to part

00:40:41   with precious equity in exchange

00:40:43   for a bigger marketing budget.

00:40:45   Clearbank believes that founders shouldn't give up

00:40:47   a piece of their company to fund marketing

00:40:49   and inventory expenses.

00:40:51   Clearbank makes equity-free investments

00:40:53   from 10,000 to $10 million and can get you a term sheet

00:40:56   in less than 20 minutes.

00:40:58   They charge a small, flat fee for the capital

00:41:00   and you pay them back using a win-win rev share.

00:41:03   This is not a loan, there's no interest rate,

00:41:05   no fixed maturation date, no personal guarantees,

00:41:08   no credit checks, and no financial covenants.

00:41:11   Clearbank has relationships with marketing agencies,

00:41:13   e-commerce professionals, venture capitalists,

00:41:16   accountants, and more, giving you a true,

00:41:18   unfair advantage in the market.

00:41:20   Clearbank invested over $150 million in 2018

00:41:24   and is on track to invest over a billion this year.

00:41:27   Some notable portfolio companies include Public Goods,

00:41:29   Lease Asleep, Laytote, Buffy, just to name a few.

00:41:33   So if you're doing over 10,000 a month in revenue,

00:41:36   find out how you can receive Clearbank capital

00:41:39   by getting your 20-minute term sheet

00:41:41   at clearbank.com/atp.

00:41:43   That's bank at the end with a C instead of a K,

00:41:46   so clearbank.com/atp.

00:41:50   Clearbank, stop pitching and get back to doing

00:41:53   what you love, growing your business.

00:41:55   - All right, now that we're roughly 45 minutes in,

00:42:00   do you wanna start some follow-up?

00:42:01   - Sure.

00:42:02   - You two have such problems with a very simple show format

00:42:06   we've been doing for a long time.

00:42:08   Marco's gonna talk about his app a little bit,

00:42:09   then we'll talk about this,

00:42:10   then Kees is gonna talk about his image-jifing algorithm.

00:42:12   Let's now talk about SwiftUI.

00:42:14   It's not a complicated format, I don't understand.

00:42:17   - I'm so sorry, Dad.

00:42:18   - Like, usually you get like one, one and a half of those,

00:42:20   but now you're just jamming three of them,

00:42:22   so then it's gonna be the whole show,

00:42:23   and then it's gonna be like, well, no time for follow-up,

00:42:25   we've gone for two hours to talk about SwiftUI.

00:42:27   (laughing)

00:42:30   - All right, which one of you wants to talk about

00:42:32   Mimeo fonts and watermarking?

00:42:33   - Can you guess?

00:42:34   I'm assuming it's you.

00:42:36   - Yeah, do you remember Mimeo, our friends at Mimeo?

00:42:38   - No.

00:42:39   - So I'm back from my vacation, I'm making photo books,

00:42:44   and Mimeo is the company that I tried.

00:42:46   It used to be the, do the printing for Apple's photo books,

00:42:51   so I printed one of my existing photo books with Mimeo

00:42:53   and compared it to the Apple one,

00:42:54   and it was nearly identical,

00:42:56   save one extra Mimeo logo on the back.

00:42:58   And so I said, all right, great, now,

00:43:01   this was like last year, now,

00:43:03   next year when I go to Long Island, I'll use Mimeo

00:43:05   for my book, so I did that, I'm making the book--

00:43:06   - Wait, you got a test book of a book you already had

00:43:10   just to try it out?

00:43:11   - Yes.

00:43:12   - That's so John.

00:43:12   - That's incredible.

00:43:13   - So anyway, I'm making the book, I'm using their UI,

00:43:17   which in some ways is better than Apple's,

00:43:18   but in many ways is worse,

00:43:19   but it is less buggy, that's for sure, which is nice.

00:43:23   Just question some of the UI features,

00:43:24   but anyway, I'm placing images, I'm making pages.

00:43:27   Downsize, I saw when I was making it, it was like,

00:43:31   I think the page limit might be lower, but whatever,

00:43:34   I'll make it work.

00:43:35   So I'm all done with the book, except for the title page,

00:43:38   we usually leave for last, so I go to the title page,

00:43:40   I'm gonna type the imaginatively titled Long Island 2019

00:43:44   title to match all my other Long Island books,

00:43:47   and I go to type it there in this text box,

00:43:49   and I type Long Island 2019, then I select all,

00:43:51   then I go to the font menu to pick my normal font,

00:43:53   which is like Helvetica something, whatever.

00:43:57   And Helvetica is not in the font list.

00:44:01   - Oh no.

00:44:02   - You know what's in the font list?

00:44:03   None of the fonts on my system, that's for sure,

00:44:05   just this weird set of fonts that are part

00:44:08   of the photos plugin, right?

00:44:11   It doesn't look at your system fonts at all,

00:44:13   it comes with its own fonts, most of which are fine

00:44:16   and look nice, but Helvetica is not on the list.

00:44:19   This is bad, this is bad for that book matching

00:44:22   all my other books, 'cause when I reprinted my other book,

00:44:25   I was printing it from a PDF, 'cause you could export

00:44:27   the old things to PDF, and then I just chuck the PDF

00:44:29   to Mimeo and they import it and make the book out of it.

00:44:33   So this was bad, so I looked for lookalike fonts

00:44:38   and I just couldn't bring myself to use any

00:44:39   lookalike fonts, so I had to bite the bullet

00:44:41   and export the cover image as a ping,

00:44:45   bring it into Photoshop, put the title in Helvetica,

00:44:49   like in the right place, which was really hard

00:44:52   because the image I had for the cover

00:44:54   wasn't exactly centered on the cover,

00:44:56   so it took me like eight tries to get it lined up

00:44:59   and sized correctly, and then just delete the text box

00:45:02   and have the sort of, I did baked in subtitles, Casey,

00:45:06   just for you, burned in subtitles.

00:45:08   (laughing)

00:45:09   - Yeah, yeah, yeah, yeah.

00:45:11   - Hard coded, what is it, hard coded Norwegian subs?

00:45:13   Where's Merlin when I need him?

00:45:15   So that was a painful process, and the text on the spine,

00:45:21   same font problem, but I don't have a way to influence that,

00:45:24   it's not a photo, so the spine font is going to be incorrect,

00:45:27   which is a shame.

00:45:29   Mimeo, please, please use the system fonts.

00:45:31   I know it's probably some weird licensing thing

00:45:33   that I don't understand, please, please,

00:45:34   use the system fonts, 'cause I don't wanna go through

00:45:37   what I went through with the cover next year.

00:45:40   Second thing is, I'm like, okay, before I order this book,

00:45:42   let me just do a PDF export, 'cause I always keep PDFs

00:45:44   of all this stuff, just in case the books

00:45:47   get water damage or the house burns down,

00:45:50   at least I'll have the PDFs and I can interior reprint them.

00:45:53   Or just basically preserving all the work I've done

00:45:55   to select and size and crop and arrange all the photos,

00:45:58   'cause that's a lot of work too.

00:46:01   And I exported the PDF, and instead of it making a PDF

00:46:04   on my computer, it's like, enter your email address

00:46:06   and we'll email you a download link.

00:46:07   I'm like, all right, well this is weird, whatever,

00:46:08   I don't know why you don't just make the PDF on my computer,

00:46:10   like you're right here, you're a native app,

00:46:12   you're running on my computer.

00:46:13   So I give the email address, it emails me a link,

00:46:15   I download it, PDF downloads, I open it up,

00:46:18   every single page is covered with a Mimeo watermark

00:46:20   across, like repeated on an angle across the entire thing.

00:46:23   - Nice. - That is not good,

00:46:25   'cause that doesn't serve as a good backup really.

00:46:28   I would have to redo, I couldn't print a book

00:46:30   from the watermark thing.

00:46:31   So good news, bad news.

00:46:33   Good news is the watermarking is going away.

00:46:35   There was some weird reason why they had to do it,

00:46:39   and that reason is over and everyone hates it,

00:46:42   so the watermarking, by the time you listen to this in fact,

00:46:44   Mimeo may have removed the watermarking of the PDF.

00:46:46   And even better news is someone at Mimeo

00:46:48   was kind enough to send me a non-watermarked PDF

00:46:50   of my thing, so I have a nice backup of it.

00:46:52   Bad news is the font situation stands.

00:46:55   So I have ordered my book.

00:46:57   I'll let you know when it arrives

00:46:59   how it looks with its hard, my God.

00:47:02   Merlin, where are you?

00:47:03   You say you listen to the show, jump in the chat.

00:47:05   Hard coded Norwegian subs, I don't know this.

00:47:08   You two don't even know what I'm talking about.

00:47:10   I don't know why I bother. - Nope.

00:47:11   - Well anyway, Casey knows about burned-in subtitles.

00:47:15   - Mm-hmm.

00:47:16   Oh goodness, all right, tell me about your cameras, John.

00:47:19   The Sony, I don't even, these names are so terrible.

00:47:22   What happened to Sony having good names?

00:47:24   Where were they just whining about this?

00:47:25   This was just getting-- - The names aren't bad.

00:47:27   They make some kind of sense.

00:47:29   - This was on Cortex.

00:47:31   - That's what it was. - And yeah, and it's like,

00:47:32   I think we all think back like Walkman and Trinitron.

00:47:36   Those were two products over the last 40 years.

00:47:40   (laughs)

00:47:41   - Oh, but the Sony name, the Sony camera equivalent

00:47:44   to that is Alpha, because Trinitron was not the name of a TV.

00:47:47   You can say, what TV do you have?

00:47:48   Oh, I have a Trinitron.

00:47:49   There was a million Sony models.

00:47:50   It was Sony, Trinitron, and then an Alphabet Soup.

00:47:53   So these are all Sony Alpha.

00:47:54   - That's fair. - Alphabet Soup.

00:47:56   Right, these names aren't actually that bad.

00:47:58   They are about the same as modern car names.

00:48:01   In fact, they actually are similar to car names,

00:48:04   and I blame Canon for a little bit of the Roman numeral crap

00:48:07   'cause they were there first.

00:48:08   Anyway, camera follow-up from last week,

00:48:11   lots of suggestions for other cameras.

00:48:12   One suggestion is actually related to naming.

00:48:16   Someone suggested to me the Sony A6400,

00:48:19   and I said to them, do you mean the 6500?

00:48:22   'Cause we talked about it on the show,

00:48:23   and they said, no, I don't mean the 6500.

00:48:25   I mean the 6400.

00:48:26   Sony, in its infinite wisdom,

00:48:28   so they had the Alpha 6000,

00:48:30   which is the predecessor of my computer's

00:48:33   sort of size and shape many years ago,

00:48:35   and that was followed up by the 6300, which is what I have,

00:48:38   and then it was eventually followed up with the 6500,

00:48:40   which is like what I have, but it has in-body stabilization.

00:48:42   After the 6500, they released the 6400.

00:48:47   (laughing)

00:48:49   - That's awesome.

00:48:50   - And you're like, okay, well maybe,

00:48:51   the number doesn't always go up.

00:48:52   Maybe it's the model that slots in

00:48:53   right between the 63 and the 65.

00:48:55   - Right, is it like a lower-end model?

00:48:57   - No, it's not.

00:48:58   It's better than the 6500 in all ways,

00:49:00   except it doesn't have,

00:49:01   the shooting buffer is a little bit smaller

00:49:04   and it doesn't have in-body stabilization,

00:49:06   but has other advantages,

00:49:08   and it has the smaller grip of the 6300.

00:49:10   It is kind of in-between-y, but the bottom line is,

00:49:12   if you had to pick one of these models to get,

00:49:15   unless you really, really need in-body stabilization

00:49:18   or the bigger buffers, you can shoot

00:49:19   like literally 700 pictures

00:49:20   before the buffer fills up or something,

00:49:23   get the 6400, because it has the better processor,

00:49:26   better motion tracking, the same sensor,

00:49:28   better battery life,

00:49:30   it just doesn't have in-body stabilization.

00:49:32   So, I'm not doing any camera purchase stuff,

00:49:37   but if I had known this before the vacation,

00:49:40   if I had known this model even existed,

00:49:42   like I probably saw the news fly by,

00:49:44   but I'm like, 6400?

00:49:46   We're on 6500 now,

00:49:47   I don't need to be interested in that model.

00:49:48   Anyway, the big thing it has going for it

00:49:51   is the big, beefy processor from the A9

00:49:54   or whatever that does this amazing

00:49:56   object motion tracking autofocus,

00:49:59   and a slightly better color reproduction,

00:50:01   it's that inside this little dinky camera

00:50:03   plus a bunch of other tweaks.

00:50:05   So, if I needed to get another one of these little cameras,

00:50:07   that's the one I'd, I'm still hoping they'll,

00:50:10   do a major upgrade to this kind of server.

00:50:12   Doesn't look like that's in the cards,

00:50:13   'cause 6400 is actually a pretty recent model.

00:50:15   Second thing I discovered about the A7R IV,

00:50:17   whose name I kept getting wrong,

00:50:19   and that's the one with the Roman numerals at the end,

00:50:21   A7R IV, looking at reviews of that camera,

00:50:25   the problem is that it just has too many

00:50:28   damn pixels in the sensor.

00:50:30   Like, I don't think I'm ever gonna buy that camera

00:50:32   unless I have a major change in disk space.

00:50:35   Like, as someone humorously pointed out

00:50:37   in their YouTube video,

00:50:38   the JPEGs of that camera are bigger than the RAWs

00:50:41   from most other cameras.

00:50:43   Like, the JPEGs are 30 megs each.

00:50:46   - Oh my God, that's double the size of RAWs on my camera.

00:50:50   - That's what I'm saying.

00:50:51   So, I mean, I shot with RAW a little bit with my camera,

00:50:54   and the images were just too big,

00:50:55   and I wasn't getting any of the benefits

00:50:57   to account for that, so I quickly switched back to JPEG.

00:51:00   But the JPEGs, I mean, it's a, what is it, 61 megapixels?

00:51:05   It's tremendous, right?

00:51:06   Aside from the camera itself being large

00:51:09   and all those other things,

00:51:11   it's, I think that's too much for me.

00:51:15   Now, what, the alternative that a lot of people

00:51:19   are talking about is the, like,

00:51:21   there is no alternative to that right now,

00:51:24   but there is last year's, or last model's alternative,

00:51:26   which is the a7 III without the R, right?

00:51:30   So there used to be the a7 R III and the a7 III.

00:51:33   The a7 III is like the a7, but the sensor has what,

00:51:36   like a quarter as many pixels?

00:51:38   Like, it's like 20 megapixel, 21 megapixel instead of 42?

00:51:41   - Yeah, it's like, it's less megapixels,

00:51:44   but otherwise everything else is pretty much the same,

00:51:46   so you get, like, better battery life and faster processing,

00:51:49   and a lot of advantages over the bigger model, actually.

00:51:52   - Yeah, and bigger pixels, right?

00:51:53   I mean, I would assume, like, it's the same sensor size,

00:51:56   and there are fewer pixels, so it stands to reason

00:51:57   those pixels are bigger, so, yeah.

00:51:59   So that's, there is no a7 IV without the R.

00:52:04   But in theory, if they follow their naming pattern,

00:52:08   there should eventually be an a7 IV,

00:52:10   which is like the a7 R IV, but with a sensor with,

00:52:14   you know, 20, or not, maybe, I guess 30 megapixels

00:52:16   or something like that.

00:52:17   I don't know if that's in the cards,

00:52:18   I don't follow the camera industry,

00:52:19   didn't know if that's coming, but that sounds like

00:52:22   a much more attractive, way too expensive camera

00:52:25   for my needs, so I'm keeping my eye out for that.

00:52:28   - Yeah, based on past Sony actions,

00:52:30   it is very likely that that will come out after,

00:52:33   like, you know, some deal of time,

00:52:34   maybe six months after the a7 R IV.

00:52:37   When did the R IV come out?

00:52:40   - Pretty recently, like a month ago,

00:52:42   or a couple weeks ago, yeah.

00:52:43   - Oh, okay.

00:52:43   Yeah, well, 'cause the R III came out

00:52:46   somewhere around late 2017.

00:52:48   So, yeah, they're on roughly like a year and a half cycle

00:52:52   on these, usually, so, and then the a7 III, I think,

00:52:56   came out maybe like three to six months later,

00:52:57   or something like that, so, sorry if I'm getting

00:52:59   all this wrong, this is all from memory,

00:53:00   but, yeah, it stands to reason that, you know,

00:53:03   maybe later this winter or in the spring,

00:53:05   they would probably do an a7 IV,

00:53:08   and for your priorities, that's probably the better buy.

00:53:11   - Yeah, and finally, lots of people are pointing out

00:53:13   the RX10, there's an RX10 IV,

00:53:16   otherwise known as the RX10 IV, yeah.

00:53:18   - That's their super zoom, right?

00:53:20   - Yes, so they have a super zoom,

00:53:21   and I've known about the super zoom,

00:53:22   I knew about it, you know, before I bought this camera,

00:53:24   like, it's huge, like, it's gigantic, yes,

00:53:27   it is the superst of super zooms,

00:53:29   but it's like bigger than the a7.

00:53:33   It's just tremendous, it's not an interchangeable lens camera

00:53:36   but it is a huge lens, and the camera itself is huge,

00:53:40   and the body is huge, and everything about it is giant,

00:53:42   it's just, like, I suppose, I should look

00:53:45   at some image comparisons, I suppose, like,

00:53:46   for the price of that camera, it may be less than the price

00:53:50   of a zoom lens of equivalent, certainly is less

00:53:53   than the price of a zoom lens with that kind of range,

00:53:56   'cause the range is crazy, I think it goes to like

00:53:58   600 millimeters or something like that,

00:54:02   but that's, it's like a single purpose camera,

00:54:06   like, you never slap on a good prime lens on there

00:54:10   to take, like, portrait photos, like, it is what it is,

00:54:12   it's a super zoom, but it's just so darn big,

00:54:14   like, it's too, I don't, you know,

00:54:18   I'm not even sure I can go up to an a7 level size,

00:54:20   and this thing just, it's huge, so,

00:54:22   that's, I know about that model,

00:54:25   I know about that whole line, and I just feel like

00:54:28   it's not for me, it's not the right set of trade-offs,

00:54:30   and then, finally, I didn't put the notes,

00:54:32   but someone was nice enough to send me a list

00:54:34   of all my alternative options for better zooms,

00:54:36   'cause I mentioned I'm not sure what I would get

00:54:38   if I tried to get a better zoom,

00:54:39   and I just listed them out, conveniently putting

00:54:42   what percentage larger each one is than my current zoom,

00:54:45   and it gets ridiculous, like, the top end one

00:54:48   is literally three times the length of my current zoom,

00:54:52   so, yeah, there is like, there's one option

00:54:54   that is like 30% longer that is better,

00:54:58   that I may consider, but, and it's 30% longer,

00:55:03   and also thicker as well, 'cause there's no way

00:55:06   to get out of this conversation, anyway, moving on,

00:55:09   there are many options for me to spend money on cameras,

00:55:11   and I'm not doing either one, we're gonna,

00:55:14   I'm still getting myself psyched up

00:55:16   for the macro configurator, if that ever appears

00:55:18   on Apple's website. - Oh, goodness.

00:55:19   And by the way, and I do think, like, you know,

00:55:21   for your zoom range needs, I think you've had

00:55:23   two very good ideas, number one is,

00:55:27   you should avoid, you know, individual, like,

00:55:29   fixed lens cameras like the RX10 Super Zoom series,

00:55:32   number two, your idea that you kind of brushed by last week,

00:55:35   of like, maybe you just have two camera bodies,

00:55:37   and one of them has a telephoto,

00:55:38   and one of them has a closer lens,

00:55:39   that's a really good idea, actually, for your needs.

00:55:41   - I'm still thinking about that,

00:55:43   that's why I mentioned the 6400,

00:55:44   'cause I wouldn't get rid of my 63, I would get the 64,

00:55:47   and then I'd have two, but then I started thinking about,

00:55:48   but which one gets the prime lens on it,

00:55:50   you're like, oh, well, you put the zoom on the 64,

00:55:52   because that has the motion tracking,

00:55:53   like, oh, well, the 64 also has better color processing

00:55:56   slightly, so wouldn't you want that with your prime lens?

00:55:59   - Easy, you put the prime lens on the one

00:56:02   that has more resolution, because--

00:56:04   - They're the same.

00:56:06   - Oh, well, then get a camera with higher resolution

00:56:08   and put the prime lens on that one,

00:56:09   because the zoom lenses have such terrible,

00:56:12   like, actual effective optical resolution

00:56:15   compared to primes, like, most zoom lenses, I think,

00:56:18   are lucky to get, like, 20 megapixels

00:56:20   of actual resolution out of them,

00:56:21   usually it's far less than that,

00:56:22   like, the good ones can get in that range,

00:56:24   but only the very best ones.

00:56:27   So you're kind of wasting your megapixels

00:56:30   if you have, like, a really high megapixel sensor

00:56:33   with the zoom lens on it, usually,

00:56:34   or at least you're not getting anywhere

00:56:35   near its full capacity, so that would actually be

00:56:39   a fairly easy distinction for me, at least,

00:56:40   but also, I would say that the category of zoom lenses

00:56:45   that you're currently in is the, like,

00:56:48   base model, but, like, slightly power user model

00:56:51   of, like, I want a big range, but I'm not willing

00:56:54   to, you know, carry or pay for some kind of giant thing.

00:56:57   Then, on the other end, you have, like,

00:56:58   the pro 70 to 200 f/2.8 zooms that most pro photographers

00:57:03   use. - The white ones.

00:57:04   - Don't get those, yeah. - Don't get the white lenses.

00:57:07   - Don't get, well, maybe. - It's too much.

00:57:08   - What you want, I think, is the f/4 version of those.

00:57:12   Almost every line of lenses has the big f/2.8

00:57:17   70 to 200 zoom, and they're big, and they're heavy,

00:57:19   and they're very expensive.

00:57:21   Usually there's an f/4 version, and there is one here,

00:57:23   I'm pretty sure, and that is usually optically

00:57:28   very similar in quality.

00:57:30   It just only goes to f/4 instead of f/2.8,

00:57:31   and for your purposes, where you're shooting,

00:57:33   most of the time using this, you're shooting

00:57:35   in the sunlight by the ocean, like,

00:57:37   you don't need f/2.8 for most things, and--

00:57:39   - Yeah, no, I definitely have that.

00:57:40   - It's so much, it usually ends up being, like,

00:57:42   half the weight and usually about half the cost,

00:57:45   and that's usually the better bet.

00:57:47   - Yeah, that option is 62% longer than my current lens,

00:57:50   by the way, and it's 1500 bucks.

00:57:52   - Right, well, but compared to probably a lot bigger

00:57:55   and heavier for the 2.8 version.

00:57:56   - Well, the other option before that is only 33% longer,

00:58:00   and it's $1200.

00:58:02   That's the 70 to 300, and it has more reach.

00:58:04   - Oh, and it's like f/4 to 5.6, something like that, right?

00:58:08   That might not be bad, I haven't looked at the reviews,

00:58:10   but usually the optics, usually the f/4 version

00:58:13   better achieves what you want.

00:58:15   - Renee Schneider wrote in to tell us,

00:58:19   since we were wondering where all these new Apple employees

00:58:22   due to the Intel modem acquisition would be sitting

00:58:24   pretty far away from San Diego, the biggest part of them

00:58:28   is probably in some German town near Munich.

00:58:31   Intel's mobile communication division was originally part

00:58:33   of a German semiconductor manufacturer Infineon,

00:58:36   which was sold to Intel in 2011, so these individuals

00:58:38   have now been sold for the second time in this decade.

00:58:43   I did not see that coming.

00:58:45   - I think there are a bunch of them in San Diego,

00:58:47   but maybe I'm misremembering the city name.

00:58:48   No one came in to tell us the actual city name,

00:58:50   but yeah, apparently most of them are in Germany,

00:58:52   so there's that.

00:58:53   - Indeed.

00:58:54   Marco, why don't you tell me about your Dropbox

00:58:56   in iCloud drive hack theory thing.

00:59:00   - Yeah, so I had mentioned last week how I had this theory

00:59:04   and I wanted to know if anything weird might happen

00:59:07   of why don't I just create a folder named Dropbox

00:59:10   in my iCloud drive and hard link it to home/Dropbox,

00:59:14   and that way I would have Dropbox still existing,

00:59:18   I would have the file paths all the same,

00:59:20   so I wouldn't have to change all my muscle memory

00:59:23   or any kind of shell script that I have

00:59:26   that refer to home/Dropbox/something,

00:59:29   but I could have iCloud drive doing the actual syncing

00:59:31   and I could uninstall Dropbox.

00:59:32   And a few people wrote in, and there was this article

00:59:36   on Michael Tsai's website that kind of collected

00:59:39   all the links, but basically this won't work

00:59:42   for a pretty hilarious reason.

00:59:44   It turns out that you can't have a folder named Dropbox

00:59:49   in iCloud drive, it won't sync.

00:59:53   iCloud drive has a list of blacklisted file names

00:59:56   and file name patterns that it just won't sync files

01:00:00   or folders that contain these words and their names.

01:00:03   And I'll link to a list of the full name in the show notes,

01:00:06   but Dropbox is one of these names.

01:00:08   iCloud drive will not sync a folder named Dropbox

01:00:11   no matter what you do with it.

01:00:13   - Yeah, the other exceptions are what you would think.

01:00:15   It's exact match, case insensitive, Dropbox, OneDrive,

01:00:19   iPhoto library, which is funny,

01:00:23   iDrive sync, .dropbox, .dropbox.adurb,

01:00:28   it contains .nosync anywhere, is.ubd,

01:00:33   which is Ubiquity demon, of course, is a DS store.

01:00:37   If the document, if the file name begins with open parens,

01:00:40   a document being saved, it begins with that string,

01:00:43   and then there's a whole list of extensions

01:00:45   mostly having to do with photos.

01:00:46   So this is one of those things where,

01:00:50   like you talk about the old Dropbox browser

01:00:54   'cause of a folder that syncs, right?

01:00:56   There are always weird exceptions like this,

01:00:58   but you would hope the exceptions are obscure

01:01:02   and not likely to be run across.

01:01:03   So for example, .ubd, whatever, like fine,

01:01:06   you're at work at Apple, you work on the Ubiquity demon,

01:01:10   you wanna make a special file, or .nosync,

01:01:13   you wanna make some special file name extensions

01:01:14   that no one's ever actually gonna use,

01:01:16   but for the purposes of the system itself, it excludes.

01:01:19   Once you start including names of competitors' products

01:01:23   or things that people might actually want to

01:01:26   call their own folders,

01:01:28   like even if the Dropbox the company didn't exist,

01:01:30   I can imagine making a folder called Dropbox,

01:01:32   like if you didn't know the company existed,

01:01:34   you can make a folder, it's a word

01:01:35   that someone might type for a folder name.

01:01:38   If there's gonna be this long a list of exclusions,

01:01:41   it needs to be surfaced somewhere

01:01:42   in the UI, like for example,

01:01:44   if you make a folder called Dropbox,

01:01:46   I would hope the thing would pop up,

01:01:47   maybe it does this, I don't know,

01:01:48   I would hope it would pop up dialogue and say,

01:01:51   just so you know, for weird political reasons,

01:01:53   we're not gonna sync that folder,

01:01:54   so you might wanna give it a different name.

01:01:56   Like maybe that's why there isn't,

01:01:57   if there is no UI, maybe that's why,

01:01:59   because how do you explain this?

01:02:00   Well, this list is long, and it contains things

01:02:02   that I feel like are legit, like temp, .TMP.

01:02:07   People make files with .TMP extensions,

01:02:09   like I suppose vaguely nerdy people do, whatever,

01:02:12   but anyway, that is weird, we will put the link

01:02:14   in the show notes, so beware iCloud Drive

01:02:17   is stranger than you imagine.

01:02:19   Oh, and related to that, Marco tab-completing

01:02:24   his SimLink and not having a tab complete to the slash,

01:02:26   and I mentioned I thought that Bash surely has a feature

01:02:29   to change the setting, apparently it does,

01:02:31   if you put this particular incantation

01:02:33   in your .inputrc file, set mark SimLink directories,

01:02:37   with hyphens between the last three words,

01:02:40   and set it to on, that apparently will do it,

01:02:42   we'll put a link in the show notes if you're interested

01:02:44   in changing how Bash works when tab-completing SimLinks.

01:02:47   - It's always good to read out shell commands in a podcast.

01:02:50   - Yeah, well, pretty soon Siri will be

01:02:52   executing them for us, though.

01:02:53   - Oh, God.

01:02:54   - Apple has stopped letting contractors

01:02:57   listen to Siri voice recordings,

01:02:58   and will offer opt-out later,

01:03:00   because Apple doesn't believe in web services,

01:03:03   and so it has to go in an iOS release, I guess.

01:03:05   But this is with regard to the contractors

01:03:07   apparently listening in to some of our conversations,

01:03:09   sort of, kind of, and everyone understandably

01:03:12   getting their tinfoil hats on, as did I,

01:03:16   but I guess that's not happening anymore, as per Apple.

01:03:19   - Well, I mean, temporarily spent,

01:03:21   like it's a reasonable reaction,

01:03:23   which is everyone hates this thing we're doing,

01:03:26   let's just stop doing it, and then regroup,

01:03:28   and figure out a better thing,

01:03:29   'cause as you noted, Casey, they're not exactly

01:03:33   nimble on their feet when it comes to

01:03:34   rolling out features like this,

01:03:35   and they probably shouldn't be,

01:03:36   'cause you could mess things up,

01:03:37   so the best thing to do is just stop it,

01:03:38   stop doing it, tell everyone you stopped doing it,

01:03:41   actually stop doing it, and then probably

01:03:44   roll out some improved way to communicate this,

01:03:48   and a way to opt out of it, and so on and so forth.

01:03:50   Someone did point out there actually is a way

01:03:52   to opt out of this for enterprises, for big companies,

01:03:55   'cause big companies don't want audio leaking out

01:03:58   of their company's phones and going to Apple or whatever,

01:04:01   so there's this very convoluted way

01:04:03   using enterprise profiles or something

01:04:05   to convince all of the iPhones that are used

01:04:09   by employees of a particular corporation

01:04:10   not to send any audio to Apple, blah, blah, blah,

01:04:14   but it's a process that no regular person

01:04:16   would ever go through, and it's obviously

01:04:18   not a solution to this problem,

01:04:19   so the solution for now is Apple, stop doing that.

01:04:23   - And similarly, apparently Google,

01:04:24   because GDPR, if I understand this right,

01:04:26   has been ordered to halt human review

01:04:28   of voice AI recordings over privacy risks,

01:04:30   and this happened specifically

01:04:32   because of a German privacy watchdog.

01:04:34   - Yeah, I remember reading about this story.

01:04:36   Someone had a big leak of 1,000 different recordings

01:04:40   and dumped it out.

01:04:42   That's the problem with this.

01:04:42   If you collect this information,

01:04:44   and even if what you're doing with

01:04:45   is just trying to improve your program,

01:04:46   once you have this information, it is a danger.

01:04:50   Some contractor who's supposed to be

01:04:52   just reviewing this stuff could copy it

01:04:54   and take it out of the company illegally

01:04:56   and distribute it on the internet.

01:04:58   That's bad.

01:04:59   That's why you don't want any of this information,

01:05:01   'cause even if you don't ever intend

01:05:03   to do anything bad with it, merely having it

01:05:06   means you are now a target for people

01:05:08   to take that information and just spread it

01:05:10   all over the internet.

01:05:11   Glad to see that some part of this world

01:05:15   has some kind of laws that actually try

01:05:17   to protect consumers in some vague way,

01:05:20   even if they are themselves flawed.

01:05:22   - Definitely not here.

01:05:23   That I'm confident in.

01:05:25   - No.

01:05:25   - We are sponsored this week by Fracture,

01:05:28   who prints your photos in vivid color directly on glass.

01:05:33   Almost all of us take photos, and usually

01:05:36   we maybe share them to a feed somewhere online,

01:05:39   and then that's it.

01:05:39   You don't see them again after that.

01:05:41   Very few of those photos end up getting printed.

01:05:43   Even fewer end up being seen by anybody

01:05:46   past those first couple days.

01:05:48   Let Fracture help you focus on the moments

01:05:50   that mean the most in your life

01:05:52   by turning your favorite digital memories

01:05:54   into actual printed photos that make your house look great

01:05:58   or make wonderful gifts for someone else.

01:06:01   So these Fracture prints look amazing.

01:06:02   They go edge to edge.

01:06:04   They're printed directly on glass.

01:06:06   So there's this nice thin glass layer.

01:06:08   They're printed kind of on the back of it,

01:06:09   shining through the front, and then behind that

01:06:11   is a thin layer of like a foam core kind of material,

01:06:13   and that's how you can hook it onto like a screw

01:06:16   or something to hold it up.

01:06:17   They even include the screw and the wall anchor

01:06:19   in the box for you.

01:06:20   So you get everything you need,

01:06:22   and they're super nice, modern edge to edge,

01:06:24   and also lightweight pieces of glass.

01:06:27   You don't have to worry about them like falling off the wall

01:06:28   and, you know, shattering into a thousand pieces.

01:06:30   I've never seen that happen.

01:06:31   They're super light, so like even the big ones,

01:06:33   they're not gonna like pull the anchor out of the wall

01:06:35   or anything, and they're just amazing gifts for people.

01:06:38   Maybe, you know, send your parents pictures of your kids

01:06:40   or your pets or whatever else.

01:06:41   People love photos as gifts,

01:06:43   and Fracture prints make amazing gifts.

01:06:45   We have them all over our house.

01:06:47   We've given them as tons of gifts.

01:06:48   Everyone has positive things to say about them,

01:06:51   and you can feel good about Fractures too

01:06:52   because they are handmade from US source materials

01:06:55   in Gainesville, Florida by real nice people,

01:06:57   and they're a green company

01:06:59   operating a carbon neutral factory.

01:07:01   So see for yourself at fractureme.com/atp.

01:07:06   That'll get you a special discount

01:07:07   on your first Fracture order.

01:07:09   After checkout, they will ask you,

01:07:10   where'd you hear about them?

01:07:11   Make sure to tell them you heard about them from ATP.

01:07:13   Once again, fractureme.com/atp

01:07:16   for a special discount on your first order,

01:07:18   and tell them you came from here.

01:07:20   Thank you so much to Fracture for sponsoring our show.

01:07:23   (upbeat music)

01:07:25   - Do we have time for topics?

01:07:28   (laughing)

01:07:30   - We can talk briefly about Apple Card.

01:07:33   I tried yesterday, I had signed up

01:07:36   for whatever early access thing way back when,

01:07:38   and I got my email yesterday saying,

01:07:40   "Hey, you can sign up for Apple Card,"

01:07:41   and I tried to do it knowing full well

01:07:42   it would probably not work,

01:07:43   and I'll explain why in a moment,

01:07:44   and it did not work, but it's my fault.

01:07:47   - Are you on the betas?

01:07:48   - No, I'm not on the betas.

01:07:50   It's my fault because I had frozen my credit

01:07:52   a couple of years ago.

01:07:53   - Oh yeah, I did that too.

01:07:54   - We all did when the Equifax, whatever, right?

01:07:57   I think I had done it even quite a while before then.

01:08:00   Wow, look at me getting hipster about freezing my credit.

01:08:02   This is a new low, but anyway.

01:08:04   (laughing)

01:08:06   I had done it a couple of years ago

01:08:07   'cause we haven't really made any large purchases

01:08:09   and hadn't planned on making any large purchases

01:08:11   wherein a credit check would be involved,

01:08:14   so whenever it was I did it,

01:08:15   I'd frozen it with all three bureaus in the United States,

01:08:18   and I honestly don't have the faintest idea

01:08:20   how this works in other countries,

01:08:21   but speaking for America,

01:08:22   there are I think three major credit bureaus

01:08:25   that companies can use to figure out

01:08:28   if you're likely to pay back money owed

01:08:31   in a reasonable fashion,

01:08:32   and so if you freeze your credit,

01:08:34   that means they will refuse to answer the question,

01:08:36   so Apple understandably,

01:08:38   when they were I guess strictly speaking it was Goldman Sachs,

01:08:41   whatever it's called,

01:08:42   understandably wanted to know,

01:08:43   hey, is this guy a total putz

01:08:45   or is he actually gonna pay back the money

01:08:47   that he accrues on this credit card,

01:08:49   and when they went to,

01:08:50   and I guess TransUnion happens to be the one that they use,

01:08:54   they went to TransUnion,

01:08:55   and TransUnion said I can't answer that question

01:08:56   'cause dude's frozen his credit,

01:08:58   and so the process was I verified my contact information,

01:09:03   I verified the last four of my social security number,

01:09:05   which is our government identification number,

01:09:08   I then verified my full social for some reason or another,

01:09:11   and then it actually said to me,

01:09:13   hey, you've got a credit freeze,

01:09:15   there's nothing we can do,

01:09:16   and by the way,

01:09:18   we typically use TransUnion to figure this out,

01:09:21   which I thought was extremely helpful and actionable,

01:09:23   and I mean that genuinely.

01:09:25   You know, rather than just being like,

01:09:26   oh, we couldn't figure out what the story is, so sorry,

01:09:29   they actually said,

01:09:31   not only we recognize the fact

01:09:33   that you have frozen your credit,

01:09:34   but furthermore,

01:09:36   this is the particular of the three bureaus

01:09:38   that we tend to use,

01:09:40   go ahead and talk to them,

01:09:43   and so in the heat of the moment,

01:09:44   I was like, you know, okay, fine,

01:09:45   I should probably try this for the show,

01:09:47   and so I went to TransUnion's website,

01:09:49   and I had a record for it in one password

01:09:51   from whenever it was I had frozen my credit,

01:09:53   and I logged in with that username and password,

01:09:56   and TransUnion said, we can't verify your identity,

01:09:58   and guess what you need to do

01:10:00   in order to verify your identity?

01:10:02   You have to call them,

01:10:03   and I said, nope, not happening,

01:10:05   and then I gave up.

01:10:06   - Yeah, that's, actually,

01:10:08   I mean, that actually is gonna hit me too

01:10:12   if I decide to apply for this card,

01:10:14   which I have thoughts on the card, but it's boring,

01:10:18   but I will say that I also keep my credit frozen

01:10:21   as of a few years ago because of the Equifax thing,

01:10:23   and I recently applied for,

01:10:26   I think it was the Amazon Prime Rewards card,

01:10:30   'cause it gives you like 5% back on Whole Foods and Amazon,

01:10:32   which is pretty significant,

01:10:34   and I spent a lot of money in both of those places,

01:10:36   so I did that, and it registered at first,

01:10:39   but it told me the same thing,

01:10:41   like we use Equifax for our thing,

01:10:44   and I was able to go to Equifax and not unfreeze my thing,

01:10:49   just get a one-time passcode that I could give them.

01:10:53   - That's a little interesting.

01:10:53   - And say, and it was backed by Chase,

01:10:56   and so I called up the help number,

01:10:57   and I gave them this code, and it worked,

01:11:00   and they verified it over the phone,

01:11:02   and then I got approved over the phone,

01:11:03   and it went through just fine, so that, I think, is great.

01:11:06   It's, I'm kind of, I don't know what Apple's options are

01:11:10   with TransUnion, but it would be a lot easier

01:11:13   if they support that kind of one-time passcode thing.

01:11:16   I don't know whether they do or not,

01:11:17   because this is gonna be a problem that anybody will face

01:11:19   who has a credit freeze.

01:11:21   - John, did you try this in any way, shape, or form?

01:11:23   I assume not.

01:11:24   - I would have liked to,

01:11:25   but I was not blessed enough to get the invite.

01:11:27   I'm pretty sure I signed up for it

01:11:28   back when they said whatever.

01:11:30   I'm going to get this card.

01:11:32   I had totally forgotten that my credit was frozen,

01:11:33   but yes, it also is frozen,

01:11:34   so I'll try it with whatever my thing is to see,

01:11:38   you know, what, to see if it gives me any options,

01:11:41   but I'm assuming it'll be another big cluster

01:11:43   involving calling banks on phones.

01:11:46   - Yeah, probably.

01:11:47   - And being terrified by their supposed security procedures,

01:11:49   realizing how many people could have stole my entire life

01:11:52   if they knew three facts about me or whatever.

01:11:54   Yeah, no, I'm interested in trying this out.

01:11:57   I'm kind of sad that I didn't get,

01:11:59   although I guess this works on iOS 12.

01:12:02   You're not, you know, you just mentioned

01:12:04   you're not on the may-dos.

01:12:05   - I was on iOS 12, whatever the most recent version is,

01:12:07   which just came out in the last few days.

01:12:08   That's what I was doing this on.

01:12:10   - Yeah, the thing that's going around now, by the way,

01:12:11   related to Apple Card is in the contract,

01:12:14   like every contract from large corporations,

01:12:17   this entire godforsaken country,

01:12:19   there's an arbitration clause,

01:12:20   but apparently there's a way to opt out of it

01:12:22   if you scratch a message onto a piece of wood

01:12:26   and put it in a bottle and throw it in a ship and whatever.

01:12:30   There is a way to opt out, but you only have 90 days

01:12:32   after applying for the card to opt out of arbitration.

01:12:35   I've heard theories that you can do it over iMessage

01:12:38   with the business chat thing,

01:12:39   but you're probably just gonna have to end up

01:12:40   calling somebody and you have to give them

01:12:42   a bunch of information and say you want to opt out

01:12:43   of arbitration, and really, it only opts you out

01:12:45   of some arbitration, so you're probably screwed either way,

01:12:47   but this is another one of those things

01:12:49   that people pass around to make them think

01:12:51   that they're doing all that they can to defend themselves

01:12:53   against these giant faceless corporations,

01:12:55   and it's probably pointless, but we all do it anyway

01:12:58   because what if it's not pointless?

01:13:00   So there's that.

01:13:02   Sorry for the vague information.

01:13:03   I was looking for instructions like here's exactly

01:13:05   what you need to do, but the instructions in the contract

01:13:07   just say you need to contact us,

01:13:10   and it says by message, email, I'm doing it from memory,

01:13:13   but they say by message, I'm assuming they mean iMessage,

01:13:16   but there's no message address.

01:13:17   iMessage to who, to what?

01:13:19   Doesn't say in the contract.

01:13:21   By mail, it's an address somewhere.

01:13:23   Anyway, try to opt out of arbitration, you pass it again,

01:13:26   because arbitration is code for you get screwed.

01:13:29   - Also, I would just add, while it is exciting

01:13:32   to have the newest, greatest Apple thing,

01:13:36   although I would argue it's also decreasingly exciting

01:13:39   when the newest, greatest Apple thing is a credit card.

01:13:42   - 3% back on your Mac Pro?

01:13:45   That's exciting to me.

01:13:46   - Right, so I understand people are excited to get it

01:13:50   and to start getting that glorious 2% back on Apple Pay,

01:13:53   3% on Mac Pro, that's wonderful,

01:13:55   but I would also maybe caution you,

01:13:59   do you wanna help Apple beta test a financial instrument

01:14:03   that is heavily service dependent?

01:14:06   I don't, like that to me, that's a big red flag.

01:14:11   And this is another thing,

01:14:13   if something about Apple's back end messes this up for you,

01:14:17   not only is there probably likely to be only very painful

01:14:22   to no recovery methods available,

01:14:25   but they're messing with your money,

01:14:28   they're messing with your credit.

01:14:30   I trust Apple's motives, I trust that they're not gonna do

01:14:34   creepy things intentionally, but I don't trust them

01:14:37   to get web services really that right on day one.

01:14:40   So I would not wanna trust my finances and my credit

01:14:45   and my payment methods on my phone or whatever else,

01:14:49   I don't wanna trust that to the very first few days

01:14:52   of this roll out, give them a chance to work out the kinks,

01:14:55   maybe try it next month if you're gonna try it.

01:14:59   - Well you can add the card and get it set up

01:15:01   and just not actually use it.

01:15:03   I think it's probably just as safe,

01:15:05   if not safer than Apple Pay,

01:15:06   'cause it's all, both of them are just using the actual

01:15:09   plain old disgusting ancient credit card system

01:15:11   under the covers and there's just a thin veneer of Apple

01:15:13   in this thrown over the top of it and I'm hoping that,

01:15:16   'cause that's how Apple Pay works too,

01:15:19   and this card is not Apple's card, it's Goldman Sachs card,

01:15:22   which we all feel great about.

01:15:24   And it's a, what is it, a MasterCard under the covers?

01:15:29   - I think so, yeah.

01:15:30   - Yeah, whatever. - I think that's right.

01:15:31   - Anyway, credit cards are not exciting,

01:15:34   the only reason I'm getting one is for the increased cash

01:15:38   back on Apple purchases because I have pending

01:15:40   Apple purchases.

01:15:41   - Yeah, you can probably get like $1500 back on your Mac Pro.

01:15:44   - Yeah, 3% is a lot when the numbers get big.

01:15:47   I'm exploring all options to save money on the Mac Pro.

01:15:50   Including a billionaire who's listening to the podcast

01:15:54   now just buying me one.

01:15:55   - Well if you're gonna buy one, why not buy three?

01:15:58   - Yeah, you hear that Bill Gates, if you weren't bored

01:16:00   by all the Swift UI talk, now's the time to buy me a Mac Pro.

01:16:03   - I'm sure he's still listening.

01:16:05   - He doesn't even buy his kids college tuition, right?

01:16:07   - I have no idea.

01:16:08   - He's the whole thing of like, he doesn't want his kids

01:16:10   to like, they mustn't like earn everything they have

01:16:13   in life.

01:16:14   - It's a valid concern.

01:16:16   I don't know if that's true or not, but that is a respectable

01:16:18   position to take.

01:16:19   - Yeah, I remember that from way back when,

01:16:21   I'm not sure if he's held firm on that.

01:16:23   - I don't know.

01:16:24   I remember there was a meme before we called it a meme,

01:16:27   not really a meme, but like a thing, a viral thing

01:16:30   going around that, this was like when I was in college,

01:16:33   that somebody had computed based on Bill Gates' earnings

01:16:36   that if he saw, and I'm making this up, but it was like,

01:16:39   if he had seen a thousand dollar bill on the sidewalk

01:16:42   as he was walking to work, and I don't even think

01:16:44   a thousand dollar bill is a thing,

01:16:45   but for the sake of discussion, he sees a thousand dollars

01:16:47   sitting on the sidewalk as he's walking to work,

01:16:49   it would actually behoove him to just continue walking

01:16:51   to work because he will make more than a thousand dollars

01:16:54   in the time it would take to pick up that, you know,

01:16:56   the thousand dollars in cash or laying on the sidewalk.

01:16:58   And I remember as like an 18 year old, I was like,

01:17:00   how can that be possible?

01:17:03   I just thought it was insane.

01:17:04   - I remember as a 20 something year old

01:17:07   thinking this analogy is dumb because he's not

01:17:08   an hourly employee.

01:17:10   - Well, there's that too.

01:17:11   - Also, I'm pretty sure this was from like email forwards.

01:17:13   - No, it's not an analogy, this meme is dumb.

01:17:16   It is a dumb meme, but yes, he has a lot of money.

01:17:18   - We are sponsored this week by Linode,

01:17:22   my favorite web host for running servers.

01:17:24   Go to linode.com/atp to learn more,

01:17:27   and get a $20 credit with code ATP2019.

01:17:30   Whatever you wanna build, you can build it on Linode.

01:17:33   You can build distributed applications, hosted services,

01:17:36   back ends for your iOS apps, websites, CI and CD

01:17:40   environments, whatever you wanna build using virtual

01:17:42   servers, you can do it on Linode.

01:17:44   And these servers are fast in the Linode cloud.

01:17:47   They have native SSD storage, a 40 gigabit network

01:17:50   behind it all, industry leading processors,

01:17:53   and they have 10 worldwide data centers

01:17:55   and they're always adding more.

01:17:57   I believe they just added Mumbai, India,

01:17:59   they added Toronto, Canada recently.

01:18:01   They're always adding more around the world,

01:18:02   so you can serve your customers wherever they are,

01:18:05   with hourly billing across all plans and add-on services.

01:18:08   So if you only need a server for a couple hours,

01:18:11   only pay for it for a couple hours, no big deal.

01:18:13   And I gotta say, one thing I love Linode,

01:18:15   I've been with Linode for I think about eight or nine years

01:18:17   now, and they've always been an incredible value.

01:18:20   The entire time, it isn't just like a one time sale

01:18:23   and then they kinda coast on that forever,

01:18:25   they're constantly adjusting their plans and pricing

01:18:27   so that they are always the best value in the business.

01:18:30   For the entire eight or nine years I've been with them,

01:18:32   they've been the best value that entire time.

01:18:35   And I like them for other reasons too.

01:18:37   Cost is very important, but they also have

01:18:38   a really nice control panel, they have amazing capabilities,

01:18:41   they have amazing support if you ever need it.

01:18:43   Occasionally you probably need support from your web host,

01:18:45   I need it sometimes too.

01:18:46   And they've been just the top of their game

01:18:48   every single time I've needed anything from them.

01:18:50   So check it out today at linode.com/atp.

01:18:54   And you can use promo code ATP2019 to get a $20 credit.

01:18:58   Now, their plan started just $5 a month,

01:19:01   so that could get you four months free

01:19:03   on their one gig server plan.

01:19:04   So check it out today, linode.com/atp.

01:19:08   I love them as a web host, they are my favorite web host.

01:19:11   Linode.com/atp, promo code ATP2019 for a $20 credit.

01:19:16   Thank you so much to Linode for being so awesome

01:19:18   and for sponsoring our show.

01:19:19   (upbeat music)

01:19:23   - All right, let's move on to Ask ATP,

01:19:24   and let's start with Brad Seifert who writes,

01:19:26   "FaceApp has been incredibly popular,"

01:19:28   and this was actually written a few weeks ago,

01:19:29   "has been incredibly popular in the past week or so

01:19:31   "with many folks aging or de-aging themselves.

01:19:33   "My Twitter feed was full of people worried

01:19:35   "that the app was made in Russia

01:19:36   "and that giving the app permission to view your photos

01:19:38   "allowed them to upload all your photos to their servers.

01:19:40   "Is this something we should be worried about?

01:19:41   "Does the iOS photo permission really give the app maker

01:19:44   "copies of everyone's photos who has used the app?"

01:19:47   I actually don't know what the granularity is for photos.

01:19:50   I know vaguely that there's a mechanism

01:19:53   by which you can ask for a single photo,

01:19:56   and I think that iOS will only give you that one photo.

01:20:00   You don't get rights as an app developer

01:20:02   to the entire library.

01:20:04   I've never used FaceApp, so I have no idea

01:20:05   if that's what they did and how it worked.

01:20:08   Marco, do you happen to know anything

01:20:10   about how photo selection works in iOS?

01:20:12   - Nope.

01:20:13   - Yeah, okay, John, any thoughts?

01:20:15   - I know about what you know is that

01:20:17   a well-behaved application will ask for access,

01:20:20   throw up a picker, and just get access

01:20:22   to the one photo that the person picked.

01:20:24   I don't know if there is a bigger option,

01:20:26   which is just give me access to all the photos.

01:20:28   There might be, but that's besides the point.

01:20:30   I feel like the FaceApp issue is like,

01:20:32   like anything else on the internet, right?

01:20:34   If you're giving a photo of yourself to an app,

01:20:39   however it gets it, or giving any of your photos,

01:20:41   giving any of your information,

01:20:42   there is an implicit trust relationship

01:20:44   between you and the app vendor.

01:20:46   Do you care that an app has a picture of your face?

01:20:51   - It depends.

01:20:52   I mean, there's pictures of my face all over the internet.

01:20:55   Giving one to this application and it associating with me

01:20:59   is probably worse than it finding one on the internet,

01:21:01   but everyone's mileage may vary.

01:21:03   This happens whenever there's anything related to faces

01:21:05   that comes up on the internet,

01:21:06   like you're just giving your information

01:21:09   to a thing that's feeding machine learning

01:21:11   and they're building a database

01:21:12   and robots will come and eat your medicine.

01:21:15   You know, like, there is definitely danger here.

01:21:18   The danger is exactly what you think it is.

01:21:20   If you don't wanna give anyone your photo,

01:21:21   don't give anyone your photo.

01:21:22   If you give someone your photo, they have your photo.

01:21:25   That's basically what it is.

01:21:26   The larger mass thing is like,

01:21:27   oh, I just thought I was giving them my photo,

01:21:28   but I didn't realize that based on my photo,

01:21:30   they could predict my future and steal all my money.

01:21:33   They can do that without your photo.

01:21:35   (laughing)

01:21:36   That said, I did not download this app.

01:21:38   I do not want to give my,

01:21:40   I never do any of these face things.

01:21:42   I never answer any of these questions.

01:21:44   There's a meme that tell everyone

01:21:47   your last six addresses you lived at

01:21:49   and your mother's maiden name

01:21:51   and your first dog's name.

01:21:55   Don't do any of that stuff.

01:21:55   Don't give out information for fun, right?

01:21:59   We give away enough information unintentionally

01:22:02   that it's probably not a good idea

01:22:04   to be giving out information intentionally.

01:22:06   If you wanna derive fun from these things,

01:22:08   look at all the fun that other people are having with it.

01:22:10   Or another option is to upload pictures of celebrities,

01:22:12   which a lot of people did.

01:22:14   You probably still have to give face app access

01:22:18   to your photos, so I don't know the deal there.

01:22:20   Again, I don't know if they have access

01:22:21   to all your photos or just one.

01:22:23   That's why web apps are better.

01:22:24   Go to a web app and upload a picture

01:22:26   of your favorite celebrity and see how they look

01:22:28   when they're old and they're young.

01:22:30   That is probably slightly safer than using the iOS app.

01:22:34   - Slightly.

01:22:36   All right, moving on.

01:22:37   Nathan would like to know,

01:22:39   I'd love John's advice on reconciling my love for RTS games

01:22:43   with my disdain for the need to have a giant gaming PC

01:22:45   in my house.

01:22:46   So John, do you tolerate having a Mac as your main machine

01:22:49   and a PC for gaming?

01:22:50   That's my current setup, but I'm growing tired

01:22:51   of seeing a giant PC sitting on my floor.

01:22:53   In last week's episode, I don't know if that is literally

01:22:56   this past week or several weeks ago,

01:22:57   you talked about folks who modify cheese graters

01:22:59   into hot rods of sorts.

01:23:01   Is that an option you'd consider?

01:23:02   I have a dream of being able to use an iMac

01:23:04   that I can boot into Windows for the sole purpose

01:23:06   of playing RTS games, but I'm not sure the performance

01:23:08   is quite sufficient.

01:23:09   If you were in my position, would you bother

01:23:10   with trying to modify a cheese grater as you mentioned?

01:23:12   And also, John, would you start by explaining

01:23:14   what the hell an RTS game is, please?

01:23:16   Real time strategy game.

01:23:17   Even I know this one.

01:23:19   So we're talking like Starcraft and--

01:23:20   Total annihilation, man.

01:23:22   Okay, okay.

01:23:23   Starcraft, who plays Starcraft?

01:23:24   (laughing)

01:23:26   So I am kind of in Nathan's position,

01:23:29   and my choice is and has always been not to buy

01:23:32   an additional gaming PC.

01:23:33   Unfortunately, the age when you could have

01:23:36   a single glorious computer that could serve

01:23:38   as your gaming PC and your Mac and be decent at both

01:23:40   is more or less over.

01:23:42   The Mac Pro probably can be a reasonable gaming PC,

01:23:46   but it costs a lot more money than you would think.

01:23:49   Even if you ignore the monitor thing, it's not a good deal.

01:23:52   It's much cheaper to get a Mac and then buy a gaming PC.

01:23:55   That is the best solution.

01:23:56   Even for RTS games, you're like, "Oh, RTS games?

01:23:58   "So you could run that at iMac, it's probably fine, right?"

01:24:01   RTS games can be demanding these days.

01:24:03   Especially if you wanna run them at native resolution

01:24:04   on an iMac, it might chug a little bit.

01:24:06   So I think still the cheapest solution has always been

01:24:11   to have a Mac and a gaming PC, but now the actual best

01:24:15   and most, you know, the best solution to get decent

01:24:17   gaming performance is still to have a gaming PC.

01:24:21   You can't do a boot your Mac Pro like you used to

01:24:23   back in the day and have a reasonable gaming PC performance

01:24:26   alongside a really good Mac.

01:24:27   You just can't anymore.

01:24:28   And I do not recommend the current or the upcoming Mac Pro

01:24:32   for that purpose 'cause it's just too much money.

01:24:34   - Finally, Ryan Monahan writes, "I haven't started

01:24:37   "with my new job yet, but have any of you ever had

01:24:39   "to deal with imposter syndrome?

01:24:41   "If so, how did you overcome it or work through it?

01:24:42   "Do you have any tips for a new developer?"

01:24:45   I've definitely been through this a couple of times

01:24:47   when I have quote unquote pivoted my career.

01:24:50   When I started out, I was doing C++ professionally,

01:24:53   and then I eventually switched to doing C# stuff natively,

01:24:56   as in not the web, and then that became web development,

01:24:59   and then I eventually changed into iOS development.

01:25:01   And every single time, you know, I was extremely worried

01:25:05   that I didn't know what the crap it was I was talking about

01:25:07   because, candidly, I didn't really know what the crap

01:25:09   it was I was talking about.

01:25:10   And I think the best advice I have is to own up

01:25:15   to when you don't know something.

01:25:16   Don't try to act like you're smarter than you are.

01:25:19   Most people that I've worked with,

01:25:21   most developers I've worked with, have appreciated

01:25:23   when I've said to them, "Look, I'm sorry,

01:25:25   "but I really don't understand what you're talking about.

01:25:27   "Can you explain it deeper, differently, et cetera?"

01:25:30   And sometimes they'll get annoyed, but generally speaking,

01:25:32   they'll appreciate the fact that I'm being candid

01:25:34   with what I do and don't know.

01:25:35   And I guess just believe in yourself,

01:25:39   which is such a cheesy thing to say,

01:25:40   but even problems that I've had,

01:25:43   like issues I had with vignette,

01:25:45   like the duplicate image detection,

01:25:47   like I didn't have the faintest idea

01:25:48   how I was gonna solve that.

01:25:49   And as we discussed earlier, maybe it's not solved yet,

01:25:52   but certainly it's a lot closer than it was a month ago.

01:25:55   And I didn't have the faintest clue

01:25:58   what I was going to do about that.

01:25:59   And I worked through it and I figured it out.

01:26:01   So you'd be surprised what you're capable of.

01:26:03   Marco, as someone else who doesn't have a job,

01:26:06   why don't you give us advice about having a job?

01:26:09   - Yeah, I mean, obviously this depends a lot on context.

01:26:12   Like it depends on whether you are working

01:26:14   with other people, whether they are smarter than you

01:26:17   or more experienced than you,

01:26:19   whether you are kind of comparing yourself

01:26:22   to the public or being in public.

01:26:24   So it's different for all sorts of different contexts.

01:26:26   But no one starts out being an expert in anything.

01:26:31   No one starts out being an expert in their own job.

01:26:33   Some people never get there.

01:26:35   There are idiots in every field at every level.

01:26:39   And if you simply care and try,

01:26:43   you will generally put yourself ahead of the pack

01:26:48   because most people don't care and don't try.

01:26:50   - That's well put, I agree with that.

01:26:52   - Everyone is putting on an image

01:26:53   that they are fully competent.

01:26:55   Everyone is, at least, and you,

01:26:58   like if you feel these kind of feelings,

01:27:00   you especially are kind of self-selecting

01:27:02   what you perceive from other people.

01:27:04   You are thinking everyone else has it all together.

01:27:08   But the reality is most people are just getting by.

01:27:12   We're just plowing through.

01:27:13   We are doing the best we can with the knowledge

01:27:17   and experience that we have at any given moment.

01:27:19   And it's never perfect and it's never complete

01:27:21   and we're never experts.

01:27:23   We just are more or less clueless as time goes on

01:27:27   or depending on what we're dealing with at the time.

01:27:29   But most people are just kind of plowing through

01:27:32   and doing their best.

01:27:33   And so if you try and if you put in the effort

01:27:37   to try to better yourself,

01:27:39   if you care about getting things right and about learning,

01:27:42   you will be literally better than most people out there.

01:27:47   - John, as someone with an actual job,

01:27:49   what is the best advice you can give?

01:27:52   - They didn't have the term,

01:27:54   at least I hadn't heard the term imposter syndrome

01:27:56   back when I was starting out,

01:27:57   so I don't think I ever suffered from this,

01:28:00   mostly because I, as in so many things in life,

01:28:03   traveled the sort of expected path,

01:28:05   which is you go to school for the thing you wanna do

01:28:09   for your job and then you get a job

01:28:10   doing the thing you went to school for.

01:28:12   So I always felt like I had the skills and training

01:28:15   I needed to do the thing I was doing.

01:28:17   I never felt like, oh, all these people know

01:28:19   what they're doing and I don't,

01:28:20   'cause it's like, well, I'm coming out of school

01:28:23   and doing a job that I studied for

01:28:26   and yeah, I'm the new person or whatever,

01:28:28   but the other thing is it helped,

01:28:31   I was coming up in the, my first job after school

01:28:33   was like I was coming up with the dot com boom days,

01:28:35   so my first job I was literally the only programmer

01:28:37   in the entire company, so it's hard to have

01:28:39   imposter syndrome when no one else

01:28:41   in the entire company is a programmer.

01:28:42   I was by default the best and the worst programmer

01:28:45   in the entire company, just like Margot.

01:28:47   So, or Casey for that matter now,

01:28:51   I'm the only programmer, the best and the worst.

01:28:54   - Hooray!

01:28:55   - So I don't have a lot of good advice

01:28:58   to think about, but I would echo Margot's point

01:29:00   that if you show up and are vaguely competent

01:29:04   and care, you are already above average.

01:29:06   - Yeah. (laughs)

01:29:08   And I would also say too, building on what you said

01:29:10   a second ago, if you don't feel any degree of this,

01:29:15   if you don't think that the people who you are working with

01:29:18   are smarter than you, you might want to get a new job

01:29:21   because you're probably not getting any better

01:29:23   and if you never feel any part of this,

01:29:27   I feel this all the time.

01:29:29   Not to a large degree anymore,

01:29:31   'cause I've been doing this for a long time now,

01:29:34   and I don't work with anybody else,

01:29:35   so I am the dumbest person here,

01:29:37   but also because, I feel it in small ways.

01:29:42   I feel the imposter syndrome in areas of my skillset

01:29:46   that I'm either new at or that have not been my forte.

01:29:49   So things like design.

01:29:50   I've done an increasing amount of my own design

01:29:55   over the years, but I'm not a designer

01:29:57   and I've never been trained as one

01:29:58   and I have very little artistic ability and things like that

01:30:00   and so in areas of my skillset like that

01:30:03   that I'm not super strong in,

01:30:05   but that I've been slowly trying to get better

01:30:06   and slowly pushing myself out of my comfort zone in,

01:30:09   I do feel this still.

01:30:12   And any time I tackle something brand new like that,

01:30:15   I do feel this.

01:30:16   Or any time I even, certainly whenever I make a mistake,

01:30:19   I certainly feel like, oh god, I'm an idiot,

01:30:21   but also every time I have an app update

01:30:25   that I put in the app store,

01:30:27   I get nervous every single release.

01:30:30   Every time I get the email that says,

01:30:31   your app's in review, I get nervous.

01:30:33   I'm nervous the whole rest of the day.

01:30:35   Every time my app goes for sale,

01:30:37   I get nervous for the whole next 12 hours

01:30:39   to see did I break something?

01:30:41   Did I make some kind of critical mistake?

01:30:43   Am I gonna lose everyone's data?

01:30:45   Literally, I am afraid of every single release.

01:30:48   That's just part of the way I react to these things, I guess.

01:30:51   Part of my personality.

01:30:52   I don't know if everyone else does this, probably.

01:30:54   - Oh yeah, oh yeah.

01:30:55   - But like, I'm always, every time I do a push

01:30:59   to my servers and I sync 'em all up to the newest code base,

01:31:03   I check frantically error logs, error rates, server load,

01:31:06   things like that, just to see like,

01:31:08   did I mess everything up?

01:31:09   Did I make a mistake?

01:31:10   Every one of these things makes me nervous

01:31:13   every time I do it.

01:31:15   And occasionally, I have made a mistake

01:31:17   and that nervousness is warranted.

01:31:20   (laughs)

01:31:21   But most of the time I haven't.

01:31:23   But it's just part of doing this, I guess.

01:31:26   So if you have the impression that everyone out there

01:31:30   is an expert and they're confident in their skills

01:31:33   and they don't question themselves, that's not reality.

01:31:37   A lot of people out there, most people out there,

01:31:40   are not as confident as they appear to be.

01:31:43   They do question their skills more than zero

01:31:46   and probably as much as you do.

01:31:48   Except for all the pompous idiots out there.

01:31:51   They don't question their skills,

01:31:52   but they are the ones who should.

01:31:53   (laughs)

01:31:54   So if you are questioning your skills,

01:31:56   you're not being one of them, so good job.

01:31:59   Thanks to our sponsors this week,

01:32:01   Fracture, Linode, and Clearbank,

01:32:03   and we will see you next week.

01:32:05   (upbeat music)

01:32:08   ♪ Now the show is over ♪

01:32:10   ♪ They didn't even mean to begin ♪

01:32:13   ♪ 'Cause it was accidental ♪

01:32:14   ♪ Accidental ♪

01:32:15   ♪ Oh, it was accidental ♪

01:32:17   ♪ Accidental ♪

01:32:18   ♪ John didn't do any research ♪

01:32:20   ♪ Marco and Casey wouldn't let him ♪

01:32:23   ♪ 'Cause it was accidental ♪

01:32:25   ♪ Accidental ♪

01:32:26   ♪ Oh, it was accidental ♪

01:32:27   ♪ Accidental ♪

01:32:29   ♪ And you can find the show notes at ATP.FM ♪

01:32:34   ♪ And if you're into Twitter ♪

01:32:37   ♪ You can follow them at C-A-S-E-Y-L-I-S-S ♪

01:32:42   ♪ So that's Casey List M-A-R-C-O-A-R-M ♪

01:32:47   ♪ N-T Marco R ♪

01:32:49   ♪ M-N-S-I-R-A-C ♪

01:32:52   ♪ U-S-A-C-R-A-Q-S-A ♪

01:32:55   ♪ It's accidental ♪

01:32:56   ♪ Accidental ♪

01:32:58   ♪ They didn't mean to ♪

01:33:00   ♪ Accidental ♪

01:33:02   ♪ Accidental ♪

01:33:03   ♪ Tech podcast ♪

01:33:05   ♪ So long ♪

01:33:07   - I have some cheese grater updates.

01:33:10   - Oh! - Okay.

01:33:11   - So this was my foray into finding electric cheese graters.

01:33:17   Apparently all of Europe has these great electric

01:33:20   cheese graters, you know, starting in Italy,

01:33:22   but they're actually everywhere.

01:33:24   So I bought one, I think I mentioned this in the show,

01:33:26   I bought one from some German,

01:33:28   like from Amazon Germany or something.

01:33:31   It's like, but it looks the same as all the Italian

01:33:33   cheese graters, it might actually be made

01:33:34   by an Italian company, I don't know.

01:33:35   Came in the mail, eventually, took a while to get here.

01:33:38   And of course it's got a European plug on it,

01:33:42   and I got an adapter to turn it into a US plug,

01:33:44   and I put the adapter on, it's just a physical adapter,

01:33:46   it's not a voltage or whatever,

01:33:47   'cause I assume a lot of these power supplies,

01:33:49   like Apple power supplies, they actually work

01:33:51   with all the different voltages and stuff,

01:33:53   it's just a question of physically adapting them.

01:33:55   And this one didn't, so I physically adapted it,

01:33:57   I plugged it in, pulled a little trigger

01:33:59   to turn the little thing, and it went,

01:34:01   like turned like a millimeter, but then stopped.

01:34:04   So I'm like, all right, well this doesn't work.

01:34:05   So I said, forget that, now I'm gonna just look

01:34:08   at the little, what do you call it?

01:34:11   Not transformer, whatever the hell it is,

01:34:13   the AC/DC adapter.

01:34:15   - Power supply.

01:34:17   - And it was, you know, whatever,

01:34:18   the rating was like 3.2 volts, 600 milliamps,

01:34:21   so I'm gonna get one of those little adjustable

01:34:24   AC/DC adapters, lets you adjust the voltage

01:34:25   and everything with the little different tips

01:34:27   you can put on it, you've seen those things, right?

01:34:29   - Yeah, I think so, so you're talking about it has

01:34:31   like one of those, it's not coax, but it's like

01:34:34   one of those plugs that plugs into the cheese grater itself,

01:34:37   and so, then those have different like circumferences,

01:34:40   and so you-- - The barrel jacks.

01:34:42   - Is that what it's called, okay.

01:34:44   And yeah, I know what you're talking about.

01:34:45   So you can just like crank to whatever it's expecting

01:34:47   and then put on whatever tip it needs,

01:34:49   and then you're in business, hopefully.

01:34:52   - Yep, so I did that, and that arrived today,

01:34:54   and so I turned it to match the voltage,

01:34:57   and the amperage was within the range of the thing,

01:35:00   and so I plugged it in, and did exactly the same thing,

01:35:03   went, like the little cheese grater turned

01:35:05   like a couple of millimeters, and then it just

01:35:07   didn't go anymore, and if you pull the trigger again,

01:35:09   maybe it'll go a little bit more.

01:35:11   And now I'm annoyed, 'cause I'm like,

01:35:12   well, what's your problem?

01:35:13   'Cause this is like, it's an AC to DC adapter,

01:35:17   and it's putting out DC exactly what you say

01:35:19   you're supposed to, and no, I didn't get

01:35:21   the polarity reversed, it was, you know,

01:35:22   positive, internal, negative, external,

01:35:24   like I did all the right things.

01:35:26   And so that makes me think, you know what,

01:35:28   that physical adapter actually probably did work,

01:35:30   and maybe just this stupid grater doesn't work.

01:35:33   So then I got angry and cranked up the voltage

01:35:35   until it actually started turning,

01:35:37   and then a little bit of the magic smoke might've escaped.

01:35:40   - Oh, God. (laughing)

01:35:41   - Not all the magic smoke, but a little bit

01:35:44   of the magic smoke escaped, and then I was like,

01:35:45   all right, well, let's consider this a failed experiment.

01:35:48   So either I got a bad grater, or I cannot figure out

01:35:53   how to get this thing to work on US power.

01:35:57   I think I got a bad grater, because honestly,

01:36:00   like, DC is DC, right, and if I match the voltage

01:36:03   and current, and it still just doesn't turn,

01:36:06   I think this is just dead, and if everything wasn't

01:36:09   in German, I would attempt to return it

01:36:10   and get my money back, but I'm not even gonna bother.

01:36:14   Just chalk it up to a learning experience.

01:36:16   Having seen one of these things in person,

01:36:17   I feel like there's a potential for it

01:36:19   to actually be viable and work, so I'm still interested

01:36:23   in if anyone knows of a US product from a store

01:36:27   that I speak the language of and can actually return things

01:36:29   to if it doesn't work, that electrically-grit cheese

01:36:33   that looks like these German ones.

01:36:34   I shouldn't even ask for this, 'cause you don't know

01:36:35   what the one I'm talking about looks like.

01:36:36   Maybe I'll put it in the show notes,

01:36:38   but history as a judge will probably just forget.

01:36:40   Anyway, I'm still looking for something

01:36:43   to grate the cheese for me, and in the meantime,

01:36:46   my hand grater is what I'm using still.

01:36:50   I'll probably take this one apart, by the way,

01:36:51   to see what the heck is going on inside there,

01:36:52   if there's something obvious wrong or whatever.

01:36:54   - Yeah, it sounds like, based on the symptoms

01:36:58   and the smell, I'm not an expert in this area,

01:37:01   but I would guess that the motor can't turn.

01:37:03   Something is jamming it from turning,

01:37:05   and that the smell you're smelling is like the motor

01:37:08   basically trying to burn itself out,

01:37:10   trying to turn.

01:37:11   - Well, it's not that it can't turn,

01:37:12   'cause when given the proper, the quote-unquote,

01:37:16   proper voltage and current, it turns in little bits

01:37:20   when you pull the trigger, right?

01:37:22   When given way too much voltage with the adjustable thing,

01:37:26   it spun, like it went ring, and actually spun at probably

01:37:29   what I assume is the correct maximum speed,

01:37:31   'cause it's not supposed to spin very fast, right?

01:37:33   It spun for a little while, and then a little bit

01:37:35   of the magic smoke came in.

01:37:36   So I like, the smoke was only involved

01:37:39   when I was obviously doing bad things to it

01:37:42   by putting too much power into it,

01:37:44   but it did actually spin, but it makes me wonder,

01:37:47   like, what is your problem?

01:37:47   Like, it makes me think that it was exactly the same

01:37:50   with the adapter that I bought and the one

01:37:53   that I physically adapted.

01:37:54   It makes me think that those ought to have worked.

01:37:57   Everything, you know, they should have been getting,

01:37:59   the behavior was so identical between them.

01:38:02   So I just think, you know, it's screwed up in some way.

01:38:06   I could be totally wrong.

01:38:07   I don't even know, but I do want to take this thing apart.

01:38:09   I was looking at how to take it apart,

01:38:10   and it was like no visible screws,

01:38:11   so this is gonna be fun for me.

01:38:13   - Do you check, like, under the rubber feet,

01:38:15   or like, they oftentimes will hide screws

01:38:17   under rubber plugs or rubber feet?

01:38:18   - Yeah, yeah, and I know all the usual places to look.

01:38:21   I just didn't see anything particularly obvious.

01:38:22   I really needed to go in there

01:38:23   and start prying off some trim pieces,

01:38:25   but I wasn't particularly impressed

01:38:27   with the quality of the thing.

01:38:28   It was cheap.

01:38:29   I mean, I didn't buy an expensive thing.

01:38:30   I knew this was gonna be an experiment.

01:38:31   I think it was like 30 bucks or something like that,

01:38:33   so maybe I'm expecting too much from it,

01:38:36   but I'm intrigued by the design of the thing.

01:38:38   It's basically, I don't know,

01:38:40   I'll find a link to it if I can,

01:38:42   and we'll put it in the show notes,

01:38:43   and Marco will make a chapter art or something

01:38:45   so people can look at this

01:38:46   and know if there's anything in the US,

01:38:50   and yes, everyone has been telling me

01:38:52   I'm supposed to attach the thing to my stand mixer,

01:38:54   but I haven't found a good adapter for that yet.

01:38:58   I do have a stand mixer, and I can attach things to it,

01:39:00   but all the little, tiny things I've seen

01:39:02   have not had the right holes.

01:39:04   I don't want to go through this again.

01:39:05   Don't send me suggestions.

01:39:06   I'm just letting the world know

01:39:08   I'm still on the lookout.

01:39:09   (beeping)