PodSearch

ATP

24: Double Meta

 

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

00:00:03 ◼   ► is not protected against injection attacks.

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

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

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

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

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

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

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

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

00:00:43 ◼   ► functions.

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

00:00:47 ◼   ► Really?

00:00:47 ◼   ► Until like an hour ago.

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

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

00:00:59 ◼   ► So what did you use it for?

00:01:00 ◼   ► Am I allowed to ask?

00:01:01 ◼   ► Yeah, if you want.

00:01:03 ◼   ► So for my new big thing, I've now

00:01:08 ◼   ► done-- in substantially shipping products,

00:01:11 ◼   ► I've now done both core data in the magazine.

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

00:01:18 ◼   ► but it's still a shipping production use of this thing

00:01:23 ◼   ► for a real app that's not entirely trivial.

00:01:26 ◼   ► So I've used Core Data, and in Instapaper,

00:01:31 ◼   ► I used SQLite just raw.

00:01:33 ◼   ► And I made a few lightweight utility functions

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

00:01:42 ◼   ► via raw queries and raw calls to the SQLite API.

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

00:01:49 ◼   ► I also say GIF.

00:01:50 ◼   ► Oh, well.

00:01:52 ◼   ► Suck it.

00:01:53 ◼   ► So, anyway.

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

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

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

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

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

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

00:02:33 ◼   ► around SQLite.

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

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

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

00:02:51 ◼   ► And mine, chances are mine is probably a bad idea as well,

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

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

00:03:03 ◼   ► so, okay, the main argument against this, this is the classic

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

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

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

00:03:20 ◼   ► They're probably all three.

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

00:03:27 ◼   ► Okay. I'll have to look that up.

00:03:29 ◼   ► Anyways...

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

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

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

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

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

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

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

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

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

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

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

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

00:04:33 ◼   ► So you're not like an AF networking fan then?

00:04:37 ◼   ► AF networking, I added it to the magazine fairly late.

00:04:41 ◼   ► I think in the most recent version of the magazine,

00:04:43 ◼   ► I think I added it for some relatively trivial thing.

00:04:48 ◼   ► I really just wanted to try it.

00:04:50 ◼   ► I know AF networking is very, very good,

00:04:52 ◼   ► and its programmer.

00:04:53 ◼   ► Is that Matt with three Ts?

00:04:55 ◼   ► Thompson, who writes that?

00:04:56 ◼   ► - I believe that's right.

00:04:58 ◼   ► - Well anyway, he's really, really good.

00:04:59 ◼   ► So that's the kind of, like,

00:05:01 ◼   ► I have no problem using his code,

00:05:02 ◼   ► 'cause he's ridiculously good.

00:05:04 ◼   ► So we'll have to look that up.

00:05:06 ◼   ► I'm pretty sure it's him.

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

00:05:11 ◼   ► so I know that it probably is not buggy,

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

00:05:14 ◼   ► fixed pretty quickly.

00:05:15 ◼   ► So, and that's another thing, like, you know,

00:05:18 ◼   ► they do a lot of things there.

00:05:20 ◼   ► It's still a fairly thin layer, though.

00:05:23 ◼   ► Like, I mean, different parts of it, I guess,

00:05:24 ◼   ► are different widths, or thicknesses, but,

00:05:28 ◼   ► (laughing)

00:05:29 ◼   ► but yeah, so anyway.

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

00:05:35 ◼   ► And this involves, you know,

00:05:39 ◼   ► anytime you write something like this,

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

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

00:05:47 ◼   ► to Objective-C runtime stuff.

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

00:05:53 ◼   ► And right now I'm calling into some runtime functions

00:05:56 ◼   ► to basically do reflection.

00:05:58 ◼   ► And I know we had a whole reflection topic

00:06:02 ◼   ► on the topic list.

00:06:03 ◼   ► I wonder if we can get to those now.

00:06:05 ◼   ► - But we certainly can.

00:06:06 ◼   ► - Yeah.

00:06:08 ◼   ► But you know, like in dynamic languages,

00:06:11 ◼   ► like most of the web languages,

00:06:12 ◼   ► like the advanced scripting languages and stuff,

00:06:14 ◼   ► it's easy to,

00:06:17 ◼   ► it's very, very easy to like, you know,

00:06:19 ◼   ► just inspect your variables and see what the class has

00:06:22 ◼   ► and do crazy things to it and everything else.

00:06:26 ◼   ► With Objective-C, a lot of that is possible.

00:06:29 ◼   ► Some of it's not.

00:06:30 ◼   ► But it's actually more possible than I thought it was.

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

00:06:42 ◼   ► column names to their values.

00:06:44 ◼   ► >> Oh, that's so awful, but carry on.

00:06:47 ◼   ► >> Wait, hold on.

00:06:48 ◼   ► Go on.

00:06:49 ◼   ► >> Well, it's awful.

00:06:50 ◼   ► >> This is the time to tell me.

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

00:06:59 ◼   ► at all how I would handle it.

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

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

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

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

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

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

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

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

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

00:07:44 ◼   ► there just a date class that handles everything?"

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

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

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

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

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

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

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

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

00:08:22 ◼   ► you call the thing that represents the unique identifier for an object?

00:08:27 ◼   ► Naturally, in most languages, that would be ID.

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

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

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

00:08:40 ◼   ► But it does work. You can name a variable ID.

00:08:43 ◼   ► Mine was even type ID.

00:08:46 ◼   ► God, that makes me hurt so bad.

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

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

00:08:55 ◼   ► So, what would I have done in .NET?

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

00:09:02 ◼   ► class portion of the language.

00:09:04 ◼   ► And .NET is really metadata heavy.

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

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

00:09:17 ◼   ► actually decorate that variable with arbitrary things that we call attributes.

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

00:09:29 ◼   ► unique identifier, for example.

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

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

00:09:42 ◼   ► attribute.

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

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

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

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

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

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

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

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

00:10:37 ◼   ► And I use this constantly.

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

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

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

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

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

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

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

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

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

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

00:11:31 ◼   ► any sense at all?

00:11:32 ◼   ► It did. That's actually really cool.

00:11:35 ◼   ► Because, I mean, I don't even-- I think--

00:11:38 ◼   ► I think there actually is buried in the runtime a way

00:11:42 ◼   ► in Objective-C to attach arbitrary objects to any NS

00:11:45 ◼   ► object.

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

00:11:49 ◼   ► And either way, you probably shouldn't

00:11:52 ◼   ► be doing things with that.

00:11:54 ◼   ► There's a lot of things with designing low level model

00:11:59 ◼   ► and reflection type classes and things like that.

00:12:02 ◼   ► There's a lot of times where like,

00:12:04 ◼   ► there's something you can do that you probably shouldn't do

00:12:07 ◼   ► and a lot of room for terrible hacks.

00:12:10 ◼   ► - Right, and you could do an associated object,

00:12:12 ◼   ► but that's a little bit different

00:12:13 ◼   ► because that's more of saying,

00:12:15 ◼   ► I'm probably gonna butcher this

00:12:16 ◼   ► because I haven't done it in a while,

00:12:17 ◼   ► but if memory serves, that's saying,

00:12:19 ◼   ► hey, for this instance of this class,

00:12:22 ◼   ► I wanna have this arbitrary object associated with it.

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

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

00:12:34 ◼   ► And again, it's just extremely powerful.

00:12:35 ◼   ► And I think you're right, Marco.

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

00:12:40 ◼   ► And a lot of it is possible, a whole heck of a lot of it.

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

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

00:12:52 ◼   ► You were saying this just a few minutes ago.

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

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

00:13:01 ◼   ► Ugh.

00:13:02 ◼   ► It's gross.

00:13:03 ◼   ► Well, it's not that.

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

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

00:13:13 ◼   ► cushy playland.

00:13:14 ◼   ► I mean, it's not that bad.

00:13:18 ◼   ► So what would you have done in PHP?

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

00:13:22 ◼   ► if we ever give you a chance to talk.

00:13:24 ◼   ► What would you have done if you were trying

00:13:26 ◼   ► to solve the same problem in PHP?

00:13:27 ◼   ► - Well, I have solved the same problem in PHP.

00:13:29 ◼   ► I use for Instapaper, for the magazine, for the new things.

00:13:33 ◼   ► I do use my own MVC framework

00:13:36 ◼   ► that is very thin and lightweight,

00:13:37 ◼   ► so I can use SQL directly.

00:13:39 ◼   ► All the same goals, actually.

00:13:41 ◼   ► Well, most of the same goals.

00:13:42 ◼   ► And so I have solved this problem in PHP,

00:13:46 ◼   ► And I basically, I think I do roughly the same thing

00:13:51 ◼   ► with like, you know, storing the attributes

00:13:54 ◼   ► of a model object as a dictionary of, you know,

00:13:58 ◼   ► strings to value, of keys to values,

00:14:00 ◼   ► and those keys match database column names.

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

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

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

00:14:12 ◼   ► for all that comic book talk and backdoor.

00:14:14 ◼   ► (laughing)

00:14:16 ◼   ► Hi, Nolan.

00:14:17 ◼   ► This is glorious.

00:14:19 ◼   ► So you know, there's always-- this

00:14:23 ◼   ► is one of the reasons why I like doing this kind of programming

00:14:26 ◼   ► at this level, solving these kinds of problems,

00:14:29 ◼   ► even though they've been solved a million times before,

00:14:31 ◼   ► even though my implementation might not

00:14:33 ◼   ► be very good for some people or for some things or for myself,

00:14:35 ◼   ► even.

00:14:36 ◼   ► I love it because there's so many design decisions

00:14:40 ◼   ► that you can make that really do have a pretty big impact.

00:14:43 ◼   ► So one of the things-- and I don't

00:14:46 ◼   ► want to talk about this for too much of the show,

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

00:14:50 ◼   ► for people who aren't Merlin.

00:14:51 ◼   ► But I think one of the things about--

00:14:55 ◼   ► one of the hardest parts about this

00:14:57 ◼   ► is how do you expose the database fields on the object,

00:15:01 ◼   ► and how much code or boilerplate has

00:15:05 ◼   ► to be written in the subclasses?

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

00:15:13 ◼   ► and how are the columns represented.

00:15:14 ◼   ► So in my thing, I actually do a very similar trick

00:15:18 ◼   ► to what Core Data does.

00:15:19 ◼   ► Because you can tell at runtime, which I actually

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

00:15:25 ◼   ► You can tell at runtime whether a property was declared

00:15:30 ◼   ► dynamic, or rather whether its implementation was declared

00:15:34 ◼   ► dynamic, and if it has custom getters or setters.

00:15:39 ◼   ► All that stuff is available at runtime from the runtime APIs.

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

00:15:47 ◼   ► arbitrary column names just via a dictionary API.

00:15:50 ◼   ► But it also treats any dynamic property as a database column.

00:15:56 ◼   ► And then it does useful things.

00:15:58 ◼   ► So you can have a property that's an NSURL.

00:16:01 ◼   ► And if you declare it dynamic in the implementation file,

00:16:05 ◼   ► then the runtime will see that.

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

00:16:11 ◼   ► is the database field named that.

00:16:14 ◼   ► And then you can just call save, and it works.

00:16:16 ◼   ► And you can call the query functions, get them,

00:16:21 ◼   ► and it maps into them on read.

00:16:23 ◼   ► So it's a very simple model layer.

00:16:29 ◼   ► This is one of the reasons why I write my own model

00:16:31 ◼   ► layers in the languages that I like.

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

00:16:39 ◼   ► And specifically, I treat databases the way

00:16:43 ◼   ► that most programmers of previously high-traffic web

00:16:46 ◼   ► applications treat databases, which

00:16:49 ◼   ► is infrequently and gently.

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

00:16:57 ◼   ► very high-functioning model type APIs,

00:17:01 ◼   ► where they'll go look up associated objects for you

00:17:04 ◼   ► and do extra queries on your behalf.

00:17:06 ◼   ► And I don't like query builders.

00:17:08 ◼   ► I like to write the query myself so I

00:17:10 ◼   ► can choose exactly how it's queried in the database

00:17:12 ◼   ► and optimize it.

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

00:17:17 ◼   ► I don't like the core data gooey about the model declarations

00:17:23 ◼   ► and the migrations.

00:17:24 ◼   ► Oh, migrations are rough.

00:17:26 ◼   ► So I'm basically doing something that-- it

00:17:32 ◼   ► is more of a convenience wrapper than a functional wrapper,

00:17:35 ◼   ► if that makes sense.

00:17:38 ◼   ► it's not doing a whole bunch of magic,

00:17:40 ◼   ► it's just getting rid of boilerplate.

00:17:43 ◼   ► Does that make sense?

00:17:45 ◼   ► - It does.

