A Casey Settings Screen

Episode 364 • Released February 6, 2020 • Speakers detected

Episode 364 artwork
00:00:00 John: Hyper elite web developer.
00:00:01 John: I would have gone with 1.3.3 plus.
00:00:03 John: That's what I would have gone with.
00:00:05 John: Plus?
00:00:05 John: I've never seen that.
00:00:06 John: It's like a T. Yeah, I don't know if I would have used plus.
00:00:09 Casey: I can get behind the one.
00:00:10 John: Because you're not hyper elite.
00:00:11 Marco: I understand why you wouldn't have gone with plus.
00:00:14 Marco: I mean, I get it.
00:00:15 Marco: I've just never seen it written that way.
00:00:17 Marco: That's right, because you weren't ready to be that elite.
00:00:20 Casey: I debated between the T and the seven, and I went with the T. And I can absolutely see the one.
00:00:26 Casey: I'm right there with you with the one.
00:00:27 Casey: But the plus, I agree with Marco.
00:00:30 Casey: That came out of left field.
00:00:31 John: No, usually it's a seven.
00:00:32 John: You have both attained a new level of leateness today.
00:00:35 John: It has to be either a T or a seven.
00:00:37 John: That's the levels one and two.
00:00:39 John: Plus, you go to the next level.
00:00:42 John: It just blows people's minds like he's so leateness.
00:00:44 John: It's a plus for a T. That's madness.
00:00:47 Casey: so if uh if i command click on safari which one would think would on the dock which one would think would open a new safari window would you not i get a command command click reveals it in the finder what are you talking about so maybe i'm just a moron because anytime i do that i get a new finder window so i guess i am a moron when you when you hold down the command key and click on the finder window finder icon in your dock it should show the finder application in the finder
00:01:13 John: or whatever you know what i mean you know what i'm saying oh yeah you're right okay well at least i know i'm an idiot and and it's expected behavior command option click on a folder does what click should do on a folder god i wish i could change that can i get an agreement on that by the way a single clicking with the regular plain old left mouse button on a folder that is in your dock should open that folder in the finder oh you mean rather than doing the like
00:01:37 John: explode out rather than doing one of the other two things it does neither of which I ever want why do I get a feeling that we're hearing the genesis of app number two or three or seven if only if only I could do that type of stuff we don't know a little world where you can hack the doc anymore
00:01:56 Casey: The struggle is real.
00:01:58 John: But do either one of you use like the springy out bendy tower thing or the giant grid of icons that you can never find anything in?
00:02:05 Casey: I use the giant grid of icons that you are correct.
00:02:07 Casey: I can never find anything for downloads and only downloads.
00:02:10 Casey: And that is the only folder that is in my dock.
00:02:12 Marco: I use it for downloads constantly, but I only scroll to the bottom and hit show in Finder or whatever.
00:02:20 John: Marco, I'm going to give you the advanced technology.
00:02:22 John: Just hold down command and option and click on downloads and it will just open.
00:02:25 John: And then you can sort reverse by date.
00:02:28 Casey: That is very clever.
00:02:29 Casey: I did not know that.
00:02:30 Marco: Yeah, because I keep downloads sorted by date descending.
00:02:33 Marco: And what has always annoyed me about those folder stack things in the dock is that they completely ignore the settings that you have to sort files.
00:02:41 Marco: And also, you can't right-click on them and get a context menu on the things in there.
00:02:46 John: i would suggest uh sorting your downloads folder by date added rather than date modified because sometimes it's possible to to get things that like unzip and have a modification date that's in the past and they aren't at the top so if you sort by date added descending and you always command option click on the downloads folder it will open a finder window i think that should either be the default behavior or one of the choices if you like the bendy stack fine go for it if you like the big grid fine but what if you just want the window to open in the finder
00:03:13 John: that would be nice too totally agreed i've been command option clicking on the now yeah now that i used to use a drag thing doc for this used to have no folders in my doc and i had a drag thing doc that was down in the lower right corner you know that had folders in it and when you clicked on them they opened their windows in the finder that was cool
00:03:32 Casey: You really had your world rocked by drag things disappearance, didn't you?
00:03:38 John: I mean, it's not that bad.
00:03:41 John: Because the screen is so big, I've got a lot of room for folders in the dock now.
00:03:44 John: And I'm so accustomed to command option clicking folders in the dock that it is a pretty ingrained habit.
00:03:53 John: But every once in a while, it bothers me when I remember that that...
00:03:56 Casey: that i have to keep doing that i'm sorry for your struggles john are you i don't remember you're a side doc person is that right nope you're bottom docker i thought i i thought you were and then i convinced myself no john wouldn't do such a barbaric thing do you at least hide it automatically at least nope john
00:04:15 John: Hidden Doc is the worst.
00:04:17 Casey: I don't want to go in there and wait for a thing.
00:04:19 Casey: What is this, iOS?
00:04:19 John: I got to drag my finger to the bottom of the screen and wait?
00:04:22 John: No.
00:04:23 John: No waiting.
00:04:25 Casey: Why, John?
00:04:26 Casey: Why?
00:04:26 Casey: Why the bottom?
00:04:27 John: My screen is really big.
00:04:29 John: Believe me, I'm not hurting for screen real estate.
00:04:32 Casey: Now I will allow it.
00:04:33 Casey: But before now, no.
00:04:36 Marco: I did it on side on laptops because they were too small.
00:04:39 Marco: On laptops, I always do left side.
00:04:41 Marco: But on laptops, I do auto hide.
00:04:42 Marco: On desktops, I don't.
00:04:43 John: Interesting.
00:04:45 John: You're not a lefty, are you, Marco?
00:04:47 John: No.
00:04:48 John: No, left side is the correct side.
00:04:49 John: Left side dock is madness.
00:04:52 John: Why?
00:04:53 John: It's just plain madness.
00:04:55 John: Why?
00:04:55 John: I read from left to right.
00:04:56 John: Right, exactly.
00:04:57 John: So it should be left to right, top to bottom.
00:05:00 John: The upper left corner, especially on a small screen, is the most prominent location.
00:05:04 John: The dock shouldn't be there.
00:05:06 John: It's an auxiliary thing.
00:05:08 John: It should be far away from the upper left.
00:05:10 Casey: It's not there.
00:05:10 Casey: It's auto-hidden.
00:05:12 Casey: oh and doc is also madness hey let me let me really piss you off do you auto hide the menu bar too no no no uh even worse no that's barbaric i mean if you had 11 inch laptop maybe i guess i do have an 11 inch laptop but uh no i or 12 inch strictly speaking i i like the uh i like genie mode and i like magnification magnification i could take or leave genie is the default right so then everyone's using unless they change it
00:05:39 Casey: Most people are very, very angry when I mention that I use magnification.
00:05:46 Casey: I quite like it.
00:05:47 John: I mean, it doesn't actually change the size of the targets, really, at least width-wise.
00:05:54 John: I could take it or leave it.
00:05:58 John: I don't use it personally, but I don't think it's so terrible.
00:06:01 Casey: You are right that I shouldn't give you too much flack since you do have a monitor that's approximately the same size as your main television.
00:06:08 Casey: But I still think left side's where it's at, personally.
00:06:12 John: Yeah.
00:06:13 John: I got a lot of windows open these days.
00:06:15 Casey: Let me tell you.
00:06:16 Casey: Speaking of your monitor, that's a perfect segue to begin follow-up.
00:06:19 Casey: Pro Display XDR reference modes.
00:06:22 Casey: Would you mind telling me about this?
00:06:23 John: god we can't escape this topic this is one more thing i swear the last one last time someone someone wrote in about like the uh about using true tone and how they endorsed it and they mentioned this iso spec iso 12646 uh well one of the uh anonymous experts about the pro display xdr chimed in and said one of the reference modes for the pro display xdr is
00:06:44 John: is exactly for ISO 12646.
00:06:47 John: You can set it to this mode, and then it disables True Tone, and it sets it to this mode that is apparently super warm, and then if you have your room set up the way that ISO spec says you're supposed to have your room set up, there you go.
00:06:58 John: You're all ready to do whatever the hell it was, soft-proofing on printed materials.
00:07:04 John: Boy, you can really just spend all day going through the 800 reference modes supported by this and watching each one of them and going, ugh, that looks weird.
00:07:13 John: Probably just because your room isn't set up right.
00:07:15 Casey: I'm surprised you haven't gone full THX tune-up or whatever it's called on your monitor yet.
00:07:20 John: Well, that's the whole point.
00:07:21 John: I bought it from them.
00:07:22 John: It's calibrated at the factory.
00:07:23 John: They put it on with the undercoating.
00:07:25 Casey: Well done.
00:07:31 Casey: Oh, my goodness.
00:07:31 Casey: All right, so no other Mac Pro follow-up?
00:07:34 Casey: That's it?
00:07:34 Casey: That's all we have?
00:07:35 John: I think the only other, I mean, if you're asked for some, I do have some.
00:07:39 John: I continue to assess the internal storage situation on my Mac.
00:07:44 John: There are many options for sticking every kind of storage you can imagine inside here.
00:07:48 John: You can put, I think, six 3.5-inch hard drives in here if you want.
00:07:54 John: You can put in six or seven PCI cards, which can hold up to four M.2 SSD thingies.
00:08:05 John: You can put in a $400 rack mount thing that you can put two 3.5-inch drives in or two 2.5-inch drives.
00:08:13 John: All these options are very expensive and none of them I find particularly satisfactory at this moment.
00:08:18 John: I would have already bought that two-drive Pegasus thingamabobber that Stephen Hackett bought if it didn't cost $400 and come with an 8-terabyte 3.5-inch hard drive that I don't want.
00:08:30 Marco: Yeah, that's fair.
00:08:31 John: I continue.
00:08:32 John: Maybe Stephen will get tired of it and he'll sell his old one to me.
00:08:35 John: I'm looking for them on eBay.
00:08:36 John: I just want the thing with no drives in it.
00:08:39 John: I've got drives.
00:08:40 John: I don't need your drives.
00:08:41 John: I just want a convenient little case to mount things in.
00:08:45 John: Uh, and so I'm still waiting on that and it's kind of frustrating because right now, like I'm, I'm backing up time machine to this dinky little external 2.5 inch spinning hard drive that I have.
00:08:57 John: Uh, and it's a pain to have to connect it every once in a while, let it do its thing.
00:08:59 John: And I don't want to leave it connected because it's just weird to have dangling.
00:09:02 John: Anyway, I got a lot of room in my case, still haven't filled it.
00:09:05 John: And I'm still waiting for the new video cards to come out.
00:09:08 John: They have still haven't released the supposed W 5700 XT or whatever it is that they've been advertising forever.
00:09:15 John: So, you know, the way it continues, partially on Apple and partially on third-party people.
00:09:21 John: I can't believe that OWC or somebody hasn't just come out with, like, the $50 version of an empty bracket where you can stick drives.
00:09:29 John: Because Pegasus made one, but they just insist on making you buy an 8-terabyte drive for $400, which is kind of cruddy.
00:09:35 Casey: I'm so sorry.
00:09:37 Casey: All right.
00:09:37 Casey: We should also clear the air with regard to iPad multitasking.
00:09:42 Casey: I went on a bit of a rant last week moaning about how I don't care for the way iPad multitasking is.
00:09:48 Casey: And I think all of us were moaning at some point or another about this.
00:09:51 Casey: Us?
00:09:52 Casey: Yeah, us?
00:09:53 Casey: No.
00:09:55 Casey: Yeah.
00:09:55 Casey: I in particular went on a bit of a rant with regard to how you get iPad multitasking to work when you are trying to load something that is not in your dock.
00:10:05 Casey: And, you know, what I had said was you can go back to the home screen and then pick up an icon and then it's like doing the little dancey thing, but you don't want it to do the dancey thing, blah, blah, blah.
00:10:13 Casey: And people pointed out to me that one approach, I'm probably going to get the exact order of operations wrong, but the idea is another approach to handle this is you open app one,
00:10:22 Casey: go to the home screen, open app two, and then app one should be on the right hand side of your dock in that like recents area.
00:10:31 Casey: And then you can just grab it right there and put it into one of these side panels that you would like it to be in.
00:10:37 Casey: So that is a little bit better and a little bit easier.
00:10:39 Casey: And I should have known that, but nevertheless, I still find it to be extremely frustrating and
00:10:45 John: Unless you have that disabled.
00:10:46 John: I think I have recents disabled.
00:10:48 Casey: There is an option to disable it, I'm almost sure.
00:10:50 Casey: But to be fair, I have not disabled it to the best of my knowledge.
00:10:53 John: I have disabled it, but I've used that same technique, like trying to launch it again to get it in the, like, I don't know, maybe I have it disabled on some devices and don't on others, but yeah.
00:11:02 John: I don't want, I have to say, I have recent apps disabled in my Mac doc and also in every iOS device that I could remember to do it on because I don't want other stuff filling there.
00:11:13 John: Like I kind of, I fill the bottom doc with a bunch of stuff and I don't want other things randomly hopping in there just because I use them recently.
00:11:19 John: So that kind of kills that technique, but I still find myself doing it like launching it the regular way as a,
00:11:27 John: as a way to get it available for multitasking maybe i just do that instinctively and it doesn't work and i just go back to the the way you described the last time i don't even know it's it's confusing the thing i i played with this a little bit more after the show to say maybe there are other obvious ways that i'm forgetting and it just really kills me that in multitasking view on the ipad where you see little miniature versions of all your open apps that you can't just grab them and like drag them on top of each other like that that functionality as far as i'm aware is not actually used for anything
00:11:54 John: And it's just so obvious, like, here they are.
00:11:56 John: Do you want to squish them together?
00:11:58 John: Grab one and squish them together.
00:12:00 John: Like, nope, you can't grab them here, even though these are cute little pictures of all your apps.
00:12:03 John: They're not for your grabbing.
00:12:06 John: They're just for you to view and enjoy.
00:12:08 John: No grabbing.
00:12:11 John: Again, unless there's some weird, you know, three-finger, stand-on-one-foot-long press-tongue gesture that I don't know about.
00:12:20 John: Wow.
00:12:22 Marco: We are brought to you this week by Squarespace.
00:12:25 Marco: Start building your website today at squarespace.com slash ATP.
00:12:29 Marco: Enter offer code ATP at checkout to get 10% off.
00:12:32 Marco: Make your next move with a beautiful website from Squarespace.
00:12:36 Marco: Squarespace makes it super easy to make websites.
00:12:39 Marco: It's as simple as that.
00:12:40 Marco: Look, most of you have probably heard this message a million times.
00:12:42 Marco: Let me tell you why you really want to choose them.
00:12:44 Marco: I know that a lot of our listeners, myself included, are able to make our own websites other ways, using CMSs that other people make, that we install, or other services, or building our own from scratch, which is usually the method I take.
00:12:57 Marco: But the reality is, most of the time, that's not worth our time.
00:13:01 Marco: And Squarespace does a lot of things better than what we can do ourselves.
00:13:04 Marco: So for instance, if I had to make a storefront, a gallery, or things like this, Squarespace does that super easily, all built in, way better than I could do it, and it takes me no time because I didn't have to build it.
00:13:18 Marco: If you're making a website for yourself, or what happens a lot to nerds like us, if you're making a website for somebody else, somebody else has asked you to, hey, help me make my website better,
00:13:26 Marco: It's so much easier and so much more time efficient to just go to Squarespace and do it there because you can set up a website in no time at all.
00:13:33 Marco: And they'll support it.
00:13:35 Marco: You don't have to support it.
00:13:36 Marco: And it's just amazing the quality you get, the modern features, the modern designs, all the wonderful layout and responsive stuff.
00:13:44 Marco: All that's built in with Squarespace.
00:13:46 Marco: And you don't have to build it yourself.
00:13:47 Marco: You don't have to support it.
00:13:48 Marco: So check it out today, squarespace.com slash ATP.
00:13:52 Marco: Anybody with any skill level can go there, start a free trial site, and make an awesome-to-use site in no time at all.
00:13:59 Marco: When you want to sign up for Squarespace, go back there, squarespace.com slash ATP, and use offer code ATP to get 10% off your first purchase.
00:14:07 Marco: That's squarespace.com slash ATP, code ATP.
00:14:10 Marco: Thank you so much to Squarespace for sponsoring our show.
00:14:13 Marco: Make your next move with a beautiful website from Squarespace.
00:14:19 Casey: May I, gentlemen, go a little bit off plan for a moment?
00:14:24 Casey: Are you willing to bear with me on this?
00:14:25 Marco: Sure.
00:14:26 Marco: I'm always willing to go off the plan.
00:14:28 John: Marco doesn't know the plan, so as far as he's concerned, everything is off the plan.
00:14:33 John: Everything is on the plan.
00:14:35 Casey: All right.
00:14:35 Casey: If you wouldn't mind, would you please make sure your Skype windows are visible?
00:14:40 John: Mm-hmm.
00:14:41 John: I got a lot of windows open.
00:14:43 Casey: Marco, would you mind describing to people what you're looking at, which is actually my screen?
00:14:46 Marco: Well, I see Casey's screen being shared, being his afore discovered four quadrant layout.
00:14:54 Casey: Mm-hmm.
00:14:55 Casey: Patented.
00:14:55 Marco: Mm-hmm.
00:14:55 Marco: He has Skype taking up a quarter of the screen, Colloquy IRC on the other corner, and the other column is a Safari window and a code editor of some kind.
00:15:06 Marco: It looks like Sublime, maybe?
00:15:07 Casey: Video Studio Code.
00:15:08 Marco: Cool.
00:15:09 Marco: And then the Safari window is showing App Store Connect, which is where you go to upload and manage apps that you've made.
00:15:19 Marco: And it appears to be showing an app that I have not heard you talk about yet.
00:15:24 Marco: No.
00:15:25 Marco: Can I say the name?
00:15:26 Marco: You may.
00:15:27 Marco: You may.
00:15:27 Marco: Named Peek of You, which is a pretty cool name.
00:15:31 Marco: I don't know what it does yet, but it's called Peek of You.
00:15:33 Marco: And it has looks like an emoji wearing sunglasses as the icon.
00:15:37 Casey: Close enough.
00:15:40 Casey: Yeah.
00:15:40 Casey: So what I am doing is I am sending you to a test flight invite.
00:15:44 Casey: Oh, I don't have my phone with me.
00:15:46 Casey: It's an iOS app, right?
00:15:47 Casey: It is an iOS app.
00:15:48 Casey: I am sending you a test flight invite to my latest app, which is called Peak of You.
00:15:52 Casey: And I should tell you about it.
00:15:54 Casey: But while I do that, I guess I can just get ready to do this little thing right here.
00:15:59 Casey: Mark, would you mind describing to me what's going on now?
00:16:01 Marco: Oh my god, that icon is adorable.
00:16:03 Marco: Hold on, I'm looking at the icon.
00:16:05 Marco: It's the Viewmatic thing, where you look through the goggles and there's the circular thing of 3D pictures and they flip around as you click the button on top.
00:16:17 Casey: That's right.
00:16:18 Marco: All right.
00:16:19 Marco: Oh, it looks like, so you are looking at the screen in App Store Connect when your app has been approved and it's an impending developer release state where you've clicked manually release and you are clicking release this app.
00:16:30 Marco: I am indeed.
00:16:31 Marco: So it appears that you have just released a brand new app that I didn't even know you had been working on.
00:16:37 Casey: This is true.
00:16:38 Casey: So as, there we go.
00:16:41 Casey: Okay.
00:16:41 Casey: So as of literally right now, it is ready for sale.
00:16:44 Casey: So, hey, guess what?
00:16:47 Casey: I wrote another app.
00:16:48 Marco: That's awesome.
00:16:48 Marco: Wait, how long have you been doing this?
00:16:50 Marco: You didn't mention this at all.
00:16:51 Casey: No.
00:16:52 Casey: By design, and I'm going to stop sharing my screen because this is creepy.
00:16:55 Casey: By design, what I have done is over the last couple of months, I have created a new app.
00:17:02 Casey: And one of the things I wanted to do as part of that is not tell you to because I thought it would be fun to surprise you on the show.
00:17:08 John: You kind of did an okay job.
00:17:10 John: I kind of knew you were working on a new app.
00:17:13 John: Listeners, if you had been listening for the clues, I think there was enough on episodes of ATB that you could tell.
00:17:18 John: I mean, even as recently as a couple of days ago, you posted some picture from Wegmans.
00:17:21 John: It's like, we know you're working on an app.
00:17:22 John: We just didn't know what it was.
00:17:24 John: I didn't know it was already ready.
00:17:25 John: I'm mad that I left my phone upstairs.
00:17:27 John: I want to go try the test flight.
00:17:28 Casey: Well, I'm sorry.
00:17:29 Casey: I should have warned you, but I didn't want to give anything away.
00:17:31 Casey: So all kidding aside, it is rolling out as we speak.
00:17:35 Casey: If you're listening to this live, you probably won't be able to see it for an hour or two.
00:17:38 Casey: But the idea is it's called Peak of You, as Marco had mentioned.
00:17:42 Casey: The icon is adorable, and I wish I could take any credit for it.
00:17:46 Casey: But it was my good friend, Steve, who if you listen to Analog, you would know is Stay.
00:17:50 Casey: And if you don't listen to Analog, you won't get that joke.
00:17:52 Casey: But nevertheless, the app is called Peak of You.
00:17:55 Casey: It was born in our Disney trip, and so I should probably explain.
00:18:01 Casey: When we all went to Disney, as I think we talked about on the show – I mean, I know we talked about Disney on the show, but I don't know if we talked about this part of it.
00:18:08 Casey: Michaela, whom I love dearly and who was just shy of two years old at the time, she was not enthusiastic about going in the stroller.
00:18:18 Casey: Yeah.
00:18:18 Casey: And when you're at Disney World, that is a little bit frustrating.
00:18:21 Casey: And what we ended up figuring out was that we could give her one of our phones and lock her into the photos app using guided access.
00:18:32 Casey: And that would let her look at the photos in our phones.
00:18:36 Casey: And we knew she couldn't like go send texts or whatever the case may be.
00:18:39 Casey: But nevertheless, she could have still deleted stuff, right?
00:18:43 Casey: And that's not good.
00:18:45 Casey: We don't want that.
00:18:47 Casey: And so it occurred to me, well, I know how to write iOS apps.
00:18:52 Casey: I could write a read-only photo gallery.
00:18:55 Casey: That's something I can do.
00:18:56 Casey: We have the technology.
00:18:57 Casey: We can do this.
00:18:58 Casey: And so I think the first commit was something like the 2nd of November, and we had gotten home on the 30th of October.
00:19:05 Casey: And I was working on this all of November, the portions of December that I actually worked and was a grown-up, and all of January.
00:19:12 Casey: And the first version was approved but not put up for sale on the last day of January, on the 31st.
00:19:18 Casey: I realized there was an oops that was entirely my fault, so I pulled it yesterday.
00:19:25 Casey: I believe it was yesterday.
00:19:25 Casey: I pulled it, or maybe it was the day before.
00:19:27 Casey: Sometime in the last 48 hours, it's been a blur.
00:19:29 Casey: A developer rejected the build previously.
00:19:31 Casey: and then put it back up, which was very stressful because even though app review time is pretty good, I was scared that all of a sudden I would, you know, I've been waiting for tonight's ATP for weeks.
00:19:42 Casey: And like, I didn't know exactly when it would be, but I've been waiting for a long time to do this for you guys, to you guys, et cetera.
00:19:48 Casey: And I was scared that then this would be the one time I get like rejected or there's like a two day wait or whatever, but thankfully it all worked out.
00:19:55 Casey: So,
00:19:56 Casey: The idea behind Peek of View is that it is a read-only photo gallery that you could hand to a kid or a client or a friend.
00:20:03 Casey: And the only thing that they can do is look at the photos that you've given to them.
00:20:09 John: I've already got a bug report.
00:20:11 John: Oh, of course.
00:20:11 John: Of course you do.
00:20:12 Casey: Of course you do.
00:20:12 John: I got my phone delivered.
00:20:14 John: You didn't even make it through the description.
00:20:16 Casey: I know.
00:20:16 John: I know.
00:20:16 John: Keep going, but I just wanted you to know.
00:20:18 Casey: Wonderful.
00:20:19 Casey: See, this is the thing.
00:20:19 Casey: This is the danger by not telling the two of them, I love you too dearly, but you're both total pains in the ass.
00:20:25 Casey: And it is for the best that you have a bug report because I can fix it then.
00:20:28 Casey: But yeah, so the idea is you can choose one of your albums that you've set up in Photos.
00:20:32 Casey: And you can limit the app to just that album.
00:20:36 Casey: And once Guided Access is turned on, there's nothing that they can do to change the album.
00:20:40 Casey: There's never anything they can do to delete anything, to edit anything, et cetera, et cetera, et cetera.
00:20:45 Casey: So that's the shtick.
00:20:47 Casey: It is similar to Vignette.
00:20:50 Casey: It is free to see 20 most recent photos or videos or what have you.
00:20:56 Casey: And it is a $5 an app purchase in order to see the rest of your stuff.
00:21:01 Marco: and surprise that's what that's what's going on so first of all that's a pretty cool idea second of all i love some of your implementation details that you've done here so i like that you have like like the bigger and smaller pictures in your collection view here like like i guess like the highlighted ones are bigger or some somehow some of them are bigger and i love your auto playing of live photos as videos
00:21:27 Marco: That is really cool.
00:21:29 Casey: Thank you.
00:21:30 Casey: I appreciate that because Mike was just yelling at me about that same thing.
00:21:33 Casey: So for those of you who are keeping up, I recorded Analog Monday, but we did not broadcast it live.
00:21:39 Casey: And the reason we didn't was because we didn't want anyone to know about this.
00:21:43 Casey: uh mike was giving me a hard time mike was on the beta uh and and it's not because i love him more it's just because i wanted to surprise the two of you and anyways he was yelling at me because he did not care for the moving live photos so i might i have a couple ideas there i might turn that off automatically if you're like john and do the name of it but the reduced motion or maybe i'll maybe i'll add a switch we'll see but um no that's as it is i like it i like it as well
00:22:07 Marco: What's also nice is that compared to the actual official Apple Photos app, it's faster to get in and out of photos.
00:22:16 Marco: It seems like you have duplicated their animation a little bit, but you've done it faster.
00:22:21 Marco: I would even say get rid of that little bounce that it does at the end because the bounce looks a little weird at this speed.
00:22:29 Marco: But I love how fast it is to get in and out of a photo.
00:22:32 Marco: Because you can hold the phone with one hand and just tap with your thumb in and then drag it down to go out.
00:22:38 Marco: And you can do the exact same motion.
00:22:39 Marco: I'm switching back and forth here.
00:22:41 Marco: The exact same motion works in Apple Photos, but it takes longer and you have to go further.
00:22:44 Marco: So by almost but not quite cloning the Apple interaction model, you've actually made an improvement here, possibly accidentally, by...
00:22:52 Marco: By making your timings all a little bit faster, and your tolerance is all a little bit tighter, so this is actually a really good way to very quickly flip through photos.
00:23:00 Marco: So that's pretty cool.
00:23:02 Marco: Thanks.
00:23:03 Marco: I also like that you autoplay videos.
00:23:05 Marco: When you open up a video, it autoplays it.
00:23:06 Marco: And it does it muted.
00:23:08 Marco: Yes, it autoplays it muted, and there's a little thing in the bottom there that unmuted.
00:23:11 Marco: That is a really nice...
00:23:14 Marco: this is not only good for the the the uh use case that you've outlined here of like you know controlling somebody's access to your photos just letting them view it this is also good to just quickly review recent photos you've taken because like it's so fast to get in and out john you've been quiet i'm a little scared i'm playing with the app i tried to do the in-app purchase but i got one of your emoji filled error messages oh no oh no well hopefully it's not completely broken we'll see what happens
00:23:40 Marco: Yeah, I did.
00:23:40 Marco: I looked at the setting screen, and it clearly is a Casey setting screen.
00:23:45 Marco: Yes, it is.
00:23:46 Marco: It's full of emoji and lots of explanatory text.
00:23:49 Casey: I was going to say, I didn't have the benefit of you editing me and cutting down all the text, which I was very sad about.
00:23:55 Casey: But there will be improvements, I'm quite sure.
00:23:57 Casey: In fact, I already have realized that in certain cases, if you have, for example, a panorama, which is really, really big,
00:24:04 Casey: Uh, the version, the peak of you shows as of, as of the time we record, this isn't quite full resolution and I've already fixed that bug, but I was so scared to go through the same dance of like, oh, if I submit it, maybe it won't be ready in time, et cetera, et cetera.
00:24:17 Casey: And so I haven't yet submitted that fix.
00:24:19 Casey: I'll presumably do it first thing tomorrow morning, but, um,
00:24:22 Casey: But yeah, now I'll actually be able to, for real, test my in-app purchase stuff because I've tested the snot out of it in test flight.
00:24:28 Casey: It never, ever seems to work exactly the same.
00:24:31 Casey: But thank you for trying to throw me $5.
00:24:32 Casey: Yeah, so anyways, I definitely have some work to do on this.
00:24:38 Casey: It's funny because in a lot of ways, this is far less ambitious than vignette.
00:24:42 Casey: I think vignette was a much more ambitious thing to do and certainly much more complicated thing.
00:24:46 Casey: But in certain ways, I'm a little more proud of Peak of View.
00:24:50 Casey: I think, and Marco, you seem to have pounced on this immediately in the happy sense.
00:24:54 Casey: I think it's a bit more polished than Vignette is.
00:24:57 Casey: I think in part because it's a much simpler problem area to work on.
00:25:02 Casey: Now, I've already got other ideas on how to make this more complex if I so desire and to enhance things.
00:25:08 Casey: But...
00:25:09 Casey: It is surprising to me – it isn't, but it is surprising to me that it really and truly is one of those things where I got the bare bones of this working within like, I don't know, a week or something like that, maybe two weeks tops.
00:25:23 Casey: But the rest of the time has been spent polishing and polishing and polishing and improving and polishing and improving.
00:25:28 Casey: And again –
00:25:29 Casey: As with all things, what is the saying?
00:25:32 Casey: The last 20% is 80% or something like that.
00:25:35 Casey: You know what I'm thinking of.
00:25:36 Casey: Yeah, yeah, yeah.
00:25:37 Casey: And that was very much the case here.
00:25:38 Casey: And not to say it's perfect.
00:25:39 Casey: I'm not saying it's perfect by any means.
00:25:41 Casey: But it is definitely... I feel like it's more polished than vignette is slash was.
00:25:47 Casey: And I'm proud of it for that.
00:25:50 Casey: Behind the scenes, for the nerds, there is no RxSwift in this, which...
00:25:54 Casey: was a deliberate choice.
00:25:56 Casey: For the longest time, I didn't think that there was any real need for any of the affordances that RX provides.
00:26:03 Casey: However, if you don't use your beloved hammer, but there's something that's vaguely hammer-like that's new and shiny and available to you, you might choose to use that.
00:26:13 Casey: So there is some combine in here.
00:26:15 Casey: uh there is a couple of there are a couple of screens of swift ui so the onboarding screen screens are swift ui and the purchase screen is swift ui and one of the next things that is on the docket for us to talk about if we don't get sidetracked for the rest of the episode which i hope we don't is to talk about uh our experiences john and me with swift ui so maybe we'll get to that shortly um
00:26:36 Casey: But yeah, it's simple, and it's not, and it's interesting, and I'm pretty proud of it, and I hope you, the listeners, and the two of you like it, and I'm sorry, the two of you, for not saying anything, but I wanted you to be able to experience it live with everyone else.
00:26:51 Marco: Yeah, that's pretty cool.
00:26:52 Marco: I'm glad that you did that, because it's more fun for the show.
00:26:55 Casey: I thought it might be.
00:26:56 Marco: Yeah, that's awesome.
00:26:57 Marco: You ready for your bug report?
00:26:59 Casey: Oh, God.
00:26:59 Casey: Do I want to have this publicly or no?
00:27:01 John: I'm a little scared.
00:27:02 John: Yeah, it's quick.
00:27:04 John: Mark already got one.
00:27:05 John: What was yours before?
00:27:07 John: It wasn't a bugger board.
00:27:07 John: It was just a suggestion.
00:27:09 Casey: They'll kill the bouncing.
00:27:10 John: I asked the bouncing.
00:27:12 John: Yep.
00:27:12 John: I mostly agree with that.
00:27:13 John: But then again, it is a kid's app.
00:27:14 John: So maybe kids will like the fun bounce.
00:27:16 John: You know what I mean?
00:27:17 John: So I go either way on that.
00:27:19 John: The one that I think is – it's –
00:27:22 John: I don't know what you can do about this, but... Oh, that's always dangerous.
00:27:25 Casey: Okay.
00:27:26 John: Yeah.
00:27:27 John: The gesture recognizer or whatever you're using for sideways swipe to go to the next photo, it is very unforgiving.
00:27:35 John: So such that when I use my... When I have my phone in my right hand and I'm using my right thumb to go through pictures, like...
00:27:43 John: And 20% of the time, when I try to go to the next photo, it takes me out of it because I've moved my thumb down too far.
00:27:50 John: So it's like super sensitive.
00:27:51 John: Like if you go to the left and then deviate from a right to left or left to right motion by half a centimeter, it's like you want to go back.
00:27:59 John: And that makes it basically impossible for me to sit there with my one hand and thumb through them.
00:28:04 John: You know what I mean?
00:28:04 John: So if you have any control over that gesture recognizer to say, leave a lot of slack in there, that would do it.
00:28:11 John: One of my favorite ones of those is Twitterifics, like display an image from a tweet.
00:28:18 John: It does a similar thing where you can just chuck it in any direction and it goes away, which I love.
00:28:22 John: But I never accidentally chuck it.
00:28:24 John: So whatever tolerances they're using will be good.
00:28:26 John: And especially I can imagine for kids, too, if kids actually want to take their little meaty paws, especially if they're very young and swipe through the photos, they're going to end up going back to the main screen, which they probably, you know, they'll just be like, oh, well, it went back to the main screen.
00:28:39 John: Now I'll tap on a different picture and it's fine.
00:28:41 John: But I think I think that gesture is too tight.
00:28:43 Casey: Yeah, so the behind the scenes there is that's a standard, what is it, UI page view controller?
00:28:49 Casey: Marco would know.
00:28:51 Casey: The standard left-right swipe thing.
00:28:53 Casey: And that gesture recognizer is all the out-of-the-box stuff.
00:28:57 Casey: However, I am, to your point, John, adding a
00:29:00 Casey: a swipe down, a pan gesture recognizer, that I have decided what the threshold is.
00:29:07 Casey: I don't remember off the top of my head, but I have decided what the threshold is between considering it not a swipe and considering it a swipe, a vertical swipe, that is.
00:29:15 Marco: Why don't you make it a scroll view with paging mode enabled?
00:29:20 Marco: Tell me more.
00:29:21 Marco: Why do you say that?
00:29:22 Marco: Because then it'll feel like every single other thing that pages on iOS.
00:29:25 Marco: In fact, so overcast cards on the now playing screen, that's how this is implemented too.
00:29:30 Marco: That's why those cards feel like any kind of paged scrolling thing in iOS.
00:29:35 Marco: It's a standard behavior on UI scroll view.
00:29:37 Marco: It's called something like enable paging or something like that.
00:29:40 Marco: And you can do crazy things like rip out gesture recognizer and do your own view or whatever.
00:29:46 Marco: You probably don't even have to do that.
00:29:47 Marco: But I would consider doing that because then it'll feel exactly right if you do that.
00:29:53 Casey: I don't think it feels too far from right the way it is.
00:29:56 Casey: But, yeah, I take your point.
00:29:57 Casey: And, again, I mean this is version one and we'll see what comes of it and we'll see – I mean –
00:30:02 Casey: It's funny because when I wrote this, I wrote it legitimately just for Michaela.
00:30:06 Casey: And then the more I worked on it, the more I thought, well, you know, maybe this could be useful to other people with kids.
00:30:10 Casey: And then I was talking to somebody.
00:30:11 Casey: I don't remember if it was Steve or Mike or somebody, but I was talking to somebody and I was like, well, they said, what about like a client?
00:30:18 Casey: I thought, well.
00:30:18 Casey: shoot, you're right.
00:30:19 Casey: What about a client?
00:30:20 Casey: You could very well, you know, for example, let's say you're working on a design for an iOS app and you want to show a client the designs on their device.
00:30:28 Casey: Well, on your device, actually, you could lock the app into just an album that just has those screenshots and then you can let them pan, you know, back and forth till their heart's content and know that you're not going to see like you in a bathing suit at the beach or something like that, you know?
00:30:42 Casey: Right.
00:30:42 Casey: And so, and then, and then somebody else as well pointed out to me, well, what if,
00:30:47 Casey: I'm handing my phone to Marco and I do want to show him my vacation pictures, but I don't want him to see anything other than my vacation pictures.
00:30:54 Casey: Not that Marco's the kind of guy who would go spelunking, but you get my point.
00:30:57 Casey: And so I feel like this app, although it was clearly and unequivocally and unapologetically written for a two-year-old, at the same time, it was very early that it occurred to me that this could be used for other people as well and other audiences as well.
00:31:13 Casey: I should also add that
00:31:15 Casey: With the in-app purchase, if the in-app purchase works, you can also change the icon.
00:31:22 Casey: And Stee came up with a series of alternative icons.
00:31:26 Casey: Unfortunately, for reasons that are not interesting, I haven't yet put in their different names that Stee came up with, but they are quite funny.
00:31:34 Casey: There's a business casual icon, which is the same thing, basically, but with a bow tie on it.
00:31:39 Casey: There's eco-friendly, which is a very, very green version of the icon.
00:31:44 Casey: There's flatten-friendly, which is basically a purple behind the regular high-color icon.
00:31:50 Casey: There's high-contrast, which is just a yellow background in black ink, if you will.
00:31:55 Casey: And Trendy, which has like a multi-pattern gradient, purpley, pinky, bluey gradient in the back and a flat white little dude in front.
00:32:04 Casey: So if you decide to throw me a few bucks, then you can also get an alternative icon, which is something I've never done before and was kind of a total pain in the butt.
00:32:13 Casey: you should so right now i'm in the test flight and i haven't done the in-app purchase and so it just pops up a dialogue saying sorry you got to buy it first you should show me all the icons i can get before i buy it oh that is a very good point you know i don't know i thought i'd planned on doing that i guess i never did that is a very very very good point good call marco it rotates there's like an animated image it rotates through them on that that's why that's where it was that's right it was in the the main purchase screen it does show a gif of all the different icons that's why i you're exactly oh there it is show it there i know but marco's still right i should still show it there
00:32:42 John: i have one more thing that's not a bug but just a uh aesthetic thing on the onboarding screens i feel like your left and right margins are a little tight is that you want more padding on the left and the right yep yep same fair enough this is what you get for not showing it to us when you use chipper 1.0 and we immediately have all the same i'm not upset no that's fine i'm fine with that did you see my picture my screenshot of your app
00:33:07 John: That's what your app looks like to me in limited mode because it won't let me do the purchase.
00:33:12 Casey: It's nothing but pancakes.
00:33:13 Casey: It's literally nothing but pancakes.
00:33:15 Casey: Pancakes all the way down.
00:33:16 John: Like that's how far, like the 20 pictures, that's how far it goes.
00:33:18 John: That's awesome.
00:33:20 Casey: And you really liked your pancakes.
00:33:22 John: I started using in the past month or two paprika, you know, that recipe app.
00:33:26 Casey: Yes, yes, yes.
00:33:27 John: And we're putting all of our family recipes in it, but then every recipe that's not a family recipe has this nice photo in it.
00:33:33 John: So now all the things that we cook, I have to get a good-looking picture of, and it can't look gross next to the fancy blue apron pictures and all the professional bon appetit glamour shots of their food.
00:33:45 John: It's surprisingly hard to get non-gross-looking photos of food.
00:33:49 John: That's why A, half of the food photography you see is faked because real food looks gross, and B, good pictures of real food.
00:33:56 John: are really hard to make nevin mergen's really good at making them a he makes really good food but b he has an instagram account that's just the food that he makes and he he's all about like he's got a big window with a lot of sun and a good you know place to set up and very and beautiful plates i should have him come and photograph my food and also cook it for me oh my goodness
00:34:15 Marco: This is really cool.
00:34:16 Marco: I'm really proud of you for doing all this and making another app and everything.
00:34:19 Marco: It's like, look, you could have gotten stuck in the trap, which is a very common, easy to fall into trap, of just working on Vignette forever.
00:34:28 Marco: What happens is you have probably exhausted most of the market for that app that you can.
00:34:33 Casey: I think so.
00:34:34 Marco: And you could have just kept plowing through and developing more and more edge case features that take more and more effort on your part.
00:34:42 Marco: You know, like the low hanging fruit is picked.
00:34:44 Marco: Now there's a whole bunch of like, you know, medium to small sized fruit way up high in the tree.
00:34:49 Marco: And like you could try to go get it and waste a whole bunch of time doing that.
00:34:53 Marco: But what you're doing now, which is trying new app ideas instead, is a way better use of your time in all likelihood.
00:35:00 Casey: I don't expect that this is going to set the world on fire by any stretch of the imagination, but it's something else.
00:35:06 Casey: It was an itch I wanted scratched, and you never know.
00:35:10 Casey: The other thing is, if I end up in the underscore approach, and I'm underselling underscore by saying it this way, but if I have a suite of apps, each of which makes a little bit of money, if I have enough apps that make a little bit of money,
00:35:25 Casey: that's fine.
00:35:26 Casey: I'm okay with that.
00:35:27 Casey: I don't have to take over the world.
00:35:28 Casey: I don't have to be overcast.
00:35:29 Casey: I can just have a bunch of things that trickle in, and hopefully in aggregate, that's not so bad.
00:35:34 Casey: And you're right that Vignette is, I think, has mostly exhausted the customer base that it will probably get.
00:35:41 Casey: There's a couple of things that are medium-sized route that I'm still considering doing for Vignette, but I think largely that ship has sailed, and it has sailed into the sunset.
00:35:51 Casey: And I mean, not to... God, I'm already badgering this, but... It has sailed off the end of the earth...
00:35:55 Casey: Yeah, it has sailed off the end of the earth.
00:35:56 Casey: I mean, not to say that I'm abandoning Vignette, but... No, no, no.
00:35:59 Marco: That's not what I'm saying.
00:36:00 Marco: What are you saying?
00:36:00 Marco: And also, that's not a bad thing.
00:36:02 Marco: Yeah.
00:36:02 Marco: Every app has a certain... There's a certain worthwhile limit of how much time is worth spending on this app as the developer.
00:36:11 Marco: Some apps justify continuous improvements.
00:36:14 Marco: I think Overcast mostly does because it has to stay cutting edge with features from competitors and it's financially successful on its own so it can justify that.
00:36:26 Marco: But
00:36:27 Marco: First of all, it took a long time to get that business model.
00:36:31 Marco: I went through a lot of them that weren't very sustainable.
00:36:36 Marco: Not every app does that.
00:36:39 Marco: One way to make a living is to have a couple apps or to have one app that does self-sustain indefinitely like that.
00:36:48 Marco: Another way to make a living that's way more likely to succeed and that way more people have succeeded at is to make a bunch of small apps and just kind of experiment and see what sticks and see what doesn't.
00:36:59 Marco: A critical part of succeeding at that is knowing how much effort to put into something and knowing whether to keep working on version two of the thing or to kind of let that one coast for a while and start working on the next thing.
00:37:13 Marco: And if you can develop that skill, which so far, I think you've made a pretty good call.
00:37:19 Marco: You did vignette for a while, right before WBDC.
00:37:23 Marco: You released it.
00:37:24 Marco: It succeeded.
00:37:25 Marco: You did a couple of minor updates.
00:37:26 Marco: But I don't think it really needs much else.
00:37:28 Marco: I think it's pretty much done.
00:37:30 Marco: And to market it's pretty much done.
00:37:31 Marco: Especially with all this new iMessage contact sharing stuff that actually is being deployed everywhere and all of our friends now have.
00:37:36 Marco: So I think that is...
00:37:39 Marco: probably done and the other features you were going to add to it possibly you know things like LinkedIn and Facebook you know these are like major undertakings that like probably wouldn't be worth it so like I think you have the right idea by not starting to go down a huge rabbit hole with some of those bigger features
00:37:57 Marco: There's also features that you could have taken on that also would have been bad uses of your time.
00:38:02 Marco: Things like a UI redesign or basically repolishing what you already have.
00:38:07 Marco: Improving the feature set you already have.
00:38:10 Marco: You could do that forever.
00:38:11 Marco: Every app.
00:38:12 Marco: You can always keep improving the app.
00:38:14 Marco: You can always modernize something or clean something up or refactor something or whatever.
00:38:19 Marco: There's infinite potential for time suckage when it comes to making your own apps.
00:38:24 Marco: But
00:38:24 Marco: ideally you figure out like okay this app is worth all the time suckage or this app isn't or none of my current apps are worth a lot of time suckage the way they're performing in the market and or they seem pretty stable so this is the time to start something new and so if you keep doing that I think this could be a real thing
00:38:43 Casey: Yeah, I mean, that's the hope.
00:38:44 Casey: And I don't know if either of you guys listen to Analog ever.
00:38:48 Casey: And if you don't, that's fine.
00:38:49 Casey: But I said on Analog that, I don't know, a couple of months ago maybe, that I had a couple of things that I was considering doing.
00:38:56 Casey: Well, guess what?
00:38:56 Casey: You've now seen one of them.
00:38:58 Casey: And I have another one that's in the hopper that I have not even filed a new project on yet.
00:39:04 Casey: But I have an idea, and I don't plan on surprising the two of you with that one.
00:39:09 Casey: I feel like I'm now one and done with that.
00:39:12 Casey: But I have another idea, and I think after I get whatever immediate bug fixes and improvements are necessary out of ToddlerPix... Oh, God, ToddlerPix.
00:39:20 Casey: I'm looking at the GitHub repository, and that was the initial code name for it, if you will.
00:39:24 Casey: And so, yeah, my name... The vignette was GravatarFetcher, and this was ToddlerPix.
00:39:29 Casey: My names are great.
00:39:31 Casey: But anyways...
00:39:32 Casey: Uh, once I, uh, once I get through the initial, uh, stuff with peak of you, then, uh, then I will move on to this next idea and see what, see what I've got there.
00:39:41 John: Speaking of, uh, speaking of toddler, toddler picks spelled P I C T S I'm sure.
00:39:47 Casey: No, John, this is an inside joke between John and me.
00:39:50 Casey: I am constantly badgering John about how he uses the like 80 year old man version of picks, which is P I C T S. And I keep trying to tell him it's just P I C S these days.
00:39:59 John: And I keep telling him it's not age-related.
00:40:02 John: Anyway, I was wondering how you dealt with that issue.
00:40:06 John: Because I started on my second app like a week after my first app was released.
00:40:10 John: But of course, I didn't have a name.
00:40:12 John: So I made a repo and a project under my own working title or whatever.
00:40:18 John: And then at a certain point, I came up with a name.
00:40:20 John: And then I, you know, me being me, I'm like, I've got to rename this repo.
00:40:25 John: I've got to rename this Xcode project.
00:40:27 John: I've got to rename every class and everything.
00:40:32 John: Did you do that?
00:40:33 John: Or did you do the other thing, which apparently is common, which is, yeah, you rename your executable target in Xcode, but you just leave everything else with the working title.
00:40:40 Casey: For Vignette, I mostly did the last thing you said, which is almost nothing says Vignette within Vignette, and almost everything says Gravatar Fetcher.
00:40:50 Casey: With Peek of View, the project is called Peek of View.
00:40:54 Casey: The repo is still called ToddlerPix.
00:40:56 Casey: All of the code is within the ToddlerPix folder in GitHub and in Xcode.
00:41:03 Casey: But I did more to try to get it to read Peek of View in more places than I did with Vignette.
00:41:10 John: Did you rename the Xcode project?
00:41:12 Casey: Yes.
00:41:12 Casey: Or was it always called it?
00:41:13 John: So how did you rename it?
00:41:14 John: That's my question.
00:41:15 Casey: I think I just renamed it on the file system, I thought.
00:41:17 Casey: It was a while ago now.
00:41:19 John: Like you're just in the Finder, just the top-level project folder?
00:41:21 John: I think so.
00:41:22 Casey: I am not confident that's correct.
00:41:24 Casey: So definitely do that with source control nearby.
00:41:28 Casey: I thought that's what I did, but again, I cannot stress enough, I am not confident that I'm right about it.
00:41:32 John: So I did the scorched earth thing where I renamed everything.
00:41:35 John: Xcode has a way inside Xcode, like not from the finder or anything, but you're in your project.
00:41:40 John: You can do a rename some I've already forgotten because I only did it once.
00:41:43 John: But you can do a rename like I think I like the top item in the sidebar or something.
00:41:48 John: And it will show you what it's going to rename in your project.
00:41:51 John: And it renamed.
00:41:51 Casey: No, I think you're right.
00:41:52 Casey: That is what I did.
00:41:53 Casey: So I just did it again because I have source control nearby and put it back to ToddlerPix and saying, okay, do you want to rename the target?
00:42:00 Casey: Do you want to rename what it is in InfoP list?
00:42:02 Casey: But that was basically it.
00:42:04 Casey: It didn't actually ask for much else.
00:42:06 John: But that's not all of it, obviously.
00:42:07 John: You do that.
00:42:08 John: And then I went through and found all the places where the working title still existed and manually fixed all of them, mostly using BBEdit.
00:42:14 John: And then I renamed the repo.
00:42:16 John: And then I made sure everything was connected.
00:42:17 John: And then I deleted my...
00:42:18 John: well, what is it?
00:42:19 John: XC project or whatever file because it was like corrupted or something.
00:42:22 John: And then, of course, you know, again, source control is your friend, right?
00:42:25 John: So do this after you show you have a clean checkpoint.
00:42:28 John: And I even zipped up, you know, compressed a copy of the project.
00:42:31 John: So if I totally host it, I could just unzip it.
00:42:34 John: But I did want people to know that if you start an Xcode project under a working title and you like me can't live with that once you come up with a name, it absolutely is possible to rename every single thing in your entire project eventually and it will work again.
00:42:49 Casey: Good to know.
00:42:49 Casey: Yeah, I haven't really bothered, but that's all right.
00:42:53 Casey: So anyways, we don't need to belabor this anymore.
00:42:54 Casey: I appreciate you guys indulging me and going on this little journey with me.
00:42:57 Casey: I have been unreasonably excited about springing this on the two of you, and I can't stress enough listeners.
00:43:03 Casey: Obviously, if you were paying close enough attention, you probably could have put this together, but I did not explicitly say anything to John nor Marco about what was going to happen today, about the fact that I was even working on something new.
00:43:17 Casey: So this was a surprise for them, and I appreciate everyone going along for the ride.
00:43:22 Marco: Yeah, this is awesome.
00:43:23 Marco: Congratulations.
00:43:24 Casey: Oh, thank you.
00:43:25 Casey: And this requires iOS 13 too because I don't care.
00:43:27 Casey: So sorry if you're on an older version.
00:43:30 Casey: And actually, I should also mention, come to think of it,
00:43:33 Casey: Swift UI, like we talked about, maybe we can talk more in a moment.
00:43:36 Casey: It's got problems, but it ain't bad.
00:43:39 Casey: And more importantly, I am really digging the new UI collection view stuff that came out in 13.
00:43:45 Casey: So this is diffable data sources and compositional layout, the main grid view, the main view of the app.
00:43:53 Casey: is all compositional layout, and that code is so nice.
00:43:58 Casey: It is not that much.
00:44:00 Casey: It is so little code compared to the nightmare it would have been prior to iOS 13.
00:44:04 Casey: I really, really love that new stuff.
00:44:07 Casey: And hopefully final note,
00:44:10 Casey: If you've never used guided access, this app is expressly designed to work with guided access.
00:44:16 Casey: And so the idea being that when you turn on guided access by triple clicking the side button, if you have a face ID phone, or I believe it's still triple clicking the home button on home button phones.
00:44:28 Casey: Among other things, Peak of View will automatically make that top toolbar go away, which means you literally there's no settings button to press.
00:44:35 Casey: The only thing you can press is on a photo.
00:44:38 Casey: And so if you're looking at this and thinking, well, this is all well and good, but then people can go into settings and do stuff and make bad things happen.
00:44:46 Casey: The whole purpose behind it is that it is assumed that you are willing to use guided access in order to limit that.
00:44:52 Casey: And originally, I didn't even realize that I could tell when Guided Access was on or off.
00:44:57 Casey: And so I had this god-awful triple-tap gesture in order to get to settings, the idea being that a toddler wouldn't be able to figure that out, and even an adult probably wouldn't be able to figure that out.
00:45:06 Casey: And I hated it from day one.
00:45:08 Casey: And then somebody, maybe it was...
00:45:11 Casey: It was either Jelly or Underscore, I think.
00:45:13 Casey: I forget who it was, but somebody pointed out to me, no, no, no, you can figure out when Guided Access is on or off.
00:45:18 Casey: And so once I did that, you know, sunshine came down from the clouds and shone directly on top of me and everything was good and right in the world.
00:45:26 Casey: So check out Guided Access if you've not done that yet.
00:45:31 Marco: We are sponsored this week by Collide, user-focused security.
00:45:35 Marco: Many of today's fastest growing companies owe their success in part to a culture that centers around transparency, personal responsibility, and most importantly, employee happiness.
00:45:45 Marco: But companies also need to secure their endpoints, and so they often do so at the expense of those values.
00:45:51 Marco: Too often, we've seen teams install intrusive management and security products on their employees' devices, and that makes everybody miserable.
00:45:57 Marco: At Collide, they believe you don't need to spy on your users or cripple their devices to meet your compliance and security goals.
00:46:05 Marco: So they launched a product that integrates with your Slack team and messages your users directly when their Mac, Windows, or Linux devices are not up to spec.
00:46:13 Marco: Your users will receive clear instructions about what is wrong and step-by-step instructions that will fix it.
00:46:19 Marco: They can even confirm in real time that they've resolved the problem right where they are in Slack.
00:46:24 Marco: So try Collide's new product for free for 30 days for your entire fleet by visiting Collide.com.
00:46:30 Marco: That's K-O-L-I-D-E dot com.
00:46:33 Marco: Collide.com.
00:46:35 Marco: Thank you so much to Collide for sponsoring our show.
00:46:41 Casey: Do we want to talk about SwiftUI?
00:46:42 Casey: Do we want to talk about Google's video sharing bug?
00:46:44 Marco: SwiftUI.
00:46:45 Marco: We're near that topic now.
00:46:48 Casey: Fair enough.
00:46:49 Casey: So like I said earlier, the onboarding on this app and the pre-purchase page, if you will, or screen, are both SwiftUI, or there's two pages of onboarding and the pre-purchase screen is all SwiftUI and
00:47:05 Casey: And the reason I did that is because I'll be the first to tell you, I am really bad at UI kit.
00:47:10 Casey: Like I can make things work, but it does not come naturally to me.
00:47:14 Casey: Uh, I do like storyboards.
00:47:16 Casey: I'm a weirdo.
00:47:17 Casey: I do use storyboards.
00:47:19 Casey: I am, I have reached an understanding with auto layout.
00:47:22 Casey: It's not really my favorite thing in the world, but mostly I can make it do what I want.
00:47:28 Casey: But my friend Steve had sent these mock-ups for the onboarding screens, you know, completely of his own volition.
00:47:33 Casey: Like I never had asked him to do it.
00:47:34 Casey: And they, to me anyway, compared to what I had had, they looked incredible.
00:47:39 Casey: And so I was looking at this thinking, I, oh, oh, oh, oh no, this is going to be stack views all the way down and that does not seem good.
00:47:47 Casey: And so I thought, well,
00:47:48 Casey: The onboarding screens and the pre-purchase screen are mostly static.
00:47:57 Casey: So maybe SwiftUI will work.
00:48:00 Casey: And actually, I'm pretty happy with it.
00:48:03 Casey: And for this sort of thing...
00:48:05 Casey: It's been mostly good.
00:48:08 Casey: There have definitely been some warts.
00:48:10 Casey: It's also been making me want to upgrade to Catalina on my iMac Pro so I can get that sweet, sweet live preview.
00:48:17 Casey: But all in all, it hasn't been too bad.
00:48:20 Casey: The problem, well, I have many problems with SwiftUI, but the biggest problem I have with SwiftUI is that when something goes wrong, and we've talked about this on and off a lot in the past, when something goes wrong, it often goes wrong in very
00:48:32 Casey: very far away places from where that problem actually is.
00:48:35 Casey: So let's say I have a hundred line view.
00:48:39 Casey: Maybe the error will be reported on line 20, but the actual error is on line 88.
00:48:45 Casey: And that is extremely frustrating.
00:48:47 Casey: Additionally, the errors are often completely not actionable in any way, shape, or form.
00:48:52 Casey: And that is extremely annoying.
00:48:53 Casey: But all told, I was able to go from a blank page to probably 80% of the way to what Stee had sent me as a mock-up.
00:49:05 Casey: in like an hour.
00:49:07 Casey: And if I, me, Casey, I'm not saying other people, but if Casey had done that using just straight up vanilla UI kit, I would still be working on it to this day, like two weeks later, because I'm just really not good at that sort of thing.
00:49:18 Casey: So I do...
00:49:21 Casey: With many asterisks and daggers and double daggers, I do like and recommend SwiftUI for this sort of thing, where it's a fairly static screen that not that much is happening.
00:49:33 Casey: I don't know if I could really in good conscience recommend it for stuff where there's a lot of moving parts and a lot of different things and user interactions happening.
00:49:42 Casey: John, though, you probably have done even more SwiftUI than me at this point.
00:49:46 Casey: So any thoughts you would like to add or corrections you would like to make?
00:49:50 John: I can't believe you were doing it without the live previews.
00:49:52 John: It seems like it would have gone a lot faster for you.
00:49:54 Casey: Well, here's the thing.
00:49:55 Casey: Here's the thing.
00:49:56 Casey: I was doing it in part with the live previews, but I was doing it on the Adorable, which is on Catalina.
00:50:01 Casey: And the Adorable, it's so adorable, bless its little heart, but it was choking on trying to do this.
00:50:07 Casey: Like it was just unbearably slow to the point that doing the build, run, try, stop, build, run, try, stop, dance on the iMac Pro was actually more fast.
00:50:18 John: fun and well not fun but more less infuriating than just waiting for the poor adorable to melt itself as it was trying to figure all this out no and i didn't realize how computationally expensive the preview is because oh yeah me neither it doesn't seem like it should be that bad but oh it was on the adorable although it does it i one of the things that annoy us with ui is it it's so it's so timid maybe from the earlier versions of it like in terms of the live preview and
00:50:45 John: if anything changes it's like oh i better stop pause this live preview because it seems like you're changing a lot of code it's like just just keep trying like i got a lot of cores just you know whatever like on this particular machine i don't want to have to keep hitting no no resume resume the preview yeah no i know i broke it but i'll fix it in like 20 characters like just keep just keep trying just constantly try to get the preview working because i hate having to go with i the worst thing is i hate looking at it and like i just changed that why didn't oh it paused again
00:51:12 John: You're wondering what I'm talking about.
00:51:14 John: There's a live preview where you write.
00:51:16 John: So you've seen this in WJC videos, but it's a live preview where you're writing the code and you get to see what your view is going to look like in another little section of the window in real time as you change things.
00:51:25 John: So that's that's the promise that, hey, you don't have to keep like write a bunch of code, build and run your app, go to the screen, look at the thing and then repeat like, you know, you could do it as you're typing.
00:51:34 John: But of course, as you're typing, you're, you know, you're making your file syntactically invalid as you're in the middle of typing stuff.
00:51:40 John: And when that happens, there's some sort of threshold where it decides that you've changed a lot and your code is now invalid.
00:51:46 John: And I can't update this preview with your now invalid code.
00:51:49 John: So I'm just going to pause it.
00:51:50 John: And it never, as far as I'm aware, unpauses itself.
00:51:53 John: It just says when you're ready, when you think you've gotten to a point where your code works again, hit the resume button and it'll show it.
00:51:59 John: So that's annoyed me a little bit.
00:52:01 John: But, you know, the tools are young.
00:52:03 John: And for the most part, it hasn't crashed on me.
00:52:05 Casey: And I should add and interrupt, I apologize.
00:52:07 Casey: When that does work, I mean, there were occasions where the adorable would stop being an idiot and would actually work pretty well.
00:52:13 Casey: When that does work, I cannot stress enough how fast it makes developing a view in SwiftUI.
00:52:20 Casey: And if you're not a developer, you have to understand, like, the normal way of doing things is...
00:52:24 Casey: At best, you're looking at a wireframe or like wireframe doesn't mean anything to a regular human.
00:52:30 Casey: You're looking at like a fake version of your screen and you're dragging things around and thinking, OK, this is probably right.
00:52:38 Casey: And then you go to run it and you're either then you have to build your entire app.
00:52:42 Casey: And you need to install it either on the simulator running on the computer, which is pretty fast, or install it on your phone, which is kind of fast.
00:52:49 Casey: And then you need to navigate to that screen unless you have some sort of shortcut you've built for yourself to get there.
00:52:53 Casey: And then you need to try the thing you were just trying.
00:52:56 Casey: Oh, crap.
00:52:57 Casey: I need it like four pixels the other way.
00:52:59 Casey: Okay.
00:52:59 Casey: Stop the simulator.
00:53:00 Casey: Go back to where you were.
00:53:02 Casey: Try to fiddle with things in the storyboard, you know, in the visual view, or perhaps do it in code if you're more like Marco in one way or another.
00:53:10 Casey: Make your change.
00:53:11 Casey: Okay, build it.
00:53:11 Casey: Wait a few seconds.
00:53:12 Casey: Or for Marco, it's probably more than just a couple of seconds because your app is so big.
00:53:16 Casey: That's not a slight at all.
00:53:18 Casey: You take the time to build the app.
00:53:20 Casey: You install it again.
00:53:21 Casey: You go, oh, crap.
00:53:22 Casey: It wasn't four.
00:53:23 Casey: It was three pixels.
00:53:23 Casey: I needed three pixels.
00:53:25 Casey: And then you do this whole dance again.
00:53:26 Casey: Whereas with SwiftUI, not only can you do this live as you're coding it because it has like a fake simulator within the Xcode window, which is what John was describing moments ago.
00:53:36 Casey: But it's doing it as you type.
00:53:38 Casey: It's amazing when it works and it can make things so fast.
00:53:41 Casey: And what's really clever is that you can make multiple previews.
00:53:48 Casey: So you can have a preview always displayed that's in dark mode as well as light mode.
00:53:53 Casey: And so you can see the two of them side by side and see exactly how the changes you're making affects both versions of the app.
00:53:59 Casey: When it works, it is amazing.
00:54:01 Casey: And this is actually true of pretty much all of SwiftUI.
00:54:03 Casey: When any of SwiftUI and all of SwiftUI is working, when it's firing on all cylinders, it is amazing.
00:54:10 Casey: In so many ways, actually, it just occurred to me, in so many ways, I feel like SwiftUI is my old BMW, in that when it works, holy crap, it was great.
00:54:18 Casey: It doesn't work that great a lot of the time, though, and that's the problem.
00:54:20 Casey: So I apologize, John, for interrupting.
00:54:22 Casey: Please continue.
00:54:23 John: I think an even better analogy, and what I was thinking when I was doing it, of course, is based on my background, is it's like web dev.
00:54:29 John: Web dev, people are used to the idea that you can be writing in one window and see the updates in the other.
00:54:35 John: I use bbedit for a lot of my web dev, and bbedit has a live HTML preview.
00:54:40 John: And so as you're editing the HTML in your bbedit window, the window right next to it...
00:54:45 John: it updates in real time and it never pauses because html is very forgiving and it's not compiled like a language or whatever and it's just so nice and then the other you know the the non-live version of web dev is still write a bunch of stuff save command tab command r to reload you know like the worst case it's still 100 times faster than building your app and shipping it to the simulator or a phone or whatever and then navigating to a screen and all that stuff so swift ui has always felt like web dev right down to you know it's
00:55:14 John: it's like you're writing CSS for it.
00:55:16 John: There's a bunch of blocks there.
00:55:18 John: You know, the H stacks and V stacks are a little bit different primitives than you have block level elements and CSS.
00:55:23 John: But it's similar where you have padding and frame sizes and alignments.
00:55:27 John: And it's very WebDev-y, you know, right down to the tools.
00:55:30 John: So that obviously, when I saw SwiftUI WWC, I was very attracted to it because I'm like, this...
00:55:35 John: At that point, I had never done any of the quote-unquote traditional app kit or UI kit stuff or whatever.
00:55:41 John: I'm like, this looks like web dev.
00:55:42 John: This is something that I'm already familiar with and comfortable working in.
00:55:46 John: This balance of like, well, is it a GUI builder, like interface builder?
00:55:49 John: Not really, but I've been building quote-unquote GUIs for my whole career by typing text.
00:55:55 John: But I'm also used to not just like, we talked about my frustrations with all the layout.
00:55:59 John: It's like, well, you can just do it all in code.
00:56:01 John: But that's so distant.
00:56:02 John: That's like...
00:56:03 John: you write a bunch of code and try to visualize in your head what it's going to do and then you have the whole build and run and install cycle or whatever to get to the point where you see it and then you cycle back and that's a longer cycle than sort of a live preview or a very fast preview and well casey said it's totally true like you know dark mode and different data like you you essentially provide it with like a in web dev terms fixture data or whatever like you can you can have a
00:56:26 John: fixed set of data or a simulated set of data or real data if you can pull it from the preview things which is also possible sometimes by the way so you can see what it looks like with different content depending on your app this has different amounts of usefulness and how far you want to go and you can do that on a per you know sort of sub view basis so you know apple recommends building swift ui from your like most primitive view upwards so like if you have a page with a bunch of you know
00:56:52 John: table view cells in and each one of those cells has an image and it has a picture and has a bunch of badges or whatever you can build that up from its smallest unit and each one of those little miniature views can itself you can just work on it in isolation and get that working in its own little preview and then the next step up is you embed that in a bunch of other things and that has a preview and you work your way up to the big screen
00:57:11 John: that has you know everything in a preview and again kind of like html kind of like css you can break it up into pieces and break your problem down into composable pieces and then put them together and yeah it's it's a very compelling experience my experience setting aside the tool foibles using it for my app which i'll my app is getting close to being done i'll probably in the next probably sometime this month we'll we'll talk about it and i'll ship it um but not to give too much away about the app but
00:57:40 John: I'm using it... I'm not using it everywhere.
00:57:42 John: A couple of my Windows are just plain old AppKit, which I'm now familiar with and became very comfortable with.
00:57:50 John: It's so clear that AppKit has so many more features than SwiftUI, which makes sense because AppKit is 30 years old, whatever the heck it is, from the next days.
00:57:59 John: And SwiftUI has been out for less than a year or whatever.
00:58:04 John: But when using SwiftUI, the main difference I found is...
00:58:10 John: I'll often want to do something, and I'm using SwiftUI in a slightly nontraditional way, which will become clear when I actually want to talk about my app.
00:58:18 John: And I'm like, how do you do that in SwiftUI?
00:58:20 John: And in almost every case, it was pretty easy to figure out how to do it in AppKit because AppKit has like a delicate method for everything, everything you can possibly imagine.
00:58:31 John: And SwiftUI really has sort of a straight and narrow.
00:58:36 John: It's like you're going to have buttons and controls and views and stacks and padding and scrolls and like all those things are fine.
00:58:44 John: I was like, but what if I want to do something a little bit different?
00:58:46 John: What if I want to be able to do a modifier click on a button?
00:58:50 John: What about drag and drop?
00:58:53 John: What about context menus?
00:58:55 John: What if I want to do multiple of those things in a single area?
00:58:58 John: And so if you're like, whoa, whoa, whoa, hold on.
00:59:00 John: A button is a thing that you click and does a thing.
00:59:03 John: you don't want to get any fancier than that do you and it's like and app gets like sure fine whatever subclass it override you know set up a delegate uses a million different things there are different ways like you have control over everything and swift ui like that's the one thing i want to see from swift ui and the next wwc is way more like hooks into the system because you know these abilities are there and
00:59:27 John: You know, if you're doing something normal where you just have like normal controls, normal windows, normal views that you click around in, it's pretty straightforward, plus or minus the bugs, which, you know, of which there are plenty.
00:59:37 John: Right.
00:59:37 John: But if you want to do weird stuff, it really fights you.
00:59:40 John: And there are ways to say, OK, I give up just embed an NS view right here.
00:59:45 John: Like, you know, never mind.
00:59:46 John: Never mind.
00:59:47 John: Swift UI.
00:59:48 John: But once you start doing that, you're like, well, why am I using SwiftUI again?
00:59:51 John: I'm trying to make a skeleton and then every single actual view is an NSView that I control the traditional way.
00:59:58 John: It's not ideal.
01:00:01 John: So in the end...
01:00:03 John: I was mostly able to beat it into submission and get it to do what I want, but boy, it was not straightforward.
01:00:10 John: At many points, I thought to myself, if I had not used SwiftUI for this project and instead had done this exact task in AppKit, I would be done by now.
01:00:20 John: I thought that many, many times, which may not actually be true because I'm not, you know, I'm never good at AppKit either.
01:00:26 John: I've only done one dinky little app, right?
01:00:28 John: But in the course of trying to figure out how to do all these different things in SwiftUI, I very quickly found out the AppKit way to do them.
01:00:35 John: And I'm like, well...
01:00:36 John: I found the AppKit way because there's many more answers on Stack Overflow and it's been around longer.
01:00:41 John: There's less misleading or false data because SwiftUI has changed a lot even in the short time since it's been announced.
01:00:47 John: I'm like, but that doesn't help me.
01:00:49 John: I need to find the SwiftUI way to do it.
01:00:50 John: Is there a SwiftUI way to do it?
01:00:52 John: Is this even possible?
01:00:53 John: How do I arrange things?
01:00:54 John: There is one or two things that I...
01:00:58 John: that couldn't do without bugs in swift ui like a lot of them are cosmetic bugs where like some visual state will get messed up and it's like well that's i'm doing it right but every once in a while it gets confused and it would like eventually reset itself if you did some action and it would be like oh i forgot yeah then that thing shouldn't be visually there and it would get rid of it i'm like i can't i can't use that feature in swift ui because that bug is going to look like my bug even if it's not my bug it's just you know swift ui being weird right so
01:01:26 John: setting that aside i did eventually find a way to do everything i want on swift ui but i leaned heavily on app kit because swift ui on the mac anyway it's just a view you do have to put it somewhere so it's in a window and the window is an app kit window and so i get to use all the app functionality for the window it's just that that window has a view in it that is a swift ui view which may or may not have one or more ns views shoved in it and
01:01:53 John: you know so it's it's a little bit of a weird hybrid mongrel but overall i think it was a i had a similar experience to casey where it's like i think i had i got the notion to do this app one day and i fired it up and it took me like maybe you made a new project it took me like 15 minutes to figure out like enough of the core functionality to get like the data i needed i still had nothing on the screen but i'm like all right well
01:02:20 John: now i just need to display this data somewhere so i was you know let me do swift ui it was so fast to get that data into a swift ui view and just like like if you'd see me do it you'd be like you're gonna be done with this app in three days and like casey you found out well you know this
01:02:36 John: There's a million edge cases, and you're going to be fighting with a lot of things.
01:02:39 John: And when you want to do that easy thing, I'm just going to add this minor feature.
01:02:42 John: And you realize, oh, how do I even do that in SwiftUI?
01:02:46 John: How do I do that at all?
01:02:48 John: And then you start Googling or whatever.
01:02:50 John: But I got up and running in the preview and then up and running for real in the app so fast.
01:02:55 John: I was like this.
01:02:57 John: I couldn't believe it.
01:02:59 John: It seemed like I was going to be done in a matter of a week.
01:03:02 John: So, again, like web dev, SwiftUI has that.
01:03:06 John: The advertised experience of that you can get something on the screen that looks vaguely like the app that you want it to be very quickly is true.
01:03:12 John: And the thing, the one sort of, not weakness, but like a characteristic of a lot of the SwiftUI tutorials, you know, I've seen many of them on the web and many travels trying to find out how to do these weird esoteric things is most of them focus heavily on getting things up on the screen.
01:03:31 John: and real apps that's part of it but real apps also say yeah but how does that stuff all connect together how do you know how do you when you perform an action here how does it cause a thing over there how does the data thread through how you know like can i click this can i right click especially on the mac can i you know command click it is there a context menu how does it interact with the other things can i select it and do something with selection is there a toolbar is it like all of those things
01:03:56 John: It's so different than, hey, you know, like a WDC demo, I have this blob of data that's like just a fixed JSON blob for the purposes of a WDC demo, and I just want to display it in a beautiful thing.
01:04:07 John: That's so easy to do, but that's a unidirectional dump data down the top of a giant funnel and have it display into a thing.
01:04:12 John: If that data has to be live and the app has to be interactive, it gets much harder.
01:04:16 John: So there is a second level of Swift tutorial that talks about data threading, but I feel like the final level is like action threading, like the whole, you know, the equivalent of like the responder chain and...
01:04:26 John: focus and all the things that mac apps deal with that are integral to app kit most of the swift ui stuff glosses over like because they kind of like kind of like this came up when we were talking about earlier kind of like react in the web thing one of reacts uh heretical things is that it mixes together javascript and html because it wants them to be close together so it's like oh when someone clicks a button here's the action for that button right here with the button
01:04:52 John: Swift UI is like that.
01:04:53 John: If you make a button, you put the action right there with the button.
01:04:56 John: The question is, what do you put in that action?
01:04:58 John: Does that action just call a method on some data that was passed down and or observed or in the environment?
01:05:03 John: Do you implement the action right in there with the button?
01:05:06 John: How do you build a scalable, well-factored app that actually does things?
01:05:12 John: by threading your logic and actions and controls and state all through these different views and that it like react is actually surprisingly hard to do because you have to decide who owns what state where is it kept how much state is is brought down what's in the environment what's not those decisions in these trivial apps like you're not getting you're not getting any help from these these you know demos even the one that apple just put up which is fairly sophisticated demo it's like yeah but in the end this is a very simple application like i can't imagine
01:05:40 John: making like a real Mac app, like, you know, Acorn or something like an actual complicated app with features and palettes and menus and, and a big canvas and all that stuff with Swift UI without coming up with a fairly solid plan about how to distribute your, your state and business logic and thread everything through and keep all the action sane or whatever.
01:06:02 John: So yeah,
01:06:04 John: Anyway, I think I see a lot of promise in it.
01:06:06 John: I enjoyed the experience, but I was also super frustrated by the limitations.
01:06:10 John: I'll go into much more detail eventually when I talk about my app.
01:06:13 Casey: One thing I would like to jump on is what you were saying about not really having access to AppKit or the system in general.
01:06:19 Casey: And that is so unbelievably true and frustrating.
01:06:21 Casey: So a really great example of this is...
01:06:24 Casey: When I use the SwiftUI view for purchase, and if the purchase fails, which apparently it's done at least once for John and maybe for everyone, who knows?
01:06:31 Casey: Hey, when there's an issue, I wanted to put up an alert saying, hey, there was an issue.
01:06:36 Casey: And just a standard UI alert controller, the same dialogue box that you would get in any app.
01:06:41 Casey: And to do that in Swift UI, maybe I just have been reading the wrong advice, but apparently the like blessed way to do this is to do, what is it like an on appears or something like that, that which is, which is at the end of your view.
01:06:58 Casey: So basically it's kind of like a, you know, view did load or if you were viewed will appear, I guess I should say.
01:07:04 Casey: And upon the,
01:07:06 Casey: that it will check a state flag that is part of your model that it will then uh if the state if that state flag is true then it will go ahead and show the alert which just feels friggin gross like oh yeah it's i did something very similar for drag and drop support where it's like
01:07:27 John: Really?
01:07:28 John: Because when you're laying out your view, you feel like I'm describing what the view is.
01:07:31 John: Here's the alignment.
01:07:32 John: Here's the padding.
01:07:32 John: Here's what's in it.
01:07:33 John: Here's how they're nesting each other.
01:07:34 John: But you're also describing show this thing, show this thing, show this thing, conditional on these five state variables.
01:07:40 John: It feels weird, doesn't it?
01:07:42 John: Like it doesn't feel like logic.
01:07:43 John: It feels like you're describing – like what you're describing is the superset of all things that could ever appear on the screen and then a bunch of them are gated by state variables.
01:07:50 John: And then you just twiddle the state variables somewhere very distant and then the thing appears –
01:07:55 John: And then the state variable goes off and it disappears or whatever.
01:07:58 John: And it's a very strange way to work.
01:07:59 Casey: Yeah.
01:08:00 Casey: Like, I think I can get through that in general.
01:08:03 Casey: So, like, let's say you were showing, like, an empty view versus a populated view and having, like, a state variable be the switch for that.
01:08:09 Casey: Like, I think I'm okay with that.
01:08:11 Casey: But...
01:08:11 Casey: um you know there there was a both with the case of showing an alert like there's just no real easy or clean way to do that and uh additionally like i wanted to have uh the purchase screen dismiss itself if it worked which maybe nobody will ever see but uh i wanted it to dismiss itself and that is also in on appear as a flag and then it's going to like go
01:08:35 Casey: dig into its presentation mode which you need to bind as an environment variable like it's just some of the stuff that feels like it should be easy is really really hard and that's the way it is with everything right like with swift ui the hard stuff is easy sort of but the easy stuff seems to be really hard whereas it's the exact reverse with ui kid or perhaps i mean i feel like it's just the paradigm is that what i just described is a
01:08:59 John: a fairly reasonable description of the difference between declarative and imperative.
01:09:06 John: We're all in an imperative mindset where we're like, I want to call an API that makes an alert appear because that's imperative programming and that's what UIKit and AppKit is.
01:09:13 John: But declarative is like, no, you don't call an API that makes an alert appear.
01:09:17 John: You just describe...
01:09:18 John: Yeah.
01:09:20 John: Yeah.
01:09:41 John: you can do that right there and there you now you're in imperative mode again but for elements that appear on the screen a lot of the stuff is you know declarative like they say it's going to be and it's a different way of thinking again same thing with react like on the web you have to change your mindset a little bit and it's very often frustrating when especially if you don't know that like the on appear or whatever like with the drag and drop stuff i thought it was impossible to do this thing but there was like there was like a
01:10:07 John: validate drop, drop enter, drop exit, perform drop.
01:10:12 John: And I was doing all these things and validate drop seemed to like had a Boolean return value that it seemed like it was just being ignored.
01:10:19 John: And I did drop enter and drop exited.
01:10:21 John: And I was trying to do declarative stuff to change the cursor.
01:10:24 John: using app kit because i'm like well swift ui doesn't have a way to change the cursor as far as i can tell so let me just in one of these things where drop enter drop they all had like callbacks like oh in the callback i'll just change the cursor but nope that doesn't work like i call the the correct api to change the cursor but whatever it's like something else in swift ui was saying no no no i control the cursor you know you can try to set the cursor but i never even saw it blink to my cursor always just change the other one so drop updated was the correct thing which again
01:10:53 John: It took a callback, and in the callback you did this weird thing about returning a drop proposal that influenced the cursor.
01:11:00 John: It's just such a different way of working, whereas it takes you two seconds to find out how to change the cursor on the Mac with NSCursor.
01:11:07 John: It takes much longer to figure out how to do it on a drag-and-drop with the right... I don't even know what they're called.
01:11:13 John: What are those little things called?
01:11:15 John: They're not delegate methods.
01:11:16 John: The little on a peer or whatever.
01:11:18 John: I don't know if there's a SwiftUI name for those, but...
01:11:21 John: Anyway, those are all new.
01:11:22 John: They have all different names.
01:11:23 John: They have all different verb tenses.
01:11:25 John: And they are factored differently because they're in a declarative API instead of an imperative one.
01:11:31 John: So a lot of your sort of muscle memory or idea of what this thing will be called, it's not called that in SwiftUI if it exists at all.
01:11:41 John: So yeah, there's a learning curve.
01:11:44 John: Maybe for people who are just being born now by the time SwiftUI is mature and they learn it as their first API,
01:11:50 John: It will be a really good fit with whatever web technologies are around, you know, by the time they get to that age.
01:11:56 John: And it will fit their mental model better.
01:11:58 John: But it's definitely quite a change from AppKit.
01:12:01 Casey: Yeah.
01:12:02 Casey: I think you're right.
01:12:02 Casey: And I think some of this – well, a lot of this perhaps is my own ignorance.
01:12:05 Casey: But –
01:12:06 Casey: Again, I mean, it's such a yin and yang, right?
01:12:09 Casey: When it works well, God, it is so nice.
01:12:12 Casey: It is so, so nice.
01:12:13 Casey: And then it just falls apart and you hate yourself.
01:12:16 Casey: So, Marco, you're really enthusiastic about trying this, right?
01:12:20 Marco: I mean, yeah.
01:12:22 Marco: I have high hopes for the future of SwiftUI.
01:12:26 Marco: I admit that it does turn me off to a large degree because of how different it is.
01:12:34 Marco: Because it is...
01:12:35 Marco: As you mentioned, because it is declarative instead of imperative, it's such a different style of coding anything, let alone UIs, which are so often so imperative.
01:12:46 Marco: So I think it's going to be a while, first of all, before it is even mature enough that it is a reasonable thing to use most of the time.
01:12:56 Marco: That's going to take at least a few years.
01:12:59 Marco: But then also...
01:13:00 Marco: There are going to be certain tasks where it's just worse.
01:13:05 Marco: And there are certainly some that it's going to be better for.
01:13:08 Marco: But it's a totally different way of thinking about things.
01:13:12 Marco: And you can't do things.
01:13:13 Marco: You mentioned earlier, certain things that are really easy in the old way are really hard in SwiftUI.
01:13:20 Marco: And it turns out a lot of those things are really common needs for UI programming on iOS.
01:13:27 Marco: So it might never be better.
01:13:31 Marco: Or it might always be this kind of weird alternative thing that you can do if you want to, but everyone's not doing it.
01:13:40 Marco: It could always stay there.
01:13:43 Marco: It could be more...
01:13:44 Marco: more practical on some platforms than others.
01:13:47 Marco: WatchOS, where it began, it's probably easier because it's a simpler problem space there, and also the alternative, WatchKit, is horrible.
01:13:57 Marco: It's a much easier sell on WatchOS, I think.
01:14:02 Marco: But on iOS and on macOS, where you already have very mature UI frameworks that work in, I think, more straightforward ways, if not, they might be more complicated in certain ways, but
01:14:14 Marco: they work in ways that all of us programmers already know how to deal with.
01:14:19 Marco: We already know how to deal with UIKit.
01:14:22 Marco: We already know how to deal with AppKit.
01:14:24 Marco: And if we don't, and we start looking up help articles and stuff, it'll work in a way that we at least are familiar with.
01:14:31 Marco: It'll work in a familiar syntax or mode of doing things, as opposed to SwiftUI is...
01:14:40 Marco: it's almost like it's like learning a different language that also has a different alphabet and that also isn't even spoken by humans it's like okay well okay so if we're learning like you know the the the pig alphabet that is spoken only by pigs like okay we have a lot to learn here a lot to relearn a lot to unlearn this is going to be difficult right and so i think swift ui is going to be like that where
01:15:05 Marco: because it is such a different paradigm than what all of us are taught, and because certain common things are extremely complex, and to some degree might always be, and because it's year one,
01:15:22 Marco: And we're already having to frequently do little hacks that basically break out of the declarativeness of it.
01:15:29 Marco: Or we do like those little state variables that kind of tarnish the purity of this model in such a way that makes you think like maybe this isn't the right model all the time.
01:15:36 John: The state variables aren't tarnishing it.
01:15:38 John: That's how you're supposed to use it.
01:15:39 John: It's just a different mindset.
01:15:41 Marco: True.
01:15:42 Marco: But because it makes certain things feel kind of bad or sloppy or like hacks –
01:15:49 Marco: This is probably going to prove to be a really cool tool sometimes, but it might not be the universal next big way to do UIs.
01:16:02 Marco: It might never reach that state.
01:16:03 Marco: It might just be that UIs are actually just much easier to do declaratively or imperatively.
01:16:08 John: God, I can't get them straight.
01:16:09 John: Yeah.
01:16:09 John: i think the name i think the name is part of the problem because it's swift ui and it makes you think like oh this is going to be what i do to make my entire user interface but if it had been called swift layout that might have been a better name i know data is kind of threaded through it but like i view it right now as like its competitors is uh you know auto layout or storyboards like it's
01:16:33 John: It's not doing my data model for me.
01:16:35 John: We know that's a whole separate thing.
01:16:37 John: It's basically, oh, so you want your data to appear somewhere on the screen.
01:16:41 John: You're going to make a view, right?
01:16:43 John: Well, that's what SwiftUI does.
01:16:44 John: It just makes views.
01:16:45 John: It doesn't even make Windows on the Mac.
01:16:46 John: It's not even at that level.
01:16:48 John: It just makes views.
01:16:49 John: And if you're going to make a view, you can make it as a storyboard or a zip or nib or whatever.
01:16:56 John: You can do it programmatically or whatever.
01:16:57 John: And I think of SwiftUI as, imagine if you can make your UIs programmatically
01:17:02 John: But the syntax was a billion times nicer and you got live previews.
01:17:06 John: That's what it's like.
01:17:06 John: Like it pretended interface build didn't exist and you were just doing all your UIs programmatically and Objective-C or Swift.
01:17:13 John: if you're good at that and you know all the APIs already, you can kind of visualize what it's going to look like.
01:17:16 John: But imagine if those APIs were so much more like terse, not so wordy, not with a million different arguments, where you could really just express what you want in a very concise, structured way and see it in real time with multiple previews and with different data and different, you know, scale factors and sizes and dark mode and all that other stuff.
01:17:35 John: That's SwiftUI, right?
01:17:37 John: And it's not doing the whole rest of your application.
01:17:39 John: And you do have to figure out how to thread your data through it and everything.
01:17:42 John: But
01:17:42 John: it's not really doing, especially on the Mac, your whole app for you.
01:17:48 John: I think you can do most of the pieces.
01:17:50 John: I think you can make menus, context menus, menu bar icons, but the windows still have to be NS Windows or whatever, and you can put views inside them.
01:18:01 John: It's a weird mishmash.
01:18:03 John: I don't know if SwiftUI wants to be more than Swift Layout.
01:18:06 John: Even if it was just a Swift Layout, I think it's a strong competitor to...
01:18:10 John: doing it programmatically or using auto layout or you know using springs and struts and doing because like the gui builder way of doing with interface builder is similar to swift ui only in swift ui you only touch like the source code again like web dev you touch the source code you don't do web dev except for in like the bad old days of like page mill or whatever by touching the web page
01:18:30 John: you touch the source code and then you look at the web page to see how your thing came out and it's like kind of like a real time thing right in interface builder you touch the actual interface in storyboards or nibs but there's also a code part that's over there that might influence it and you can you know adjust that balance or whatever so i think i think you has a bright future in that realm it's just not clear to me
01:18:53 John: how far it will try to expand.
01:18:55 John: Like, is there a SwiftUI equivalent of a window on the Mac?
01:18:58 John: Does it go that far?
01:18:59 John: Or does it always stay as a tool for making really cool views?
01:19:03 Casey: Additionally, something I keep wondering is if you can put a SwiftUI view inside of a view controller.
01:19:11 Casey: So view controller is like the old way, the standard way, I should say, of presenting stuff on a screen.
01:19:17 Casey: And you can put SwiftUI views into view controllers.
01:19:21 Casey: So if that's the case,
01:19:23 Casey: And if that's how this all is held together for the live preview stuff, couldn't we just live preview view controllers?
01:19:31 Casey: Is this an artificial limitation to force us to use SwiftUI to get the new sexy live preview stuff?
01:19:39 Casey: Or is there something legitimately different about SwiftUI that makes that compulsory?
01:19:44 Casey: I can't help but wonder...
01:19:46 Casey: Can't we have this for UIKit and AppKit stuff?
01:19:51 Casey: Can't we have these live previews for UIKit and AppKit stuff?
01:19:53 Casey: I feel like it's easy for me to say because I'm not the one writing all this, but it feels like we should be able to.
01:19:58 Casey: And if so, why can't we?
01:20:00 Casey: Because that would be amazing.
01:20:02 John: Well, I mean, on UIKit, maybe.
01:20:05 John: But think about it again.
01:20:06 John: I'm assuming one of the reasons or the main reason that the Mac doesn't let you zoom in on Mac UIs and Xcode is because no part of the AppKit UI drawing code ever expected to be zoomed in, right?
01:20:20 John: Whereas UIKit was built with that in mind.
01:20:22 John: Those type of limitations are the type of thing that make me think like AppKit never expected to be live previewed.
01:20:27 John: That said, do you remember the big... What are these switches called?
01:20:30 John: Maybe Marco will know.
01:20:31 John: The...
01:20:32 John: they called uh guillotine switches or scissors switches you know that like in the in the like uh you know frankenstein movie where like oh yeah i think they're called knife switches yeah there you go that's what it is knife switches like takes the big handle and it's got like y-shaped and you switch it up like that
01:20:48 John: and the machine turns on or whatever, there used to be a little icon that looked like that button in Project Builder, and you'd be in Interface Builder, which was a separate app then, and you'd be laying out your thing, and then you'd hit that little switchy button, and it would pop up like a live window of the UI that you just made that you could interact with.
01:21:05 John: But it wasn't really live, like it wasn't your whole app running.
01:21:07 John: It was just essentially the nib instantiated enough so you could mess with it a little bit and see how it worked and see like the layout or whatever, which is strange because Interface Builder itself already looks almost like that and you can kind of interact with it.
01:21:22 John: right an interface builder i think there still is a preview feature like that somewhere but it's not the same as swift ui the reason you can do it in swift ui is swift ui is so focused on the view like it's so like they're it's so controlled about uh like the inputs and the outputs the only way you can influence is with environment and state and then bindings back and forth between the different levels and that's it
01:21:44 John: it's not like you can just you know like you can with a nib just grab a reference to it from arbitrary code and just screw with it in your code at any point based on any logic you want right it seems to me that to actually do a live preview of like a view controller you'd have to run your whole app because you're something in your app could have a reference that view controller could dig into that thing and pull out the view and pull one of your controls and disable it how are you going to simulate that you've just got to run the app or a swift ui doesn't allow that stuff so i feel like
01:22:11 John: you're never going to see the same level of fidelity even with UIKit.
01:22:16 Casey: All right.
01:22:17 Casey: So Google Photos had a very big oops that happened, I think, around Thanksgiving, but has just been admitted to now.
01:22:27 Casey: And I didn't have a chance to look into this because I've been a little busy, but my understanding is, if I'm not mistaken, that...
01:22:32 Casey: if you requested a download of either all of your videos and photos or some of your videos and photos, there's a small chance you would get somebody else's stuff.
01:22:43 Casey: Oops.
01:22:44 Casey: Or some of somebody else's stuff.
01:22:46 Casey: And somebody else could get your stuff.
01:22:48 Casey: And somebody else could get your stuff.
01:22:49 Casey: And that's...
01:22:50 Casey: That's a pretty big oops.
01:22:52 Casey: Not feeling good about that.
01:22:54 Casey: So that is really unfortunate, really sad, and I don't know what to make of that because I am still using Google Photos as one of my photo backup, well, quasi backup strategies.
01:23:08 Casey: John, I know you're using it last I heard.
01:23:10 Casey: How do you feel about this?
01:23:11 John: I put this in here not to like dance on Google and say, ah, Google had a problem.
01:23:17 John: Aren't they so bad?
01:23:18 John: Just to like, this is, this is part of living in the world where we have these cloud services.
01:23:22 John: And I thought it was just worth talking about at that level, you know?
01:23:25 John: So we have recommended many times, uh,
01:23:29 John: Hey, you know, if you have something that you care about, don't just leave it on your computer that's in your house because your computer could break, your house can burn down, you could get robbed, like all sorts of things that can happen.
01:23:39 John: If you really care about that information, you have to have it elsewhere.
01:23:41 John: That elsewhere is usually, in addition to maybe having a backup copy at a friend's house or a relative's house or something, a better system that is easier to...
01:23:50 John: keep up to date with is to use one of the many cloud services.
01:23:53 John: For photos, you can push your photos up to Apple's iCloud photos thing.
01:23:56 John: You can use Google Photos.
01:23:58 John: You can use a data agnostic backup service like frequent sponsor Backblaze or any other cloud backup services.
01:24:04 John: But the whole idea is you're going to take your data and you're going to send it over wires out of your house to a computer that somebody else owns.
01:24:14 John: And part of the deal with that is
01:24:19 John: you are shifting responsibility for that to somebody else, which mostly you want to do.
01:24:22 John: It's like it's their problem to make sure that their data center doesn't burn down and that they have redundant backups and all that stuff.
01:24:29 John: And all I got to worry about is that we don't have simultaneous disasters.
01:24:33 John: If their data center burns down, hopefully it doesn't burn down the same day my house burns down.
01:24:37 John: And that's how you protect.
01:24:38 John: If you have three cloud backup services now, multiple data centers need to burn down the same day your house burns down and the chances to get lower and lower that you're actually going to lose anything.
01:24:46 John: But part of that deal is also, you know, oh, if I screw up and accidentally pour water in my computer, Casey, that's my bad.
01:24:54 John: But I was responsible for that data, so oh well.
01:24:56 John: Well, if Google accidentally pours water in their computer, that's their bad and that screwed up your data.
01:25:02 John: Every time you put your data into someone else's bucket and they're responsible for taking care of it, their mistakes can affect your data.
01:25:10 John: Down to and including, oops, I accidentally send your photos to somebody who's not you.
01:25:15 John: They're not doing it on purpose, just like Casey's not spilling the water into his computer on purpose.
01:25:18 John: But people make mistakes.
01:25:21 John: Companies are made of people.
01:25:22 John: So this is part of the bargain that we make when we use cloud services, which is you are now vulnerable to the mistakes of other people, just like you are protected from your mistakes by giving your data to them.
01:25:34 John: Now you are vulnerable to their mistakes.
01:25:37 John: So I still strongly recommend cloud services, even knowing that they could accidentally delete all my photos, give them to somebody else, scramble them up or whatever.
01:25:48 John: They are, you know, they're just like any other entity made up of people.
01:25:52 John: They're not a magical AI.
01:25:53 John: They're not an infallible computer in the cloud.
01:25:55 John: It's just a bunch of people running a bunch of their own computers, just like you're a person running your computer in the same way that you can screw up.
01:26:00 John: They can screw up.
01:26:01 John: Hopefully they have more controls.
01:26:02 John: They have more people.
01:26:03 John: They have more money.
01:26:04 John: They have more time.
01:26:05 John: They are more incentivized to take care of their stuff.
01:26:07 John: perhaps than you are because you don't have time to be a full-time data warden for all this stuff in your house.
01:26:13 John: But that risk still exists.
01:26:15 John: And I think this is a perfectly good trade-off despite things like this happening.
01:26:20 John: Obviously, you should talk to your cloud providers or think about them and say,
01:26:25 John: Do they do this all the time?
01:26:26 John: Are they constantly losing my data, deleting my data, giving it to other people?
01:26:30 John: Are they intentionally selling my data or doing other mean things?
01:26:33 John: You know, that's something you have to deal with.
01:26:35 John: I think Google is still a pretty good steward of the data it holds.
01:26:38 John: But every once in a while, something like this will happen.
01:26:41 John: And I don't, you know, like I'm still totally willing to take this bargain.
01:26:47 John: I don't see this and think, oh, my God, I got to get my photos out of the cloud.
01:26:50 John: I think, well, you know, that kind of stuff happens.
01:26:54 John: If it happens every month with Google, I'll think more strongly about perhaps taking my stuff out of the Google Cloud.
01:26:59 John: But once in however many years, I'm not too worried about it.
01:27:03 Marco: Yeah, when it comes to evaluating cloud services and providers and any modern big tech choice, you kind of have to take the long-term average with stuff like this.
01:27:17 Marco: Like,
01:27:18 Marco: Apple has lots of problems in lots of different areas, and we still stick with them because the long-term average is pretty good.
01:27:25 Marco: Google, Amazon, Facebook, Microsoft, all the tech giants, they all have occasional issues.
01:27:31 Marco: They have occasional bugs or security holes or just crazy things that just go wrong or quality issues or whatever.
01:27:38 Marco: They all have these.
01:27:39 Marco: It's impossible to run a giant web service and be...
01:27:43 Marco: 100 perfect to never have an issue to always be up like it's never you're never going to find anybody who's totally perfect and it's one of those things like if you instantly drop and permanently leave anybody who who makes a mistake once in a while it's kind of like swearing off airlines every time you have a poor experience on one it's like you're going to run out of airlines pretty fast
01:28:05 Marco: And there's only so many and you're going to have a hard time flying anywhere and you're mostly just hurting yourself.
01:28:09 Marco: Like if you drop Google for this, like their record is really good with security over time.
01:28:19 Marco: They do a bunch of creepy crap.
01:28:20 Marco: I'm not going to say anything nice about them on that front.
01:28:23 Marco: But when it comes to like this is a security bug and their record on security bugs over time is really good.
01:28:29 Marco: So this was a one-time fluke thing.
01:28:32 Marco: I wouldn't judge them long-term based solely on that.
01:28:35 Marco: Now, if they have a pattern of neglect and sloppiness, and they start failing to do things like this on a regular basis, or they start having more security problems over time,
01:28:48 Marco: that messes up the average then you can reevaluate then you can say all right this isn't just a one one-off thing or they don't just screw up rarely if they start screwing up often that's different but one screw up over the like 20 years that we've all been using google products uh you know one security flaw like this is is not a big deal and and they really again when it comes to security they really haven't had very many bugs or flaws
01:29:14 Casey: No argument here.
01:29:15 Casey: I mean, I'm going to keep my stuff there for now, but it freaks me out.
01:29:18 Casey: It does freak me out.
01:29:21 Marco: We are brought to you this week by Jamf Now.
01:29:24 Marco: It's easy to keep track of your own Mac or iPad or iPhone, but what about the other Apple devices at work?
01:29:30 Marco: As a business grows, so does its digital inventory, and this makes it harder to manage everyone's Apple devices, and this is especially true if you have remote employees.
01:29:39 Marco: Jamf Now makes it easy to set up, manage, and protect your Apple devices.
01:29:44 Marco: You can check your digital inventory, distribute Wi-Fi and email settings to the whole fleet, deploy apps, enforce passcodes, protect your company's data, even lock or wipe a device remotely as needed from anywhere.
01:29:58 Marco: Jamf Now helps you manage your devices so you can focus on your business instead.
01:30:02 Marco: And it's so easy to use, you don't need any IT experience to do it.
01:30:07 Marco: So our listeners can start securing your businesses today by managing your first three devices for free.
01:30:13 Marco: You can add more after that starting at just $2 a month per device.
01:30:17 Marco: Once again, first three devices free.
01:30:19 Marco: Create your free account today at jamf.com slash ATP.
01:30:23 Marco: That's jamf.com slash ATP.
01:30:27 Marco: Thank you so much to Jamf Now for sponsoring our show.
01:30:33 Casey: Stefan Jacobs writes, I'm kind of new to using the terminal to do things on a Mac, and I've come across Homebrew a few times.
01:30:38 Casey: I've also heard, though, that Homebrew can make a bit of a mess if you're not careful, although I'm not sure what careful means here.
01:30:45 Casey: Do you guys use Homebrew?
01:30:46 Casey: If not, is there an alternative?
01:30:47 Casey: Do you know what kind of careful I need to be to be a happy Homebrew user?
01:30:52 Casey: Let me start with the easy stuff.
01:30:53 Casey: I do use Homebrew.
01:30:53 Casey: I quite like it.
01:30:55 Casey: I know that there's an alternative.
01:30:57 Casey: Is it Mac ports?
01:30:58 Casey: Is that what I'm thinking of that's the popular alternative?
01:31:00 Casey: I think that's right.
01:31:01 Marco: Yeah, that's the old one, yeah.
01:31:02 Marco: Is there anything newer?
01:31:04 Casey: Not to my knowledge, but again, I wouldn't know.
01:31:07 Casey: And in terms of what you have to do to be careful, I don't know.
01:31:10 Casey: I'm going to learn with you, Stefan.
01:31:12 Casey: So, John, Marco, would one of you like to tell me what we need to do to be careful?
01:31:16 Marco: Yeah, just don't let time pass.
01:31:18 Marco: That'll do it.
01:31:19 Marco: Just freeze time.
01:31:22 Marco: Here's the thing.
01:31:23 Marco: Homebrew is a package manager.
01:31:26 Marco: At the heart of it, it's just like Linux package managers and everything.
01:31:29 Marco: It's a package manager.
01:31:30 Marco: People judge, oh, this package manager is great.
01:31:33 Marco: This package manager is terrible.
01:31:35 Marco: Oh, apt-get is so much better than yum or whatever.
01:31:37 Marco: Everyone has these holy wars over package managers throughout the history of package managers.
01:31:42 Marco: But
01:31:43 Marco: The reality is Homebrew has the same problems that almost all of them do.
01:31:48 Marco: You can get it set up once and it might work at a given point in time.
01:31:54 Marco: But over time, the packages will change.
01:31:58 Marco: The platform you're running them on will change.
01:32:00 Marco: Or the computer you're running them on will change.
01:32:02 Marco: So whatever you get working once at a point in time, a year later, you want to install a new package and, oh, this requires a new version of this library.
01:32:11 Marco: Upgrade that library.
01:32:12 Marco: Oh, now this broke these old three things that you were depending on.
01:32:15 Marco: Or whatever, like...
01:32:17 Marco: And then you try to fix that, and then it won't build, or it can't remove dependencies, or it can't add dependencies, or it has no idea where things are, or it thinks it works, and you run it, and all the libraries are broken.
01:32:27 Marco: It breaks.
01:32:30 Marco: The setup that you build with package managers is so brittle that
01:32:34 Marco: Anything that you want to do like three to six months after you did it the first time might not work.
01:32:41 Marco: And actually has a very high chance of not working correctly.
01:32:45 Marco: And so, so often the solution ends up being, all right, just start over.
01:32:50 Marco: Just wipe out everything that Homebrew installed completely.
01:32:54 Marco: clear out the whole directory and uninstall homebrew completely and then reinstall it as if it was never on your machine and reinstall all the packages you need have a script that you can just run over and over again to just do everything from scratch and in homebrew's defense
01:33:11 Marco: It does actually make that easier than a lot of the Linux package managers because it installs all of its stuff in one directory path areas.
01:33:21 Marco: And so you can actually just blow that away usually.
01:33:25 Marco: Make it uninstall itself first, but then it'll leave a bunch of crap behind and it'll freak out and it'll yell at you a million times all the crap it left behind.
01:33:32 Marco: And then you can just go delete it.
01:33:33 Marco: And then you can install it as if it was never there.
01:33:35 Marco: And usually that works.
01:33:38 Marco: So in the sense of like being a package manager, it fails in the same way that most package managers fail.
01:33:46 Marco: I think it fails in that way a little more often than the mature Linux ones do.
01:33:52 Marco: but that's also in part because homebrew is on mac os and apple doesn't give two craps about it and so apple is you know every time apple updates the os there's all new garbage for homebrew to have to deal with or work around or whatever else so i'm sure apple's not making things easy on them so it's kind of you know it's building a package manager on a very you know shifting and rapidly moving foundation but still like
01:34:19 Marco: it breaks a lot and it breaks in all the familiar ways dependency garbage or library garbage or whatever but it's also you know the work of a bunch of volunteers and we all use it for free and so i i kind of feel bad complaining about it i've never helped out i'm not doing anything to try to fix it it's you know it's this big open world thing i could try to help and i'm not so i do kind of feel bad saying bad things about it but
01:34:43 Marco: You know, it's a package manager, and it's no better and actually somewhat worse than most package managers out there that you would use these days.
01:34:51 Marco: So expect all the same problems.
01:34:53 Marco: And anything you want to do with Homebrew, I would say maintain a script that you can run in the future to set it up from scratch because given enough time, you will need to.
01:35:05 Casey: You know, I don't think I've ever had to nuke homebrew and try it again from scratch.
01:35:10 Casey: Not to say that you're wrong.
01:35:11 Casey: I'm not trying to say that your lived experience isn't right.
01:35:14 Casey: I'm just saying that as a second data point, I don't think I've ever had it go quite that wrong.
01:35:22 Casey: I've had to uninstall like individual things.
01:35:24 Casey: Like let's pick on FFmpeg just for the sake of discussion.
01:35:27 Casey: Like maybe something goes awry with FFmpeg and I have to, you know,
01:35:30 Casey: uninstall it via homebrew and then reinstall it and then it's been fine for me so i don't know if i'm just maybe i'm not doing as complicated things with homebrew or maybe i've just had better luck i'm not sure but i wouldn't say in my personal experience i wouldn't say it's it's demonstrably worse than any other package manager um but yeah i guess you know it depends on on what your particular experience is john how's it going for you do you even use homebrew in the first place
01:35:57 John: Yeah, the question was, is there an alternative?
01:35:59 John: The alternative is do not use a package manager.
01:36:01 John: That's what I have done.
01:36:03 John: I don't use package managers, although occasionally I'll install one and use it to install a thing, but I always regret it and go back.
01:36:10 John: So what's the alternative to using a package manager?
01:36:12 John: uh well a long time ago in the dark days of unix there were really no package managers and if you wanted software you downloaded the source code and you built it yourself that's what i do i download the source i build it and i install everything in user local uh it's kind of like having a single directory where all your stuff is because apple does not put anything in user local so user local is all yours and it can have all the things user local lib user local bin user local man it's all that user local include
01:36:38 John: It's all there and you control all of it.
01:36:40 John: The bad thing is if you don't use a package manager, it is a giant pile of stuff that is mostly undifferentiated.
01:36:46 John: But the thing I find most frustrating about package managers, aside from them breaking and having to go through all the, you know, because when the OS updates, like it's almost guaranteed that a bunch of stuff's going to break.
01:36:54 John: It happens with building from source too, but a little bit less often, is that very often what you want
01:37:00 John: isn't in the package manager oh you want version whatever of that thing well you can't have it because it relies on version of whatever of this other thing and we don't have that in package management so you can't install the new thing or if you have conflicting versions like you don't get to pick how everything fits together you are at the whim of what is available and the the more popular package management and you know pre-built package repos and uh of like linux distributions give you more options uh
01:37:27 John: Yeah.
01:37:46 John: It should be able to find all the prerequisites that the package manager installed, right?
01:37:49 John: Sometimes, maybe, but sometimes not, depending on how your OS controls that type of thing.
01:37:55 John: And macOS in recent years has been getting more cranky about things like LD load path or whatever the...
01:38:03 John: Various ways are that you can get some pre-built binary to find a library that's not where I'd expected it to be.
01:38:09 John: That's also kind of a security problem, so they've been locking down some of that stuff, and it gets a little bit tricky.
01:38:14 John: All this is to say that if you build everything from source, it's a pain, but it's your pain, and you get to control exactly every aspect of it.
01:38:22 John: As long as the software actually exists somewhere in the versions that you want...
01:38:27 John: You get to manually be the package manager and traverse the dependency chain and build things.
01:38:33 John: And once you figure it out, you can build a script to do it or whatever.
01:38:37 John: But bottom line is there will be a new version, a new major version of the operating system, and you might have to rebuild stuff.
01:38:42 John: I had a user local install of, like,
01:38:44 John: postgres mysql uh a bunch of utilities like wget and a bunch of stuff that apple doesn't include that i that i like you know links whatever i had built a bunch of software the browser yeah why what the hell are you using links for in 2020 if you're doing web dev it's uh it's a thing you have to it's a certain set of utilities i always wanted to be there yeah who's using links in 2020
01:39:07 John: Sometimes just a quick way from a command line to make a request to a thing and try to load it and it has debug modes and, you know, whatever.
01:39:14 John: Anyway.
01:39:14 John: Oh, my God.
01:39:15 Casey: Plus, if you want to make a version.
01:39:17 John: So if you want to hear something, it'll make me feel old.
01:39:20 John: Anyway, there was a time when the cool thing to do with your homepage, as we called it, was to make a cool version of it that detected when you were using it in links.
01:39:32 John: And instead of having like a header image, had ASCII art at the top that would look like your header image.
01:39:37 John: you could tell you were a hyper elite web developer in 1994 now that i can get behind it was awesome anyway um well i didn't forget where i was even going with that uh built one links oh yeah i had i had to install all that that i didn't have to change for like three major versions the trick is static linking do not dynamically link
01:39:59 John: Static link everything.
01:40:00 John: It makes all your executables bigger and it wastes memory.
01:40:02 John: But if you statically link, your user local can survive across major OS updates without breaking for a surprising amount of time.
01:40:10 John: Eventually, it'll probably break because symbols will just disappear and you're usually dynamic linking with something.
01:40:15 John: Or, you know, all sorts of stuff.
01:40:16 John: It's 32-bit and a 64-bit comes along like that.
01:40:19 John: It'll break eventually.
01:40:20 John: But anyway, this is not...
01:40:22 John: I can't really, I mean, this is my answer.
01:40:24 John: I don't really recommend it because using homebrew is a million times easier than building stuff from source, right?
01:40:32 John: So if you do have to, if you use homebrew and it screws up and you have to, you know, redo it, that's tractable.
01:40:38 John: Doing it just once from source requires like this wealth of background knowledge and experience that no one should ever need to have.
01:40:46 John: So I can't actually recommend it, but it's what I do and I vastly prefer it to using a package manager.
01:40:52 Casey: So I had to install links and look at my own homepage because now I need to.
01:40:56 Casey: Did you install links with Homebrew?
01:40:58 Casey: Yes, I did.
01:40:59 Casey: Why wouldn't I?
01:41:00 John: Let me tell you, if I was installing links from source, I could not have done it in the amount of time that you just did it.
01:41:04 John: So there's an advantage of using a package manager.
01:41:06 John: If it has what you want and you like the version that it has, you can get it done quickly.
01:41:11 Casey: All those cores?
01:41:14 Casey: My favorite part of looking at my own homepage or my own website in Lynx is I use the anchor emoji as an indicator of like a permalink.
01:41:23 Casey: And in Lynx, sure enough, it shows it as a plus sign, a hyphen, and a close parenthesis.
01:41:30 Casey: That's awesome.
01:41:32 Casey: That's so great.
01:41:33 Casey: It really honestly is.
01:41:34 John: Does Lynx not know that you have like a UTF-8 terminal program?
01:41:37 John: Because it shouldn't show the emoji, right?
01:41:39 John: Yeah.
01:41:39 Casey: I understand what you're saying and I don't know.
01:41:42 Marco: I love that somewhere somebody has an emoji to ASCII transliteration table.
01:41:47 Casey: ASCII, right?
01:41:48 John: It's probably built into links.
01:41:50 John: This is what it's like to be a fancy web developer.
01:41:54 John: Your site needs to look good in links.
01:41:56 John: That's amazing.
01:41:57 Casey: So good.
01:41:58 Casey: Oh, my word.
01:42:01 Casey: And Marco Org is also looking pretty decent, all told.
01:42:03 Casey: I'm surprised.
01:42:04 Marco: I haven't updated it since Lynx was current.
01:42:07 Casey: It doesn't like your permalink as much, though.
01:42:09 Casey: It's labeled as Infity, which I think is short for infinity.
01:42:14 Casey: Infity?
01:42:15 Casey: Yeah, that must be what it is.
01:42:16 Casey: Yeah, I-N-F-T-Y.
01:42:18 Casey: Oh, man, that's too bad.
01:42:19 Casey: Anyway, I could spend all night.
01:42:20 Casey: To see now, you've totally derailed me.
01:42:22 Casey: I made fun of you, and now I'm sucked in.
01:42:24 Casey: All right, Matt Rohr writes, what's the difference in any between the shift control, option, and command modifier keys?
01:42:30 Casey: Most apps have useful shortcuts, but I don't see the logic behind which key does what kind of operation.
01:42:35 Casey: For instance, in finder and system shortcuts, command D duplicates the selected files.
01:42:39 Casey: Shift command D duplicates.
01:42:41 Casey: opens the desktop folder option command D shows or hides the dock.
01:42:45 Casey: Is this pure memorization?
01:42:47 Casey: Are there any patterns we can follow when learning shortcuts?
01:42:49 Casey: Well, I think for this, I'm going to have to turn to my favorite old man, John.
01:42:54 Casey: What's the story?
01:42:55 John: Oh, there's a system.
01:42:56 John: All right.
01:42:57 John: Um, so this is, uh, part of it is like a system, you know, someone thought about ahead of time and, um,
01:43:03 John: you know, laid out and described in, like, human interface guidelines or whatever.
01:43:07 John: But part of it is also culture where practices accumulate over time through shared experience.
01:43:12 John: There are certain things that you accept.
01:43:13 John: So I think if you've been using any platform for a long period of time and if there is any kind of sort of strong culture, you will absorb it.
01:43:21 John: You absorb sort of the rules and the norms, whether you're aware of it at a conscious level or not.
01:43:28 John: I think the Mac today is a combination of those.
01:43:31 John: slight sidebar one thing that i get irrationally just annoyed by is and this is just the the hegemony of windows i suppose where people who are using macs just a giant room full of people using macs and they're all talking to each other about hitting ctrl c to copy it's like believe me you are not hitting they're all in terminal windows like you are not hitting ctrl c to copy on that mac
01:43:56 John: Everyone thinks like the main modifier key because Windows dominated the 90s is control.
01:44:03 John: And it's not.
01:44:03 John: As I pointed out many times, one of the awesome things about the Mac is control is left there for Unix.
01:44:11 John: Control C can send sig term or interrupt signal or whatever without interfering with copy.
01:44:18 John: because copy is not control c on the mac it's command c and the command key is not the same as the control key i know we all know that but it seems like every time i hear anyone speak who's not like in my specific tiny tech nerd circle it's like oh yeah control c to copy that it's like nope that's not not gonna work on your mac but they just they say control c but then they hit command c i also get upset when people talk about the alt key your mac does not have an alt key mine does yeah
01:44:45 John: I know yours does but even the Mac keyboard set like I think mine does it say alt let me see
01:44:51 John: No, mine doesn't.
01:44:52 John: But I think at a very point, even Apple shipped keyboards that said alt in like little letters underneath option or whatever.
01:44:57 John: Anyway, it's a different key.
01:44:59 Marco: Mine has a person key and a Skrlok.
01:45:03 John: Print screen, Skrlok.
01:45:04 John: Yeah, you need those.
01:45:05 John: Those are super important keys.
01:45:06 Marco: It also has a Windows key on one side.
01:45:08 John: On the other side, a menu key.
01:45:11 John: I can't believe it.
01:45:11 John: Like, that's such a case of like Windows envy where they're like, you know...
01:45:16 John: control and alt and all that stuff but it's like but apple's got they made apple made up a button they made up the command key with the weird swedish campground uh point of interest attention whatever symbol on it can we have a key too and being the imaginative people they are they said i know we'll call it the windows key and people will accidentally hit it and make the start button show up for the next decade and there it is and now it's on your keyboard and it has a windows symbol on
01:45:42 Marco: Anyway, the funny thing is, during the last couple of weeks when we were talking about the Windows logo, I never once thought to look down at my keyboard.
01:45:51 Marco: Sure enough, there it is.
01:45:52 Marco: It's the slanted Windows logo.
01:45:56 Marco: It's on the Windows key, right?
01:45:57 John: yeah i mean for me it's option but yeah but it's like it's option to my muscles but to my eyes it's windows yeah anyway i i what that's one of those things that like you can't go back in time and change that but i'm just so glad that the mac is the platform that was poised to have a beautiful synergy of
01:46:19 John: Yeah.
01:46:37 John: is for the most frequently used most important prime commands cut copy paste quit select all and any anything in your application so if your application is the finder and you think duplicate is an important function that people are going to do a lot that gets command d the option key in general is used to modify the behavior of some other thing that your thing can already do
01:47:05 John: It's also sometimes true of shift but option in general like culturally and I think probably in the Hague way back in the day was like you're going to do a thing but you're going to do a thing in a slightly different way.
01:47:16 John: That can be like clicking or running a command that already exists and adding the option key to the modifier.
01:47:23 John: Uh, there are a bunch of conventions surrounding these for application specific things that are just cultural and weren't really written anywhere.
01:47:31 John: But if you use, for example, any kind of graphics app and you command drag that moves command option, drag copies and moves a copy of it.
01:47:39 John: Uh,
01:47:39 John: shift constrains proportions option resizes from the center instead of the edges like these are just these are all just cultural things that have been sort of cargo culted across many applications and this is just the realm of graphical applications but the the modifiers come to have significance right it's
01:47:55 John: There is an understanding like holding down shift and doing a resize, you expect it to be constrained because shift means constrain when resizing things, constrain to a square root over.
01:48:05 John: Holding down shift option means constrain and also resize from the center instead of the edge.
01:48:10 John: There's nothing about shift that says that or about option that says that in that context, but it's cultural.
01:48:16 John: But the generic context is command is prominent, command option is modifier, command shift is...
01:48:24 John: second level primary operations so if you have a thing that you seem like as a common operation but the key you want it is taken for it don't do command option that letter do command shift that letter it difference between command shift and command option can be debated but i feel like culturally there's a sense for if you gave me a bunch of commands in an app and told me what kind of app it was i could tell you oh that one should have command shift a letter and this one should have command option
01:48:49 John: You also have the alternative, and this happens sometimes too, where you're out of letters and the good letter you want is already taken.
01:48:55 John: Like you have some operation that begins with a P, but command P is print.
01:48:59 John: It's the wrong choice to make command P in your program not print, especially if your program can print.
01:49:04 John: Don't take command P away from print.
01:49:06 John: But then what do I use?
01:49:08 John: It's a common operation.
01:49:09 John: To give an example, if my memory serves, it might not.
01:49:12 John: Let me cheat by looking in the Finder right now, although it might not even be there anymore.
01:49:16 John: PutAway in the Finder was a command that was used a lot back in the day, but it can't be Command-P because Command-P is print, and at various times, probably including today, the Finder could print.
01:49:27 John: So what do you use for PutAway?
01:49:30 John: Do you make it command option P?
01:49:32 John: That's like page setup or some other thing.
01:49:34 John: Do you make it command shift P?
01:49:35 John: But it seems like it's more of an important operation that was done frequently back in the day of like putting something back where it came from or whatever.
01:49:43 John: So I think someone picked command Y, I guess for the end of put away.
01:49:47 John: Not a great choice, but sometimes having a single non-three-finger corded operation is more important than picking the right letter.
01:49:58 John: So you end up with something like command Y for put away.
01:50:01 John: Again, I don't know if my memory is failing me.
01:50:03 John: It might have actually been a different key.
01:50:05 John: command m for make alias because command a is select all so you can't use command a but should you use command option a it's not related to select all you're not selecting all but in a modified way could you use command shift a it still seems kind of like it might have something to do with selecting all because command a is so important so how about command m for make alias nobody's taking it and you get to take the single letter all right so
01:50:29 John: there is there are rules that you should follow in a hierarchy that you should go through but really a lot of it is also just feel and experience and the best way to find out aside from just sort of implementing the rules of like use single letters when you can use command option for modifications use command shift if there's no command options and notice i didn't even mention the control key anywhere in any of this discussion it's there it's available you can use it in your mac apps but that's the bottom of the barrel that's for like
01:50:57 John: all the good commands are taken all the command option and command shifts are taken or don't make sense there's some really weird command that you want to do fine throw in control that's why a lot of the weird utilities that we all use uh use the control key for modifiers like the uh like paste spot multiple clipboard thing you can't use any of the cut and copy and paste commands you know xc and v with with and without option with and without shift are very likely to be taken and
01:51:23 John: but command control v probably any reasonable mac app does not take that so therefore it is available to be the bring up the paste ui thing for paste bot similarly command space is stolen by spotlight but it was stolen by quicksilver first but you can give it back to quicksilver and give spotlight the cruddy one like my spotlight is like
01:51:42 John: command option space or command control space or whatever anyway once you start mixing control and you're really at the bottom of the barrel do not put that in your app if you can at all help but leave control for unix and for utilities that really need a unique command that they hope an app won't take somebody told logic
01:51:58 Marco: does logic use a lot of control sequence i mean if you have a complicated application not only does logic use a lot of control modifiers for their keys and only control like strip silence is control x for some reason um they also use only shift like shift f for select all forward um my favorite thing about logic is that they have many commands that are only like single letter keystrokes like a
01:52:23 Marco: that's a command the best thing is that the text fields in logic sometimes deselect themselves while you're typing for no reason and so you are typing a word into your chapter title it loses focus for no apparent reason sometimes and then you finish your word which has maybe four or five regular letters in it and the entire interface to the app has changed and something's on the metronome's ticking and your automation is showing and everything and you're like
01:52:49 Marco: what the hell just happened, and how do I get it back?
01:52:51 Marco: And oftentimes the answer is, who knows?
01:52:54 Marco: Quit, don't save changes, and reopen the file.
01:52:56 John: You're like, there's no autosave on you.
01:52:58 John: That is another cultural thing.
01:53:00 John: Lots of pro applications do that.
01:53:01 John: Photoshop is an example.
01:53:02 John: B for brush tool, you know.
01:53:04 John: M for move.
01:53:05 John: G for bucket.
01:53:05 John: Or V for move.
01:53:07 John: Right, the left and right bracket for change brush size.
01:53:09 John: In a pro applications that have tons of feature that are used all day long, single unmodified letters become...
01:53:17 John: a useful feature that people like because it's just such a pain in the butt to use, but, you know, but they're dangerous as Mark would just find out.
01:53:23 John: Like if single letters unmodified can do something and a cat walks across your keyboard, you better hope your app doesn't have auto save or it has a very long undo history because who knows, who knows what just happened.
01:53:33 John: Um, it's true of some Unix utilities.
01:53:34 John: One of the things that, uh, you know, we've all always loved about net newswire and continue to love is that it uses keystrokes that are very much like I loved it because they're much like the tin internet newsreader, uh,
01:53:46 John: for like a terminal-based internet newsreader for usenet uh the keyboard when i first used net news bar i'm like this is just like a gooey version of tin single unmodified letters to do stuff k to mark as red spacebar to go down to the next page and then skip to the next unread article if you're at the end of the thing all right left and right arrow keys to navigate uh that can be a very powerful practice and it gets you out of the business of trying to figure out
01:54:11 John: a million different modified keyboard shortcuts for everything you can do a good mac app like net newswire will still support all of the command shortcuts that you would imagine there's probably a command something to mark as red and a command something to go but having those single letter shortcuts is also very powerful and by the way for people who don't know because mac is the mac os mac os 10 whatever the hell it's called mac os is built on next step which is built by a bunch of unix nerds
01:54:35 John: the standard text fields in the mac will respond to essentially emacs key binding so you can do ctrl a to go beginning of the line and ctrl e to go to end and very often ctrl k to kill and ctrl y to yank and that stuff actually works like the control key is out there available for unix e commands and in most text views on the mac they will work if you know those keyboard commands i don't recommend them like there are you can use up and down arrow to do the same thing and you know
01:55:02 John: command shift to select command option to go a word at a time like there's a million different shortcuts again with the cultural logic the understanding that shift arrow should select as you go and shift option arrow should go a word at a time and command should go you know move the cursor a word at a time and all sorts of things like
01:55:20 John: If you start to learn those, it will be worthwhile because they are repeated throughout the entire OS and throughout most popular applications.
01:55:29 John: And for the Pro applications, they also have... I mean, I'm sure there's some sort of cultural standard in audio editing applications.
01:55:36 John: I don't know what it is, but for example, a lot of the graphic stuff I described came from Mac Paint and Super Paint and Mac Draw and Illustrator and eventually came to Photoshop and from there spread to the whole world.
01:55:47 John: And so there is...
01:55:49 John: that's also worth learning because even though it's essentially arbitrary, if you learn it once, you will have a leg up when using any other app in that category.
01:55:58 Casey: I think my favorite keyboard shortcut of all time, which I used to use a lot when I was working with other people, is in Xcode, if you do shift control option command C, so that is four modifiers and the C character and
01:56:15 Casey: You get copy qualified symbol name.
01:56:18 Casey: So if I were to do that on a view controller's view to appear, what I get is view controller dot view to appear parenthesis underscore colon parenthesis.
01:56:27 Casey: So that's basically saying this is the real honest goodness official name for this particular function.
01:56:33 Casey: And it is very useful if you're trying to tell somebody else, like, you need to look at here.
01:56:37 Casey: You can do that, but that requires, again, shift, control, option, command, C. Literally all of the fingers on a regular human's hand in order to do this one keyboard shortcut.
01:56:48 John: But it's saving you time.
01:56:50 John: You should look for the web for, I think it's called save for web claw.
01:56:53 John: Like there's a command that was added to Photoshop when the web came out, which is save this image for the web, which would save like a heavily compressed version of it with...
01:57:01 John: selectable color palettes like a different alternate way to save a different version of your photoshop box uh document specifically made for the web and because all the good shortcuts were taken in photoshop it's like command option shift s or something uh but you do it so often as a web dev that it becomes sort of second nature like again like i described what i think is the keystroke i don't actually know like like most of the emacs key bindings i don't know what they are but my hands know
01:57:26 John: So I don't think about it.
01:57:28 John: I just go save for web and it happens.
01:57:30 John: And my hands did something to the keyboard when that happened.
01:57:32 John: Just like when I split the buffer and move from one to the other.
01:57:34 John: I don't actually know the keystrokes to do that in Emacs, but my fingers know.
01:57:37 John: Anyway, there's a meme of taking a picture of how you can tort your fingers to do this keyboard shortcut.
01:57:44 John: And there's lots of different variations.
01:57:45 John: If I knew the exact name, we could find the meme, but it's somewhere on the web.
01:57:48 Casey: Save for webclaws.tumblr.com.
01:57:53 Casey: Of course there's a Tumblr.
01:57:55 Casey: And it is indeed a bunch of people doing all sorts of different displays of how they do their save for web claw.
01:58:03 Casey: This is something else.
01:58:04 Casey: I've not heard of this because I'm not a Photoshop user.
01:58:07 Casey: That is, wow.
01:58:09 John: I don't play claw in Destiny, by the way.
01:58:13 Casey: that's good to know thank you for that that's all right goodness some of these safer webclaws you're like seriously that's how you choose to do it but everyone's got their own way all right let's finish up with something that i hope will be quick we'll see what happens jesse in south dakota writes i'm curious how you all name your wi-fi networks is it something plain like list household or something punny like tell my wi-fi i love her
01:58:36 Casey: Or a pop culture reference like Skynet.
01:58:39 Casey: Do you or do you not broadcast your SSID?
01:58:41 Casey: For me, I have been broadcasting my SSID since like a couple of years after Wi-Fi was new.
01:58:48 Casey: So if you're not an old man like me, when Wi-Fi was brand new, the initially accepted thing to do, at least when you were of the age of Marco and me at the time...
01:59:00 Casey: Was you don't broadcast your SSID and you would have to tell people your SSID, but you have no other security whatsoever.
01:59:06 Casey: So it is by every definition security through obscurity.
01:59:09 Casey: And because you didn't broadcast your SSID at the time, what that meant was people would need to know that your SSID was like lists or whatever in order to get on your network.
01:59:20 Casey: But once they knew it, they would have the keys to the kingdom.
01:59:23 Casey: And to answer the other question, the initial question, my network name is indeed Liss.
01:59:27 Casey: I kind of wish there was something more pithy or punny or something, but I'm old and boring, and so it's just called Liss.
01:59:34 Casey: Marco, I don't recall your network name offhand, but I remember it being funny, if you're willing to share.
01:59:39 Casey: And do you or do you not broadcast your SSID?
01:59:42 Marco: I do broadcast it, and this is like a weird joke that I picked up forever ago back when I was a something awful forums goon in my teenage and early 20s years.
01:59:57 Marco: And so kind of playing off of a joke that I picked up all the way back then, my SSID is trapped in router factory.
02:00:06 Casey: That's right.
02:00:06 Casey: I'd forgotten that.
02:00:08 Casey: I should also do some real-time follow-up.
02:00:09 Casey: Underscore my name is T writes, all of Casey's life is list puns and he just calls his Wi-Fi list.
02:00:15 Casey: I was just about to say the exact thing.
02:00:16 John: How is it that you of all people do not have a pun base?
02:00:21 John: It should be wireless.
02:00:22 John: That's what it should be.
02:00:24 John: Exactly.
02:00:24 John: I can't even believe it.
02:00:25 John: I don't understand how you allowed this to happen to yourself.
02:00:27 John: And then Marco's got the joke one.
02:00:29 Casey: I know.
02:00:29 Casey: I'm sorry, everybody.
02:00:30 Casey: I failed you and I failed me.
02:00:31 John: You have.
02:00:32 John: You need to change that right away.
02:00:33 Casey: Oh, goodness.
02:00:34 Casey: John, what's your situation?
02:00:35 John: mine is boring it's not a joke one i do broadcast it um yeah i don't i'd like seeing other people's but i trapped in the router factory is a little long like i don't like it when someone has a funny ssid and it makes the menu really long i don't like that so i think try to keep it uh keep it short and snappy but i am not opposed to a joke wi-fi um but no mine just has a boring obvious name
02:00:59 John: Please say it's called Wi-Fi.
02:01:01 John: It is not called.
02:01:03 John: That's a stupid name.
02:01:05 John: The real question is, does Marco know what Skynet is?
02:01:09 John: No, I don't.
02:01:09 John: Really?
02:01:10 John: I know it's from a movie, but it's from a movie I haven't seen.
02:01:12 John: Pop culture reference, but it gets past Marco.
02:01:16 Casey: Wow, even I know that one.
02:01:17 John: That's why I asked Marco.
02:01:18 John: I had faith in you, Casey.
02:01:20 Casey: Thank you, John.
02:01:20 Casey: I did see a few weeks ago.
02:01:22 Casey: I forget where I was.
02:01:23 Casey: Now I don't recall.
02:01:24 Casey: But I saw a few weeks ago Silence of the Lands, which I had tweeted about, which I thought was quite great.
02:01:30 Casey: That's the first time I'd seen it.
02:01:31 Casey: Yeah, I thought it was great.
02:01:32 John: Oh, my goodness.
02:01:33 John: Well, my faith in you has gone down a notch.
02:01:35 John: I'm adjusting.
02:01:36 Casey: Oh, man.
02:01:36 Casey: I should have kept my mouth shut.
02:01:38 Marco: Thanks to our sponsors this week.
02:01:39 Marco: Squarespace, Collide, and Jamf Now.
02:01:42 Marco: And we will talk to you next week.
02:01:44 Marco: Now the show is over.
02:01:48 Marco: They didn't even mean to begin.
02:01:51 Marco: Cause it was accidental.
02:01:53 Marco: Oh, it was accidental.
02:01:57 John: John didn't do any research.
02:01:59 John: Marco and Casey wouldn't let him.
02:02:02 John: Cause it was accidental.
02:02:05 John: It was accidental.
02:02:07 John: And you can find the show notes at atp.fm.
02:02:13 Marco: And if you're into Twitter, you can follow them at C-A-S-E-Y-L-I-S-S.
02:02:22 Marco: So that's Casey Liss, M-A-R-C-O-A-R-M-D-A-N-T-M-A-R-C-O-R-M-N-S-I-R-A-C-U-S-A-S-Y-R-A-C-U-S-A-C-U-S-A-C-U-S-A-C-U-S-A-C-U-S-A-C-U-S-A-C-U-S-A-C-U-S-A-C-U-S-A-C-U-S-A-C-U-S-A-C-U-S-A-C-U-S-A-C-U-S-A-C-U-S-A-C-U
02:02:39 Marco: man there really are a lot of really boring terrible wi-fi networks out there like most of what i could pick up from here is just like you know people's default routers it's like you know fios and then random characters i have three of those in range xfinity is the scourge of all existence the xfinity ones are all just called xfinity wi-fi it's the worst
02:03:06 Marco: Yep, Xfinity Wi-Fi, yeah.
02:03:07 Marco: There's also DirectCD HP OfficeJet 5740, so somebody's printer is advertising something.
02:03:13 John: Yeah, printers and Xfinity is just a wasteland.
02:03:17 Marco: There's a weird thing.
02:03:18 Marco: I really don't like when iOS has those carrier-specific Wi-Fi networks that it'll just auto-join without even asking you, and it's surprisingly hard to get iOS to stop auto-joining those and remember your preference.
02:03:32 Marco: i just have it not i just have ios not auto joining networks ever and also not asking me ever no no that's even if you have that like my you know i'm on at&t for my phone service even if i i always have auto join off except for like the networks that i add so like you know it never prompts me to go to a wifi network but there's some way for at&t to communicate to the phone and
02:03:56 Marco: to always rejoin these networks automatically.
02:03:59 Marco: I think it's a security hole, honestly.
02:04:01 Marco: I wonder, if I just create a network called AT&T Wi-Fi, will every AT&T phone automatically join it?
02:04:08 Marco: Is it just matching the string?
02:04:10 Marco: Or are these somehow authorized to only certain routers with MAC addresses?
02:04:15 Marco: I don't even know.
02:04:16 Marco: But...
02:04:17 Marco: somehow it is... I guess maybe it's part of the SIM card or the SIM standard, the carrier settings, whatever it is.
02:04:26 Marco: Somehow, iOS lets carriers make your phone auto-join networks without asking you.
02:04:31 Marco: And that, I think, is really weird.
02:04:33 Marco: And it always gives me the creeps when I see it.
02:04:35 Marco: And I always get mad.
02:04:36 Marco: And then I try to leave the network and sometimes it'll remember that I left it and it won't rejoin it.
02:04:41 Marco: Sometimes you have to join it and then say, forget this network.
02:04:44 Marco: And it's...
02:04:45 Marco: it's really messed up I think that's gotta be a security hole waiting to happen
02:04:49 John: How many Wi-Fi networks are visible from where you're sitting right now?
02:04:54 Marco: Seven, but two of them are mine.
02:04:56 Marco: Casey?
02:04:57 Marco: 30, 31, 32, 33.
02:05:00 John: Casey's the winner.
02:05:01 John: I'm at 19.
02:05:01 John: Yeah, I'm lucky that most of my neighbors are not that technical.
02:05:04 John: How many are insecure?
02:05:06 John: How many don't have the little lock symbol?
02:05:08 John: None.
02:05:09 Casey: Only Xfinity Wi-Fi.
02:05:11 Casey: Xfinity Wi-Fi.
02:05:12 John: That's my only unlocked one.
02:05:15 John: I've got an all-caps Xfinity that is secure, but Xfinity Wi-Fi is insecure.
02:05:19 Casey: Wow, that Xfinity, it goes all the way from Boston to Richmond.
02:05:22 Casey: That is some powerful Wi-Fi.
02:05:24 John: My experience is that any insecure network that says Xfinity Wi-Fi is not a real Wi-Fi that anyone can or should join.
02:05:31 John: Like I've literally never seen an Xfinity Wi-Fi that's insecure that can actually be joined by a computer.
02:05:35 John: I don't understand what it is.
02:05:37 John: I'm assuming like Comcast sends out a bunch of these Wi-Fi routers and they end up being misconfigured and they advertise a network that literally can't be joined and it always shows as insecure.
02:05:45 John: Not that I'm ever intentionally joining them, but sometimes you're desperate and you're like, I just got to get some Wi-Fi.
02:05:49 John: And if I see Xfinity Wi-Fi and it's insecure, sometimes I'll try it and just out of idle curiosity, but it'll never actually connect.
02:05:56 John: It's not a real network.
02:05:57 Casey: Well, no, I don't think that's true.
02:05:59 Casey: So I am not confident about the following.
02:06:02 Casey: But I think the way it's supposed to work is that if you are an Xfinity subscriber and only if you're an Xfinity subscriber –
02:06:09 Casey: then you can basically ride on any Xfinity subscribers for Wi-Fi, unsecured Wi-Fi.
02:06:16 Casey: I'm not sure what the auth dance story is around that.
02:06:19 John: But yeah, if you're not, it's just a fake network that's just there to distract your computer slash phone.
02:06:26 Marco: Did you ever read about the thing about the free public Wi-Fi SSID that kind of like spreads itself somehow?
02:06:34 John: You see it at WWDC even.
02:06:35 John: Yeah.
02:06:36 John: WWDC is a great place to look at SSIDs because they're all over everybody's.
02:06:40 Casey: Oh, yeah.
02:06:41 John: What is that?
02:06:42 John: Verizon thing starts with an M?
02:06:43 John: Wi-Fi maybe?
02:06:44 Casey: Yes, I believe that's right.
02:06:45 John: There's a million of those.
02:06:46 John: Everybody's phones have their little hotspots that are all like name default things.
02:06:51 John: You don't see a lot of Xfinity at WWDC though.
02:06:54 John: so i think everybody who's in my wi-fi vicinity is a pc user because i am the only person with spaces in my ssid oh is that a mac versus pc thing no it's just a mac people understand that words are separated with spaces and pc people are like gotta can't have spaces in words nothing will work add hyphens or underscores or squish all the words together or make it all caps and it's like no you can name your things with words but spaces between them like a civilized person oh my goodness
02:07:23 John: That's one of the first things I did with front and center, by the way.
02:07:25 John: When Lee started the project, he called it like front hyphen and hyphen center was the project name.
02:07:30 John: I'm like, no.
02:07:31 John: It's called front space and space center.
02:07:34 John: With capital F and capital C and lowercase a. Like a civilized... Wait, that's actually like all the files in Xcode and everything?
02:07:40 Marco: They have spaces in the paths?
02:07:42 Marco: The project is called that.
02:07:43 John: The files are called like, you know...
02:07:45 John: fnc app delegate dot swift or whatever right but but like but for the project there it isn't like you know front space and space center dot info dot plist or whatever like that's because that you're gonna you're just asking for problems it is like where where it uses where it uses the project name it does it with spaces like and that's where you can find out like if people lots of people post like here's the build script i use to increment my build number or whatever and they don't properly quote like the shell script it's like
02:08:11 John: But everything, as far as I can tell, everything in Apple's system from top to bottom doesn't care if you have spaces.
02:08:16 John: Like everything is properly quoted and no problems whatsoever.
02:08:20 John: And it is used in lots of places if you look at like the command lines it's running or how it builds stuff.
02:08:26 John: No problem with spaces.
02:08:27 John: That's asking for trouble.
02:08:29 John: I wouldn't do that.
02:08:30 John: It's not, though.
02:08:31 John: That's what I'm saying.
02:08:31 John: Like I thought it might be an issue.
02:08:33 John: Right?
02:08:33 John: But not at all.
02:08:34 John: Modern technology.
02:08:36 John: This is a solved problem.
02:08:38 John: It's only when people are sloppy and just make this assumption that, oh, there'll never be spaces in file names.
02:08:43 John: And the people who make those assumptions are bad people who aren't Mac users.
02:08:47 Marco: No, no.
02:08:47 Marco: They are.
02:08:48 Marco: And they write...
02:08:49 Marco: build scripts and they write X code at Apple.
02:08:51 Marco: And like they, you're right.
02:08:52 Marco: This isn't a technology problem.
02:08:54 Marco: It's a people problem.
02:08:55 Marco: And people make mistakes all the time.
02:08:57 Marco: And by having spaces in your programming paths, like you're, you're, you're just kind of inviting a whole bunch of mistakes to hit you.
02:09:04 John: Is,
02:09:04 John: it's a cultural thing it's it's like that they believe in their heart of hearts that people shouldn't be allowed to use spaces and therefore they code as if that will never be a thing that happens so that's why they're bad they're bad if you like do you remember the thing where the the the itunes installer would delete your hard drive remember that yeah that was because someone didn't think hard drives names have spaces in it it's like the default hard drive name has spaces macintosh space hd
02:09:26 Marco: but that was clearly like a unix person who's like oh you you don't put spaces in file names i don't have to worry about that case and it deletes people's drives yeah wasn't there a chrome update that did that too yeah just recently was it wasn't the kind of spaces though was it no i think i think it was something like that anyway i don't know i i feel like you you're being optimistic here because like because the problem is you know it's one thing when you're just dealing with arbitrary file names in an application fine but programming paths in particular rarely have spaces in them
02:09:53 Marco: And so if you're using some kind of programming environment or script or tools or whatever else, I think it's more likely than other contexts to have not been tested properly within the spaces in them because it's so rare in programming directory trees.
02:10:07 John: It's true.
02:10:08 John: And the kind of person who's a programmer is also more likely to be the kind of person who is in the mindset that you just shouldn't use spaces anyway, so you should be punished if you use them or not to worry about it.
02:10:17 John: But like I said, I thought that was a possibility when I made the new project for Swift for front and center.
02:10:23 John: But so far, like nothing in Xcode has blinked at it.
02:10:28 John: Like no problems whatsoever.
02:10:29 John: And I see like in the build logs and all the other stuff and all the different, you know...
02:10:33 John: the files it makes and the symbols and all like it's fine it's absolutely fine so if you're afraid of doing an xcode don't be afraid because and i would imagine xcode at this point is so well exercised and so many there are so many apple developers that surely there are enough of us putting spaces in it that if there's something in the guts of xcode that can't handle spaces it would be found really quickly so my experience has been xcode project names with spaces in them thumbs up

A Casey Settings Screen

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