PodSearch

ATP

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:43   functions.

00:00:44   But I've never actually needed to write one.

00:00:47   Really?

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:50   Oh, well.

00:01:52   Suck it.

00:01:53   So, anyway.

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:29   Anyways...

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:28   (laughing)

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:06   - Yeah.

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:48   Go 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:42   attribute.

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:45   object.

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:01   Ugh.

00:13:02   It's gross.

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:14   (laughing)

00:14:16   Hi, Nolan.

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:35   even.

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:45   - It does.

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:33   Yeah.

00:18:34   So, John.

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:18:59   And I bet--

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:24   things.

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:40   a program.

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:17   Get it?

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:30   your stuff.

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:05   it.

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:46   Awesome.

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:07   and pretty.

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:07   nicely.

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:10   It's fun.

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:56   I like it.

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:07   See?

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:26   UI.

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:48   know what?

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:54   What?

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:15   Yes.

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:23   Oh, well.

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:31   store.

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:16   you know.

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:35   do it.

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:49   job.

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:52   at least.

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:18   Oh, yeah.

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:29   know.

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:06   No.

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:35   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:55   Awesome.

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:04   I do.

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:09   companies.

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:44   patents?

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:53   result.

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:38   past?

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:21   Yep.

01:07:22   Yep.

01:07:23   Yeah.

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:15   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:28   disease."

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:36   [laughter]

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:49   [music]

01:09:50   Now the show is over, they didn't even mean to begin, 'cause it was accidental.

01:09:59   Accidental.

01:10:00   Oh, it was accidental.

01:10:02   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:04   fast text.

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:34   in them.

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:47   secure."

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:00   Jesus.

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:11   Oh my god.

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:19   Right.

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:10   Someday.

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:16   No!

01:17:17   I've got it a little bit under control.

01:17:18   No!

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:21   Nor have I.

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:51   Hi.

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   So it's fun

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:15   different.

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:46   age.

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:57   and...

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   Oh, yeah

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:47   word.

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:54   We'll see.

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:13   I saw that.

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:27   Definitely.

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:03   It's okay.

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:11   Right?

01:34:12   You said Rubik's Cube.

01:34:13   I was like, "What?"

01:34:14   No.

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   What is it?

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:04   [laughter]

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.

01:40:11   Oh god.