PodSearch

ATP

364: A Casey Settings Screen

 

00:00:00   - Hyper elite web developer, I would have gone with 133+.

00:00:04   That's what I would have gone with.

00:00:05   - Plus, I've never seen that.

00:00:06   - It's like a T.

00:00:08   - Yeah, I don't know if I would have used plus.

00:00:09   I can get behind the one.

00:00:10   - Because you're not hyper elite.

00:00:11   I understand why you wouldn't have gone with a plus.

00:00:13   (laughs)

00:00:14   - I mean, I get it.

00:00:15   I've just never seen it written that way.

00:00:17   - That's right, 'cause you aren't ready to be that elite.

00:00:20   - I debated between the T and the seven,

00:00:22   and I went with the T, but.

00:00:24   And I can absolutely see the one.

00:00:26   I'm right there with you with the one.

00:00:28   But the plus, I agree with Marco,

00:00:30   that came out of left field.

00:00:31   - No, usually it's a seven.

00:00:32   - You have both attained a new level of elite-ness today.

00:00:35   - It has to be either a T or a seven.

00:00:37   - That's the levels one and two.

00:00:39   Plus, you go to the next level.

00:00:42   It just blows people's minds like he's so elite,

00:00:43   he's just a plus for a T.

00:00:45   That's madness.

00:00:46   (electronic beeping)

00:00:48   - So if I command click on Safari,

00:00:51   which one would think would, on the dock,

00:00:53   which one would think would open a new Safari window,

00:00:56   would you not?

00:00:57   - Command click reveals it in the Finder.

00:01:00   What are you talking about?

00:01:01   - So maybe I'm just a moron,

00:01:02   because any time I do that, I get a new Finder window,

00:01:04   so I guess I am a moron.

00:01:05   - No, when you hold down the Command key

00:01:07   and click on the Finder window,

00:01:09   Finder icon in your dock,

00:01:10   it should show the Finder application in the Finder,

00:01:13   or whatever, you know what I mean?

00:01:14   You know what I'm saying?

00:01:15   - Oh, yeah, you're right.

00:01:16   Okay, well, at least I know I'm an idiot

00:01:18   and it's expected behavior.

00:01:19   - Command option click on a folder

00:01:22   does what click should do on a folder.

00:01:24   God, I wish I could change that.

00:01:25   - Can I get an agreement on that, by the way?

00:01:27   A single clicking with the regular,

00:01:29   plain old left mouse button on a folder

00:01:31   that is in your dock should open that folder in the Finder.

00:01:36   - Oh, you mean rather than doing the like, explode out?

00:01:39   - Rather than doing one of the other two things it does,

00:01:42   neither of which I ever want.

00:01:43   (laughing)

00:01:45   - Why do I get a feeling that we're hearing the genesis

00:01:47   of app number two or three or seven for you?

00:01:49   - If only, if only I could do that type of stuff.

00:01:53   - We don't know a little world where you can hack

00:01:55   the dock anymore.

00:01:57   - The struggle is real.

00:01:57   - But do either one of you use like the springy out

00:02:00   bendy tower thing or the giant grid of icons

00:02:03   that you can never find anything in?

00:02:04   - I use the giant grid of icons that I,

00:02:06   that you are correct, I can never find anything

00:02:08   for downloads and only downloads.

00:02:10   And that is the only folder that is in my dock.

00:02:12   - I only, I use it for downloads constantly,

00:02:15   but I only scroll to the bottom and hit show in Finder

00:02:18   or whatever.

00:02:19   - Marco, I'm gonna give you the advanced technology.

00:02:22   Just hold down command and option and click on downloads

00:02:24   and it will just open.

00:02:25   - Oh.

00:02:26   - And then you can sort reverse by date.

00:02:28   - That is very clever, I did not know that.

00:02:30   - Yeah, 'cause I keep downloads sorted by date descending.

00:02:33   And what has always annoyed me about those Finder,

00:02:36   those folder stack things in the dock is that

00:02:38   they completely ignore the settings that you have

00:02:39   to sort files and also you can't like right click on them

00:02:43   and get a context menu on the things in there.

00:02:46   - I would suggest sorting your downloads folder

00:02:49   by date added rather than date modified

00:02:51   because sometimes it's possible to get things that like unzip

00:02:55   and have a modification date that's in the past

00:02:57   and they aren't at the top.

00:02:58   So if you sort by date added descending

00:03:00   and you always command option click on the downloads folder,

00:03:03   it will open a Finder window.

00:03:04   I think that should either be the default behavior

00:03:07   or one of the choices.

00:03:08   If you like the Bendy stack, fine, go for it.

00:03:10   If you like the big grid, fine,

00:03:11   but what if you just want the window to open in the Finder?

00:03:13   That would be nice too.

00:03:14   - Totally agreed.

00:03:15   - I've been command option clicking on the,

00:03:17   now that I used to use a drag thing dock for this,

00:03:21   used to have no folders in my dock

00:03:22   and I had a drag thing dock

00:03:24   that was down in the lower right corner

00:03:26   that had folders in it and when you clicked on them,

00:03:29   they opened their windows in the Finder.

00:03:31   That was cool.

00:03:32   - You really had your world rocked

00:03:35   by drag things disappearance, didn't you?

00:03:38   - I mean, it's not that bad.

00:03:39   Like putting, because the screen is so big,

00:03:42   I've got a lot of room for folders in the dock now

00:03:44   and I'm so accustomed to command option clicking folders

00:03:50   in the dock that it is a pretty ingrained habit,

00:03:53   but every once in a while, it bothers me when I remember

00:03:55   that I have to keep doing that.

00:03:57   - I'm sorry for your struggles, John.

00:04:00   Are you, I don't remember, you're a side dock person,

00:04:03   is that right?

00:04:04   - Nope.

00:04:05   - You're bottom docker.

00:04:06   I thought you were and then I convinced myself,

00:04:08   no, John wouldn't do such a barbaric thing.

00:04:10   Do you at least hide it automatically, at least?

00:04:13   - Nope.

00:04:13   (John gasps)

00:04:14   - John.

00:04:16   - Hidden dock is the worst.

00:04:17   I don't wanna go in there and wait for a thing to,

00:04:19   what is this, iOS, I gotta drag my finger

00:04:20   to the bottom of the screen and wait?

00:04:22   No, no waiting.

00:04:23   (John laughs)

00:04:24   - Why, why, John, why, why the bottom?

00:04:27   - My screen is really big, believe me,

00:04:29   I'm not hurting for screen real estate.

00:04:32   - Now I will allow it, but before now, no.

00:04:35   - Yeah, I did it on side on laptops

00:04:37   'cause they were too small.

00:04:38   - Yes, yeah, on laptops, I always do left side,

00:04:41   but on laptops, I do auto hide, on desktops, I don't.

00:04:43   - Interesting.

00:04:44   - Yeah, I don't know, Mar, you're not a lefty,

00:04:46   are you, Marco?

00:04:47   - No.

00:04:48   - Left side is the correct side.

00:04:49   - Left side dock is madness.

00:04:52   - Why?

00:04:52   - It's just plain madness.

00:04:55   - Why, I read from left to right.

00:04:56   - Right, exactly, so it should be left to right,

00:04:59   top to bottom, the upper left corner is,

00:05:01   especially on a small screen,

00:05:02   is the most prominent location.

00:05:04   The dock shouldn't be there, it's an auxiliary thing.

00:05:07   It should be far away from the upper left.

00:05:10   - It's not there, it's auto hidden.

00:05:11   - And dock is also madness.

00:05:14   - Hey, let me really piss you off.

00:05:16   - Yeah, would you auto hide in the menu bar too?

00:05:18   - No, no, no, even worse.

00:05:19   - No, that's barbaric.

00:05:21   I mean, if you had an 11 inch laptop, maybe, I guess.

00:05:23   - I do have an 11 inch laptop,

00:05:24   but no, I, or 12 inch, strictly speaking,

00:05:27   I like the, I like Genie mode, and I like magnification.

00:05:32   (gasping)

00:05:33   - Magnification, I could take or leave.

00:05:35   Genie is the default, right, so then,

00:05:37   it's whatever I was using, unless they change it.

00:05:40   - Most people are very, very angry

00:05:42   when I mention that I use magnification.

00:05:45   - Yeah, I don't know.

00:05:46   - I quite like it.

00:05:47   I mean, it doesn't actually change

00:05:49   the size of the targets, really, at least width wise.

00:05:54   Yeah, I could take it or leave it.

00:05:58   I don't use it, personally,

00:05:58   but I don't think it's so terrible.

00:06:02   - You are right that I shouldn't give you too much flack,

00:06:03   since you do have a monitor that's approximately

00:06:06   the same size as your main television,

00:06:08   but I still think left side's where it's at, personally.

00:06:12   - Yeah, I got a lot of windows open these days.

00:06:14   (laughing)

00:06:15   Let me tell ya.

00:06:16   - Speaking of your monitor,

00:06:17   that's a perfect segue to begin follow-up.

00:06:19   Pro Display XDR reference modes,

00:06:21   would you mind telling me about this?

00:06:23   - God, we can't escape this topic.

00:06:24   This is one more thing, I swear, the last one.

00:06:26   Last time, someone wrote in about using True Tone

00:06:29   and how they endorsed it, and they mentioned this ISO spec,

00:06:32   ISO 12646, well, one of the anonymous experts

00:06:37   about the Pro Display XDR chimed in and said,

00:06:40   "One of the reference modes for the Pro Display XDR

00:06:44   "is exactly for ISO 12646."

00:06:47   You can set it to this mode,

00:06:48   and then it disables True Tone,

00:06:50   and it sets it to this mode that is apparently super warm,

00:06:52   and then if you have your room set up

00:06:54   the way that ISO spec says you're supposed

00:06:56   to have your room set up, there you go.

00:06:58   You're all ready to do whatever the hell it was,

00:07:00   soft-proofing on printed materials.

00:07:03   So, boy, you can really just spend all day

00:07:06   going through the 800 reference modes supported by this

00:07:09   and watching each one of them and going,

00:07:11   "Ugh, that looks weird,"

00:07:13   probably just because your room isn't set up right.

00:07:15   - I'm surprised you haven't gone full THX tune-up

00:07:18   or whatever it's called on your monitor yet.

00:07:20   - Well, that's the whole point.

00:07:21   I bought it from them.

00:07:22   It's calibrated at the factory.

00:07:23   They put it on with the undercoating.

00:07:25   (both laughing)

00:07:28   - Well done.

00:07:30   Oh, my goodness.

00:07:31   All right, so no other Mac Pro follow-up?

00:07:33   That's it? That's all we have?

00:07:35   - I think the only other, I mean,

00:07:37   if you're asked for some, I do have some.

00:07:38   I continue to assess the internal storage situation

00:07:43   on my Mac.

00:07:44   There are many options for sticking

00:07:46   every kind of storage you can imagine inside here.

00:07:48   You can put, I think, six 3.5-inch hard drives in here

00:07:53   if you want.

00:07:54   You can put in six or seven PCI cards,

00:07:58   these two of which can hold up to four M.2 SSD thingies.

00:08:03   You can put in a $400 rack-mount thing

00:08:08   that you can put two 3.5-inch drives in

00:08:10   or two 2.5-inch drives.

00:08:13   All these options are very expensive,

00:08:14   and none of them I find particularly satisfactory

00:08:17   at this moment.

00:08:18   I would have already bought that two-drive Pegasus thingamabobber

00:08:23   that Steven Hackett bought if it didn't cost $400

00:08:26   and come with an eight-terabyte 3.5-inch hard drive

00:08:29   that I don't want.

00:08:30   - Yeah, that's fair.

00:08:31   - I continue, maybe Steven will get tired of it,

00:08:33   and he'll sell his old one to me.

00:08:35   I'm looking for them on eBay.

00:08:36   I just want the thing with no drives in it.

00:08:39   I've got drives.

00:08:40   I don't need your drives.

00:08:41   I just want a convenient little case to mount things in.

00:08:45   So I'm still waiting on that, and it's kind of frustrating

00:08:48   because right now I'm backing up a time machine

00:08:51   to this dinky little external 2.5-inch spinning hard drive

00:08:55   that I have, and it's a pain to have to connect it

00:08:58   every once in a while, let it do its thing,

00:08:59   and I don't want to leave it connected

00:09:01   'cause it's just weird to have it dangling.

00:09:02   Anyway, I got all the room in my case.

00:09:05   Still haven't filled it,

00:09:06   and I'm still waiting for the new video cards to come out.

00:09:08   They still haven't released the supposed W5700 XT

00:09:13   or whatever it is that they've been advertising forever.

00:09:16   So the wait continues, partially on Apple

00:09:20   and partially on third-party people.

00:09:21   I can't believe that OWC or somebody

00:09:23   hasn't just come out with the $50 version

00:09:26   of an empty bracket where you can stick drives

00:09:29   'cause Pegasus made one, but they just insist

00:09:31   on making you buy an eight-terabyte drive for 400 bucks,

00:09:34   which is kind of cruddy.

00:09:36   I'm so sorry.

00:09:37   All right, we should also clear the air

00:09:40   with regard to iPad multitasking.

00:09:42   I went on a bit of a rant last week,

00:09:45   moaning about how I don't care

00:09:47   for the way iPad multitasking is,

00:09:49   and I think all of us were moaning

00:09:50   at some point or another about this.

00:09:52   - Us? - I in particular,

00:09:53   yeah, us, no.

00:09:54   I in particular went on a bit of a rant

00:09:58   with regard to how you get iPad multitasking to work

00:10:02   when you are trying to load something

00:10:04   that is not in your dock.

00:10:05   And what I had said was you can go back to the home screen

00:10:08   and then pick up an icon,

00:10:09   and then it's like doing the little dancy thing,

00:10:10   but you don't want it to do the dancy thing, blah, blah, blah.

00:10:12   And people pointed out to me that one approach,

00:10:15   I'm probably gonna get the exact order of operations wrong,

00:10:17   but the idea is another approach to handle this

00:10:19   is you open app one and go to the home screen,

00:10:23   open app two, and then app one should be

00:10:27   on the right-hand side of your dock in that recents area,

00:10:31   and then you can just grab it right there

00:10:33   and put it into one of these side panels

00:10:35   that you would like it to be in.

00:10:36   So that is a little bit better and a little bit easier,

00:10:39   and I should have known that,

00:10:40   but nevertheless, I still find it to be

00:10:44   extremely frustrating.

00:10:45   - Unless you have that disabled,

00:10:46   I think I have recents disabled.

00:10:48   - There is an option to disable it, I'm almost sure,

00:10:50   but to be fair, I have not disabled it

00:10:52   to the best of my knowledge.

00:10:53   - I have disabled it, but I've used that same technique,

00:10:56   like trying to launch it again to get it in the,

00:10:58   like, I don't know, maybe I have a disable

00:11:00   on some devices and don't on others, but yeah.

00:11:02   I don't want, I have to say,

00:11:04   I have recent apps disabled in my Mac dock

00:11:06   and also in every iOS device

00:11:09   that I could remember to do it on,

00:11:11   because I don't want other stuff filling there.

00:11:13   Like, I fill the bottom dock with a bunch of stuff

00:11:16   and I don't want other things randomly

00:11:18   hopping in there just because I used them recently.

00:11:19   So that kind of kills that technique,

00:11:22   but I still find myself doing it,

00:11:24   like launching it the regular way

00:11:26   as a way to get it available for multitasking.

00:11:29   Maybe I just do that instinctively and it doesn't work

00:11:31   and I just go back to the way you described the last time.

00:11:34   I don't even know.

00:11:35   It's confusing.

00:11:36   The thing, I played with this a little bit more

00:11:38   after the show to say maybe there are other obvious ways

00:11:40   that I'm forgetting and it just really kills me

00:11:42   that in multitasking view on the iPad

00:11:44   where you see the little miniature versions

00:11:45   of all your open apps that you can't just grab them

00:11:47   and like drag them on top of each other.

00:11:49   Like that functionality, as far as I'm aware,

00:11:51   is not actually used for anything

00:11:54   and it's just so obvious, like here they are.

00:11:56   Do you wanna squish them together?

00:11:58   Grab one and squish it together.

00:12:00   I was like, nope, you can't grab them here,

00:12:01   even though these are cute little pictures of all your apps.

00:12:03   They're not for your grabbing.

00:12:04   (laughing)

00:12:06   They're just for you to view and enjoy.

00:12:08   No grabbing.

00:12:09   (laughing)

00:12:10   Again, unless there's some weird, you know,

00:12:13   three finger stand on one foot long press tongue gesture

00:12:18   that I don't know about.

00:12:20   - Wow.

00:12:20   - We are brought to you this week by Squarespace.

00:12:24   Start building your website today at squarespace.com/ATP.

00:12:29   Enter offer code ATP at checkout to get 10% off.

00:12:32   Make your next move with a beautiful website

00:12:34   from Squarespace.

00:12:36   Squarespace makes it super easy to make websites.

00:12:39   It's as simple as that.

00:12:40   Look, most of you have probably heard this message

00:12:41   a million times.

00:12:42   Let me tell you why you really wanna choose them.

00:12:44   I know that a lot of our listeners, myself included,

00:12:46   are able to make our own websites other ways.

00:12:49   Using CMSs that other people make, that we install,

00:12:52   our other services, or building our own from scratch,

00:12:56   which is usually the method I take.

00:12:57   But the reality is, most of the time,

00:12:59   that's not worth our time.

00:13:01   And Squarespace does a lot of things better

00:13:03   than what we can do ourselves.

00:13:04   So for instance, if I had to make like a storefront,

00:13:07   a gallery, or you know, things like this,

00:13:09   Squarespace does that super easily, all built in,

00:13:12   way better than I could do it, and it takes me no time,

00:13:16   because I didn't have to build it, right?

00:13:18   If you're making a website for yourself,

00:13:20   or what happens a lot to nerds like us,

00:13:22   if you're making a website for somebody else,

00:13:23   somebody else has asked you to, hey,

00:13:25   help me make my website better,

00:13:26   it's so much easier, and so much more time efficient,

00:13:29   to just go to Squarespace and do it there.

00:13:31   Because you can set up a website in no time at all,

00:13:33   and they'll support it, you don't have to support it,

00:13:36   and it's just amazing the quality you get,

00:13:39   the modern features, the modern designs,

00:13:42   all the wonderful layout and responsive stuff,

00:13:44   all that's built in with Squarespace.

00:13:46   And you don't have to build it yourself,

00:13:47   you don't have to support it.

00:13:48   So check it out today, squarespace.com/atp.

00:13:52   Anybody with any skill level can go there,

00:13:55   start a free trial site, and make an awesome to use site

00:13:58   in no time at all.

00:13:59   When you wanna sign up for Squarespace,

00:14:01   go back there, squarespace.com/atp,

00:14:03   and use offer code ATP to get 10% off your first purchase.

00:14:07   That's squarespace.com/atp, code ATP.

00:14:10   Thank you so much to Squarespace for sponsoring our show.

00:14:13   Make your next move with a beautiful website

00:14:15   from Squarespace.

00:14:16   - May I, gentlemen, go a little bit off plan for a moment?

00:14:24   Are you willing to bear with me on this?

00:14:25   - Sure.

00:14:26   - I'm always willing to go off the plan.

00:14:28   - Marco doesn't know the plan, so as far as he's concerned,

00:14:30   everything is off the plan.

00:14:31   (laughing)

00:14:33   Everything is on the plan.

00:14:34   - All right, if you wouldn't mind,

00:14:36   would you please make sure your Skype windows are visible?

00:14:39   - I got a lot of windows open.

00:14:42   - Marco, would you mind describing to people

00:14:44   what you're looking at, which is actually my screen?

00:14:46   - Well, I see Casey's screen being shared,

00:14:49   being his former discovered four quadrant layout.

00:14:54   - Patented.

00:14:55   - He has Skype taking up a quarter of the screen.

00:14:58   Colloquy IRC on the other corner,

00:15:01   and the other column is a Safari window

00:15:03   and a code editor of some kind.

00:15:06   Looks like Sublime, maybe, or--

00:15:07   - Video Studio Code.

00:15:08   - Cool.

00:15:09   And then the Safari window is showing App Store Connect,

00:15:14   which is where you go to upload and manage apps

00:15:18   that you've made.

00:15:19   And it appears to be showing an app

00:15:22   that I have not heard you talk about yet.

00:15:24   - No.

00:15:25   - Can I say the name?

00:15:26   - You may, you may.

00:15:27   - Named Peekaview, which is a pretty cool name.

00:15:31   I don't know what it does yet, but it's called Peekaview,

00:15:33   and it has, looks like an emoji wearing sunglasses

00:15:36   as the icon.

00:15:37   (laughing)

00:15:39   - Close enough, yeah.

00:15:40   So what I am doing is I am sending you

00:15:42   to a TestFlight invite.

00:15:44   - Oh, I don't have my phone with me.

00:15:46   It's an iOS app, right?

00:15:47   - It is an iOS app.

00:15:48   I am sending you a TestFlight invite to my latest app,