00:17:46 ◼   ► And I guess to me, I view a model as the buffer

00:17:51 ◼   ► between the completely myopic database world

00:17:55 ◼   ► and the completely myopic application level.

00:17:59 ◼   ► And to me, and I agree with you

00:18:01 ◼   ► that a model should be extremely dumb.

00:18:03 ◼   ► It should basically be a bucket and nothing else,

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

00:18:13 ◼   ► to classes and very little else.

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

00:18:20 ◼   ► from database to model and back.

00:18:22 ◼   ► And I think we're saying the same thing.

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

00:18:28 ◼   ► cetera, et cetera.

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

00:18:33 ◼   ► Yeah.

00:18:34 ◼   ► So, John.

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

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

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

00:18:48 ◼   ► he said he thought it wasn't.

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

00:18:59 ◼   ► And I bet--

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

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

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

00:19:11 ◼   ► but I see it all the time.

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

00:19:18 ◼   ► what language they use, what their education is or whatever.

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

00:19:24 ◼   ► things.

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

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

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

00:19:40 ◼   ► a program.

00:19:41 ◼   ► They learn Ruby on Rails and they make a web application.

00:19:45 ◼   ► They learn UIKit and they make an iOS application.

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

00:19:56 ◼   ► use to write their program and their program.

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

00:20:04 ◼   ► the program and their program.

00:20:06 ◼   ► It's all one continuous thing.

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

00:20:13 ◼   ► provides one.

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

00:20:18 ◼   ► engines, or like, in the extreme case, their own language.

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

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

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

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

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

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

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

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

00:20:58 ◼   ► write there.

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

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

00:21:07 ◼   ► Now, one is practicality.

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

00:21:12 ◼   ► or something, right?

00:21:14 ◼   ► That's one side of it.

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

00:21:17 ◼   ► ever cross it.

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

00:21:20 ◼   ► you start out, right?

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

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

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

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

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

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

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

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

00:21:54 ◼   ► Who made FMDB? It's just another guy.

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

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

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

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

00:22:10 ◼   ► So that's my take on this whole meta topic.

00:22:15 ◼   ► I'm going to get a meta topic for a metadata topic.

00:22:17 ◼   ► Get it?

00:22:18 ◼   ► I'm double meta.

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

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

00:22:25 ◼   ► But I always do.

00:22:26 ◼   ► Simpsons did it, right?

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

00:22:31 ◼   ► And the path that I've sort of traveled--

00:22:34 ◼   ► and I think a lot of the Perl community

00:22:35 ◼   ► has traveled on the same topic-- is in the beginning,

00:22:43 ◼   ► you've got a way to send SQL queries somewhere,

00:22:46 ◼   ► and that's annoying, and someone writes some nicer way

00:22:48 ◼   ► to wrap that up, and that's nicer,

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

00:22:52 ◼   ► some classes associated with things

00:22:54 ◼   ► that are gonna be associated with tables,

00:22:55 ◼   ► and it's kind of annoying to write all that,

00:22:58 ◼   ► which fields are associated with which columns,

00:23:00 ◼   ► and like Marco was getting to,

00:23:01 ◼   ► how much do I have to write?

00:23:03 ◼   ► After you've done 10 or 20 of those things,

00:23:04 ◼   ► at a certain point you're like,

00:23:05 ◼   ► can I type less and get the same effect?

00:23:07 ◼   ► And then you're like, you know what,

00:23:10 ◼   ► can I type even less?

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

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

00:23:18 ◼   ► stuff for me?"

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

00:23:24 ◼   ► And you can do that in dynamic languages.

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

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

00:23:31 ◼   ► But just don't have anything.

00:23:34 ◼   ► Just inspect the database, figure out the classes, figure out the tables, make your

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

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

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

00:23:55 ◼   ► do to get useful work done.

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

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

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

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

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

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

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

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

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

00:24:36 ◼   ► for performance or scaling reasons that has no bearing whatsoever

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

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

00:24:45 ◼   ► to get your data out of the database,

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

00:24:51 ◼   ► although I hate that term.

00:24:53 ◼   ► You don't tie any of the inner workings of your application

00:24:56 ◼   ► to the structure or storage location

00:24:57 ◼   ► or anything having to do with the stuff in the database.

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

00:25:02 ◼   ► every time you want to get data out of the database

00:25:04 ◼   ► and inflate your values into URL objects and data objects

00:25:08 ◼   ► and do all that nice stuff.

00:25:09 ◼   ► You still want to be able to not have to type

00:25:12 ◼   ► that annoying boilerplate code,

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

00:25:17 ◼   ► "Okay, this is my code that gets the crap

00:25:19 ◼   ► "out of the database.

00:25:20 ◼   ► "This is what's getting created from the data

00:25:22 ◼   ► "in the database."

00:25:23 ◼   ► And those two are pretty much entirely unrelated.

00:25:25 ◼   ► So, and actually, this helps in development too,

00:25:27 ◼   ► because you can mock up the stuff

00:25:28 ◼   ► that you don't have in the database

00:25:30 ◼   ► and other stuff, you can just have text files

00:25:31 ◼   ► and other stuff you can just hard code stuff

00:25:33 ◼   ► or like the rest of your application won't care because it deals with things that have no relation to the storage location or structure of the thing.

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

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

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

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

00:25:55 ◼   ► So make the things that your application deals with look the way they're most convenient for the application to deal with and then have some

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

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

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

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

00:26:18 ◼   ► to get stuff out of the database, that needs metadata.

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

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

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

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

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

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

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

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

00:26:56 ◼   ► when you're an experienced programmer, because you think,

00:26:58 ◼   ► "But I can't, that object can't exist to do that,

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

00:27:02 ◼   ► and this information is from a third table."

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

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

00:27:13 ◼   ► in Perl and in other languages.

00:27:15 ◼   ► And some people, they call it anti-ORM backlash,

00:27:19 ◼   ► because the ORM is the active record phase,

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

00:27:23 ◼   ► and you've done a terrible thing.

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

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

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

00:27:47 ◼   ► I think you're right, though, that there's always

00:27:51 ◼   ► this kind of battle between the objects that

00:27:56 ◼   ► are fully abstracted from the data and the messiness

00:27:59 ◼   ► or the structure of the database.

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

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

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

00:28:16 ◼   ► and in many ways behaves like a database.

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

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

00:28:28 ◼   ► that are very easy to do in a database.

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

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

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

00:28:42 ◼   ► but not letting you say anything about the database.

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

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

00:28:50 ◼   ► we'll just persist that."

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

00:28:56 ◼   ► I have some ideas that you may find interesting."

00:28:58 ◼   ► Right, exactly.

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

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

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

00:29:14 ◼   ► to do some kind of batch, like that kind of thing.

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

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

00:29:24 ◼   ► what will not make them fast.

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

00:29:30 ◼   ► your stuff.

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

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

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

00:29:42 ◼   ► into, and will those be efficient?

00:29:43 ◼   ► And that's like, you would rather just,

00:29:45 ◼   ► you know, look, I know these are gonna,

00:29:46 ◼   ► like some app, I bet applications probably just run like,

00:29:49 ◼   ► you know, three possibly performance critical queries

00:29:51 ◼   ► all the time.

00:29:52 ◼   ► And you just say, look, core data, just do this.

00:29:56 ◼   ► This is all I want.

00:29:57 ◼   ► Everything else, I don't care what you do,

00:29:57 ◼   ► but these are the three essential queries.

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

00:30:01 ◼   ► You don't worry about it.

00:30:02 ◼   ► So like for small applications, that's fine,

00:30:04 ◼   ► but anyone's done a web application.

00:30:06 ◼   ► That's not like they're taking you to core data

00:30:07 ◼   ► with web applications, but at a certain point,

00:30:10 ◼   ► native applications start, they're not web scale,

00:30:13 ◼   ► but the timing is much more critical and the devices are slower.

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

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

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

00:30:29 ◼   ► Exactly, because you have the SQLite on one side, which is

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

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

00:30:41 ◼   ► something like SQLite.

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

00:30:45 ◼   ► I say it the way I say it.

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

00:30:49 ◼   ► Alright, that thing, you have that

00:30:51 ◼   ► on one side and that

00:30:53 ◼   ► doesn't know anything about objects.

00:30:55 ◼   ► About your objects and your code. Like it's totally

00:30:57 ◼   ► just raw. There's no

00:30:59 ◼   ► attempt to even

00:31:01 ◼   ► to even do anything higher level

00:31:03 ◼   ► than just database rows and that's

00:31:05 ◼   ► it.

00:31:07 ◼   ► Then on the other end you have core data, which is

00:31:09 ◼   ► all about the objects and their mappings,

00:31:11 ◼   ► and it doesn't expose anything about the database,

00:31:16 ◼   ► and pretends like the database isn't there,

00:31:17 ◼   ► to you, the user of it.

00:31:19 ◼   ► And so my thing is kind of in the middle.

00:31:23 ◼   ► And I actually do intend to open source this.

00:31:27 ◼   ► I'm writing with the intention of open sourcing it,

00:31:29 ◼   ► and writing it to be a standalone piece so it can be.

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

00:31:35 ◼   ► I do intend to do that, maybe later this fall.

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

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

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

00:31:55 ◼   ► with varying degrees of success, varying degrees of people using it and reporting bugs, and

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

00:32:04 ◼   ► the kind of person who can make one of these model layers

00:32:07 ◼   ► or something like this.

00:32:09 ◼   ► The chances that you're going to be happy enough

00:32:11 ◼   ► with somebody else's to want to just use theirs instead

00:32:14 ◼   ► of making your own is pretty low.

00:32:17 ◼   ► And so for me, I'm doing my own thing

00:32:21 ◼   ► like I usually do, which is sometimes good, sometimes bad.

00:32:27 ◼   ► And so yeah, I'm making this thing

00:32:30 ◼   ► between SQLite and Core Data.

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

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

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

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

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

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

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

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

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

00:33:20 ◼   ► things, writing stuff.

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

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

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

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

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

00:33:47 ◼   ► you know, a bunch of reports that run or a bunch of jobs that do maintenance stuff or the people who write the web front end

00:33:52 ◼   ► or the people who write the native app.

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

00:34:00 ◼   ► And then another set of people dealing with

00:34:03 ◼   ► How that you know idealized view of the product interfaces with the data store back in it because they're gonna constantly have to change it

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

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

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

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

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

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

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

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

00:34:42 ◼   ► other stuff, and you're still sad.

00:34:44 ◼   ► Maybe it's because you actually want that next thing.

00:34:46 ◼   ► Awesome.

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

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

00:34:55 ◼   ► boring topic.

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

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

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

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

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

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

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

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

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

00:35:48 ◼   ► of places and they're pretty rough.

00:35:53 ◼   ► Most of the places are pretty rough.

00:35:55 ◼   ► Hover is to me like a breath of fresh air.

00:35:57 ◼   ► They are just so easy, they're honest.

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

00:36:03 ◼   ► of weird sleazy stuff.

00:36:04 ◼   ► There's no check box on checkout that's like,

00:36:07 ◼   ► "Don't not stop sending me the newsletter

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

00:36:11 ◼   ► They don't try to mislead you,

00:36:13 ◼   ► they don't try to get all sleazy

00:36:15 ◼   ► and get more money out of you.

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

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

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

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

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

00:36:42 ◼   ► prices start at $6 a month per user.

00:36:46 ◼   ► It's really great.

00:36:46 ◼   ► So anyway, go to hover.com/ATP.

00:36:50 ◼   ► You can use promo code ATP to get 10% off.

00:36:54 ◼   ► And you should, of course, you should do that.

00:36:55 ◼   ► I mean, I use Dan's promo codes forever.

00:36:57 ◼   ► You can use ours.

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

00:37:03 ◼   ► Any domain purchase and any service purchase.

00:37:06 ◼   ► Hover's a great company, really.

00:37:07 ◼   ► They even have like, they have no-hold phone service.

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

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

00:37:18 ◼   ► there's a person. It's not a bot.

00:37:20 ◼   ► You don't have to say "representative,"

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

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

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

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

00:37:37 ◼   ► for sponsoring the show.

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

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

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

00:37:55 ◼   ► an iPhone app and also...

00:37:56 ◼   ► Yeah, you can plug it.

00:37:57 ◼   ► That's allowed.

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

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

00:38:07 ◼   ► and pretty.

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

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

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

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

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

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

00:38:32 ◼   ► And that actually uses core data.

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

00:38:41 ◼   ► It's two entities

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

00:38:48 ◼   ► And one of the things I liked so much about it

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

00:38:58 ◼   ► I had to add a

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

00:39:07 ◼   ► Obviously I could have parsed that out whatever the point

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

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

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

