Podcast Search

ATP

24: Double Meta

Select a time to play from there. The line being spoken is highlighted as the audio plays.

0:00:00Don't pick the drop tables one though because Apple probably does not...

0:00:03is not protected against injection attacks.

0:00:06Yeah, right. Yeah, we'll take down the whole iTunes store.

0:00:08I do like "I'm double meta" or "meta" however you'd like to pronounce it. I thought that was good.

0:00:13Who says "meta"? I've heard that occasionally, but it's much more rare than, you know,

0:00:18the GIF GIF thing. Like, that's like 50/50, but "meta"? No, sorry. That's not good.

0:00:26This reminds me of when I brought up the bra phase in neutral.

0:00:30But I wrote my first VA list function a few minutes ago.

0:00:35Like, all this time, I've known that it's a thing.

0:00:38I've known that this is how you do variable argument list C

0:00:43functions.

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

0:00:47Really?

0:00:47Until like an hour ago.

0:00:49God, I did that at my first job, which was C++ for DOS.

0:00:55I don't remember why I did it, but I did it, and it was weird.

0:00:59So what did you use it for?

0:01:00Am I allowed to ask?

0:01:01Yeah, if you want.

0:01:03So for my new big thing, I've now

0:01:08done-- in substantially shipping products,

0:01:11I've now done both core data in the magazine.

0:01:16And granted, that's a pretty light use of core data,

0:01:18but it's still a shipping production use of this thing

0:01:23for a real app that's not entirely trivial.

0:01:26So I've used Core Data, and in Instapaper,

0:01:31I used SQLite just raw.

0:01:33And I made a few lightweight utility functions

0:01:38to wrap on top of it, but everything was really just done

0:01:42via raw queries and raw calls to the SQLite API.

0:01:46And I know it's not pronounced SQLite, and I don't care.

0:01:49I also say GIF.

0:01:50Oh, well.

0:01:52Suck it.

0:01:53So, anyway.

0:01:54So, for my new project, now that I've seen both, I would like to get back to SQLite a

0:02:04little bit, just because Core Data is really nice for a very large set of things, but this

0:02:10is something where I expect to be dealing with a lot of data.

0:02:14And I know when you have large datasets that Core Data performance problems can pretty

0:02:19easily arise and can often be very, very hard to get around.

0:02:23So I decided to use Gus Mueller's awesome FMDB, which is a pretty lightweight wrapper

0:02:33around SQLite.

0:02:35And what I decided to build was a similarly lightweight model class on top of that.

0:02:43And this is probably -- this is one of those things where if you hear a programmer saying

0:02:47they made their own model class. Chances are it was a bad idea.

0:02:51And mine, chances are mine is probably a bad idea as well,

0:02:55but I'm doing it anyway, just like writing my own blog engine and roasting my own coffee.

0:02:59I'm doing these things anyway, even though it's generally not worth it, and I'm probably, like,

0:03:03so, okay, the main argument against this, this is the classic

0:03:07like, programmer know-it-all wanting to rewrite something really critical

0:03:11that everyone's done a million times, and chances are my version is gonna have bugs.

0:03:15You know, they're re-implementing UNIX joke or Emacs or Lisp or whatever the joke is.

0:03:20They're probably all three.

0:03:22- Is it Lisp? - It is Lisp? Okay. I thought it was Unix.

0:03:27Okay. I'll have to look that up.

0:03:29Anyways...

0:03:31Actually, of course you're right, John. This is the kind of thing you would know.

0:03:34It's not re-implementing. It's like, you know, any program eventually includes a, you know,

0:03:40half-assed buggy re-implementation of Lisp or something like that. I'm paraphrasing.

0:03:44Yeah, I'm pretty sure that is the thing I'm referring to. Okay, anyway. So, and there's

0:03:49already probably a million of these things out there, but I don't like using other people's

0:03:54frameworks that do substantial, like, non-trivial things. I don't generally tend to use those,

0:04:02except apples and, you know, things that I just really could not write myself. But, and,

0:04:08you know, I'm okay using other people's, like, utility functions, stuff like that, and that's

0:04:12why I'm using FMDB, because not only do a lot of people use it, and Gus Mueller is a

0:04:15good programmer, but I can look at the code. It's not a very large library. It's actually

0:04:21very, very compact, and it really is just like, it's really just convenience wrappers

0:04:27around SQLite, for the most part. And so, you know, it's pretty thin.

0:04:33So you're not like an AF networking fan then?

0:04:37AF networking, I added it to the magazine fairly late.

0:04:41I think in the most recent version of the magazine,

0:04:43I think I added it for some relatively trivial thing.

0:04:48I really just wanted to try it.

0:04:50I know AF networking is very, very good,

0:04:52and its programmer.

0:04:53Is that Matt with three Ts?

0:04:55Thompson, who writes that?

0:04:56- I believe that's right.

0:04:58- Well anyway, he's really, really good.

0:04:59So that's the kind of, like,

0:05:01I have no problem using his code,

0:05:02'cause he's ridiculously good.

0:05:04So we'll have to look that up.

0:05:06I'm pretty sure it's him.

0:05:07But, and that's what I think, everyone uses AF networking,

0:05:11so I know that it probably is not buggy,

0:05:13and if there is a bug, it's probably gonna get

0:05:14fixed pretty quickly.

0:05:15So, and that's another thing, like, you know,

0:05:18they do a lot of things there.

0:05:20It's still a fairly thin layer, though.

0:05:23Like, I mean, different parts of it, I guess,

0:05:24are different widths, or thicknesses, but,

0:05:28(laughing)

0:05:29but yeah, so anyway.

0:05:31Long story short, I decided to write my own model class.

0:05:35And this involves, you know,

0:05:39anytime you write something like this,

0:05:40there's a lot of weird design decisions you have to make.

0:05:43This is one of the first times I've really had to dive in

0:05:47to Objective-C runtime stuff.

0:05:50And I'm trying to avoid it being hacky and bad.

0:05:53And right now I'm calling into some runtime functions

0:05:56to basically do reflection.

0:05:58And I know we had a whole reflection topic

0:06:02on the topic list.

0:06:03I wonder if we can get to those now.

0:06:05- But we certainly can.

0:06:06- Yeah.

0:06:08But you know, like in dynamic languages,

0:06:11like most of the web languages,

0:06:12like the advanced scripting languages and stuff,

0:06:14it's easy to,

0:06:17it's very, very easy to like, you know,

0:06:19just inspect your variables and see what the class has

0:06:22and do crazy things to it and everything else.

0:06:26With Objective-C, a lot of that is possible.

0:06:29Some of it's not.

0:06:30But it's actually more possible than I thought it was.

0:06:34So, one thing I'm doing is, you know, the model class has its own dictionary mapping

0:06:42column names to their values.

0:06:44>> Oh, that's so awful, but carry on.

0:06:47>> Wait, hold on.

0:06:48Go on.

0:06:49>> Well, it's awful.

0:06:50>> This is the time to tell me.

0:06:52>> Well, it's awful in that coming from a .NET background and C# background, that is not

0:06:59at all how I would handle it.

0:07:00it. In Objective-C, that probably is exactly how I would handle it. So I'll tell you the

0:07:04other approach when you're done. So I'm sorry, carry on.

0:07:07No, please tell me now. Oh, all right. So you've just lost the floor

0:07:11for an hour, and John, you might as well just hang up. So one of the things I've been wanting

0:07:15to talk about on ATP for a long time is having a leg in both the .NET and the Objective-C

0:07:22and Cocoa worlds is that there's a lot of obvious differences between the two platforms.

0:07:29And by and large, I really, really like the decisions that Apple's made.

0:07:33And my friend Jamie Pinkham said to me once, when I was complaining about, for example,

0:07:38how convoluted handling dates are within Cocoa, he said, and I was saying, "Oh, why isn't

0:07:44there just a date class that handles everything?"

0:07:46And he said it more eloquently than I'm about to recount it, but he said something to the

0:07:50order of, "Is it really that complex or is it just properly abstracted?"

0:07:55And it was one of those, you know, total mind explosions.

0:07:58And I was like, you know what, you're actually right about that.

0:08:00And so, by and large, I think that that Koko and Koko Touch are really, really well done.

0:08:04However, reflection in Koko and Koko Touch, not as well done as I would like.

0:08:10So, let's give you an example by way of how would I have done the same thing in .NET.

0:08:15And this all cued for me when you tweeted about three or four days ago about what do

0:08:22you call the thing that represents the unique identifier for an object?

0:08:27Naturally, in most languages, that would be ID.

0:08:31But in Objective-C, you can't really do that because ID is a key.

0:08:34That's not true, actually. You can. It works just fine.

0:08:37Which is a little bit scary, which is probably why you shouldn't do it.

0:08:40But it does work. You can name a variable ID.

0:08:43Mine was even type ID.

0:08:46God, that makes me hurt so bad.

0:08:49But the point I'm driving at is whether or not it's tactically allowed,

0:08:52it's just not a good plan. And I think we can all agree about that.

0:08:55So, what would I have done in .NET?

0:08:57Well, what's really great about .NET is reflection is, in my personal opinion, kind of a first

0:09:02class portion of the language.

0:09:04And .NET is really metadata heavy.

0:09:06So what that means is, when I have what a .NET programmer would call a field, but an

0:09:12Objective C programmer would call an IVAR, basically a variable within a class, I can

0:09:17actually decorate that variable with arbitrary things that we call attributes.

0:09:22So if you imagine a class definition, you can say that you have a variable that's called

0:09:29unique identifier, for example.

0:09:32You can put an attribute that's associated with that variable, and that attribute is

0:09:37actually an instance of a class that inherits from a certain base class called, guess what,

0:09:42attribute.

0:09:43So I could make an attribute that decorates that field that specifies what the column

0:09:50name is for that IVAR. So let me play this back. I've got a class. I've got a class that's in my

0:09:58application that may or may not use the same terms as I want to use in my data store. So I could call

0:10:07whatever this is, this variable, like I said, unique identifier, I could call that unique

0:10:13identifier in my C# code, but I could decorate it with an attribute that says, "Hey, when

0:10:20you go back to the database, it's actually called ID."

0:10:24And so that's really, really powerful, being able to easily, and that's the key here, easily

0:10:30introspect and reflect upon yourself and see what metadata you have about your own classes.

0:10:37And I use this constantly.

0:10:39When I first learned about it, it was one of those things where I had a hammer, so everything

0:10:42was a nail. And I'm not proud of that. But as I've gotten to be a more mature programmer,

0:10:49I still use this all the time. And you can write your own custom attributes, like I said.

0:10:54You can use a ton of existing attributes. But being able to decorate your code and give

0:11:00yourself help on what to do with your code is the most powerful thing in the world. So

0:11:06to bring this back to Coco, what I would have liked to have been able to do is do the same

0:11:10thing or for you to have been able to do is to do the same thing and have this IVAR that's

0:11:14maybe called identifier but in the database is called ID and you don't have to have a

0:11:20stupid freaking dictionary or hash table or whatever the case may be hanging out doing

0:11:25that conversion. It's all in line. It's a first class part of that class. Did that make

0:11:31any sense at all?

0:11:32It did. That's actually really cool.

0:11:35Because, I mean, I don't even-- I think--

0:11:38I think there actually is buried in the runtime a way

0:11:42in Objective-C to attach arbitrary objects to any NS

0:11:45object.

0:11:46But I don't think it's supposed to be exposed.

0:11:49And either way, you probably shouldn't

0:11:52be doing things with that.

0:11:54There's a lot of things with designing low level model

0:11:59and reflection type classes and things like that.

0:12:02There's a lot of times where like,

0:12:04there's something you can do that you probably shouldn't do

0:12:07and a lot of room for terrible hacks.

0:12:10- Right, and you could do an associated object,

0:12:12but that's a little bit different

0:12:13because that's more of saying,

0:12:15I'm probably gonna butcher this

0:12:16because I haven't done it in a while,

0:12:17but if memory serves, that's saying,

0:12:19hey, for this instance of this class,

0:12:22I wanna have this arbitrary object associated with it.

0:12:25Whereas what I'm talking about is at a class level,

0:12:27I'm defining an additional piece of metadata that's part of that class definition.

0:12:34And again, it's just extremely powerful.

0:12:35And I think you're right, Marco.

0:12:36I think you can do a lot of this with Objective-C. And I've looked into reflection in Objective-C.

0:12:40And a lot of it is possible, a whole heck of a lot of it.

0:12:45But the thing that's crummy about it, and we've complained about this as a threesome

0:12:49before, is that you've got to drop into the C runtime.

0:12:52You were saying this just a few minutes ago.

0:12:54You gotta drop into the Objective-C runtime, which is all straight C, which once you get

0:12:58used to the cushy world of Objective-C, it's just...

0:13:01Ugh.

0:13:02It's gross.

0:13:03Well, it's not that.

0:13:04I mean, you know, I had to write "Malloch" and "Free" earlier today for the first time

0:13:07in a while, but it's like ten lines of C in the middle of this wonderful Objective-C

0:13:13cushy playland.

0:13:14I mean, it's not that bad.

0:13:18So what would you have done in PHP?

0:13:20And John, I'd like to know where Perl fits in,

0:13:22if we ever give you a chance to talk.

0:13:24What would you have done if you were trying