00:15:50   which is called Peekaview, and I should tell you about it.

00:15:54   But while I do that, I guess I can just get ready

00:15:58   to do this little thing right here.

00:15:59   Marco, would you mind describing to me what's going on now?

00:16:01   - Oh my God, that icon is adorable.

00:16:03   Hold on, I'm looking at the icon.

00:16:05   It's like, it's the Viewmatic thing,

00:16:07   like where you look through the--

00:16:08   - Viewmaster.

00:16:09   - That's it, yeah, you look through the goggles,

00:16:10   and there's the circular thing of 3D pictures,

00:16:14   and they like flip around as you click the button on top.

00:16:17   - That's right.

00:16:18   - All right.

00:16:19   Oh, it looks like, so you are looking at the screen

00:16:21   in App Store Connect when your app has been approved,

00:16:24   and it's an impending developer release state

00:16:26   where you've clicked Manually Release,

00:16:28   and you are clicking Release This App.

00:16:30   - I am indeed.

00:16:31   - So it appears that you have just released a brand new app

00:16:34   that I didn't even know you had been working on.

00:16:37   - This is true.

00:16:38   So as, there we go, okay.

00:16:41   So as of literally right now, it is ready for sale.

00:16:44   So hey, guess what?

00:16:46   I wrote another app.

00:16:48   - That's awesome.

00:16:48   Wait, how long have you been doing this?

00:16:50   You didn't mention this at all.

00:16:51   - No, by design, and I'm going to stop sharing my screen

00:16:54   'cause this is creepy, by design,

00:16:56   what I have done is over the last couple of months,

00:17:00   I have created a new app,

00:17:02   and one of the things I wanted to do as part of that

00:17:05   is not tell you to because I thought it would be fun

00:17:06   to surprise you on the show.

00:17:07   - You kinda did an okay job.

00:17:10   I kinda know you were working on a new app.

00:17:11   Like, if listeners, if you had been listening for the clues,

00:17:15   I think there was enough on episodes of ADB

00:17:17   that you could tell.

00:17:18   I mean, even as recently as a couple days ago,

00:17:20   you posted some picture from Wegmans.

00:17:21   It's like, we know you're working on an app.

00:17:22   We just didn't know what it was.

00:17:24   I know it was already ready.

00:17:25   I'm mad that I left my phone upstairs.

00:17:27   I wanna go try the test flight.

00:17:28   - Well, I'm sorry.

00:17:29   I should have warned you,

00:17:30   but I didn't wanna give anything away.

00:17:31   So all kidding aside, it is rolling out as we speak.

00:17:35   If you're listening to this live,

00:17:36   you probably won't be able to see it for an hour or two,

00:17:38   but the idea is it's called Peak of You,

00:17:41   as Marco had mentioned.

00:17:42   The icon is adorable, and I wish I could take

00:17:45   any credit for it, but it was my good friend, Stee,

00:17:48   who if you listen to analog, you would know as Stay,

00:17:50   and if you don't listen to analog, you won't get that joke.

00:17:52   But nevertheless, the app is called Peak of You.

00:17:55   It was born in our Disney trip,

00:17:59   and so I should probably explain.

00:18:01   When we all went to Disney,

00:18:03   as I think we talked about on the show,

00:18:05   I mean, I know we talked about Disney on the show,

00:18:06   but I don't know if we talked about this part of it,

00:18:08   Michaela, whom I love dearly

00:18:09   and who was just shy of two years old at the time,

00:18:12   she was not enthusiastic about going in the stroller,

00:18:17   and when you're at Disney World,

00:18:20   that is a little bit frustrating,

00:18:21   and what we ended up figuring out

00:18:23   was that we could give her one of our phones

00:18:26   and lock her into the Photos app using guided access,

00:18:31   and that would let her look at the photos in our phones,

00:18:36   and we knew she couldn't go send texts

00:18:37   or whatever the case may be,

00:18:39   but nevertheless, she could have still deleted stuff,

00:18:43   and that's not good.

00:18:45   We don't want that.

00:18:47   So it occurred to me, well, I know how to write iOS apps.

00:18:52   I could write a read-only photo gallery.

00:18:55   That's something I can do.

00:18:56   We have the technology.

00:18:57   We can do this.

00:18:58   And so I think the first commit

00:19:00   was something like the 2nd of November,

00:19:02   and we had gotten home on the 30th of October,

00:19:05   and I was working on this all of November,

00:19:07   the portions of December that I actually worked

00:19:09   and was a grown-up, and all of January,

00:19:12   and the first version was approved

00:19:15   but not put up for sale on the last day of January,

00:19:18   on the 31st.

00:19:19   I realized there was an oops that was entirely my fault,

00:19:22   so I pulled it yesterday.

00:19:25   I believe it was yesterday.

00:19:25   I pulled it, or maybe it was the day before.

00:19:27   Sometime in the last 48 hours, it's been a blur.

00:19:29   I developer rejected the build and then put it back up,

00:19:33   which was very stressful,

00:19:34   because even though app review time is pretty good,

00:19:37   I was scared that all of a sudden I would,

00:19:39   I've been waiting for tonight's ATP for weeks.

00:19:41   Like, I didn't know exactly when it would be,

00:19:43   but I've been waiting for a long time

00:19:45   to do this for you guys, to you guys, et cetera,

00:19:48   and I was scared that then this would be the one time

00:19:50   I get rejected or there's a two-day wait or whatever,

00:19:54   but thankfully it all worked out.

00:19:55   So the idea behind Peekaview

00:19:57   is that it is a read-only photo gallery

00:19:59   that you could hand to a kid or a client or a friend,

00:20:02   and the only thing that they can do

00:20:05   is look at the photos that you've given to them.

00:20:09   - I've already got a bug report.

00:20:11   - Oh, of course you do.

00:20:12   Of course you do.

00:20:12   - I got my phone delivered.

00:20:14   - You didn't even make it through the description.

00:20:16   - I know. - I know, keep going,

00:20:17   but I just wanted you to know.

00:20:18   - Wonderful.

00:20:19   See, this is the thing.

00:20:20   This is the danger by not telling the two of them,

00:20:22   I love you too dearly,

00:20:23   but you're both total pains in the ass,

00:20:24   and it is for the best that you have a bug report,

00:20:26   'cause I can fix it then.

00:20:27   But, yeah, so the idea is you can choose one of your albums

00:20:31   that you've set up in photos,

00:20:32   and you can limit the app to just that album,

00:20:36   and once guided access is turned on,

00:20:38   there's nothing that they can do to change the album,

00:20:40   there's never anything they can do to delete anything,

00:20:42   to edit anything, et cetera, et cetera, et cetera.

00:20:44   So that's the shtick.

00:20:47   It is similar to Vignette.

00:20:50   It is free to see 20,

00:20:52   your 20 most recent photos or videos or what have you,

00:20:56   and it is a $5 an app purchase

00:20:59   in order to see the rest of your stuff.

00:21:01   And, surprise, that's what's going on.

00:21:04   - So, first of all, that's a pretty cool idea.

00:21:08   Second of all, I love some of your implementation details

00:21:12   that you've done here.

00:21:12   So, I like that you have the bigger and smaller pictures

00:21:17   in your collection view here,

00:21:18   I guess the highlighted ones are bigger,

00:21:20   or somehow some of them are bigger.

00:21:21   And I love your auto-playing of live photos as videos.

00:21:26   That is really cool.

00:21:29   - I thank you, I appreciate that,

00:21:30   'cause Mike was just yelling at me about that same thing.

00:21:33   So, for those of you who are keeping up,

00:21:35   I recorded analog Monday, but we did not broadcast it live.

00:21:39   And the reason we didn't was because

00:21:41   we didn't want anyone to know about this.

00:21:42   So, Mike was giving me a hard time.

00:21:44   Mike was on the beta, and it's not because I love him more,

00:21:48   it's just because I wanted to surprise the two of you.

00:21:50   And anyways, he was yelling at me

00:21:51   because he did not care for the moving live photos.

00:21:54   So, I might, I have a couple ideas there.

00:21:56   I might turn that off automatically if you're like Jon

00:21:58   and do the, I forget the name of it,

00:22:00   but the reduced motion. - No.

00:22:01   - Or maybe I'll add a switch, we'll see.

00:22:04   But as it is, I like it as well.

00:22:08   - What's also nice is that compared to

00:22:11   the actual official Apple Photos app,

00:22:13   it's faster to get in and out of photos.

00:22:16   It seems like you have duplicated their animation

00:22:18   a little bit, but you've done it faster.

00:22:21   I would even say get rid of that little bounce

00:22:23   that it does at the end.

00:22:25   (laughing)

00:22:26   'Cause the bounce looks a little weird at the speed,

00:22:29   but I love how fast it is to get in and out of a photo.

00:22:32   'Cause you can hold the phone with one hand

00:22:34   and just tap with your thumb in and then tap

00:22:37   and drag down to go out.

00:22:38   And you can do the exact same motion,

00:22:39   I'm switching back and forth here.

00:22:40   The exact same motion works in Apple Photos,

00:22:42   but it takes longer and you have to go further.

00:22:44   So, by almost but not quite cloning

00:22:47   the Apple interaction model,

00:22:48   you've actually made an improvement here,

00:22:50   possibly accidentally, by making your timings all

00:22:54   a little bit faster and your tolerances

00:22:55   all a little bit tighter.

00:22:56   So, this is actually a really good way

00:22:58   to very quickly flip through photos.

00:23:00   So, that's pretty cool.

00:23:02   - Thanks.

00:23:03   - I also like that you auto play videos.

00:23:05   When you open up a video, it auto plays it.

00:23:06   - And it does it muted.

00:23:08   - Yes, it auto plays it muted and there's a little thing

00:23:10   in the bottom there, unmute it.

00:23:11   That is a really nice, like,

00:23:13   this is not only good for the use case

00:23:18   that you've outlined here of controlling somebody's access

00:23:20   to your photos and just letting them view it.

00:23:22   This is also good to just quickly review

00:23:23   recent photos you've taken.

00:23:25   (laughing)

00:23:26   'Cause, like, it's so fast to get in and out.

00:23:28   - Jon, you've been quiet, I'm a little scared.

00:23:30   - I'm playing with the app.

00:23:31   I tried to do the in-app purchase,

00:23:32   but I got one of your emoji-filled error messages.

00:23:35   - Oh, no!

00:23:36   Oh, no, well, hopefully it's not completely broken.

00:23:39   We'll see what happens.

00:23:40   - Yeah, I did, I looked at the settings screen

00:23:42   and it clearly is a KC settings screen.

00:23:45   - Yes, it is.

00:23:46   - It's full of emoji and lots of explanatory text.

00:23:49   - I was gonna say, I didn't have the benefit

00:23:51   of you editing me and cutting down all the text,

00:23:53   which I was very sad about,

00:23:54   but there will be improvements, I am quite sure.

00:23:57   In fact, I already have realized that in certain cases,

00:24:01   if you have, for example, a panorama,

00:24:03   which is really, really big,

00:24:05   the version that Peek-a-View shows

00:24:06   as of the time we record this isn't quite full resolution,

00:24:09   and I've already fixed that bug,

00:24:11   but I was so scared to go through the same dance of like,

00:24:14   oh, if I submit it, maybe it won't be ready in time,

00:24:16   et cetera, et cetera,

00:24:17   and so I haven't yet submitted that fix.

00:24:19   I'll presumably do it first thing tomorrow morning.

00:24:20   But, yeah, I'll actually be able to,

00:24:24   for real, test my in-app purchase stuff,

00:24:26   'cause I've tested the snot out of it in test flight,

00:24:28   but it never, ever seems to work exactly the same.

00:24:30   But thank you for trying to throw me $5.

00:24:34   Yeah, so anyways, I definitely have some work to do on this.

00:24:37   It's funny because in a lot of ways,

00:24:40   this is far less ambitious than Vignette.

00:24:42   I think Vignette was a much more ambitious thing to do

00:24:44   and certainly much more complicated,

00:24:46   but in certain ways, I'm a little more proud of Peek-a-View.

00:24:50   I think, and Marco, you seem to have pounced on this

00:24:52   immediately in the happy sense,

00:24:54   I think it's a bit more polished than Vignette is,

00:24:57   I think in part because it's a much simpler problem area

00:25:00   to work on.

00:25:02   Now, I've already got other ideas

00:25:04   on how to make this more complex if I so desire

00:25:06   and to enhance things.

00:25:08   But it is surprising to me,

00:25:11   it isn't but it is surprising to me

00:25:13   that it really and truly is one of those things

00:25:17   where I got the bare bones of this working

00:25:19   within like, I don't know, a week or something like that,

00:25:21   maybe two weeks tops,

00:25:23   but the rest of the time has been spent polishing

00:25:25   and polishing and polishing and improving

00:25:27   and polishing and improving.

00:25:28   And again, as with all things, what is the saying?

00:25:32   The last 20% is 80% or something like that,

00:25:35   you know what I'm thinking of.

00:25:36   - Yeah, yeah, yeah.

00:25:37   - And that was very much the case here.

00:25:38   Not to say it's perfect,

00:25:39   I'm not saying it's perfect by any means,

00:25:41   but it is definitely,

00:25:44   I feel like it's more polished than Vignette is/was

00:25:47   and I'm proud of it for that.

00:25:50   Behind the scenes for the nerds,

00:25:51   there is no RX Swift in this,

00:25:53   which was a deliberate choice.

00:25:56   For the longest time,

00:25:57   I didn't think that there was any real need

00:26:00   for any of the affordances that RX provides.

00:26:02   However, if you don't use your beloved hammer,

00:26:07   but there's something that's vaguely hammer-like

00:26:10   that's new and shiny and available to you,

00:26:12   you might choose to use that.

00:26:13   So there is some combined in here.

00:26:15   There is a couple of,

00:26:16   there are a couple of screens of Swift UI.

00:26:18   So the onboarding screens are Swift UI

00:26:20   and the purchase screen is Swift UI.

00:26:23   And one of the next things that is on the docket

00:26:25   for us to talk about,

00:26:26   if we don't get sidetracked for the rest of the episode,

00:26:28   which I hope we don't,

00:26:29   is to talk about our experiences, John and me,

00:26:32   with Swift UI.

00:26:33   So maybe we'll get to that shortly.

00:26:34   But yeah, it's simple and it's not,

00:26:39   and it's interesting and I'm pretty proud of it.

00:26:42   And I hope you, the listeners, and the two of you like it.

00:26:44   And I'm sorry, the two of you for not saying anything,

00:26:46   but I wanted you to be able to experience it live

00:26:49   with everyone else.

00:26:50   - Yeah, that's pretty cool.

00:26:51   I'm actually, I'm glad that you did that,

00:26:53   'cause it's more fun for the show.

00:26:54   (laughing)

00:26:55   - I thought it might be.

00:26:56   - Yeah, that's awesome.

00:26:57   You ready for your bug report?

00:26:59   - Oh God, do I want it to have this publicly or no?

00:27:01   - Mark already, yeah, that's quick.

00:27:04   Mark already got one that, what was yours before?

00:27:07   It wasn't a bug report, it was just a suggestion.

00:27:09   - They'll kill the bouncing.

00:27:10   - Ah yes, the bouncing, yep.

00:27:11   I mostly agree with that, but then again,

00:27:13   it is a kid's app, so maybe kids will like the fun bounce,

00:27:16   you know what I mean?

00:27:17   So I go either way on that.

00:27:19   The one that I think is, it's,

00:27:21   I don't know what you can do about this, but--

00:27:24   - Oh, that's always dangerous, okay.

00:27:26   - Yeah, the gesture recognizer or whatever you're using

00:27:30   for sideways swipe to go to the next photo,

00:27:32   it is very unforgiving, such that when I use my,

00:27:37   when I have my phone in my right hand

00:27:39   and I'm using my right thumb to go through pictures,

00:27:42   like 20% of the time, when I try to go to the next photo,

00:27:47   it takes me out of it because I have to move

00:27:49   my thumb down too far, so it's like super sensitive.

00:27:51   Like if you go to the left and then deviate

00:27:54   from a right to left or left to right motion

00:27:56   by half a centimeter, it's like you wanna go back.

00:27:59   And that makes it basically impossible for me

00:28:01   to sit there with my one hand and thumb through them,

00:28:04   you know what I mean?

00:28:04   So if you have any control over that gesture recognizer

00:28:06   to say, leave a lot of slack in there, that would do it.

00:28:11   One of my favorite ones of those is Twitterifics,

00:28:15   like display an image from a tweet.

00:28:18   It does a similar thing where you can just chuck it

00:28:20   in any direction and it goes away, which I love,

00:28:22   but I never accidentally chuck it.

00:28:24   So whatever tolerances they're using will be good.

00:28:26   And especially I can imagine for kids too,

00:28:28   if kids actually want to take their little meaty paws,

00:28:30   especially if they're very young,

00:28:32   and swipe through the photos, they're gonna end up

00:28:34   going back to the main screen, which they probably,

00:28:37   they'll just be like, oh well, it went back

00:28:38   to the main screen, now I'll tap on a different picture

00:28:40   and it's fine, but I think that gesture is too tight.

00:28:43   - Yeah, so the behind the scenes there is that's a standard,

00:28:47   what is it, UI page view controller?

00:28:49   Marco would know.

00:28:50   The standard left, right swipe thing.

00:28:53   And that gesture recognizer is all the out of the box stuff.

00:28:56   However, I am, to your point, John, adding a swipe down,

00:29:01   it would pan, what is it, a pan gesture recognizer,

00:29:05   that I have decided what the threshold is,

00:29:07   I don't remember off the top of my head,

00:29:08   but I have decided what the threshold is

00:29:10   between considering it not a swipe

00:29:12   and considering it a swipe, a vertical swipe that is.

00:29:14   - Why don't you do, make it a scroll view

00:29:18   with paging mode enabled.

00:29:20   - Tell me more, why do you say that?

00:29:22   - 'Cause then it'll feel like every single other thing

00:29:23   that paged on iOS.

00:29:25   Every time you've, in fact, so overcast cards

00:29:27   on the now playing screen, that's how this implemented too.

00:29:30   That's why those cards feel like any kind of

00:29:33   paged scrolling thing in iOS.

00:29:35   It's a standard behavior on UI scroll view.

00:29:37   It's called something like enable paging

00:29:39   or something like that.

00:29:40   And then, and you can do crazy things like

00:29:43   rip out gesture recognizer and do your own view or whatever.

00:29:46   You probably don't even have to do that.

00:29:47   But I would consider doing that.

00:29:49   'Cause then it'll feel exactly right if you do that.

00:29:52   - I don't think it feels too far from right the way it is.

00:29:56   But yeah, I take your point.

00:29:57   And again, this is version one,

00:29:59   and we'll see what comes of it.

00:30:01   I mean, it's funny because when I wrote this,

00:30:04   I wrote it legitimately just for Michaela.

00:30:06   And then the more I worked on it, the more I thought,

00:30:08   well, you know, maybe this could be useful

00:30:09   to other people with kids.

00:30:10   And then I was talking to somebody.

00:30:11   I don't remember if it was Steve or Mike or somebody.

00:30:14   But I was talking to somebody and I was like,

00:30:16   well, they said, what about like a client?

00:30:18   I thought, well, shoot, you're right.

00:30:19   What about a client?

00:30:20   You could very well, you know, for example,

00:30:22   let's say you're working on a design for an iOS app

00:30:25   and you wanna show a client the designs on their device.

00:30:28   Well, on your device, actually.

00:30:30   You could lock the app into just an album

00:30:33   that just has those screenshots.

00:30:35   And you can let them pan back and forth

00:30:36   till their heart's content and know that you're not gonna

00:30:38   see like you in a bathing suit at the beach

00:30:40   or something like that, you know?

00:30:42   And so, and then somebody else as well pointed out to me,

00:30:46   well, what if, you know, I'm handing my phone to Marco

00:30:49   and I do wanna show him, you know, my vacation pictures,

00:30:51   but I don't want him to see anything

00:30:52   other than my vacation pictures.

00:30:54   Not that, you know, Marco's the kind of guy

00:30:55   who would go spelunking, but you get my point.

00:30:56   And so I feel like this app, although it was clearly

00:31:01   and unequivocally and unapologetically written

00:31:03   for a two-year-old at the same time,

00:31:06   it was very early that it occurred to me

00:31:08   that this could be used for other people as well

00:31:11   and other audiences as well.

00:31:13   I should also add that with the in-app purchase,

00:31:16   if the in-app purchase works,

00:31:18   you can also change the icon.

00:31:22   And Stee came up with a series of alternative icons.

00:31:25   Unfortunately, for reasons that are not interesting,

00:31:29   I haven't yet put in there their different names

00:31:31   that Stee came up with, but they are quite funny.

00:31:34   There's a business casual icon,

00:31:36   which is the same thing basically, but with a bow tie on it.

00:31:40   There's eco-friendly,

00:31:41   which is a very, very green version of the,

00:31:43   literally the color green version of the icon.

