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