0:13:26to solve the same problem in PHP?

0:13:27- Well, I have solved the same problem in PHP.

0:13:29I use for Instapaper, for the magazine, for the new things.

0:13:33I do use my own MVC framework

0:13:36that is very thin and lightweight,

0:13:37so I can use SQL directly.

0:13:39All the same goals, actually.

0:13:41Well, most of the same goals.

0:13:42And so I have solved this problem in PHP,

0:13:46And I basically, I think I do roughly the same thing

0:13:51with like, you know, storing the attributes

0:13:54of a model object as a dictionary of, you know,

0:13:58strings to value, of keys to values,

0:14:00and those keys match database column names.

0:14:03And, you know, there's all sorts of things you can do.

0:14:06By the way, I love, if Merlin is actually listening to this,

0:14:09and if he's still listening, I'm getting him back so hard

0:14:12for all that comic book talk and backdoor.

0:14:14(laughing)

0:14:16Hi, Nolan.

0:14:17This is glorious.

0:14:19So you know, there's always-- this

0:14:23is one of the reasons why I like doing this kind of programming

0:14:26at this level, solving these kinds of problems,

0:14:29even though they've been solved a million times before,

0:14:31even though my implementation might not

0:14:33be very good for some people or for some things or for myself,

0:14:35even.

0:14:36I love it because there's so many design decisions

0:14:40that you can make that really do have a pretty big impact.

0:14:43So one of the things-- and I don't

0:14:46want to talk about this for too much of the show,

0:14:48just because I think it will get a little bit boring, even

0:14:50for people who aren't Merlin.

0:14:51But I think one of the things about--

0:14:55one of the hardest parts about this

0:14:57is how do you expose the database fields on the object,

0:15:01and how much code or boilerplate has

0:15:05to be written in the subclasses?

0:15:09So in the model classes, how much do you have to do?

0:15:13and how are the columns represented.

0:15:14So in my thing, I actually do a very similar trick

0:15:18to what Core Data does.

0:15:19Because you can tell at runtime, which I actually

0:15:22don't know why you can tell this at runtime, but you can.

0:15:25You can tell at runtime whether a property was declared

0:15:30dynamic, or rather whether its implementation was declared

0:15:34dynamic, and if it has custom getters or setters.

0:15:39All that stuff is available at runtime from the runtime APIs.

0:15:42So I'm basically making it so that you can set and get

0:15:47arbitrary column names just via a dictionary API.

0:15:50But it also treats any dynamic property as a database column.

0:15:56And then it does useful things.

0:15:58So you can have a property that's an NSURL.

0:16:01And if you declare it dynamic in the implementation file,

0:16:05then the runtime will see that.

0:16:07And so at runtime, it'll say any access to and from that

0:16:11is the database field named that.

0:16:14And then you can just call save, and it works.

0:16:16And you can call the query functions, get them,

0:16:21and it maps into them on read.

0:16:23So it's a very simple model layer.

0:16:29This is one of the reasons why I write my own model

0:16:31layers in the languages that I like.

0:16:35I don't usually like the model layer to have to do that much.

0:16:39And specifically, I treat databases the way

0:16:43that most programmers of previously high-traffic web

0:16:46applications treat databases, which

0:16:49is infrequently and gently.

0:16:51And so I don't like ORMs and really these crazy,

0:16:57very high-functioning model type APIs,

0:17:01where they'll go look up associated objects for you

0:17:04and do extra queries on your behalf.

0:17:06And I don't like query builders.

0:17:08I like to write the query myself so I

0:17:10can choose exactly how it's queried in the database

0:17:12and optimize it.

0:17:15And I don't like anything that creates the tables for me.

0:17:17I don't like the core data gooey about the model declarations

0:17:23and the migrations.

0:17:24Oh, migrations are rough.

0:17:26So I'm basically doing something that-- it

0:17:32is more of a convenience wrapper than a functional wrapper,

0:17:35if that makes sense.

0:17:38it's not doing a whole bunch of magic,

0:17:40it's just getting rid of boilerplate.

0:17:43Does that make sense?

0:17:45- It does.

0:17:46And I guess to me, I view a model as the buffer

0:17:51between the completely myopic database world

0:17:55and the completely myopic application level.

0:17:59And to me, and I agree with you

0:18:01that a model should be extremely dumb.

0:18:03It should basically be a bucket and nothing else,

0:18:06But I would hate not having it around because I want my application code to speak with classes,

0:18:13to classes and very little else.

0:18:15And I want my database to speak to itself in some lay intermediary layer that translates

0:18:20from database to model and back.

0:18:22And I think we're saying the same thing.

0:18:24But I can't, when you said I'm writing a model and oh, I can't believe I'm doing that, et

0:18:28cetera, et cetera.

0:18:30That just, it struck me funny because I would hate not to have one.

0:18:33Yeah.

0:18:34So, John.

0:18:35Yeah, I was about to say, John, where do you land on all this?

0:18:38I want to get back to something that Marco said in the beginning when he introduced this

0:18:42topic about how he was making his own model class, and that's probably a mistake, in case

0:18:48he said he thought it wasn't.

0:18:50Thinking about this topic, I see that a lot as kind of like a class system, pun, for programmers.

0:18:59And I bet--

0:19:00I don't think you have to label your puns.

0:19:01Yeah, maybe Marco has a lot of-- but I mean it like-- you know, you know how I mean it.

0:19:05Maybe Marco has not seen this as much as Casey, who's been out in a J-O-B job for longer,

0:19:11but I see it all the time.

0:19:15People can draw distinctions of all sorts with programmers based on their experience,

0:19:18what language they use, what their education is or whatever.

0:19:21This distinction, I think, is the most important one, much more so than any of those other

0:19:24things.

0:19:25No matter what their education is, how long they've been doing it, what language they're

0:19:27writing in, I usually tend to bin programmers into two groups.

0:19:33One is the programmers who take something that someone else wrote and use it to make

0:19:40a program.

0:19:41They learn Ruby on Rails and they make a web application.

0:19:45They learn UIKit and they make an iOS application.

0:19:50And those people distinguish between the magical elves that make the things they're going to

0:19:56use to write their program and their program.

0:19:59And the second set of people make no distinction between the things they're using to write

0:20:04the program and their program.

0:20:06It's all one continuous thing.

0:20:08And those are the people who are going to write their own thing, even though the vendor

0:20:13provides one.

0:20:14Or those are the people who are going to write their own web frameworks, or their own blog

0:20:18engines, or like, in the extreme case, their own language.

0:20:21Like it's a complete continuum, and there's no hard and fast line between, "These are

0:20:25the words that I type to make my program work, and this is my program. I don't know if you want to

0:20:30call tool builders, because you don't necessarily have to be that type of thing, but there are some

0:20:33people who will never cross that line. In every environment they find themselves in programming,

0:20:39they will draw that distinction somewhere and say, "That is other, and I don't do that, and that is

0:20:43magic, and I call those things to make my program work, and then my program is a series of

0:20:47conditionals and loops and variables and classes or whatever that use that thing to do their work."

0:20:52I think that distinction is—like when I heard Marcus say, "Oh, I probably shouldn't

0:20:58write there.

0:20:59I probably shouldn't write my own model class," being afraid to try to draw that line and

0:21:05using it as a barrier and saying, "I shouldn't cross over the line."

0:21:07Now, one is practicality.

0:21:08Like, maybe you shouldn't write your own language in compiler to do this tip calculator program

0:21:12or something, right?

0:21:14That's one side of it.

0:21:15The other side of it is that I see a lot of people who draw that line and are afraid to

0:21:17ever cross it.

0:21:18Everyone starts with that line because you don't know what the heck you're doing when

0:21:20you start out, right?

0:21:22I would encourage everybody who thinks they can recognize that line to realize that line

0:21:26doesn't exist. It's all just one big continuum of code written by people. And there's no

0:21:31reason you can't write a better one of whatever it is that you're using all the way up and

0:21:34down the chain. And in some cases, you should. And obviously, you know, like knowing when

0:21:39you should and when you shouldn't is a whole separate matter. But never like, you know,

0:21:43I wouldn't even Marco, just like, if there's a reason not to do it, it's not because like,

0:21:48"Oh, I'm going to screw it up. I'm not going to do it."

0:21:50People who made those things are, at a certain point, they're just other people too.

0:21:54Who made FMDB? It's just another guy.

0:21:57The only way you'll ever get good at doing something like that

0:22:00is to decide, "I'm going to make my own thing here."

0:22:03And then your thing might not be as good, but the fifth version of your thing will be as good,

0:22:07and then you've just become one of those people. Now that line is gone.

0:22:10So that's my take on this whole meta topic.

0:22:15I'm going to get a meta topic for a metadata topic.

0:22:17Get it?

0:22:18I'm double meta.

0:22:20And as for the actual things you're all talking about there,

0:22:23I don't want to go, well, Simpsons did it on you.

0:22:25But I always do.

0:22:26Simpsons did it, right?

0:22:27So all this stuff is kind of all that in the Perl world.

0:22:31And the path that I've sort of traveled--

0:22:34and I think a lot of the Perl community

0:22:35has traveled on the same topic-- is in the beginning,

0:22:43you've got a way to send SQL queries somewhere,

0:22:46and that's annoying, and someone writes some nicer way

0:22:48to wrap that up, and that's nicer,

0:22:50but then you're like, okay, well now I wanna make

0:22:52some classes associated with things

0:22:54that are gonna be associated with tables,

0:22:55and it's kind of annoying to write all that,

0:22:58which fields are associated with which columns,

0:23:00and like Marco was getting to,

0:23:01how much do I have to write?

0:23:03After you've done 10 or 20 of those things,

0:23:04at a certain point you're like,

0:23:05can I type less and get the same effect?

0:23:07And then you're like, you know what,

0:23:10can I type even less?

0:23:11like the ActiveRecord Rails type thing where you're like, "Why do I have to type anything?

0:23:14Can't I just inspect the database and figure out what all the columns are and do all that

0:23:18stuff for me?"

0:23:19And it's like, "Look, I can type one line and my whole thing is done."

0:23:24And you can do that in dynamic languages.

0:23:26You can probably do that in Objective-C if you really wanted to get down and dirty with

0:23:29the Objective-C runtime, although you probably don't.

0:23:31But just don't have anything.

0:23:34Just inspect the database, figure out the classes, figure out the tables, make your

0:23:39classes based on them, have a thing that manages the conventions for naming and also the crap.

0:23:45I think the next step beyond that, which I found probably the biggest leap—the first

0:23:51biggest leap was the one where you get into the race to see how little typing you can

0:23:55do to get useful work done.

0:23:56The second biggest leap, I think, is when you get to the point where you realize that

0:24:01tying your classes to the structure of your database tables is a terrible idea, not just

0:24:07like in terms of the field names, but structurally, period, because maybe this doesn't happen

0:24:11in small projects or projects with a single developer, but in large projects in big companies

0:24:16that evolve over many, many years. Inevitably, the structure of your database has almost

0:24:20no relation to the way you want your application to work. Like, not at all. Not on the table

0:24:24basis, not on anything, like it's just ridiculously divergent. And in some ways you could say,

0:24:28well, that's bad because things are diverging and they're getting all messed up. But sometimes

0:24:32it's necessary because the way your data is structured has to evolve in a direction for

0:24:36for performance or scaling reasons that has no bearing whatsoever

0:24:39on how you would like to deal with it in your application.

0:24:41So I think the next step in the sequence is to give yourself tools

0:24:45to get your data out of the database,

0:24:47but make sure you don't tie any of what you guys are calling model objects,

0:24:51although I hate that term.

0:24:53You don't tie any of the inner workings of your application

0:24:56to the structure or storage location

0:24:57or anything having to do with the stuff in the database.

0:25:00You still need some tool to make it so you don't have to type a million lines of code

0:25:02every time you want to get data out of the database

0:25:04and inflate your values into URL objects and data objects

0:25:08and do all that nice stuff.

0:25:09You still want to be able to not have to type

0:25:12that annoying boilerplate code,

0:25:14but you have to make another box on the graph and say,

0:25:17"Okay, this is my code that gets the crap

0:25:19"out of the database.

0:25:20"This is what's getting created from the data

0:25:22"in the database."

0:25:23And those two are pretty much entirely unrelated.

0:25:25So, and actually, this helps in development too,

0:25:27because you can mock up the stuff

0:25:28that you don't have in the database

0:25:30and other stuff, you can just have text files

0:25:31and other stuff you can just hard code stuff

0:25:33or 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.

0:25:39And sometimes even when you're doing a project yourself that can free you to say

0:25:43this is the correct table structure, which you know from like just doing database stuff

0:25:47you know which queries are gonna be efficient, what indexes you need, what things should be normalized and not.

0:25:51But when I'm in my application, it would be convenient if the structure was really like this.

0:25:55So 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

0:26:00of layer, which yes, is sometimes annoying to write, but it will save you later, some

0:26:04sort of layer that translates between the two in sometimes Byzantine ways.

0:26:10So that I think is a case where all the things you're talking about with reflection come

0:26:16in at every level of that, because the thing you make that makes it convenient for you

0:26:18to get stuff out of the database, that needs metadata.

0:26:20And then the next thing that you make that takes the data from the database and puts

0:26:24it into the things that your application is going to deal with, like your application's