00:31:45   There's flatten friendly, which is basically a purple

00:31:48   behind the regular high color icon.

00:31:50   There's high contrast, which is just yellow background

00:31:53   in black ink, if you will, and trendy,

00:31:56   which has like a multi-pattern gradient,

00:31:59   purpley, pinky, bluey gradient in the back,

00:32:01   and a flat white little dude in front.

00:32:04   So if you decide to throw me a few bucks,

00:32:07   then you can also get an alternative icon,

00:32:09   which is something I've never done before

00:32:10   and was kind of a total pain in the butt.

00:32:13   - You should, so right now, I'm in the test flight

00:32:15   and I haven't done the in-app purchase,

00:32:17   and so it just pops up a dialog saying,

00:32:18   "Sorry, you gotta buy it first.

00:32:20   "You should show me all the icons I can get

00:32:21   "before I buy it."

00:32:22   - Oh, that is a very good point.

00:32:24   You know, I thought I planned on doing that,

00:32:26   and I guess I never did.

00:32:27   That is a very, very, very good point.

00:32:28   Good call, Marco.

00:32:29   - It rotates, there's like an animated image.

00:32:31   It rotates through them on that screen.

00:32:33   - That's why, that's where it was.

00:32:34   That's right, it was in the main purchase screen.

00:32:36   It does show a GIF of all the different icons.

00:32:37   That's why you're exactly right.

00:32:39   - Oh, there it is. - But I should still

00:32:40   show it there.

00:32:40   No, but Marco's still right.

00:32:41   I should still show it there.

00:32:42   - I have one more thing that's not a bug,

00:32:44   but just a aesthetic thing.

00:32:47   On the onboarding screens,

00:32:49   I feel like your left and right margins are a little tight.

00:32:51   - A.S. did you want more padding on the left and the right?

00:32:53   - Yep, yep, same.

00:32:55   - Fair enough.

00:32:57   Fair enough.

00:32:57   - This is what you get for not showing it to us.

00:32:59   We're gonna use Chippa 1.0,

00:33:00   and we immediately have all the same--

00:33:02   - I'm not upset.

00:33:02   No, that's fine.

00:33:03   I'm fine with that.

00:33:04   - Did you see my picture, my screenshot of your app?

00:33:07   This is what your app looks like to me,

00:33:08   in limited mode, because it won't let me do the purchase.

00:33:10   (laughing)

00:33:12   - It's nothing but pancakes.

00:33:13   - So pancakes. - It's literally

00:33:14   nothing but pancakes.

00:33:15   Pancakes all the way down.

00:33:16   - Like that's how far, like the 20 pictures,

00:33:18   that's how far it goes.

00:33:18   - That's awesome.

00:33:19   - Oh, man, you really liked your pancakes.

00:33:21   - I have, I started using in the past month or two,

00:33:25   Paprika, you know, that recipe app?

00:33:26   - Yes, yes, yes.

00:33:27   - And we're putting all of our family recipes in it,

00:33:30   but then every recipe that's not a family recipe

00:33:32   has this nice photo in it.

00:33:33   So now all the things that we cook,

00:33:34   I have to get a good looking picture of,

00:33:37   and it can't look gross next to the fancy

00:33:40   Blue Apron pictures and all the professional

00:33:42   bon appetit glamor shots of their food.

00:33:45   It's surprisingly hard to get

00:33:47   non-gross looking photos of food.

00:33:49   That's why, A, half of the food photography you see is faked

00:33:52   because real food looks gross,

00:33:53   and B, good pictures of real food are really hard to make.

00:33:58   Neven Murgen's really good at making them.

00:33:59   A, he makes really good food,

00:34:00   but B, he has an Instagram account

00:34:01   that's just the food that he makes,

00:34:02   and he's all about like, he's got a big window

00:34:05   with a lot of sun and a good place to set up

00:34:07   and beautiful plates.

00:34:09   I should have him come and photograph my food

00:34:11   and also cook it for me.

00:34:12   Oh my goodness.

00:34:15   - This is really cool.

00:34:16   I'm really proud of you for doing all this

00:34:18   and making another app and everything.

00:34:19   It's like, look, you could have gotten stuck in the trap,

00:34:23   which is a very common, easy to fall into trap,

00:34:25   of just working on vignette forever.

00:34:27   What happens is you have probably exhausted

00:34:31   most of the market for that app that you can.

00:34:33   - I think so.

00:34:34   - And you could have just kept plowing through

00:34:37   and developing more and more edge case features

00:34:40   that take more and more effort on your part.

00:34:42   The low-hanging fruit is picked.

00:34:44   Now there's a whole bunch of medium to small-sized fruit

00:34:47   way up high in the tree,

00:34:49   and you could try to go get it

00:34:51   and waste a whole bunch of time doing that,

00:34:53   but what you're doing now,

00:34:54   which is trying new app ideas instead,

00:34:58   is a way better use of your time in all likelihood.

00:35:00   - Yeah, and I mean, I don't expect that this

00:35:02   is gonna set the world on fire

00:35:03   by any stretch of the imagination,

00:35:04   but it's something else.

00:35:06   It was an itch I wanted scratched, and you never know.

00:35:09   And the other thing is,

00:35:12   if I end up in the underscore approach where,

00:35:15   I mean, I'm underselling underscore by saying it this way,

00:35:18   but if I have a suite of apps that makes,

00:35:20   each of which makes a little bit of money,

00:35:22   if I have enough apps that make a little bit of money,

00:35:25   that's fine, I'm okay with that.

00:35:27   I don't have to take over the world.

00:35:28   I don't have to be overcast.

00:35:29   I can just have a bunch of things that trickle in,

00:35:32   and hopefully in aggregate, that's not so bad.

00:35:35   And you're right that Vignette is,

00:35:37   I think has mostly exhausted the customer base

00:35:40   that it will probably get.

00:35:41   There's a couple of things that are medium-sized fruit

00:35:43   that I'm still considering doing for Vignette,

00:35:45   but I think largely that ship has sailed,

00:35:49   and it has sailed into the sunset,

00:35:51   and I mean, not to, oh god, I'm already badgering this, but--

00:35:53   - It has sailed off the end of the Earth.

00:35:55   - Yeah, it has sailed off the end of the Earth.

00:35:56   I mean, not to say that I'm abandoning Vignette, but--

00:35:58   - No, no, no, that's not what I'm saying or what you're saying

00:36:00   and also, that's not a bad thing.

00:36:02   Every app has a certain,

00:36:04   there's a certain worthwhile limit

00:36:07   of how much time is worth spending on this app

00:36:09   as a developer.

00:36:11   Some apps justify continuous improvements.

00:36:14   I think overcast mostly does because of--

00:36:17   - Yeah, agreed.

00:36:18   - I think overcast is kind of stay cutting edge

00:36:19   with features from competitors,

00:36:20   and it's financially successful on its own,

00:36:24   so it can justify that, but that, first of all,

00:36:28   it took a long time to get that business model.

00:36:30   (laughs)

00:36:31   I went through a lot of them that weren't very sustainable,

00:36:35   but not every app does that,

00:36:38   and one way to make a living is to have a couple apps

00:36:43   or to have one app that does kind of self-sustain

00:36:46   indefinitely like that.

00:36:48   Another way to make a living that's way more likely

00:36:50   to succeed and that way more people have succeeded at

00:36:54   is to make a bunch of small apps

00:36:55   and just kind of experiment and see what sticks

00:36:58   and see what doesn't.

00:36:59   A critical part of succeeding at that is knowing

00:37:03   how much effort to put into something

00:37:05   and knowing whether to keep working on version two

00:37:08   of the thing or to kind of let that one coast for a while

00:37:11   and start working on the next thing.

00:37:13   And if you can develop that skill,

00:37:15   look, so far, I think you've made a pretty good call.

00:37:17   (laughs)

00:37:18   I think you did vignette for a while right before WBC.

00:37:22   You released it, it succeeded,

00:37:25   you did a couple of minor updates,

00:37:26   but I don't think it really needs much else.

00:37:28   I think it's pretty much done,

00:37:30   and its market is pretty much done,

00:37:31   especially with all this new iMessage contact sharing stuff

00:37:34   that actually is being deployed everywhere

00:37:35   and all of our friends now have.

00:37:36   So I think that is probably done,

00:37:41   and the other features you were gonna add to it,

00:37:43   possibly, things like LinkedIn and Facebook,

00:37:45   these are major undertakings

00:37:48   that probably wouldn't be worth it.

00:37:50   So I think you have the right idea

00:37:52   by not starting to go down a huge rabbit hole

00:37:55   with some of those bigger features.

00:37:57   There's also features that you could've taken on

00:38:00   that also would've been bad uses of your time,

00:38:02   things like a UI redesign,

00:38:04   or basically repolishing what you already have,

00:38:08   improving the feature set you already have.

00:38:10   You could do that forever, every app.

00:38:12   You can always keep improving the app.

00:38:13   You can always modernize something or clean something up

00:38:17   or refactor something or whatever.

00:38:19   There's infinite potential for time suckage

00:38:22   when it comes to making your own apps,

00:38:24   but ideally, you figure out like, okay,

00:38:27   this app is worth all the time suckage or this app isn't,

00:38:31   or none of my current apps are worth a lot of time suckage

00:38:34   the way they're performing in the market

00:38:35   or they seem pretty stable,

00:38:37   so this is the time to start something new.

00:38:39   And so if you keep doing that,

00:38:41   I think this could be a real thing.

00:38:43   - Yeah, I mean, that's the hope,

00:38:44   and I don't know if either of you guys

00:38:47   listen to Analog ever, and if you don't, that's fine,

00:38:49   but I said on Analog that, I don't know,

00:38:52   a couple months ago maybe,

00:38:53   that I had a couple of things that I was considering doing.

00:38:55   Well, guess what?

00:38:56   You'd now seen one of them,

00:38:58   and I have another one that's in the hopper

00:39:01   that I have not even filed a new project on yet,

00:39:04   but I have an idea,

00:39:06   and I don't plan on surprising the two of you with that one.

00:39:09   I feel like I'm now one and done with that,

00:39:12   but I have another idea,

00:39:14   and I think after I get whatever immediate bug fixes

00:39:16   and improvements are necessary out of toddler pics,

00:39:19   oh god, toddler pics, I'm looking at the GitHub repository,

00:39:21   and that was the initial name for it, if you will.

00:39:24   And so, yeah, my name, the vignette was Gravatar Fetcher,

00:39:27   and this was ToddlerPix.

00:39:29   My names are great.

00:39:30   But anyways, once I get through the initial stuff

00:39:35   with Peekaview, then I will move on to this next idea

00:39:39   and see what I've got there.

00:39:41   - Speaking of toddler pics,

00:39:45   spelled P-I-C-T-S, I'm sure.

00:39:47   - No, John, this is an inside joke between John and me.

00:39:50   I am constantly badgering John

00:39:52   about how he uses the 80-year-old man version of pics,

00:39:55   which is P-I-C-T-S, and I keep trying to tell him,

00:39:58   it's just P-I-C-S these days.

00:40:00   - And I keep telling him that it's not age-related.

00:40:02   Anyway, I was wondering how you dealt with that issue,

00:40:06   'cause I started on my second app

00:40:07   like a week after my first app was released,

00:40:10   but of course I didn't have a name,

00:40:12   so I made a repo and a project under my own working title

00:40:17   or whatever, and then at a certain point,

00:40:19   I came up with a name, and then me being me,

00:40:23   I'm like, I've gotta rename this repo.

00:40:25   - Oh, yeah, I have a bother. - I've gotta rename

00:40:26   this Xcode project.

00:40:27   I've gotta rename every class and everything,

00:40:30   the purpose of the thing.

00:40:32   Did you do that, or did you do the other thing,

00:40:34   which apparently is common, which is,

00:40:35   yeah, you rename your executable target in Xcode,

00:40:38   but you just leave everything else with the working title?

00:40:41   - For Vignette, I mostly did the last thing you said,

00:40:45   which is almost nothing says vignette within vignette,

00:40:48   and almost everything says GravatarFetcher.

00:40:50   With Peekaview, the project is called Peekaview,

00:40:54   the repo is still called toddlerpix.

00:40:56   All of the code is within the toddlerpix folder

00:41:00   in GitHub and in Xcode,

00:41:03   but I did more to try to get it to read Peekaview

00:41:08   in more places than I did with Vignette.

00:41:10   - Did you rename the Xcode project?

00:41:12   Or was it always called that?

00:41:13   So how did you rename it?

00:41:14   That's my question.

00:41:15   - I think I just renamed it on the file system, I thought.

00:41:17   It was a while ago now.

00:41:18   - Like, you just, in the finder,

00:41:20   just the top-level project folder?

00:41:21   - I think so.

00:41:22   I am not confident that's correct,

00:41:23   so definitely do that with source control nearby.

00:41:28   I thought that's what I did, but again,

00:41:30   I cannot stress enough, I am not confident

00:41:31   that I'm right about that.

00:41:32   - I did the scorched earth thing where I renamed everything.

00:41:35   Xcode has a way inside Xcode,

00:41:38   like not from the finder or anything,

00:41:39   but you're in your project, you can do a rename,

00:41:42   I've already forgotten 'cause I only did it once,

00:41:43   but you can do a rename, I think it's like the top item

00:41:45   in the sidebar or something,

00:41:48   and it will show you what it's gonna rename in your project,

00:41:51   and it renames a lot of stuff.

00:41:52   - No, I think you're right.

00:41:53   That is what I did.

00:41:53   So I just did it again,

00:41:54   because I have source control nearby,

00:41:56   and put it back to toddlerpix and saying,

00:41:57   okay, do you wanna rename the target?

00:42:00   Do you wanna rename what it is in info.plist?

00:42:02   But that was basically it.

00:42:04   It didn't actually ask for much else.

00:42:05   - But that's not all of it, obviously.

00:42:07   You do that, and then I went through

00:42:09   and found all the places where the working title

00:42:11   still existed and manually fixed all of them,

00:42:13   mostly using bbedit, and then I renamed the repo,

00:42:16   and then I made sure everything was connected,

00:42:17   and then I deleted my, well, what is it,

00:42:19   XC project or whatever file,

00:42:21   'cause it was corrupted or something,

00:42:22   and then, again, source control is your friend.

00:42:25   Right, so do this after you show you have a clean checkpoint,

00:42:28   and I even zipped up, compressed a copy of the project,

00:42:31   so if I totally hosed it, I could just unzip it.

00:42:34   But I did want people to know that

00:42:36   if you start an Xcode project under a working title,

00:42:39   and you, like me, can't live with that

00:42:41   once you come up with a name,

00:42:42   it absolutely is possible to rename every single thing

00:42:44   in your entire project eventually, and it will work again.

00:42:47   - Good to know.

00:42:50   Yeah, I haven't really bothered, but that's all right.

00:42:53   So anyways, we don't need to belabor this anymore.

00:42:54   I appreciate you guys indulging me

00:42:56   and going on this little journey with me.

00:42:57   I have been unreasonably excited

00:43:00   about springing this on the two of you,

00:43:01   and I can't stress enough, listeners,

00:43:03   obviously, if you were paying close enough attention,

00:43:05   you probably could have put this together,

00:43:07   but I did not explicitly say anything to John nor Marco

00:43:12   about what was going to happen today,

00:43:14   about the fact that I was even working on something new,

00:43:17   so this was a surprise for them,

00:43:18   and I appreciate everyone going along for the ride.

00:43:22   - Yeah, this is awesome.

00:43:23   Congratulations. - Oh, thank you.

00:43:24   And this requires I was 13 too, because I don't care,

00:43:27   so sorry if you're on an older version.

00:43:30   And actually, I should also mention, come to think of it,

00:43:33   SwiftUI, like we talked about,

00:43:34   and maybe we can talk more in a moment,

00:43:36   it's got problems, but it ain't bad,

00:43:39   and more importantly, I am really digging

00:43:43   the new UI collection view stuff that came out in 13.

00:43:46   So this is DiffableDataSources and CompositionalLayout.

00:43:50   The main grid view, the main view of the app,

00:43:53   is all CompositionalLayout, and that code is so nice.

00:43:58   It is not that much.

00:43:59   It is so little code compared to the nightmare

00:44:02   it would have been prior to iOS 13.

00:44:04   I really, really love that new stuff.

00:44:07   And hopefully, final note,

00:44:10   if you've never used Guided Access,

00:44:12   this app is expressly designed to work with Guided Access,

00:44:16   and so the idea being that when you turn on Guided Access

00:44:20   by triple-clicking the side button,

00:44:22   if you have a Face ID phone,

00:44:24   or I believe it's still triple-clicking the home button

00:44:26   on home button phones, among other things,

00:44:29   Peek-a-View will automatically make that top toolbar go away,

00:44:32   which means you literally,

00:44:33   there's no settings button to press.

00:44:35   The only thing you can press is on a photo.

00:44:38   And so if you're looking at this and thinking,

00:44:40   well, this is all well and good,

00:44:41   but then people can go into settings and do stuff

00:44:44   and make bad things happen, the whole purpose behind it

00:44:47   is that it is assumed that you are willing

00:44:49   to use Guided Access in order to limit that.

00:44:52   And originally, I didn't even realize that I could tell

00:44:55   when Guided Access was on or off,

00:44:56   and so I had this god-awful triple-triple-tap gesture

00:45:01   in order to get to settings,

00:45:02   the idea being that a toddler

00:45:03   wouldn't be able to figure that out,

00:45:04   and even an adult probably wouldn't be able

00:45:06   to figure that out, and I hated it from day one.

00:45:08   And then somebody, maybe it was either Jelly or Underscore,

00:45:12   I think, I forget who it was, but somebody pointed out to me,

00:45:15   no, no, no, you can figure out

00:45:16   when Guided Access is on or off.

00:45:18   And so once I did that, sunshine came down from the clouds

00:45:22   and shone directly on top of me,

00:45:25   and everything was good and right in the world.

00:45:26   So check out Guided Access if you've not done that yet.

00:45:29   - We are sponsored this week by Collide,

00:45:33   user-focused security.

00:45:35   Many of today's fastest-growing companies

00:45:37   owe their success in part to a culture

00:45:39   that centers around transparency, personal responsibility,

00:45:42   and most importantly, employee happiness.

00:45:45   But companies also need to secure their endpoints,

00:45:47   and so they often do so at the expense of those values.

00:45:50   Too often, we've seen teams install intrusive management

00:45:53   and security products on their employees' devices,

00:45:55   and that makes everybody miserable.

00:45:57   At Collide, they believe you don't need to spy on your users

00:46:01   or cripple their devices to meet your compliance

00:46:03   and security goals, so they launched a product

00:46:06   that integrates with your Slack team

00:46:08   and messes your users directly when their Mac, Windows,

00:46:11   or Linux devices are not up to spec.

00:46:13   Your users will receive clear instructions

00:46:15   about what is wrong and step-by-step instructions

00:46:18   that will fix it.

00:46:19   They can even confirm in real time

00:46:21   that they've resolved the problem right where they are in Slack.

00:46:24   So try Collide's new product for free for 30 days

00:46:27   for your entire fleet by visiting collide.com.

00:46:30   That's K-O-L-I-D-E dot com, collide.com.

00:46:34   Thank you so much to Collide for sponsoring our show.

00:46:37   - Do we wanna talk about SwiftUI?

00:46:42   Do we wanna talk about Google's video sharing bug?

00:46:44   - SwiftUI, we're near that topic now.

00:46:47   - Fair enough.

00:46:48   So like I said earlier, the onboarding on this app

00:46:53   and the pre-purchase page, if you will, or screen,

00:46:58   are both SwiftUI, or there's two pages of onboarding

00:47:00   and the pre-purchase screen is all SwiftUI.

00:47:05   And the reason I did that is because

00:47:07   I will be the first to tell you I am really bad at UI kit.

00:47:10   Like I can make things work,

00:47:12   but it does not come naturally to me.

00:47:15   I do like storyboards, I'm a weirdo.

00:47:17   I do use storyboards.

00:47:18   I have reached an understanding with auto layout.

00:47:22   It's not really my favorite thing in the world,

00:47:24   but mostly I can make it do what I want.

00:47:28   But my friend Stee had sent these mock-ups

00:47:30   for the onboarding screens,

00:47:32   completely of his own volition.

00:47:33   Like I never had asked him to do it.

00:47:34   And they, to me anyway, compared to what I had had,

00:47:37   they looked incredible.

00:47:38   And so I was looking at this thinking,

00:47:40   oh, oh, oh, oh no,

00:47:44   this is gonna be stack views all the way down

00:47:46   and that does not seem good.

00:47:47   And so I thought, well, the onboarding screens

00:47:52   and the pre-purchase screen are mostly static.

00:47:57   So maybe SwiftUI will work.

00:48:00   And actually I'm pretty happy with it.

00:48:02   And for this sort of thing, it's been mostly good.

00:48:07   There've definitely been some warts.

00:48:10   It's also been making me wanna upgrade to Catalina

00:48:12   on my iMac Pro so I can get that sweet, sweet live preview.