00:39:23 ◼   ► Here's what's different about it

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

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

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

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

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

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

00:39:55 ◼   ► Exactly what core data is meant for so I agree with what you're saying that in a lot of ways core data is this really

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

00:40:05 ◼   ► But for me it worked out really, really well.

00:40:07 ◼   ► You could have just used property lists.

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

00:40:14 ◼   ► Because like the volume of data.

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

00:40:18 ◼   ► Like if you're doing like the Core Data demo.

00:40:20 ◼   ► What are you saying, man?

00:40:21 ◼   ► No, I mean like the Core Data part.

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

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

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

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

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

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

00:40:42 ◼   ► I mean, at a certain point it becomes ridiculous.

00:40:45 ◼   ► You're absolutely right.

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

00:40:52 ◼   ► and exercises for myself.

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

00:40:57 ◼   ► I want to see what it's all about.

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

00:41:01 ◼   ► why you're saying that."

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

00:41:07 ◼   ► nicely.

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

00:41:11 ◼   ► and I never bothered to look up what it was.

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

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

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

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

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

00:41:30 ◼   ► CAN text message sender?

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

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

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

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

00:41:51 ◼   ► and take that whole time.

00:41:52 ◼   ► Right, and not just have any competition.

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

00:42:00 ◼   ► like I need that magical idea.

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

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

00:42:12 ◼   ► text messages.

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

00:42:18 ◼   ► It doesn't matter.

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

00:42:22 ◼   ► I can do with that.

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

00:42:31 ◼   ► on day one of iOS 4.

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

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

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

00:42:52 ◼   ► I'm like what say Underscore did with Feed Wrangler.

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

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

00:43:05 ◼   ► and peers have.

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

00:43:10 ◼   ► It's fun.

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

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

00:43:19 ◼   ► competitors?

00:43:20 ◼   ► Are there other applications that do this?

00:43:21 ◼   ► Oh, there certainly are.

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

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

00:43:27 ◼   ► I mean, it's because…

00:43:28 ◼   ► Like, there's no Instapaper of the market.

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

00:43:33 ◼   ► And I've never taken…

00:43:34 ◼   ► The app was not a money-making venture.

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

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

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

00:43:53 ◼   ► hand draw the world's worst icon.

00:43:56 ◼   ► I like it.

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

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

00:44:07 ◼   ► See?

00:44:08 ◼   ► Thank you for not letting me down, John.

00:44:10 ◼   ► No, but you know.

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

00:44:17 ◼   ► application that someone makes and barely makes back its money in developer fees and

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

00:44:28 ◼   ► icon and getting the UI to look nicer.

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

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

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

00:44:44 ◼   ► your application has no reflection on the functionality of your application because

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

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

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

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

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

00:45:08 ◼   ► because those ones will look old and ugly and strange

00:45:12 ◼   ► or whatever.

00:45:13 ◼   ► So that could have been all that separated you from perhaps not

00:45:16 ◼   ► Instapaper-level success, but at the very least,

00:45:21 ◼   ► being in the black instead of the red on Lifetime

00:45:23 ◼   ► for this application is just a nicer icon, a little bit nicer

00:45:26 ◼   ► UI.

00:45:27 ◼   ► Oh, you're absolutely right.

00:45:29 ◼   ► And some screenshots with puppies in them or something.

00:45:33 ◼   ► No, you're absolutely right.

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

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

00:45:41 ◼   ► You did get something in the App Store."

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

00:45:48 ◼   ► know what?

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

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

00:45:55 ◼   ► not to say it's not stable and whatnot and blah, blah, blah.

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

00:46:02 ◼   ► entire pipeline.

00:46:04 ◼   ► And I'm really glad I did it.

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

00:46:11 ◼   ► of a trophy for myself.

00:46:14 ◼   ► Look at what I was able to do.

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

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

00:46:24 ◼   ► crap in iOS 6.

00:46:25 ◼   ► But wait for iOS 7.

00:46:27 ◼   ► It's going to be great.

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

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

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

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

00:46:51 ◼   ► half of, and then I said, "You know what?"

00:46:53 ◼   ► Wait, what's the joke?

00:46:54 ◼   ► What?

00:46:55 ◼   ► I've said this before on other projects.

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

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

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

00:47:07 ◼   ► infringement on Seinfeld, but that's the joke.

00:47:10 ◼   ► Yeah, I don't know.

00:47:11 ◼   ► Have you seen that episode?

00:47:12 ◼   ► Have you heard of Seinfeld's television show?

00:47:13 ◼   ► Wait, the app is called "It Does Other Things"?

00:47:15 ◼   ► Yes.

00:47:16 ◼   ► Have you ever seen Seinfeld?

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

00:47:19 ◼   ► Do you not know that line from a webisode?

00:47:21 ◼   ► I forget what the context was.

00:47:23 ◼   ► Oh, well.

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

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

00:47:31 ◼   ► store.

00:47:32 ◼   ► I bailed out because I saw the writing on the wall.

00:47:36 ◼   ► But I would have liked to have just gotten

00:47:37 ◼   ► through the process.

00:47:38 ◼   ► The reason I don't go through the process

00:47:39 ◼   ► is because, say, I get a working application that

00:47:42 ◼   ► does what I want it to do.

00:47:44 ◼   ► Then I need at least double that amount of time

00:47:47 ◼   ► to work on the icon in the UI.

00:47:49 ◼   ► Because otherwise I'll just obsess over it.

00:47:51 ◼   ► Be like, no, I can't ship this.

00:47:53 ◼   ► It's too boring looking.

00:47:54 ◼   ► And then by that point, 8,000 other typical calculators

00:47:56 ◼   ► have come out, and it's too late.

00:47:58 ◼   ► I would love to see you ship an app of anything.

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

00:48:03 ◼   ► I would just love to see what you consider shippable.

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

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

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

00:48:23 ◼   ► People have opinions, and they offer them on writing.

00:48:26 ◼   ► Writing is much worse than putting out an ad.

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

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

00:48:34 ◼   ► years and years ago.

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

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

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

00:48:49 ◼   ► example of my code."

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

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

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

00:49:01 ◼   ► of how I've grown since I wrote this thing.

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

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

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

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

00:49:16 ◼   ► you know.

00:49:17 ◼   ► That's the easiest way in the door.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

00:50:22 ◼   ► way by making a good app, which is really hard.

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

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

00:50:35 ◼   ► do it.

00:50:36 ◼   ► But that stuff never comes together.

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

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

00:50:44 ◼   ► and you felt at least moderately confident that you could do at least a moderately passable

00:50:49 ◼   ► job.

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

00:50:55 ◼   ► No, not at all.

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

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

00:51:06 ◼   ► If I did it it would be different in these ways

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

00:51:13 ◼   ► A better job do I really want to do it do I have you know it's just you know how much time it takes to make

00:51:17 ◼   ► a real application it's a big

00:51:19 ◼   ► Commitment you're right, so I really it would it would really need to be like something like oh

00:51:22 ◼   ► I've got to make this app like that's it would have to be like that not just simply

00:51:26 ◼   ► "Oh, I think I can make a better one of those," because it just takes so much time.

00:51:31 ◼   ► Any notoriety I might have would encourage me, not discourage me, because all that would

00:51:35 ◼   ► translate to is, "Look, for every tiny point of internet notoriety I have, that is one

00:51:41 ◼   ► extra point on sales possibilities."

00:51:45 ◼   ► It's not fair, but that's the way it works.

00:51:48 ◼   ► If people know who you are to begin with, then they'll know about your application,

00:51:52 ◼   ► at least.

00:51:53 ◼   ► You have such an up with awareness and everything.

00:51:54 ◼   ► Oh, yeah, if you got it, use it.

00:51:56 ◼   ► Yeah, so that, but that, I mean, that wouldn't be the reason I would be doing it, but like,

00:51:59 ◼   ► it just, it would have to be a fire under my butt where like, look, I need, like it

00:52:02 ◼   ► was for you with Bugshot, you're like, I just need this application to exist. And you're

00:52:06 ◼   ► at the point where you can rattle that off in a week, like, I'm not at that point, so

00:52:10 ◼   ► it has to be real, I have to just be like, look, I cannot sleep until I write this application

00:52:14 ◼   ► because my ramp up time would be significant starting from zero, right?

00:52:17 ◼   ► Even that, though, like, yeah, I mean, for me, it was like, I'm an experienced iOS developer,

00:52:21 ◼   ► so it didn't take me that long.

00:52:22 ◼   ► I already knew how to do all this stuff.

00:52:24 ◼   ► The icon even accidentally made itself.

00:52:26 ◼   ► And then even that app, I said,

00:52:29 ◼   ► I will spend a couple of days doing this app.

00:52:32 ◼   ► That's all I can really justify spending on it,

00:52:34 ◼   ► 'cause it's gonna make 20 bucks a day

00:52:36 ◼   ► for the next two years.

00:52:37 ◼   ► So I can't justify doing a whole lot more on this app,

00:52:41 ◼   ► just a few days of work so I can get back to my other stuff.

00:52:44 ◼   ► And a few days became like 10 days.

00:52:48 ◼   ► It was like seven days to build version one,

00:52:50 ◼   ► And then I got a break while it was being approved.

00:52:53 ◼   ► And then within a few days of it being released,

00:52:55 ◼   ► I was working on 1.1 to fix all the bugs

00:52:58 ◼   ► that everyone found, and then to add

00:52:59 ◼   ► a couple of minor enhancements.

00:53:01 ◼   ► And that took a couple more days.

00:53:02 ◼   ► So all in, this is almost two weeks solid for this app.

00:53:07 ◼   ► And I should clarify for Sam the Geek in the chat room,

00:53:12 ◼   ► yeah, it's going to make $20 a day maybe

00:53:15 ◼   ► for the next couple of months.

00:53:17 ◼   ► After that, it might go down further to--

00:53:18 ◼   ► Oh, yeah.

00:53:19 ◼   ► No, he's absolutely right.

00:53:19 ◼   ► Absolutely. This is not a joke and I probably shouldn't share this publicly, but whatever.

00:53:25 ◼   ► I am genuinely excited when I get an app banning email and the number on it is anything more

00:53:29 ◼   ► than zero. That's like awesome. I just sold something to someone. That's really exciting.

00:53:36 ◼   ► So, 20 bucks a day is nothing to shake your fist at. I know you said that jokingly, but

00:53:39 ◼   ► that is nothing to shake your fist at.

00:53:40 ◼   ► No, that's not a joke. I mean, like when I made nursing clock last year, the breastfeeding

00:53:46 ◼   ► timer. I released that and even that took a little bit longer than I thought it would.

00:53:51 ◼   ► Even the nap that had almost no effort into it at all. That took like a few days to really

00:53:55 ◼   ► polish it and make it releasable in any shape. And even that, over its entire life, it made

00:54:00 ◼   ► I think $70. I mean it wasn't a whole lot. And I even ended up pulling it down after

00:54:08 ◼   ► I think about six months or so because there was a, somebody had tipped me off, there was

00:54:13 ◼   ► a patent troll going around suing or threatening to sue people who made childcare related apps

00:54:20 ◼   ► and even though mine was not, wouldn't have applied, or the patent wouldn't have applied,

00:54:26 ◼   ► we all know that doesn't really matter. And so I just, I'm like, you know what, this app

00:54:30 ◼   ► has made like $70 in six months, it's not even worth the risk of having a patent troll

00:54:35 ◼   ► come after me. So I just pulled it down.

00:54:38 ◼   ► - Patents fostering innovation.

00:54:39 ◼   ► Exactly. We should get to that actually. But first, let me tell you about our second sponsor.

00:54:43 ◼   ► Our second sponsor this week is a new sponsor, but you might have heard of them recently

00:54:47 ◼   ► on other awesome shows and blogs. They are 23andMe. So, 23andMe, it's a pretty cool service.

00:54:54 ◼   ► It's a little hard to explain, but here's the gist of it. They are a DNA profiling service.

00:55:04 ◼   ► And so, here's what you do.

00:55:06 ◼   ► You give them a, basically, they send you a kit,

00:55:11 ◼   ► you give them a saliva sample,

00:55:13 ◼   ► and you don't have to poke your arm or anything,

00:55:15 ◼   ► there's no blood involved.

00:55:16 ◼   ► You give them a saliva sample,

00:55:17 ◼   ► you send it back and they provide a return package,

00:55:19 ◼   ► the lab analyzes it, and then it gives you a full report

00:55:23 ◼   ► about stuff about you.

00:55:26 ◼   ► So, here's the gist of it.

00:55:28 ◼   ► They gave you the tools to better understand

00:55:30 ◼   ► how your genes may impact your health.

00:55:32 ◼   ► So this helps you and your doctor find health areas to keep an eye on.