0:26:28idealized view of the world that doesn't reflect the possible nastiness of the database because

0:26:33of weirdness, that needs some metadata to do that thing because you don't want to write that code

0:26:38up all by yourself. And then finally your application and your top-level thing gets to deal

0:26:42with objects that are magically delicious, that are just like, "Wow, this is so convenient. This

0:26:46is exactly what I needed for my application." It's your idealized view of the world. Wouldn't it be

0:26:52great if we just had three objects and they did this and you're like this? It's so hard to do that

0:26:56when you're an experienced programmer, because you think,

0:26:58"But I can't, that object can't exist to do that,

0:27:00because I know that's going to be on these two tables,

0:27:02and this information is from a third table."

0:27:04And so you end up making things that are tied to your database table.

0:27:08So that's more or less the path I've walked on this topic

0:27:13in Perl and in other languages.

0:27:15And some people, they call it anti-ORM backlash,

0:27:19because the ORM is the active record phase,

0:27:21and you get to that phase and you realize you're kind of in a dead end

0:27:23and you've done a terrible thing.

0:27:25but you're not really. You've created something that's useful, but you need something else as

0:27:31well. So everything that you've done is helping you move forward. There's just another place where

0:27:39you can also move forward. That was a lot of stuff. Yeah, I'll just let that settle in.

0:27:47I think you're right, though, that there's always

0:27:51this kind of battle between the objects that

0:27:56are fully abstracted from the data and the messiness

0:27:59or the structure of the database.

0:28:02One of the things that I think Core Data does a little bit

0:28:07badly for my taste is that it's too much on that object side

0:28:11where Core Data, even though it is based on a database storage

0:28:16and in many ways behaves like a database.

0:28:19In many ways it doesn't let you treat it like a database.

0:28:23And so you're kind of like, there's a whole class of operations

0:28:28that are very easy to do in a database.

0:28:31Things like a lot of things involving multiple records or batches or ranges or things like that.

0:28:35Things that core data either can't do very well or can't do at all.

0:28:39Yeah, it's trying to give you the idealized object version,

0:28:42but not letting you say anything about the database.

0:28:45It's like, "You don't worry about the database.

0:28:47You just tell us how you want the idealized view of the world in your application, and

0:28:50we'll just persist that."

0:28:52And you're like, "Really, I would like to have some influence over that process, because

0:28:56I have some ideas that you may find interesting."

0:28:58Right, exactly.

0:29:00And a lot of times, it's also necessary for performance.

0:29:04When you have an app that has a ton of data or that has maybe one table or one object

0:29:11type that has a lot of entries and they're all very small or something, and you want

0:29:14to do some kind of batch, like that kind of thing.

0:29:16Yeah, because you structure your data so—because you know the seven queries that your application

0:29:21is going to run most of the time, and you know what will make those queries fast and

0:29:24what will not make them fast.

0:29:25And Core Data, as far as I'm aware, gives you no way to influence the way it stores

0:29:30your stuff.

0:29:31You just make your convenient object graph, and you have to either guess or intuit or

0:29:35understand enough about Core Data's implementation of how it's going to lay that out and have

0:29:38to know what operations does Core Data make available, and what queries will that translate

0:29:42into, and will those be efficient?

0:29:43And that's like, you would rather just,

0:29:45you know, look, I know these are gonna,

0:29:46like some app, I bet applications probably just run like,

0:29:49you know, three possibly performance critical queries

0:29:51all the time.

0:29:52And you just say, look, core data, just do this.

0:29:56This is all I want.

0:29:57Everything else, I don't care what you do,

0:29:57but these are the three essential queries.

0:29:59And it's like, nope, I will structure your stuff for you.

0:30:01You don't worry about it.

0:30:02So like for small applications, that's fine,

0:30:04but anyone's done a web application.

0:30:06That's not like they're taking you to core data

0:30:07with web applications, but at a certain point,

0:30:10native applications start, they're not web scale,

0:30:13but the timing is much more critical and the devices are slower.

0:30:17So at a certain point, even a native application, you would like to have

0:30:21that kind of influence, which is why, Marco, you keep coming back to

0:30:25doing your own thing with raw SQLite, because then you have control over that.

0:30:29Exactly, because you have the SQLite on one side, which is

0:30:33SQLite, however you say it, I'm going to pronounce it every different way during the show.

0:30:37Don't let me bully you into my way of saying it. You say it however you want.

0:30:41something like SQLite.

0:30:43Yeah, I don't know what the official one is either.

0:30:45I say it the way I say it.

0:30:47Anyway, SQLite, we're going to say it every way.

0:30:49Alright, that thing, you have that

0:30:51on one side and that

0:30:53doesn't know anything about objects.

0:30:55About your objects and your code. Like it's totally

0:30:57just raw. There's no

0:30:59attempt to even

0:31:01to even do anything higher level

0:31:03than just database rows and that's

0:31:05it.

0:31:07Then on the other end you have core data, which is

0:31:09all about the objects and their mappings,

0:31:11and it doesn't expose anything about the database,

0:31:16and pretends like the database isn't there,

0:31:17to you, the user of it.

0:31:19And so my thing is kind of in the middle.

0:31:23And I actually do intend to open source this.

0:31:27I'm writing with the intention of open sourcing it,

0:31:29and writing it to be a standalone piece so it can be.

0:31:32But, oh, who knows when I'll get to that.

0:31:35I do intend to do that, maybe later this fall.

0:31:38But, you know, my thing, I want to be in the middle of that continuum because I feel like

0:31:46there isn't, there aren't enough choices there. And what's there, a lot of, what's there is

0:31:50basically a whole bunch of people like me making the things for themselves to vary,

0:31:55with varying degrees of success, varying degrees of people using it and reporting bugs, and

0:31:59varying degrees of functionality. And it's a lot like to-do apps. Like, if you're the

0:32:04the kind of person who can make one of these model layers

0:32:07or something like this.

0:32:09The chances that you're going to be happy enough

0:32:11with somebody else's to want to just use theirs instead

0:32:14of making your own is pretty low.

0:32:17And so for me, I'm doing my own thing

0:32:21like I usually do, which is sometimes good, sometimes bad.

0:32:27And so yeah, I'm making this thing

0:32:30between SQLite and Core Data.

0:32:33and I'm going to use it, and we'll see what happens, I guess.

0:32:37I think in native applications, again, not that they're small, small, but you're not

0:32:43writing a system for a product that's going to have seven incarnations.

0:32:51If you are making, let me think of something like this, not Gmail, not LinkedIn, maybe

0:32:57Facebook, some sort of big giant web service used by millions of people that has 10 different

0:33:02ways to interface with it, even just within their own company.

0:33:06That's where you really want to have your data access layer, and then above that have

0:33:11your object layer that gives you the idealized representation, and then have a whole bunch

0:33:16of other people in the company or whatever writing business logic, writing automation

0:33:20things, writing stuff.

0:33:21And all they ever use is the idealized view of the product, which has an ever-changing

0:33:29relationship with how things are actually stored or used so that you're isolating the whole rest of the people,

0:33:34you know, I just talked about this line between the people who are writing the thing and people who are using the thing.

0:33:37Individual programmers shouldn't see that line, but if you're trying to scale up a company,

0:33:42it's a good idea to have people building at various layers, and you want everyone who's just writing,

0:33:47you 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

0:33:52or the people who write the native app.

0:33:53You want all of those people to be using an interface that has almost no relation to the implementation if you could possibly help it

0:34:00And then another set of people dealing with

0:34:03How 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

0:34:09They use different data stores. They're gonna rearrange stuff. They're gonna do normalize tables. They're gonna rename things

0:34:13They're gonna do different versions of tables and up and you know, and you don't want anyone else to see that

0:34:17But when you're just doing one native iOS application, maybe with a web service or something

0:34:21especially if you're using a different language for it, the web part of it, it's probably

0:34:26not critical that you make this kind of enterprise-y distinction.

0:34:29I just offered it up as like the next evolution of, so you've gone and done yourself an active

0:34:36writer record type thing which queries the database and gets a structure and builds all

0:34:39your classes on the fly according to some convention with a pluralizer and all this

0:34:42other stuff, and you're still sad.

0:34:44Maybe it's because you actually want that next thing.

0:34:46Awesome.

0:34:47Well, why don't you tell us about something that's pretty awesome, and then I want to

0:34:51speak in favor of Core Data briefly, then we can give up on this probably extremely

0:34:55boring topic.

0:34:56All right. How are you hanging there, Merlin? You're almost there. All right. This week,

0:35:02we are sponsored once again by Hover. Hover is high quality, no hassle domain registration.

0:35:10So they believe that everyone should be able to take control of their online identity,

0:35:15have your own domain name, and they make it easy to do so. They offer .NET, Co, Com, TV,

0:35:21tons of country code TLDs. There's all these TLDs out there now. They keep making new ones.

0:35:28Hover keeps adding them. It's great. So they take all the hassle and friction out of owning

0:35:34and managing domain names. Now, I bet everyone listening to this show is probably nerdy enough

0:35:39to have bought a domain name in the past. And if you bought a domain name anywhere else,

0:35:43I imagine you were not that happy with the experience because I've bought them in a lot

0:35:48of places and they're pretty rough.

0:35:53Most of the places are pretty rough.

0:35:55Hover is to me like a breath of fresh air.

0:35:57They are just so easy, they're honest.

0:36:00They don't try to upsell you with all sorts

0:36:03of weird sleazy stuff.

0:36:04There's no check box on checkout that's like,

0:36:07"Don't not stop sending me the newsletter

0:36:09"that doesn't sell my privacy for $10 a month."

0:36:11They don't try to mislead you,

0:36:13they don't try to get all sleazy

0:36:15and get more money out of you.

0:36:16money out of you. It's just honest, direct, straightforward domain sales. And their management

0:36:21system is very good too. It's well designed, there's easy access to all the features they

0:36:27offer and they do offer quite a lot. And in fact, they actually just added something new.

0:36:31They added Google Apps for Business. You can add Google Apps for Business to any domain

0:36:36from Hover, new or old domains. They even give you a free 30-day trial on that and then

0:36:42prices start at $6 a month per user.

0:36:46It's really great.

0:36:46So anyway, go to hover.com/ATP.

0:36:50You can use promo code ATP to get 10% off.

0:36:54And you should, of course, you should do that.

0:36:55I mean, I use Dan's promo codes forever.

0:36:57You can use ours.

0:36:58So use promo code ATP at hover.com to get 10% off.

0:37:03Any domain purchase and any service purchase.

0:37:06Hover's a great company, really.

0:37:07They even have like, they have no-hold phone service.

0:37:12you just call them Monday through Friday 8 a.m. to 8 p.m. Eastern

0:37:15and you'll be speaking to a live person. They will just pick up the phone and

0:37:18there's a person. It's not a bot.

0:37:20You don't have to say "representative,"

0:37:22"track a package," none of that stuff. You know, it's "I hate them."

0:37:25All those things are terrible. They know that too. They don't do it. They give you

0:37:28only a human. It's just great. So go to hover.com/ATP

0:37:33to get your next domain. Use promo code ATP for 10% off. Thanks a lot to Hover

0:37:37for sponsoring the show.

0:37:40So, to briefly speak in favor of Core Data, so my really crummy, although soon to be not

0:37:46crummy since it's all straight UI kit, so it's going to look great in iOS 7, but my

0:37:50really crummy iPhone app, which I wrote basically as an exercise to teach myself how to write

0:37:55an iPhone app and also...

0:37:56Yeah, you can plug it.

0:37:57That's allowed.

0:37:58Well, it's called FastText and it's embarrassing on iOS 6, but it's going to be brilliant on

0:38:02iOS 7 because I'm going to change virtually nothing and it will all just look magical

0:38:07and pretty.

0:38:08But in any case, the app doesn't do a whole heck of a lot.

0:38:13The point is to do one thing really quickly and that's send a canned text message.

0:38:17So the idea is you pop open the app, you say who you want to send it to, which is presumably

0:38:21a list of people that you've already set up, what message you'd want to send, or maybe

0:38:24I got that backwards, I think I did because I haven't used it in a couple days.

0:38:28But anyway, the point is you pick who, you pick what, and then you say go.

0:38:32And that actually uses core data.

0:38:34That is actually a really really great use of core data because candidly it's very very simple

0:38:41It's two entities

0:38:42It's a total of like ten attributes between the two entities and it worked really well

0:38:48And one of the things I liked so much about it

0:38:50Was that when I decided to add support for sending messages to email addresses as well as just phone numbers

0:38:58I had to add a

0:39:01column if you will or an attribute to say well is this thing an email address or a number and

0:39:07Obviously I could have parsed that out whatever the point

0:39:10I'm driving at though is that I had to do a core data migration and

0:39:12To be honest for me because this was such a simple use case it actually worked really really well

0:39:18It was really nice, and I said in Xcode. Hey, I'm gonna make a new version of this model

0:39:23Here's what's different about it

0:39:25Then I wrote a couple of lines of code in my app delegate to handle it and everything just happened

0:39:31magically and I've actually had no real issues with core data, but to be fair

0:39:36This is an extremely simple use case and to me. I think that's what's great

0:39:40This is core data's bread and butter is to do something really simple

0:39:45All I want was a way in which I can persist a very small object graph and that's like out of the book