00:48:17   But all in all, it hasn't been too bad.

00:48:20   The problem, well, I have many problems with SwiftUI,

00:48:22   but the biggest problem I have with SwiftUI

00:48:24   is that when something goes wrong,

00:48:26   and we've talked about this on and off a lot in the past,

00:48:29   when something goes wrong,

00:48:30   it often goes wrong in very far away places

00:48:33   from where the problem actually is.

00:48:35   So let's say I have a hundred line view.

00:48:38   Maybe the error will be reported on line 20,

00:48:42   but the actual error is on line 88.

00:48:45   And that is extremely frustrating.

00:48:47   Additionally, the errors are often completely not actionable

00:48:50   in any way, shape or form.

00:48:52   And that is extremely annoying.

00:48:54   But all told, I was able to go from a blank page

00:48:59   to probably 80% of the way to what Stee had sent me

00:49:04   as a mock-up in like an hour.

00:49:07   And if I, me, Casey, I'm not saying other people,

00:49:10   but if Casey had done that

00:49:11   using just straight up Vanilla UI kit,

00:49:13   I would still be working on it to this day,

00:49:15   like two weeks later.

00:49:16   'Cause I'm just really not good at that sort of thing.

00:49:18   So I do, with many asterisks and daggers and double daggers,

00:49:23   I do like and recommend SwiftUI for this sort of thing,

00:49:28   where it's a fairly static screen

00:49:30   that not that much is happening.

00:49:32   I don't know if I could really in good conscience

00:49:35   recommend it for stuff where there's a lot of moving parts

00:49:38   and a lot of different things

00:49:40   and user interactions happening.

00:49:42   John, though, you probably have done even more SwiftUI

00:49:45   than me at this point.

00:49:46   So any thoughts you would like to add

00:49:48   or corrections you would like to make?

00:49:50   - I can't believe you were doing it

00:49:51   without the live previews.

00:49:52   It seems like it would have gone a lot faster for you.

00:49:54   - Well, here's the thing.

00:49:55   Here's the thing.

00:49:56   I was doing it in part with the live previews,

00:49:59   but I was doing it on the adorable, which is on Catalina.

00:50:01   And the adorable, oh, it's so adorable,

00:50:03   bless its little heart,

00:50:04   but it was choking on trying to do this.

00:50:07   Like it was just unbearably slow,

00:50:09   to the point that doing the build, run, try, stop,

00:50:14   build, run, try, stop, dance on the iMac Pro

00:50:16   was actually more fun, well, not fun,

00:50:20   but less infuriating than just waiting

00:50:23   for the poor adorable to melt itself

00:50:25   as it was trying to figure all this out.

00:50:27   - No, I didn't realize how computationally expensive

00:50:30   the preview is, 'cause--

00:50:31   - Oh, yeah. - I mean, either.

00:50:33   It doesn't seem like it should be that bad,

00:50:34   but oh, it was, on the adorable, it was bad.

00:50:38   - One of the things that annoy you about SwiftUI

00:50:40   is that it's so timid, maybe from the earlier versions of it

00:50:44   like in terms of the live preview.

00:50:45   If anything changes, it's like,

00:50:47   oh, I better stop, pause this live preview,

00:50:49   'cause it seems like you're changing a lot of code.

00:50:50   It's like, just keep trying.

00:50:53   Like I got a lot of cores, just, you know, whatever.

00:50:55   Like on this particular machine,

00:50:57   I don't wanna have to keep hitting,

00:50:58   no, no, resume the preview.

00:50:59   Yeah, no, I know I broke it,

00:51:00   but I'll fix it in like 20 characters.

00:51:02   Like just keep trying.

00:51:03   Just constantly try to get the preview working,

00:51:06   'cause I hate having to go,

00:51:08   the worst thing is I hate looking at it,

00:51:09   and like I just changed that.

00:51:10   Why didn't, oh, it paused again.

00:51:12   You're wondering what I'm talking about.

00:51:14   There's a live preview where you write,

00:51:16   so you've seen this in WJC videos,

00:51:17   but there's a live preview where you're writing the code,

00:51:19   and you get to see what your view is gonna look like

00:51:22   in another little section of the window

00:51:24   in real time as you change things.

00:51:25   So that's the promise, that hey,

00:51:27   you don't have to keep like, write a bunch of code,

00:51:29   build and run your app, go to the screen,

00:51:31   look at the thing, and then repeat.

00:51:33   Like, you know, you could do it as you're typing.

00:51:34   But of course, as you're typing, you're, you know,

00:51:36   you're making your file syntactically invalid

00:51:38   as you're in the middle of typing stuff.

00:51:40   And when that happens, there's some sort of threshold

00:51:42   where it decides that you've changed a lot,

00:51:44   and your code is now invalid,

00:51:46   and I can't update this preview with your now invalid code,

00:51:49   so I'm just gonna pause it.

00:51:50   And it never, as far as I'm aware, unpauses itself.

00:51:52   It just says, when you're ready,

00:51:54   when you think you've gotten to a point

00:51:55   where your code works again,

00:51:56   hit the resume button, and it'll show it.

00:51:59   So that's, that's annoying me a little bit,

00:52:01   but you know, the tools are young,

00:52:02   and for the most part, it hasn't crashed on me.

00:52:05   - And I should add, and interrupt, I apologize.

00:52:07   When that does work, I mean, even,

00:52:09   there were occasions where the adorable

00:52:10   would stop being an idiot,

00:52:12   and would actually work pretty well.

00:52:13   When that does work, I cannot stress enough

00:52:16   how fast it makes developing a view in SwiftUI.

00:52:19   And if you're not a developer,

00:52:21   you have to understand, like,

00:52:22   the normal way of doing things is,

00:52:24   at best, you're looking at a wireframe,

00:52:27   or like, wireframe doesn't mean anything to a regular human.

00:52:30   You're looking at like a fake version of your screen,

00:52:33   and you're dragging things around and thinking,

00:52:35   "Okay, this is probably right."

00:52:38   And then you go to run it, and you're either,

00:52:40   then you have to build your entire app,

00:52:42   and you need to install it either on the simulator

00:52:44   running on the computer, which is pretty fast,

00:52:46   or install it on your phone, which is kinda fast.

00:52:49   And then you need to navigate to that screen,

00:52:51   unless you have some sort of shortcut

00:52:52   you've built for yourself to get there.

00:52:54   And then you need to try the thing you were just trying,

00:52:56   and you're like, "Oh, crap, I need it

00:52:57   like four pixels the other way."

00:52:59   Okay, stop the simulator, go back to where you were,

00:53:02   try to fiddle with things in the storyboard,

00:53:04   you know, in the visual view, or perhaps do it in code

00:53:06   if you're more like Marco.

00:53:08   In one way or another, make your change,

00:53:11   okay, build it, wait a few seconds,

00:53:12   or for Marco, it's probably more

00:53:13   than just a couple of seconds,

00:53:15   because your app is so big, that's not a slight at all.

00:53:17   (laughing)

00:53:18   You know, you take the time to build the app,

00:53:20   you install it again, you go, "Oh, crap, it wasn't four,

00:53:23   it was three pixels, I needed three pixels."

00:53:25   And then you do this whole dance again,

00:53:26   whereas with SwiftUI, not only can you do this live

00:53:30   as you're coding it, because it has like a fake simulator

00:53:33   within the Xcode window, which is what John

00:53:35   was describing moments ago, but it's doing it as you type,

00:53:38   you know, it's amazing when it works,

00:53:40   and it can make things so fast.

00:53:41   And what's really clever is that you can make multiple,

00:53:46   like, previews, so you can have a preview always displayed

00:53:50   that's in dark mode, as well as light mode.

00:53:53   And so you can see the two of them side by side,

00:53:54   and see exactly how the changes you're making

00:53:56   affects both versions of the app.

00:53:59   When it works, it is, and this is actually true

00:54:02   of pretty much all of SwiftUI, when any of SwiftUI

00:54:04   and all of SwiftUI is working, when it's firing

00:54:06   on all cylinders, it is amazing.

00:54:10   In so many ways, actually, it just occurred to me,

00:54:11   in so many ways, I feel like SwiftUI is my old BMW,

00:54:14   in that when it works, holy crap, it was great.

00:54:18   It doesn't work that great a lot of the time, though,

00:54:20   and that's the problem.

00:54:21   So I apologize, John, for interrupting, please continue.

00:54:23   - I think an even better analogy,

00:54:24   and what I was thinking when I was doing it, of course,

00:54:26   is based on my background, is it's like web dev.

00:54:28   - Yeah, yeah.

00:54:29   - People are used to the idea that you can be writing

00:54:32   in one window and see the updates in the other,

00:54:34   and you can, you know, I use BB Edit for a lot of my web dev,

00:54:38   and BB Edit has a live HTML preview,

00:54:40   and so as you're editing the HTML in your BB Edit window,

00:54:44   the window right next to it, it updates in real time,

00:54:47   and it never pauses, 'cause HTML is very forgiving,

00:54:49   and it's not compiled like a language or whatever,

00:54:52   and it's just so nice.

00:54:53   And then the other, you know, the non-live version

00:54:56   of web dev is still write a bunch of stuff, save,

00:54:59   command tab, command R to reload, you know,

00:55:01   like the worst case, it's still 100 times faster

00:55:04   than building your app and shipping it to the simulator

00:55:06   or a phone or whatever, and then navigating to a screen,

00:55:08   and all that other stuff.

00:55:09   So SwiftUI has always felt like web dev,

00:55:12   right down to, you know, it's like you're writing CSS for it

00:55:16   as a bunch of blocks, there are, you know,

00:55:18   the H stacks and V stacks are a little bit different

00:55:20   primitives than you have block level elements and CSS,

00:55:23   but it's similar where you have padding and frame sizes

00:55:26   and alignments, and it's very web dev-y, you know,

00:55:29   right down to the tools.

00:55:30   So that, obviously, when I saw SwiftUI,

00:55:32   there you see I was very attracted to it,

00:55:34   'cause I'm like, this, you know, at that point,

00:55:36   I had never done any of the, you know,

00:55:38   quote unquote traditional, you know,

00:55:39   AppKit or UIKit stuff or whatever.

00:55:41   I'm like, this looks like web dev.

00:55:42   This is something that I'm already familiar with

00:55:44   and comfortable working in.

00:55:46   This balance of like, well, is it a GUI builder,

00:55:48   like interface builder?

00:55:49   Not really, but I've been building quote unquote GUIs

00:55:53   for, you know, my whole career by typing text,

00:55:55   but I'm also used to not just like,

00:55:58   we talked about, you know, my frustrations with auto layout.

00:55:59   It's like, well, you can just do it all in code,

00:56:01   but that's so distant.

00:56:02   That's like, you write a bunch of code

00:56:04   and try to visualize in your head what it's gonna do,

00:56:05   and then you have the whole build and run and install cycle

00:56:08   or whatever to get to the point where you see it,

00:56:10   and then you cycle back, and that's a longer cycle

00:56:13   than sort of a live preview or a very fast preview.

00:56:16   And like Casey said, it's totally true with like,

00:56:17   you know, dark mode and different data.

00:56:20   Like you essentially provide it with like a,

00:56:22   in web dev terms, fixture data or whatever,

00:56:25   like you can have a fixed set of data

00:56:27   or a simulated set of data or real data.

00:56:29   You can pull it from the preview things,

00:56:30   which is also possible sometimes, by the way.

00:56:32   So you can see what it looks like with different content,

00:56:35   depending on your app, this has different amounts

00:56:37   of usefulness and how far you wanna go.

00:56:39   And you can do that on a per, you know,

00:56:41   sort of sub view basis.

00:56:43   So, you know, Apple recommends building SwiftUI

00:56:47   from your like most primitive view upwards.

00:56:49   So like if you have a page with a bunch of, you know,

00:56:52   table view cells in it, and each one of those cells

00:56:54   has an image and it has a picture and it has a bunch

00:56:56   of badges or whatever, you can build that up

00:56:58   from its smallest unit.

00:56:59   And each one of those little miniature views can itself,

00:57:02   you can just work on it in isolation and get that working

00:57:04   in its own little preview.

00:57:05   And then the next step up is you embed that

00:57:07   in a bunch of other things and that has a preview.

00:57:09   And you work your way up to the big screen that has,

00:57:11   you know, everything in a preview.

00:57:12   And again, kind of like HTML, kind of like CSS,

00:57:14   you can break it up into pieces and break your problem down

00:57:18   into composable pieces and then put them together.

00:57:21   And yeah, it's a very compelling experience.

00:57:24   My experience setting aside the tool foibles,

00:57:27   using it for my app, which I'll,

00:57:29   my app is getting close to being done.

00:57:31   I'll probably in the next, probably sometime this month,

00:57:33   we'll talk about it and I'll ship it.

00:57:35   But not to give too much away about the app,

00:57:38   but I'm using it, I'm not using it everywhere.

00:57:42   I'm, you know, like a couple of my windows, well,

00:57:45   are just, you know, plain old app kit,

00:57:47   which I'm now familiar with and became very comfortable with.

00:57:50   And it's so clear that app kit has like a,

00:57:52   so many more features than Swift UI,

00:57:54   which makes sense 'cause app kit is, you know,

00:57:55   30 years old, whatever the heck it is,

00:57:57   like from the next days.

00:57:59   And Swift UI is like, you know,

00:58:00   been out for less than a year or whatever.

00:58:02   But like the, when using Swift UI,

00:58:07   the main difference I found is,

00:58:09   I'll often want to do something and you know,

00:58:12   and I'm using Swift UI in a slightly non-traditional way,

00:58:14   which will become clear when I'm actually

00:58:16   wanting to talk about app.

00:58:18   And I'm like, how do you do that in Swift UI?

00:58:20   And in almost every case,

00:58:23   it was pretty easy to figure out how to do it in app kit

00:58:26   because app kit has like a delicate method for everything,

00:58:29   everything you can possibly imagine.

00:58:31   And Swift UI really has sort of a straight and narrow.

00:58:35   It's like, you're gonna have buttons and controls

00:58:39   and views and stacks and padding and scrolls.

00:58:42   And like, all those things are fine.

00:58:44   I was like, but what if I wanted to do something

00:58:45   a little bit different?

00:58:46   What if I want to be able to do a modifier click

00:58:49   on a button?

00:58:50   What about drag and drop?

00:58:52   What about context menus?

00:58:55   What if I want to do multiple of those things

00:58:57   in a single area?

00:58:58   And so if you guys like, whoa, whoa, whoa, hold on.

00:59:00   A button is a thing that you click and does a thing.

00:59:03   You don't want to get any fancier than that, do you?

00:59:05   And it's like, heck no, I do.

00:59:07   And app kit's like, sure, fine, whatever.

00:59:09   Subclass it, override, you know, set up a delegate.

00:59:12   Use a million different things,

00:59:13   there are different ways.

00:59:14   Like you have control over everything

00:59:16   in Swift UI, like that's the one thing I want to see

00:59:18   from Swift UI and the next WWDC is way more like hooks

00:59:23   into the system.

00:59:24   'Cause you know these abilities are there.

00:59:27   You know, if you're doing something normal

00:59:29   where you just have like normal controls,

00:59:30   normal windows, normal views that you click around in,

00:59:33   it's pretty straightforward plus or minus the bugs,

00:59:35   which you know, of which there are plenty, right?

00:59:37   But if you want to do weird stuff, it really fights you.

00:59:40   And there are ways to say, okay, I give up,

00:59:43   just embed an NSView right here.

00:59:45   Like, you know, nevermind, nevermind Swift UI.

00:59:48   But once you start doing that, you're like,

00:59:49   well, why am I using Swift UI again?

00:59:51   Like why am I, I'm trying to make like a skeleton

00:59:53   and then every single actual view is an NSView

00:59:56   that I control the traditional way.

00:59:58   It's not ideal, right?

01:00:00   So in the end, I was mostly able to beat it into submission

01:00:05   and get it to do what I want,

01:00:08   but boy, it was not straightforward.

01:00:09   Like I had many points, I thought to myself,

01:00:13   if I had not used Swift UI for this project

01:00:15   and instead had done, you know,

01:00:17   this exact task in AppKit, I would be done by now.

01:00:21   I thought that many, many times,

01:00:22   which may not actually be true because I'm not, you know,

01:00:25   I'm not very good at AppKit either.

01:00:26   I've like done one dinky little app, right?

01:00:28   But in the course of trying to figure out

01:00:31   how to do all these different things in Swift UI,

01:00:33   I very quickly found out the AppKit way to do them.

01:00:35   And I'm like, well, I found the AppKit way

01:00:38   'cause you know, there's many more answers

01:00:39   in Stack Overflow and it's longer, it's been around longer.

01:00:41   You know, like there's less, you know,

01:00:43   misleading or false data 'cause Swift UI has changed a lot,

01:00:45   even in the short time since it's been announced.

01:00:47   I'm like, but that doesn't help me.

01:00:48   I need to find the Swift UI way to do it.

01:00:50   Is there a Swift UI way to do it?

01:00:52   Is this even possible?

01:00:53   How do I arrange things?

01:00:54   There was one or two things that I couldn't do

01:00:59   without bugs in Swift UI.

01:01:01   Like a lot of them are cosmetic bugs

01:01:02   where like some visual state will get messed up

01:01:04   and it's like, well, that's, I'm doing it right,

01:01:07   but every once in a while it gets confused

01:01:09   and it would like eventually reset itself

01:01:11   if you did some action and it would be like,

01:01:12   oh, I forgot, yeah, then that thing

01:01:14   shouldn't be visually there and it would get rid of it.

01:01:15   I'm like, I can't use that feature in Swift UI

01:01:18   because that bug is gonna look like my bug,

01:01:21   even if it's not my bug, it's just, you know,

01:01:23   Swift UI being weird, right?

01:01:25   So setting that aside, I did eventually find a way

01:01:28   to do everything I wanted in Swift UI,

01:01:30   but I leaned heavily on AppKit because Swift UI,

01:01:33   on the Mac anyway, it's just a view.

01:01:36   You do have to put it somewhere.

01:01:38   So it's in a window and the window is an AppKit window

01:01:42   and so I get to use all of the AppKit functionality

01:01:44   for the window, it's just that that window has a view in it

01:01:48   that is a Swift UI view, which may or may not have

01:01:51   one or more NS views shoved in it and, you know,

01:01:54   so it's a little bit of a weird hybrid mongrel,

01:01:56   but overall I think it was a,

01:01:59   I had a similar experience to Casey where it's like,

01:02:02   I think I had, I got the notion to do this app one day

01:02:05   and I fired it up and it took me like maybe,

01:02:10   it made a new project, it took me like 15 minutes

01:02:12   to figure out like enough of the core functionality

01:02:16   to get like the data I needed.

01:02:18   I still had nothing on the screen, but I'm like,

01:02:19   all right, well, now I just need to display

01:02:23   this data somewhere, so let me do Swift UI.

01:02:27   It was so fast to get that data into a Swift UI view

01:02:30   and just like, like if you'd seen me do it,

01:02:32   you'd be like, you're gonna be done with this app

01:02:33   in three days and like Casey, you found out,

01:02:35   well, you know, there's a million edge cases

01:02:37   and you're gonna be fighting with a lot of things

01:02:39   and when you wanna do that easy thing,

01:02:41   I'm just gonna add this minor feature

01:02:42   and you realize, oh, how do I even do that in Swift UI?

01:02:46   There is, how do I do that at all?

01:02:48   And then you start Googling or whatever.

01:02:50   So, but I got up and running in the preview

01:02:53   and then up and running for real in the app so fast,

01:02:55   I was like this, I couldn't believe it.

01:02:58   You know, it seemed like I was gonna be done

01:03:00   in a matter of a week.

01:03:02   So, you know, again, like web dev,

01:03:04   Swift UI has that, the advertised experience

01:03:07   of that you can get something on the screen

01:03:09   that looks vaguely like the app that you want it to be

01:03:11   very quickly is true and the thing,

01:03:13   the one sort of, not weakness, but like a characteristic

01:03:18   of a lot of the Swift UI tutorials, you know,

01:03:20   I've seen many of them on the web and on many travels

01:03:22   trying to find how to do these weird esoteric things

01:03:24   is most of them focus heavily on getting things

01:03:29   up on the screen and real apps, that's part of it,

01:03:33   but real apps also say, yeah,

01:03:35   but how does that stuff all connect together?

01:03:37   How do, you know, how do you,

01:03:39   when you perform an action here,

01:03:41   how does it cause a thing over there?

01:03:42   How does the data thread through?

01:03:43   How, you know, like, can I click this?

01:03:46   Can I right click, especially on the Mac?

01:03:47   Can I, you know, command click it?

01:03:48   Is there a context menu?

01:03:49   How does it interact with the other things?

01:03:51   Can I select it and do something with selection?

01:03:52   Is there a toolbar?

01:03:53   Is there like, all of those things,

01:03:56   it's so different than, hey, you know, like a W2C demo,

01:03:59   I have this blob of data that's like just a JSON,