00:55:37 ◼   ► They have over 240 personalized health, trait, and ancestry reports.

00:55:42 ◼   ► And they can help you understand your genetics.

00:55:44 ◼   ► So they give you ancestry information.

00:55:46 ◼   ► You can discover your global origin.

00:55:48 ◼   ► You can find, like, if you have any celebrity relatives, they will give you a list of celebrities

00:55:53 ◼   ► that are distant relatives of yours.

00:55:54 ◼   ► You can also find other living relatives through their analysis.

00:56:00 ◼   ► They have over a quarter million members.

00:56:02 ◼   ► So this makes it the largest DNA ancestry service in the world.

00:56:05 ◼   ► And so the chances of them finding something cool about you are pretty good.

00:56:09 ◼   ► So anyway, it includes a few fun points to tell you how closely related you are to Neanderthals.

00:56:19 ◼   ► They even can tell why you may not like cilantro.

00:56:22 ◼   ► There's a gene for that.

00:56:24 ◼   ► They can tell you how quickly you metabolize coffee, which of course is cool for me to

00:56:29 ◼   ► know.

00:56:31 ◼   ► So anyway, you can order your 23andMe DNA kit today for just $99 at 23andme.com/ATP.

00:56:39 ◼   ► That's 23andme, the number 23, and then the words andme.com/ATP.

00:56:46 ◼   ► Check it out.

00:56:47 ◼   ► It's pretty cool and just a really great way for, you know, just to take a look at your

00:56:52 ◼   ► DNA and learn some cool stuff about yourself.

00:56:55 ◼   ► So thanks a lot to 23andMe for sponsoring the show.

00:56:59 ◼   ► What is the avocado—asparagus pea smell gene?

00:57:03 ◼   ► Is that a genetic thing, or is that not genetic?

00:57:05 ◼   ► I think that's everybody.

00:57:06 ◼   ► No.

00:57:07 ◼   ► I mean, it's just—

00:57:08 ◼   ► I think you'd have to eat a lot of asparagus.

00:57:10 ◼   ► What I heard from third hand was that it was genetically related, and that the people with

00:57:16 ◼   ► the gene made their pee smell, and they could smell it.

00:57:20 ◼   ► And people without the gene, their pee did not smell, and they couldn't smell it, but

00:57:24 ◼   ► other people smell like pee.

00:57:25 ◼   ► I thought it was that the pee always smells, but only some people can smell it.

00:57:31 ◼   ► I don't know.

00:57:32 ◼   ► I know nothing about it.

00:57:33 ◼   ► See, this is terrible.

00:57:34 ◼   ► Oh, here we go.

00:57:35 ◼   ► Here we go.

00:57:36 ◼   ► 23andme.com/health/asparagusmetabolitedetection.

00:57:37 ◼   ► Of course they would know this.

00:57:39 ◼   ► 23andme has got it covered, and it is genetic, apparently.

00:57:46 ◼   ► That's awesome.

00:57:47 ◼   ► Erin is a biology teacher.

00:57:48 ◼   ► I could have asked her if she was home at the moment, but she is not.

00:57:52 ◼   ► Oh, good thing 23andMe didn't let us down.

00:57:55 ◼   ► Awesome.

00:57:56 ◼   ► Anyway, thanks for sponsoring.

00:57:58 ◼   ► All right, so what else are we talking about?

00:58:01 ◼   ► Do you want to talk about Ask Patents at all?

00:58:04 ◼   ► I do.

00:58:05 ◼   ► John, go for it.

00:58:07 ◼   ► Yeah, so this was a Stack Exchange site that was made months and months ago, wasn't it?

00:58:12 ◼   ► Like maybe last year?

00:58:13 ◼   ► Yeah, a while ago.

00:58:14 ◼   ► A long time ago.

00:58:15 ◼   ► It was the brainchild of Joel Spolsky and the Stack Exchange guys in cooperation with

00:58:21 ◼   ► the US patent office, I believe, even from the get-go.

00:58:24 ◼   ► It's a Stack Exchange site, like StackOverflow or whatever,

00:58:27 ◼   ► you ask questions or whatever.

00:58:28 ◼   ► But this one is meant to collaboratively find

00:58:31 ◼   ► prior art for patents.

00:58:33 ◼   ► So someone will post a patent, and then other people

00:58:35 ◼   ► will try to look at prior art for it and post it as the answer.

00:58:38 ◼   ► So basically, the implied question to all of them

00:58:40 ◼   ► is, here's a patent.

00:58:41 ◼   ► Is there some prior art?

00:58:42 ◼   ► And then anyone can post an answer, like, oh, here's

00:58:45 ◼   ► some prior art for this, or whatever.

00:58:46 ◼   ► And the goal of the site was to be like, OK, well, we all

00:58:50 ◼   ► know these patents are stupid and trying to patent things that shouldn't be patentable,

00:58:54 ◼   ► but it's really difficult, apparently, for the US Patent Office to do the research necessary

00:58:58 ◼   ► to find the prior art. Even though, when we look at it, can you just call up a graphics

00:59:04 ◼   ► programmer and ask them and they'll tell you the eight times? Anyway. And so that's how

00:59:09 ◼   ► this was supposed to work.

00:59:10 ◼   ► And finally, I think this was their very first confirmed case where a patent was posted,

00:59:16 ◼   ► found an answer and the patent was invalidated.

00:59:19 ◼   ► And in the invalidation of the patent by the person in the US Patent Office, they cited

00:59:23 ◼   ► directly this answer on this site.

00:59:25 ◼   ► And Joel did the answer, and Joel said it took him like 10 minutes of Googling to find

00:59:28 ◼   ► prior-- because again, it's not hard to find prior art for these things, because the patents

00:59:31 ◼   ► are awful, right?

00:59:32 ◼   ► So Joel wrote a story called "Victory Lap for Ask Patents," describing the sequence

00:59:37 ◼   ► events and saying basically, look, this took me 10 minutes of Googling.

00:59:40 ◼   ► If you hate patents and you're a software developer or whatever, come onto our site,

00:59:44 ◼   ► a patent that you think is stupid, Google for a prior art, paste it in there, and wait

00:59:49 ◼   ► for the incredibly slow wheels of government to turn, and six months later, maybe that

00:59:54 ◼   ► patent will get invalid.

00:59:55 ◼   ► And of course, this is a Microsoft patent and they're appealing, so who knows how it

00:59:58 ◼   ► will end up coming out.

00:59:59 ◼   ► But the interesting bit, this that I pasted into the show notes, is that Joel says that

01:00:04 ◼   ► his dream is that companies will hear about this site and use it offensively against other

01:00:09 ◼   ► companies.

01:00:10 ◼   ► Because if like Apple or Google or whatever dedicates like one or two people to just go

01:00:13 ◼   ► on that site and look for patents that Google is applying for and spend 10 minutes to go

01:00:19 ◼   ► find prior art for them, that it will become like—you know, so patents are sort of defensive

01:00:23 ◼   ► where they patent—every company patents everything they can because it's good to

01:00:25 ◼   ► have a big patent portfolio.

01:00:26 ◼   ► But if each company also had an offensive wing, all they did was watch their competitors

01:00:30 ◼   ► and watch for the super-dumb patents that they apply for and then invalidate them all

01:00:34 ◼   ► by finding prior art, that would be a good sort of mutually assured destruction scenario

01:00:39 ◼   ► where large companies prevent each other from having terrible patents.

01:00:44 ◼   ► Of course, this is not the actual solution.

01:00:45 ◼   ► The actual solution would be, maybe the US Patent Office could do this work, because

01:00:49 ◼   ► it doesn't seem like it's that hard.

01:00:50 ◼   ► It takes 10 minutes of googling.

01:00:51 ◼   ► And of course, my position is that no patent should exist ever for anything.

01:00:55 ◼   ► But anyway, every little bit counts.

01:00:58 ◼   ► So I'm excited that at least one patent has been, at least, if not permanently thwarted,

01:01:03 ◼   ► then possibly delayed on its trip to being a super dumb patent.

01:01:09 ◼   ► So good job Joel and the Stack Exchange guys.

01:01:11 ◼   ► Yeah, it's so cool this thing that Ask Patents even exists and that the USPTO kind of encouraged

01:01:18 ◼   ► it or at least is being friendly with it.

01:01:22 ◼   ► There is of course, you know, there's that great question of, you know, Joel is a programmer

01:01:28 ◼   ► and he could look at this stuff from this Microsoft patent that he cited and, you know,

01:01:32 ◼   ► any others that you look on there and he said like, you know, he assumed going into this

01:01:36 ◼   ► that it would be pretty hard to read patents

01:01:39 ◼   ► and to figure out what they are and to invalidate them,

01:01:41 ◼   ► but in fact, once he started trying to do it,

01:01:43 ◼   ► that it was easier than he expected.

01:01:45 ◼   ► And that it only takes a few minutes to read a patent,

01:01:49 ◼   ► and he linked to a post, maybe he linked to it too,

01:01:50 ◼   ► about how to read a patent in 60 seconds.

01:01:53 ◼   ► 'Cause they all try to be very obfuscated

01:01:56 ◼   ► to try to get granted and try to get past

01:01:59 ◼   ► any potential conflicts or duplicates

01:02:01 ◼   ► or to try to become more overreaching

01:02:04 ◼   ► than they otherwise would have.

01:02:05 ◼   ► Like, they go for obfuscation to attempt to confuse the patent examiners.

01:02:13 ◼   ► So the problem is, you know, if one working programmer -- and granted, Joel is a good

01:02:18 ◼   ► and knowledgeable programmer, but still, if one programmer can look at a patent application

01:02:23 ◼   ► and kind of see through it that quickly, why doesn't the patent office -- why can't they

01:02:31 ◼   ► do something similar?

01:02:32 ◼   ► Why, like, if they can say, "Yeah, we can have patents on graphics programming techniques,"

01:02:38 ◼   ► why can't they either have or contract with graphics programmers to look at any graphics-related

01:02:44 ◼   ► patents?

01:02:45 ◼   ► Like, that, it's just, I'm really glad that AskPatents exists, and obviously it needs

01:02:49 ◼   ► to exist, but why it needs to exist is kind of a problem.

01:02:53 ◼   ► Because it's a government agency, and they don't have infinite hiring money, you can't

01:02:57 ◼   ► pay a graphics programmer or any of that.

01:02:59 ◼   ► outsourcing the part that can't be done at scale because there's a limited number of

01:03:05 ◼   ► patent employees. Those employees only know about patents and know nothing about the domain

01:03:10 ◼   ► areas. And by the same token, Joel could not have written that ridiculous document that

01:03:17 ◼   ► codifies the rejection of the patent. Joel could not have written that because that requires

01:03:22 ◼   ► the lawyer-like expertise of the people in the patent office to know what form you have

01:03:26 ◼   ► to do things and what is a valid rejection and what must you like. That's the skill that they're

01:03:31 ◼   ► bringing to the table, you know, that to be able to navigate this legal, just like lawyers, like,

01:03:36 ◼   ► you know, you may have an intuitive feel of, you know, what's right and wrong and how to prove

01:03:42 ◼   ► things. But if you're not a lawyer, you don't know how to actually do it, right? So this is just

01:03:47 ◼   ► finding people like, "Look, you find me the prior art, and then the US Patent Office says, 'We'll

01:03:50 ◼   ► take it from here.' So you did that part of the work for us. We'll take that and probably spend

01:03:55 ◼   ► ten times as much time doing this stupid legalese dance in this formal document structure to

01:04:00 ◼   ► reject the patent and bring it through all this bureaucratic-- I mean, just try clicking

01:04:04 ◼   ► through to that rejection.

01:04:05 ◼   ► He's like-- he explains how to find the rejection.

01:04:07 ◼   ► And it's like, the preliminary draft rejection finalized form.

01:04:11 ◼   ► Like, try to read it.

01:04:12 ◼   ► It just, you know, you cannot penetrate even the rejection of the patent, let alone the

01:04:17 ◼   ► patent itself.

01:04:18 ◼   ► And that "how to read a patent in 60 seconds" is good because it tells you, "Just ignore

01:04:20 ◼   ► everything and go right to this section and look at these three things, and that's enough

01:04:23 ◼   ► for you to get going."

01:04:25 ◼   ► It's a broken, stupid bureaucratic system that doesn't work right.

01:04:30 ◼   ► This does not make it better.

01:04:31 ◼   ► This doesn't cure it.

01:04:32 ◼   ► But if anything that stops crappy patents from getting granted is a good thing.

01:04:39 ◼   ► This was just the community trying to make government better, maybe not against their

01:04:45 ◼   ► will, but certainly like, "Look, we're here to help you in government saying, 'Okay,

01:04:48 ◼   ► we will accept your help in this matter,'" and then it producing at least one actual