0:39:51Which I would look up if the developer portal was up. It's like out of the book

0:39:55Exactly 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

0:40:00big scary abstraction that you don't want to just relinquish your life to, so to speak.

0:40:05But for me it worked out really, really well.

0:40:07You could have just used property lists.

0:40:09I mean, not just the property list back end of Core Data, but like literal property lists.

0:40:14Because like the volume of data.

0:40:15You basically made like the sample application they would have you make.

0:40:18Like if you're doing like the Core Data demo.

0:40:20What are you saying, man?

0:40:21No, I mean like the Core Data part.

0:40:22Like you said, like two entities and like not a lot of them.

0:40:26Because I mean, I don't know how many text messages like your application store is a

0:40:29but presumably people are not going to store 10,000 canned text messages because you've

0:40:33defeated the purpose of the application, because you're supposed to find it quickly.

0:40:36So, like, yeah, you could have gotten away with a property list.

0:40:38And in fact, that's what a lot of people did for a long time.

0:40:42I mean, at a certain point it becomes ridiculous.

0:40:45You're absolutely right.

0:40:46And a lot of fast text, a lot of the purpose of it was in a series of engineering lessons

0:40:52and exercises for myself.

0:40:54And part of the reason I used Core Data was just, I want to learn Core Data.

0:40:57I want to see what it's all about.

0:40:58So when everyone complains and moans about it, I can say, "Oh, yeah, you know, I understand

0:41:01why you're saying that."

0:41:03And I could complain and moan with the next guy, but for me, it actually worked out really

0:41:07nicely.

0:41:08Yeah, no, you should have plugged your program sooner, because you kept mentioning your program,

0:41:11and I never bothered to look up what it was.

0:41:12And I looked up what it was, like, I don't know, maybe you tweeted something about it

0:41:15this week, and I'm like, "Oh, that's a useful program."

0:41:16You should, you know, I don't know if there's a hundred other programs out there that do

0:41:20that, and obviously I don't send text messages to people, so that's why I'm not in that field.

0:41:24But that's exactly, I think that would be, is this a common category of program, the

0:41:30CAN text message sender?

0:41:31Well, I don't know if it's common, but it was actually, it's funny hearing Marco talk

0:41:36about a lot of the things that he's talked about, both in Build and Analyze, and here.

0:41:40It was a very funny exercise, an interesting exercise for me, because I'd love to be able

0:41:45to just magically invent the next Instapaper and be able to do something independently

0:41:51and take that whole time.

0:41:52Right, and not just have any competition.

0:41:54Exactly, but what I'm driving at is it'd be cool to not, to work for myself, but I feel

0:42:00like I need that magical idea.

0:42:02And so, flashback to I think it was iOS 4, when I want to say it's MF message composed

0:42:07view controller or whatever it is, basically they added the ability for an app to send

0:42:12text messages.

0:42:13And so, I found that out at that WWDC, which I guess was 2011, is that right?

0:42:18It doesn't matter.

0:42:19I found out at that WWDC that, oh, they're going to do this, and I was like, I know what

0:42:22I can do with that.

0:42:23And so I had to figure out how to build and ship the app in order to, I wanted to be in

0:42:31on day one of iOS 4.

0:42:33And so the reason I think it's so funny is because in the smallest littlest way, this

0:42:39was a Casey sized exercise in doing the sorts of things that many of my peers do for a living.

0:42:47In that I had an idea and I needed to execute and I needed to execute by a certain date.

0:42:52I'm like what say Underscore did with Feed Wrangler.

0:42:55It was just a very funny thing and that's why it was really rewarding because I was

0:42:59able to get this little appropriately sized view of the world that a lot of my good friends

0:43:05and peers have.

0:43:06I know that was kind of a side note, but I don't know.

0:43:10It's fun.

0:43:11It's a very simple app, but it's very useful and I use it all the time.

0:43:15So if you didn't write that app, if you went into the App Store, have you looked at the

0:43:19competitors?

0:43:20Are there other applications that do this?

0:43:21Oh, there certainly are.

0:43:22one that most people use that I would know about if I was into texting?

0:43:25I don't know if there's a well-known one.

0:43:27I mean, it's because…

0:43:28Like, there's no Instapaper of the market.

0:43:30If there is, I don't know it, to be honest.

0:43:33And I've never taken…

0:43:34The app was not a money-making venture.

0:43:36In fact, I've probably put a couple hundred dollars into it that I haven't gotten out.

0:43:40I mean, I've gotten checks from Apple for it, but I've spent more between the $100

0:43:47annual developer account and paying 40 bucks or whatever it was for Opacity Express to

0:43:53hand draw the world's worst icon.

0:43:56I like it.

0:43:58I was pretty proud of it, to be honest, but if I'm honest with myself, it's pretty rough.

0:44:02I think I saw the icon, and if it's what I'm thinking of, it's no good.

0:44:07See?

0:44:08Thank you for not letting me down, John.

0:44:10No, but you know.

0:44:12That actually is what, speaking of applications, that is a lot of the time what separates the

0:44:17application that someone makes and barely makes back its money in developer fees and

0:44:22the one that does, is putting in a little bit of extra money for a designer to do your

0:44:28icon and getting the UI to look nicer.

0:44:33Window dressing, marketing type, not marketing in terms of paying money to advertise or whatever,

0:44:37but when someone sees your page, what is the impression they get?

0:44:40Apple Hammer is like crazy in WWDC. The first impression someone gets when they glance at

0:44:44your application has no reflection on the functionality of your application because

0:44:49if there are a lot of these applications that send canned text messages, what's going to

0:44:52differentiate them is the one that makes someone feel good to have it on their home screen,

0:44:57feel good to launch it and use it, and every time they do, they feel good about that experience.

0:45:01That's why iOS 7 is such an opportunity because all of a sudden these applications that people

0:45:04used to feel good about using, now they will not feel as good when they're using iOS 7

0:45:08because those ones will look old and ugly and strange

0:45:12or whatever.

0:45:13So that could have been all that separated you from perhaps not

0:45:16Instapaper-level success, but at the very least,

0:45:21being in the black instead of the red on Lifetime

0:45:23for this application is just a nicer icon, a little bit nicer

0:45:26UI.

0:45:27Oh, you're absolutely right.

0:45:29And some screenshots with puppies in them or something.

0:45:33No, you're absolutely right.

0:45:34And that's the thing is, again, this was more-- FastX

0:45:38written in order for me to be able to look myself in the mirror and say, "You know what?

0:45:41You did get something in the App Store."

0:45:43And even if everyone around you thinks it's a flaming turd, at least you can say, "You

0:45:48know what?

0:45:49One way or another, that's mine, and I did that."

0:45:50And I wrote it at a time where I barely could write "Hello, world!" in Objective-C. And that's

0:45:55not to say it's not stable and whatnot and blah, blah, blah.

0:45:58What I'm driving at, though, is that it was a really great exercise to teach myself this

0:46:02entire pipeline.

0:46:04And I'm really glad I did it.

0:46:05And I keep it there, to be honest, if I'm really candid, I keep it there more as kind

0:46:11of a trophy for myself.

0:46:14Look at what I was able to do.

0:46:16And everyone else who may have seen it and is listening may or may not be laughing about

0:46:20all that, but I'm okay with that because I'm still proud of it, even though it looks like

0:46:24crap in iOS 6.

0:46:25But wait for iOS 7.

0:46:27It's going to be great.

0:46:28I'm watching it just climb the ranks tonight as all 204 live listeners go out and buy it.

0:46:34We were going to have a Casey self-esteem sale where, "Don't buy it to use it, buy

0:46:40it to acknowledge Casey's trophy for--" I mean, hey, it's farther than I got with

0:46:46my iOS idea when they announced the SDK, which was a joke tip calculator, which I wrote about

0:46:51half of, and then I said, "You know what?"

0:46:53Wait, what's the joke?

0:46:54What?

0:46:55I've said this before on other projects.

0:46:56It was a tip calculator, which I knew there would be a bazillion of, because it's like

0:47:00five minutes to write, and sure enough, there were a bazillion of them.

0:47:04And the name of the application is "It Does Other Things," which is probably a copyright

0:47:07infringement on Seinfeld, but that's the joke.

0:47:10Yeah, I don't know.

0:47:11Have you seen that episode?

0:47:12Have you heard of Seinfeld's television show?

0:47:13Wait, the app is called "It Does Other Things"?

0:47:15Yes.

0:47:16Have you ever seen Seinfeld?

0:47:17Yeah, I think I've seen all of them, but it was a long time ago.

0:47:19Do you not know that line from a webisode?

0:47:21I forget what the context was.

0:47:23Oh, well.

0:47:25Anyway, you can Google for "It Does Other Things Seinfeld" and find out.

0:47:28It's not that funny, which is another reason why the application does not appear on the

0:47:31store.

0:47:32I bailed out because I saw the writing on the wall.

0:47:36But I would have liked to have just gotten

0:47:37through the process.

0:47:38The reason I don't go through the process

0:47:39is because, say, I get a working application that

0:47:42does what I want it to do.

0:47:44Then I need at least double that amount of time

0:47:47to work on the icon in the UI.

0:47:49Because otherwise I'll just obsess over it.

0:47:51Be like, no, I can't ship this.

0:47:53It's too boring looking.

0:47:54And then by that point, 8,000 other typical calculators

0:47:56have come out, and it's too late.

0:47:58I would love to see you ship an app of anything.

0:48:02I mean, I don't care what it did or didn't do.

0:48:03I would just love to see what you consider shippable.

0:48:07Because honestly, I'd be shocked if you ever shipped something like that in public.

0:48:12And I guess your reviews are even larger scale than most people's ads.

0:48:16Yeah, they're much larger scale receptacles for feedback, let's say.

0:48:23People have opinions, and they offer them on writing.

0:48:26Writing is much worse than putting out an ad.

0:48:28I mean, look at all the open source code I put out.

0:48:31Most of the pro code that's up on CPAN for me is just terrible, because it's been written

0:48:34years and years ago.

0:48:35And I leave it up there because, well, look, maybe someone's finding it useful or whatever.

0:48:39But it's kind of the difficult thing about working in a regular job.

0:48:45You try to do open source stuff so you have something that you can show as, "Here's an

0:48:49example of my code."

0:48:50But all of my open source stuff at this point, I'd be like, "Don't look at that."

0:48:54The best thing I could do if everyone on Job Interview would be like, "Here's some sample

0:48:57code from my open source projects, and let me tell you what's wrong with it as a demonstration

0:49:01of how I've grown since I wrote this thing.

0:49:04That's actually, that would be surprisingly effective in an interview, I think.

0:49:08Yeah, but you want to show them, it's like, here's my shipping app.

0:49:10Like, that's what, you know, that's when you get a job on Apple, you're like, look, I made

0:49:12this app, and then I'm awesome, and the app is awesome, hire me, and then I'll hire you,

0:49:16you know.

0:49:17That's the easiest way in the door.

0:49:19So to build on the thought of you shipping something that people can see, since you're

0:49:25a celebrity in the little bubble in which we live, does that, if you had a really good

0:49:29idea, do you think that would prevent you or scare you off from – actually, I guess

0:49:33I could ask both of you, but – I'm always looking for a good idea for an iOS app. I

0:49:37have been since day one. The tip calculator, you know, like, that's like me looking for

0:49:40an idea. My brother is also constantly trying to look for an idea. He's trying to look

0:49:45for a get-rich-quick idea, and so am I, to be fair. We've talked to a million-dollar

0:49:50homepage before, right, haven't we? Oh, yeah. Well, not on this show, I don't think,

0:49:54but – Yeah, maybe in real life. But anyway, that's the ultimate idea, where you have

0:49:58no money at risk, no time at risk, really easy to do, makes money, makes everybody happy

0:50:03who's involved with the project is amusing to people who are not involved with the project.

0:50:07That's pretty much the best example of that type of project I've ever seen in my life.

0:50:11And if there's an iOS app equivalent yet, I haven't found one. There's plenty of ways

0:50:15to make money in the app store that are scummy and scammy and make people sad, but that's

0:50:19not what we're looking for. And of course, you can make money like the old-fashioned

0:50:22way by making a good app, which is really hard.

0:50:27If I ever had an idea for a Mac app even, like an iOS or a Mac app, if I had an idea

0:50:31for an app that didn't exist, that I would like, that I thought I could write, I would

0:50:35do it.

0:50:36But that stuff never comes together.

0:50:37And, you know, it's always like two out of three or one out of three.

0:50:41But that's not directly answering my question, which is, let's say you had this great idea

0:50:44and you felt at least moderately confident that you could do at least a moderately passable

0:50:49job.

0:50:50Would the fact that you're Mr. Hypercritical scare you away from losing it?

0:50:55No, not at all.

0:50:56I mean if anything that should provide like a fountain of infinite ideas because

0:51:01You can look at any app you use any app you ever need to use and you can say oh well

0:51:06If I did it it would be different in these ways

0:51:09Yeah, but like but do I want to do it do I have to have do I think I would be capable of actually doing

0:51:13A 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

0:51:17a real application it's a big

0:51:19Commitment you're right, so I really it would it would really need to be like something like oh

0:51:22I've got to make this app like that's it would have to be like that not just simply

0:51:26"Oh, I think I can make a better one of those," because it just takes so much time.