01:04:02   fixed JSON blob for the purposes of a W2C demo

01:04:04   and I just want to display it in a beautiful thing.

01:04:07   That's so easy to do,

01:04:07   but that's a unidirectional dump data

01:04:09   down the top of a giant funnel

01:04:10   and have it display into a thing.

01:04:12   If that data has to be live

01:04:13   and the app has to be interactive, it gets much harder.

01:04:16   So there is a second level of switch tutorial

01:04:18   that talks about data threading,

01:04:19   but I feel like the final level is like action threading,

01:04:22   like the whole, you know,

01:04:23   the equivalent of like the responder chain and focus

01:04:27   and all the things that Mac apps deal with

01:04:29   that are integral to AppKit.

01:04:31   Most of the Swift UI stuff glosses over,

01:04:35   like 'cause they kind of like,

01:04:37   kind of like this came up when we were talking about earlier,

01:04:39   kind of like React in the web thing,

01:04:40   one of React's heretical things

01:04:43   is that it mixes together JavaScript and HTML

01:04:45   because it wants them to be close together.

01:04:47   So it's like, oh, when someone clicks a button,

01:04:49   here's the action for that button,

01:04:50   right here with the button.

01:04:52   Swift UI is like that.

01:04:53   If you make a button,

01:04:54   you put the action right there with the button.

01:04:56   The question is, what do you put in that action?

01:04:58   Does that action just call a method on some data

01:05:00   that was passed down and or observed or in the environment?

01:05:03   Do you implement the action right in there with the button?

01:05:06   How do you build a scalable, well factored app

01:05:10   that actually does things by threading your logic

01:05:14   and actions and controls and state

01:05:16   all through these different views?

01:05:18   And that, like React, is actually surprisingly hard to do

01:05:21   because you have to decide who owns what state,

01:05:23   where is it kept, how much data is brought down,

01:05:25   what's in the environment, what's not.

01:05:27   Those decisions and these trivial apps,

01:05:29   like you're not getting any help from these,

01:05:31   you know, demos, even the one that Apple just put up,

01:05:33   which is a fairly sophisticated demo,

01:05:35   it's like, yeah, but in the end,

01:05:37   this is a very simple application.

01:05:38   Like I can't imagine making like a real Mac app,

01:05:41   like, you know, Acorn or something,

01:05:43   like an actual complicated app with features and palettes

01:05:46   and menus and a big canvas and all that stuff

01:05:49   with Swift UI without coming up with a fairly solid plan

01:05:54   about how to distribute your state and business logic

01:05:59   and thread everything through and keep all the action sane

01:06:02   or whatever, so.

01:06:03   Anyway, I think I see a lot of promise in it.

01:06:06   I enjoyed the experience, but I was also super frustrated

01:06:09   by the limitations.

01:06:10   I'll go into much more detail eventually

01:06:11   when I talk about my app.

01:06:13   - One thing I would like to jump on

01:06:15   is what you were saying about not really having access

01:06:17   to like AppKit or the system in general,

01:06:19   and that is so unbelievably true and frustrating.

01:06:21   So a really great example of this is

01:06:23   when I use the Swift UI view for purchase,

01:06:27   and if the purchase fails,

01:06:28   which apparently it's done at least once for John

01:06:30   and maybe for everyone, who knows?

01:06:31   Hey, when there's an issue, I wanted to put up an alert

01:06:35   saying, hey, there was an issue

01:06:36   and just a standard UI alert controller,

01:06:37   the same dialogue box that you would get in any app.

01:06:41   And to do that in Swift UI,

01:06:43   maybe I just have been reading the wrong advice,

01:06:46   but apparently the like blessed way to do this

01:06:50   is to do, what is it, like an on appears

01:06:54   or something like that,

01:06:56   which is at the end of your view,

01:06:58   so basically it's kind of like view did load,

01:07:01   or view will appear, I guess I should say.

01:07:03   And upon that, it will check a state flag

01:07:08   that is part of your model that it will then,

01:07:15   if that state flag is true,

01:07:17   then it will go ahead and show the alert,

01:07:18   which just feels friggin' gross, like oh, God.

01:07:23   I did something very similar for drag and drop support,

01:07:26   but it's like, really?

01:07:27   'Cause when you're laying out your view,

01:07:29   you feel like I'm describing what the view is.

01:07:31   Here's the alignment, here's the padding,

01:07:32   here's what's in it, here's how they're necessary each other.

01:07:34   But you're also describing show this thing,

01:07:37   show this thing, show this thing,

01:07:38   conditional on these five state variables,

01:07:40   it feels weird, doesn't it?

01:07:41   Like it doesn't feel like logic,

01:07:43   it feels like you're describing,

01:07:44   like what you're describing is the superset of all things

01:07:47   that could ever appear on the screen,

01:07:48   and then a bunch of them are gated by state variables,

01:07:50   and then you just twiddle the state variables

01:07:53   somewhere very distant, and then the thing appears,

01:07:55   and then the state variable goes off and it disappears,

01:07:57   or whatever, and it's a very strange way to work.

01:07:59   - Yeah, like I think I can get through that in general.

01:08:02   So like let's say you were showing like an empty view

01:08:05   versus a populated view,

01:08:06   and having like a state variable be the switch for that.

01:08:09   Like I think I'm okay with that,

01:08:10   but you know, there was,

01:08:14   both with the case of showing an alert,

01:08:16   like there's just no real easy or clean way to do that.

01:08:19   And additionally, like I wanted to have the purchase screen

01:08:24   dismiss itself if it worked,

01:08:26   which maybe nobody will ever see,

01:08:27   but I wanted it to dismiss itself,

01:08:30   and that is also in onAppear as a flag,

01:08:33   and then it's going to like dig into its presentation mode,

01:08:37   which you need to bind as an environment variable,

01:08:39   like it's just, some of the stuff that feels

01:08:42   like it should be easy is really, really hard,

01:08:44   and that's the way it is with everything, right?

01:08:46   Like with SwiftUI, the hard stuff is easy, sort of,

01:08:49   but the easy stuff seems to be really hard,

01:08:52   whereas it's the exact reverse with UIKit or perhaps AppKit.

01:08:55   - I feel like it's just the paradigm.

01:08:57   What I just described is a fairly reasonable description

01:09:02   of the difference between declarative and imperative.

01:09:05   Like we're all in an imperative mindset where we're like,

01:09:08   I want to call an API that makes an alert appear,

01:09:10   'cause that's imperative programming,

01:09:11   and that's what UIKit and AppKit is,

01:09:13   but declarative is like, no,

01:09:14   you don't call an API that makes an alert appear,

01:09:17   you just describe this scene as a state machine

01:09:21   and say if this state is true, then there's an alert,

01:09:24   and if the state is not true, there's not.

01:09:25   Now, SwiftUI isn't strictly declarative,

01:09:28   because for example, in the action of a button,

01:09:30   you can start imperative programming,

01:09:31   and you just, in fact, that's what you're going to do.

01:09:33   You're going to call a bunch of methods on your app

01:09:35   or whatever, like you're going to do a thing.

01:09:37   The button performs an action on your model,

01:09:39   on your, you know, something's happening, right?

01:09:41   You can do that right there,

01:09:42   and now you're in imperative mode again,

01:09:44   but for elements that appear on the screen,

01:09:47   a lot of the stuff is, you know, declarative,

01:09:50   like they say it's going to be,

01:09:51   and it's a different way of thinking.

01:09:52   Again, same thing with React, like on the web.

01:09:54   You have to change your mindset a little bit,

01:09:56   and it's very often frustrating when,

01:09:59   especially if you don't know that like,

01:10:01   the on appear or whatever, like the drag and drop stuff,

01:10:04   I thought it was impossible to do this thing,

01:10:05   but there was like a validate drop,

01:10:09   drop entered, drop exit, perform drop,

01:10:12   and I was doing all these things

01:10:13   and validate drop seemed to like,

01:10:15   had a Boolean return value that it seemed like

01:10:17   it was just being ignored,

01:10:19   and I had to drop entered and drop exited,

01:10:21   and I was trying to do declarative stuff

01:10:22   to change the cursor using AppKit,

01:10:25   'cause I'm like, well, SwiftUI doesn't have a way

01:10:27   to change the cursor as far as I can tell,

01:10:28   so let me just, in one of these things

01:10:31   where drop entered, drop, they all had like callbacks,

01:10:33   like oh, in the callback, I'll just change the cursor,

01:10:35   but nope, that doesn't work.

01:10:36   Like I called the correct API to change the cursor,

01:10:39   but whatever, like something else in SwiftUI was saying,

01:10:42   no, no, no, I control the cursor.

01:10:44   You can try to set the cursor,

01:10:45   but I never even saw it blink to my cursor.

01:10:47   I always just changed the other ones, though.

01:10:49   Drop updated was the correct thing,

01:10:51   which again, it took a callback,

01:10:54   and in the callback, you did this weird thing

01:10:56   about returning a drop proposal that influenced the cursor,

01:10:59   and it's just such a different way of working,

01:11:02   whereas it takes you two seconds to find out

01:11:04   how to change the cursor on the Mac with NS cursor,

01:11:07   takes much longer to figure out how to do it

01:11:09   on a drag and drop with the right,

01:11:12   I don't even know what they're called.

01:11:13   What are those little things called?

01:11:15   They're not delegate methods.

01:11:16   The little like on a peer or whatever,

01:11:18   I don't know if there's a SwiftUI name for those,

01:11:20   but anyway, those are all new.

01:11:22   They have all different names.

01:11:23   They have all different verb tenses,

01:11:25   and they are factored differently

01:11:27   because they're in a declarative API

01:11:29   instead of an imperative one,

01:11:31   so a lot of your sort of muscle memory

01:11:35   or idea of what this thing will be called,

01:11:38   it's not called that in SwiftUI if it exists at all,

01:11:41   so yeah, there's a learning curve.

01:11:43   Maybe for people who are just being born now

01:11:47   by the time SwiftUI is mature

01:11:48   and they learn it as their first API,

01:11:51   it will be a really good fit

01:11:52   with whatever web technologies are around

01:11:54   by the time they get to that age,

01:11:56   and it will fit their mental model better,

01:11:58   but it's definitely quite a change for MapKit.

01:12:01   - Yeah, I think you're right, and I think some of this,

01:12:03   well, a lot of this perhaps is my own ignorance,

01:12:05   but again, I mean, it's such a yin and yang, right?

01:12:09   When it works, well, God, it is so nice.

01:12:12   It is so, so nice, and then it just falls apart.

01:12:15   You hate yourself.

01:12:16   So Marco, you're really enthusiastic about trying this, right?

01:12:18   (laughing)

01:12:20   - I mean, yeah, I have high hopes

01:12:23   for the future of SwiftUI.

01:12:25   I admit that it does turn me off to a large degree

01:12:31   because of how different it is,

01:12:34   because it is, as you mentioned,

01:12:37   because it is declarative instead of imperative,

01:12:39   it's such a different style of coding anything,

01:12:43   let alone UIs, which are so often so imperative.

01:12:46   So I think it's gonna be a while, first of all,

01:12:50   before it is even mature enough

01:12:53   that it is a reasonable thing to use most of the time.

01:12:56   That's gonna take at least a few years.

01:12:59   But then also, there are gonna be certain tasks

01:13:02   where it's just worse.

01:13:05   And there are certainly some

01:13:06   that it's gonna be better for,

01:13:08   but it's a totally different way of thinking about things,

01:13:12   and you can't do things, you mentioned earlier,

01:13:14   like certain things that are really easy in the old way

01:13:18   are really hard in SwiftUI.

01:13:20   And it turns out a lot of those things

01:13:23   are really common needs for UI programming on iOS.

01:13:26   So I don't, it might never be better,

01:13:31   or it might always be this kind of weird alternative thing

01:13:35   that you can do if you want to,

01:13:37   but everyone's not doing it, right?

01:13:40   It could always stay there.

01:13:43   It could be more practical on some platforms and others.

01:13:47   Like, watchOS, where it began, it's probably easier

01:13:50   because it's a simpler problem space there,

01:13:53   and also, the alternative, WatchKit, is horrible.

01:13:56   So it's a much easier sell on watchOS, I think.

01:14:02   But like on iOS and on macOS,

01:14:04   where you already have very mature UI frameworks

01:14:07   that work in, I think, more straightforward ways,

01:14:11   if not, they might be more complicated in certain ways,

01:14:14   but they work in ways that all of us programmers

01:14:17   already know how to deal with.

01:14:19   We already know how to deal with UIKit.

01:14:22   We already know how to deal with AppKit.

01:14:24   And if we don't, and we start looking up

01:14:26   help articles and stuff, it'll work in a way

01:14:29   that we at least are familiar with.

01:14:31   It'll work in a familiar syntax or mode of doing things,

01:14:36   as opposed to, like, SwiftUI is,

01:14:40   it's almost like learning a different language

01:14:44   that also has a different alphabet,

01:14:45   and that also isn't even spoken by humans.

01:14:48   It's like, okay, well, okay, so if we're learning

01:14:51   the pig alphabet that is spoken only by pigs,

01:14:55   it's like, okay, we have a lot to learn here,

01:14:57   a lot to relearn, a lot to unlearn.

01:14:58   This is gonna be difficult, right?

01:15:01   And so I think SwiftUI's gonna be like that,

01:15:04   where because it is such a different paradigm

01:15:07   than what all of us are taught,

01:15:09   and because certain common things are extremely complex,

01:15:14   and to some degree might always be,

01:15:17   and because it's year one, and we're already having

01:15:23   to frequently do little hacks that basically break out

01:15:27   of the declarativeness of it, or we do, like,

01:15:30   those little state variables that kind of tarnish

01:15:33   the purity of this model in such a way

01:15:34   that makes you think, like, maybe this isn't

01:15:35   the right model all the time.

01:15:37   - The state variables aren't tarnishing it.

01:15:38   That's how you're supposed to use it.

01:15:39   It's just a different mindset.

01:15:41   - True, but because it makes certain things feel

01:15:45   kind of bad or sloppy or, like, hacks,

01:15:47   this is probably gonna prove to be

01:15:52   a really cool tool sometimes,

01:15:55   but it might not be the universal next big way to do UIs.

01:16:00   It might never reach that state.

01:16:03   It might just be that UIs are actually just much easier

01:16:06   to do declaratively, or imperatively.

01:16:08   God, I can't get them straight.

01:16:10   - I think the name is part of the problem,

01:16:12   'cause it's SwiftUI, and it makes you think, like,

01:16:14   oh, this is gonna be what I do

01:16:16   to make my entire user interface,

01:16:17   but if it had been called SwiftLayout,

01:16:19   that might have been a better name.

01:16:22   I know data is kind of threaded through it,

01:16:23   but I view it right now as,

01:16:26   its competitors is AutoLayout or Storyboards.

01:16:32   It's not doing my data model for me.

01:16:35   We know that's a whole separate thing.

01:16:37   It's basically, oh, so you want your data

01:16:39   to appear somewhere on the screen.

01:16:41   You're gonna make a view, right?

01:16:43   Well, that's what SwiftUI does.

01:16:44   It just makes views.

01:16:45   It doesn't even make Windows on the Mac.

01:16:47   It's not even at that level.

01:16:48   It just makes views, and if you're gonna make a view,

01:16:51   you could make it as a Storyboard or a Zib or Nib

01:16:54   or whatever, you can do it programmatically or whatever,

01:16:57   and I think of SwiftUI as,

01:16:59   imagine if you can make your UIs programmatically,

01:17:02   but the syntax was a billion times nicer

01:17:04   and you got live previews.

01:17:05   That's what it's like.

01:17:07   Pretend interface build didn't exist,

01:17:08   and you were just doing all your UIs programmatically

01:17:10   in Objective-C or Swift.

01:17:12   If you're good at that and you know all the APIs already,

01:17:15   you can kind of visualize what it's gonna look like,

01:17:16   but imagine if those APIs were so much more,

01:17:20   like terse, not so wordy,

01:17:22   not with a million different arguments

01:17:23   where you could really just express what you want

01:17:25   in a very concise, structured way

01:17:28   and see it in real time with multiple previews

01:17:30   and with different data and different scale factors

01:17:33   and sizes and dark mode and all that other stuff.

01:17:35   That's SwiftUI, right?

01:17:37   And it's not doing the whole rest of your application,

01:17:39   and you do have to figure out how to thread your data

01:17:41   through it and everything, but it's not really doing,

01:17:44   especially on the Mac, your whole app for you.

01:17:47   I think you can do most of the pieces.

01:17:50   I think you can make menus, context menus, menu bar icons,

01:17:55   but the windows still have to be NSWindows or whatever,

01:17:59   and you can put views inside them.

01:18:01   It's a weird mishmash.

01:18:03   I don't know if SwiftUI wants to be more than SwiftLayout.

01:18:05   Even if it was just as SwiftLayout,

01:18:07   I think it's a strong competitor to doing it programmatically

01:18:11   or using auto layout or using springs and struts

01:18:14   and doing, because the GUI builder way

01:18:17   of doing it with Interface Builder is similar to SwiftUI

01:18:20   only in SwiftUI, you only touch the source code,

01:18:23   again, like web dev, you touch the source code.

01:18:25   You don't do web dev, except for in the bad old days

01:18:28   of like page mill or whatever, by touching the web page,

01:18:30   you touch the source code, and then you look at the web page

01:18:33   to see how your thing came out,

01:18:35   and it's kind of like a real time thing, right?

01:18:37   In Interface Builder, you touch the actual interface

01:18:41   in storyboards or nibs, but there's also a code part

01:18:44   that's over there that might influence it,

01:18:45   and you can adjust that balance or whatever.

01:18:47   So I think SwiftUI has a bright future in that realm.

01:18:52   It's just not clear to me how far it will try to expand.

01:18:55   Like, is there a SwiftUI equivalent of a window on the Mac?

01:18:58   Does it go that far, or does it always stay

01:19:00   as a tool for making really cool views?

01:19:01   - Additionally, something I keep wondering is

01:19:06   if you can put a SwiftUI view inside of a view controller.

01:19:11   So view controllers, like the old way,

01:19:13   the standard way, I should say, of presenting stuff

01:19:16   on a screen, and you can put SwiftUI views

01:19:19   into view controllers.

01:19:21   So if that's the case, and if that's how this all

01:19:25   is held together for the live preview stuff,

01:19:28   couldn't we just live preview view controllers?

01:19:31   Like, is this an artificial limitation

01:19:34   to force us to use SwiftUI to get the new, sexy,

01:19:36   like live preview stuff, or is there something

01:19:40   legitimately different about SwiftUI that makes

01:19:43   that compulsory?

01:19:44   I just, I can't help but wonder, can't we have this

01:19:48   for UIKit and AppKit stuff?

01:19:50   Can we have these live previews for UIKit and AppKit stuff?

01:19:53   I feel like, it's easy for me to say,

01:19:54   'cause I'm not the one writing all this,

01:19:56   but it feels like we should be able to,

01:19:58   and if so, why can't we?

01:20:00   'Cause that would be amazing.

01:20:02   I want that first. - Well, I mean,

01:20:03   on UIKit, maybe, but think about it again.

01:20:07   I'm assuming one of the reasons, or the main reason,

01:20:09   that the Mac doesn't let you zoom in on Mac UIs in Xcode

01:20:13   is because no part of the AppKit UI drawing code

01:20:17   ever expected to be zoomed in, right?

01:20:20   Whereas UIKit was built with that in mind.

01:20:22   Those type of limitations are the type of thing

01:20:24   that make me think, like, AppKit never expected

01:20:26   to be live previewed.

01:20:27   That said, do you remember the big,

01:20:29   what are these switches called?

01:20:30   Maybe Marco will know.

01:20:31   They call guillotine switches or scissor switches?

01:20:35   You know, like in the Frankenstein movie where like--

01:20:40   - Oh yeah, I think they're called knife switches.

01:20:42   - Yeah, there you go, that's what it is, knife switches.

01:20:44   It takes the big handle and it's got Y-shaped,

01:20:46   and you switch it up like that,

01:20:48   and the machine turns on or whatever.

01:20:50   There used to be a little icon that looked like that button

01:20:53   in Project Builder, and you'd be in Interface Builder,

01:20:56   which was a separate app then,

01:20:57   and you'd be laying out your thing,

01:20:59   and then you'd hit that little switchy button,

01:21:00   and it would pop up like a live window of the UI

01:21:02   that you just made that you could interact with,

01:21:05   but it wasn't really live,

01:21:06   like it wasn't your whole app running.

01:21:07   It was just essentially the nib instantiated enough

01:21:12   so you could mess with it a little bit

01:21:13   and see how it worked and see the layout or whatever,

01:21:17   which is strange because Interface Builder itself

01:21:19   already looks almost like that,

01:21:20   and you can kind of interact with it

01:21:22   right in Interface Builder.

01:21:23   I think there still is a preview feature

01:21:25   like that somewhere, but it's not the same as SwiftUI.

01:21:28   The reason you can do it in SwiftUI is