01:04:53 ◼   ► result.

01:04:54 ◼   ► Well, it's a brilliant idea if people are into it, but it seems to me that it's tough

01:05:00 ◼   ► to get people into it.

01:05:01 ◼   ► Said differently, here it is that the patent office is sort of kind of reaching out to

01:05:06 ◼   ► the community and saying, "Hey, people who are experts in these things that patents are,

01:05:12 ◼   ► go help us find this prior art."

01:05:13 ◼   ► But the key is that we're experts.

01:05:16 ◼   ► Joel is an expert, or at least you could easily argue as such.

01:05:20 ◼   ► And I don't know how the patent office works internally, but I've got to imagine they don't

01:05:23 ◼   ► have an expert for every darn field of patentable stuff under the sun.

01:05:29 ◼   ► And so it strikes me as a brilliant idea, but I'm not sure that when I get bored on

01:05:35 ◼   ► a weekday evening night, I'm going to sit there cruising for patents to shoot down.

01:05:38 ◼   ► Well, I mean, but Joel's got the right idea.

01:05:40 ◼   ► He says, like, who is actually sufficiently motivated to use this site?

01:05:45 ◼   ► And who's sufficiently motivated are the companies who get patents, because they have a financial

01:05:49 ◼   ► incentive to prevent—Apple has a financial incentive to make every single patent Google

01:05:54 ◼   ► files be invalidated, right? And vice versa, Google has that same motiva—you know, so

01:05:59 ◼   ► if you can get these big companies with tons of money to put even a few people on this,

01:06:03 ◼   ► it's so easy to do, because you're going to be invalidating patents in a domain that you know

01:06:07 ◼   ► about. Apple probably knows about the domains that Google's going to file patents in and vice

01:06:10 ◼   ► versa, because they're both in the same industry. Get all these guys to, instead of spending all

01:06:14 ◼   ► their energy patenting everything under the sun, take part of their energy, because now they

01:06:19 ◼   ► Now suddenly they have an influence.

01:06:20 ◼   ► It used to be you had no way to get your other guys' patents invalidated.

01:06:23 ◼   ► You had to wait for them to be granted or rejected, and then you could try to invalidate

01:06:26 ◼   ► them in court.

01:06:27 ◼   ► Whereas now, if the patent office is like, "Look, we're willing to accept some help here.

01:06:32 ◼   ► This patent has been applied for.

01:06:34 ◼   ► Here's the application," and Apple goes out and finds prior art and heads it off of the

01:06:38 ◼   ► past?

01:06:39 ◼   ► I don't know if those companies are actually going to do that, but they are the ones who

01:06:42 ◼   ► have both the motivation and the skill to do this.

01:06:46 ◼   ► I think it would be a great idea because I hate all patents.

01:06:49 ◼   ► Like I said, another thing that would cure this whole problem is just to eliminate the

01:06:52 ◼   ► entire patent system and office and all the employees and all the legal framework and

01:06:56 ◼   ► everything involved with it.

01:06:57 ◼   ► That would also cure this problem and is the actual solution.

01:07:01 ◼   ► That would actually promote innovation.

01:07:03 ◼   ► People don't want to hear that.

01:07:04 ◼   ► But anyway, you don't want to hear that, that's fine.

01:07:07 ◼   ► We'll start with this.

01:07:08 ◼   ► This would be fine too.

01:07:09 ◼   ► John, both you and I, I believe, separately argued on our respective 5x5 podcast a couple

01:07:13 ◼   ► of years ago.

01:07:14 ◼   ► I think we both argued that basically the entire patent system should be abolished.

01:07:20 ◼   ► Is that fairly accurate?

01:07:21 ◼   ► Yep.

01:07:22 ◼   ► Yep.

01:07:23 ◼   ► Yeah.

01:07:24 ◼   ► I mean, the fact that all this stuff is necessary is...

01:07:29 ◼   ► And I think what bothers me about it, not to go too deep into whether the patent system

01:07:34 ◼   ► should exist or not, because that would be a whole other show, but I think what bothers

01:07:38 ◼   ► me so much about it is, like, this is...

01:07:41 ◼   ► It's a problem that just cannot be solved well.

01:07:44 ◼   ► Like it is just so, like, yeah, the patent office can't be expected to get everything

01:07:49 ◼   ► right, but they get things wrong a lot.

01:07:53 ◼   ► And the ramifications of that in the market are so incredibly destructive.

01:07:58 ◼   ► I mean, it, like, whatever benefit patents are providing to people, I have to imagine

01:08:05 ◼   ► there's an equal or greater amount of harm that they're causing, especially in the field

01:08:09 ◼   ► of software.

01:08:11 ◼   ► And it just seems like there's just no good solution to this.

01:08:14 ◼   ► But I am very glad that ATHP patents is at least attempting to—it is improving it in

01:08:22 ◼   ► one small way.

01:08:23 ◼   ► Yeah, and my objection was less practical, more ideological.

01:08:26 ◼   ► I don't think there's any reason you should have monopoly rights to an idea, period.

01:08:29 ◼   ► Like, it's not as if like, you know, what if the patent office was perfect and never

01:08:33 ◼   ► made a mistake?

01:08:34 ◼   ► There's no such thing.

01:08:35 ◼   ► There is no right—as far as I'm concerned, you get no right to a monopoly on an idea

01:08:41 ◼   ► that you come up with, no matter how awesome that idea is, period, the end.

01:08:44 ◼   ► And so if that's your position, that's my position, obviously there's no such thing

01:08:48 ◼   ► as a patent office that works. It's an office that the only way it works is to not exist

01:08:53 ◼   ► because it's enforcing a right that I don't think is a valid thing that you should, you know,

01:08:58 ◼   ► you shouldn't get a monopoly on an idea. You shouldn't ever, the end.

01:09:01 ◼   ► But, you know, there's a huge continuum down to the pragmatic concern of like, okay, I think you should,

01:09:05 ◼   ► but it's impossible to do correctly, therefore it should be gone, all the way up to like,

01:09:08 ◼   ► to like, "Oh, I think it should be gone for software because there's no such thing as

01:09:11 ◼   ► a software patent because it's all math and everything's turned complete and blah, blah,

01:09:15 ◼   ► blah."

01:09:16 ◼   ► And business process patent shouldn't exist and a whole big range.

01:09:18 ◼   ► When I talked about it on my show, I went to write for the jugular, which is like patents

01:09:23 ◼   ► on drugs, which everyone thinks, "All right, you can get rid of all the other patents,

01:09:25 ◼   ► but we need these because otherwise no one will ever do any research into how to cure

01:09:28 ◼   ► disease."

01:09:29 ◼   ► And I talked about it at length there.

01:09:30 ◼   ► We should rehash it here.

01:09:32 ◼   ► But anyway, patents are terrible.

01:09:34 ◼   ► Don't let your kids get them.

01:09:36 ◼   ► [laughter]

01:09:37 ◼   ► Alright, does that mean we're done? That seems like a pretty good place to end to me.

01:09:42 ◼   ► Yeah, I think so. Alright, well thank you very much to our two sponges this week, Hover

01:09:47 ◼   ► and 23andMe, and we'll see you guys soon.

01:09:49 ◼   ► [music]

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

01:09:59 ◼   ► Accidental.

01:10:00 ◼   ► Oh, it was accidental.

01:10:02 ◼   ► Accidental.

01:10:03 ◼   ► John didn't do any research, Margo and Casey wouldn't let him

01:10:08 ◼   ► 'Cause it was accidental (it was accidental)

01:10:11 ◼   ► It was accidental (accidental)

01:10:13 ◼   ► And you can find the show notes at ATP.fm

01:10:18 ◼   ► And if you're into Twitter, you can follow them

01:10:23 ◼   ► @C-A-S-E-Y-L-I-S-S

01:10:27 ◼   ► So that's Casey Liss M-A-R-C-O-A-R-M

01:10:32 ◼   ► ♪ Anti-Marco Armin, S-I-R-A-C, U-S-A-C-R-A-Q-S-A ♪

01:10:39 ◼   ► ♪ It's accidental, accidental ♪

01:10:42 ◼   ► ♪ They didn't mean to ♪

01:10:45 ◼   ► ♪ Accidental, accidental ♪

01:10:47 ◼   ► ♪ Tech podcast so long ♪

01:10:52 ◼   ► Uh, I just sold something to someone.

01:10:54 ◼   ► I thought that was funny.

01:10:55 ◼   ► If you're gonna make fun of me, I think that's a much less jerky way of doing it.

01:11:00 ◼   ► Because that was me talking about how excited I am that whenever I see a singular sale of

01:11:04 ◼   ► fast text.

01:11:05 ◼   ► Someone trying to do a JavaScript injection.

01:11:08 ◼   ► I appreciate that they put the semicolon at the end of their statement.

01:11:12 ◼   ► They won't stand for that JavaScript automatic semicolon insertion.

01:11:15 ◼   ► Say, "No, I'm going to put it explicitly so it's not confused."

01:11:19 ◼   ► And yes, the people who wrote this Showbot application have minimal competence of web

01:11:23 ◼   ► programmers.

01:11:26 ◼   ► Escape their input, which is not...

01:11:28 ◼   ► It's probably still 50/50.

01:11:30 ◼   ► Given all the websites that I see that won't let me type telephone numbers with hyphens

01:11:34 ◼   ► in them.

01:11:35 ◼   ► Apparently, the bar has still not been raised.

01:11:38 ◼   ► How about American Express, where the maximum character length for a password is, I think,

01:11:44 ◼   ► still eight?

01:11:45 ◼   ► Well, that's probably dictated by their COBOL-based mainframe interface or something,

01:11:50 ◼   ► but the guys who don't let you type stuff with the phone numbers, like they want you

01:11:54 ◼   ► to only type digits, you can't type anything else.

01:11:57 ◼   ► I just want to go to all their houses and find them and be like no one is making you do this like this

01:12:03 ◼   ► This is literally the simplest possible task that a programmer on the web has it is completely closed

01:12:10 ◼   ► there are no edge cases all you got to do is just

01:12:13 ◼   ► Let me type whatever I want remove everything except the numbers

01:12:16 ◼   ► It's not rocket science like no no task is easier than that every other part of accepting that form submission is harder than that one

01:12:22 ◼   ► task. And yet, big Fortune 500 companies will have forms that don't let you type anything

01:12:27 ◼   ► except numbers in them. And will beep at you, put alerts, automatically backspace the field.

01:12:31 ◼   ► The automatic backspacing code, that's more complicated than stripping out the stuff.

01:12:35 ◼   ► It boggles my mind that this goes on. And I wonder what regular people think who don't

01:12:39 ◼   ► know that is literally the easiest thing in the entire world of web programming to do.

01:12:43 ◼   ► They're just like, "Oh, I guess you have to do this when I'm on the site. It must be really

01:12:47 ◼   ► secure."

01:12:48 ◼   ► So let me tell you a true story that we cannot put in the show because it's really embarrassing,

01:12:52 ◼   ► which means it's probably doomed to be in the show.

01:12:54 ◼   ► When I, Aaron and I were getting married,

01:12:56 ◼   ► I wrote in PHP, and I think it was my first PHP app,

01:12:59 ◼   ► I wrote a website that would let guests register,

01:13:04 ◼   ► or RSVP among other things.

01:13:07 ◼   ► And a good friend of mine,

01:13:08 ◼   ► his surname has an apostrophe in it,

01:13:10 ◼   ► and I noticed after he registered,

01:13:12 ◼   ► because I had this like totally weirdo setups,

01:13:15 ◼   ► where I would email my phone to send my phone

01:13:18 ◼   ► a text message back when that was still a thing.

01:13:20 ◼   ► Well anyways, so he registered and all of a sudden everything was cut off as soon as

01:13:24 ◼   ► I hit the apostrophe in his name because I didn't escape anything, because I didn't

01:13:28 ◼   ► know crap about web programming at the time.

01:13:29 ◼   ► In fact, I taught myself SQL in order to write that site.

01:13:32 ◼   ► This was in 2007, because I was always living in thick client land until then.

01:13:37 ◼   ► This is like people who don't learn from the past.

01:13:39 ◼   ► I remember the first time I looked at the active record code in Rails and I was like,

01:13:43 ◼   ► "Jesus, guys, like, find parameters.

01:13:45 ◼   ► The technology that has existed since forever."

01:13:48 ◼   ► and you're like, "We're going to make SQL by catting together strings and just inline

01:13:55 ◼   ► all the values. What could go wrong? We have an escaping function. It should be fine, right?"

01:14:00 ◼   ► Jesus.

01:14:01 ◼   ► Wait, that's how they were doing it?

01:14:03 ◼   ► I believe the first version of Rails was not using bind parameters in their queries. They