0:51:31Any notoriety I might have would encourage me, not discourage me, because all that would

0:51:35translate to is, "Look, for every tiny point of internet notoriety I have, that is one

0:51:41extra point on sales possibilities."

0:51:45It's not fair, but that's the way it works.

0:51:48If people know who you are to begin with, then they'll know about your application,

0:51:52at least.

0:51:53You have such an up with awareness and everything.

0:51:54Oh, yeah, if you got it, use it.

0:51:56Yeah, so that, but that, I mean, that wouldn't be the reason I would be doing it, but like,

0:51:59it just, it would have to be a fire under my butt where like, look, I need, like it

0:52:02was for you with Bugshot, you're like, I just need this application to exist. And you're

0:52:06at the point where you can rattle that off in a week, like, I'm not at that point, so

0:52:10it has to be real, I have to just be like, look, I cannot sleep until I write this application

0:52:14because my ramp up time would be significant starting from zero, right?

0:52:17Even that, though, like, yeah, I mean, for me, it was like, I'm an experienced iOS developer,

0:52:21so it didn't take me that long.

0:52:22I already knew how to do all this stuff.

0:52:24The icon even accidentally made itself.

0:52:26And then even that app, I said,

0:52:29I will spend a couple of days doing this app.

0:52:32That's all I can really justify spending on it,

0:52:34'cause it's gonna make 20 bucks a day

0:52:36for the next two years.

0:52:37So I can't justify doing a whole lot more on this app,

0:52:41just a few days of work so I can get back to my other stuff.

0:52:44And a few days became like 10 days.

0:52:48It was like seven days to build version one,

0:52:50And then I got a break while it was being approved.

0:52:53And then within a few days of it being released,

0:52:55I was working on 1.1 to fix all the bugs

0:52:58that everyone found, and then to add

0:52:59a couple of minor enhancements.

0:53:01And that took a couple more days.

0:53:02So all in, this is almost two weeks solid for this app.

0:53:07And I should clarify for Sam the Geek in the chat room,

0:53:12yeah, it's going to make $20 a day maybe

0:53:15for the next couple of months.

0:53:17After that, it might go down further to--

0:53:18Oh, yeah.

0:53:19No, he's absolutely right.

0:53:19Absolutely. This is not a joke and I probably shouldn't share this publicly, but whatever.

0:53:25I am genuinely excited when I get an app banning email and the number on it is anything more

0:53:29than zero. That's like awesome. I just sold something to someone. That's really exciting.

0:53:36So, 20 bucks a day is nothing to shake your fist at. I know you said that jokingly, but

0:53:39that is nothing to shake your fist at.

0:53:40No, that's not a joke. I mean, like when I made nursing clock last year, the breastfeeding

0:53:46timer. I released that and even that took a little bit longer than I thought it would.

0:53:51Even the nap that had almost no effort into it at all. That took like a few days to really

0:53:55polish it and make it releasable in any shape. And even that, over its entire life, it made

0:54:00I think $70. I mean it wasn't a whole lot. And I even ended up pulling it down after

0:54:08I think about six months or so because there was a, somebody had tipped me off, there was

0:54:13a patent troll going around suing or threatening to sue people who made childcare related apps

0:54:20and even though mine was not, wouldn't have applied, or the patent wouldn't have applied,

0:54:26we all know that doesn't really matter. And so I just, I'm like, you know what, this app

0:54:30has made like $70 in six months, it's not even worth the risk of having a patent troll

0:54:35come after me. So I just pulled it down.

0:54:38- Patents fostering innovation.

0:54:39Exactly. We should get to that actually. But first, let me tell you about our second sponsor.

0:54:43Our second sponsor this week is a new sponsor, but you might have heard of them recently

0:54:47on other awesome shows and blogs. They are 23andMe. So, 23andMe, it's a pretty cool service.

0:54:54It's a little hard to explain, but here's the gist of it. They are a DNA profiling service.

0:55:04And so, here's what you do.

0:55:06You give them a, basically, they send you a kit,

0:55:11you give them a saliva sample,

0:55:13and you don't have to poke your arm or anything,

0:55:15there's no blood involved.

0:55:16You give them a saliva sample,

0:55:17you send it back and they provide a return package,

0:55:19the lab analyzes it, and then it gives you a full report

0:55:23about stuff about you.

0:55:26So, here's the gist of it.

0:55:28They gave you the tools to better understand

0:55:30how your genes may impact your health.

0:55:32So this helps you and your doctor find health areas to keep an eye on.

0:55:37They have over 240 personalized health, trait, and ancestry reports.

0:55:42And they can help you understand your genetics.

0:55:44So they give you ancestry information.

0:55:46You can discover your global origin.

0:55:48You can find, like, if you have any celebrity relatives, they will give you a list of celebrities

0:55:53that are distant relatives of yours.

0:55:54You can also find other living relatives through their analysis.

0:56:00They have over a quarter million members.

0:56:02So this makes it the largest DNA ancestry service in the world.

0:56:05And so the chances of them finding something cool about you are pretty good.

0:56:09So anyway, it includes a few fun points to tell you how closely related you are to Neanderthals.

0:56:19They even can tell why you may not like cilantro.

0:56:22There's a gene for that.

0:56:24They can tell you how quickly you metabolize coffee, which of course is cool for me to

0:56:29know.

0:56:31So anyway, you can order your 23andMe DNA kit today for just $99 at 23andme.com/ATP.

0:56:39That's 23andme, the number 23, and then the words andme.com/ATP.

0:56:46Check it out.

0:56:47It's pretty cool and just a really great way for, you know, just to take a look at your

0:56:52DNA and learn some cool stuff about yourself.

0:56:55So thanks a lot to 23andMe for sponsoring the show.

0:56:59What is the avocado—asparagus pea smell gene?

0:57:03Is that a genetic thing, or is that not genetic?

0:57:05I think that's everybody.

0:57:06No.

0:57:07I mean, it's just—

0:57:08I think you'd have to eat a lot of asparagus.

0:57:10What I heard from third hand was that it was genetically related, and that the people with

0:57:16the gene made their pee smell, and they could smell it.

0:57:20And people without the gene, their pee did not smell, and they couldn't smell it, but

0:57:24other people smell like pee.

0:57:25I thought it was that the pee always smells, but only some people can smell it.

0:57:31I don't know.

0:57:32I know nothing about it.

0:57:33See, this is terrible.

0:57:34Oh, here we go.

0:57:35Here we go.

0:57:3623andme.com/health/asparagusmetabolitedetection.

0:57:37Of course they would know this.

0:57:3923andme has got it covered, and it is genetic, apparently.

0:57:46That's awesome.

0:57:47Erin is a biology teacher.

0:57:48I could have asked her if she was home at the moment, but she is not.

0:57:52Oh, good thing 23andMe didn't let us down.

0:57:55Awesome.

0:57:56Anyway, thanks for sponsoring.

0:57:58All right, so what else are we talking about?

0:58:01Do you want to talk about Ask Patents at all?

0:58:04I do.

0:58:05John, go for it.

0:58:07Yeah, so this was a Stack Exchange site that was made months and months ago, wasn't it?

0:58:12Like maybe last year?

0:58:13Yeah, a while ago.

0:58:14A long time ago.

0:58:15It was the brainchild of Joel Spolsky and the Stack Exchange guys in cooperation with

0:58:21the US patent office, I believe, even from the get-go.

0:58:24It's a Stack Exchange site, like StackOverflow or whatever,

0:58:27you ask questions or whatever.

0:58:28But this one is meant to collaboratively find

0:58:31prior art for patents.

0:58:33So someone will post a patent, and then other people

0:58:35will try to look at prior art for it and post it as the answer.

0:58:38So basically, the implied question to all of them

0:58:40is, here's a patent.

0:58:41Is there some prior art?

0:58:42And then anyone can post an answer, like, oh, here's

0:58:45some prior art for this, or whatever.

0:58:46And the goal of the site was to be like, OK, well, we all

0:58:50know these patents are stupid and trying to patent things that shouldn't be patentable,

0:58:54but it's really difficult, apparently, for the US Patent Office to do the research necessary

0:58:58to find the prior art. Even though, when we look at it, can you just call up a graphics

0:59:04programmer and ask them and they'll tell you the eight times? Anyway. And so that's how

0:59:09this was supposed to work.

0:59:10And finally, I think this was their very first confirmed case where a patent was posted,

0:59:16found an answer and the patent was invalidated.

0:59:19And in the invalidation of the patent by the person in the US Patent Office, they cited

0:59:23directly this answer on this site.

0:59:25And Joel did the answer, and Joel said it took him like 10 minutes of Googling to find

0:59:28prior-- because again, it's not hard to find prior art for these things, because the patents

0:59:31are awful, right?

0:59:32So Joel wrote a story called "Victory Lap for Ask Patents," describing the sequence

0:59:37events and saying basically, look, this took me 10 minutes of Googling.

0:59:40If you hate patents and you're a software developer or whatever, come onto our site,

0:59:44a patent that you think is stupid, Google for a prior art, paste it in there, and wait

0:59:49for the incredibly slow wheels of government to turn, and six months later, maybe that

0:59:54patent will get invalid.

0:59:55And of course, this is a Microsoft patent and they're appealing, so who knows how it

0:59:58will end up coming out.

0:59:59But the interesting bit, this that I pasted into the show notes, is that Joel says that

1:00:04his dream is that companies will hear about this site and use it offensively against other

1:00:09companies.

1:00:10Because if like Apple or Google or whatever dedicates like one or two people to just go

1:00:13on that site and look for patents that Google is applying for and spend 10 minutes to go

1:00:19find prior art for them, that it will become like—you know, so patents are sort of defensive

1:00:23where they patent—every company patents everything they can because it's good to

1:00:25have a big patent portfolio.

1:00:26But if each company also had an offensive wing, all they did was watch their competitors

1:00:30and watch for the super-dumb patents that they apply for and then invalidate them all

1:00:34by finding prior art, that would be a good sort of mutually assured destruction scenario

1:00:39where large companies prevent each other from having terrible patents.

1:00:44Of course, this is not the actual solution.

1:00:45The actual solution would be, maybe the US Patent Office could do this work, because

1:00:49it doesn't seem like it's that hard.

1:00:50It takes 10 minutes of googling.

1:00:51And of course, my position is that no patent should exist ever for anything.

1:00:55But anyway, every little bit counts.

1:00:58So I'm excited that at least one patent has been, at least, if not permanently thwarted,

1:01:03then possibly delayed on its trip to being a super dumb patent.

1:01:09So good job Joel and the Stack Exchange guys.

1:01:11Yeah, it's so cool this thing that Ask Patents even exists and that the USPTO kind of encouraged

1:01:18it or at least is being friendly with it.

1:01:22There is of course, you know, there's that great question of, you know, Joel is a programmer

1:01:28and he could look at this stuff from this Microsoft patent that he cited and, you know,

1:01:32any others that you look on there and he said like, you know, he assumed going into this

1:01:36that it would be pretty hard to read patents

1:01:39and to figure out what they are and to invalidate them,

1:01:41but in fact, once he started trying to do it,

1:01:43that it was easier than he expected.

1:01:45And that it only takes a few minutes to read a patent,

1:01:49and he linked to a post, maybe he linked to it too,

1:01:50about how to read a patent in 60 seconds.

1:01:53'Cause they all try to be very obfuscated

1:01:56to try to get granted and try to get past

1:01:59any potential conflicts or duplicates

1:02:01or to try to become more overreaching

1:02:04than they otherwise would have.

1:02:05Like, they go for obfuscation to attempt to confuse the patent examiners.

1:02:13So the problem is, you know, if one working programmer -- and granted, Joel is a good

1:02:18and knowledgeable programmer, but still, if one programmer can look at a patent application

1:02:23and kind of see through it that quickly, why doesn't the patent office -- why can't they

1:02:31do something similar?

1:02:32Why, like, if they can say, "Yeah, we can have patents on graphics programming techniques,"

1:02:38why can't they either have or contract with graphics programmers to look at any graphics-related

1:02:44patents?

1:02:45Like, that, it's just, I'm really glad that AskPatents exists, and obviously it needs

1:02:49to exist, but why it needs to exist is kind of a problem.

1:02:53Because it's a government agency, and they don't have infinite hiring money, you can't

1:02:57pay a graphics programmer or any of that.

1:02:59outsourcing the part that can't be done at scale because there's a limited number of

1:03:05patent employees. Those employees only know about patents and know nothing about the domain

1:03:10areas. And by the same token, Joel could not have written that ridiculous document that

1:03:17codifies the rejection of the patent. Joel could not have written that because that requires

1:03:22the lawyer-like expertise of the people in the patent office to know what form you have

1:03:26to do things and what is a valid rejection and what must you like. That's the skill that they're

1:03:31bringing to the table, you know, that to be able to navigate this legal, just like lawyers, like,

1:03:36you know, you may have an intuitive feel of, you know, what's right and wrong and how to prove

1:03:42things. But if you're not a lawyer, you don't know how to actually do it, right? So this is just

1:03:47finding people like, "Look, you find me the prior art, and then the US Patent Office says, 'We'll

1:03:50take it from here.' So you did that part of the work for us. We'll take that and probably spend

1:03:55ten times as much time doing this stupid legalese dance in this formal document structure to