01:21:30   SwiftUI is so focused on the view.

01:21:32   Like it's so controlled about the inputs and the outputs.

01:21:37   The only way you can influence is with environment and state

01:21:41   and then bindings back and forth

01:21:42   between the different levels, and that's it.

01:21:45   It's not like you can just, like you can with a nib,

01:21:48   just grab a reference to it from arbitrary code

01:21:50   and just screw with it in your code at any point

01:21:52   based on any logic you want, right?

01:21:54   Seems to me that to actually do a live preview

01:21:57   of a view controller, you'd have to run your whole app

01:22:00   because something in your app could have a reference

01:22:02   to that view controller, could dig into that thing

01:22:04   and pull out the view and pull one of your controls

01:22:05   and disable it.

01:22:06   How are you gonna simulate that?

01:22:07   You've just gotta run the app,

01:22:08   or SwiftUI doesn't allow that stuff,

01:22:10   so I feel like you're never gonna see

01:22:12   the same level of fidelity even with UIKit.

01:22:16   - All right, so Google Photos had a very big oops

01:22:21   that happened I think around Thanksgiving

01:22:24   but has just been admitted to now,

01:22:27   and I didn't have a chance to look into this

01:22:28   'cause I've been a little busy,

01:22:29   but my understanding is if I'm not mistaken

01:22:31   that if you requested a download of either

01:22:35   like all of your videos and photos

01:22:37   or some of your videos and photos,

01:22:38   there's a small chance you would get somebody else's stuff.

01:22:43   Oops.

01:22:44   Or some of somebody else's stuff.

01:22:46   - And somebody else could get your stuff.

01:22:48   - And somebody else could get your stuff,

01:22:49   and that's pretty big oops.

01:22:52   Not feeling good about that.

01:22:54   So that is really unfortunate, really sad,

01:22:58   and I don't know what to make of that

01:23:00   because I am still using Google Photos

01:23:02   as one of my photo backup, well quasi-backup strategies.

01:23:06   John, I know you're using it last I heard.

01:23:10   How do you feel about this?

01:23:11   - I put this in here not to like dance on Google

01:23:14   and say, "Ha, Google had a problem, aren't they so bad?"

01:23:18   Just to like, this is part of living in the world

01:23:20   where we have these cloud services,

01:23:22   and I thought it was just worth talking about at that level.

01:23:25   So we have recommended many times,

01:23:28   hey, if you have something that you care about,

01:23:31   don't just leave it on your computer that's in your house

01:23:33   because your computer could break, your house can burn down,

01:23:37   you could get robbed, like all sorts of things

01:23:38   that can happen if you really care about that information,

01:23:40   you have to have it elsewhere.

01:23:42   That elsewhere is usually in addition

01:23:44   to maybe having a backup copy at a friend's house

01:23:46   or a relative's house or something,

01:23:47   a better system that is easier to keep up to date with

01:23:51   is to use one of the many cloud services.

01:23:53   For photos, you can push your photos up

01:23:55   to Apple's iCloud photos thing, you can use Google Photos,

01:23:58   you can use a data agnostic backup service

01:24:01   like frequent sponsor Backblaze

01:24:02   or any other cloud backup services,

01:24:04   but the whole idea is you're gonna take your data

01:24:07   and you're going to send it over wires out of your house

01:24:11   to a computer that somebody else owns.

01:24:13   And part of the deal with that is

01:24:18   you are shifting responsibility for that to somebody else,

01:24:22   which mostly you wanna do.

01:24:22   It's like it's their problem to make sure

01:24:24   that their data center doesn't burn down

01:24:26   and that they have redundant backups and all that stuff.

01:24:29   And all I gotta worry about is that

01:24:31   we don't have simultaneous disasters.

01:24:33   If their data center burns down,

01:24:34   hopefully it doesn't burn down

01:24:35   the same day my house burns down, right?

01:24:37   And that's how you protect.

01:24:38   If you have three cloud backup services now,

01:24:40   multiple data centers need to burn down

01:24:42   in the same day your house burns down

01:24:43   and the chances get lower and lower

01:24:44   that you're actually gonna lose anything.

01:24:46   But part of that deal is also,

01:24:48   oh, if I screw up and accidentally pour water

01:24:51   in my computer, Casey, that's my bad.

01:24:54   But I was responsible for that data, so oh well.

01:24:56   Well, if Google accidentally pours water in their computer,

01:25:00   that's their bad and that screwed up your data.

01:25:02   Every time you put your data into someone else's bucket

01:25:05   and they're responsible for taking care of it,

01:25:07   their mistakes can affect your data,

01:25:09   down to and including, oops, I accidentally send your photos

01:25:12   to somebody who's not you.

01:25:14   They're not doing it on purpose,

01:25:16   just like Casey's not spilling the water

01:25:17   into his computer on purpose.

01:25:18   But people make mistakes, companies are made of people.

01:25:22   So this, I feel like, is part of the bargain

01:25:26   that we make when we use cloud services,

01:25:28   which is you are now vulnerable

01:25:30   to the mistakes of other people.

01:25:31   Just like you are protected from your mistakes

01:25:33   by giving your data to them,

01:25:35   now you are vulnerable to their mistakes.

01:25:37   So I still strongly recommend cloud services,

01:25:41   even knowing that they could accidentally

01:25:44   delete all my photos, give them to somebody else,

01:25:46   scramble them up or whatever.

01:25:48   They're just like any other entity made up of people.

01:25:52   They're not a magical AI,

01:25:53   they're not an infallible computer in the cloud,

01:25:55   it's just a bunch of people

01:25:56   running a bunch of their own computers,

01:25:58   just like you're a person running your computer

01:25:59   in the same way that you can screw up, they can screw up.

01:26:01   Hopefully they have more controls, they have more people,

01:26:03   they have more money, they have more time,

01:26:05   they are more incentivized to take care of their stuff,

01:26:08   perhaps than you are,

01:26:09   'cause you don't have time to be a full-time data warden

01:26:11   for all the stuff in your house,

01:26:12   but that risk still exists.

01:26:15   And I think this is a perfectly good trade-off,

01:26:17   despite things like this happening.

01:26:20   Obviously, you should talk to your cloud providers

01:26:23   or think about them and say,

01:26:25   "Do they do this all the time?

01:26:26   "Are they constantly losing my data, deleting my data,

01:26:29   "giving it to other people?

01:26:30   "Are they intentionally selling my data

01:26:32   "or doing other mean things or whatever?"

01:26:33   That's something you have to deal with.

01:26:35   I think Google is still a pretty good steward of the data

01:26:37   it holds, but every once in a while,

01:26:39   something like this will happen.

01:26:41   And I don't, like, I'm still totally willing

01:26:46   to take this bargain, I don't see this and think,

01:26:48   "Oh my god, I gotta get my photos out of the cloud."

01:26:50   I think, well, you know, that kind of stuff happens.

01:26:54   If it happens every month with Google,

01:26:56   I'll think more strongly about perhaps

01:26:57   taking my stuff out of the Google Cloud,

01:26:59   but once in however many years, I'm not too worried about it.

01:27:03   - Yeah, when it comes to evaluating cloud services

01:27:07   and providers and, I mean, if she's any modern,

01:27:11   big tech choice, you kinda have to take

01:27:14   the long-term average with stuff like this.

01:27:18   Apple has lots of problems in lots of different areas

01:27:21   and we still stick with them because

01:27:23   the long-term average is pretty good.

01:27:25   Google, Amazon, Facebook, Microsoft, all the tech giants,

01:27:28   they all have occasional issues, they have occasional bugs

01:27:32   or security holes or just crazy things that just go wrong

01:27:36   or quality issues or whatever, they all have these.

01:27:39   It's impossible to run a giant web service

01:27:41   and be 100% perfect, to never have an issue,

01:27:46   to always be up, like, you're never gonna find anybody

01:27:50   who's totally perfect and it's one of those things like

01:27:52   if you instantly drop and permanently leave

01:27:56   anybody who makes a mistake once in a while,

01:27:58   it's kinda like swearing off airlines

01:28:01   every time you have a poor experience on one.

01:28:03   It's like, you're gonna run into airlines pretty fast

01:28:05   and there's only so many and you're gonna have

01:28:07   a hard time flying anywhere and you're mostly

01:28:09   just hurting yourself.

01:28:10   If you drop Google for this, like,

01:28:14   their record is really good with security over time.

01:28:19   They do a bunch of creepy crap.

01:28:20   I'm not gonna say anything nice about them on that front

01:28:23   but when it comes to like, this is a security bug

01:28:25   and their record on security bugs over time is really good.

01:28:29   So this was a one-time fluke thing.

01:28:32   I wouldn't judge them long-term based solely on that.

01:28:35   Now, if they have a pattern of like, neglect and sloppiness

01:28:40   and they start failing to do things like this

01:28:43   on a regular basis or, you know, they start having

01:28:45   more security problems over time,

01:28:48   that messes up the average, then you can reevaluate.

01:28:50   Then you can say, all right, this isn't just a one-off thing

01:28:52   or they don't just screw up rarely.

01:28:54   If they start screwing up often, that's different

01:28:57   but one screw up over the like, 20 years

01:29:00   that we've all been using Google products,

01:29:02   you know, one security flaw like this is not a big deal

01:29:06   and they really, again, when it comes to security,

01:29:10   they really haven't had very many bugs or flaws.

01:29:13   - No argument here.

01:29:15   I mean, I'm gonna keep my stuff there for now

01:29:17   but it freaks me out, does freak me out.

01:29:19   - We are brought to you this week by Jamf Now.

01:29:24   It's easy to keep track of your own Mac or iPad or iPhone

01:29:27   but what about the other Apple devices at work?

01:29:30   As a business grows, so does its digital inventory

01:29:33   and this makes it harder to manage everyone's Apple devices

01:29:36   and this is especially true if you have remote employees.

01:29:39   Jamf Now makes it easy to set up, manage

01:29:42   and protect your Apple devices.

01:29:44   You can check your digital inventory,

01:29:46   distribute Wi-Fi and email settings to the whole fleet,

01:29:49   deploy apps, enforce passcodes, protect your company's data,

01:29:54   even lock or wipe a device remotely as needed from anywhere.

01:29:58   Jamf Now helps you manage your devices

01:30:00   so you can focus on your business instead

01:30:02   and it's so easy to use,

01:30:04   you don't need any IT experience to do it.

01:30:07   So our listeners can start securing your businesses today

01:30:10   by managing your first three devices for free.

01:30:13   You can add more after that,

01:30:14   starting at just $2 a month per device.

01:30:17   Once again, first three devices free.

01:30:19   Create your free account today at jamf.com/atp.

01:30:23   That's J-A-M-F.com/atp.

01:30:27   Thank you so much to Jamf Now for sponsoring our show.

01:30:29   (upbeat music)

01:30:32   - Stefan Jacobs writes,

01:30:34   "I'm kind of new to using the terminal to do things on a Mac

01:30:36   and I've come across Homebrew a few times.

01:30:38   I've also heard though that Homebrew can make a bit

01:30:41   of a mess if you're not careful,

01:30:42   although I'm not sure what careful means here.

01:30:45   Do you guys use Homebrew?

01:30:46   If not, is there an alternative?

01:30:47   Do you know what kind of careful I need to be

01:30:49   to be a happy Homebrew user?"

01:30:51   Let me start with the easy stuff.

01:30:52   I do use Homebrew, I quite like it.

01:30:54   I know that there's an alternative.

01:30:56   Is it Macport?

01:30:58   Is that what I'm thinking of that's the popular alternative?

01:31:00   I think that's right.

01:31:01   - Yeah, that's the old one, yeah.

01:31:03   Is there anything newer?

01:31:04   - Not to my knowledge, but again, I wouldn't know.

01:31:07   And in terms of what you have to do to be careful,

01:31:10   I don't know, I'm gonna learn with you, Stefan.

01:31:12   So John, Marco, would one of you like to tell me

01:31:14   what we need to do to be careful?

01:31:16   - Yeah, just don't let time pass.

01:31:19   - That'll do it.

01:31:19   - Just freeze time.

01:31:22   'Cause here's the thing, Homebrew is a package manager.

01:31:26   That's, at the heart of it, it's just like

01:31:28   Linux package managers and everything,

01:31:29   it's a package manager.

01:31:30   People judge, "Oh, this package manager's great.

01:31:33   "This package manager's terrible.

01:31:35   "App to get it is so much better than YUM," or whatever.

01:31:38   Everyone has these holy wars over package managers

01:31:40   throughout the history of package managers.

01:31:42   But the reality is Homebrew has the same problems

01:31:46   that almost all of them do.

01:31:47   You can get it set up once,

01:31:50   and it might work at a given point in time.

01:31:54   But over time, the packages will change.

01:31:58   The platform you're running them on will change.

01:32:00   Or the computer you're running it on will change.

01:32:02   So whatever you get working once at a point in time,

01:32:06   a year later, you want to install a new package,

01:32:09   and oh, this requires a new version of this library.

01:32:11   Upgrade that library.

01:32:12   Oh, now this broke these old three things

01:32:14   that you were depending on, or whatever.

01:32:17   And then you try to fix that, and then it won't build,

01:32:19   or it can't remove dependencies,

01:32:22   or it can't add dependencies,

01:32:24   or it has no idea where things are,

01:32:25   or things that works, then you run it,

01:32:26   and all the libraries are broken.

01:32:27   And it's like, it breaks.

01:32:30   The setup that you build with package managers

01:32:32   is so brittle that anything that you want to do

01:32:36   like three to six months after you did it the first time

01:32:40   might not work, and actually has a very high chance

01:32:42   of not working correctly.

01:32:45   And so, so often, the solution ends up being,

01:32:49   "All right, just start over.

01:32:50   "Just wipe out everything that homebrew installed,

01:32:54   "clear out the whole directory,

01:32:56   "and uninstall homebrew completely,

01:33:00   "and then reinstall it as if it was never on your machine,

01:33:02   "and reinstall all the packages you need,

01:33:04   "have a script that you can just run over and over again,

01:33:07   "so you just do everything from scratch."

01:33:09   And in homebrew's defense,

01:33:12   it does actually make that easier

01:33:14   than a lot of the Linux package managers,

01:33:16   because it installs all of its stuff

01:33:18   in one directory path area.

01:33:21   And so you can actually just blow that away usually.

01:33:24   Like, you know, make it uninstall itself first,

01:33:27   but then it'll leave a bunch of crap behind,

01:33:28   and it'll freak out, and it'll yell at you a million times

01:33:30   about all the crap it left behind,

01:33:32   and then you can just go delete it.

01:33:33   And then you can install it as if it was never there.

01:33:35   And usually that works.

01:33:38   So in the sense of being a package manager,

01:33:42   it fails in the same way that most package managers fail.

01:33:46   I think it fails in that way a little more often

01:33:49   than the mature Linux ones do,

01:33:52   but that's also in part because homebrew is on Mac OS,

01:33:56   and Apple doesn't give two craps about it.

01:33:59   And so Apple is, you know,

01:34:01   every time Apple updates the OS,

01:34:04   there's all new garbage for homebrew to have to deal with

01:34:06   or work around or whatever else,

01:34:08   so I'm sure Apple's not making things easy on them.

01:34:10   So it's kind of, you know, it's building a package manager

01:34:12   on a very, you know, shifting and rapidly moving foundation.

01:34:17   But still, like, it breaks a lot,

01:34:20   and it breaks in all the familiar ways,

01:34:22   dependency garbage or library garbage or whatever.

01:34:26   But it's also, you know, the work of a bunch of volunteers,

01:34:29   and we all use it for free,

01:34:31   and so I kind of feel bad complaining about it.

01:34:34   I've never helped out.

01:34:35   I'm not doing anything to try to fix it.

01:34:37   It's, you know, it's this big open world thing.

01:34:39   I could try to help, but I'm not,

01:34:40   so I do kind of feel bad saying bad things about it.

01:34:43   But, you know, it's a package manager,

01:34:45   and it's no better and actually somewhat worse

01:34:48   than most package managers out there

01:34:49   that you would use these days.

01:34:50   So expect all the same problems.

01:34:52   And anything you want to do with homebrew,

01:34:55   I would say maintain a script

01:34:58   that you can run in the future to set it up from scratch,

01:35:02   because given enough time, you will need to.

01:35:05   - You know, I don't think I've ever had to nuke homebrew

01:35:08   and try it again from scratch.

01:35:10   Not to say that you're wrong.

01:35:11   I'm not trying to say that your lived experience isn't right.

01:35:14   I'm just saying that as a second data point,

01:35:16   - I have my own truth.

01:35:17   - I don't think I've ever had it go quite that wrong.

01:35:22   I've had to uninstall like individual things.

01:35:24   Like let's pick on FFmpeg, just for sake of discussion.

01:35:27   Like maybe something goes awry with FFmpeg,

01:35:29   and I have to uninstall it via homebrew

01:35:31   and then reinstall it, and then it's been fine for me.

01:35:35   So I don't know if I'm just,

01:35:36   maybe I'm not doing as complicated things with homebrew,

01:35:39   or maybe I've just had better luck, I'm not sure.

01:35:41   But I wouldn't say, in my personal experience,

01:35:44   I wouldn't say it's demonstrably worse

01:35:46   than any other package manager.

01:35:48   But yeah, I guess it depends

01:35:50   on what your particular experience is.

01:35:53   John, how's it going for you?

01:35:55   Do you even use homebrew in the first place?

01:35:57   - Yeah, the question was, is there an alternative?

01:35:59   The alternative is do not use a package manager.

01:36:01   That's what I have done.

01:36:03   I don't use package managers,

01:36:05   although occasionally I'll install one

01:36:07   and use it to install a thing,

01:36:08   but I always regret it and go back.

01:36:10   So what's the alternative to using a package manager?

01:36:13   Well, a long time ago, in the dark days of Unix,

01:36:16   there were really no package managers,

01:36:17   and if you wanted software, you downloaded the source code

01:36:20   and you built it yourself.

01:36:21   That's what I do.

01:36:22   I download the source, I build it,

01:36:23   and I install everything in user local.

01:36:25   It's kind of like having a single directory

01:36:27   where all your stuff is,

01:36:28   because Apple does not put anything in user local,

01:36:31   so user local is all yours, and it can have all the things.

01:36:34   User local lib, user local bin, user local man,

01:36:36   it's all that user local include.

01:36:38   It's all there, and you control all of it.

01:36:40   The bad thing is if you don't use a package manager,

01:36:42   it is a giant pile of stuff that is mostly undifferentiated,

01:36:46   but the thing I find most frustrating about package managers

01:36:48   aside from them breaking and having to go through all the,

01:36:51   you know, 'cause when the OS updates,

01:36:52   it's almost guaranteed that a bunch of stuff's gonna break.

01:36:54   It happens with building from source too,

01:36:56   but a little bit less often,

01:36:58   is that very often what you want

01:37:00   isn't in the package manager.

01:37:02   Oh, you want version whatever of that thing?

01:37:05   Well, you can't have it because it relies on version

01:37:08   of whatever of this other thing,

01:37:09   and we don't have that in package management,

01:37:11   so you can't install the new thing,

01:37:12   or if you have conflicting versions,

01:37:14   you don't get to pick how everything fits together.

01:37:16   You are at the whim of what is available,

01:37:18   and the more popular package management

01:37:21   and pre-built package repos of Linux distributions

01:37:25   give you more options, but not that many more.

01:37:28   Sometimes the thing you want isn't there,

01:37:31   and the other thing that I find frustrating

01:37:33   is if it's not available at all,

01:37:34   like it's a new piece of software,

01:37:36   or it's not in the package manager at all,

01:37:39   and you're like, well, but I have all the prerequisites

01:37:41   in the package manager, so what if I just pulled

01:37:43   that one thing that I want from source?

01:37:46   It should be able to find all the prerequisites

01:37:47   that the package manager installed, right?

01:37:49   Sometimes, maybe, but sometimes not,

01:37:53   depending on how your OS controls that type of thing,

01:37:55   and Mac OS in recent years has been getting more cranky

01:37:59   about things like LD load path or whatever

01:38:02   the various ways are that you can get some pre-built binary

01:38:07   to find a library that's not where it expected it to be.

01:38:09   That's also kind of a security problem,

01:38:11   so they've been locking down some of that stuff,

01:38:13   and it gets a little bit tricky.

01:38:14   All this is to say that if you build everything from source,

01:38:17   it's a pain, but it's your pain,

01:38:19   and you get to control exactly every aspect of it.

01:38:22   As long as the software actually exists somewhere

01:38:25   in the versions that you want, you get to manually

01:38:29   be the package manager and traverse the dependency chain

01:38:31   to build things, and once you figure it out,

01:38:34   you can build a script to do it or whatever,

01:38:36   but bottom line is, there will be a new version,

01:38:39   and the new major version of the operating system,

01:38:40   and you might have to rebuild stuff.

01:38:41   I had a user local install of Postgres, MySQL,

01:38:46   a bunch of utilities like wget,

01:38:50   and a bunch of stuff that Apple doesn't include

