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)