01:14:08 ◼   ► would build the SQL strings out of values.

01:14:11 ◼   ► Oh my god.

01:14:12 ◼   ► I believe they had an escaping function of their own devising, which would be like, "Oh,

01:14:16 ◼   ► you see. It's a quote, just double it or whatever. If this wasn't ActiveRecord and I'm slagging

01:14:22 ◼   ► off Rails when I shouldn't be, I'm sorry. But substitute Rails with any other type of

01:14:28 ◼   ► thing. I see it all the time of people who write database code in the modern era, like

01:14:33 ◼   ► in this year, and don't know that bind parameters exist and just bravely plow forward.

01:14:38 ◼   ► Casey didn't know that escaping was a thing you might want to do. But for the people who

01:14:43 ◼   ► That, I find more excusable than the people who know that you have to escape.

01:14:47 ◼   ► So they write their own escaping function, and they still feel like this is the best

01:14:50 ◼   ► way to do it.

01:14:51 ◼   ► Once you know it's a problem, you would think you'd spend three seconds Googling

01:14:54 ◼   ► like, "Oh, I see this is a problem, and there's a name for it, and I bet there's

01:14:57 ◼   ► some sort of technique to not have it anymore.

01:15:01 ◼   ► Let me look that up."

01:15:02 ◼   ► The other favorite one is that people, "Well, this is not an any-year language."

01:15:06 ◼   ► Maybe it kind of is.

01:15:07 ◼   ► Do you find, have either one of you ever, I don't know if this is a .NET equivalent,

01:15:12 ◼   ► But like Marco, when you're things, you can't even do this on iOS probably.

01:15:15 ◼   ► You know the system call, the word system?

01:15:17 ◼   ► Open, close, parenthesis.

01:15:18 ◼   ► Yeah, where it just shells out to the end of the day.

01:15:19 ◼   ► Right.

01:15:20 ◼   ► Have you ever had to do that for an iOS program, or is that just not going to happen on iOS?

01:15:22 ◼   ► I don't think you can do it on iOS.

01:15:23 ◼   ► I'm not sure.

01:15:24 ◼   ► It's probably forbidden.

01:15:25 ◼   ► But at any rate, people who do that, they'll use bind parameters on their SQL code, but

01:15:32 ◼   ► they'll come do a part in their program.

01:15:34 ◼   ► Apple itself probably does it, or people writing Mac apps back in the pre-sandboxing days.

01:15:38 ◼   ► they'll build a string, and they'll pass that string to system.

01:15:42 ◼   ► And when you're building that string, what do you have to do?

01:15:43 ◼   ► Well, you're like, "Oh, what if the file name has spaces in it?

01:15:45 ◼   ► Well, let me put quotes in it.

01:15:46 ◼   ► What if the file name has quotes in it?

01:15:47 ◼   ► Let me write an escaping function."

01:15:48 ◼   ► They go through the same thing, and it's like, people, you're in C. There's a million functions

01:15:53 ◼   ► that you can use to fork an exec to take lists of variable, VA list methods to take a variable

01:16:00 ◼   ► list of parameters.

01:16:01 ◼   ► You don't need the shell to parse it for you.

01:16:02 ◼   ► Don't you understand?

01:16:03 ◼   ► You can bypass that.

01:16:04 ◼   ► You're already in a program.

01:16:05 ◼   ► You're a programmer.

01:16:06 ◼   ► You can write code.

01:16:07 ◼   ► I mean, Apple itself does it, and they're Perl stuff, and you're like, "Oh, if your

01:16:13 ◼   ► hard drive name has a space in it, and you have one that has the same name without the

01:16:17 ◼   ► prefix before the space, it will accidentally delete it."

01:16:20 ◼   ► Was it iTunes installer that did that?

01:16:23 ◼   ► Maybe it was the Myth 2 installer.

01:16:24 ◼   ► Apple at various times has done the same.

01:16:26 ◼   ► It's the same exact problem.

01:16:27 ◼   ► It's the sequel thing.

01:16:28 ◼   ► They're like, "I will just build a big, long string and pass it through.

01:16:31 ◼   ► What could go wrong?"

01:16:35 ◼   ► you have is a list of values, and they said, "Yeah, but every time I see this list of

01:16:39 ◼   ► values in my normal life, it's one big long string, so I'll make it into a string and

01:16:43 ◼   ► then give it to something that will break it into the list that I already had before

01:16:45 ◼   ► I made the string." It's just, yeah. I don't know. We're supposed to make progress.

01:16:53 ◼   ► Certain areas, we have to make progress not by teaching people the right way to do things,

01:16:56 ◼   ► but by making it so they never have to do that thing again.

01:16:59 ◼   ► John, I love when you get fired up after the show.

01:17:05 ◼   ► Oh, that's my favorite.

01:17:06 ◼   ► No, I didn't.

01:17:07 ◼   ► I still didn't even get to talk about Minecraft mods.

01:17:10 ◼   ► Someday.

01:17:11 ◼   ► Don't even start.

01:17:12 ◼   ► Don't even start.

01:17:13 ◼   ► That's good.

01:17:14 ◼   ► I'm going to be angry.

01:17:15 ◼   ► I'm trying to mellow out.

01:17:16 ◼   ► No!

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

01:17:18 ◼   ► No!

01:17:19 ◼   ► Don't mellow out.

01:17:20 ◼   ► Don't get talked about.

01:17:21 ◼   ► Let's talk about titles.

01:17:22 ◼   ► I don't want to talk about it.

01:17:23 ◼   ► Before the next show, or whenever that may be, YouTube should be forced to install Minecraft

01:17:29 ◼   ► in several mods on behalf of, if you don't, neither one of you has a child of the age

01:17:33 ◼   ► who can play Minecraft, maybe just like borrow one for the weekend and have them ask you

01:17:37 ◼   ► to install Minecraft and the mods that they want.

01:17:40 ◼   ► And just spend the weekend doing that, then you will also be sufficiently angry for us

01:17:44 ◼   ► to have an all Minecraft mod anger episode after vacation.

01:17:48 ◼   ► If I get bored while I'm on vacation, I will do exactly that.

01:17:52 ◼   ► Find a neighborhood kid.

01:17:53 ◼   ► Go, "Come over to my house!"

01:17:55 ◼   ► And then ask me to install Minecraft mods.

01:17:58 ◼   ► That's not creepy at all.

01:17:59 ◼   ► Well, maybe have your wife do it.

01:18:01 ◼   ► That's what we do.

01:18:03 ◼   ► I get in touch with your wives and say,

01:18:05 ◼   ► "Just pretend you're into Minecraft."

01:18:07 ◼   ► And ask Margot, "Hey, I saw this cool thing.

01:18:09 ◼   ► Could you install Minecraft in these couple of mods for me?"

01:18:11 ◼   ► Because when your wife asks you to, it's just as bad.

01:18:13 ◼   ► Although I don't know if it's believable that they'd want to play Minecraft.

01:18:15 ◼   ► Because it's more of a kid thing.

01:18:17 ◼   ► Actually, Tiff tried it.

01:18:19 ◼   ► I've never played Minecraft.

01:18:21 ◼   ► Nor have I.

01:18:23 ◼   ► But Tiff actually played it for like one night.

01:18:25 ◼   ► And just didn't really like it that much.

01:18:27 ◼   ► really like it that much, but she did play it for one night like a few, like a month

01:18:30 ◼   ► ago or something like that. But I don't know, I'm really, I'm kind of scared. You know,

01:18:35 ◼   ► like I don't have to try heroin to know that I probably should never try heroin. Right?

01:18:40 ◼   ► Like so, and I know enough about like hard drugs and their addictiveness to know that

01:18:46 ◼   ► I should never even attempt them. And I'm fine with that.

01:18:49 ◼   ► Now is this the heroin clause or is this the TMD crush clause?

01:18:53 ◼   ► Well it's both. So same thing. So like when I hear that a game is like super addictive

01:18:56 ◼   ► and takes over people's lives. I don't have to play it. I'm not like, "Ooh, let me try

01:19:02 ◼   ► that." No, I'm like, "You know what? I don't really need that."

01:19:04 ◼   ► Well, why don't you pass that wisdom on to your wife?

01:19:06 ◼   ► Well, I did. I scared her away with, oh man, Candy Crush. So, quick story. So, Tiz's phone

01:19:16 ◼   ► had—it's an iPhone 5, and it had a failing sleep/wake button, which I guess is a very

01:19:20 ◼   ► common problem. And so, I took it to the Apple people, and they swapped it. And so, great,

01:19:25 ◼   ► come back with a new phone. And we backed it up and did the whole sync locally to iTunes

01:19:30 ◼   ► like that morning. Every app, all the music, all the photos, the entire keychain,

01:19:37 ◼   ► everything restored perfectly except Candy Crush. For whatever reason, Candy Crush just did not

01:19:44 ◼   ► restore, just was not there on the phone. So Tiff has lost her progress in Candy Crush.

01:19:49 ◼   ► And this is like severely bad.

01:19:52 ◼   ► Did you have to pay extra for that service?

01:19:54 ◼   ► I don't know. So the way she's been playing it, you know, like when we first heard about

01:20:00 ◼   ► it I believe from Amy Jane Gruber on one of her various podcasts, or somewhere, Twitter

01:20:06 ◼   ► or something, that I got the impression that it was extremely addictive and that it could

01:20:11 ◼   ► just take all of your money because you could just, you know, you can like buy your way

01:20:15 ◼   ► out of time limits and all, you know, all the crap that the free to play BS games do.

01:20:20 ◼   ► And so I was like, "Do not install that game because it will take all the money.

01:20:26 ◼   ► It will just suck away everything we have, everything we've worked for.

01:20:29 ◼   ► All the money will be gone."

01:20:31 ◼   ► So to prove that I was wrong about that, Tiff has played the entire game not spending any

01:20:37 ◼   ► money and intends to continue that way.

01:20:42 ◼   ► But apparently it's a pretty hard game and it's pretty hard not to spend money, which

01:20:45 ◼   ► is why they make so much.

01:20:48 ◼   ► So she's like spent hours this week playing this game, and now it's restored and it's

01:20:56 ◼   ► gone. And of course they don't use any kind of iCloud or Game Center. Of course they don't

01:21:01 ◼   ► do anything right in programming the thing to actually make it keep your progress. No,

01:21:06 ◼   ► that would cost them too much money. That would cost people to not buy upgrades. So

01:21:09 ◼   ► of course they don't do that because game programmers are so great these days. My slight

01:21:13 ◼   ► rant. Thanks a lot, game programmers.

01:21:17 ◼   ► But, yeah, so I wonder how this is going to play out now.

01:21:22 ◼   ► Like if she'll have to buy her way out of this,

01:21:24 ◼   ► if I will have to buy her way out of it,

01:21:25 ◼   ► out of guilt for somehow not having this thing synced

01:21:28 ◼   ► with just that app.

01:21:29 ◼   ► - If she wants to like bang her head against

01:21:31 ◼   ► a very difficult to play application,

01:21:32 ◼   ► you can get a super hexagon or impossible road or something,

01:21:35 ◼   ► which do not ask for an app purchases,

01:21:36 ◼   ► but will nevertheless frustrate her for a lifetime.

01:21:40 ◼   ► - Or Marble Madness.

01:21:42 ◼   ► - Whose alarm is going off?

01:21:43 ◼   ► - That's over here.

01:21:46 ◼   ► For a second there I was like, "How? My garage is closed. I don't think it's me."

01:21:51 ◼   ► Hi.

01:21:52 ◼   ► My windows are closed, too.

01:21:54 ◼   ► You know, all those times that I played Marble Madness,

01:21:58 ◼   ► after having spent the $40 on it and being so disappointed at how much it sucked for my Genesis,

01:22:03 ◼   ► all that time, the game only has six levels.

01:22:06 ◼   ► Yeah, six levels for $40.

01:22:08 ◼   ► I'd never beat it.

01:22:11 ◼   ► Because at level six, the whole game is really, really hard,

01:22:13 ◼   ► And level six is just like, it's so ridiculous, I just, I could not ever beat it.

01:22:19 ◼   ► I came close a few times, never got it.

01:22:20 ◼   ► You should get a super monkey ball for your, it's a GameCube game, but you have a Wii that

01:22:24 ◼   ► will play GameCube games.

01:22:25 ◼   ► That is the, probably the most difficult console game that I've played and enjoyed.

01:22:31 ◼   ► Because no, I haven't played Dark Souls, people listening.

01:22:35 ◼   ► Games are more forgiving now than they were in the past.

01:22:37 ◼   ► Just having like, progress saving.

01:22:39 ◼   ► is a massive, a massive ease jump, you know? Like...