01:38:51   that I like, you know, Lynx, whatever.

01:38:54   I had built a bunch of software--

01:38:55   - Lynx the browser?

01:38:56   - Yeah. - Why?

01:38:57   - What the hell are you using Lynx for in 2020?

01:39:00   - If you're doing web dev, it's a thing you have to,

01:39:03   it's a certain set of utilities--

01:39:03   - What? - Always wanted to be there.

01:39:05   - Who's using Lynx in 2020?

01:39:07   - Sometimes just a quick way from a command line

01:39:09   to make a request to a thing and try to load it,

01:39:11   and it has debug modes and, you know, whatever, anyway.

01:39:14   - Oh my God. - Oh my God.

01:39:15   - And plus, if you wanna make a version,

01:39:17   so if you wanna hear something, it'll make you feel,

01:39:19   it'll make me feel old and, you know, anyway.

01:39:21   There was a time when the cool thing to do

01:39:24   with your homepage, as we called it,

01:39:27   was to make a cool version of it

01:39:30   that detected when you were using it in Lynx,

01:39:32   and instead of having a header image,

01:39:34   had ASCII art at the top

01:39:36   that would look like your header image.

01:39:37   (laughing)

01:39:39   That's how you could tell you were a hyper elite

01:39:40   web developer in 1994.

01:39:43   - And now that I can get behind.

01:39:45   - Wow. - It was awesome.

01:39:46   Anyway, well, I didn't forget

01:39:49   where I was even going with that.

01:39:50   Built one Lynx, oh yeah, I had an install of that,

01:39:53   that I didn't have to change for like three major versions.

01:39:56   The trick is static linking.

01:39:58   Do not dynamically link.

01:39:59   Static link everything.

01:40:00   It makes all your executals bigger and it wastes memory,

01:40:02   but if you statically link, your user local can survive

01:40:06   across major OS updates without breaking

01:40:08   for a surprising amount of time.

01:40:10   Eventually it'll probably break,

01:40:11   'cause symbols will just disappear

01:40:13   and you're usually dynamic linking with something,

01:40:15   or, you know, all sorts of stuff.

01:40:16   Or if it's 32 bit and a 64 bit comes along like that,

01:40:19   it'll break eventually, but anyway, this is not,

01:40:22   I can't really, I mean, this is my answer.

01:40:25   I don't really recommend it because using Homebrew

01:40:27   is a million times easier than building stuff from source.

01:40:30   Right? (laughs)

01:40:32   So if you do have to, if you use Homebrew

01:40:35   and it screws up and you have to, you know, redo it,

01:40:37   that's tractable.

01:40:38   Doing it just once from source requires like this wealth

01:40:43   of background knowledge and experience

01:40:45   that no one should ever need to have.

01:40:46   So I can't actually recommend it, but it's what I do

01:40:49   and I vastly prefer it to using a package manager.

01:40:52   - So I had to install Lynx and look at my own homepage.

01:40:55   (laughs)

01:40:56   'Cause now I need to.

01:40:56   - You installed Lynx with Homebrew?

01:40:58   - Yes, I did.

01:40:59   Why wouldn't I?

01:41:00   - 'Cause you, let me tell you,

01:41:01   if I was installing Lynx from source,

01:41:02   I could not have done it in the amount of time

01:41:03   that you just did it.

01:41:04   So there's an advantage of using a package manager.

01:41:06   If it has what you want and you don't,

01:41:08   and you like the version that it has,

01:41:10   you can get it done quickly.

01:41:12   All those cores, you can.

01:41:14   - My favorite part of looking at my own homepage

01:41:17   or my own website in Lynx is I use the anchor emoji

01:41:21   as an indicator of like a permalink.

01:41:23   And in Lynx, sure enough, it shows it as a plus sign,

01:41:27   a hyphen, and a close parenthesis.

01:41:30   - That's awesome.

01:41:31   - Which is amazing.

01:41:32   That's so great.

01:41:33   It really honestly is.

01:41:34   - Does Lynx not know that you have

01:41:35   a UTF-8 terminal program?

01:41:37   'Cause it should just show the emoji, right?

01:41:39   - I don't, I understand what you're saying

01:41:41   and I don't know.

01:41:42   - I love that somewhere, somebody has like an emoji

01:41:45   to ASCII transliteration table.

01:41:47   - ASCII, right?

01:41:48   (laughs)

01:41:49   - It's probably built into Lynx.

01:41:50   - This is why, what it's like to be a fancy web developer.

01:41:54   Your site needs to look good in Lynx.

01:41:56   - That's amazing.

01:41:57   - So good.

01:41:58   Oh, my word.

01:42:00   And Marko Org is also looking pretty decent, all told.

01:42:03   I'm surprised.

01:42:04   - I haven't updated it since Lynx was current.

01:42:06   (laughs)

01:42:07   - It doesn't like your permalink as much, though.

01:42:09   It's labeled as Infiti, which I think is short for infinity.

01:42:13   But--

01:42:14   - Infiti?

01:42:15   - Oh yeah, that must be what it is.

01:42:16   Yeah, I-N-F-T-Y.

01:42:18   Oh man, that's too bad.

01:42:19   Anyway, I could spend all night.

01:42:20   See, now you've totally derailed me.

01:42:22   I made fun of you and now I'm sucked in.

01:42:24   All right, Matt Rorr writes,

01:42:25   "What's the difference in any between the shift control

01:42:28   option and command modifier keys?

01:42:30   Most apps have useful shortcuts,

01:42:32   but I don't see the logic behind which key

01:42:34   does what kind of operation.

01:42:35   For instance, in finder and system shortcuts,

01:42:37   command D duplicates the selected files,

01:42:39   shift command D opens the desktop folder,

01:42:43   option command D shows or hides the doc.

01:42:45   Is this pure memorization or are there any patterns

01:42:48   we can follow in learning shortcuts?"

01:42:49   Well, I think for this I'm going to have to turn

01:42:52   to my favorite old man, Jon.

01:42:54   What's the story?

01:42:55   - Oh, there is a system, all right.

01:42:57   So this is, part of it is like a system

01:43:01   someone thought about ahead of time

01:43:02   and laid out and described in human interface guidelines

01:43:06   or whatever, but part of it is also a culture

01:43:08   where practices are accumulated over time

01:43:11   through shared experience.

01:43:12   There are certain things that you accept.

01:43:13   So I think if you've been using any platform

01:43:16   for a long period of time and if there is any kind

01:43:18   of sort of strong culture, you will absorb it.

01:43:21   You absorb sort of the rules and the norms,

01:43:24   whether you're aware of it at a conscious level or not.

01:43:28   That, the Mac today is a combination of those.

01:43:31   Slight sidebar, one thing that I get irrationally

01:43:36   just annoyed by is, and this is just the hegemony

01:43:42   of Windows, I suppose, where people who are using Macs,

01:43:45   just a giant room full of people using Macs,

01:43:47   and they're all talking to each other

01:43:48   about hitting Control + C to copy.

01:43:50   And it's like, believe me, you are not hitting,

01:43:52   they're all in terminal Windows.

01:43:53   Like you are not hitting Control + C to copy on that Mac.

01:43:57   Everyone thinks like the main modifier key

01:43:59   because Windows dominated the 90s is Control.

01:44:03   And it's not, as I pointed out many times,

01:44:05   one of the awesome things about the Mac

01:44:08   is Control was left there for Unix.

01:44:10   Control + C can send SIGTERM or interrupt signal

01:44:14   or whatever without interfering with copy

01:44:18   because copy is not Control + C on the Mac, it's Command + C.

01:44:21   And the command key is not the same as the Control key.

01:44:25   I know we all know that, but it seems like every time

01:44:28   I hear anyone speak who's not like

01:44:31   in my specific tiny tech nerd circle,

01:44:33   it's like, oh yeah, Control + C to copy that.

01:44:35   It's like, nope, that's not gonna work on your Mac.

01:44:37   But they just, they say Control + C,

01:44:38   but then they hit Command + C.

01:44:40   I also get upset when people talk about the Alt key.

01:44:42   Your Mac does not have an Alt key.

01:44:44   - Mine does.

01:44:45   (laughing)

01:44:46   - I know, yours does.

01:44:47   But even the Mac keyboard said,

01:44:48   like I think mine, does it say Alt?

01:44:50   Let me see.

01:44:51   No, mine doesn't, but I think at a various point

01:44:53   even Apple shipped keyboards that said Alt

01:44:55   in like little letters underneath Option or whatever.

01:44:57   Anyway, it's a different key.

01:44:58   - Mine has a person key and a Skrillex.

01:45:02   (laughing)

01:45:03   - Print screen, scroll lock, yeah, you need those.

01:45:05   Those are super important keys.

01:45:06   - It also has a Windows key on one side.

01:45:08   On the other side, a menu key.

01:45:11   - I can't believe it, like that's such a case

01:45:13   of Windows Envy, where they're like,

01:45:14   the Control and Alt and all that other stuff,

01:45:18   but it's like, but Apple's got,

01:45:19   they made, Apple made up a button.

01:45:21   They made up a Command key with the weird Swedish campground

01:45:25   point of interest attention whatever symbol on it.

01:45:28   Can we have a key too?

01:45:30   And being the imaginative people they are,

01:45:32   they said, I know, we'll call it the Windows key.

01:45:34   And people will accidentally hit it

01:45:35   and make the Start button show up for the next decade.

01:45:38   And there it is, and now it's on your keyboard

01:45:40   and has a Windows symbol on it.

01:45:42   Anyway.

01:45:43   - The funny thing is, during the last couple of weeks

01:45:45   when we were talking about the Windows logo,

01:45:47   I never once thought to look down at my keyboard.

01:45:51   Sure enough, there it is, it's the slanted Windows logo.

01:45:54   (laughing)

01:45:56   - It's on the Windows key, right?

01:45:57   - Yeah, I mean, for me it's Option,

01:45:59   but yeah, but it's Option to my muscles,

01:46:02   but to my eyes, it's Windows.

01:46:04   (laughing)

01:46:05   - Yeah, anyway, that's one of those things that like,

01:46:10   you can't go back in time and change that,

01:46:12   but I'm just so glad that the Mac is the platform

01:46:15   that was poised to have a beautiful synergy

01:46:18   of the Mac that we know and love and Unix,

01:46:20   because control is there for Unix to mostly have,

01:46:23   'cause in the Unix world,

01:46:24   control is the dominant modifier,

01:46:26   and in the Mac world, it's command.

01:46:28   Anyway, getting back to the question at hand here,

01:46:30   the general pattern is the Command key,

01:46:34   Command plus some other key on the keyboard,

01:46:37   is for the most frequently used, most important,

01:46:40   prime commands, copy paste, quit, select all,

01:46:44   and anything in your application,

01:46:48   so if your application is the finder,

01:46:50   and you think duplicate is an important function

01:46:52   that people are gonna do a lot, that gets Command + D.

01:46:55   The Option key, in general, is used to modify the behavior

01:46:59   of some other thing that your thing can already do.

01:47:05   It's also sometimes true of Shift,

01:47:06   but Option, in general, like culturally,

01:47:08   and I think probably in the Hague way back in the day,

01:47:11   was like, you're gonna do a thing,

01:47:13   but you're gonna do a thing in a slightly different way.

01:47:16   That can be like clicking or running a command

01:47:20   that already exists and adding the Option key

01:47:22   to the modifier.

01:47:23   There are a bunch of conventions surrounding these

01:47:26   for application-specific things that are just cultural

01:47:29   and weren't really written anywhere,

01:47:31   but if you use, for example, any kind of graphics app,

01:47:34   and you Command + Drag, that moves, Command + Option + Drag

01:47:37   copies and moves a copy of it, Shift constrains proportions,

01:47:41   Option resizes from the center instead of the edges,

01:47:44   like these are all just cultural things

01:47:46   that have been sort of cargo-culted

01:47:48   across many applications,

01:47:49   and this is just the realm of graphical applications,

01:47:51   but the modifiers come to have significance, right?

01:47:54   There is an understanding, like holding down Shift

01:47:58   and doing a resize, you expect it to be constrained,

01:48:01   because like Shift means constrain when resizing things,

01:48:04   constrain to a square or whatever.

01:48:05   Holding down Shift + Option means constrain

01:48:07   and also resize from the center instead of the edge,

01:48:09   and if that, there's nothing about Shift that says that

01:48:12   or about Option that says that in that context,

01:48:15   but it's cultural, but the generic context is

01:48:18   Command is prominent, Command + Option is modifier,

01:48:22   Command + Shift is second-level primary operations,

01:48:27   so if you have a thing that you see like

01:48:29   as a common operation,

01:48:30   and you want it as taken for it,

01:48:31   don't do Command + Option that letter,

01:48:33   do Command + Shift that letter.

01:48:35   The difference between Command + Shift

01:48:37   and Command + Option can be debated,

01:48:38   but I feel like culturally,

01:48:40   there's a sense for if you gave me a bunch of commands

01:48:43   in an app and told me what kind of app it was,

01:48:45   I could tell you, oh, that one should have

01:48:46   Command + Shift a letter,

01:48:48   and this one should have Command + Option.

01:48:49   You also have the alternative,

01:48:51   and this happens sometimes too,

01:48:52   where you're out of letters,

01:48:53   and the good letter you want is already taken,

01:48:56   like you have some operation that begins with a P,

01:48:57   but Command + P is print.

01:48:59   It's the wrong choice to make Command + P

01:49:01   in your program not print,

01:49:02   especially if your program can print.

01:49:04   Don't take Command + P away from print,

01:49:06   but you're like, but then what do I use?

01:49:08   It's a common operation.

01:49:10   To give an example, if my memory serves, it might not.

01:49:12   Let me cheat by looking in the Finder right now,

01:49:14   although it might not even be there anymore.

01:49:16   Put away in the Finder was a command

01:49:19   that was used a lot back in the day,

01:49:20   but it can't be Command + P,

01:49:22   'cause Command + P is print,

01:49:24   and at various times, probably including today,

01:49:26   the Finder could print.

01:49:27   So what do you use for put away?

01:49:29   Do you make it Command + Option + P?

01:49:32   No, that's like page setup or some other thing.

01:49:34   Do you make it Command + Shift + P?

01:49:35   But it seems like it's more of an important operation

01:49:37   that was done frequently back in the day

01:49:39   of putting something back where it came from or whatever.

01:49:42   So I think someone picked Command + Y,

01:49:45   I guess for the end of put away.

01:49:47   Not a great choice, but sometimes having a single,

01:49:52   non three-finger-corded operation

01:49:55   is more important than picking the right letter.

01:49:58   So you end up with something like Command + Y

01:50:01   for put away, again, I don't know if my memory is failing me,

01:50:03   it might have actually been a different key,

01:50:04   or Command + M for make alias,

01:50:07   'cause Command + A is select all,

01:50:08   so you can't use Command + A,

01:50:10   but should you use Command + Option + A?

01:50:12   It's not related to select all,

01:50:14   you're not selecting all but in a modified way.

01:50:16   Could you use Command + Shift + A?

01:50:18   Eh, it still seems kinda like it might have something to do

01:50:21   with selecting all, 'cause Command + A is so important.

01:50:23   So how about Command + M for make alias?

01:50:26   Nobody's taking it and you get to take the single letter.

01:50:28   So there are rules that you should follow

01:50:33   in a hierarchy that you should go through,

01:50:35   but really a lot of it is also just feel and experience,

01:50:39   and the best way to find out,

01:50:40   aside from just sort of implementing the rules

01:50:42   of like use single letters when you can,

01:50:44   use Command + Option for modifications,

01:50:45   use Command + Shift if there's no Command + Options,

01:50:47   and notice I didn't even mention the Control key anywhere

01:50:50   in any of this discussion, it's there, it's available,

01:50:53   you can use it in your Mac apps,

01:50:55   but that's the bottom of the barrel,

01:50:56   that's for like all the good commands are taken,

01:50:59   all the Command + Option and Command + Shifts

01:51:01   are taken or don't make sense,

01:51:03   there's some really weird command that you wanna do,

01:51:05   fine, throw in control.

01:51:06   That's why a lot of the weird utilities that we all use,

01:51:09   use the Control key for modifiers,

01:51:12   like the, like Paste Spot, multiple clipboard thing,

01:51:15   you can't use any of the Cut and Copy and Paste commands,

01:51:18   you know, X, Z and V with and without option,

01:51:21   with and without Shift are very likely to be taken,

01:51:23   but Command + Control + V,

01:51:26   probably any reasonable Mac app does not take that,

01:51:29   so therefore it is available to be the,

01:51:32   bring up the Paste UI thing for Paste Spot.

01:51:34   Similarly, Command + Space is stolen by Spotlight,

01:51:37   but it was stolen by Quicksilver first,

01:51:38   but you can give it back to Quicksilver

01:51:39   and give Spotlight the cruddy one,

01:51:41   like my Spotlight is like Command + Option + Space

01:51:43   or Command + Control + Space or whatever.

01:51:45   Anyway, once you start mixing control in,

01:51:47   you're really at the bottom of the barrel,

01:51:48   do not put that in your app,

01:51:49   if you can at all help but leave control for Unix

01:51:52   and for utilities that really need a unique command

01:51:55   that they hope an app won't take.

01:51:56   - Somebody tell Logic.

01:51:58   - Does Logic use a lot of control signals?

01:52:00   I mean, if you have a complicated application.

01:52:02   - Not only does Logic use a lot of control modifiers

01:52:05   for their keys, and only control,

01:52:07   like Strict Silence is Control + X for some reason,

01:52:10   they also use only Shift,

01:52:12   like Shift + F for select all forward.

01:52:15   My favorite thing about Logic is that

01:52:17   they have many commands that are only,

01:52:20   like single letter keystrokes, like A, that's a command.

01:52:24   The best thing is that the text fields in Logic

01:52:27   sometimes deselect themselves

01:52:29   while you're typing for no reason.

01:52:31   And so you are typing a word into your chapter title,

01:52:34   it loses focus for no apparent reason sometimes,

01:52:37   and then you finish your word,

01:52:39   which has maybe four or five regular letters in it,

01:52:42   and the entire interface to the app has changed

01:52:45   and something's on, the metronome's ticking

01:52:47   and your automation is showing and everything,

01:52:48   and you're like, what the hell just happened,

01:52:50   and how do I get it back?

01:52:51   And oftentimes the answer is, who knows?

01:52:54   Quit, don't save changes and reopen the file.

01:52:56   - You're like, there's no auto-save on.

01:52:57   Yeah, that is another cultural thing.

01:53:00   Lots of pro applications do that.

01:53:01   Photoshop is an example, B for Brush Tool,

01:53:04   M for bucket. - M for move,

01:53:05   or V for move. - Right,

01:53:07   the left and right bracket for change brush size.

01:53:09   In a pro applications that have tons of feature

01:53:12   that are used all day long,

01:53:13   single unmodified letters become

01:53:17   a useful feature that people like,

01:53:18   because it's just such a pain in the butt to use,

01:53:21   but they're dangerous, as Marco just pointed out.

01:53:23   If single letters unmodified can do something

01:53:25   and a cat walks across your keyboard,

01:53:27   you better hope your app doesn't have auto-save

01:53:29   or it has a very long undo history,

01:53:30   because who knows what just happened.

01:53:33   It's true of some Unix utilities.

01:53:34   One of the things that we've all always loved

01:53:37   about NetNewswire and continue to love

01:53:39   is that it uses keystrokes that are very much like,

01:53:41   I loved it because they were much like

01:53:43   the tin internet news reader

01:53:46   for a terminal-based internet news reader for Usenet.

01:53:49   The keyboard, when I first used NetNewswire,

01:53:51   I'm like, this is just like a gooey version of tin.

01:53:53   Single unmodified letters to do stuff,

01:53:54   K to mark as red, space bar to go down to the next page

01:53:58   and then skip to the next unread article

01:54:00   if you're at the end of the thing,

01:54:01   right, left and right arrow keys to navigate.

01:54:03   That can be a very powerful practice,

01:54:08   and it gets you out of the business

01:54:09   of trying to figure out a million different

01:54:12   modified keyboard shortcuts for everything you can do.

01:54:14   A good Mac app like NetNewswire will still support

01:54:17   all of the command shortcuts that you would imagine.

01:54:19   There's probably a command something to mark as red

01:54:21   and a command something to go,

01:54:22   but having those single letter shortcuts

01:54:25   is also very powerful.

01:54:26   And by the way, for people who don't know,

01:54:27   because Mac is, Mac OS, Mac OS X,

01:54:30   whatever the hell it's called, Mac OS,

01:54:32   is built on Nextstep,

01:54:32   which is built by a bunch of Unix nerds,

01:54:35   the standard text fields in the Mac

01:54:37   will respond to essentially Emacs key bindings.

01:54:40   So you can do control A to go beginning of the line

01:54:42   and control E to go to end

01:54:43   and very often control K to kill and control Y to yank.

01:54:47   And that stuff actually works.

01:54:49   Like the control key is out there

01:54:50   available for Unix-y commands.