1:04:00reject the patent and bring it through all this bureaucratic-- I mean, just try clicking

1:04:04through to that rejection.

1:04:05He's like-- he explains how to find the rejection.

1:04:07And it's like, the preliminary draft rejection finalized form.

1:04:11Like, try to read it.

1:04:12It just, you know, you cannot penetrate even the rejection of the patent, let alone the

1:04:17patent itself.

1:04:18And that "how to read a patent in 60 seconds" is good because it tells you, "Just ignore

1:04:20everything and go right to this section and look at these three things, and that's enough

1:04:23for you to get going."

1:04:25It's a broken, stupid bureaucratic system that doesn't work right.

1:04:30This does not make it better.

1:04:31This doesn't cure it.

1:04:32But if anything that stops crappy patents from getting granted is a good thing.

1:04:39This was just the community trying to make government better, maybe not against their

1:04:45will, but certainly like, "Look, we're here to help you in government saying, 'Okay,

1:04:48we will accept your help in this matter,'" and then it producing at least one actual

1:04:53result.

1:04:54Well, it's a brilliant idea if people are into it, but it seems to me that it's tough

1:05:00to get people into it.

1:05:01Said differently, here it is that the patent office is sort of kind of reaching out to

1:05:06the community and saying, "Hey, people who are experts in these things that patents are,

1:05:12go help us find this prior art."

1:05:13But the key is that we're experts.

1:05:16Joel is an expert, or at least you could easily argue as such.

1:05:20And I don't know how the patent office works internally, but I've got to imagine they don't

1:05:23have an expert for every darn field of patentable stuff under the sun.

1:05:29And so it strikes me as a brilliant idea, but I'm not sure that when I get bored on

1:05:35a weekday evening night, I'm going to sit there cruising for patents to shoot down.

1:05:38Well, I mean, but Joel's got the right idea.

1:05:40He says, like, who is actually sufficiently motivated to use this site?

1:05:45And who's sufficiently motivated are the companies who get patents, because they have a financial

1:05:49incentive to prevent—Apple has a financial incentive to make every single patent Google

1:05:54files be invalidated, right? And vice versa, Google has that same motiva—you know, so

1:05:59if you can get these big companies with tons of money to put even a few people on this,

1:06:03it's so easy to do, because you're going to be invalidating patents in a domain that you know

1:06:07about. Apple probably knows about the domains that Google's going to file patents in and vice

1:06:10versa, because they're both in the same industry. Get all these guys to, instead of spending all

1:06:14their energy patenting everything under the sun, take part of their energy, because now they

1:06:19Now suddenly they have an influence.

1:06:20It used to be you had no way to get your other guys' patents invalidated.

1:06:23You had to wait for them to be granted or rejected, and then you could try to invalidate

1:06:26them in court.

1:06:27Whereas now, if the patent office is like, "Look, we're willing to accept some help here.

1:06:32This patent has been applied for.

1:06:34Here's the application," and Apple goes out and finds prior art and heads it off of the

1:06:38past?

1:06:39I don't know if those companies are actually going to do that, but they are the ones who

1:06:42have both the motivation and the skill to do this.

1:06:46I think it would be a great idea because I hate all patents.

1:06:49Like I said, another thing that would cure this whole problem is just to eliminate the

1:06:52entire patent system and office and all the employees and all the legal framework and

1:06:56everything involved with it.

1:06:57That would also cure this problem and is the actual solution.

1:07:01That would actually promote innovation.

1:07:03People don't want to hear that.

1:07:04But anyway, you don't want to hear that, that's fine.

1:07:07We'll start with this.

1:07:08This would be fine too.

1:07:09John, both you and I, I believe, separately argued on our respective 5x5 podcast a couple

1:07:13of years ago.

1:07:14I think we both argued that basically the entire patent system should be abolished.

1:07:20Is that fairly accurate?

1:07:21Yep.

1:07:22Yep.

1:07:23Yeah.

1:07:24I mean, the fact that all this stuff is necessary is...

1:07:29And I think what bothers me about it, not to go too deep into whether the patent system

1:07:34should exist or not, because that would be a whole other show, but I think what bothers

1:07:38me so much about it is, like, this is...

1:07:41It's a problem that just cannot be solved well.

1:07:44Like it is just so, like, yeah, the patent office can't be expected to get everything

1:07:49right, but they get things wrong a lot.

1:07:53And the ramifications of that in the market are so incredibly destructive.

1:07:58I mean, it, like, whatever benefit patents are providing to people, I have to imagine

1:08:05there's an equal or greater amount of harm that they're causing, especially in the field

1:08:09of software.

1:08:11And it just seems like there's just no good solution to this.

1:08:14But I am very glad that ATHP patents is at least attempting to—it is improving it in

1:08:22one small way.

1:08:23Yeah, and my objection was less practical, more ideological.

1:08:26I don't think there's any reason you should have monopoly rights to an idea, period.

1:08:29Like, it's not as if like, you know, what if the patent office was perfect and never

1:08:33made a mistake?

1:08:34There's no such thing.

1:08:35There is no right—as far as I'm concerned, you get no right to a monopoly on an idea

1:08:41that you come up with, no matter how awesome that idea is, period, the end.

1:08:44And so if that's your position, that's my position, obviously there's no such thing

1:08:48as a patent office that works. It's an office that the only way it works is to not exist

1:08:53because it's enforcing a right that I don't think is a valid thing that you should, you know,

1:08:58you shouldn't get a monopoly on an idea. You shouldn't ever, the end.

1:09:01But, you know, there's a huge continuum down to the pragmatic concern of like, okay, I think you should,

1:09:05but it's impossible to do correctly, therefore it should be gone, all the way up to like,

1:09:08to like, "Oh, I think it should be gone for software because there's no such thing as

1:09:11a software patent because it's all math and everything's turned complete and blah, blah,

1:09:15blah."

1:09:16And business process patent shouldn't exist and a whole big range.

1:09:18When I talked about it on my show, I went to write for the jugular, which is like patents

1:09:23on drugs, which everyone thinks, "All right, you can get rid of all the other patents,

1:09:25but we need these because otherwise no one will ever do any research into how to cure

1:09:28disease."

1:09:29And I talked about it at length there.

1:09:30We should rehash it here.

1:09:32But anyway, patents are terrible.

1:09:34Don't let your kids get them.

1:09:36[laughter]

1:09:37Alright, does that mean we're done? That seems like a pretty good place to end to me.

1:09:42Yeah, I think so. Alright, well thank you very much to our two sponges this week, Hover

1:09:47and 23andMe, and we'll see you guys soon.

1:09:49[music]

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

1:09:59Accidental.

1:10:00Oh, it was accidental.

1:10:02Accidental.

1:10:03John didn't do any research, Margo and Casey wouldn't let him

1:10:08'Cause it was accidental (it was accidental)

1:10:11It was accidental (accidental)

1:10:13And you can find the show notes at ATP.fm

1:10:18And if you're into Twitter, you can follow them

1:10:23@C-A-S-E-Y-L-I-S-S

1:10:27So that's Casey Liss M-A-R-C-O-A-R-M

1:10:32♪ Anti-Marco Armin, S-I-R-A-C, U-S-A-C-R-A-Q-S-A ♪

1:10:39♪ It's accidental, accidental ♪

1:10:42♪ They didn't mean to ♪

1:10:45♪ Accidental, accidental ♪

1:10:47♪ Tech podcast so long ♪

1:10:52Uh, I just sold something to someone.

1:10:54I thought that was funny.

1:10:55If you're gonna make fun of me, I think that's a much less jerky way of doing it.

1:11:00Because that was me talking about how excited I am that whenever I see a singular sale of

1:11:04fast text.

1:11:05Someone trying to do a JavaScript injection.

1:11:08I appreciate that they put the semicolon at the end of their statement.

1:11:12They won't stand for that JavaScript automatic semicolon insertion.

1:11:15Say, "No, I'm going to put it explicitly so it's not confused."

1:11:19And yes, the people who wrote this Showbot application have minimal competence of web

1:11:23programmers.

1:11:26Escape their input, which is not...

1:11:28It's probably still 50/50.

1:11:30Given all the websites that I see that won't let me type telephone numbers with hyphens

1:11:34in them.

1:11:35Apparently, the bar has still not been raised.

1:11:38How about American Express, where the maximum character length for a password is, I think,

1:11:44still eight?

1:11:45Well, that's probably dictated by their COBOL-based mainframe interface or something,

1:11:50but the guys who don't let you type stuff with the phone numbers, like they want you

1:11:54to only type digits, you can't type anything else.

1:11:57I just want to go to all their houses and find them and be like no one is making you do this like this

1:12:03This is literally the simplest possible task that a programmer on the web has it is completely closed

1:12:10there are no edge cases all you got to do is just

1:12:13Let me type whatever I want remove everything except the numbers

1:12:16It'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

1:12:22task. And yet, big Fortune 500 companies will have forms that don't let you type anything

1:12:27except numbers in them. And will beep at you, put alerts, automatically backspace the field.

1:12:31The automatic backspacing code, that's more complicated than stripping out the stuff.

1:12:35It boggles my mind that this goes on. And I wonder what regular people think who don't

1:12:39know that is literally the easiest thing in the entire world of web programming to do.

1:12:43They're just like, "Oh, I guess you have to do this when I'm on the site. It must be really

1:12:47secure."

1:12:48So let me tell you a true story that we cannot put in the show because it's really embarrassing,

1:12:52which means it's probably doomed to be in the show.

1:12:54When I, Aaron and I were getting married,

1:12:56I wrote in PHP, and I think it was my first PHP app,

1:12:59I wrote a website that would let guests register,

1:13:04or RSVP among other things.

1:13:07And a good friend of mine,

1:13:08his surname has an apostrophe in it,

1:13:10and I noticed after he registered,

1:13:12because I had this like totally weirdo setups,

1:13:15where I would email my phone to send my phone

1:13:18a text message back when that was still a thing.

1:13:20Well anyways, so he registered and all of a sudden everything was cut off as soon as

1:13:24I hit the apostrophe in his name because I didn't escape anything, because I didn't

1:13:28know crap about web programming at the time.

1:13:29In fact, I taught myself SQL in order to write that site.

1:13:32This was in 2007, because I was always living in thick client land until then.

1:13:37This is like people who don't learn from the past.

1:13:39I remember the first time I looked at the active record code in Rails and I was like,

1:13:43"Jesus, guys, like, find parameters.

1:13:45The technology that has existed since forever."

1:13:48and you're like, "We're going to make SQL by catting together strings and just inline

1:13:55all the values. What could go wrong? We have an escaping function. It should be fine, right?"

1:14:00Jesus.

1:14:01Wait, that's how they were doing it?

1:14:03I believe the first version of Rails was not using bind parameters in their queries. They

1:14:08would build the SQL strings out of values.

1:14:11Oh my god.

1:14:12I believe they had an escaping function of their own devising, which would be like, "Oh,

1:14:16you see. It's a quote, just double it or whatever. If this wasn't ActiveRecord and I'm slagging

1:14:22off Rails when I shouldn't be, I'm sorry. But substitute Rails with any other type of

1:14:28thing. I see it all the time of people who write database code in the modern era, like

1:14:33in this year, and don't know that bind parameters exist and just bravely plow forward.

1:14:38Casey didn't know that escaping was a thing you might want to do. But for the people who

1:14:43That, I find more excusable than the people who know that you have to escape.

1:14:47So they write their own escaping function, and they still feel like this is the best

1:14:50way to do it.

1:14:51Once you know it's a problem, you would think you'd spend three seconds Googling

1:14:54like, "Oh, I see this is a problem, and there's a name for it, and I bet there's

1:14:57some sort of technique to not have it anymore.

1:15:01Let me look that up."

1:15:02The other favorite one is that people, "Well, this is not an any-year language."

1:15:06Maybe it kind of is.

1:15:07Do you find, have either one of you ever, I don't know if this is a .NET equivalent,

1:15:12But like Marco, when you're things, you can't even do this on iOS probably.

1:15:15You know the system call, the word system?

1:15:17Open, close, parenthesis.

1:15:18Yeah, where it just shells out to the end of the day.

1:15:19Right.

1:15:20Have you ever had to do that for an iOS program, or is that just not going to happen on iOS?

1:15:22I don't think you can do it on iOS.

1:15:23I'm not sure.

1:15:24It's probably forbidden.

1:15:25But at any rate, people who do that, they'll use bind parameters on their SQL code, but

1:15:32they'll come do a part in their program.

1:15:34Apple itself probably does it, or people writing Mac apps back in the pre-sandboxing days.

1:15:38they'll build a string, and they'll pass that string to system.

1:15:42And when you're building that string, what do you have to do?

1:15:43Well, you're like, "Oh, what if the file name has spaces in it?

1:15:45Well, let me put quotes in it.

1:15:46What if the file name has quotes in it?

1:15:47Let me write an escaping function."

1:15:48They go through the same thing, and it's like, people, you're in C. There's a million functions

1:15:53that you can use to fork an exec to take lists of variable, VA list methods to take a variable

1:16:00list of parameters.

1:16:01You don't need the shell to parse it for you.

1:16:02Don't you understand?

1:16:03You can bypass that.

1:16:04You're already in a program.

1:16:05You're a programmer.

1:16:06You can write code.

