24: Double Meta
00:00:00
◼
►
Don't pick the drop tables one though because Apple probably does not...
00:00:03
◼
►
is not protected against injection attacks.
00:00:06
◼
►
Yeah, right. Yeah, we'll take down the whole iTunes store.
00:00:08
◼
►
I do like "I'm double meta" or "meta" however you'd like to pronounce it. I thought that was good.
00:00:13
◼
►
Who says "meta"? I've heard that occasionally, but it's much more rare than, you know,
00:00:18
◼
►
the GIF GIF thing. Like, that's like 50/50, but "meta"? No, sorry. That's not good.
00:00:26
◼
►
This reminds me of when I brought up the bra phase in neutral.
00:00:30
◼
►
But I wrote my first VA list function a few minutes ago.
00:00:35
◼
►
Like, all this time, I've known that it's a thing.
00:00:38
◼
►
I've known that this is how you do variable argument list C
00:00:44
◼
►
But I've never actually needed to write one.
00:00:47
◼
►
Until like an hour ago.
00:00:49
◼
►
God, I did that at my first job, which was C++ for DOS.
00:00:55
◼
►
I don't remember why I did it, but I did it, and it was weird.
00:00:59
◼
►
So what did you use it for?
00:01:00
◼
►
Am I allowed to ask?
00:01:01
◼
►
Yeah, if you want.
00:01:03
◼
►
So for my new big thing, I've now
00:01:08
◼
►
done-- in substantially shipping products,
00:01:11
◼
►
I've now done both core data in the magazine.
00:01:16
◼
►
And granted, that's a pretty light use of core data,
00:01:18
◼
►
but it's still a shipping production use of this thing
00:01:23
◼
►
for a real app that's not entirely trivial.
00:01:26
◼
►
So I've used Core Data, and in Instapaper,
00:01:31
◼
►
I used SQLite just raw.
00:01:33
◼
►
And I made a few lightweight utility functions
00:01:38
◼
►
to wrap on top of it, but everything was really just done
00:01:42
◼
►
via raw queries and raw calls to the SQLite API.
00:01:46
◼
►
And I know it's not pronounced SQLite, and I don't care.
00:01:49
◼
►
I also say GIF.
00:01:54
◼
►
So, for my new project, now that I've seen both, I would like to get back to SQLite a
00:02:04
◼
►
little bit, just because Core Data is really nice for a very large set of things, but this
00:02:10
◼
►
is something where I expect to be dealing with a lot of data.
00:02:14
◼
►
And I know when you have large datasets that Core Data performance problems can pretty
00:02:19
◼
►
easily arise and can often be very, very hard to get around.
00:02:23
◼
►
So I decided to use Gus Mueller's awesome FMDB, which is a pretty lightweight wrapper
00:02:33
◼
►
around SQLite.
00:02:35
◼
►
And what I decided to build was a similarly lightweight model class on top of that.
00:02:43
◼
►
And this is probably -- this is one of those things where if you hear a programmer saying
00:02:47
◼
►
they made their own model class. Chances are it was a bad idea.
00:02:51
◼
►
And mine, chances are mine is probably a bad idea as well,
00:02:55
◼
►
but I'm doing it anyway, just like writing my own blog engine and roasting my own coffee.
00:02:59
◼
►
I'm doing these things anyway, even though it's generally not worth it, and I'm probably, like,
00:03:03
◼
►
so, okay, the main argument against this, this is the classic
00:03:07
◼
►
like, programmer know-it-all wanting to rewrite something really critical
00:03:11
◼
►
that everyone's done a million times, and chances are my version is gonna have bugs.
00:03:15
◼
►
You know, they're re-implementing UNIX joke or Emacs or Lisp or whatever the joke is.
00:03:20
◼
►
They're probably all three.
00:03:22
◼
►
- Is it Lisp? - It is Lisp? Okay. I thought it was Unix.
00:03:27
◼
►
Okay. I'll have to look that up.
00:03:31
◼
►
Actually, of course you're right, John. This is the kind of thing you would know.
00:03:34
◼
►
It's not re-implementing. It's like, you know, any program eventually includes a, you know,
00:03:40
◼
►
half-assed buggy re-implementation of Lisp or something like that. I'm paraphrasing.
00:03:44
◼
►
Yeah, I'm pretty sure that is the thing I'm referring to. Okay, anyway. So, and there's
00:03:49
◼
►
already probably a million of these things out there, but I don't like using other people's
00:03:54
◼
►
frameworks that do substantial, like, non-trivial things. I don't generally tend to use those,
00:04:02
◼
►
except apples and, you know, things that I just really could not write myself. But, and,
00:04:08
◼
►
you know, I'm okay using other people's, like, utility functions, stuff like that, and that's
00:04:12
◼
►
why I'm using FMDB, because not only do a lot of people use it, and Gus Mueller is a
00:04:15
◼
►
good programmer, but I can look at the code. It's not a very large library. It's actually
00:04:21
◼
►
very, very compact, and it really is just like, it's really just convenience wrappers
00:04:27
◼
►
around SQLite, for the most part. And so, you know, it's pretty thin.
00:04:33
◼
►
So you're not like an AF networking fan then?
00:04:37
◼
►
AF networking, I added it to the magazine fairly late.
00:04:41
◼
►
I think in the most recent version of the magazine,
00:04:43
◼
►
I think I added it for some relatively trivial thing.
00:04:48
◼
►
I really just wanted to try it.
00:04:50
◼
►
I know AF networking is very, very good,
00:04:52
◼
►
and its programmer.
00:04:53
◼
►
Is that Matt with three Ts?
00:04:55
◼
►
Thompson, who writes that?
00:04:56
◼
►
- I believe that's right.
00:04:58
◼
►
- Well anyway, he's really, really good.
00:04:59
◼
►
So that's the kind of, like,
00:05:01
◼
►
I have no problem using his code,
00:05:02
◼
►
'cause he's ridiculously good.
00:05:04
◼
►
So we'll have to look that up.
00:05:06
◼
►
I'm pretty sure it's him.
00:05:07
◼
►
But, and that's what I think, everyone uses AF networking,
00:05:11
◼
►
so I know that it probably is not buggy,
00:05:13
◼
►
and if there is a bug, it's probably gonna get
00:05:14
◼
►
fixed pretty quickly.
00:05:15
◼
►
So, and that's another thing, like, you know,
00:05:18
◼
►
they do a lot of things there.
00:05:20
◼
►
It's still a fairly thin layer, though.
00:05:23
◼
►
Like, I mean, different parts of it, I guess,
00:05:24
◼
►
are different widths, or thicknesses, but,
00:05:29
◼
►
but yeah, so anyway.
00:05:31
◼
►
Long story short, I decided to write my own model class.
00:05:35
◼
►
And this involves, you know,
00:05:39
◼
►
anytime you write something like this,
00:05:40
◼
►
there's a lot of weird design decisions you have to make.
00:05:43
◼
►
This is one of the first times I've really had to dive in
00:05:47
◼
►
to Objective-C runtime stuff.
00:05:50
◼
►
And I'm trying to avoid it being hacky and bad.
00:05:53
◼
►
And right now I'm calling into some runtime functions
00:05:56
◼
►
to basically do reflection.
00:05:58
◼
►
And I know we had a whole reflection topic
00:06:02
◼
►
on the topic list.
00:06:03
◼
►
I wonder if we can get to those now.
00:06:05
◼
►
- But we certainly can.
00:06:08
◼
►
But you know, like in dynamic languages,
00:06:11
◼
►
like most of the web languages,
00:06:12
◼
►
like the advanced scripting languages and stuff,
00:06:14
◼
►
it's easy to,
00:06:17
◼
►
it's very, very easy to like, you know,
00:06:19
◼
►
just inspect your variables and see what the class has
00:06:22
◼
►
and do crazy things to it and everything else.
00:06:26
◼
►
With Objective-C, a lot of that is possible.
00:06:29
◼
►
Some of it's not.
00:06:30
◼
►
But it's actually more possible than I thought it was.
00:06:34
◼
►
So, one thing I'm doing is, you know, the model class has its own dictionary mapping
00:06:42
◼
►
column names to their values.
00:06:44
◼
►
>> Oh, that's so awful, but carry on.
00:06:47
◼
►
>> Wait, hold on.
00:06:49
◼
►
>> Well, it's awful.
00:06:50
◼
►
>> This is the time to tell me.
00:06:52
◼
►
>> Well, it's awful in that coming from a .NET background and C# background, that is not
00:06:59
◼
►
at all how I would handle it.
00:07:00
◼
►
it. In Objective-C, that probably is exactly how I would handle it. So I'll tell you the
00:07:04
◼
►
other approach when you're done. So I'm sorry, carry on.
00:07:07
◼
►
No, please tell me now. Oh, all right. So you've just lost the floor
00:07:11
◼
►
for an hour, and John, you might as well just hang up. So one of the things I've been wanting
00:07:15
◼
►
to talk about on ATP for a long time is having a leg in both the .NET and the Objective-C
00:07:22
◼
►
and Cocoa worlds is that there's a lot of obvious differences between the two platforms.
00:07:29
◼
►
And by and large, I really, really like the decisions that Apple's made.
00:07:33
◼
►
And my friend Jamie Pinkham said to me once, when I was complaining about, for example,
00:07:38
◼
►
how convoluted handling dates are within Cocoa, he said, and I was saying, "Oh, why isn't
00:07:44
◼
►
there just a date class that handles everything?"
00:07:46
◼
►
And he said it more eloquently than I'm about to recount it, but he said something to the
00:07:50
◼
►
order of, "Is it really that complex or is it just properly abstracted?"
00:07:55
◼
►
And it was one of those, you know, total mind explosions.
00:07:58
◼
►
And I was like, you know what, you're actually right about that.
00:08:00
◼
►
And so, by and large, I think that that Koko and Koko Touch are really, really well done.
00:08:04
◼
►
However, reflection in Koko and Koko Touch, not as well done as I would like.
00:08:10
◼
►
So, let's give you an example by way of how would I have done the same thing in .NET.
00:08:15
◼
►
And this all cued for me when you tweeted about three or four days ago about what do
00:08:22
◼
►
you call the thing that represents the unique identifier for an object?
00:08:27
◼
►
Naturally, in most languages, that would be ID.
00:08:31
◼
►
But in Objective-C, you can't really do that because ID is a key.
00:08:34
◼
►
That's not true, actually. You can. It works just fine.
00:08:37
◼
►
Which is a little bit scary, which is probably why you shouldn't do it.
00:08:40
◼
►
But it does work. You can name a variable ID.
00:08:43
◼
►
Mine was even type ID.
00:08:46
◼
►
God, that makes me hurt so bad.
00:08:49
◼
►
But the point I'm driving at is whether or not it's tactically allowed,
00:08:52
◼
►
it's just not a good plan. And I think we can all agree about that.
00:08:55
◼
►
So, what would I have done in .NET?
00:08:57
◼
►
Well, what's really great about .NET is reflection is, in my personal opinion, kind of a first
00:09:02
◼
►
class portion of the language.
00:09:04
◼
►
And .NET is really metadata heavy.
00:09:06
◼
►
So what that means is, when I have what a .NET programmer would call a field, but an
00:09:12
◼
►
Objective C programmer would call an IVAR, basically a variable within a class, I can
00:09:17
◼
►
actually decorate that variable with arbitrary things that we call attributes.
00:09:22
◼
►
So if you imagine a class definition, you can say that you have a variable that's called
00:09:29
◼
►
unique identifier, for example.
00:09:32
◼
►
You can put an attribute that's associated with that variable, and that attribute is
00:09:37
◼
►
actually an instance of a class that inherits from a certain base class called, guess what,
00:09:43
◼
►
So I could make an attribute that decorates that field that specifies what the column
00:09:50
◼
►
name is for that IVAR. So let me play this back. I've got a class. I've got a class that's in my
00:09:58
◼
►
application that may or may not use the same terms as I want to use in my data store. So I could call
00:10:07
◼
►
whatever this is, this variable, like I said, unique identifier, I could call that unique
00:10:13
◼
►
identifier in my C# code, but I could decorate it with an attribute that says, "Hey, when
00:10:20
◼
►
you go back to the database, it's actually called ID."
00:10:24
◼
►
And so that's really, really powerful, being able to easily, and that's the key here, easily
00:10:30
◼
►
introspect and reflect upon yourself and see what metadata you have about your own classes.
00:10:37
◼
►
And I use this constantly.
00:10:39
◼
►
When I first learned about it, it was one of those things where I had a hammer, so everything
00:10:42
◼
►
was a nail. And I'm not proud of that. But as I've gotten to be a more mature programmer,
00:10:49
◼
►
I still use this all the time. And you can write your own custom attributes, like I said.
00:10:54
◼
►
You can use a ton of existing attributes. But being able to decorate your code and give
00:11:00
◼
►
yourself help on what to do with your code is the most powerful thing in the world. So
00:11:06
◼
►
to bring this back to Coco, what I would have liked to have been able to do is do the same
00:11:10
◼
►
thing or for you to have been able to do is to do the same thing and have this IVAR that's
00:11:14
◼
►
maybe called identifier but in the database is called ID and you don't have to have a
00:11:20
◼
►
stupid freaking dictionary or hash table or whatever the case may be hanging out doing
00:11:25
◼
►
that conversion. It's all in line. It's a first class part of that class. Did that make
00:11:31
◼
►
any sense at all?
00:11:32
◼
►
It did. That's actually really cool.
00:11:35
◼
►
Because, I mean, I don't even-- I think--
00:11:38
◼
►
I think there actually is buried in the runtime a way
00:11:42
◼
►
in Objective-C to attach arbitrary objects to any NS
00:11:46
◼
►
But I don't think it's supposed to be exposed.
00:11:49
◼
►
And either way, you probably shouldn't
00:11:52
◼
►
be doing things with that.
00:11:54
◼
►
There's a lot of things with designing low level model
00:11:59
◼
►
and reflection type classes and things like that.
00:12:02
◼
►
There's a lot of times where like,
00:12:04
◼
►
there's something you can do that you probably shouldn't do
00:12:07
◼
►
and a lot of room for terrible hacks.
00:12:10
◼
►
- Right, and you could do an associated object,
00:12:12
◼
►
but that's a little bit different
00:12:13
◼
►
because that's more of saying,
00:12:15
◼
►
I'm probably gonna butcher this
00:12:16
◼
►
because I haven't done it in a while,
00:12:17
◼
►
but if memory serves, that's saying,
00:12:19
◼
►
hey, for this instance of this class,
00:12:22
◼
►
I wanna have this arbitrary object associated with it.
00:12:25
◼
►
Whereas what I'm talking about is at a class level,
00:12:27
◼
►
I'm defining an additional piece of metadata that's part of that class definition.
00:12:34
◼
►
And again, it's just extremely powerful.
00:12:35
◼
►
And I think you're right, Marco.
00:12:36
◼
►
I think you can do a lot of this with Objective-C. And I've looked into reflection in Objective-C.
00:12:40
◼
►
And a lot of it is possible, a whole heck of a lot of it.
00:12:45
◼
►
But the thing that's crummy about it, and we've complained about this as a threesome
00:12:49
◼
►
before, is that you've got to drop into the C runtime.
00:12:52
◼
►
You were saying this just a few minutes ago.
00:12:54
◼
►
You gotta drop into the Objective-C runtime, which is all straight C, which once you get
00:12:58
◼
►
used to the cushy world of Objective-C, it's just...
00:13:03
◼
►
Well, it's not that.
00:13:04
◼
►
I mean, you know, I had to write "Malloch" and "Free" earlier today for the first time
00:13:07
◼
►
in a while, but it's like ten lines of C in the middle of this wonderful Objective-C
00:13:13
◼
►
cushy playland.
00:13:14
◼
►
I mean, it's not that bad.
00:13:18
◼
►
So what would you have done in PHP?
00:13:20
◼
►
And John, I'd like to know where Perl fits in,
00:13:22
◼
►
if we ever give you a chance to talk.
00:13:24
◼
►
What would you have done if you were trying
00:13:26
◼
►
to solve the same problem in PHP?
00:13:27
◼
►
- Well, I have solved the same problem in PHP.
00:13:29
◼
►
I use for Instapaper, for the magazine, for the new things.
00:13:33
◼
►
I do use my own MVC framework
00:13:36
◼
►
that is very thin and lightweight,
00:13:37
◼
►
so I can use SQL directly.
00:13:39
◼
►
All the same goals, actually.
00:13:41
◼
►
Well, most of the same goals.
00:13:42
◼
►
And so I have solved this problem in PHP,
00:13:46
◼
►
And I basically, I think I do roughly the same thing
00:13:51
◼
►
with like, you know, storing the attributes
00:13:54
◼
►
of a model object as a dictionary of, you know,
00:13:58
◼
►
strings to value, of keys to values,
00:14:00
◼
►
and those keys match database column names.
00:14:03
◼
►
And, you know, there's all sorts of things you can do.
00:14:06
◼
►
By the way, I love, if Merlin is actually listening to this,
00:14:09
◼
►
and if he's still listening, I'm getting him back so hard
00:14:12
◼
►
for all that comic book talk and backdoor.
00:14:17
◼
►
This is glorious.
00:14:19
◼
►
So you know, there's always-- this
00:14:23
◼
►
is one of the reasons why I like doing this kind of programming
00:14:26
◼
►
at this level, solving these kinds of problems,
00:14:29
◼
►
even though they've been solved a million times before,
00:14:31
◼
►
even though my implementation might not
00:14:33
◼
►
be very good for some people or for some things or for myself,
00:14:36
◼
►
I love it because there's so many design decisions
00:14:40
◼
►
that you can make that really do have a pretty big impact.
00:14:43
◼
►
So one of the things-- and I don't
00:14:46
◼
►
want to talk about this for too much of the show,
00:14:48
◼
►
just because I think it will get a little bit boring, even
00:14:50
◼
►
for people who aren't Merlin.
00:14:51
◼
►
But I think one of the things about--
00:14:55
◼
►
one of the hardest parts about this
00:14:57
◼
►
is how do you expose the database fields on the object,
00:15:01
◼
►
and how much code or boilerplate has
00:15:05
◼
►
to be written in the subclasses?
00:15:09
◼
►
So in the model classes, how much do you have to do?
00:15:13
◼
►
and how are the columns represented.
00:15:14
◼
►
So in my thing, I actually do a very similar trick
00:15:18
◼
►
to what Core Data does.
00:15:19
◼
►
Because you can tell at runtime, which I actually
00:15:22
◼
►
don't know why you can tell this at runtime, but you can.
00:15:25
◼
►
You can tell at runtime whether a property was declared
00:15:30
◼
►
dynamic, or rather whether its implementation was declared
00:15:34
◼
►
dynamic, and if it has custom getters or setters.
00:15:39
◼
►
All that stuff is available at runtime from the runtime APIs.
00:15:42
◼
►
So I'm basically making it so that you can set and get
00:15:47
◼
►
arbitrary column names just via a dictionary API.
00:15:50
◼
►
But it also treats any dynamic property as a database column.
00:15:56
◼
►
And then it does useful things.
00:15:58
◼
►
So you can have a property that's an NSURL.
00:16:01
◼
►
And if you declare it dynamic in the implementation file,
00:16:05
◼
►
then the runtime will see that.
00:16:07
◼
►
And so at runtime, it'll say any access to and from that
00:16:11
◼
►
is the database field named that.
00:16:14
◼
►
And then you can just call save, and it works.
00:16:16
◼
►
And you can call the query functions, get them,
00:16:21
◼
►
and it maps into them on read.
00:16:23
◼
►
So it's a very simple model layer.
00:16:29
◼
►
This is one of the reasons why I write my own model
00:16:31
◼
►
layers in the languages that I like.
00:16:35
◼
►
I don't usually like the model layer to have to do that much.
00:16:39
◼
►
And specifically, I treat databases the way
00:16:43
◼
►
that most programmers of previously high-traffic web
00:16:46
◼
►
applications treat databases, which
00:16:49
◼
►
is infrequently and gently.
00:16:51
◼
►
And so I don't like ORMs and really these crazy,
00:16:57
◼
►
very high-functioning model type APIs,
00:17:01
◼
►
where they'll go look up associated objects for you
00:17:04
◼
►
and do extra queries on your behalf.
00:17:06
◼
►
And I don't like query builders.
00:17:08
◼
►
I like to write the query myself so I
00:17:10
◼
►
can choose exactly how it's queried in the database
00:17:12
◼
►
and optimize it.
00:17:15
◼
►
And I don't like anything that creates the tables for me.
00:17:17
◼
►
I don't like the core data gooey about the model declarations
00:17:23
◼
►
and the migrations.
00:17:24
◼
►
Oh, migrations are rough.
00:17:26
◼
►
So I'm basically doing something that-- it
00:17:32
◼
►
is more of a convenience wrapper than a functional wrapper,
00:17:35
◼
►
if that makes sense.
00:17:38
◼
►
it's not doing a whole bunch of magic,
00:17:40
◼
►
it's just getting rid of boilerplate.
00:17:43
◼
►
Does that make sense?
00:17:46
◼
►
And I guess to me, I view a model as the buffer
00:17:51
◼
►
between the completely myopic database world
00:17:55
◼
►
and the completely myopic application level.
00:17:59
◼
►
And to me, and I agree with you
00:18:01
◼
►
that a model should be extremely dumb.
00:18:03
◼
►
It should basically be a bucket and nothing else,
00:18:06
◼
►
But I would hate not having it around because I want my application code to speak with classes,
00:18:13
◼
►
to classes and very little else.
00:18:15
◼
►
And I want my database to speak to itself in some lay intermediary layer that translates
00:18:20
◼
►
from database to model and back.
00:18:22
◼
►
And I think we're saying the same thing.
00:18:24
◼
►
But I can't, when you said I'm writing a model and oh, I can't believe I'm doing that, et
00:18:28
◼
►
cetera, et cetera.
00:18:30
◼
►
That just, it struck me funny because I would hate not to have one.
00:18:35
◼
►
Yeah, I was about to say, John, where do you land on all this?
00:18:38
◼
►
I want to get back to something that Marco said in the beginning when he introduced this
00:18:42
◼
►
topic about how he was making his own model class, and that's probably a mistake, in case
00:18:48
◼
►
he said he thought it wasn't.
00:18:50
◼
►
Thinking about this topic, I see that a lot as kind of like a class system, pun, for programmers.
00:19:00
◼
►
I don't think you have to label your puns.
00:19:01
◼
►
Yeah, maybe Marco has a lot of-- but I mean it like-- you know, you know how I mean it.
00:19:05
◼
►
Maybe Marco has not seen this as much as Casey, who's been out in a J-O-B job for longer,
00:19:11
◼
►
but I see it all the time.
00:19:15
◼
►
People can draw distinctions of all sorts with programmers based on their experience,
00:19:18
◼
►
what language they use, what their education is or whatever.
00:19:21
◼
►
This distinction, I think, is the most important one, much more so than any of those other
00:19:25
◼
►
No matter what their education is, how long they've been doing it, what language they're
00:19:27
◼
►
writing in, I usually tend to bin programmers into two groups.
00:19:33
◼
►
One is the programmers who take something that someone else wrote and use it to make
00:19:41
◼
►
They learn Ruby on Rails and they make a web application.
00:19:45
◼
►
They learn UIKit and they make an iOS application.
00:19:50
◼
►
And those people distinguish between the magical elves that make the things they're going to
00:19:56
◼
►
use to write their program and their program.
00:19:59
◼
►
And the second set of people make no distinction between the things they're using to write
00:20:04
◼
►
the program and their program.
00:20:06
◼
►
It's all one continuous thing.
00:20:08
◼
►
And those are the people who are going to write their own thing, even though the vendor
00:20:13
◼
►
provides one.
00:20:14
◼
►
Or those are the people who are going to write their own web frameworks, or their own blog
00:20:18
◼
►
engines, or like, in the extreme case, their own language.
00:20:21
◼
►
Like it's a complete continuum, and there's no hard and fast line between, "These are
00:20:25
◼
►
the words that I type to make my program work, and this is my program. I don't know if you want to
00:20:30
◼
►
call tool builders, because you don't necessarily have to be that type of thing, but there are some
00:20:33
◼
►
people who will never cross that line. In every environment they find themselves in programming,
00:20:39
◼
►
they will draw that distinction somewhere and say, "That is other, and I don't do that, and that is
00:20:43
◼
►
magic, and I call those things to make my program work, and then my program is a series of
00:20:47
◼
►
conditionals and loops and variables and classes or whatever that use that thing to do their work."
00:20:52
◼
►
I think that distinction is—like when I heard Marcus say, "Oh, I probably shouldn't
00:20:58
◼
►
write there.
00:20:59
◼
►
I probably shouldn't write my own model class," being afraid to try to draw that line and
00:21:05
◼
►
using it as a barrier and saying, "I shouldn't cross over the line."
00:21:07
◼
►
Now, one is practicality.
00:21:08
◼
►
Like, maybe you shouldn't write your own language in compiler to do this tip calculator program
00:21:12
◼
►
or something, right?
00:21:14
◼
►
That's one side of it.
00:21:15
◼
►
The other side of it is that I see a lot of people who draw that line and are afraid to
00:21:17
◼
►
ever cross it.
00:21:18
◼
►
Everyone starts with that line because you don't know what the heck you're doing when
00:21:20
◼
►
you start out, right?
00:21:22
◼
►
I would encourage everybody who thinks they can recognize that line to realize that line
00:21:26
◼
►
doesn't exist. It's all just one big continuum of code written by people. And there's no
00:21:31
◼
►
reason you can't write a better one of whatever it is that you're using all the way up and
00:21:34
◼
►
down the chain. And in some cases, you should. And obviously, you know, like knowing when
00:21:39
◼
►
you should and when you shouldn't is a whole separate matter. But never like, you know,
00:21:43
◼
►
I wouldn't even Marco, just like, if there's a reason not to do it, it's not because like,
00:21:48
◼
►
"Oh, I'm going to screw it up. I'm not going to do it."
00:21:50
◼
►
People who made those things are, at a certain point, they're just other people too.
00:21:54
◼
►
Who made FMDB? It's just another guy.
00:21:57
◼
►
The only way you'll ever get good at doing something like that
00:22:00
◼
►
is to decide, "I'm going to make my own thing here."
00:22:03
◼
►
And then your thing might not be as good, but the fifth version of your thing will be as good,
00:22:07
◼
►
and then you've just become one of those people. Now that line is gone.
00:22:10
◼
►
So that's my take on this whole meta topic.
00:22:15
◼
►
I'm going to get a meta topic for a metadata topic.
00:22:18
◼
►
I'm double meta.
00:22:20
◼
►
And as for the actual things you're all talking about there,
00:22:23
◼
►
I don't want to go, well, Simpsons did it on you.
00:22:25
◼
►
But I always do.
00:22:26
◼
►
Simpsons did it, right?
00:22:27
◼
►
So all this stuff is kind of all that in the Perl world.
00:22:31
◼
►
And the path that I've sort of traveled--
00:22:34
◼
►
and I think a lot of the Perl community
00:22:35
◼
►
has traveled on the same topic-- is in the beginning,
00:22:43
◼
►
you've got a way to send SQL queries somewhere,
00:22:46
◼
►
and that's annoying, and someone writes some nicer way
00:22:48
◼
►
to wrap that up, and that's nicer,
00:22:50
◼
►
but then you're like, okay, well now I wanna make
00:22:52
◼
►
some classes associated with things
00:22:54
◼
►
that are gonna be associated with tables,
00:22:55
◼
►
and it's kind of annoying to write all that,
00:22:58
◼
►
which fields are associated with which columns,
00:23:00
◼
►
and like Marco was getting to,
00:23:01
◼
►
how much do I have to write?
00:23:03
◼
►
After you've done 10 or 20 of those things,
00:23:04
◼
►
at a certain point you're like,
00:23:05
◼
►
can I type less and get the same effect?
00:23:07
◼
►
And then you're like, you know what,
00:23:10
◼
►
can I type even less?
00:23:11
◼
►
like the ActiveRecord Rails type thing where you're like, "Why do I have to type anything?
00:23:14
◼
►
Can't I just inspect the database and figure out what all the columns are and do all that
00:23:18
◼
►
stuff for me?"
00:23:19
◼
►
And it's like, "Look, I can type one line and my whole thing is done."
00:23:24
◼
►
And you can do that in dynamic languages.
00:23:26
◼
►
You can probably do that in Objective-C if you really wanted to get down and dirty with
00:23:29
◼
►
the Objective-C runtime, although you probably don't.
00:23:31
◼
►
But just don't have anything.
00:23:34
◼
►
Just inspect the database, figure out the classes, figure out the tables, make your
00:23:39
◼
►
classes based on them, have a thing that manages the conventions for naming and also the crap.
00:23:45
◼
►
I think the next step beyond that, which I found probably the biggest leap—the first
00:23:51
◼
►
biggest leap was the one where you get into the race to see how little typing you can
00:23:55
◼
►
do to get useful work done.
00:23:56
◼
►
The second biggest leap, I think, is when you get to the point where you realize that
00:24:01
◼
►
tying your classes to the structure of your database tables is a terrible idea, not just
00:24:07
◼
►
like in terms of the field names, but structurally, period, because maybe this doesn't happen
00:24:11
◼
►
in small projects or projects with a single developer, but in large projects in big companies
00:24:16
◼
►
that evolve over many, many years. Inevitably, the structure of your database has almost
00:24:20
◼
►
no relation to the way you want your application to work. Like, not at all. Not on the table
00:24:24
◼
►
basis, not on anything, like it's just ridiculously divergent. And in some ways you could say,
00:24:28
◼
►
well, that's bad because things are diverging and they're getting all messed up. But sometimes
00:24:32
◼
►
it's necessary because the way your data is structured has to evolve in a direction for
00:24:36
◼
►
for performance or scaling reasons that has no bearing whatsoever
00:24:39
◼
►
on how you would like to deal with it in your application.
00:24:41
◼
►
So I think the next step in the sequence is to give yourself tools
00:24:45
◼
►
to get your data out of the database,
00:24:47
◼
►
but make sure you don't tie any of what you guys are calling model objects,
00:24:51
◼
►
although I hate that term.
00:24:53
◼
►
You don't tie any of the inner workings of your application
00:24:56
◼
►
to the structure or storage location
00:24:57
◼
►
or anything having to do with the stuff in the database.
00:25:00
◼
►
You still need some tool to make it so you don't have to type a million lines of code
00:25:02
◼
►
every time you want to get data out of the database
00:25:04
◼
►
and inflate your values into URL objects and data objects
00:25:08
◼
►
and do all that nice stuff.
00:25:09
◼
►
You still want to be able to not have to type
00:25:12
◼
►
that annoying boilerplate code,
00:25:14
◼
►
but you have to make another box on the graph and say,
00:25:17
◼
►
"Okay, this is my code that gets the crap
00:25:19
◼
►
"out of the database.
00:25:20
◼
►
"This is what's getting created from the data
00:25:22
◼
►
"in the database."
00:25:23
◼
►
And those two are pretty much entirely unrelated.
00:25:25
◼
►
So, and actually, this helps in development too,
00:25:27
◼
►
because you can mock up the stuff
00:25:28
◼
►
that you don't have in the database
00:25:30
◼
►
and other stuff, you can just have text files
00:25:31
◼
►
and other stuff you can just hard code stuff
00:25:33
◼
►
or like the rest of your application won't care because it deals with things that have no relation to the storage location or structure of the thing.
00:25:39
◼
►
And sometimes even when you're doing a project yourself that can free you to say
00:25:43
◼
►
this is the correct table structure, which you know from like just doing database stuff
00:25:47
◼
►
you know which queries are gonna be efficient, what indexes you need, what things should be normalized and not.
00:25:51
◼
►
But when I'm in my application, it would be convenient if the structure was really like this.
00:25:55
◼
►
So make the things that your application deals with look the way they're most convenient for the application to deal with and then have some
00:26:00
◼
►
of layer, which yes, is sometimes annoying to write, but it will save you later, some
00:26:04
◼
►
sort of layer that translates between the two in sometimes Byzantine ways.
00:26:10
◼
►
So that I think is a case where all the things you're talking about with reflection come
00:26:16
◼
►
in at every level of that, because the thing you make that makes it convenient for you
00:26:18
◼
►
to get stuff out of the database, that needs metadata.
00:26:20
◼
►
And then the next thing that you make that takes the data from the database and puts
00:26:24
◼
►
it into the things that your application is going to deal with, like your application's
00:26:28
◼
►
idealized view of the world that doesn't reflect the possible nastiness of the database because
00:26:33
◼
►
of weirdness, that needs some metadata to do that thing because you don't want to write that code
00:26:38
◼
►
up all by yourself. And then finally your application and your top-level thing gets to deal
00:26:42
◼
►
with objects that are magically delicious, that are just like, "Wow, this is so convenient. This
00:26:46
◼
►
is exactly what I needed for my application." It's your idealized view of the world. Wouldn't it be
00:26:52
◼
►
great if we just had three objects and they did this and you're like this? It's so hard to do that
00:26:56
◼
►
when you're an experienced programmer, because you think,
00:26:58
◼
►
"But I can't, that object can't exist to do that,
00:27:00
◼
►
because I know that's going to be on these two tables,
00:27:02
◼
►
and this information is from a third table."
00:27:04
◼
►
And so you end up making things that are tied to your database table.
00:27:08
◼
►
So that's more or less the path I've walked on this topic
00:27:13
◼
►
in Perl and in other languages.
00:27:15
◼
►
And some people, they call it anti-ORM backlash,
00:27:19
◼
►
because the ORM is the active record phase,
00:27:21
◼
►
and you get to that phase and you realize you're kind of in a dead end
00:27:23
◼
►
and you've done a terrible thing.
00:27:25
◼
►
but you're not really. You've created something that's useful, but you need something else as
00:27:31
◼
►
well. So everything that you've done is helping you move forward. There's just another place where
00:27:39
◼
►
you can also move forward. That was a lot of stuff. Yeah, I'll just let that settle in.
00:27:47
◼
►
I think you're right, though, that there's always
00:27:51
◼
►
this kind of battle between the objects that
00:27:56
◼
►
are fully abstracted from the data and the messiness
00:27:59
◼
►
or the structure of the database.
00:28:02
◼
►
One of the things that I think Core Data does a little bit
00:28:07
◼
►
badly for my taste is that it's too much on that object side
00:28:11
◼
►
where Core Data, even though it is based on a database storage
00:28:16
◼
►
and in many ways behaves like a database.
00:28:19
◼
►
In many ways it doesn't let you treat it like a database.
00:28:23
◼
►
And so you're kind of like, there's a whole class of operations
00:28:28
◼
►
that are very easy to do in a database.
00:28:31
◼
►
Things like a lot of things involving multiple records or batches or ranges or things like that.
00:28:35
◼
►
Things that core data either can't do very well or can't do at all.
00:28:39
◼
►
Yeah, it's trying to give you the idealized object version,
00:28:42
◼
►
but not letting you say anything about the database.
00:28:45
◼
►
It's like, "You don't worry about the database.
00:28:47
◼
►
You just tell us how you want the idealized view of the world in your application, and
00:28:50
◼
►
we'll just persist that."
00:28:52
◼
►
And you're like, "Really, I would like to have some influence over that process, because
00:28:56
◼
►
I have some ideas that you may find interesting."
00:28:58
◼
►
Right, exactly.
00:29:00
◼
►
And a lot of times, it's also necessary for performance.
00:29:04
◼
►
When you have an app that has a ton of data or that has maybe one table or one object
00:29:11
◼
►
type that has a lot of entries and they're all very small or something, and you want
00:29:14
◼
►
to do some kind of batch, like that kind of thing.
00:29:16
◼
►
Yeah, because you structure your data so—because you know the seven queries that your application
00:29:21
◼
►
is going to run most of the time, and you know what will make those queries fast and
00:29:24
◼
►
what will not make them fast.
00:29:25
◼
►
And Core Data, as far as I'm aware, gives you no way to influence the way it stores
00:29:31
◼
►
You just make your convenient object graph, and you have to either guess or intuit or
00:29:35
◼
►
understand enough about Core Data's implementation of how it's going to lay that out and have
00:29:38
◼
►
to know what operations does Core Data make available, and what queries will that translate
00:29:42
◼
►
into, and will those be efficient?
00:29:43
◼
►
And that's like, you would rather just,
00:29:45
◼
►
you know, look, I know these are gonna,
00:29:46
◼
►
like some app, I bet applications probably just run like,
00:29:49
◼
►
you know, three possibly performance critical queries
00:29:51
◼
►
all the time.
00:29:52
◼
►
And you just say, look, core data, just do this.
00:29:56
◼
►
This is all I want.
00:29:57
◼
►
Everything else, I don't care what you do,
00:29:57
◼
►
but these are the three essential queries.
00:29:59
◼
►
And it's like, nope, I will structure your stuff for you.
00:30:01
◼
►
You don't worry about it.
00:30:02
◼
►
So like for small applications, that's fine,
00:30:04
◼
►
but anyone's done a web application.
00:30:06
◼
►
That's not like they're taking you to core data
00:30:07
◼
►
with web applications, but at a certain point,
00:30:10
◼
►
native applications start, they're not web scale,
00:30:13
◼
►
but the timing is much more critical and the devices are slower.
00:30:17
◼
►
So at a certain point, even a native application, you would like to have
00:30:21
◼
►
that kind of influence, which is why, Marco, you keep coming back to
00:30:25
◼
►
doing your own thing with raw SQLite, because then you have control over that.
00:30:29
◼
►
Exactly, because you have the SQLite on one side, which is
00:30:33
◼
►
SQLite, however you say it, I'm going to pronounce it every different way during the show.
00:30:37
◼
►
Don't let me bully you into my way of saying it. You say it however you want.
00:30:41
◼
►
something like SQLite.
00:30:43
◼
►
Yeah, I don't know what the official one is either.
00:30:45
◼
►
I say it the way I say it.
00:30:47
◼
►
Anyway, SQLite, we're going to say it every way.
00:30:49
◼
►
Alright, that thing, you have that
00:30:51
◼
►
on one side and that
00:30:53
◼
►
doesn't know anything about objects.
00:30:55
◼
►
About your objects and your code. Like it's totally
00:30:57
◼
►
just raw. There's no
00:30:59
◼
►
attempt to even
00:31:01
◼
►
to even do anything higher level
00:31:03
◼
►
than just database rows and that's
00:31:07
◼
►
Then on the other end you have core data, which is
00:31:09
◼
►
all about the objects and their mappings,
00:31:11
◼
►
and it doesn't expose anything about the database,
00:31:16
◼
►
and pretends like the database isn't there,
00:31:17
◼
►
to you, the user of it.
00:31:19
◼
►
And so my thing is kind of in the middle.
00:31:23
◼
►
And I actually do intend to open source this.
00:31:27
◼
►
I'm writing with the intention of open sourcing it,
00:31:29
◼
►
and writing it to be a standalone piece so it can be.
00:31:32
◼
►
But, oh, who knows when I'll get to that.
00:31:35
◼
►
I do intend to do that, maybe later this fall.
00:31:38
◼
►
But, you know, my thing, I want to be in the middle of that continuum because I feel like
00:31:46
◼
►
there isn't, there aren't enough choices there. And what's there, a lot of, what's there is
00:31:50
◼
►
basically a whole bunch of people like me making the things for themselves to vary,
00:31:55
◼
►
with varying degrees of success, varying degrees of people using it and reporting bugs, and
00:31:59
◼
►
varying degrees of functionality. And it's a lot like to-do apps. Like, if you're the
00:32:04
◼
►
the kind of person who can make one of these model layers
00:32:07
◼
►
or something like this.
00:32:09
◼
►
The chances that you're going to be happy enough
00:32:11
◼
►
with somebody else's to want to just use theirs instead
00:32:14
◼
►
of making your own is pretty low.
00:32:17
◼
►
And so for me, I'm doing my own thing
00:32:21
◼
►
like I usually do, which is sometimes good, sometimes bad.
00:32:27
◼
►
And so yeah, I'm making this thing
00:32:30
◼
►
between SQLite and Core Data.
00:32:33
◼
►
and I'm going to use it, and we'll see what happens, I guess.
00:32:37
◼
►
I think in native applications, again, not that they're small, small, but you're not
00:32:43
◼
►
writing a system for a product that's going to have seven incarnations.
00:32:51
◼
►
If you are making, let me think of something like this, not Gmail, not LinkedIn, maybe
00:32:57
◼
►
Facebook, some sort of big giant web service used by millions of people that has 10 different
00:33:02
◼
►
ways to interface with it, even just within their own company.
00:33:06
◼
►
That's where you really want to have your data access layer, and then above that have
00:33:11
◼
►
your object layer that gives you the idealized representation, and then have a whole bunch
00:33:16
◼
►
of other people in the company or whatever writing business logic, writing automation
00:33:20
◼
►
things, writing stuff.
00:33:21
◼
►
And all they ever use is the idealized view of the product, which has an ever-changing
00:33:29
◼
►
relationship with how things are actually stored or used so that you're isolating the whole rest of the people,
00:33:34
◼
►
you know, I just talked about this line between the people who are writing the thing and people who are using the thing.
00:33:37
◼
►
Individual programmers shouldn't see that line, but if you're trying to scale up a company,
00:33:42
◼
►
it's a good idea to have people building at various layers, and you want everyone who's just writing,
00:33:47
◼
►
you know, a bunch of reports that run or a bunch of jobs that do maintenance stuff or the people who write the web front end
00:33:52
◼
►
or the people who write the native app.
00:33:53
◼
►
You want all of those people to be using an interface that has almost no relation to the implementation if you could possibly help it
00:34:00
◼
►
And then another set of people dealing with
00:34:03
◼
►
How that you know idealized view of the product interfaces with the data store back in it because they're gonna constantly have to change it
00:34:09
◼
►
They use different data stores. They're gonna rearrange stuff. They're gonna do normalize tables. They're gonna rename things
00:34:13
◼
►
They're gonna do different versions of tables and up and you know, and you don't want anyone else to see that
00:34:17
◼
►
But when you're just doing one native iOS application, maybe with a web service or something
00:34:21
◼
►
especially if you're using a different language for it, the web part of it, it's probably
00:34:26
◼
►
not critical that you make this kind of enterprise-y distinction.
00:34:29
◼
►
I just offered it up as like the next evolution of, so you've gone and done yourself an active
00:34:36
◼
►
writer record type thing which queries the database and gets a structure and builds all
00:34:39
◼
►
your classes on the fly according to some convention with a pluralizer and all this
00:34:42
◼
►
other stuff, and you're still sad.
00:34:44
◼
►
Maybe it's because you actually want that next thing.
00:34:47
◼
►
Well, why don't you tell us about something that's pretty awesome, and then I want to
00:34:51
◼
►
speak in favor of Core Data briefly, then we can give up on this probably extremely
00:34:55
◼
►
boring topic.
00:34:56
◼
►
All right. How are you hanging there, Merlin? You're almost there. All right. This week,
00:35:02
◼
►
we are sponsored once again by Hover. Hover is high quality, no hassle domain registration.
00:35:10
◼
►
So they believe that everyone should be able to take control of their online identity,
00:35:15
◼
►
have your own domain name, and they make it easy to do so. They offer .NET, Co, Com, TV,
00:35:21
◼
►
tons of country code TLDs. There's all these TLDs out there now. They keep making new ones.
00:35:28
◼
►
Hover keeps adding them. It's great. So they take all the hassle and friction out of owning
00:35:34
◼
►
and managing domain names. Now, I bet everyone listening to this show is probably nerdy enough
00:35:39
◼
►
to have bought a domain name in the past. And if you bought a domain name anywhere else,
00:35:43
◼
►
I imagine you were not that happy with the experience because I've bought them in a lot
00:35:48
◼
►
of places and they're pretty rough.
00:35:53
◼
►
Most of the places are pretty rough.
00:35:55
◼
►
Hover is to me like a breath of fresh air.
00:35:57
◼
►
They are just so easy, they're honest.
00:36:00
◼
►
They don't try to upsell you with all sorts
00:36:03
◼
►
of weird sleazy stuff.
00:36:04
◼
►
There's no check box on checkout that's like,
00:36:07
◼
►
"Don't not stop sending me the newsletter
00:36:09
◼
►
"that doesn't sell my privacy for $10 a month."
00:36:11
◼
►
They don't try to mislead you,
00:36:13
◼
►
they don't try to get all sleazy
00:36:15
◼
►
and get more money out of you.
00:36:16
◼
►
money out of you. It's just honest, direct, straightforward domain sales. And their management
00:36:21
◼
►
system is very good too. It's well designed, there's easy access to all the features they
00:36:27
◼
►
offer and they do offer quite a lot. And in fact, they actually just added something new.
00:36:31
◼
►
They added Google Apps for Business. You can add Google Apps for Business to any domain
00:36:36
◼
►
from Hover, new or old domains. They even give you a free 30-day trial on that and then
00:36:42
◼
►
prices start at $6 a month per user.
00:36:46
◼
►
It's really great.
00:36:46
◼
►
So anyway, go to hover.com/ATP.
00:36:50
◼
►
You can use promo code ATP to get 10% off.
00:36:54
◼
►
And you should, of course, you should do that.
00:36:55
◼
►
I mean, I use Dan's promo codes forever.
00:36:57
◼
►
You can use ours.
00:36:58
◼
►
So use promo code ATP at hover.com to get 10% off.
00:37:03
◼
►
Any domain purchase and any service purchase.
00:37:06
◼
►
Hover's a great company, really.
00:37:07
◼
►
They even have like, they have no-hold phone service.
00:37:12
◼
►
you just call them Monday through Friday 8 a.m. to 8 p.m. Eastern
00:37:15
◼
►
and you'll be speaking to a live person. They will just pick up the phone and
00:37:18
◼
►
there's a person. It's not a bot.
00:37:20
◼
►
You don't have to say "representative,"
00:37:22
◼
►
"track a package," none of that stuff. You know, it's "I hate them."
00:37:25
◼
►
All those things are terrible. They know that too. They don't do it. They give you
00:37:28
◼
►
only a human. It's just great. So go to hover.com/ATP
00:37:33
◼
►
to get your next domain. Use promo code ATP for 10% off. Thanks a lot to Hover
00:37:37
◼
►
for sponsoring the show.
00:37:40
◼
►
So, to briefly speak in favor of Core Data, so my really crummy, although soon to be not
00:37:46
◼
►
crummy since it's all straight UI kit, so it's going to look great in iOS 7, but my
00:37:50
◼
►
really crummy iPhone app, which I wrote basically as an exercise to teach myself how to write
00:37:55
◼
►
an iPhone app and also...
00:37:56
◼
►
Yeah, you can plug it.
00:37:57
◼
►
That's allowed.
00:37:58
◼
►
Well, it's called FastText and it's embarrassing on iOS 6, but it's going to be brilliant on
00:38:02
◼
►
iOS 7 because I'm going to change virtually nothing and it will all just look magical
00:38:08
◼
►
But in any case, the app doesn't do a whole heck of a lot.
00:38:13
◼
►
The point is to do one thing really quickly and that's send a canned text message.
00:38:17
◼
►
So the idea is you pop open the app, you say who you want to send it to, which is presumably
00:38:21
◼
►
a list of people that you've already set up, what message you'd want to send, or maybe
00:38:24
◼
►
I got that backwards, I think I did because I haven't used it in a couple days.
00:38:28
◼
►
But anyway, the point is you pick who, you pick what, and then you say go.
00:38:32
◼
►
And that actually uses core data.
00:38:34
◼
►
That is actually a really really great use of core data because candidly it's very very simple
00:38:41
◼
►
It's two entities
00:38:42
◼
►
It's a total of like ten attributes between the two entities and it worked really well
00:38:48
◼
►
And one of the things I liked so much about it
00:38:50
◼
►
Was that when I decided to add support for sending messages to email addresses as well as just phone numbers
00:38:58
◼
►
I had to add a
00:39:01
◼
►
column if you will or an attribute to say well is this thing an email address or a number and
00:39:07
◼
►
Obviously I could have parsed that out whatever the point
00:39:10
◼
►
I'm driving at though is that I had to do a core data migration and
00:39:12
◼
►
To be honest for me because this was such a simple use case it actually worked really really well
00:39:18
◼
►
It was really nice, and I said in Xcode. Hey, I'm gonna make a new version of this model
00:39:23
◼
►
Here's what's different about it
00:39:25
◼
►
Then I wrote a couple of lines of code in my app delegate to handle it and everything just happened
00:39:31
◼
►
magically and I've actually had no real issues with core data, but to be fair
00:39:36
◼
►
This is an extremely simple use case and to me. I think that's what's great
00:39:40
◼
►
This is core data's bread and butter is to do something really simple
00:39:45
◼
►
All I want was a way in which I can persist a very small object graph and that's like out of the book
00:39:51
◼
►
Which I would look up if the developer portal was up. It's like out of the book
00:39:55
◼
►
Exactly what core data is meant for so I agree with what you're saying that in a lot of ways core data is this really
00:40:00
◼
►
big scary abstraction that you don't want to just relinquish your life to, so to speak.
00:40:05
◼
►
But for me it worked out really, really well.
00:40:07
◼
►
You could have just used property lists.
00:40:09
◼
►
I mean, not just the property list back end of Core Data, but like literal property lists.
00:40:14
◼
►
Because like the volume of data.
00:40:15
◼
►
You basically made like the sample application they would have you make.
00:40:18
◼
►
Like if you're doing like the Core Data demo.
00:40:20
◼
►
What are you saying, man?
00:40:21
◼
►
No, I mean like the Core Data part.
00:40:22
◼
►
Like you said, like two entities and like not a lot of them.
00:40:26
◼
►
Because I mean, I don't know how many text messages like your application store is a
00:40:29
◼
►
but presumably people are not going to store 10,000 canned text messages because you've
00:40:33
◼
►
defeated the purpose of the application, because you're supposed to find it quickly.
00:40:36
◼
►
So, like, yeah, you could have gotten away with a property list.
00:40:38
◼
►
And in fact, that's what a lot of people did for a long time.
00:40:42
◼
►
I mean, at a certain point it becomes ridiculous.
00:40:45
◼
►
You're absolutely right.
00:40:46
◼
►
And a lot of fast text, a lot of the purpose of it was in a series of engineering lessons
00:40:52
◼
►
and exercises for myself.
00:40:54
◼
►
And part of the reason I used Core Data was just, I want to learn Core Data.
00:40:57
◼
►
I want to see what it's all about.
00:40:58
◼
►
So when everyone complains and moans about it, I can say, "Oh, yeah, you know, I understand
00:41:01
◼
►
why you're saying that."
00:41:03
◼
►
And I could complain and moan with the next guy, but for me, it actually worked out really
00:41:08
◼
►
Yeah, no, you should have plugged your program sooner, because you kept mentioning your program,
00:41:11
◼
►
and I never bothered to look up what it was.
00:41:12
◼
►
And I looked up what it was, like, I don't know, maybe you tweeted something about it
00:41:15
◼
►
this week, and I'm like, "Oh, that's a useful program."
00:41:16
◼
►
You should, you know, I don't know if there's a hundred other programs out there that do
00:41:20
◼
►
that, and obviously I don't send text messages to people, so that's why I'm not in that field.
00:41:24
◼
►
But that's exactly, I think that would be, is this a common category of program, the
00:41:30
◼
►
CAN text message sender?
00:41:31
◼
►
Well, I don't know if it's common, but it was actually, it's funny hearing Marco talk
00:41:36
◼
►
about a lot of the things that he's talked about, both in Build and Analyze, and here.
00:41:40
◼
►
It was a very funny exercise, an interesting exercise for me, because I'd love to be able
00:41:45
◼
►
to just magically invent the next Instapaper and be able to do something independently
00:41:51
◼
►
and take that whole time.
00:41:52
◼
►
Right, and not just have any competition.
00:41:54
◼
►
Exactly, but what I'm driving at is it'd be cool to not, to work for myself, but I feel
00:42:00
◼
►
like I need that magical idea.
00:42:02
◼
►
And so, flashback to I think it was iOS 4, when I want to say it's MF message composed
00:42:07
◼
►
view controller or whatever it is, basically they added the ability for an app to send
00:42:12
◼
►
text messages.
00:42:13
◼
►
And so, I found that out at that WWDC, which I guess was 2011, is that right?
00:42:18
◼
►
It doesn't matter.
00:42:19
◼
►
I found out at that WWDC that, oh, they're going to do this, and I was like, I know what
00:42:22
◼
►
I can do with that.
00:42:23
◼
►
And so I had to figure out how to build and ship the app in order to, I wanted to be in
00:42:31
◼
►
on day one of iOS 4.
00:42:33
◼
►
And so the reason I think it's so funny is because in the smallest littlest way, this
00:42:39
◼
►
was a Casey sized exercise in doing the sorts of things that many of my peers do for a living.
00:42:47
◼
►
In that I had an idea and I needed to execute and I needed to execute by a certain date.
00:42:52
◼
►
I'm like what say Underscore did with Feed Wrangler.
00:42:55
◼
►
It was just a very funny thing and that's why it was really rewarding because I was
00:42:59
◼
►
able to get this little appropriately sized view of the world that a lot of my good friends
00:43:05
◼
►
and peers have.
00:43:06
◼
►
I know that was kind of a side note, but I don't know.
00:43:11
◼
►
It's a very simple app, but it's very useful and I use it all the time.
00:43:15
◼
►
So if you didn't write that app, if you went into the App Store, have you looked at the
00:43:19
◼
►
competitors?
00:43:20
◼
►
Are there other applications that do this?
00:43:21
◼
►
Oh, there certainly are.
00:43:22
◼
►
one that most people use that I would know about if I was into texting?
00:43:25
◼
►
I don't know if there's a well-known one.
00:43:27
◼
►
I mean, it's because…
00:43:28
◼
►
Like, there's no Instapaper of the market.
00:43:30
◼
►
If there is, I don't know it, to be honest.
00:43:33
◼
►
And I've never taken…
00:43:34
◼
►
The app was not a money-making venture.
00:43:36
◼
►
In fact, I've probably put a couple hundred dollars into it that I haven't gotten out.
00:43:40
◼
►
I mean, I've gotten checks from Apple for it, but I've spent more between the $100
00:43:47
◼
►
annual developer account and paying 40 bucks or whatever it was for Opacity Express to
00:43:53
◼
►
hand draw the world's worst icon.
00:43:58
◼
►
I was pretty proud of it, to be honest, but if I'm honest with myself, it's pretty rough.
00:44:02
◼
►
I think I saw the icon, and if it's what I'm thinking of, it's no good.
00:44:08
◼
►
Thank you for not letting me down, John.
00:44:10
◼
►
No, but you know.
00:44:12
◼
►
That actually is what, speaking of applications, that is a lot of the time what separates the
00:44:17
◼
►
application that someone makes and barely makes back its money in developer fees and
00:44:22
◼
►
the one that does, is putting in a little bit of extra money for a designer to do your
00:44:28
◼
►
icon and getting the UI to look nicer.
00:44:33
◼
►
Window dressing, marketing type, not marketing in terms of paying money to advertise or whatever,
00:44:37
◼
►
but when someone sees your page, what is the impression they get?
00:44:40
◼
►
Apple Hammer is like crazy in WWDC. The first impression someone gets when they glance at
00:44:44
◼
►
your application has no reflection on the functionality of your application because
00:44:49
◼
►
if there are a lot of these applications that send canned text messages, what's going to
00:44:52
◼
►
differentiate them is the one that makes someone feel good to have it on their home screen,
00:44:57
◼
►
feel good to launch it and use it, and every time they do, they feel good about that experience.
00:45:01
◼
►
That's why iOS 7 is such an opportunity because all of a sudden these applications that people
00:45:04
◼
►
used to feel good about using, now they will not feel as good when they're using iOS 7
00:45:08
◼
►
because those ones will look old and ugly and strange
00:45:12
◼
►
or whatever.
00:45:13
◼
►
So that could have been all that separated you from perhaps not
00:45:16
◼
►
Instapaper-level success, but at the very least,
00:45:21
◼
►
being in the black instead of the red on Lifetime
00:45:23
◼
►
for this application is just a nicer icon, a little bit nicer
00:45:27
◼
►
Oh, you're absolutely right.
00:45:29
◼
►
And some screenshots with puppies in them or something.
00:45:33
◼
►
No, you're absolutely right.
00:45:34
◼
►
And that's the thing is, again, this was more-- FastX
00:45:38
◼
►
written in order for me to be able to look myself in the mirror and say, "You know what?
00:45:41
◼
►
You did get something in the App Store."
00:45:43
◼
►
And even if everyone around you thinks it's a flaming turd, at least you can say, "You
00:45:49
◼
►
One way or another, that's mine, and I did that."
00:45:50
◼
►
And I wrote it at a time where I barely could write "Hello, world!" in Objective-C. And that's
00:45:55
◼
►
not to say it's not stable and whatnot and blah, blah, blah.
00:45:58
◼
►
What I'm driving at, though, is that it was a really great exercise to teach myself this
00:46:02
◼
►
entire pipeline.
00:46:04
◼
►
And I'm really glad I did it.
00:46:05
◼
►
And I keep it there, to be honest, if I'm really candid, I keep it there more as kind
00:46:11
◼
►
of a trophy for myself.
00:46:14
◼
►
Look at what I was able to do.
00:46:16
◼
►
And everyone else who may have seen it and is listening may or may not be laughing about
00:46:20
◼
►
all that, but I'm okay with that because I'm still proud of it, even though it looks like
00:46:24
◼
►
crap in iOS 6.
00:46:25
◼
►
But wait for iOS 7.
00:46:27
◼
►
It's going to be great.
00:46:28
◼
►
I'm watching it just climb the ranks tonight as all 204 live listeners go out and buy it.
00:46:34
◼
►
We were going to have a Casey self-esteem sale where, "Don't buy it to use it, buy
00:46:40
◼
►
it to acknowledge Casey's trophy for--" I mean, hey, it's farther than I got with
00:46:46
◼
►
my iOS idea when they announced the SDK, which was a joke tip calculator, which I wrote about
00:46:51
◼
►
half of, and then I said, "You know what?"
00:46:53
◼
►
Wait, what's the joke?
00:46:55
◼
►
I've said this before on other projects.
00:46:56
◼
►
It was a tip calculator, which I knew there would be a bazillion of, because it's like
00:47:00
◼
►
five minutes to write, and sure enough, there were a bazillion of them.
00:47:04
◼
►
And the name of the application is "It Does Other Things," which is probably a copyright
00:47:07
◼
►
infringement on Seinfeld, but that's the joke.
00:47:10
◼
►
Yeah, I don't know.
00:47:11
◼
►
Have you seen that episode?
00:47:12
◼
►
Have you heard of Seinfeld's television show?
00:47:13
◼
►
Wait, the app is called "It Does Other Things"?
00:47:16
◼
►
Have you ever seen Seinfeld?
00:47:17
◼
►
Yeah, I think I've seen all of them, but it was a long time ago.
00:47:19
◼
►
Do you not know that line from a webisode?
00:47:21
◼
►
I forget what the context was.
00:47:25
◼
►
Anyway, you can Google for "It Does Other Things Seinfeld" and find out.
00:47:28
◼
►
It's not that funny, which is another reason why the application does not appear on the
00:47:32
◼
►
I bailed out because I saw the writing on the wall.
00:47:36
◼
►
But I would have liked to have just gotten
00:47:37
◼
►
through the process.
00:47:38
◼
►
The reason I don't go through the process
00:47:39
◼
►
is because, say, I get a working application that
00:47:42
◼
►
does what I want it to do.
00:47:44
◼
►
Then I need at least double that amount of time
00:47:47
◼
►
to work on the icon in the UI.
00:47:49
◼
►
Because otherwise I'll just obsess over it.
00:47:51
◼
►
Be like, no, I can't ship this.
00:47:53
◼
►
It's too boring looking.
00:47:54
◼
►
And then by that point, 8,000 other typical calculators
00:47:56
◼
►
have come out, and it's too late.
00:47:58
◼
►
I would love to see you ship an app of anything.
00:48:02
◼
►
I mean, I don't care what it did or didn't do.
00:48:03
◼
►
I would just love to see what you consider shippable.
00:48:07
◼
►
Because honestly, I'd be shocked if you ever shipped something like that in public.
00:48:12
◼
►
And I guess your reviews are even larger scale than most people's ads.
00:48:16
◼
►
Yeah, they're much larger scale receptacles for feedback, let's say.
00:48:23
◼
►
People have opinions, and they offer them on writing.
00:48:26
◼
►
Writing is much worse than putting out an ad.
00:48:28
◼
►
I mean, look at all the open source code I put out.
00:48:31
◼
►
Most of the pro code that's up on CPAN for me is just terrible, because it's been written
00:48:34
◼
►
years and years ago.
00:48:35
◼
►
And I leave it up there because, well, look, maybe someone's finding it useful or whatever.
00:48:39
◼
►
But it's kind of the difficult thing about working in a regular job.
00:48:45
◼
►
You try to do open source stuff so you have something that you can show as, "Here's an
00:48:49
◼
►
example of my code."
00:48:50
◼
►
But all of my open source stuff at this point, I'd be like, "Don't look at that."
00:48:54
◼
►
The best thing I could do if everyone on Job Interview would be like, "Here's some sample
00:48:57
◼
►
code from my open source projects, and let me tell you what's wrong with it as a demonstration
00:49:01
◼
►
of how I've grown since I wrote this thing.
00:49:04
◼
►
That's actually, that would be surprisingly effective in an interview, I think.
00:49:08
◼
►
Yeah, but you want to show them, it's like, here's my shipping app.
00:49:10
◼
►
Like, that's what, you know, that's when you get a job on Apple, you're like, look, I made
00:49:12
◼
►
this app, and then I'm awesome, and the app is awesome, hire me, and then I'll hire you,
00:49:17
◼
►
That's the easiest way in the door.
00:49:19
◼
►
So to build on the thought of you shipping something that people can see, since you're
00:49:25
◼
►
a celebrity in the little bubble in which we live, does that, if you had a really good
00:49:29
◼
►
idea, do you think that would prevent you or scare you off from – actually, I guess
00:49:33
◼
►
I could ask both of you, but – I'm always looking for a good idea for an iOS app. I
00:49:37
◼
►
have been since day one. The tip calculator, you know, like, that's like me looking for
00:49:40
◼
►
an idea. My brother is also constantly trying to look for an idea. He's trying to look
00:49:45
◼
►
for a get-rich-quick idea, and so am I, to be fair. We've talked to a million-dollar
00:49:50
◼
►
homepage before, right, haven't we? Oh, yeah. Well, not on this show, I don't think,
00:49:54
◼
►
but – Yeah, maybe in real life. But anyway, that's the ultimate idea, where you have
00:49:58
◼
►
no money at risk, no time at risk, really easy to do, makes money, makes everybody happy
00:50:03
◼
►
who's involved with the project is amusing to people who are not involved with the project.
00:50:07
◼
►
That's pretty much the best example of that type of project I've ever seen in my life.
00:50:11
◼
►
And if there's an iOS app equivalent yet, I haven't found one. There's plenty of ways
00:50:15
◼
►
to make money in the app store that are scummy and scammy and make people sad, but that's
00:50:19
◼
►
not what we're looking for. And of course, you can make money like the old-fashioned
00:50:22
◼
►
way by making a good app, which is really hard.
00:50:27
◼
►
If I ever had an idea for a Mac app even, like an iOS or a Mac app, if I had an idea
00:50:31
◼
►
for an app that didn't exist, that I would like, that I thought I could write, I would
00:50:36
◼
►
But that stuff never comes together.
00:50:37
◼
►
And, you know, it's always like two out of three or one out of three.
00:50:41
◼
►
But that's not directly answering my question, which is, let's say you had this great idea
00:50:44
◼
►
and you felt at least moderately confident that you could do at least a moderately passable
00:50:50
◼
►
Would the fact that you're Mr. Hypercritical scare you away from losing it?
00:50:55
◼
►
No, not at all.
00:50:56
◼
►
I mean if anything that should provide like a fountain of infinite ideas because
00:51:01
◼
►
You can look at any app you use any app you ever need to use and you can say oh well
00:51:06
◼
►
If I did it it would be different in these ways
00:51:09
◼
►
Yeah, but like but do I want to do it do I have to have do I think I would be capable of actually doing
00:51:13
◼
►
A better job do I really want to do it do I have you know it's just you know how much time it takes to make
00:51:17
◼
►
a real application it's a big
00:51:19
◼
►
Commitment you're right, so I really it would it would really need to be like something like oh
00:51:22
◼
►
I've got to make this app like that's it would have to be like that not just simply
00:51:26
◼
►
"Oh, I think I can make a better one of those," because it just takes so much time.
00:51:31
◼
►
Any notoriety I might have would encourage me, not discourage me, because all that would
00:51:35
◼
►
translate to is, "Look, for every tiny point of internet notoriety I have, that is one
00:51:41
◼
►
extra point on sales possibilities."
00:51:45
◼
►
It's not fair, but that's the way it works.
00:51:48
◼
►
If people know who you are to begin with, then they'll know about your application,
00:51:53
◼
►
You have such an up with awareness and everything.
00:51:54
◼
►
Oh, yeah, if you got it, use it.
00:51:56
◼
►
Yeah, so that, but that, I mean, that wouldn't be the reason I would be doing it, but like,
00:51:59
◼
►
it just, it would have to be a fire under my butt where like, look, I need, like it
00:52:02
◼
►
was for you with Bugshot, you're like, I just need this application to exist. And you're
00:52:06
◼
►
at the point where you can rattle that off in a week, like, I'm not at that point, so
00:52:10
◼
►
it has to be real, I have to just be like, look, I cannot sleep until I write this application
00:52:14
◼
►
because my ramp up time would be significant starting from zero, right?
00:52:17
◼
►
Even that, though, like, yeah, I mean, for me, it was like, I'm an experienced iOS developer,
00:52:21
◼
►
so it didn't take me that long.
00:52:22
◼
►
I already knew how to do all this stuff.
00:52:24
◼
►
The icon even accidentally made itself.
00:52:26
◼
►
And then even that app, I said,
00:52:29
◼
►
I will spend a couple of days doing this app.
00:52:32
◼
►
That's all I can really justify spending on it,
00:52:34
◼
►
'cause it's gonna make 20 bucks a day
00:52:36
◼
►
for the next two years.
00:52:37
◼
►
So I can't justify doing a whole lot more on this app,
00:52:41
◼
►
just a few days of work so I can get back to my other stuff.
00:52:44
◼
►
And a few days became like 10 days.
00:52:48
◼
►
It was like seven days to build version one,
00:52:50
◼
►
And then I got a break while it was being approved.
00:52:53
◼
►
And then within a few days of it being released,
00:52:55
◼
►
I was working on 1.1 to fix all the bugs
00:52:58
◼
►
that everyone found, and then to add
00:52:59
◼
►
a couple of minor enhancements.
00:53:01
◼
►
And that took a couple more days.
00:53:02
◼
►
So all in, this is almost two weeks solid for this app.
00:53:07
◼
►
And I should clarify for Sam the Geek in the chat room,
00:53:12
◼
►
yeah, it's going to make $20 a day maybe
00:53:15
◼
►
for the next couple of months.
00:53:17
◼
►
After that, it might go down further to--
00:53:19
◼
►
No, he's absolutely right.
00:53:19
◼
►
Absolutely. This is not a joke and I probably shouldn't share this publicly, but whatever.
00:53:25
◼
►
I am genuinely excited when I get an app banning email and the number on it is anything more
00:53:29
◼
►
than zero. That's like awesome. I just sold something to someone. That's really exciting.
00:53:36
◼
►
So, 20 bucks a day is nothing to shake your fist at. I know you said that jokingly, but
00:53:39
◼
►
that is nothing to shake your fist at.
00:53:40
◼
►
No, that's not a joke. I mean, like when I made nursing clock last year, the breastfeeding
00:53:46
◼
►
timer. I released that and even that took a little bit longer than I thought it would.
00:53:51
◼
►
Even the nap that had almost no effort into it at all. That took like a few days to really
00:53:55
◼
►
polish it and make it releasable in any shape. And even that, over its entire life, it made
00:54:00
◼
►
I think $70. I mean it wasn't a whole lot. And I even ended up pulling it down after
00:54:08
◼
►
I think about six months or so because there was a, somebody had tipped me off, there was
00:54:13
◼
►
a patent troll going around suing or threatening to sue people who made childcare related apps
00:54:20
◼
►
and even though mine was not, wouldn't have applied, or the patent wouldn't have applied,
00:54:26
◼
►
we all know that doesn't really matter. And so I just, I'm like, you know what, this app
00:54:30
◼
►
has made like $70 in six months, it's not even worth the risk of having a patent troll
00:54:35
◼
►
come after me. So I just pulled it down.
00:54:38
◼
►
- Patents fostering innovation.
00:54:39
◼
►
Exactly. We should get to that actually. But first, let me tell you about our second sponsor.
00:54:43
◼
►
Our second sponsor this week is a new sponsor, but you might have heard of them recently
00:54:47
◼
►
on other awesome shows and blogs. They are 23andMe. So, 23andMe, it's a pretty cool service.
00:54:54
◼
►
It's a little hard to explain, but here's the gist of it. They are a DNA profiling service.
00:55:04
◼
►
And so, here's what you do.
00:55:06
◼
►
You give them a, basically, they send you a kit,
00:55:11
◼
►
you give them a saliva sample,
00:55:13
◼
►
and you don't have to poke your arm or anything,
00:55:15
◼
►
there's no blood involved.
00:55:16
◼
►
You give them a saliva sample,
00:55:17
◼
►
you send it back and they provide a return package,
00:55:19
◼
►
the lab analyzes it, and then it gives you a full report
00:55:23
◼
►
about stuff about you.
00:55:26
◼
►
So, here's the gist of it.
00:55:28
◼
►
They gave you the tools to better understand
00:55:30
◼
►
how your genes may impact your health.
00:55:32
◼
►
So this helps you and your doctor find health areas to keep an eye on.
00:55:37
◼
►
They have over 240 personalized health, trait, and ancestry reports.
00:55:42
◼
►
And they can help you understand your genetics.
00:55:44
◼
►
So they give you ancestry information.
00:55:46
◼
►
You can discover your global origin.
00:55:48
◼
►
You can find, like, if you have any celebrity relatives, they will give you a list of celebrities
00:55:53
◼
►
that are distant relatives of yours.
00:55:54
◼
►
You can also find other living relatives through their analysis.
00:56:00
◼
►
They have over a quarter million members.
00:56:02
◼
►
So this makes it the largest DNA ancestry service in the world.
00:56:05
◼
►
And so the chances of them finding something cool about you are pretty good.
00:56:09
◼
►
So anyway, it includes a few fun points to tell you how closely related you are to Neanderthals.
00:56:19
◼
►
They even can tell why you may not like cilantro.
00:56:22
◼
►
There's a gene for that.
00:56:24
◼
►
They can tell you how quickly you metabolize coffee, which of course is cool for me to
00:56:31
◼
►
So anyway, you can order your 23andMe DNA kit today for just $99 at 23andme.com/ATP.
00:56:39
◼
►
That's 23andme, the number 23, and then the words andme.com/ATP.
00:56:46
◼
►
Check it out.
00:56:47
◼
►
It's pretty cool and just a really great way for, you know, just to take a look at your
00:56:52
◼
►
DNA and learn some cool stuff about yourself.
00:56:55
◼
►
So thanks a lot to 23andMe for sponsoring the show.
00:56:59
◼
►
What is the avocado—asparagus pea smell gene?
00:57:03
◼
►
Is that a genetic thing, or is that not genetic?
00:57:05
◼
►
I think that's everybody.
00:57:07
◼
►
I mean, it's just—
00:57:08
◼
►
I think you'd have to eat a lot of asparagus.
00:57:10
◼
►
What I heard from third hand was that it was genetically related, and that the people with
00:57:16
◼
►
the gene made their pee smell, and they could smell it.
00:57:20
◼
►
And people without the gene, their pee did not smell, and they couldn't smell it, but
00:57:24
◼
►
other people smell like pee.
00:57:25
◼
►
I thought it was that the pee always smells, but only some people can smell it.
00:57:31
◼
►
I don't know.
00:57:32
◼
►
I know nothing about it.
00:57:33
◼
►
See, this is terrible.
00:57:34
◼
►
Oh, here we go.
00:57:36
◼
►
23andme.com/health/asparagusmetabolitedetection.
00:57:37
◼
►
Of course they would know this.
00:57:39
◼
►
23andme has got it covered, and it is genetic, apparently.
00:57:46
◼
►
That's awesome.
00:57:47
◼
►
Erin is a biology teacher.
00:57:48
◼
►
I could have asked her if she was home at the moment, but she is not.
00:57:52
◼
►
Oh, good thing 23andMe didn't let us down.
00:57:56
◼
►
Anyway, thanks for sponsoring.
00:57:58
◼
►
All right, so what else are we talking about?
00:58:01
◼
►
Do you want to talk about Ask Patents at all?
00:58:05
◼
►
John, go for it.
00:58:07
◼
►
Yeah, so this was a Stack Exchange site that was made months and months ago, wasn't it?
00:58:12
◼
►
Like maybe last year?
00:58:13
◼
►
Yeah, a while ago.
00:58:14
◼
►
A long time ago.
00:58:15
◼
►
It was the brainchild of Joel Spolsky and the Stack Exchange guys in cooperation with
00:58:21
◼
►
the US patent office, I believe, even from the get-go.
00:58:24
◼
►
It's a Stack Exchange site, like StackOverflow or whatever,
00:58:27
◼
►
you ask questions or whatever.
00:58:28
◼
►
But this one is meant to collaboratively find
00:58:31
◼
►
prior art for patents.
00:58:33
◼
►
So someone will post a patent, and then other people
00:58:35
◼
►
will try to look at prior art for it and post it as the answer.
00:58:38
◼
►
So basically, the implied question to all of them
00:58:40
◼
►
is, here's a patent.
00:58:41
◼
►
Is there some prior art?
00:58:42
◼
►
And then anyone can post an answer, like, oh, here's
00:58:45
◼
►
some prior art for this, or whatever.
00:58:46
◼
►
And the goal of the site was to be like, OK, well, we all
00:58:50
◼
►
know these patents are stupid and trying to patent things that shouldn't be patentable,
00:58:54
◼
►
but it's really difficult, apparently, for the US Patent Office to do the research necessary
00:58:58
◼
►
to find the prior art. Even though, when we look at it, can you just call up a graphics
00:59:04
◼
►
programmer and ask them and they'll tell you the eight times? Anyway. And so that's how
00:59:09
◼
►
this was supposed to work.
00:59:10
◼
►
And finally, I think this was their very first confirmed case where a patent was posted,
00:59:16
◼
►
found an answer and the patent was invalidated.
00:59:19
◼
►
And in the invalidation of the patent by the person in the US Patent Office, they cited
00:59:23
◼
►
directly this answer on this site.
00:59:25
◼
►
And Joel did the answer, and Joel said it took him like 10 minutes of Googling to find
00:59:28
◼
►
prior-- because again, it's not hard to find prior art for these things, because the patents
00:59:31
◼
►
are awful, right?
00:59:32
◼
►
So Joel wrote a story called "Victory Lap for Ask Patents," describing the sequence
00:59:37
◼
►
events and saying basically, look, this took me 10 minutes of Googling.
00:59:40
◼
►
If you hate patents and you're a software developer or whatever, come onto our site,
00:59:44
◼
►
a patent that you think is stupid, Google for a prior art, paste it in there, and wait
00:59:49
◼
►
for the incredibly slow wheels of government to turn, and six months later, maybe that
00:59:54
◼
►
patent will get invalid.
00:59:55
◼
►
And of course, this is a Microsoft patent and they're appealing, so who knows how it
00:59:58
◼
►
will end up coming out.
00:59:59
◼
►
But the interesting bit, this that I pasted into the show notes, is that Joel says that
01:00:04
◼
►
his dream is that companies will hear about this site and use it offensively against other
01:00:10
◼
►
Because if like Apple or Google or whatever dedicates like one or two people to just go
01:00:13
◼
►
on that site and look for patents that Google is applying for and spend 10 minutes to go
01:00:19
◼
►
find prior art for them, that it will become like—you know, so patents are sort of defensive
01:00:23
◼
►
where they patent—every company patents everything they can because it's good to
01:00:25
◼
►
have a big patent portfolio.
01:00:26
◼
►
But if each company also had an offensive wing, all they did was watch their competitors
01:00:30
◼
►
and watch for the super-dumb patents that they apply for and then invalidate them all
01:00:34
◼
►
by finding prior art, that would be a good sort of mutually assured destruction scenario
01:00:39
◼
►
where large companies prevent each other from having terrible patents.
01:00:44
◼
►
Of course, this is not the actual solution.
01:00:45
◼
►
The actual solution would be, maybe the US Patent Office could do this work, because
01:00:49
◼
►
it doesn't seem like it's that hard.
01:00:50
◼
►
It takes 10 minutes of googling.
01:00:51
◼
►
And of course, my position is that no patent should exist ever for anything.
01:00:55
◼
►
But anyway, every little bit counts.
01:00:58
◼
►
So I'm excited that at least one patent has been, at least, if not permanently thwarted,
01:01:03
◼
►
then possibly delayed on its trip to being a super dumb patent.
01:01:09
◼
►
So good job Joel and the Stack Exchange guys.
01:01:11
◼
►
Yeah, it's so cool this thing that Ask Patents even exists and that the USPTO kind of encouraged
01:01:18
◼
►
it or at least is being friendly with it.
01:01:22
◼
►
There is of course, you know, there's that great question of, you know, Joel is a programmer
01:01:28
◼
►
and he could look at this stuff from this Microsoft patent that he cited and, you know,
01:01:32
◼
►
any others that you look on there and he said like, you know, he assumed going into this
01:01:36
◼
►
that it would be pretty hard to read patents
01:01:39
◼
►
and to figure out what they are and to invalidate them,
01:01:41
◼
►
but in fact, once he started trying to do it,
01:01:43
◼
►
that it was easier than he expected.
01:01:45
◼
►
And that it only takes a few minutes to read a patent,
01:01:49
◼
►
and he linked to a post, maybe he linked to it too,
01:01:50
◼
►
about how to read a patent in 60 seconds.
01:01:53
◼
►
'Cause they all try to be very obfuscated
01:01:56
◼
►
to try to get granted and try to get past
01:01:59
◼
►
any potential conflicts or duplicates
01:02:01
◼
►
or to try to become more overreaching
01:02:04
◼
►
than they otherwise would have.
01:02:05
◼
►
Like, they go for obfuscation to attempt to confuse the patent examiners.
01:02:13
◼
►
So the problem is, you know, if one working programmer -- and granted, Joel is a good
01:02:18
◼
►
and knowledgeable programmer, but still, if one programmer can look at a patent application
01:02:23
◼
►
and kind of see through it that quickly, why doesn't the patent office -- why can't they
01:02:31
◼
►
do something similar?
01:02:32
◼
►
Why, like, if they can say, "Yeah, we can have patents on graphics programming techniques,"
01:02:38
◼
►
why can't they either have or contract with graphics programmers to look at any graphics-related
01:02:45
◼
►
Like, that, it's just, I'm really glad that AskPatents exists, and obviously it needs
01:02:49
◼
►
to exist, but why it needs to exist is kind of a problem.
01:02:53
◼
►
Because it's a government agency, and they don't have infinite hiring money, you can't
01:02:57
◼
►
pay a graphics programmer or any of that.
01:02:59
◼
►
outsourcing the part that can't be done at scale because there's a limited number of
01:03:05
◼
►
patent employees. Those employees only know about patents and know nothing about the domain
01:03:10
◼
►
areas. And by the same token, Joel could not have written that ridiculous document that
01:03:17
◼
►
codifies the rejection of the patent. Joel could not have written that because that requires
01:03:22
◼
►
the lawyer-like expertise of the people in the patent office to know what form you have
01:03:26
◼
►
to do things and what is a valid rejection and what must you like. That's the skill that they're
01:03:31
◼
►
bringing to the table, you know, that to be able to navigate this legal, just like lawyers, like,
01:03:36
◼
►
you know, you may have an intuitive feel of, you know, what's right and wrong and how to prove
01:03:42
◼
►
things. But if you're not a lawyer, you don't know how to actually do it, right? So this is just
01:03:47
◼
►
finding people like, "Look, you find me the prior art, and then the US Patent Office says, 'We'll
01:03:50
◼
►
take it from here.' So you did that part of the work for us. We'll take that and probably spend
01:03:55
◼
►
ten times as much time doing this stupid legalese dance in this formal document structure to
01:04:00
◼
►
reject the patent and bring it through all this bureaucratic-- I mean, just try clicking
01:04:04
◼
►
through to that rejection.
01:04:05
◼
►
He's like-- he explains how to find the rejection.
01:04:07
◼
►
And it's like, the preliminary draft rejection finalized form.
01:04:11
◼
►
Like, try to read it.
01:04:12
◼
►
It just, you know, you cannot penetrate even the rejection of the patent, let alone the
01:04:17
◼
►
patent itself.
01:04:18
◼
►
And that "how to read a patent in 60 seconds" is good because it tells you, "Just ignore
01:04:20
◼
►
everything and go right to this section and look at these three things, and that's enough
01:04:23
◼
►
for you to get going."
01:04:25
◼
►
It's a broken, stupid bureaucratic system that doesn't work right.
01:04:30
◼
►
This does not make it better.
01:04:31
◼
►
This doesn't cure it.
01:04:32
◼
►
But if anything that stops crappy patents from getting granted is a good thing.
01:04:39
◼
►
This was just the community trying to make government better, maybe not against their
01:04:45
◼
►
will, but certainly like, "Look, we're here to help you in government saying, 'Okay,
01:04:48
◼
►
we will accept your help in this matter,'" and then it producing at least one actual
01:04:54
◼
►
Well, it's a brilliant idea if people are into it, but it seems to me that it's tough
01:05:00
◼
►
to get people into it.
01:05:01
◼
►
Said differently, here it is that the patent office is sort of kind of reaching out to
01:05:06
◼
►
the community and saying, "Hey, people who are experts in these things that patents are,
01:05:12
◼
►
go help us find this prior art."
01:05:13
◼
►
But the key is that we're experts.
01:05:16
◼
►
Joel is an expert, or at least you could easily argue as such.
01:05:20
◼
►
And I don't know how the patent office works internally, but I've got to imagine they don't
01:05:23
◼
►
have an expert for every darn field of patentable stuff under the sun.
01:05:29
◼
►
And so it strikes me as a brilliant idea, but I'm not sure that when I get bored on
01:05:35
◼
►
a weekday evening night, I'm going to sit there cruising for patents to shoot down.
01:05:38
◼
►
Well, I mean, but Joel's got the right idea.
01:05:40
◼
►
He says, like, who is actually sufficiently motivated to use this site?
01:05:45
◼
►
And who's sufficiently motivated are the companies who get patents, because they have a financial
01:05:49
◼
►
incentive to prevent—Apple has a financial incentive to make every single patent Google
01:05:54
◼
►
files be invalidated, right? And vice versa, Google has that same motiva—you know, so
01:05:59
◼
►
if you can get these big companies with tons of money to put even a few people on this,
01:06:03
◼
►
it's so easy to do, because you're going to be invalidating patents in a domain that you know
01:06:07
◼
►
about. Apple probably knows about the domains that Google's going to file patents in and vice
01:06:10
◼
►
versa, because they're both in the same industry. Get all these guys to, instead of spending all
01:06:14
◼
►
their energy patenting everything under the sun, take part of their energy, because now they
01:06:19
◼
►
Now suddenly they have an influence.
01:06:20
◼
►
It used to be you had no way to get your other guys' patents invalidated.
01:06:23
◼
►
You had to wait for them to be granted or rejected, and then you could try to invalidate
01:06:26
◼
►
them in court.
01:06:27
◼
►
Whereas now, if the patent office is like, "Look, we're willing to accept some help here.
01:06:32
◼
►
This patent has been applied for.
01:06:34
◼
►
Here's the application," and Apple goes out and finds prior art and heads it off of the
01:06:39
◼
►
I don't know if those companies are actually going to do that, but they are the ones who
01:06:42
◼
►
have both the motivation and the skill to do this.
01:06:46
◼
►
I think it would be a great idea because I hate all patents.
01:06:49
◼
►
Like I said, another thing that would cure this whole problem is just to eliminate the
01:06:52
◼
►
entire patent system and office and all the employees and all the legal framework and
01:06:56
◼
►
everything involved with it.
01:06:57
◼
►
That would also cure this problem and is the actual solution.
01:07:01
◼
►
That would actually promote innovation.
01:07:03
◼
►
People don't want to hear that.
01:07:04
◼
►
But anyway, you don't want to hear that, that's fine.
01:07:07
◼
►
We'll start with this.
01:07:08
◼
►
This would be fine too.
01:07:09
◼
►
John, both you and I, I believe, separately argued on our respective 5x5 podcast a couple
01:07:13
◼
►
of years ago.
01:07:14
◼
►
I think we both argued that basically the entire patent system should be abolished.
01:07:20
◼
►
Is that fairly accurate?
01:07:24
◼
►
I mean, the fact that all this stuff is necessary is...
01:07:29
◼
►
And I think what bothers me about it, not to go too deep into whether the patent system
01:07:34
◼
►
should exist or not, because that would be a whole other show, but I think what bothers
01:07:38
◼
►
me so much about it is, like, this is...
01:07:41
◼
►
It's a problem that just cannot be solved well.
01:07:44
◼
►
Like it is just so, like, yeah, the patent office can't be expected to get everything
01:07:49
◼
►
right, but they get things wrong a lot.
01:07:53
◼
►
And the ramifications of that in the market are so incredibly destructive.
01:07:58
◼
►
I mean, it, like, whatever benefit patents are providing to people, I have to imagine
01:08:05
◼
►
there's an equal or greater amount of harm that they're causing, especially in the field
01:08:09
◼
►
of software.
01:08:11
◼
►
And it just seems like there's just no good solution to this.
01:08:14
◼
►
But I am very glad that ATHP patents is at least attempting to—it is improving it in
01:08:22
◼
►
one small way.
01:08:23
◼
►
Yeah, and my objection was less practical, more ideological.
01:08:26
◼
►
I don't think there's any reason you should have monopoly rights to an idea, period.
01:08:29
◼
►
Like, it's not as if like, you know, what if the patent office was perfect and never
01:08:33
◼
►
made a mistake?
01:08:34
◼
►
There's no such thing.
01:08:35
◼
►
There is no right—as far as I'm concerned, you get no right to a monopoly on an idea
01:08:41
◼
►
that you come up with, no matter how awesome that idea is, period, the end.
01:08:44
◼
►
And so if that's your position, that's my position, obviously there's no such thing
01:08:48
◼
►
as a patent office that works. It's an office that the only way it works is to not exist
01:08:53
◼
►
because it's enforcing a right that I don't think is a valid thing that you should, you know,
01:08:58
◼
►
you shouldn't get a monopoly on an idea. You shouldn't ever, the end.
01:09:01
◼
►
But, you know, there's a huge continuum down to the pragmatic concern of like, okay, I think you should,
01:09:05
◼
►
but it's impossible to do correctly, therefore it should be gone, all the way up to like,
01:09:08
◼
►
to like, "Oh, I think it should be gone for software because there's no such thing as
01:09:11
◼
►
a software patent because it's all math and everything's turned complete and blah, blah,
01:09:16
◼
►
And business process patent shouldn't exist and a whole big range.
01:09:18
◼
►
When I talked about it on my show, I went to write for the jugular, which is like patents
01:09:23
◼
►
on drugs, which everyone thinks, "All right, you can get rid of all the other patents,
01:09:25
◼
►
but we need these because otherwise no one will ever do any research into how to cure
01:09:29
◼
►
And I talked about it at length there.
01:09:30
◼
►
We should rehash it here.
01:09:32
◼
►
But anyway, patents are terrible.
01:09:34
◼
►
Don't let your kids get them.
01:09:37
◼
►
Alright, does that mean we're done? That seems like a pretty good place to end to me.
01:09:42
◼
►
Yeah, I think so. Alright, well thank you very much to our two sponges this week, Hover
01:09:47
◼
►
and 23andMe, and we'll see you guys soon.
01:09:50
◼
►
Now the show is over, they didn't even mean to begin, 'cause it was accidental.
01:10:00
◼
►
Oh, it was accidental.
01:10:03
◼
►
John didn't do any research, Margo and Casey wouldn't let him
01:10:08
◼
►
'Cause it was accidental (it was accidental)
01:10:11
◼
►
It was accidental (accidental)
01:10:13
◼
►
And you can find the show notes at ATP.fm
01:10:18
◼
►
And if you're into Twitter, you can follow them
01:10:23
◼
►
@C-A-S-E-Y-L-I-S-S
01:10:27
◼
►
So that's Casey Liss M-A-R-C-O-A-R-M
01:10:32
◼
►
♪ Anti-Marco Armin, S-I-R-A-C, U-S-A-C-R-A-Q-S-A ♪
01:10:39
◼
►
♪ It's accidental, accidental ♪
01:10:42
◼
►
♪ They didn't mean to ♪
01:10:45
◼
►
♪ Accidental, accidental ♪
01:10:47
◼
►
♪ Tech podcast so long ♪
01:10:52
◼
►
Uh, I just sold something to someone.
01:10:54
◼
►
I thought that was funny.
01:10:55
◼
►
If you're gonna make fun of me, I think that's a much less jerky way of doing it.
01:11:00
◼
►
Because that was me talking about how excited I am that whenever I see a singular sale of
01:11:05
◼
►
Someone trying to do a JavaScript injection.
01:11:08
◼
►
I appreciate that they put the semicolon at the end of their statement.
01:11:12
◼
►
They won't stand for that JavaScript automatic semicolon insertion.
01:11:15
◼
►
Say, "No, I'm going to put it explicitly so it's not confused."
01:11:19
◼
►
And yes, the people who wrote this Showbot application have minimal competence of web
01:11:23
◼
►
programmers.
01:11:26
◼
►
Escape their input, which is not...
01:11:28
◼
►
It's probably still 50/50.
01:11:30
◼
►
Given all the websites that I see that won't let me type telephone numbers with hyphens
01:11:35
◼
►
Apparently, the bar has still not been raised.
01:11:38
◼
►
How about American Express, where the maximum character length for a password is, I think,
01:11:44
◼
►
still eight?
01:11:45
◼
►
Well, that's probably dictated by their COBOL-based mainframe interface or something,
01:11:50
◼
►
but the guys who don't let you type stuff with the phone numbers, like they want you
01:11:54
◼
►
to only type digits, you can't type anything else.
01:11:57
◼
►
I just want to go to all their houses and find them and be like no one is making you do this like this
01:12:03
◼
►
This is literally the simplest possible task that a programmer on the web has it is completely closed
01:12:10
◼
►
there are no edge cases all you got to do is just
01:12:13
◼
►
Let me type whatever I want remove everything except the numbers
01:12:16
◼
►
It's not rocket science like no no task is easier than that every other part of accepting that form submission is harder than that one
01:12:22
◼
►
task. And yet, big Fortune 500 companies will have forms that don't let you type anything
01:12:27
◼
►
except numbers in them. And will beep at you, put alerts, automatically backspace the field.
01:12:31
◼
►
The automatic backspacing code, that's more complicated than stripping out the stuff.
01:12:35
◼
►
It boggles my mind that this goes on. And I wonder what regular people think who don't
01:12:39
◼
►
know that is literally the easiest thing in the entire world of web programming to do.
01:12:43
◼
►
They're just like, "Oh, I guess you have to do this when I'm on the site. It must be really
01:12:48
◼
►
So let me tell you a true story that we cannot put in the show because it's really embarrassing,
01:12:52
◼
►
which means it's probably doomed to be in the show.
01:12:54
◼
►
When I, Aaron and I were getting married,
01:12:56
◼
►
I wrote in PHP, and I think it was my first PHP app,
01:12:59
◼
►
I wrote a website that would let guests register,
01:13:04
◼
►
or RSVP among other things.
01:13:07
◼
►
And a good friend of mine,
01:13:08
◼
►
his surname has an apostrophe in it,
01:13:10
◼
►
and I noticed after he registered,
01:13:12
◼
►
because I had this like totally weirdo setups,
01:13:15
◼
►
where I would email my phone to send my phone
01:13:18
◼
►
a text message back when that was still a thing.
01:13:20
◼
►
Well anyways, so he registered and all of a sudden everything was cut off as soon as
01:13:24
◼
►
I hit the apostrophe in his name because I didn't escape anything, because I didn't
01:13:28
◼
►
know crap about web programming at the time.
01:13:29
◼
►
In fact, I taught myself SQL in order to write that site.
01:13:32
◼
►
This was in 2007, because I was always living in thick client land until then.
01:13:37
◼
►
This is like people who don't learn from the past.
01:13:39
◼
►
I remember the first time I looked at the active record code in Rails and I was like,
01:13:43
◼
►
"Jesus, guys, like, find parameters.
01:13:45
◼
►
The technology that has existed since forever."
01:13:48
◼
►
and you're like, "We're going to make SQL by catting together strings and just inline
01:13:55
◼
►
all the values. What could go wrong? We have an escaping function. It should be fine, right?"
01:14:01
◼
►
Wait, that's how they were doing it?
01:14:03
◼
►
I believe the first version of Rails was not using bind parameters in their queries. They
01:14:08
◼
►
would build the SQL strings out of values.
01:14:12
◼
►
I believe they had an escaping function of their own devising, which would be like, "Oh,
01:14:16
◼
►
you see. It's a quote, just double it or whatever. If this wasn't ActiveRecord and I'm slagging
01:14:22
◼
►
off Rails when I shouldn't be, I'm sorry. But substitute Rails with any other type of
01:14:28
◼
►
thing. I see it all the time of people who write database code in the modern era, like
01:14:33
◼
►
in this year, and don't know that bind parameters exist and just bravely plow forward.
01:14:38
◼
►
Casey didn't know that escaping was a thing you might want to do. But for the people who
01:14:43
◼
►
That, I find more excusable than the people who know that you have to escape.
01:14:47
◼
►
So they write their own escaping function, and they still feel like this is the best
01:14:50
◼
►
way to do it.
01:14:51
◼
►
Once you know it's a problem, you would think you'd spend three seconds Googling
01:14:54
◼
►
like, "Oh, I see this is a problem, and there's a name for it, and I bet there's
01:14:57
◼
►
some sort of technique to not have it anymore.
01:15:01
◼
►
Let me look that up."
01:15:02
◼
►
The other favorite one is that people, "Well, this is not an any-year language."
01:15:06
◼
►
Maybe it kind of is.
01:15:07
◼
►
Do you find, have either one of you ever, I don't know if this is a .NET equivalent,
01:15:12
◼
►
But like Marco, when you're things, you can't even do this on iOS probably.
01:15:15
◼
►
You know the system call, the word system?
01:15:17
◼
►
Open, close, parenthesis.
01:15:18
◼
►
Yeah, where it just shells out to the end of the day.
01:15:20
◼
►
Have you ever had to do that for an iOS program, or is that just not going to happen on iOS?
01:15:22
◼
►
I don't think you can do it on iOS.
01:15:23
◼
►
I'm not sure.
01:15:24
◼
►
It's probably forbidden.
01:15:25
◼
►
But at any rate, people who do that, they'll use bind parameters on their SQL code, but
01:15:32
◼
►
they'll come do a part in their program.
01:15:34
◼
►
Apple itself probably does it, or people writing Mac apps back in the pre-sandboxing days.
01:15:38
◼
►
they'll build a string, and they'll pass that string to system.
01:15:42
◼
►
And when you're building that string, what do you have to do?
01:15:43
◼
►
Well, you're like, "Oh, what if the file name has spaces in it?
01:15:45
◼
►
Well, let me put quotes in it.
01:15:46
◼
►
What if the file name has quotes in it?
01:15:47
◼
►
Let me write an escaping function."
01:15:48
◼
►
They go through the same thing, and it's like, people, you're in C. There's a million functions
01:15:53
◼
►
that you can use to fork an exec to take lists of variable, VA list methods to take a variable
01:16:00
◼
►
list of parameters.
01:16:01
◼
►
You don't need the shell to parse it for you.
01:16:02
◼
►
Don't you understand?
01:16:03
◼
►
You can bypass that.
01:16:04
◼
►
You're already in a program.
01:16:05
◼
►
You're a programmer.
01:16:06
◼
►
You can write code.
01:16:07
◼
►
I mean, Apple itself does it, and they're Perl stuff, and you're like, "Oh, if your
01:16:13
◼
►
hard drive name has a space in it, and you have one that has the same name without the
01:16:17
◼
►
prefix before the space, it will accidentally delete it."
01:16:20
◼
►
Was it iTunes installer that did that?
01:16:23
◼
►
Maybe it was the Myth 2 installer.
01:16:24
◼
►
Apple at various times has done the same.
01:16:26
◼
►
It's the same exact problem.
01:16:27
◼
►
It's the sequel thing.
01:16:28
◼
►
They're like, "I will just build a big, long string and pass it through.
01:16:31
◼
►
What could go wrong?"
01:16:35
◼
►
you have is a list of values, and they said, "Yeah, but every time I see this list of
01:16:39
◼
►
values in my normal life, it's one big long string, so I'll make it into a string and
01:16:43
◼
►
then give it to something that will break it into the list that I already had before
01:16:45
◼
►
I made the string." It's just, yeah. I don't know. We're supposed to make progress.
01:16:53
◼
►
Certain areas, we have to make progress not by teaching people the right way to do things,
01:16:56
◼
►
but by making it so they never have to do that thing again.
01:16:59
◼
►
John, I love when you get fired up after the show.
01:17:05
◼
►
Oh, that's my favorite.
01:17:06
◼
►
No, I didn't.
01:17:07
◼
►
I still didn't even get to talk about Minecraft mods.
01:17:11
◼
►
Don't even start.
01:17:12
◼
►
Don't even start.
01:17:13
◼
►
That's good.
01:17:14
◼
►
I'm going to be angry.
01:17:15
◼
►
I'm trying to mellow out.
01:17:17
◼
►
I've got it a little bit under control.
01:17:19
◼
►
Don't mellow out.
01:17:20
◼
►
Don't get talked about.
01:17:21
◼
►
Let's talk about titles.
01:17:22
◼
►
I don't want to talk about it.
01:17:23
◼
►
Before the next show, or whenever that may be, YouTube should be forced to install Minecraft
01:17:29
◼
►
in several mods on behalf of, if you don't, neither one of you has a child of the age
01:17:33
◼
►
who can play Minecraft, maybe just like borrow one for the weekend and have them ask you
01:17:37
◼
►
to install Minecraft and the mods that they want.
01:17:40
◼
►
And just spend the weekend doing that, then you will also be sufficiently angry for us
01:17:44
◼
►
to have an all Minecraft mod anger episode after vacation.
01:17:48
◼
►
If I get bored while I'm on vacation, I will do exactly that.
01:17:52
◼
►
Find a neighborhood kid.
01:17:53
◼
►
Go, "Come over to my house!"
01:17:55
◼
►
And then ask me to install Minecraft mods.
01:17:58
◼
►
That's not creepy at all.
01:17:59
◼
►
Well, maybe have your wife do it.
01:18:01
◼
►
That's what we do.
01:18:03
◼
►
I get in touch with your wives and say,
01:18:05
◼
►
"Just pretend you're into Minecraft."
01:18:07
◼
►
And ask Margot, "Hey, I saw this cool thing.
01:18:09
◼
►
Could you install Minecraft in these couple of mods for me?"
01:18:11
◼
►
Because when your wife asks you to, it's just as bad.
01:18:13
◼
►
Although I don't know if it's believable that they'd want to play Minecraft.
01:18:15
◼
►
Because it's more of a kid thing.
01:18:17
◼
►
Actually, Tiff tried it.
01:18:19
◼
►
I've never played Minecraft.
01:18:23
◼
►
But Tiff actually played it for like one night.
01:18:25
◼
►
And just didn't really like it that much.
01:18:27
◼
►
really like it that much, but she did play it for one night like a few, like a month
01:18:30
◼
►
ago or something like that. But I don't know, I'm really, I'm kind of scared. You know,
01:18:35
◼
►
like I don't have to try heroin to know that I probably should never try heroin. Right?
01:18:40
◼
►
Like so, and I know enough about like hard drugs and their addictiveness to know that
01:18:46
◼
►
I should never even attempt them. And I'm fine with that.
01:18:49
◼
►
Now is this the heroin clause or is this the TMD crush clause?
01:18:53
◼
►
Well it's both. So same thing. So like when I hear that a game is like super addictive
01:18:56
◼
►
and takes over people's lives. I don't have to play it. I'm not like, "Ooh, let me try
01:19:02
◼
►
that." No, I'm like, "You know what? I don't really need that."
01:19:04
◼
►
Well, why don't you pass that wisdom on to your wife?
01:19:06
◼
►
Well, I did. I scared her away with, oh man, Candy Crush. So, quick story. So, Tiz's phone
01:19:16
◼
►
had—it's an iPhone 5, and it had a failing sleep/wake button, which I guess is a very
01:19:20
◼
►
common problem. And so, I took it to the Apple people, and they swapped it. And so, great,
01:19:25
◼
►
come back with a new phone. And we backed it up and did the whole sync locally to iTunes
01:19:30
◼
►
like that morning. Every app, all the music, all the photos, the entire keychain,
01:19:37
◼
►
everything restored perfectly except Candy Crush. For whatever reason, Candy Crush just did not
01:19:44
◼
►
restore, just was not there on the phone. So Tiff has lost her progress in Candy Crush.
01:19:49
◼
►
And this is like severely bad.
01:19:52
◼
►
Did you have to pay extra for that service?
01:19:54
◼
►
I don't know. So the way she's been playing it, you know, like when we first heard about
01:20:00
◼
►
it I believe from Amy Jane Gruber on one of her various podcasts, or somewhere, Twitter
01:20:06
◼
►
or something, that I got the impression that it was extremely addictive and that it could
01:20:11
◼
►
just take all of your money because you could just, you know, you can like buy your way
01:20:15
◼
►
out of time limits and all, you know, all the crap that the free to play BS games do.
01:20:20
◼
►
And so I was like, "Do not install that game because it will take all the money.
01:20:26
◼
►
It will just suck away everything we have, everything we've worked for.
01:20:29
◼
►
All the money will be gone."
01:20:31
◼
►
So to prove that I was wrong about that, Tiff has played the entire game not spending any
01:20:37
◼
►
money and intends to continue that way.
01:20:42
◼
►
But apparently it's a pretty hard game and it's pretty hard not to spend money, which
01:20:45
◼
►
is why they make so much.
01:20:48
◼
►
So she's like spent hours this week playing this game, and now it's restored and it's
01:20:56
◼
►
gone. And of course they don't use any kind of iCloud or Game Center. Of course they don't
01:21:01
◼
►
do anything right in programming the thing to actually make it keep your progress. No,
01:21:06
◼
►
that would cost them too much money. That would cost people to not buy upgrades. So
01:21:09
◼
►
of course they don't do that because game programmers are so great these days. My slight
01:21:13
◼
►
rant. Thanks a lot, game programmers.
01:21:17
◼
►
But, yeah, so I wonder how this is going to play out now.
01:21:22
◼
►
Like if she'll have to buy her way out of this,
01:21:24
◼
►
if I will have to buy her way out of it,
01:21:25
◼
►
out of guilt for somehow not having this thing synced
01:21:28
◼
►
with just that app.
01:21:29
◼
►
- If she wants to like bang her head against
01:21:31
◼
►
a very difficult to play application,
01:21:32
◼
►
you can get a super hexagon or impossible road or something,
01:21:35
◼
►
which do not ask for an app purchases,
01:21:36
◼
►
but will nevertheless frustrate her for a lifetime.
01:21:40
◼
►
- Or Marble Madness.
01:21:42
◼
►
- Whose alarm is going off?
01:21:43
◼
►
- That's over here.
01:21:46
◼
►
For a second there I was like, "How? My garage is closed. I don't think it's me."
01:21:52
◼
►
My windows are closed, too.
01:21:54
◼
►
You know, all those times that I played Marble Madness,
01:21:58
◼
►
after having spent the $40 on it and being so disappointed at how much it sucked for my Genesis,
01:22:03
◼
►
all that time, the game only has six levels.
01:22:06
◼
►
Yeah, six levels for $40.
01:22:08
◼
►
I'd never beat it.
01:22:11
◼
►
Because at level six, the whole game is really, really hard,
01:22:13
◼
►
And level six is just like, it's so ridiculous, I just, I could not ever beat it.
01:22:19
◼
►
I came close a few times, never got it.
01:22:20
◼
►
You should get a super monkey ball for your, it's a GameCube game, but you have a Wii that
01:22:24
◼
►
will play GameCube games.
01:22:25
◼
►
That is the, probably the most difficult console game that I've played and enjoyed.
01:22:31
◼
►
Because no, I haven't played Dark Souls, people listening.
01:22:35
◼
►
Games are more forgiving now than they were in the past.
01:22:37
◼
►
Just having like, progress saving.
01:22:39
◼
►
is a massive, a massive ease jump, you know? Like...
01:22:44
◼
►
Super Monkey Ball does not have that. Neither does Super Hexagon. Neither does Impossible
01:22:47
◼
►
Road. Super Hexagon, have you played... that's the one you might have heard of and played.
01:22:52
◼
►
Have you played Super Hexagon? No, what's it for?
01:22:55
◼
►
For making yourself feel incompetent? No, no, what...
01:22:58
◼
►
No, it's for iOS. All right.
01:23:03
◼
►
Yeah, it's... yeah. You should get it just because I think it's a really well-done game
01:23:08
◼
►
It has really nice music that you'll I've seen this if you hear you will hear three seconds of before you die
01:23:13
◼
►
Yeah, I've seen this and yeah, I played it for about eight seconds and then not not continuously
01:23:18
◼
►
They'd seconds cumulatively all
01:23:20
◼
►
If you could stay alive for eight seconds, that would be something
01:23:23
◼
►
I don't I don't like games like this like any like I also never cared for like games like
01:23:29
◼
►
Cannibal and yeah anything that's like just fast action and just go until you die or like anything like that
01:23:35
◼
►
I I just don't I get discouraged so quickly and easily from these games
01:23:39
◼
►
I guess I never want you should never play a super axion or impossible super monkey ball though like I mean has easy levels
01:23:45
◼
►
It's fun to play like that's the only game like that that I have been motivated enough to play because like it starts
01:23:50
◼
►
You know it starts so easy you're like oh, this is fun, and it's interesting
01:23:53
◼
►
It's nice to look at it as neat music, and it's mentally challenging
01:23:56
◼
►
But the difficulty just goes on forever and at a certain you it's one of those games where no matter who you are as a human
01:24:02
◼
►
being with the exception of seven people in the world, you will reach the limits of your
01:24:05
◼
►
ability but only after a satisfying trail up to that level instead of just like, "Super
01:24:10
◼
►
Hexagon is immediately you suck now. From second zero you suck." All right? That is
01:24:16
◼
►
Impossible Road is, I think, is actually—I haven't played it enough to know. It's
01:24:20
◼
►
probably a little bit harder than Super Hexagon, but I can't really tell.
01:24:23
◼
►
So now, Marco, did you get into Tiny Wings when that was popular?
01:24:27
◼
►
No, I've seen it. I think I played it on someone else's phone or something.
01:24:32
◼
►
Because I like that one. Like, I've never played Cannibal, and I've seen it on other
01:24:35
◼
►
people's phones, but I like Tiny Wings. I don't play it that often, but I like it.
01:24:38
◼
►
Tiny Wings is charming.
01:24:39
◼
►
I've seen a few things. Like, there was some kind of skiing version of that that I played
01:24:43
◼
►
for like an hour one time, but that... I just... I don't have the patience to... Once I get
01:24:51
◼
►
going really far in one of those games, and then I die, and then I start over again, I
01:24:55
◼
►
just don't care. I'm so discouraged by having to start over again at that point and playing
01:25:01
◼
►
the exact same thing over and over again, even if it's a little bit varied from random
01:25:05
◼
►
generation or procedural stuff. Even then, I hate going back. That's one of the reasons
01:25:10
◼
►
I was playing through Vice City with, no actually it was the original GTA 3, playing through
01:25:18
◼
►
it and I almost beat the game but there was this one mission where it took like 15 minutes
01:25:24
◼
►
to do the mission and it was a timed thing where you had to do it within that 15 minutes
01:25:29
◼
►
and it kept getting within like 10 seconds of succeeding and just barely missing it.
01:25:34
◼
►
And I just stopped playing the game. Like I just never proceeded past that point. After
01:25:37
◼
►
like a few days of banging on that mission and doing it like seven or eight times and
01:25:41
◼
►
failing every single one, I just got so discouraged. I'm like, you know what, I'm done. That's it.
01:25:46
◼
►
I just never went back. It was the mission where you drive around trying to crush all
01:25:51
◼
►
coffee stands in like seven different parts of the town. I bet everyone who played GTA
01:25:56
◼
►
3 probably remembers that mission and possibly stopped playing it there.
01:26:00
◼
►
This is one of the rites of passage of anyone who will eventually come to identify themselves
01:26:04
◼
►
as a gamer is that everyone eventually meets that game with the frustrating level or the
01:26:08
◼
►
difficult thing that they feel like they're never going to get past. And people who will
01:26:14
◼
►
later in life call themselves a gamer get through that and they consider it like a personal
01:26:19
◼
►
triumph and move on from it. And once you've done that once, you realize that there is
01:26:25
◼
►
nothing in the game that I can't do. I can always persevere. It's just a question of
01:26:30
◼
►
doing it. And it's not like a value judgment. Like, if you decide your time is better spent
01:26:34
◼
►
doing something else, then fine, or whatever. I'm just saying, like, the people who make
01:26:37
◼
►
that decision, they say, "You know what? I'm going in this totally inconsequential place
01:26:42
◼
►
where there's no reason for me to do this. There's no reward waiting for the end of it.
01:26:45
◼
►
No one's going to care that I did it. I'm just alone here in my house. I've decided,
01:26:48
◼
►
"You know what? I'm going to do this." And eventually you do do it. It's an amazing
01:26:53
◼
►
feeling and it gives you a belief in yourself that it shouldn't because it's like all
01:26:57
◼
►
you did was press buttons on a controller like this has no bearing on your ability to
01:27:01
◼
►
succeed in life or anything like that. But it feels amazing, right? And that's the
01:27:05
◼
►
great thing for people who are gamers. That's the amazing thing about games like Super Hexagon
01:27:09
◼
►
and stuff is because it takes that gamer sense of thinking that there's nothing you can't
01:27:14
◼
►
beat and saying, "No, actually, here, try this." And it's like, for one set of people,
01:27:21
◼
►
like this is a new experience, because at this point, every challenge that I've come across,
01:27:24
◼
►
I've been able to surpass. So it's going to bring some people to say, "I have reached my limits as a
01:27:30
◼
►
human being." No matter, I realize now, after my years of experience of being in things, that this
01:27:35
◼
►
is one place that I can't go any farther. And then at first, even smaller percentage of people,
01:27:40
◼
►
it's going to make them initially think that, and then they are going to do it, and they're going to
01:27:43
◼
►
to be like, "I am now God." It's like after you've, you know, getting back to drugs analogy,
01:27:50
◼
►
like you've built up a tolerance, right? And the only way for you to get any sort of high
01:27:54
◼
►
is to get into the situation that is basically impossible and either be defeated and have
01:27:59
◼
►
that be a novel sensation or break through anyway and be like, "There's now nothing I
01:28:02
◼
►
can't do," you know? You are very far at the end of that spectrum. Is there any game type
01:28:09
◼
►
experience you've done where you feel like there's no way in heck I'm going to beat this,
01:28:12
◼
►
you forget it, you put the game down, you put it away for six months, and eventually
01:28:15
◼
►
you say, "You know what? I'm going to beat that," and you come back to it. Not with a
01:28:17
◼
►
six-month gap, but any kind of thing where you feel like you've already decided, "This
01:28:21
◼
►
is impossible. This is unfair. There's no way this can be beaten. I hate this game,"
01:28:24
◼
►
but then have eventually gotten through it.
01:28:26
◼
►
Oh, yeah, definitely. Usually that's the outcome. I don't usually give up on the game completely.
01:28:32
◼
►
But there are certain things that just... Anything that just wastes tons and tons of
01:28:37
◼
►
of time doing the same thing over and over and over again
01:28:41
◼
►
in order to get to the point that I keep failing,
01:28:44
◼
►
that drives me nuts.
01:28:45
◼
►
- Yeah, that's part of the experience.
01:28:47
◼
►
Of course they do that.
01:28:48
◼
►
Of course, like the most extreme cases,
01:28:50
◼
►
the ones where there was no saving, right?
01:28:51
◼
►
Because then, like, the whole thing would be like that.
01:28:53
◼
►
You'd spend like five hours on a weekend
01:28:55
◼
►
getting to the place where you die all the time
01:28:57
◼
►
only to die all the time.
01:28:58
◼
►
So like your, you know, your code compiled debug cycle
01:29:02
◼
►
is like four hours long, and you know, you're like,
01:29:05
◼
►
you do the math in your head, like,
01:29:06
◼
►
How many tries is it going to take me?
01:29:08
◼
►
And if each time I do the try, and then eventually you
01:29:10
◼
►
can't even get up to that level anymore,
01:29:11
◼
►
you're going to that downward spiral
01:29:13
◼
►
where you're not even getting halfway to the place
01:29:15
◼
►
where you're going to die anymore,
01:29:16
◼
►
and you have to take a break from it.
01:29:18
◼
►
That's what I'm talking about.
01:29:19
◼
►
That's the whole experience.
01:29:21
◼
►
And that's totally the worst.
01:29:22
◼
►
And that's why the games are generally
01:29:24
◼
►
where you get some kind of save or some other way to do it.
01:29:26
◼
►
But yeah, back in the day, you'd play those NES games.
01:29:29
◼
►
It was like, was it "Bionic Command" at the moment
01:29:31
◼
►
where you had to shoot a missile at Hitler in a helicopter
01:29:33
◼
►
as you flew by him on the screen?
01:29:36
◼
►
30 frames a second, and you got basically one shot at it, and the first time it happened,
01:29:40
◼
►
you had no idea it was coming, and now you're just like, "We gotta play through the whole
01:29:43
◼
►
game again to get up to that one scene and give it another try." That was a different
01:29:47
◼
►
See, I had a terrible horror story with the NES, because I had, what was it, Dragon Warrior?
01:29:52
◼
►
That was the original, not the original RPG, but it was one of the first RPGs in the NES,
01:29:58
◼
►
Please email Casey.
01:29:59
◼
►
Please email me. No, don't really. But anyways, I wanna say, please don't email me, that the
01:30:05
◼
►
highest level you could get to was like 25 and I got up to level 21 or something like that and then my little brother
01:30:11
◼
►
and to this day, I'm not sure if he was being a d*ck or if he did it accidentally, but he
01:30:16
◼
►
erased my save, my save game or whatever and I never looked at that game again because I was it took me hours
01:30:24
◼
►
I remember... That could ruin a friendship.
01:30:26
◼
►
Yeah, exactly. But he's still his brother. You can't get rid of him.
01:30:29
◼
►
Yeah, I tried but I couldn't. Oh man, that made me so angry.
01:30:34
◼
►
Yeah, that's the other thing. That's the other element that could turn you off is like if you feel like something
01:30:37
◼
►
Unfair has happened like it's not the game. It's not you my brother and like that's not fair like I was willing to accept all
01:30:43
◼
►
The crap this game could throw at me and try it, but now someone has deleted my save game
01:30:46
◼
►
It's like alright that one that one. It's like you know foul out of bounds
01:30:51
◼
►
The reason why I never beat Vice City is that I was playing it during college and on my roommates Xbox
01:30:57
◼
►
And when he went home from the summer, I'm like well that there good there. It goes. That's it. He saved you
01:31:02
◼
►
Yeah, but like I would like Tiff and I were playing it we we got
01:31:06
◼
►
We were playing it for like months and we got to what had to be like almost the end of the missions
01:31:12
◼
►
And yeah, but like once that like I ended up getting my own Xbox eventually
01:31:16
◼
►
But then it's like I'm not gonna start over and there was no good way for me to like get the save game from him
01:31:20
◼
►
And put it on mine like you know that that wasn't gonna happen
01:31:23
◼
►
So I just the game if the game is good enough you'd want to start over
01:31:25
◼
►
Yeah, but that's the thing like I think I wouldn't I wouldn't get any pleasure out of like replaying the GTA missions because so like
01:31:32
◼
►
I like them at the time, the first time I'm playing through.
01:31:35
◼
►
I like accomplishing those things and getting it done.
01:31:38
◼
►
But I never want to go back and do these things over again
01:31:41
◼
►
'cause it's just so time consuming
01:31:42
◼
►
and so many of them are so tedious.
01:31:44
◼
►
- Yeah, it's kind of like favorite movies.
01:31:47
◼
►
Most people like to see their favorite movies
01:31:49
◼
►
more than once in their entire life.
01:31:50
◼
►
Like that's what makes them their favorite movies.
01:31:52
◼
►
None of them need to watch it every month
01:31:53
◼
►
or even every year, but your favorite movies,
01:31:55
◼
►
you might be like, "Nah, I've seen that one already."
01:31:57
◼
►
Like you'll watch it.
01:31:58
◼
►
You'll watch it if it ends up on TV or whatever.
01:32:01
◼
►
That's what it's like with favorite games,
01:32:02
◼
►
gamers is like not like you're gonna play it every month or every year or whatever but like every
01:32:06
◼
►
Five years or so you feel like I have to play my hero game again because it's been too long right
01:32:11
◼
►
Yeah, so how often do you play journey? I?
01:32:13
◼
►
Play it really so many damn times, so I'm not taking a break from now at this point
01:32:17
◼
►
I do it pretty much on the year anniversary of journey
01:32:19
◼
►
I play a little bit, but like my new thing is getting other people to play journey. I'm spreading it's spreading the love to others
01:32:25
◼
►
It's just two hours
01:32:27
◼
►
So I can't I can't even believe it you already have the ps3. I think you already have the game yep
01:32:32
◼
►
Oh, you were just trolling the shit out of him right now.
01:32:35
◼
►
He's just denying himself a good experience.
01:32:38
◼
►
I mean, Journey really is a gamer's game, though, so it could be that it's appeal.
01:32:42
◼
►
It's like a movie fan's movie, like someone who's a real big cinephile, if that's the
01:32:48
◼
►
Movies that they love, the general public might not love.
01:32:51
◼
►
But I think Marco, I think Journey may be a crossover hit.
01:32:55
◼
►
What about you, Casey?
01:32:57
◼
►
What's your Journey excuse?
01:32:58
◼
►
I don't have a PS3.
01:33:00
◼
►
Alright, well when Marco's done with his I'll send it to you.
01:33:03
◼
►
Because he's not using it for anything else apparently.
01:33:07
◼
►
On a very very quick final note, I tweeted like two minutes before the show, I just filled
01:33:11
◼
►
my car, my tank miles per gallon, 15.
01:33:14
◼
►
Yeah, I saw that.
01:33:15
◼
►
I was thinking, I would love to get that.
01:33:18
◼
►
I was thinking I'd get like double that if I ever measured my mileage, which I don't.
01:33:23
◼
►
This moment right here perfectly encapsulates the three of us.
01:33:28
◼
►
It perfectly encapsulates our cars, anyway.
01:33:31
◼
►
There are, apparently...
01:33:33
◼
►
There is a game called Candy Crisis. People are saying, "This is the Puyo Puyo clone for Mac."
01:33:36
◼
►
It's very well known. It looks like it might even be open source.
01:33:39
◼
►
- Yeah, it might have been the name of it. - Yeah, it's GPL.
01:33:42
◼
►
I just didn't recognize the screenshots. Like, they didn't look familiar to me.
01:33:46
◼
►
Yeah, so these screenshots still don't look familiar to me.
01:33:49
◼
►
I mean, there could be more than one of these. I don't doubt that there's more than one.
01:33:52
◼
►
I'm totally getting this. I'm so good at this game.
01:33:55
◼
►
No one... No one... I'm always... I tweeted, like...
01:33:57
◼
►
I'm always good at the games that nobody else plays, which of course that probably just
01:34:00
◼
►
means I'm not.
01:34:01
◼
►
Well, people play this.
01:34:02
◼
►
They call them casual gamers, Marco.
01:34:04
◼
►
No, but there's like...
01:34:05
◼
►
Only John is judging you.
01:34:07
◼
►
I'm really good at Moon Base Commander, too.
01:34:09
◼
►
And Moon Base Commander, nobody plays.
01:34:12
◼
►
You said Rubik's Cube.
01:34:13
◼
►
I was like, "What?"
01:34:15
◼
►
That's like one of my, like, "I'll never get to it" ideas is I would love to make Moon
01:34:19
◼
►
Base Commander for iPad, but it's just never gonna happen.
01:34:23
◼
►
Like, first of all, even though it was a $5 game in, like, 2001,
01:34:29
◼
►
it's still probably beyond my ability to make,
01:34:33
◼
►
because I'm not really a game programmer, and it would be, like--
01:34:37
◼
►
I'm sure maybe I could do it if I had nothing else to do for, like, five years,
01:34:40
◼
►
but, you know, I wouldn't--
01:34:42
◼
►
it would be a tremendous waste of time for me to try to make that,
01:34:44
◼
►
because it's so far outside of my expertise.
01:34:46
◼
►
- Sprite can? - Maybe.
01:34:48
◼
►
- Ah. - But, um--
01:34:50
◼
►
- Games practically write themselves.
01:34:52
◼
►
It automatically compiles your images into asset files.
01:34:59
◼
►
You should watch those Dev Summit.
01:35:01
◼
►
SpriteKit is like-- SceneKit, you could not make a 3D game with, because it's just for
01:35:06
◼
►
adding 3D to your apps.
01:35:07
◼
►
Like those are number three.
01:35:08
◼
►
But SpriteKit, you could make a Sprite game with.
01:35:11
◼
►
Isn't it basically just like Apple's ripoff of Cocos2D, or is there more to it?
01:35:16
◼
►
I mean, basically, you've got core animation, right?
01:35:18
◼
►
So you've got all the makings of a SpriteKit, but anyone who actually wants to make a game
01:35:21
◼
►
out of that is not going to use a bunch of current animation layers. There's things that
01:35:24
◼
►
sprite collision detection and compiling all your assets into big files and pulling out
01:35:28
◼
►
chunks of them or whatever. And this does that for you. This makes it so that you might
01:35:34
◼
►
be... People who are thinking of making a game but have no idea how to do it, Sprite
01:35:37
◼
►
Kid now suddenly puts their game to the realm of possibility because it's not like... You're
01:35:42
◼
►
not going to make an awesome game that's groundbreaking, but you're going to make a competent game
01:35:45
◼
►
provided you have good artwork or whatever. So it does the things the framework's supposed
01:35:50
◼
►
Which is like people who could not make this program before now can because smarter people have come and given them more lower layers
01:35:56
◼
►
And it's impressive because you actually can make a game out of it like it did in the demo
01:36:01
◼
►
They had an actual game not a not a good game not an amazing game, but you look at it
01:36:05
◼
►
And you go you know what that's fine. You know
01:36:07
◼
►
Someone who who has like the skills to make a game in terms of level design and character design
01:36:12
◼
►
But not the skills to make a sprite engine now can get stuff on
01:36:17
◼
►
IOS and of course the best thing about it is it's IOS only
01:36:19
◼
►
So those people who do it won't have the skills to port their games any other platform
01:36:24
◼
►
Platform lock-in whoo
01:36:27
◼
►
But you should check just watch the dev seminars. They're fun dev seminars. They got their games
01:36:31
◼
►
I will see if I could but I can't oh, that's right everything's down, and I don't download all the
01:36:36
◼
►
Foresight to download them all the day they came out every year
01:36:44
◼
►
Someday now I have all this space and I finally I finally have like a large storage and backup thing set up
01:36:49
◼
►
Oh god. I have UPS is everywhere now - I have because I got this analogy and I'm like, you know what?
01:36:55
◼
►
I should put this on a UPS and
01:36:57
◼
►
So I'm like upgraded my main UPS for my mac Pro
01:37:01
◼
►
Move the old one into the closet for that and the router and stuff does the SMT 1500 have a fan?
01:37:07
◼
►
Oh my god you and your fans it does have a fan, but I think it only uses it when it's running on DC power
01:37:13
◼
►
hour. I, uh, cause like normally, I mean, I'll have to try to pay attention. I'll have
01:37:19
◼
►
to put a load on it when the Mac Pro's off. Um, so I could, so I could tell more directly,
01:37:23
◼
►
but as far as I can tell, the fan is not running normally. Uh, I certainly can't notice it
01:37:28
◼
►
next to a Mac Pro, uh, with no hard drives in it, which should tell you something. It
01:37:32
◼
►
doesn't tell me anything. It tells me nothing. All right. I'm hanging up on YouTube. I gotta
01:37:37
◼
►
go pack. All right. Enjoy your beach. And to be honest, I'm sort of dreading it. I don't
01:37:42
◼
►
I've not been in a pis-- I've not been to the beach at a time when I enjoy drinking alcohol, which I really enjoy.
01:37:48
◼
►
- So you're on the beach every five years? - I haven't been to the beach for more than a few hours.
01:37:52
◼
►
- Oh, good. Casey, we didn't have a beach intervention for you. - I hate the beach. It's hot. I hate the feel and the smell of suntan lotion.
01:38:00
◼
►
- Oh, God. What's wrong with you? Where'd you grow up again? - Oh, God.
01:38:03
◼
►
- Oh, I hate-- I will do anything to avoid using sunblock. - Oh, what is--
01:38:07
◼
►
- Oh, amen. Amen to that. - What is wrong with you people? - Sunblock smells like--
01:38:11
◼
►
Well, no matter what, it gets in my eyes.
01:38:13
◼
►
Like, no matter where I put it, no matter how careful I am, it always gets in my eyes and burns.
01:38:17
◼
►
This is like those commercials where they have this device to cook eggs and they say,
01:38:20
◼
►
"Eggs are so hard to make!"
01:38:21
◼
►
And the guys get eggs in their hair and the shells are in their eyes poking them.
01:38:25
◼
►
Sunblock always gets in my--
01:38:27
◼
►
No, it doesn't!
01:38:28
◼
►
If you have a tiny bit of confidence, you can not get the eggshells in your eyes.
01:38:33
◼
►
Even if you don't get it in your eyes, it still smells like--
01:38:36
◼
►
And you gotta sit there and you're--
01:38:38
◼
►
There's a million kinds of sunblock!
01:38:39
◼
►
I mean, it smells crappy.
01:38:40
◼
►
This million kinds of sunblock.
01:38:42
◼
►
Then you're all slimy for all day.
01:38:44
◼
►
And then what do you do?
01:38:45
◼
►
When you start to sizzle, you have to flip over.
01:38:48
◼
►
It's like you're a freaking geek yourself.
01:38:49
◼
►
You guys may be doing it wrong.
01:38:51
◼
►
Then you get up and you walk across the sand that's
01:38:53
◼
►
melting the bottom of your feet.
01:38:55
◼
►
Then you get in the water, which you accidentally
01:38:56
◼
►
get in your mouth.
01:38:57
◼
►
What beach are you going to, anyway?
01:39:01
◼
►
Kill Devil Hills, which is a great name for a freaking
01:39:03
◼
►
beach in the Outer Banks.
01:39:07
◼
►
Non-beach people.
01:39:08
◼
►
And then you get in the water and you open your- you stop clenching your lips shut as
01:39:13
◼
►
hard as possible and suddenly all the salt that is in the entire world is in your mouth.
01:39:19
◼
►
And you can't even drink the f***ing water because then you get more salt in your mouth.
01:39:22
◼
►
All these experiences you're describing are the same experiences the people who like the
01:39:26
◼
►
beach enjoy, but you're giving them a negative spin.
01:39:29
◼
►
The smell of the salt air, the feel of the sand under your feet, the smell of sunblock
01:39:35
◼
►
even suntan oil, cocoa butter smells. No. You guys were deprived of important experiences
01:39:44
◼
►
in your formative years, and now are broken adults who can't enjoy the beach.
01:39:48
◼
►
And the funniest part of this entire discussion is we met 20 yards from a beach, although
01:39:53
◼
►
the difference being that was a lake beach, which I enjoy.
01:39:55
◼
►
No, lakes are gross.
01:39:57
◼
►
Ocean beach.
01:39:57
◼
►
Filled with disgusting smelling water and mud.
01:39:59
◼
►
Yeah, and also, we were not wearing sunblock. We were inside using computers.
01:40:05
◼
►
There was no salt, there was no sand, there was no sun.
01:40:08
◼
►
You got the programmer's tan, that's what I got.