01:54:52   And in most text views on the Mac, they will work.

01:54:55   If you know those keyboard commands,

01:54:57   I don't recommend them.

01:54:58   Like you can use up and down arrow to do the same thing

01:55:01   and command shift to select,

01:55:04   command option to go a word at a time.

01:55:06   There's a million different shortcuts,

01:55:07   again, with the cultural logic,

01:55:09   the understanding that shift arrow should select as you go

01:55:12   and shift option arrow should go a word at a time

01:55:15   and command should go, you know,

01:55:16   move the cursor a word at a time

01:55:18   and all sorts of things.

01:55:19   Like if you start to learn those,

01:55:22   it will be worthwhile because they are repeated

01:55:25   throughout the entire OS

01:55:26   and throughout most popular applications.

01:55:29   And for the pro applications, they also have,

01:55:31   I mean, I'm sure there's some sort of cultural standard

01:55:35   in audio editing applications.

01:55:36   I don't know what it is, but for example,

01:55:38   a lot of the graphic stuff I described

01:55:40   came from like Mac Paint and Super Paint

01:55:42   and Mac Draw and Illustrator

01:55:44   and eventually came to Photoshop

01:55:46   and from there spread to the whole world.

01:55:47   And so there is, that's also worth learning

01:55:50   because even though it's essentially arbitrary,

01:55:53   if you learn it once, you will have a leg up

01:55:55   when using any other app in that category.

01:55:58   - I think my favorite keyboard shortcut of all time,

01:56:00   which I used to use a lot

01:56:01   when I was working with other people,

01:56:04   is an Xcode if you do shift control,

01:56:09   option command C.

01:56:12   So that is four modifiers and the C character,

01:56:16   you get copy qualified symbol names.

01:56:17   So if I were to do that on a view controllers,

01:56:20   view did appear, what I get is,

01:56:22   view controller dot view did appear

01:56:24   parenthesis underscore colon parenthesis.

01:56:27   So that's basically saying,

01:56:28   this is the real honest goodness official name

01:56:31   for this particular function.

01:56:33   And it is very useful if you're trying to tell somebody else

01:56:36   like you need to look at here, you can do that,

01:56:38   but that requires again, shift control, option command C.

01:56:43   Literally all of the fingers on a regular human's hand

01:56:46   in order to do this one keyboard shortcut.

01:56:48   - But it's saving you time.

01:56:50   - You should look for the web for,

01:56:51   I think it's called save for web claw.

01:56:53   Like there's a command that was added to Photoshop

01:56:56   when the web came out, which is save this image for the web,

01:56:58   which would save like a heavily compressed version of it

01:57:00   with selectable color palettes,

01:57:02   like a different alternate way to save a different version

01:57:04   of Photoshop document specifically made for the web.

01:57:08   And because all the good shortcuts were taken in Photoshop,

01:57:11   it's like command option shift S or something.

01:57:14   But you do it so often as a web dev

01:57:16   that it becomes sort of second nature.

01:57:18   Like again, like I described

01:57:20   what I think is the keystroke.

01:57:21   I don't actually know, like most of the Emacs key bindings,

01:57:24   I don't know what they are, but my hands know.

01:57:26   So I don't think about it, I just go save for web

01:57:28   and it happens and my hands did something

01:57:30   to the keyboard when that happened.

01:57:32   Just like when I split the buffer

01:57:33   and move from one to the other,

01:57:34   I don't actually know the keystrokes to do that in Emacs,

01:57:36   but my fingers know.

01:57:37   Anyway, there's a meme of taking a picture

01:57:40   of how you can torque your fingers

01:57:42   to do this keyboard shortcut.

01:57:44   And there's lots of different variations.

01:57:45   If I knew the exact name, we could find the meme,

01:57:47   but it's somewhere on the web.

01:57:49   - Save for webclaws.tumblr.com.

01:57:51   - Oh, of course there's a Tumblr.

01:57:53   - Of course there's a Tumblr.

01:57:55   And it is indeed a bunch of people

01:57:57   doing all sorts of different displays

01:57:59   of how they do their save for web claw.

01:58:02   This is something else.

01:58:04   I've not heard of this 'cause I'm not a Photoshop user.

01:58:07   That is, wow.

01:58:09   - I don't play claw in Destiny, by the way.

01:58:11   - That's good to know.

01:58:15   Thank you for that.

01:58:16   - It's all right.

01:58:17   - Goodness.

01:58:18   - Some of these save for webclaws,

01:58:18   you're like, seriously?

01:58:19   That's how you choose to do it,

01:58:20   but everyone's got their own way.

01:58:23   - All right, let's finish up with something

01:58:25   that I hope will be quick.

01:58:26   We'll see what happens.

01:58:27   Jesse in South Dakota writes,

01:58:28   "I'm curious how you all name your wifi networks.

01:58:31   Is it something plain like Liss Household

01:58:33   or something punny like tell my wifi I love her

01:58:36   or a pop culture reference like Skynet?

01:58:39   Do you or do you not broadcast your SSID?"

01:58:41   For me, I have been broadcasting my SSID

01:58:44   since like a couple of years after wifi was new.

01:58:48   So if you're not an old man like me,

01:58:51   when wifi was brand new,

01:58:53   the initially accepted thing to do,

01:58:56   at least when you were of the age of Marco and me

01:58:59   at the time, was you don't broadcast your SSID

01:59:02   and you would have to tell people your SSID,

01:59:04   but you have no other security whatsoever.

01:59:06   So it is by every definition, security through obscurity.

01:59:09   And because you didn't broadcast your SSID at the time,

01:59:14   what that meant was people would need to know

01:59:15   that your SSID was like Liss or whatever

01:59:18   in order to get on your network.

01:59:20   But once they knew it,

01:59:21   they would have the keys to the kingdom.

01:59:23   And to answer the other question,

01:59:25   the initial question, my network name is indeed Liss.

01:59:27   I kind of wish there was something more pithy

01:59:29   or punny or something, but I'm old and boring.

01:59:32   And so it's just called Liss.

01:59:34   Marco, I don't recall your network name

01:59:36   offhand, but I remember it being funny

01:59:38   if you're willing to share.

01:59:39   And do you or do you not broadcast your SSID?

01:59:42   - I do broadcast it.

01:59:44   And this is like a weird joke that I picked up forever ago,

01:59:49   back when I was a something awful forums goon

01:59:53   in my teenage and early 20s years.

01:59:57   And so kind of playing off of a joke

02:00:00   that I picked up all the way back then,

02:00:02   my SSID is trapped in a router factory.

02:00:06   - That's right, I'd forgotten that.

02:00:08   I should also do some real time follow up.

02:00:09   Underscore, my name is T.

02:00:10   Writes, all of Casey's life is Liss puns

02:00:13   and he just calls this wifi.

02:00:15   - I was just about to say the exact same thing.

02:00:16   How is it that you of all people do not have a pun based?

02:00:21   - It should be wireless.

02:00:22   That's what it should be.

02:00:23   - Exactly, I can't even believe it.

02:00:25   I don't understand how you allowed this to happen to you.

02:00:27   And then Marco's got the joke one.

02:00:29   - I know, I'm sorry everybody.

02:00:30   I failed you and I failed me.

02:00:31   - You have, you need to change that right away.

02:00:34   - Goodness, John, what's your situation?

02:00:35   - Mine is boring, it's not a joke one.

02:00:37   I do broadcast it.

02:00:38   Yeah, I don't, I like seeing other people's

02:00:43   but I, trapped in the router factory is a little long.

02:00:46   Like I don't like it when someone has a funny SSID

02:00:48   and it makes the menu really long.

02:00:49   I don't like that.

02:00:50   So I think try to keep it short and snappy.

02:00:54   But I am not opposed to a joke wifi.

02:00:56   But no, mine just has a boring obvious name.

02:01:00   Please say it's called wifi.

02:01:02   It is not called, that's a stupid name.

02:01:05   The real question is, does Marco know what Skynet is?

02:01:08   - No, I don't.

02:01:09   - Really?

02:01:10   - I know it's from a movie,

02:01:11   but it's from a movie I haven't seen.

02:01:12   - Pop culture reference, but it gets past Marco.

02:01:15   - Wow, even I know that one.

02:01:18   - That's why I asked Marco, I had faith in you Casey.

02:01:20   - Thank you John.

02:01:21   I did see a few weeks ago, I forget where I was.

02:01:23   Now I don't recall, but I saw a few weeks ago,

02:01:26   Silence of the Lands, which I had tweeted about,

02:01:28   which I thought was quite great.

02:01:30   That's the first time I'd seen it, yeah.

02:01:32   I thought it was great.

02:01:33   - Oh my goodness.

02:01:33   Well, my faith in you has gone down, I'm adjusting.

02:01:36   - Oh man, I should have kept my mouth shut.

02:01:38   - Thanks to our sponsors this week,

02:01:39   Squarespace, Collide, and Jamf Now.

02:01:42   And we will talk to you next week.

02:01:44   (upbeat music)

02:01:47   ♪ Now the show is over ♪

02:01:49   ♪ They didn't even mean to begin ♪

02:01:52   ♪ 'Cause it was accidental ♪

02:01:54   ♪ Oh it was accidental ♪

02:01:57   ♪ John didn't do any research ♪

02:01:59   ♪ Marco and Casey wouldn't let him ♪

02:02:02   ♪ 'Cause it was accidental ♪

02:02:04   ♪ Accidental ♪

02:02:05   ♪ It was accidental ♪

02:02:06   ♪ Accidental ♪

02:02:08   ♪ And you can find the show notes at ATP.FM ♪

02:02:13   ♪ And if you're into Twitter ♪

02:02:16   ♪ You can follow them at C-A-S-E-Y-L-I-S-S ♪

02:02:21   ♪ So that's Casey List M-A-R-C-O-A-R-M ♪

02:02:26   ♪ N-T-M-A-R-C-O-R-M-N ♪

02:02:29   ♪ S-I-R-A-C ♪

02:02:31   ♪ U-S-A-C-R-A-C-U-S-A ♪

02:02:34   ♪ It's accidental ♪

02:02:35   ♪ It's accidental ♪

02:02:37   ♪ They didn't mean to accidental ♪

02:02:41   ♪ Accidental ♪

02:02:42   ♪ Tech podcast so long ♪

02:02:45   - Man, there really are a lot of really boring,

02:02:49   terrible WiFi networks out there.

02:02:51   Like, most of what I could pick up from here

02:02:53   is just like, you know, people's default routers.

02:02:55   It's like, you know, Fios and random characters.

02:02:58   I have three of those in range.

02:03:00   - Xfinity is the scourge of all existence.

02:03:03   The Xfinity ones are all just called Xfinity WiFi.

02:03:05   It's the worst.

02:03:06   - Yep, Xfinity WiFi, yeah.

02:03:07   There's also DirectCD HP OfficeJet 5740,

02:03:11   so somebody's printer is advertising something.

02:03:13   - Yeah, printers in Xfinity is just a wasteland.

02:03:17   - There's a weird thing I really don't like

02:03:19   when iOS has those carrier-specific WiFi networks

02:03:24   that it'll just auto-join without even asking you,

02:03:27   and it's surprisingly hard to get iOS

02:03:29   to stop auto-joining those and remember your preference.

02:03:32   - I just have iOS not auto-joining networks ever

02:03:36   and also not asking me ever.

02:03:38   - No, no, that's, even if you have that,

02:03:40   like, you know, I'm on AT&T for my phone service.

02:03:43   Even if, I always have auto-join off,

02:03:46   except for like in the networks that I add,

02:03:47   so like, you know, it never prompts me

02:03:48   to join a WiFi network, but there's some way for AT&T

02:03:54   to communicate to the phone to always rejoin

02:03:57   these networks automatically.

02:03:59   Like, I think it's a security hole, honestly.

02:04:01   Like, I wonder, like, if I just create a network

02:04:05   called AT&T WiFi, will every AT&T phone

02:04:07   automatically join it?

02:04:08   Is it just matching the string,

02:04:11   or are these somehow authorized to only, like,

02:04:13   certain routers with, like, Mac addresses or something?

02:04:15   I don't even know, but somehow it is,

02:04:19   like, I guess maybe it's part of the SIM card

02:04:22   or the SIM standard, the carrier settings, whatever it is.

02:04:25   Somehow, iOS lets carriers make your phone

02:04:29   auto-join networks without asking you,

02:04:31   and that, I think, is really weird,

02:04:34   and like, it always gives me the creeps when I see it,

02:04:35   and I always get mad, and then I try to leave the network,

02:04:38   and sometimes it'll remember that I left it

02:04:40   and it won't rejoin it.

02:04:41   Sometimes you have to join it and then say,

02:04:43   "Forget this network," and it's really messed up.

02:04:46   I think that's gotta be a security hole waiting to happen.

02:04:50   - How many WiFi networks are visible

02:04:52   from where you're sitting right now?

02:04:53   - Seven, but two of them are mine.

02:04:56   - Casey?

02:04:57   - 30, 31, 32, 33.

02:04:59   (Casey laughs)

02:05:00   - Casey's the winner, I'm at 19.

02:05:02   - Yeah, I'm lucky that most of my neighbors

02:05:03   are not that technical.

02:05:04   - How many are insecure?

02:05:06   How many don't have the little lock symbol?

02:05:08   - None.

02:05:09   - Only Xfinity WiFi.

02:05:11   - Xfinity WiFi, that's my only unlocked one.

02:05:15   I've got an all-caps Xfinity that is secure,

02:05:17   but Xfinity WiFi is insecure.

02:05:19   - Wow, that Xfinity, it goes all the way

02:05:21   from Boston to Richmond, that is some powerful WiFi.

02:05:24   - My experience is that any insecure network

02:05:26   that says Xfinity WiFi is not a real WiFi

02:05:29   that anyone can or should join.

02:05:31   I've literally never seen an Xfinity WiFi that's insecure

02:05:33   that can actually be joined by a computer.

02:05:35   I don't understand what it is.

02:05:37   I'm assuming Comcast sends out a bunch

02:05:39   of these WiFi routers and they end up being misconfigured

02:05:41   and they advertise a network that literally can't be joined

02:05:44   and it always shows as insecure.

02:05:46   Not that I'm ever intentionally joining them,

02:05:47   but sometimes you're desperate and you're like,

02:05:48   "I just gotta get some WiFi."

02:05:49   And if I see Xfinity WiFi and it's insecure,

02:05:52   sometimes I'll try it and just out of idle curiosity,

02:05:54   but it'll never actually connect.

02:05:56   It's not a real network.

02:05:57   - Well, no, I don't think that's true.

02:05:59   So I am not confident about the following,

02:06:02   but I think the way it's supposed to work

02:06:04   is that if you are an Xfinity subscriber,

02:06:07   and only if you're an Xfinity subscriber,

02:06:09   then you can basically ride on any Xfinity subscriber's WiFi,

02:06:14   unsecured WiFi.

02:06:16   I'm not sure what the auth dance story is around that.

02:06:19   - But yeah, if you're not, it's just a fake network

02:06:22   that's just there to distract your computer/phone.

02:06:26   - Did you ever read about the thing

02:06:28   about the free public WiFi SSID

02:06:31   that kind of spreads itself somehow?

02:06:34   - You see it at WWDC even.

02:06:35   WWDC is a great place to look at SSIDs

02:06:39   'cause they're all over everybody's,

02:06:40   what is that, Verizon thing, starts with an M, WiFi maybe?

02:06:44   - Yes, I believe that's right.

02:06:45   - There's a million of those, everybody's phones,

02:06:48   have their little hotspots

02:06:49   that are all named default things.

02:06:51   You don't see a lot of Xfinity at WWDC though.

02:06:54   So I think everybody who's in my WiFi vicinity

02:06:57   is a PC user 'cause I am the only person

02:07:00   with spaces in my SSID.

02:07:01   - Oh, is that a Mac versus PC thing?

02:07:04   - No, it's just a Mac people understand

02:07:06   that words are separated with spaces

02:07:07   and PC people are like, "Can't have spaces in words,

02:07:10   "nothing will work, add hyphens or underscores

02:07:12   "or squish all the words together or make it all caps."

02:07:14   And it's like, no, you can name your things with words

02:07:18   but spaces between them, like a civilized person.

02:07:21   - Oh my goodness.

02:07:23   - That's one of the first things I did with front and center

02:07:25   by the way, when Lee started the project,

02:07:27   he called it like front hyphen and hyphen center

02:07:29   was the project name, like no.

02:07:31   It's called front space and space center

02:07:34   with capital F and capital C and lowercase a,

02:07:37   like a civilized--

02:07:38   - Wait, that's actually like all the files

02:07:39   in Xcode and everything, they have spaces in the paths?

02:07:42   - The project is called that, the files are called

02:07:44   like FNC app delegate.swift or whatever, right?

02:07:48   But for the project--

02:07:50   - It isn't like front space and space center.info.plist

02:07:54   or whatever, 'cause you're just asking for problems.

02:07:57   - It is, where it uses the project name,

02:08:00   it does it with spaces and that's where you can find out,

02:08:03   lots of people post like, "Here's the build script I used

02:08:06   "to increment my build number," or whatever

02:08:08   and they don't properly put the shell script.

02:08:11   But everything, as far as I can tell,

02:08:12   everything in Apple system from top to bottom

02:08:15   doesn't care if you have spaces.

02:08:16   Like everything is properly quoted in,

02:08:18   like no problems whatsoever and it is used

02:08:21   in lots of places if you look at like the command lines

02:08:23   it's running or how it builds stuff.

02:08:25   No problem with spaces.

02:08:27   - That's asking for trouble.

02:08:29   I wouldn't do that.

02:08:30   - It's not though, as I'm saying,

02:08:31   I thought it might be an issue, right?

02:08:33   But not at all.

02:08:34   Modern technology, like this is a solved problem.

02:08:38   It's only when people are sloppy and just like

02:08:40   make this assumption that like, oh, there'll never be spaces

02:08:43   and file names and the people who make those assumptions

02:08:44   are bad people who aren't Mac users.

02:08:47   - No, no, they are and they write build scripts

02:08:49   and they write Xcode at Apple and like they,

02:08:52   you're right, this isn't a technology problem,

02:08:54   it's a people problem and people make mistakes all the time

02:08:57   and by having spaces in your programming paths,

02:08:59   like you're just kind of inviting a whole bunch

02:09:02   of mistakes to hit you.

02:09:04   - It's a cultural thing.

02:09:05   It's like that they believe in their heart of hearts

02:09:07   that people shouldn't be allowed to use spaces

02:09:09   and therefore they code as if that will never be a thing

02:09:11   that happens, so that's why they're bad.

02:09:13   They're bad if you, like, do you remember the thing

02:09:14   where the iTunes installer would delete your hard drive?

02:09:17   Remember that?

02:09:18   That was because someone didn't think hard drives

02:09:20   and could have spaces in it.

02:09:21   It's like the default hard drive name has spaces in it.

02:09:24   Macintosh Space HD.

02:09:27   But that was clearly like a Unix person who's like,

02:09:29   oh, you don't put spaces in file names.

02:09:32   I don't have to worry about that case

02:09:33   and it deletes people's drives.

02:09:34   - Yeah, wasn't there a Chrome update that did that too?

02:09:36   - Yeah, just recently.

02:09:37   - It wasn't the kind of spaces though, was it?

02:09:39   - No, I think it was something like that.

02:09:40   Anyway, I don't know.

02:09:41   I feel like you're being optimistic here

02:09:43   'cause the problem is, you know, it's one thing

02:09:45   when you're just dealing with arbitrary file names

02:09:47   in an application, fine, but programming paths in particular

02:09:51   rarely have spaces in them, and so if you're using

02:09:54   some kind of programming environment or script

02:09:56   or tools or whatever else, I think it's more likely

02:09:59   than other contexts to have not been tested properly

02:10:03   with things with spaces in them because it's so rare

02:10:05   in programming directory trees.

02:10:07   - It's true, and the kind of person who's a programmer

02:10:09   is also more likely to be the kind of person

02:10:11   who is in the mindset that you just shouldn't use spaces

02:10:14   anyway so you should be punished if you use them

02:10:15   or not have to worry about it, but like I said,

02:10:18   I thought that was a possibility when I made the new project

02:10:21   for Swift for front and center, but so far,

02:10:24   like nothing in Xcode has blinked at it,

02:10:28   like no problems whatsoever, and I see in the build logs

02:10:31   and all the other stuff and all the different, you know,

02:10:33   the files it makes and the symbols and all that,

02:10:35   like it's fine, it's absolutely fine.

02:10:37   So if you're afraid of doing an Xcode, don't be afraid

02:10:40   because, and I would imagine Xcode at this point

02:10:41   is so well-exercised and so many,

02:10:43   there are so many Apple developers that surely

02:10:45   there are enough of us putting spaces in it

02:10:46   that if there's something in the guts of Xcode

02:10:49   that can't handle spaces, it would be found really quickly.

02:10:51   So my experience has been Xcode project names

02:10:55   with spaces in them, thumbs up.

02:10:56   (beeping)