1:16:07I mean, Apple itself does it, and they're Perl stuff, and you're like, "Oh, if your

1:16:13hard drive name has a space in it, and you have one that has the same name without the

1:16:17prefix before the space, it will accidentally delete it."

1:16:20Was it iTunes installer that did that?

1:16:23Maybe it was the Myth 2 installer.

1:16:24Apple at various times has done the same.

1:16:26It's the same exact problem.

1:16:27It's the sequel thing.

1:16:28They're like, "I will just build a big, long string and pass it through.

1:16:31What could go wrong?"

1:16:35you have is a list of values, and they said, "Yeah, but every time I see this list of

1:16:39values in my normal life, it's one big long string, so I'll make it into a string and

1:16:43then give it to something that will break it into the list that I already had before

1:16:45I made the string." It's just, yeah. I don't know. We're supposed to make progress.

1:16:53Certain areas, we have to make progress not by teaching people the right way to do things,

1:16:56but by making it so they never have to do that thing again.

1:16:59John, I love when you get fired up after the show.

1:17:05Oh, that's my favorite.

1:17:06No, I didn't.

1:17:07I still didn't even get to talk about Minecraft mods.

1:17:10Someday.

1:17:11Don't even start.

1:17:12Don't even start.

1:17:13That's good.

1:17:14I'm going to be angry.

1:17:15I'm trying to mellow out.

1:17:16No!

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

1:17:18No!

1:17:19Don't mellow out.

1:17:20Don't get talked about.

1:17:21Let's talk about titles.

1:17:22I don't want to talk about it.

1:17:23Before the next show, or whenever that may be, YouTube should be forced to install Minecraft

1:17:29in several mods on behalf of, if you don't, neither one of you has a child of the age

1:17:33who can play Minecraft, maybe just like borrow one for the weekend and have them ask you

1:17:37to install Minecraft and the mods that they want.

1:17:40And just spend the weekend doing that, then you will also be sufficiently angry for us

1:17:44to have an all Minecraft mod anger episode after vacation.

1:17:48If I get bored while I'm on vacation, I will do exactly that.

1:17:52Find a neighborhood kid.

1:17:53Go, "Come over to my house!"

1:17:55And then ask me to install Minecraft mods.

1:17:58That's not creepy at all.

1:17:59Well, maybe have your wife do it.

1:18:01That's what we do.

1:18:03I get in touch with your wives and say,

1:18:05"Just pretend you're into Minecraft."

1:18:07And ask Margot, "Hey, I saw this cool thing.

1:18:09Could you install Minecraft in these couple of mods for me?"

1:18:11Because when your wife asks you to, it's just as bad.

1:18:13Although I don't know if it's believable that they'd want to play Minecraft.

1:18:15Because it's more of a kid thing.

1:18:17Actually, Tiff tried it.

1:18:19I've never played Minecraft.

1:18:21Nor have I.

1:18:23But Tiff actually played it for like one night.

1:18:25And just didn't really like it that much.

1:18:27really like it that much, but she did play it for one night like a few, like a month

1:18:30ago or something like that. But I don't know, I'm really, I'm kind of scared. You know,

1:18:35like I don't have to try heroin to know that I probably should never try heroin. Right?

1:18:40Like so, and I know enough about like hard drugs and their addictiveness to know that

1:18:46I should never even attempt them. And I'm fine with that.

1:18:49Now is this the heroin clause or is this the TMD crush clause?

1:18:53Well it's both. So same thing. So like when I hear that a game is like super addictive

1:18:56and takes over people's lives. I don't have to play it. I'm not like, "Ooh, let me try

1:19:02that." No, I'm like, "You know what? I don't really need that."

1:19:04Well, why don't you pass that wisdom on to your wife?

1:19:06Well, I did. I scared her away with, oh man, Candy Crush. So, quick story. So, Tiz's phone

1:19:16had—it's an iPhone 5, and it had a failing sleep/wake button, which I guess is a very

1:19:20common problem. And so, I took it to the Apple people, and they swapped it. And so, great,

1:19:25come back with a new phone. And we backed it up and did the whole sync locally to iTunes

1:19:30like that morning. Every app, all the music, all the photos, the entire keychain,

1:19:37everything restored perfectly except Candy Crush. For whatever reason, Candy Crush just did not

1:19:44restore, just was not there on the phone. So Tiff has lost her progress in Candy Crush.

1:19:49And this is like severely bad.

1:19:52Did you have to pay extra for that service?

1:19:54I don't know. So the way she's been playing it, you know, like when we first heard about

1:20:00it I believe from Amy Jane Gruber on one of her various podcasts, or somewhere, Twitter

1:20:06or something, that I got the impression that it was extremely addictive and that it could

1:20:11just take all of your money because you could just, you know, you can like buy your way

1:20:15out of time limits and all, you know, all the crap that the free to play BS games do.

1:20:20And so I was like, "Do not install that game because it will take all the money.

1:20:26It will just suck away everything we have, everything we've worked for.

1:20:29All the money will be gone."

1:20:31So to prove that I was wrong about that, Tiff has played the entire game not spending any

1:20:37money and intends to continue that way.

1:20:42But apparently it's a pretty hard game and it's pretty hard not to spend money, which

1:20:45is why they make so much.

1:20:48So she's like spent hours this week playing this game, and now it's restored and it's

1:20:56gone. And of course they don't use any kind of iCloud or Game Center. Of course they don't

1:21:01do anything right in programming the thing to actually make it keep your progress. No,

1:21:06that would cost them too much money. That would cost people to not buy upgrades. So

1:21:09of course they don't do that because game programmers are so great these days. My slight

1:21:13rant. Thanks a lot, game programmers.

1:21:17But, yeah, so I wonder how this is going to play out now.

1:21:22Like if she'll have to buy her way out of this,

1:21:24if I will have to buy her way out of it,

1:21:25out of guilt for somehow not having this thing synced

1:21:28with just that app.

1:21:29- If she wants to like bang her head against

1:21:31a very difficult to play application,

1:21:32you can get a super hexagon or impossible road or something,

1:21:35which do not ask for an app purchases,

1:21:36but will nevertheless frustrate her for a lifetime.

1:21:40- Or Marble Madness.

1:21:42- Whose alarm is going off?

1:21:43- That's over here.

1:21:46For a second there I was like, "How? My garage is closed. I don't think it's me."

1:21:51Hi.

1:21:52My windows are closed, too.

1:21:54You know, all those times that I played Marble Madness,

1:21:58after having spent the $40 on it and being so disappointed at how much it sucked for my Genesis,

1:22:03all that time, the game only has six levels.

1:22:06Yeah, six levels for $40.

1:22:08I'd never beat it.

1:22:11Because at level six, the whole game is really, really hard,

1:22:13And level six is just like, it's so ridiculous, I just, I could not ever beat it.

1:22:19I came close a few times, never got it.

1:22:20You should get a super monkey ball for your, it's a GameCube game, but you have a Wii that

1:22:24will play GameCube games.

1:22:25That is the, probably the most difficult console game that I've played and enjoyed.

1:22:31Because no, I haven't played Dark Souls, people listening.

1:22:35Games are more forgiving now than they were in the past.

1:22:37Just having like, progress saving.

1:22:39is a massive, a massive ease jump, you know? Like...

1:22:44Super Monkey Ball does not have that. Neither does Super Hexagon. Neither does Impossible

1:22:47Road. Super Hexagon, have you played... that's the one you might have heard of and played.

1:22:52Have you played Super Hexagon? No, what's it for?

1:22:55For making yourself feel incompetent? No, no, what...

1:22:58No, it's for iOS. All right.

1:23:03Yeah, it's... yeah. You should get it just because I think it's a really well-done game

1:23:08It has really nice music that you'll I've seen this if you hear you will hear three seconds of before you die

1:23:13Yeah, I've seen this and yeah, I played it for about eight seconds and then not not continuously

1:23:18They'd seconds cumulatively all

1:23:20If you could stay alive for eight seconds, that would be something

1:23:23I don't I don't like games like this like any like I also never cared for like games like

1:23:29Cannibal and yeah anything that's like just fast action and just go until you die or like anything like that

1:23:35I I just don't I get discouraged so quickly and easily from these games

1:23:39I guess I never want you should never play a super axion or impossible super monkey ball though like I mean has easy levels

1:23:45So it's fun

1:23:45It's fun to play like that's the only game like that that I have been motivated enough to play because like it starts

1:23:50You know it starts so easy you're like oh, this is fun, and it's interesting

1:23:53It's nice to look at it as neat music, and it's mentally challenging

1:23:56But 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

1:24:02being with the exception of seven people in the world, you will reach the limits of your

1:24:05ability but only after a satisfying trail up to that level instead of just like, "Super

1:24:10Hexagon is immediately you suck now. From second zero you suck." All right? That is

1:24:15different.

1:24:16Impossible Road is, I think, is actually—I haven't played it enough to know. It's

1:24:20probably a little bit harder than Super Hexagon, but I can't really tell.

1:24:23So now, Marco, did you get into Tiny Wings when that was popular?

1:24:27No, I've seen it. I think I played it on someone else's phone or something.

1:24:32Because I like that one. Like, I've never played Cannibal, and I've seen it on other

1:24:35people's phones, but I like Tiny Wings. I don't play it that often, but I like it.

1:24:38Tiny Wings is charming.

1:24:39I've seen a few things. Like, there was some kind of skiing version of that that I played

1:24:43for like an hour one time, but that... I just... I don't have the patience to... Once I get

1:24:51going really far in one of those games, and then I die, and then I start over again, I

1:24:55just don't care. I'm so discouraged by having to start over again at that point and playing

1:25:01the exact same thing over and over again, even if it's a little bit varied from random

1:25:05generation or procedural stuff. Even then, I hate going back. That's one of the reasons

1:25:10I was playing through Vice City with, no actually it was the original GTA 3, playing through

1:25:18it and I almost beat the game but there was this one mission where it took like 15 minutes

1:25:24to do the mission and it was a timed thing where you had to do it within that 15 minutes

1:25:29and it kept getting within like 10 seconds of succeeding and just barely missing it.

1:25:34And I just stopped playing the game. Like I just never proceeded past that point. After

1:25:37like a few days of banging on that mission and doing it like seven or eight times and

1:25:41failing every single one, I just got so discouraged. I'm like, you know what, I'm done. That's it.

1:25:46I just never went back. It was the mission where you drive around trying to crush all

1:25:51coffee stands in like seven different parts of the town. I bet everyone who played GTA

1:25:563 probably remembers that mission and possibly stopped playing it there.

1:26:00This is one of the rites of passage of anyone who will eventually come to identify themselves

1:26:04as a gamer is that everyone eventually meets that game with the frustrating level or the

1:26:08difficult thing that they feel like they're never going to get past. And people who will

1:26:14later in life call themselves a gamer get through that and they consider it like a personal

1:26:19triumph and move on from it. And once you've done that once, you realize that there is

1:26:25nothing in the game that I can't do. I can always persevere. It's just a question of

1:26:30doing it. And it's not like a value judgment. Like, if you decide your time is better spent

1:26:34doing something else, then fine, or whatever. I'm just saying, like, the people who make

1:26:37that decision, they say, "You know what? I'm going in this totally inconsequential place

1:26:42where there's no reason for me to do this. There's no reward waiting for the end of it.

1:26:45No one's going to care that I did it. I'm just alone here in my house. I've decided,

1:26:48"You know what? I'm going to do this." And eventually you do do it. It's an amazing

1:26:53feeling and it gives you a belief in yourself that it shouldn't because it's like all

1:26:57you did was press buttons on a controller like this has no bearing on your ability to

1:27:01succeed in life or anything like that. But it feels amazing, right? And that's the

1:27:05great thing for people who are gamers. That's the amazing thing about games like Super Hexagon

1:27:09and stuff is because it takes that gamer sense of thinking that there's nothing you can't

1:27:14beat and saying, "No, actually, here, try this." And it's like, for one set of people,

1:27:21like this is a new experience, because at this point, every challenge that I've come across,

1:27:24I've been able to surpass. So it's going to bring some people to say, "I have reached my limits as a

1:27:30human being." No matter, I realize now, after my years of experience of being in things, that this

1:27:35is one place that I can't go any farther. And then at first, even smaller percentage of people,

1:27:40it's going to make them initially think that, and then they are going to do it, and they're going to

1:27:43to be like, "I am now God." It's like after you've, you know, getting back to drugs analogy,

1:27:50like you've built up a tolerance, right? And the only way for you to get any sort of high

1:27:54is to get into the situation that is basically impossible and either be defeated and have

1:27:59that be a novel sensation or break through anyway and be like, "There's now nothing I

1:28:02can't do," you know? You are very far at the end of that spectrum. Is there any game type

1:28:09experience you've done where you feel like there's no way in heck I'm going to beat this,

1:28:12you forget it, you put the game down, you put it away for six months, and eventually

1:28:15you say, "You know what? I'm going to beat that," and you come back to it. Not with a

1:28:17six-month gap, but any kind of thing where you feel like you've already decided, "This

1:28:21is impossible. This is unfair. There's no way this can be beaten. I hate this game,"

1:28:24but then have eventually gotten through it.

1:28:26Oh, yeah, definitely. Usually that's the outcome. I don't usually give up on the game completely.