01:22:44 ◼   ► Super Monkey Ball does not have that. Neither does Super Hexagon. Neither does Impossible

01:22:47 ◼   ► Road. Super Hexagon, have you played... that's the one you might have heard of and played.

01:22:52 ◼   ► Have you played Super Hexagon? No, what's it for?

01:22:55 ◼   ► For making yourself feel incompetent? No, no, what...

01:22:58 ◼   ► No, it's for iOS. All right.

01:23:03 ◼   ► Yeah, it's... yeah. You should get it just because I think it's a really well-done game

01:23:08 ◼   ► It has really nice music that you'll I've seen this if you hear you will hear three seconds of before you die

01:23:13 ◼   ► Yeah, I've seen this and yeah, I played it for about eight seconds and then not not continuously

01:23:18 ◼   ► They'd seconds cumulatively all

01:23:20 ◼   ► If you could stay alive for eight seconds, that would be something

01:23:23 ◼   ► I don't I don't like games like this like any like I also never cared for like games like

01:23:29 ◼   ► Cannibal and yeah anything that's like just fast action and just go until you die or like anything like that

01:23:35 ◼   ► I I just don't I get discouraged so quickly and easily from these games

01:23:39 ◼   ► I guess I never want you should never play a super axion or impossible super monkey ball though like I mean has easy levels

01:23:45 ◼   ► So it's fun

01:23:45 ◼   ► It's fun to play like that's the only game like that that I have been motivated enough to play because like it starts

01:23:50 ◼   ► You know it starts so easy you're like oh, this is fun, and it's interesting

01:23:53 ◼   ► It's nice to look at it as neat music, and it's mentally challenging

01:23:56 ◼   ► But the difficulty just goes on forever and at a certain you it's one of those games where no matter who you are as a human

01:24:02 ◼   ► being with the exception of seven people in the world, you will reach the limits of your

01:24:05 ◼   ► ability but only after a satisfying trail up to that level instead of just like, "Super

01:24:10 ◼   ► Hexagon is immediately you suck now. From second zero you suck." All right? That is

01:24:15 ◼   ► different.

01:24:16 ◼   ► Impossible Road is, I think, is actually—I haven't played it enough to know. It's

01:24:20 ◼   ► probably a little bit harder than Super Hexagon, but I can't really tell.

01:24:23 ◼   ► So now, Marco, did you get into Tiny Wings when that was popular?

01:24:27 ◼   ► No, I've seen it. I think I played it on someone else's phone or something.

01:24:32 ◼   ► Because I like that one. Like, I've never played Cannibal, and I've seen it on other

01:24:35 ◼   ► people's phones, but I like Tiny Wings. I don't play it that often, but I like it.

01:24:38 ◼   ► Tiny Wings is charming.

01:24:39 ◼   ► I've seen a few things. Like, there was some kind of skiing version of that that I played

01:24:43 ◼   ► for like an hour one time, but that... I just... I don't have the patience to... Once I get

01:24:51 ◼   ► going really far in one of those games, and then I die, and then I start over again, I

01:24:55 ◼   ► just don't care. I'm so discouraged by having to start over again at that point and playing

01:25:01 ◼   ► the exact same thing over and over again, even if it's a little bit varied from random

01:25:05 ◼   ► generation or procedural stuff. Even then, I hate going back. That's one of the reasons

01:25:10 ◼   ► I was playing through Vice City with, no actually it was the original GTA 3, playing through

01:25:18 ◼   ► it and I almost beat the game but there was this one mission where it took like 15 minutes

01:25:24 ◼   ► to do the mission and it was a timed thing where you had to do it within that 15 minutes

01:25:29 ◼   ► and it kept getting within like 10 seconds of succeeding and just barely missing it.

01:25:34 ◼   ► And I just stopped playing the game. Like I just never proceeded past that point. After

01:25:37 ◼   ► like a few days of banging on that mission and doing it like seven or eight times and

01:25:41 ◼   ► failing every single one, I just got so discouraged. I'm like, you know what, I'm done. That's it.

01:25:46 ◼   ► I just never went back. It was the mission where you drive around trying to crush all

01:25:51 ◼   ► coffee stands in like seven different parts of the town. I bet everyone who played GTA

01:25:56 ◼   ► 3 probably remembers that mission and possibly stopped playing it there.

01:26:00 ◼   ► This is one of the rites of passage of anyone who will eventually come to identify themselves

01:26:04 ◼   ► as a gamer is that everyone eventually meets that game with the frustrating level or the

01:26:08 ◼   ► difficult thing that they feel like they're never going to get past. And people who will

01:26:14 ◼   ► later in life call themselves a gamer get through that and they consider it like a personal

01:26:19 ◼   ► triumph and move on from it. And once you've done that once, you realize that there is

01:26:25 ◼   ► nothing in the game that I can't do. I can always persevere. It's just a question of

01:26:30 ◼   ► doing it. And it's not like a value judgment. Like, if you decide your time is better spent

01:26:34 ◼   ► doing something else, then fine, or whatever. I'm just saying, like, the people who make

01:26:37 ◼   ► that decision, they say, "You know what? I'm going in this totally inconsequential place

01:26:42 ◼   ► where there's no reason for me to do this. There's no reward waiting for the end of it.

01:26:45 ◼   ► No one's going to care that I did it. I'm just alone here in my house. I've decided,

01:26:48 ◼   ► "You know what? I'm going to do this." And eventually you do do it. It's an amazing

01:26:53 ◼   ► feeling and it gives you a belief in yourself that it shouldn't because it's like all

01:26:57 ◼   ► you did was press buttons on a controller like this has no bearing on your ability to

01:27:01 ◼   ► succeed in life or anything like that. But it feels amazing, right? And that's the

01:27:05 ◼   ► great thing for people who are gamers. That's the amazing thing about games like Super Hexagon

01:27:09 ◼   ► and stuff is because it takes that gamer sense of thinking that there's nothing you can't

01:27:14 ◼   ► beat and saying, "No, actually, here, try this." And it's like, for one set of people,

01:27:21 ◼   ► like this is a new experience, because at this point, every challenge that I've come across,

01:27:24 ◼   ► I've been able to surpass. So it's going to bring some people to say, "I have reached my limits as a

01:27:30 ◼   ► human being." No matter, I realize now, after my years of experience of being in things, that this

01:27:35 ◼   ► is one place that I can't go any farther. And then at first, even smaller percentage of people,

01:27:40 ◼   ► it's going to make them initially think that, and then they are going to do it, and they're going to

01:27:43 ◼   ► to be like, "I am now God." It's like after you've, you know, getting back to drugs analogy,

01:27:50 ◼   ► like you've built up a tolerance, right? And the only way for you to get any sort of high

01:27:54 ◼   ► is to get into the situation that is basically impossible and either be defeated and have

01:27:59 ◼   ► that be a novel sensation or break through anyway and be like, "There's now nothing I

01:28:02 ◼   ► can't do," you know? You are very far at the end of that spectrum. Is there any game type

01:28:09 ◼   ► experience you've done where you feel like there's no way in heck I'm going to beat this,

01:28:12 ◼   ► you forget it, you put the game down, you put it away for six months, and eventually

01:28:15 ◼   ► you say, "You know what? I'm going to beat that," and you come back to it. Not with a

01:28:17 ◼   ► six-month gap, but any kind of thing where you feel like you've already decided, "This

01:28:21 ◼   ► is impossible. This is unfair. There's no way this can be beaten. I hate this game,"

01:28:24 ◼   ► but then have eventually gotten through it.

01:28:26 ◼   ► Oh, yeah, definitely. Usually that's the outcome. I don't usually give up on the game completely.

01:28:32 ◼   ► But there are certain things that just... Anything that just wastes tons and tons of

01:28:37 ◼   ► of time doing the same thing over and over and over again

01:28:41 ◼   ► in order to get to the point that I keep failing,

01:28:44 ◼   ► that drives me nuts.

01:28:45 ◼   ► - Yeah, that's part of the experience.

01:28:47 ◼   ► Of course they do that.

01:28:48 ◼   ► Of course, like the most extreme cases,

01:28:50 ◼   ► the ones where there was no saving, right?

01:28:51 ◼   ► Because then, like, the whole thing would be like that.

01:28:53 ◼   ► You'd spend like five hours on a weekend

01:28:55 ◼   ► getting to the place where you die all the time

01:28:57 ◼   ► only to die all the time.

01:28:58 ◼   ► So like your, you know, your code compiled debug cycle

01:29:02 ◼   ► is like four hours long, and you know, you're like,

01:29:05 ◼   ► you do the math in your head, like,

01:29:06 ◼   ► How many tries is it going to take me?

01:29:08 ◼   ► And if each time I do the try, and then eventually you

01:29:10 ◼   ► can't even get up to that level anymore,

01:29:11 ◼   ► you're going to that downward spiral

01:29:13 ◼   ► where you're not even getting halfway to the place

01:29:15 ◼   ► where you're going to die anymore,

01:29:16 ◼   ► and you have to take a break from it.

01:29:18 ◼   ► That's what I'm talking about.

01:29:19 ◼   ► That's the whole experience.

01:29:21 ◼   ► And that's totally the worst.

01:29:22 ◼   ► And that's why the games are generally

01:29:24 ◼   ► where you get some kind of save or some other way to do it.

01:29:26 ◼   ► But yeah, back in the day, you'd play those NES games.

01:29:29 ◼   ► It was like, was it "Bionic Command" at the moment

01:29:31 ◼   ► where you had to shoot a missile at Hitler in a helicopter

01:29:33 ◼   ► as you flew by him on the screen?

01:29:36 ◼   ► 30 frames a second, and you got basically one shot at it, and the first time it happened,

01:29:40 ◼   ► you had no idea it was coming, and now you're just like, "We gotta play through the whole

01:29:43 ◼   ► game again to get up to that one scene and give it another try." That was a different

01:29:46 ◼   ► age.

01:29:47 ◼   ► See, I had a terrible horror story with the NES, because I had, what was it, Dragon Warrior?

01:29:52 ◼   ► That was the original, not the original RPG, but it was one of the first RPGs in the NES,

01:29:57 ◼   ► and...

01:29:58 ◼   ► Please email Casey.

01:29:59 ◼   ► Please email me. No, don't really. But anyways, I wanna say, please don't email me, that the

01:30:05 ◼   ► highest level you could get to was like 25 and I got up to level 21 or something like that and then my little brother

01:30:11 ◼   ► and to this day, I'm not sure if he was being a d*ck or if he did it accidentally, but he

01:30:16 ◼   ► erased my save, my save game or whatever and I never looked at that game again because I was it took me hours

01:30:24 ◼   ► I remember... That could ruin a friendship.

01:30:26 ◼   ► Yeah, exactly. But he's still his brother. You can't get rid of him.

01:30:29 ◼   ► Yeah, I tried but I couldn't. Oh man, that made me so angry.

01:30:34 ◼   ► Yeah, that's the other thing. That's the other element that could turn you off is like if you feel like something

01:30:37 ◼   ► Unfair has happened like it's not the game. It's not you my brother and like that's not fair like I was willing to accept all

01:30:43 ◼   ► The crap this game could throw at me and try it, but now someone has deleted my save game

01:30:46 ◼   ► It's like alright that one that one. It's like you know foul out of bounds

01:30:51 ◼   ► Oh, yeah

01:30:51 ◼   ► The reason why I never beat Vice City is that I was playing it during college and on my roommates Xbox

01:30:57 ◼   ► And when he went home from the summer, I'm like well that there good there. It goes. That's it. He saved you

01:31:02 ◼   ► Yeah, but like I would like Tiff and I were playing it we we got

01:31:06 ◼   ► We were playing it for like months and we got to what had to be like almost the end of the missions

01:31:12 ◼   ► And yeah, but like once that like I ended up getting my own Xbox eventually

01:31:16 ◼   ► But then it's like I'm not gonna start over and there was no good way for me to like get the save game from him

01:31:20 ◼   ► And put it on mine like you know that that wasn't gonna happen

01:31:23 ◼   ► So I just the game if the game is good enough you'd want to start over

01:31:25 ◼   ► Yeah, but that's the thing like I think I wouldn't I wouldn't get any pleasure out of like replaying the GTA missions because so like

01:31:32 ◼   ► I like them at the time, the first time I'm playing through.

01:31:35 ◼   ► I like accomplishing those things and getting it done.

01:31:38 ◼   ► But I never want to go back and do these things over again

01:31:41 ◼   ► 'cause it's just so time consuming

01:31:42 ◼   ► and so many of them are so tedious.

01:31:44 ◼   ► - Yeah, it's kind of like favorite movies.

01:31:47 ◼   ► Most people like to see their favorite movies