1:28:32But there are certain things that just... Anything that just wastes tons and tons of

1:28:37of time doing the same thing over and over and over again

1:28:41in order to get to the point that I keep failing,

1:28:44that drives me nuts.

1:28:45- Yeah, that's part of the experience.

1:28:47Of course they do that.

1:28:48Of course, like the most extreme cases,

1:28:50the ones where there was no saving, right?

1:28:51Because then, like, the whole thing would be like that.

1:28:53You'd spend like five hours on a weekend

1:28:55getting to the place where you die all the time

1:28:57only to die all the time.

1:28:58So like your, you know, your code compiled debug cycle

1:29:02is like four hours long, and you know, you're like,

1:29:05you do the math in your head, like,

1:29:06How many tries is it going to take me?

1:29:08And if each time I do the try, and then eventually you

1:29:10can't even get up to that level anymore,

1:29:11you're going to that downward spiral

1:29:13where you're not even getting halfway to the place

1:29:15where you're going to die anymore,

1:29:16and you have to take a break from it.

1:29:18That's what I'm talking about.

1:29:19That's the whole experience.

1:29:21And that's totally the worst.

1:29:22And that's why the games are generally

1:29:24where you get some kind of save or some other way to do it.

1:29:26But yeah, back in the day, you'd play those NES games.

1:29:29It was like, was it "Bionic Command" at the moment

1:29:31where you had to shoot a missile at Hitler in a helicopter

1:29:33as you flew by him on the screen?

1:29:3630 frames a second, and you got basically one shot at it, and the first time it happened,

1:29:40you had no idea it was coming, and now you're just like, "We gotta play through the whole

1:29:43game again to get up to that one scene and give it another try." That was a different

1:29:46age.

1:29:47See, I had a terrible horror story with the NES, because I had, what was it, Dragon Warrior?

1:29:52That was the original, not the original RPG, but it was one of the first RPGs in the NES,

1:29:57and...

1:29:58Please email Casey.

1:29:59Please email me. No, don't really. But anyways, I wanna say, please don't email me, that the

1:30:05highest level you could get to was like 25 and I got up to level 21 or something like that and then my little brother

1:30:11and to this day, I'm not sure if he was being a d*ck or if he did it accidentally, but he

1:30:16erased my save, my save game or whatever and I never looked at that game again because I was it took me hours

1:30:24I remember... That could ruin a friendship.

1:30:26Yeah, exactly. But he's still his brother. You can't get rid of him.

1:30:29Yeah, I tried but I couldn't. Oh man, that made me so angry.

1:30:34Yeah, that's the other thing. That's the other element that could turn you off is like if you feel like something

1:30:37Unfair 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

1:30:43The crap this game could throw at me and try it, but now someone has deleted my save game

1:30:46It's like alright that one that one. It's like you know foul out of bounds

1:30:51Oh, yeah

1:30:51The reason why I never beat Vice City is that I was playing it during college and on my roommates Xbox

1:30:57And when he went home from the summer, I'm like well that there good there. It goes. That's it. He saved you

1:31:02Yeah, but like I would like Tiff and I were playing it we we got

1:31:06We were playing it for like months and we got to what had to be like almost the end of the missions

1:31:12And yeah, but like once that like I ended up getting my own Xbox eventually

1:31:16But 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

1:31:20And put it on mine like you know that that wasn't gonna happen

1:31:23So I just the game if the game is good enough you'd want to start over

1:31:25Yeah, 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

1:31:32I like them at the time, the first time I'm playing through.

1:31:35I like accomplishing those things and getting it done.

1:31:38But I never want to go back and do these things over again

1:31:41'cause it's just so time consuming

1:31:42and so many of them are so tedious.

1:31:44- Yeah, it's kind of like favorite movies.

1:31:47Most people like to see their favorite movies

1:31:49more than once in their entire life.

1:31:50Like that's what makes them their favorite movies.

1:31:52None of them need to watch it every month

1:31:53or even every year, but your favorite movies,

1:31:55you might be like, "Nah, I've seen that one already."

1:31:57Like you'll watch it.

1:31:58You'll watch it if it ends up on TV or whatever.

1:32:01That's what it's like with favorite games,

1:32:02gamers is like not like you're gonna play it every month or every year or whatever but like every

1:32:06Five years or so you feel like I have to play my hero game again because it's been too long right

1:32:11Yeah, so how often do you play journey? I?

1:32:13Play it really so many damn times, so I'm not taking a break from now at this point

1:32:17I do it pretty much on the year anniversary of journey

1:32:19I 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

1:32:25It's just two hours

1:32:27So I can't I can't even believe it you already have the ps3. I think you already have the game yep

1:32:32Oh, you were just trolling the shit out of him right now.

1:32:35He's just denying himself a good experience.

1:32:38I mean, Journey really is a gamer's game, though, so it could be that it's appeal.

1:32:42It's like a movie fan's movie, like someone who's a real big cinephile, if that's the

1:32:47word.

1:32:48Movies that they love, the general public might not love.

1:32:51But I think Marco, I think Journey may be a crossover hit.

1:32:54We'll see.

1:32:55What about you, Casey?

1:32:57What's your Journey excuse?

1:32:58I don't have a PS3.

1:33:00Alright, well when Marco's done with his I'll send it to you.

1:33:03Because he's not using it for anything else apparently.

1:33:07On a very very quick final note, I tweeted like two minutes before the show, I just filled

1:33:11my car, my tank miles per gallon, 15.

1:33:13I saw that.

1:33:14Yeah, I saw that.

1:33:15I was thinking, I would love to get that.

1:33:18I was thinking I'd get like double that if I ever measured my mileage, which I don't.

1:33:23This moment right here perfectly encapsulates the three of us.

1:33:27Definitely.

1:33:28It perfectly encapsulates our cars, anyway.

1:33:31There are, apparently...

1:33:33There is a game called Candy Crisis. People are saying, "This is the Puyo Puyo clone for Mac."

1:33:36It's very well known. It looks like it might even be open source.

1:33:39- Yeah, it might have been the name of it. - Yeah, it's GPL.

1:33:42I just didn't recognize the screenshots. Like, they didn't look familiar to me.

1:33:46Yeah, so these screenshots still don't look familiar to me.

1:33:49I mean, there could be more than one of these. I don't doubt that there's more than one.

1:33:52I'm totally getting this. I'm so good at this game.

1:33:55No one... No one... I'm always... I tweeted, like...

1:33:57I'm always good at the games that nobody else plays, which of course that probably just

1:34:00means I'm not.

1:34:01Well, people play this.

1:34:02They call them casual gamers, Marco.

1:34:03It's okay.

1:34:04No, but there's like...

1:34:05Only John is judging you.

1:34:07I'm really good at Moon Base Commander, too.

1:34:09And Moon Base Commander, nobody plays.

1:34:11Right?

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

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

1:34:14No.

1:34:15That's like one of my, like, "I'll never get to it" ideas is I would love to make Moon

1:34:19Base Commander for iPad, but it's just never gonna happen.

1:34:23Like, first of all, even though it was a $5 game in, like, 2001,

1:34:29it's still probably beyond my ability to make,

1:34:33because I'm not really a game programmer, and it would be, like--

1:34:37I'm sure maybe I could do it if I had nothing else to do for, like, five years,

1:34:40but, you know, I wouldn't--

1:34:42it would be a tremendous waste of time for me to try to make that,

1:34:44because it's so far outside of my expertise.

1:34:46- Sprite can? - Maybe.

1:34:48- Ah. - But, um--

1:34:50- Games practically write themselves.

1:34:52It automatically compiles your images into asset files.

1:34:59You should watch those Dev Summit.

1:35:01SpriteKit is like-- SceneKit, you could not make a 3D game with, because it's just for

1:35:06adding 3D to your apps.

1:35:07Like those are number three.

1:35:08But SpriteKit, you could make a Sprite game with.

1:35:11Isn't it basically just like Apple's ripoff of Cocos2D, or is there more to it?

1:35:16I mean, basically, you've got core animation, right?

1:35:18So you've got all the makings of a SpriteKit, but anyone who actually wants to make a game

1:35:21out of that is not going to use a bunch of current animation layers. There's things that

1:35:24sprite collision detection and compiling all your assets into big files and pulling out

1:35:28chunks of them or whatever. And this does that for you. This makes it so that you might

1:35:34be... People who are thinking of making a game but have no idea how to do it, Sprite

1:35:37Kid now suddenly puts their game to the realm of possibility because it's not like... You're

1:35:42not going to make an awesome game that's groundbreaking, but you're going to make a competent game

1:35:45provided you have good artwork or whatever. So it does the things the framework's supposed

1:35:50Which is like people who could not make this program before now can because smarter people have come and given them more lower layers

1:35:56And it's impressive because you actually can make a game out of it like it did in the demo

1:36:01They had an actual game not a not a good game not an amazing game, but you look at it

1:36:05And you go you know what that's fine. You know

1:36:07Someone who who has like the skills to make a game in terms of level design and character design

1:36:12But not the skills to make a sprite engine now can get stuff on

1:36:17IOS and of course the best thing about it is it's IOS only

1:36:19So those people who do it won't have the skills to port their games any other platform

1:36:24Platform lock-in whoo

1:36:27But you should check just watch the dev seminars. They're fun dev seminars. They got their games

1:36:31I will see if I could but I can't oh, that's right everything's down, and I don't download all the

1:36:36Foresight to download them all the day they came out every year

1:36:44Someday now I have all this space and I finally I finally have like a large storage and backup thing set up

1:36:49Oh god. I have UPS is everywhere now - I have because I got this analogy and I'm like, you know what?

1:36:55I should put this on a UPS and

1:36:57So I'm like upgraded my main UPS for my mac Pro

1:37:01Move the old one into the closet for that and the router and stuff does the SMT 1500 have a fan?

1:37:07Oh 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

1:37:13hour. I, uh, cause like normally, I mean, I'll have to try to pay attention. I'll have

1:37:19to put a load on it when the Mac Pro's off. Um, so I could, so I could tell more directly,

1:37:23but as far as I can tell, the fan is not running normally. Uh, I certainly can't notice it

1:37:28next to a Mac Pro, uh, with no hard drives in it, which should tell you something. It

1:37:32doesn't tell me anything. It tells me nothing. All right. I'm hanging up on YouTube. I gotta

1:37:37go pack. All right. Enjoy your beach. And to be honest, I'm sort of dreading it. I don't

1:37:42I'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.

1:37:48- So you're on the beach every five years? - I haven't been to the beach for more than a few hours.

1: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.

1:38:00- Oh, God. What's wrong with you? Where'd you grow up again? - Oh, God.

1:38:03- Oh, I hate-- I will do anything to avoid using sunblock. - Oh, what is--

1:38:07- Oh, amen. Amen to that. - What is wrong with you people? - Sunblock smells like--

1:38:11Well, no matter what, it gets in my eyes.

1:38:13Like, no matter where I put it, no matter how careful I am, it always gets in my eyes and burns.

1:38:17This is like those commercials where they have this device to cook eggs and they say,

1:38:20"Eggs are so hard to make!"

1:38:21And the guys get eggs in their hair and the shells are in their eyes poking them.

1:38:25Sunblock always gets in my--

1:38:27No, it doesn't!

1:38:28If you have a tiny bit of confidence, you can not get the eggshells in your eyes.

1:38:33Even if you don't get it in your eyes, it still smells like--

1:38:36And you gotta sit there and you're--

1:38:38There's a million kinds of sunblock!

1:38:39I mean, it smells crappy.

1:38:40This million kinds of sunblock.

1:38:42Then you're all slimy for all day.

1:38:44And then what do you do?

1:38:45When you start to sizzle, you have to flip over.

1:38:48It's like you're a freaking geek yourself.

1:38:49You guys may be doing it wrong.

1:38:51Then you get up and you walk across the sand that's

1:38:53melting the bottom of your feet.

1:38:55Then you get in the water, which you accidentally

1:38:56get in your mouth.

1:38:57What beach are you going to, anyway?

1:39:01What is it?

1:39:01Kill Devil Hills, which is a great name for a freaking

1:39:03beach in the Outer Banks.

1:39:07Non-beach people.

1:39:08And then you get in the water and you open your- you stop clenching your lips shut as

1:39:13hard as possible and suddenly all the salt that is in the entire world is in your mouth.

1:39:19And you can't even drink the f***ing water because then you get more salt in your mouth.

1:39:22All these experiences you're describing are the same experiences the people who like the

1:39:26beach enjoy, but you're giving them a negative spin.

1:39:29The smell of the salt air, the feel of the sand under your feet, the smell of sunblock

1:39:35even suntan oil, cocoa butter smells. No. You guys were deprived of important experiences

1:39:44in your formative years, and now are broken adults who can't enjoy the beach.

1:39:48And the funniest part of this entire discussion is we met 20 yards from a beach, although

1:39:53the difference being that was a lake beach, which I enjoy.

1:39:55No, lakes are gross.

1:39:57Ocean beach.

1:39:57Filled with disgusting smelling water and mud.

1:39:59Yeah, and also, we were not wearing sunblock. We were inside using computers.

1:40:04[laughter]

1:40:05There was no salt, there was no sand, there was no sun.

1:40:08You got the programmer's tan, that's what I got.

1:40:11Oh god.