01:31:49 ◼   ► more than once in their entire life.

01:31:50 ◼   ► Like that's what makes them their favorite movies.

01:31:52 ◼   ► None of them need to watch it every month

01:31:53 ◼   ► or even every year, but your favorite movies,

01:31:55 ◼   ► you might be like, "Nah, I've seen that one already."

01:31:57 ◼   ► Like you'll watch it.

01:31:58 ◼   ► You'll watch it if it ends up on TV or whatever.

01:32:01 ◼   ► That's what it's like with favorite games,

01:32:02 ◼   ► gamers is like not like you're gonna play it every month or every year or whatever but like every

01:32:06 ◼   ► Five years or so you feel like I have to play my hero game again because it's been too long right

01:32:11 ◼   ► Yeah, so how often do you play journey? I?

01:32:13 ◼   ► Play it really so many damn times, so I'm not taking a break from now at this point

01:32:17 ◼   ► I do it pretty much on the year anniversary of journey

01:32:19 ◼   ► I play a little bit, but like my new thing is getting other people to play journey. I'm spreading it's spreading the love to others

01:32:25 ◼   ► It's just two hours

01:32:27 ◼   ► So I can't I can't even believe it you already have the ps3. I think you already have the game yep

01:32:32 ◼   ► Oh, you were just trolling the shit out of him right now.

01:32:35 ◼   ► He's just denying himself a good experience.

01:32:38 ◼   ► I mean, Journey really is a gamer's game, though, so it could be that it's appeal.

01:32:42 ◼   ► It's like a movie fan's movie, like someone who's a real big cinephile, if that's the

01:32:47 ◼   ► word.

01:32:48 ◼   ► Movies that they love, the general public might not love.

01:32:51 ◼   ► But I think Marco, I think Journey may be a crossover hit.

01:32:54 ◼   ► We'll see.

01:32:55 ◼   ► What about you, Casey?

01:32:57 ◼   ► What's your Journey excuse?

01:32:58 ◼   ► I don't have a PS3.

01:33:00 ◼   ► Alright, well when Marco's done with his I'll send it to you.

01:33:03 ◼   ► Because he's not using it for anything else apparently.

01:33:07 ◼   ► On a very very quick final note, I tweeted like two minutes before the show, I just filled

01:33:11 ◼   ► my car, my tank miles per gallon, 15.

01:33:13 ◼   ► I saw that.

01:33:14 ◼   ► Yeah, I saw that.

01:33:15 ◼   ► I was thinking, I would love to get that.

01:33:18 ◼   ► I was thinking I'd get like double that if I ever measured my mileage, which I don't.

01:33:23 ◼   ► This moment right here perfectly encapsulates the three of us.

01:33:27 ◼   ► Definitely.

01:33:28 ◼   ► It perfectly encapsulates our cars, anyway.

01:33:31 ◼   ► There are, apparently...

01:33:33 ◼   ► There is a game called Candy Crisis. People are saying, "This is the Puyo Puyo clone for Mac."

01:33:36 ◼   ► It's very well known. It looks like it might even be open source.

01:33:39 ◼   ► - Yeah, it might have been the name of it. - Yeah, it's GPL.

01:33:42 ◼   ► I just didn't recognize the screenshots. Like, they didn't look familiar to me.

01:33:46 ◼   ► Yeah, so these screenshots still don't look familiar to me.

01:33:49 ◼   ► I mean, there could be more than one of these. I don't doubt that there's more than one.

01:33:52 ◼   ► I'm totally getting this. I'm so good at this game.

01:33:55 ◼   ► No one... No one... I'm always... I tweeted, like...

01:33:57 ◼   ► I'm always good at the games that nobody else plays, which of course that probably just

01:34:00 ◼   ► means I'm not.

01:34:01 ◼   ► Well, people play this.

01:34:02 ◼   ► They call them casual gamers, Marco.

01:34:03 ◼   ► It's okay.

01:34:04 ◼   ► No, but there's like...

01:34:05 ◼   ► Only John is judging you.

01:34:07 ◼   ► I'm really good at Moon Base Commander, too.

01:34:09 ◼   ► And Moon Base Commander, nobody plays.

01:34:11 ◼   ► Right?

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

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

01:34:14 ◼   ► No.

01:34:15 ◼   ► That's like one of my, like, "I'll never get to it" ideas is I would love to make Moon

01:34:19 ◼   ► Base Commander for iPad, but it's just never gonna happen.

01:34:23 ◼   ► Like, first of all, even though it was a $5 game in, like, 2001,

01:34:29 ◼   ► it's still probably beyond my ability to make,

01:34:33 ◼   ► because I'm not really a game programmer, and it would be, like--

01:34:37 ◼   ► I'm sure maybe I could do it if I had nothing else to do for, like, five years,

01:34:40 ◼   ► but, you know, I wouldn't--

01:34:42 ◼   ► it would be a tremendous waste of time for me to try to make that,

01:34:44 ◼   ► because it's so far outside of my expertise.

01:34:46 ◼   ► - Sprite can? - Maybe.

01:34:48 ◼   ► - Ah. - But, um--

01:34:50 ◼   ► - Games practically write themselves.

01:34:52 ◼   ► It automatically compiles your images into asset files.

01:34:59 ◼   ► You should watch those Dev Summit.

01:35:01 ◼   ► SpriteKit is like-- SceneKit, you could not make a 3D game with, because it's just for

01:35:06 ◼   ► adding 3D to your apps.

01:35:07 ◼   ► Like those are number three.

01:35:08 ◼   ► But SpriteKit, you could make a Sprite game with.

01:35:11 ◼   ► Isn't it basically just like Apple's ripoff of Cocos2D, or is there more to it?

01:35:16 ◼   ► I mean, basically, you've got core animation, right?

01:35:18 ◼   ► So you've got all the makings of a SpriteKit, but anyone who actually wants to make a game

01:35:21 ◼   ► out of that is not going to use a bunch of current animation layers. There's things that

01:35:24 ◼   ► sprite collision detection and compiling all your assets into big files and pulling out

01:35:28 ◼   ► chunks of them or whatever. And this does that for you. This makes it so that you might

01:35:34 ◼   ► be... People who are thinking of making a game but have no idea how to do it, Sprite

01:35:37 ◼   ► Kid now suddenly puts their game to the realm of possibility because it's not like... You're

01:35:42 ◼   ► not going to make an awesome game that's groundbreaking, but you're going to make a competent game

01:35:45 ◼   ► provided you have good artwork or whatever. So it does the things the framework's supposed

01:35:50 ◼   ► Which is like people who could not make this program before now can because smarter people have come and given them more lower layers

01:35:56 ◼   ► And it's impressive because you actually can make a game out of it like it did in the demo

01:36:01 ◼   ► They had an actual game not a not a good game not an amazing game, but you look at it

01:36:05 ◼   ► And you go you know what that's fine. You know

01:36:07 ◼   ► Someone who who has like the skills to make a game in terms of level design and character design

01:36:12 ◼   ► But not the skills to make a sprite engine now can get stuff on

01:36:17 ◼   ► IOS and of course the best thing about it is it's IOS only

01:36:19 ◼   ► So those people who do it won't have the skills to port their games any other platform

01:36:24 ◼   ► Platform lock-in whoo

01:36:27 ◼   ► But you should check just watch the dev seminars. They're fun dev seminars. They got their games

01:36:31 ◼   ► I will see if I could but I can't oh, that's right everything's down, and I don't download all the

01:36:36 ◼   ► Foresight to download them all the day they came out every year

01:36:44 ◼   ► Someday now I have all this space and I finally I finally have like a large storage and backup thing set up

01:36:49 ◼   ► Oh god. I have UPS is everywhere now - I have because I got this analogy and I'm like, you know what?

01:36:55 ◼   ► I should put this on a UPS and

01:36:57 ◼   ► So I'm like upgraded my main UPS for my mac Pro

01:37:01 ◼   ► Move the old one into the closet for that and the router and stuff does the SMT 1500 have a fan?

01:37:07 ◼   ► Oh my god you and your fans it does have a fan, but I think it only uses it when it's running on DC power

01:37:13 ◼   ► hour. I, uh, cause like normally, I mean, I'll have to try to pay attention. I'll have

01:37:19 ◼   ► to put a load on it when the Mac Pro's off. Um, so I could, so I could tell more directly,

01:37:23 ◼   ► but as far as I can tell, the fan is not running normally. Uh, I certainly can't notice it

01:37:28 ◼   ► next to a Mac Pro, uh, with no hard drives in it, which should tell you something. It

01:37:32 ◼   ► doesn't tell me anything. It tells me nothing. All right. I'm hanging up on YouTube. I gotta

01:37:37 ◼   ► go pack. All right. Enjoy your beach. And to be honest, I'm sort of dreading it. I don't

01:37:42 ◼   ► I've not been in a pis-- I've not been to the beach at a time when I enjoy drinking alcohol, which I really enjoy.

01:37:48 ◼   ► - So you're on the beach every five years? - I haven't been to the beach for more than a few hours.

01:37:52 ◼   ► - Oh, good. Casey, we didn't have a beach intervention for you. - I hate the beach. It's hot. I hate the feel and the smell of suntan lotion.

01:38:00 ◼   ► - Oh, God. What's wrong with you? Where'd you grow up again? - Oh, God.

01:38:03 ◼   ► - Oh, I hate-- I will do anything to avoid using sunblock. - Oh, what is--

01:38:07 ◼   ► - Oh, amen. Amen to that. - What is wrong with you people? - Sunblock smells like--

01:38:11 ◼   ► Well, no matter what, it gets in my eyes.

01:38:13 ◼   ► Like, no matter where I put it, no matter how careful I am, it always gets in my eyes and burns.

01:38:17 ◼   ► This is like those commercials where they have this device to cook eggs and they say,

01:38:20 ◼   ► "Eggs are so hard to make!"

01:38:21 ◼   ► And the guys get eggs in their hair and the shells are in their eyes poking them.

01:38:25 ◼   ► Sunblock always gets in my--

01:38:27 ◼   ► No, it doesn't!

01:38:28 ◼   ► If you have a tiny bit of confidence, you can not get the eggshells in your eyes.

01:38:33 ◼   ► Even if you don't get it in your eyes, it still smells like--

01:38:36 ◼   ► And you gotta sit there and you're--

01:38:38 ◼   ► There's a million kinds of sunblock!

01:38:39 ◼   ► I mean, it smells crappy.

01:38:40 ◼   ► This million kinds of sunblock.

01:38:42 ◼   ► Then you're all slimy for all day.

01:38:44 ◼   ► And then what do you do?

01:38:45 ◼   ► When you start to sizzle, you have to flip over.

01:38:48 ◼   ► It's like you're a freaking geek yourself.

01:38:49 ◼   ► You guys may be doing it wrong.

01:38:51 ◼   ► Then you get up and you walk across the sand that's

01:38:53 ◼   ► melting the bottom of your feet.

01:38:55 ◼   ► Then you get in the water, which you accidentally

01:38:56 ◼   ► get in your mouth.

01:38:57 ◼   ► What beach are you going to, anyway?

01:39:01 ◼   ► What is it?

01:39:01 ◼   ► Kill Devil Hills, which is a great name for a freaking

01:39:03 ◼   ► beach in the Outer Banks.

01:39:07 ◼   ► Non-beach people.

01:39:08 ◼   ► And then you get in the water and you open your- you stop clenching your lips shut as

01:39:13 ◼   ► hard as possible and suddenly all the salt that is in the entire world is in your mouth.

01:39:19 ◼   ► And you can't even drink the f***ing water because then you get more salt in your mouth.

01:39:22 ◼   ► All these experiences you're describing are the same experiences the people who like the

01:39:26 ◼   ► beach enjoy, but you're giving them a negative spin.

01:39:29 ◼   ► The smell of the salt air, the feel of the sand under your feet, the smell of sunblock

01:39:35 ◼   ► even suntan oil, cocoa butter smells. No. You guys were deprived of important experiences

01:39:44 ◼   ► in your formative years, and now are broken adults who can't enjoy the beach.

01:39:48 ◼   ► And the funniest part of this entire discussion is we met 20 yards from a beach, although

01:39:53 ◼   ► the difference being that was a lake beach, which I enjoy.

01:39:55 ◼   ► No, lakes are gross.

01:39:57 ◼   ► Ocean beach.

01:39:57 ◼   ► Filled with disgusting smelling water and mud.

01:39:59 ◼   ► Yeah, and also, we were not wearing sunblock. We were inside using computers.

01:40:04 ◼   ► [laughter]

01:40:05 ◼   ► There was no salt, there was no sand, there was no sun.

01:40:08 ◼   ► You got the programmer's tan, that's what I got.

01:40:11 ◼   ► Oh god.