Programming Throwdown - Design Patterns
Episode Date: May 7, 2014This show covers Design Patterns. Tools of the show: Jason: VirtualBox Patrick: Bittorrent Sync. Books of the show: Jason: HTML5 Game Development Insights http://amzn.to/1g94JVS Patrick: The ...Martian http://amzn.to/1smEYc8 ★ Support this podcast on Patreon ★
Transcript
Discussion (0)
Hosting provided by Host Tornado.
They offer website hosting packages, dedicated servers, and VPS solutions.
HostT.net.
Episode 33, Design Patterns.
Take it away patrick so i was watching the live launch of the newest spacex uh flight going to
the space station oh nice the dragon capsule and uh it was like at work i felt like it was
momentous we were all standing around my monitor and like watching the the rocket lift off and
everything um and they had said it was not a main mission objective but the first
stage the you know big rocket part is supposed was supposed to you know come back and try to land
uh you know and they want to eventually reuse it but they said it didn't have a large chance of
success so i was i was hoping to be able to watch this thing come back down but they didn't have any
video whatsoever of that part of it for unknown reasons and it took until like just recently that they this is like you know it
launched like last week and then this week they just finally announced that it did successfully
do that part of the mission where it deployed these like lander legs from the first stage
and then hovered briefly above the ocean and then fell into the ocean. But because the seas were really bad,
it got destroyed in the ocean.
Oh no.
So you can launch something like the thing that launches something up to
space,
recover it with rocket engines to slow down,
but then the ocean water can destroy it.
It's like,
Oh,
so a couple of things on this one.
Uh,
I heard this crazy story that I guess it's not that crazy,
but the idea is like helium, I guess there's a finite amount of helium.
You can correct me if I'm wrong here, on Earth at least.
Yeah.
And I guess helium, liquid helium is necessary for getting to orbit.
I think liquid hydrogen.
Oh, but helium has something to do with it.
Anyways, the way this story went is that basically you need helium at some part at some level and uh if we used up all the
helium on things like balloons or whatever that basically would never be able to go into space
i've never heard that before oh really yeah i thought it's kind of ridiculous so there is a
problem with like there is true helium and like they use it a lot because it's really cold
and less dangerous than liquid hydrogen.
So they use it for a lot of medical procedures and medical research.
And so I know, like, that is a problem.
Oh, I see.
But I've never heard that we couldn't go to space anymore.
That might be true.
I don't know.
Oh, I don't know.
It's just kind of crazy.
But, of course, then there's always this caveat that if we ever start doing
large-scale fusion, you'll most likely have an overabundance of crazy. But of course, then there's always this caveat that if we ever start doing large-scale fusion,
you'll most likely have an overabundance of helium.
Oh, that's true.
The other thing I was going to say is that there was this article on SpaceX where I guess
Elon Musk is suing the government, which, anyway, that's a side note,
but I don't understand how you can do that.
But basically, at any rate, he's suing the government because they had this like special they had this contract
with a joint venture of lockheed and boeing to to do the uh you know the satellites and they
wouldn't let him bid and so he's suing you know on the grounds that he should at least be able to
compete and bid on this on this project yeah they're doing a lot of stuff i don't a lot of people
have very strong feelings about it especially being from florida where a lot of people were
employed by nasa and it's uh subsidy not subsidiaries but people who worked for nasa
and with nasa right um but yeah the stuff they're doing is really kind of crazy like this rocket
recovery where i was kind of going with is like this fact that you could reuse this stage one part of a rocket
that's like a giant way to drive down costs if you can do it reliably and with not it being a
much more expensive thing in the first place so is that really a big part of the cost the
destruction of the bottom it depends right so it's like probably not
i don't know but if you're trying to get costs down and down and down i mean just from the
standpoint of it's a complicated high tolerance thing that you have to build low tolerance high
tolerance you have to have small tolerances it has to be very precisely built so no matter what
it's going to be expensive to build.
And if you can spend just a little bit more and then reuse it several times,
it's obviously better, right?
Yeah.
It's like the argument of like you can buy cheap shoes, but they'll fall apart.
If you spend only a little bit more and get nice shoes, they'll last a lot longer.
Yeah, right.
But you don't necessarily spend 10 times as much because those shoes don't necessarily
last even 10 times longer.
Yeah, you get diminishing returns. Yeah. So I think that that's the idea but the fact that it's just kind of crazy it has like
these fold down legs and you know does a deceleration burn and like all of that is just
crazy yeah it's totally awesome yeah did you ever get into like building model rockets and shooting
them in the sky or anything like that i mean we did it several times and i wish i would
have done more of it but it's one of those things like where do you go to do it and half the time
we could never get back the rocket i guess that is a problem isn't it yeah so like you know in
florida we had some places but you know i was thinking about stuff here in like silicon valley
area i'm sure if you went far enough away but i don't have any idea if I wanted to take my kids out to do model rockets.
You can't go to the park.
I don't think people would be happy with you.
No, I'm pretty sure you can't shoot off model rockets.
Not everybody agrees.
So where would you go?
I'd have to drive out of town to do it.
Go wherever the Mythbusters go.
They're actually based in San Francisco,
so they must go somewhere around here. But I think they're actually based in san francisco so they they
must go somewhere yeah somewhere but i think they get special permission and i don't know like
yeah that's true it's like i do know a couple places that allow you to fly rc airplanes which
is also which is nice but um even then like you know in florida i had enough space i could have
flown it in my yard like a very small one or whatever but i don't have a yard here right right can you can you fly rc airplanes at any kite flying zone or no
i mean so it's a whole bunch of rules and then there's like what's legal and what's
nice i see so it's like if other people are flying kites you probably don't want to
um and then like when you get a certain sizeites, you probably don't want to.
And then like when you get to a certain size and stuff,
you're kind of supposed to get permissions and licenses and that kind of stuff. So you're saying I shouldn't fly like a drone with a Kinect on it over my neighbor's backyard?
I'm saying legally you probably could, but you might make them mad.
Oh, I see.
So I think the Fa recently passed something like
for non-commercial use uh below a certain level like they said it was okay or whatever oh really
you have to have i think you have to have line of sight and below i don't i i really can't remember
now but there's some ruling where yeah basically it's okay, yeah, don't do it commercially.
That's still not completely okay.
And if it ever crashes in your neighbor's yard,
they might not be very happy with you.
Yeah, right.
So the first news item I had was I came across this giant list.
That's the only way I can describe it.
It's a giant list of free programming books so it's
a github site repository i think it's and i don't think it's a whole repository but the repository
is literally just a huge amount of links yeah yeah i think it's just so people can like branch it
and update it and make edits to it i'm not sure why it's not a wiki um i'm not exactly sure anyways
other than like that other people could branch it and make their own alterations that they didn't
want to necessarily share back but it's got like all the programming languages uh different topics
and then under each heading there's you know at least one or two books and some many more um and
so some of the books are kind of like some guy wrote this
and then other ones are published books
that just got permission to be released for free.
But we'll post the link in the show notes
or you can search it free programming books GitHub
and it should come up.
I would recommend you take a look
if there's a topic you're interested in learning about.
Yeah, if you search for GitHub books,
it's the fifth result which is pretty remarkable on your on your on your account uh oh yeah well let me try anonymously okay well needless to say you should be able to
find it or you can just look at the show notes you're right it's actually the third result if you search anonymous oh that's like uh if you search search java do you get coffee or the
programming language well it depends if you're using google i guess it depends on what you also
searched before yeah that makes sense yeah cool okay um so so mine is pretty dorky, but I thought it was pretty cool. Basically, Russ Cox, who's one of the founding members of the Go language team,
he decided to port the Go compiler to Go.
So originally they wrote the Go compiler in, I think, C or C++?
Or in C. And so he argues that the reason why
we wrote it in C is because we didn't have Go. And so to back up that argument, he actually,
they wrote, I guess they wrote a program that transpiled C to Go. And that got them 90%
of the way there. But then there were like go-to's in the
code and things like that which didn't translate as well you know i i just gotta say like if
someone's inventing a language and they use go-to's like that worries me like it makes me
worried about using the language but i i do think go is an amazing language even though the person it's not wait the go had go to's or the c had go to's well the c implementation of the go
compiler had go to's oh um was it auto generated parts or somebody actually wrote go to code no
you said there's 1032 go to statements i've never come across a go-to statement in any crc++ code i've ever
looked at uh no no i mean like i see examples of it like on the internet right like in code that
i've worked in and repositories i've worked i've never seen a go-to statement not once i have seen
it very rarely and has always been terrible terrible code like i've always looked at it and kind of
kind of just shook my head like i actually had a discussion with someone on my team about
how we could avoid a lot of problems by using go to and they didn't even want to hear it and i was
you know it's generally i guess considered bad to use go to but like anything it's just a tool
and it got misused a bunch and yeah i think there are cases where it could be good if you use it right i mean i think that uh
i used to agree with that and unless you're using java and you have finally
if you have finally i don't think you need goto
you know so like most of the time
when I've seen goto used
it's always been because
wait does java have goto
no they don't
my argument is that if c++
had finally
like a block of code that would execute
you know no matter
what happened
then that effectively is go to in a sense
like yeah yeah so that's mainly the kind of thing i'm thinking of like when i've come across it
mostly in c not just c++ but in c a lot of times you get this multi-path return like you're try
catching without try catch right and it would be just more convenient instead of the convoluted copy and pasting they do to have a go-to
yep that makes sense
but what do I know
nothing that's the answer
I wrote a bunch of C++
and I'm kind of done with that language
I mean unless I really have to
I just don't
I mean unless we go back to doing
you know
like drivers for robots or something like
that or you know image processing for robots i mean i don't really i don't know i just it just
never seems to have the things that i want you know and then the build system too is kind of a
nightmare unless someone's you know done a lot of infrastructure work for you and stuff like that
i used to only do c c++ and i was happy and i thought java was silly then i did only java and then i was like oh okay this
isn't too bad now i'm doing c and i wish i could do c++ or java i don't really care
but i'm stuck with just c for now for what i'm currently working on. Oh, bummer. Wait, you can't even use C++? No.
What?
Wait, okay, so I got to know.
So, I mean, without going into a lot of detail,
like, give me an example, like, at a high level.
Like, when, I've never been in a situation where I couldn't use C++.
It's just a severely resource-constrained situation, right?
But, I mean, even then, like,
they both compiled to machine language
what's the difference so so part of it is i joined this team when they had already had a decent sized
code base and they are resistant to switching to c++ or using any c++ because it is true if you're
not careful you can have in in our situation the small amount of bloat that you would normally
consider small would be very impactful okay um and i i disagree i think we have the space to
spare they disagree with me so uh we're stuck using c yeah this is this is my argument against
it right and i know i'm kind of preaching to the choir here but it's you know when you use a language like C++ you can because you're kind of working
at a higher level you can be more clever with the memory and not end up with the
complete mess you know like basically like in C you know you can't you know
like for example with C++ you can do placement new and you can put
objects in certain spots of memory right and so i wouldn't feel comfortable doing like those kind
of hacks and see in regular c and trying to maintain it and keep it all in my head but in
c++ i could do it because there's the language is rich enough that if I were to look at the code later I would know what's going on
you know yeah I feel like maybe
my severely resource constrained
severely wasn't emphasized enough perhaps
okay fair enough
but yeah check this article out
it's pretty cool so bootstrapping
is that what that's called right writing go
and go yeah I think that's
what it's called yeah yeah so they
actually they're able to write go and go and go yeah i think that's what it's called yeah yeah so they actually they were able to
write go and go and uh i always wondered about like how um you know because gcc needs gcc to
build and uh i always wondered like if if uh if they go to a brand new machine like like someone
invents a whole new architecture,
I guess that person has to write a version of GCC and assembly. Yeah, that's cross-compiling, right?
Yeah, you have to compile on one machine for another.
You can compile for ARM on a x86 processor.
Yeah, so if you go and invent the next one, like the leg processor to compete with ARM,
then you have to get it
i see what you did there thanks thanks for that then you have to write the gcc in assembly or
something or i don't know uh no i don't think so oh you don't have to write all of it right like a lot of it is common
you just the code generation part and that's one of the the llvm right the other people is it's like
one of the things they're working to make better is you have a bunch of front ends
and then you get into an intermediate language and then you do a bunch of whole bunch of other
stuff and then at some the very last step is you produce machine code so only that part you would have to rewrite oh i get it and at that point it's probably not that
many instructions that you have well i'm not going to say it's not a hard job it's just not as hard
not as hard no right right right all right cool learn something new our next article is about i
don't actually know how to say the name of this the litro camera litro litro this is
originally the one that looked like a large uh lipstick case camera okay that was called a light
field camera anyways the next version version 2.0 or whatever it's called something weird
is coming out and it looks like a just kind of cool point and shoot camera instead of very weird
thing and this is the one where you take one
picture and it uses what they call light field but basically it takes a whole bunch of different
focused images all at once and then later it constructs where everything was in the scene
and so you can do refocusing okay so this works kind of like i think it's like the way like a
fly's eye works where it has
many facets on it and each one has a slightly different view of the scene but then computationally
you can come up with had you been at a given point and a given focus what would the scene have look
like oh no and so they take one picture but the trade-off is you have less resolution so because you're taking redundant
pixels pixels that have redundant information at some level you lose megapixels but you get this
other information that's depth information and so there's a whole bunch of neat effects you can do
with it like having a really shallow depth of field or having everything in focus um or moving the focus around after the effect
and one of the always the i guess two second explanation is you take an image and it's never
blurry um or it's never out of focus is what they say it can be blurry because you can still have
motion blur but it's never out of focus um which does it look weird i mean because because it's
sort of unnatural right like if
something was really close and in focus and then the whole background was also in focus
that might be jarring right because your eye doesn't really work that way um so i i did a
little bit of uh looking at ways of doing strange pictures so there's a lot of times when people
actually do do this um so for instance when you take product photography of like a watch,
they'll do what's called image stacking.
So they take a bunch of pictures at slightly different focus depths
and then stack them all together to get a completely
everything sharp macro shot of a watch.
You can see all the details.
And it doesn't really look unnatural.
Or when you have a scene of like a road stretching see all the details and it doesn't really look unnatural or when you have
a scene of like a road stretching off into the distance normally some parts of that would be
out of focus because of the constraints of you would need a infinitely small aperture to have
everything in focus but infinitely small aperture means you have to have it open for a really long
amount of time infinite amount of time so instead there's ways of shifting the plane of what records the image so that the part that's
in focus is all the way along the thing that you're actually imaging. That was really bad in
words. I don't know if anyone could follow that. I think I got it. So there are tricks and you can
do them and they don't actually look that unnatural.
Oh, okay.
Because in your eye, you don't necessarily think of things being out of focus because
whenever you look at is in focus.
Typically.
Oh, I see what you're saying.
Yeah, because you're not really looking in your periphery like that clearly.
It's not possible.
So it's almost the reverse, right?
The images that have the focus
like the depth blur like things that are far away the bokeh or whatever um it's a artistic effect to
focus your attention on the thing that's sharp but it doesn't necessarily look more natural
oh i gotcha cool cool that makes it it's kind of cool and it's it's a interesting like a long
lot of time people have known this light field thing and now they're actually making something
that is a consumer device so it's kind of cool to see yeah yeah that's awesome i'm really tongue
tied tonight i apologize is it like uh when you say because is it like $4,000 or something ridiculous? I think it's like $1,200.
Okay.
That's still pretty steep.
Yeah.
For camera enthusiasts, it's not too bad, I guess.
I guess maybe it's the...
Oh, it's actually $1,600.
And it's called the Elum.
And they have some sample images if you look online
that you can actually move around in your browser.
And it is kind of a bummer because you can actually move around in your browser um and it is kind of
a bummer because you can't use your normal photography tools because it has a special
format um but i it's one of those things i guess like people call it the tesla model is what i've
heard oh which is you sell the expensive niche thing to prove everything out and then you bring
the price down over time yeah right i heard that the the new Tesla, they're going to try to bring it down to like $3,500 instead of $90,000.
Wait, $35,000.
I mean $35,000.
Okay, okay.
Yeah.
Yeah, so that would be pretty cool.
I think we'll see a lot more Teslas if that happens.
Are you already starting that conversation with your wife?
So... I need to buy an electric car it used to be a tesla yeah i mean our next car because of the kids now have to
be a minivan the kid and the future kid have to be has to be some kind of suv minivan something
so they do have actually that that tesla model x which is supposed to be a an suv
but i don't think that's like cheaper yeah yeah that's still the ninety thousand dollar tesla
so thirty five thousand dollar tesla is probably years and years in the future
yeah so yeah mine uh i have another news article. It's Hacks for Everyday Life.
This is a pretty cool question on Quora.
Oh, wait, wait, you talked about this last episode,
your Quora answering.
Did you answer this one?
That's right.
What?
I upvoted several answers on this question. Oh, wait, but none of these are your answers.
None of them are my answer.
But I thought this was pretty cool.
Actually, the first one is, like, enhancing your Google Foo, which I this was pretty cool um actually the first one is like enhancing your google foo
which i thought was less cool um but some of them like uh there's how to pack a suitcase
and it's pretty amazing i mean have you ever tried these i've tried these like how to pack
a suitcase yeah never works like they'd show in the pictures like having these having these little uh like rolling it up in a
special way or putting in these special smaller bags i've never they all my stuff always ends up
being wrinkled and i end up at the end of the trip just everything's thrown in there because
it seems to work just as well oh there's there's two answers both on how to pick fruit which is personally something i struggle with
i always seem to like just i randomly pick fruit and sometimes like the mangoes i get from the
store sometimes they're great sometimes they're dry sometimes they're like they're overly ripe
or not ripe enough whatever and this is just like a few very simple rules like for example for
strawberries i guess how much however much they smell tells you
sort of how much taste they'll have so if they don't notice that before like if you ever smell
the smell of like a ripe strawberry it makes you really want to eat one yeah i mean these are
things i just i guess i was always in a hurry and never like stopped to smell i always smell stuff
and people always think i'm weird because like i'll get food and then like i'll you know hold
my face down to like
smell it not like weirdly i don't think yeah not like uh the guy from lord of the rings like
precious oh no wait what who is that guy what's his name i'm totally drawing a golem golem yeah
yeah not not very golem-esque strawberry picking up anyways but yes i do i noticed that so i really like smelling my food i
don't know yeah i mean and also for um citrus they said to go by weight like if the grapefruit is
heavy that means there's a lot of juice in it so i mean again it's like it makes sense but it's one
of these things that like if you don't think about it you're never gonna do it right so just someone
needs to like educate you and all of a sudden you're never going to do it, right? So just someone needs to, like, educate you.
And all of a sudden you're like, oh, all right.
So I'll look for the heaviest grapefruit and be done.
Also, there's this cool answer.
You know those boxed milks?
Like, not the ones, like, in the carton, but the ones in the actual box, like the rice milk and stuff like that.
Yes, yes, yes, yes.
So this guy has this post where basically if you pour it with the
nozzle facing down which is the most intuitive then you know air can't get out and it makes it
very hard to pour but if you pour it with the nozzle you know on the top of the carton coming
out then the air always gets a chance to go in i don't know just kind of random things like that
i thought they were pretty cool yeah okay i'm gonna try that it's literally just pages and pages of these random things
so so which one have you used the most since you read this well uh i read this yesterday so
so none um yeah none of them but uh but we'll see hopefully i i actually in may
you know i'll be able to travel you know i'll maybe eat some citrus and uh and uh you know
pour some rice milk or something get it all out in one in one day so jason hacks his life
stay tuned yeah that's right time for a book of the show book of the show so this is a total
shameless plug i should i should feel terrible about this but
um i co-wrote a book that is now hitting the shelves it's called html5 game programming
insights i wrote it with uh colt mechanis and a bunch of other people and uh i wrote the chapter on network programming. Hey, your name's on this page.
What, the front page?
Yes.
So if you guys are interested in, you know, writing games for the web, definitely check it out. There's a lot of really short people who have contributed a lot of work into making this book awesome.
I really, you know, it has a lot of authors, but I really like that because... Yeah, so I was going to say, how do you feel about being
an author of a published book? And then how do you feel that you have to share the cover with,
like, it looks like a dozen other people? Yeah, so each person wrote a chapter and there is,
I think, 12 or 13 chapters. So there's a lot of authors. But the good thing is, you know,
I feel like most of these books you
really can't write a whole book um you know the reason is the person who's going to write an entire
book on say i don't know hadoop or something like that um it either is going to take them years and
years in which case the book is already kind of dated or they don't really have like a job or they're
maybe they're on sabbatical or something in which case like they're just really crunching through
the book and not really giving it the attention it deserves right so by having each person write
a chapter i was able to like one focus on something i'm really passionate about which is
your network game programming and two to like you know
i could spend a lot of time on it because it was you know 1 12th of a book and not you know 400
500 pages congratulations so yeah so i think it turned out really well i've read a few of the
other chapters i'm a big fan yeah in general the cool thing about web games is that it's very easy
to just give the link to your friends and family. And, you know, versus like, if you were to make it on Windows or on the phone or something like that, then you have to like, go through a whole bunch of drama to deploy it and things like that.
So will you be rich and famous by the next time we talk to you? Well, considering I'm splitting a small percentage of the royalties with 12 other people on a niche book, I highly doubt it.
But I think I am definitely more educated on HTML5 than I was before.
We will be talking to you next episode of Lifestyles of the Rich and Full of Authors.
Yeah.
I'll be talking to you with HTML html in html uh hashtag or no uh closing
tag hashtag great i don't you wrote a book on html you know i've heard the word hashtag so much more
frequently than closing tag that just took over okay but yeah so so definitely give it a give it
a check and uh um you know let me know
what you think give me some feedback if you find bugs or typos let me know so okay yeah mine is a
book that i wish i wrote does that count that counts you get royalties for that no i do not
this is called the martian by andyir. Weir? I don't know.
Andy.
And this is basically, I think, I won't try to, I'll try not to spoil anything,
but I think the back cover says it's basically Robinson Crusoe on Mars.
Oh, nice.
But that's only like a vague, like, don't think too much about that,
or you might have a mis-expectation about what the book is about so basically you know basically like a guy surviving where it's otherwise unexpected that he
would survive um isn't that similar to the abyss the movie the abyss i've not watched that i don't
know what that is oh basically in the abyss this guy um don't spoil it wait i might should i might
should watch it read it no no i won't spoil it but basically you know he goes into the abyss this guy um don't spoil it wait i might should i might should watch it read it no no i won't spoil it but basically you know he goes into the abyss which is like a very deep trench
and um he ends up there for a long time which you just wouldn't expect and so it sounds like
it's kind of similar maybe so the guy on mars and what happens okay and so it's really cool
has a lot of science in it but it's kind of one of
those dangerous books where um there's a lot of science that makes sense to my head but i don't
actually know if it's true because it's it's a fiction book oh right so like you ever you ever
do that i don't know i read a lot of science fiction and then until like i have contradicting
evidence i kind of just like have this bit of information in my head that i learned from a
fictional book um yeah and oftentimes it turns out to be true right like
somebody will write about something about black holes and it turns out that thing is actually
true about black holes um except that there are no actual black holes anymore but um it'll turn
out to be true like later on i'll find out but then other things i have no idea if they're true
or not because i just read it in a fiction book but it sounds good to me yeah yeah this happens when you you read a
fiction book and it starts off you know in the present or something there's a bunch of you know
common landmarks everything seems pretty legit and then you know by the end of the book there's like
aliens and orcs and dwarves are fighting each other and it's like well somewhere
in between there it became fiction but you don't really know how where that gradient is yeah that's
true like stuff will take place in like a city and it's like i know it's a valid city but i've
never been there or and so i'll mention stuff that i know are like actual places there and then i just
assume everything they mention is actually there. Right. And so,
including the capital.
Yes.
Including the giant castle with heads on pikes.
Yes.
In Chicago.
But anyways,
I recommend this,
the Martian.
It's not that long.
That's a Detroit.
So there were,
there were,
it's definitely a fiction book.
Cause that what you described is in Detroit.
Oh,
okay.
But the Martian by Andyy weir i i recommend it
was really fun read and um it was kind of nerdy whether or not the nerdiness was true or made up
the guy either spent a lot of time doing research or he's just really creative this is great you
know when you recommended ready player one i immediately read it because it just your description
i just knew i was gonna love that book and i did it was great um and I definitely will read this book you should
definitely read this book it's not that long it's really good um and it has also cultural
references to like 70s tv shows uh I probably won't get any of those but I'll read the book
anyway I didn't either but I knew that they were there oh okay fair enough uh so unless the 70s tv
show is like uh price is right or something like
that uh yeah i don't remember what they were now um but yeah something anyways uh time for tool of
the show all right tool of the show show show my tool of the show i can't believe that we haven't
talked about this before but uh it's virtual box and And VirtualBox is amazing.
If you haven't used it, if you haven't downloaded it, just right now download it.
We have this situation where I'm at work.
We have this server.
And we don't have a compiler on the server.
So we figured out what OS it was running.
And then using VirtualBox, we built, what was that?
Using VirtualBox we built some source code, we compiled some source code into binary in
this virtual PC and then sent it over.
So I'll explain VirtualBox briefly.
It's kind of like an emulator,
like those video game emulators for Nintendo and things like that.
But it emulates your own computer.
So in other words, like it emulates, you know,
an AMD 64 or x86 or whatever architecture,
which is what you're running right now on your desktop or laptop
and it even hooks in like if your bios is new enough it'll you know do some cool stuff there
where it makes it really fast and it can even like use your graphics card and stuff like that
so you know you might be running say windows you might want to try out Linux, but not have to go and buy a computer, and then now you
have two computers sitting around your house or whatever.
So you install VirtualBox, and then you create a brand new computer inside of your computer,
the virtualized computer.
So it has its own hard drive, which on your computer is really just one file, like on
what they call the host computer but then this sort of parasite computer it has its own hard drive it's only sound card
all these things but they're all fake but they all work you can even like access the internet
you can do everything you can do on your main computer so one thing that i use this for is when i'm building new versions of maim hub
which is this this emulator that i'm emulator open source project that i work on when you build an
emulator in an emulator that's right so i that's hardcore dude i need to yeah i need to build it
for windows linux and mac um and even like the one i build for Windows, I want to make sure it runs on just native Windows.
And same for Mac.
Like I don't want to just, if it builds on my machine, I might have all sorts of crazy libraries and some ridiculous setup or whatever.
You know, I copy it over to someone else's Mac, it doesn't work.
So I have a virtual box guest machine for every OS.
And then I launch all of those.
I can actually launch all of them at the same time.
And now I'm sitting and I have a window for every possible OS.
And in each of those, I have, you know, the code,
which I can update, build, and then deploy.
So it's pretty cool.
I mean, also, you know, let's say you want to test things,
you know, on just regular Windows or regular Mac or what have you. So it's pretty cool. I mean, also, let's say you want to test things
on just regular Windows or regular Mac or what have you.
And you want to make sure that this website or whatever
you built still works on your friend's computer.
But you could just have a virtual computer, which
doesn't have anything on it.
It's just completely bare.
And go to your website on that computer and see what happens.
So it's pretty amazing. What is that's called something i have a specific name for when the instructions run on the cpu
you're on but everything else is virtualized but i forgot what it's called yeah it's like vtx or
something like that that's like the bio setting i don't know um yeah but you're right
there is a term for it because there's like emulating a super nintendo which has a different
processor and then there's like allowing the instructions to actually run but having just
enough hooks so anytime it calls a system call you you trap it and you switch it out for something
else yeah right yeah um crap what is that called it's okay it's been bothering
me the whole time you've been talking yeah it's um there's recompilation which is that's the first
case so recompilation is where you know there's code that's been compiled for like the super
nintendo and you um recompile it you turn their machine code into your machine code but then the other one where
it's it's already your machine code you just need to catch certain instructions i forgot what that's
called too anyways virtual blocks does that it's not like qemc or one of these other ones
which run like painfully so like if you use the android emulator um actually it's a
lot faster now because they do what we're describing but the original version of the
android emulator actually recompiled um all of your instructions from um arm into uh into x86
which is brutally slow um but yeah virtualbox it's fast it does everything you want it handles graphics does it
work better than like what is the other one like vmware or parallels or so it's free and uh it does
everything i want so i've never tried any of the other ones but okay um yeah i mean it used to be
that vmware could do some things that virtual box couldn't. I know now they're pretty much even.
VirtualBox, I think the direct 3D
support is still experimental,
which just comes down to you have to check
a box saying that you want to
do this experimental feature.
But yeah, I've yet to find
something I couldn't do in VirtualBox.
Alright, well, very good.
Yeah, it's good times.
My tool of the week is bit torrent sync
uh so people have issue with the bit torrent which is like a protocol but also a company or
whatever right i think anyway so the company bit torrent made this sync product and it works on the same basic premise as regular
BitTorrent but instead of downloading from the cloud of BitTorrent users a file of the newest
version of Linux only that's the only thing you should use it for you can basically do that with
yourself so it's Dropbox implemented with the bit torrent technology is an easy way to
say it oh i see so if like my mom has like uh this running and i have it running like we can
share our pictures so if one of our houses burned down that's right and it doesn't it doesn't rely
on central servers so it's just all distributed um and it's easy to set up i wouldn't i i can't vouch for the
security of it i don't use it for anything that's sensitive or secure or any of that but i do have
like a computer i have two stories in my house i actually have three stories um in my house my
townhome before people get all excited anyways uh it's so like my garage i actually have a computer in my garage
because i use it when i'm working down there and a computer in my top top up where my my office is
and i want to synchronize between them without a usb drive and so i use this because there's files
i want to be shared back and forth between them and so i can run it on both computers and then
the directories are kept in sync and i don't have to worry about size limits i can have multiple different ones running and i don't have to worry about accounts and the way
you actually set it up is really easy there's this thing they call a secret which is a i forget how
long like a 64 character uh string hash basically and when you create a share folder it gives you a
hash and then you can share that hash on other computers i just email it to myself uh and then you can share it to other computers put the hash in there
and then it'll start synchronizing to that and anyone else who puts it in even a stranger would
also start sharing to that folder oh i see but there's so many possible numbers yeah so i think
the chance of that happening is really low security by anonymity or something like anonymity yeah and it also does show you like when someone's sinking and what other companies so
you would know if like if you were watching i guess when it was happening or look in the logs
you'd be able to see like oh someone else accidentally collided with me but i think
it's probably long enough where statistically is very unlikely to happen uh unless someone was hunting and then
using a lot of computers to hunt for uh active hashes or whatever you know this always fascinates
me like the idea that there's a one in a you know whatever a billion or a trillion chance
that i get like all of you know some like really important
documents like i feel like this is a book waiting to happen you know like some kind of thriller
where it's like you you mistype your your bit torrent sync secret and all of a sudden you get
real nsa secrets or something but this was like a king of queens episode i think once it is it is intriguing where it's like
they go to the is it them no what i'm trying to remember if it's that or another show some show
i i forget and they go to the get film developed and they uh pick up their pictures and they
accidentally pick up someone else's pictures and then they start living vicariously through those
people's lives basically like they keep doing it and they want to keep finding out who these
people are and why they're so much better or whatever and more interesting and doing cool
things oh man that's awesome so all right good times well time for the topic of the show design patterns design patterns so yeah basically um at a high level
design patterns are sort of these like communal agreed upon you know good strategies when you're
programming and generally um although some of them are a little bit specific to certain types
of languages or certain paradigms,
but generally they apply to almost any language and almost any task that you're working on.
Yeah, I think design patterns, when I first got introduced, people were always like,
oh, they're so revolutionary.
I don't know.
It was such a big deal when they first learned about them.
And I didn't have that same experience.
What it is to me is just kind of like things you,
if you've been programming for any length of time
or seen other people's code,
you've probably seen at least most of the ideas.
But it's just a way of making it concrete
and like saying by understanding it
and giving it a name a pattern you'll recognize it
and by recognizing it you won't you can reuse code because you already know how to do it
or you can not fall into the traps that you know are likely to happen with that pattern versus just
you know kind of the wild west of coding where you just code whatever you want and reinvent it
every time you need to do something um right and so it's just a way of codifying these ideas and giving them names in a common language
for people to talk about.
Yeah, I mean, the common language is really important.
I mean, there's, you know, it's sort of like this is true with programming contests.
So I did a lot of programming contests back in college and the people who write
the questions are usually ex-competitors right and so you end up with this with this like gnosis
this common language that's built up through the years and like the the coaches are also problem
writers are also former contestants and and it just kind of feeds on itself and you have to sort of if
you're not sort of in the click then you know you could be brilliant but you won't be brilliant in
the same direction and there won't be enough overlap in what you know and what you know the
the judges or the the problem writers know and you just won't do well and so this is one of these
things with programming where you know by learning these ways of doing them and knowing where to when to spot them
it will sort of like make it easier for you to integrate yourself in the ecosystem
yep um they're not magic bullets a lot of people think like oh i'll just use a design pattern and
it'll fix my problem maybe i don't probably not um we
won't try to cover all of them because we would only be able to do a uh not enough good helpful
things about it so we're going to try to cover only a few and maybe we'll have a design patterns
too later yeah if you like this episode then you know go and check out the wikipedia page on design
patterns because there's there's a ton
of them but we're mainly going to cover ones that we have you know practical experience and stories
to share and things like that yeah and um you know some of them especially we'll talk about the first
one a second i've seen people overuse like it was like it caught on and it was fashionable
and then i saw people use it in you know a way to excuse bad behavior almost.
They were doing something bad.
They did this thing instead.
And then because it's a design pattern, they're like, oh, but it's a design pattern.
And it's like, yeah, but you're still doing the bad thing.
You just labeled it.
So with that transition, we'll talk about the singleton.
So the idea of a singleton is, I guess, kind of what it sounds like. You want a single something, only one of a singleton is i guess kind of what it sounds like you want a single something
only one of a thing um so one instance of a class and no matter if people try to create new instances
they should just get back the same instance so people are just getting kind of the same reference
reference to the same object and so um this has a lot of useful applications. And as I was alluding
to, in recent years seems to have gotten a lot of bad uses as well. So one thing that it's really
great at is if you have a class and you want to share data amongst all parts of your applications.
So for instance, if you had a file handler for a log log and you wanted to be able to write to that log
from you know your error handling system but your error handling system gets errors from all over
the place or whatever and you may have different instances of error handling but they all want to
append to the same log for whatever reason you could have a singleton object that represented
the log and anybody who asked for x hey, I want an instance of the log
would get the same shared instance,
just one file,
but everybody could pass information into it.
That doesn't mean it's automatically multi-thread safe.
So that's a separate topic,
but everybody would at least know
what file was going to be written to
and then could kind of handle separately
how to write to it in a safe fashion.
But that's something you might want to share
throughout an application and pass around.
And so...
Yeah.
Go ahead.
Oh, yeah.
The nice thing about a singleton too is
if you have just global variables sitting around somewhere,
which would be sort of alternative to this,
then you never really know when they're initialized or not.
But the thing about a singleton is that, you know, by design,
when you say, you know, get instance or get singleton
or whatever function that you want to call to get your singleton,
it can check and see if the singleton's initialized.
And then depending on how your logic is set up,
you can either error if you tried to use it too early
or you can initialize it on the fly.
But as opposed to just some variable,
some number that's sitting out there,
this will sort of let you know
at what state the singleton is in.
Because often one of the hardest things to do
in writing an app is you get a very complicated app
to start correctly and in the right order so
that nothing blows up yeah so some people do use it so like you mentioned kind of lazy initialization
so it's not initialized until someone actually needs it and that can be good that like avoiding
code at you know when the initial app with it different languages and models have different stages so speaking generically it's not until someone actually goes to
use the thing that's a singleton that it actually runs the part of the code that
does the initialization so before that it just kind of sits there and doesn't
initialize all its variables and its state and so that can be really helpful
if it needs to do something expensive. But doing
something expensive at an unknown time in the future can also be dangerous. Right. Exactly.
So that's not good. And then Jason mentioned global variables, which is one of the things
I've seen people. So a lot of people have begun to understand that global variables are dangerous
because it's a way of it's very difficult to
keep track of who's changing what and so a lot of pieces of your code may change something that's a
global variable and then if it gets into a bad state it's hard to tell who changed it amongst
other problems and so i've seen people one of the bad uses of the singleton is to basically
have these global variables that are modified from everywhere and just stick them in a singleton instead of leaving them as global variables.
And I don't think you've made the problem much better.
Right.
You've made it easier to share around the global variables,
but you haven't made it less likely that you'll hurt yourself.
Yeah, exactly.
Exactly.
Cool.
Yeah, I mean, definitely you'll see singletons everywhere you go.
You really can't avoid it because there's almost always,
like whether it's some kind of hardware component or, as Patrick said,
some kind of logging, so it's tied to a single file on your computer.
There's almost always some part of your code which is you know is tied to either you know database what have you
which you know there has to be only one copy of that shared by many different clients and so um
the singleton is an easy way to sort of get that to work right yeah and and the singleton does get
used in a lot of the other design patterns as well because they want only one of something
um right and that's how you kind of do it.
So design patterns can be used in other design patterns.
Shocker.
Recursive design patterns.
Yeah.
So one that I really like is facade.
So, you know, imagine this, right?
You're writing some app and you want to have some kind of database for your app.
So you could do some kind of like HBase or Cassandra.
And actually, we're going to have a show on databases later.
But for now, just take this at face value.
You could use one of these really distributed, fault-tolerant,
all these very robust databases.
But it's a huge pain to set up and it's kind of a nightmare.
If you don't know what you're doing, especially if you do a lot of initialization and all this stuff.
And the reality is you might not need that.
Like your website or your app or whatever,
it might not need that kind of a
sledgehammer. You might be fine with just storing everything on a file on your computer, right?
So whenever you have this kind of situation, you're stuck with, there are several options,
right? You could either say, well, to account for growth,'m gonna you know you know use hbase or one of these
things and you know spend days setting it up and maintaining it things like that you can go the
other end and say i'm just gonna put everything in a single just text file all my data all my user
data everything will be in a text file and i'll load it all into memory when i start up the server
and then what will happen is that will get you by,
but then all of a sudden your app makes it on Slashdot or the front page of Hacker News or something like that.
And all of a sudden your website completely blows up
and it's going to take you months to rewrite your whole website
so that you can use HBase or one of these things.
And now you're really in a struggle.
So another thing you can do, and you have to make these kind of decisions, there's many,
many times you have to make decisions like this for various parts of your app, is to
create a facade.
So create some library where, in this case, think about in terms of a database, create
some library where you can give it data in some format,
and then it will have sort of several back ends.
So it might be that any time you write anything,
any time your app has to write anything
that needs to stick around, that needs to go to disk
or something like that, it goes through your library
and then to the hard drive.
So there's something in between the thing that opens the file
and reads it.
There's something in between that and your code, which
needs to get and store data.
Then if your app becomes really successful,
that middle layer can just call a different know, a different database. Instead of like reading from the file, it can read from
MongoDB or Cassandra or something like that without having to change all of the stuff above it.
So
this is an example of a facade. So
there's one open source library I wrote a few years ago that I still use today called zombie DB and it's literally just a facade for a bunch of these databases so at the
time I didn't really know which database I wanted to use and I didn't want to do
a bunch of coding only to find out that I have to redo it all so I created this
facade and generally when you have these kind of things because there's like
databases or some kind of like you have these kind of things because there's like databases
or some kind of like networking or any kind of like library where you don't have the source code
um you know or anything kind of really complicated that you might have the source code but you'd
never want to look at it you know like hadoop or something like that where it's like you just
you know cross your fingers and hope it works anything like that where where you have options and you're not sure which option to choose,
a facade will let you choose all of the options at once.
And what could be better than that?
Choosing all the options at once, yes.
Always the right option.
Yeah, that's right.
When all else fails, choose everything.
Of course, on the downside, the onus is still on you to connect
your facade to each of those
backends, and that could end up being
pretty time-consuming.
Again, you can do that in a lazy fashion.
Your facade could just
connect to one backend,
and then later on
if you need a second one or you want
to explore a second one, you can do that.
Nice. The third one to
talk about this episode is the observer or publisher subscriber design pattern um and this one
it's kind of obvious i guess at some level but you know i think a lot of people miss opportunities
where you could use it because they feel like it's too expensive because it sounds a lot like message passing or queuing things which can get expensive but it doesn't
have to be all it says is you know you have something that wants to observe something happen
in another class and there you need a way to register that and then for it to get notified
when that thing has happened so the actual keeping what things need
to be notified can just be you know as simple as a linked list or an array or you know it doesn't
have to be complicated like actually like a full-blown queue or message passing and this is
really useful for if you have different parts of your system that you, kind of create events and don't know who necessarily, you don't want a hard code that like,
hey, my, I'm trying to think of a good example.
So my device, so I have a device driver, right?
And at some point I have, oh, here we go.
I have robot and I have a laser scanner.
So at some point, which can change over time,
my scanning of the room is complete.
And I have a image of the room,
a bunch of distances that my laser range finder has found.
And it's complete.
But nobody may currently,
the robot may be in like a not moving stage
or not care stage or still processing the last one.
So nobody may care at this time that,
hey, I finished scanning the room, here's my data.
And as writing the device driver for that, I really shouldn't have to care.
Wow, that's too many cares.
I shouldn't have to worry about if anyone cares about my data or not.
I simply just finish making the data.
And then, you know, I kind of delegate to this piece of code that goes and says, hey, who currently needs to be notified?
And anyone who needs to be notified, I notify notify them and then they can take appropriate action and so that's the the kind of the basis of
that that design pattern and it is useful in a lot of places because that notion like i said i don't
have to worry about when i'm writing my piece of the code i don't necessarily worry about who else
is listening or having to have a hard-coded list of here's to notify
that needs to change and it needs to be maintained.
And then when I add something new that needs to be notified,
I got to go add it to 100 different places.
Yeah, I mean, this saves, yeah, exactly.
This saves like a gigantic headache.
I mean, I used to not know about this,
like when I started and it ended up with a nightmare it's
like for example there's because there's all these cascading effects right it's like uh
you know I was making this video game and it was like okay so I pushed this person it was like one
of these like tactical games like it was kind of like chess but you know pieces that can move
around it's like okay I pushed this piece um and now the piece got pushed to a place where
he's not on solid ground like he's like floating i pushed off a mountain or something so he has to
fall but then i need to like show an animation of the falling and then every turn they need to
fall a little further there's just like all of these you know nested effects and then eventually
what would happen is invariably you know they would fall
and somehow that would cause the first player to get experience so i tried to add to the experience
but i was already in the context of the first player so it caused some kind of deadlock and
the whole game would crash and i realized that you know trying to handle all of the side effects
of of your code just by calling the appropriate function just leads to a complete mess.
This is a complete nightmare.
I mean, if you find yourself, you know, 15 levels deep in function calls, that's a bad sign.
So this pub subscribe lets you say, look, you know, it doesn't have to happen right away.
And most of the time that's true. So just say, this guy got pushed off a mountain,
so the next time I have a chance,
he needs to get hurt and fall off the mountain
or something like that.
But it doesn't have to happen right now.
So the idea of sort of separating
the time that you're presenting to the user,
and this is true whether you're doing a game
or an email system or what have you, right?
Like separating, you know, the time that, you know,
the text upon which you present things to the user
from the actual flow of your code is really important.
And just knowing that you can make several passes
through your code before you show, you know,
output to the user gives you a lot more freedom.
And there are some dangers, right?
So like I said, if I'm going to notify a bunch of people that my laser scan of the room is
complete, that probably requires a lot of processing to handle.
And I might call several people who are, several people, wow, several other classes that are
interested in that, that may want to do heavy processing, right?
And without care, I could synchronously be doing that every five seconds to do heavy processing right and without care i could
synchronously be doing that every five seconds when i finish right so it's relatively slow every
once every five seconds and then it needs to do a lot of processing and that could delay the system
but the things you notify don't have to process right away it could simply be that they need to
know that next time that they get their time slice to process that they have something that they have to handle like oh hey this thing now has data and it lives
at this address so you should go read it right um and that that's something that you have to
to take into account as well yeah i mean the downside of the pub subscribe is exactly the
same as the upside which is it know, things don't happen immediately.
So, I mean, they happen whenever the subscriber, you know, reads the next message.
And so if as a publisher, you know, you publish some data and then you immediately expect,
you know, you make assumptions about that.
You make assumptions that the subscriber has read your data when that might not be true.
That's a place where you can get burned, right?
Yeah, if you're not careful, yep.
So that's why I was saying you might make it the responsibility of the callers.
If they need this data, they have to copy it out when they get the notification.
Right, right.
Yeah, so you just got to be careful how to handle it.
So we are not the first people to talk about design patterns, obviously.
This is an established field at some level.
So we have some resources for you if you're interested,
people who cover this topic in far more depth, more eloquently,
and with more knowledge than me, at least.
And so the first one is the kind of, I guess, most famous,
at least it's the one I first heard about,
and it's, I guess, maybe one of the older ones
to first come up with this language
and have a catalog of these design patterns.
And it's known as the Gang of Four
because it had four authors,
and it's design patterns,
elements of reusable object-oriented software.
It's not the most approachable book. It's not the least approachable, but it's not the most approachable book.
It's not the least approachable,
but it's not the most approachable coding book.
I had it and I won't lie,
I couldn't make it all the way through it.
But that was many years ago or several years ago.
So if I read it again, maybe I'd get more out of it.
But it's the one that was kind of the granddaddy of them all.
Yeah, I had the same experience you did where I read the beginning of it.
And it was just kind of, it was too much for me.
Like at the time, I just didn't.
It's just, it's very dense.
And it was kind of written for like true enthusiasts.
And yeah, I just couldn't digest it.
I did read the second, like this other book, Head First Design Patterns.
Yes.
Which is, I did read that one and I thought it was pretty awesome.
You know, it talks about all the different design patterns and detail and things like that.
But it has this like, what would you describe like kind of Americana theme?
So it sort of has a lot of these like leave it to beaver type, you know.
Yeah, it doesn't take itself too seriously.
Yeah, it's kind of goofy and it's like, hey hey make sure you have apple pie with your singleton or whatever that's kind of funny um it's it's got a lot of good content it has examples which is
really useful um and uh yeah that was the one that i liked the most of all of them yeah so this final
one uh is actually a website that's a book called game programming patterns.com.
And I saw this one posted this week.
Actually,
this guy finished writing this and he did one of these interesting novel
approaches where I think he was publishing drafts as he was going and getting
feedback and bugs filed against him and all this.
So he was sharing it as he was writing it and he didn't publish it in a
traditional sense.
And he has a whole story about it. You can read you can read i actually didn't read the whole thing and but i was going through this and it's from the perspective of a game programmer a guy who
was writing who worked at ea for a number of years writing games and saying how that in game
programming there's still a lot of people who don't use design patterns and they don't think
it's for them because it they're they're too manly to use design patterns or whatever and so he has
a pretty epic picture of him and his chihuahua on the front page uh okay you'll have to go see it
for yourself but he has like kind of organized uh design patterns under the context of things that
would be useful for a game and using games as examples.
But I find that to be generally useful when I was skimming through that this week because everybody kind of understands games at some level because we've all played them.
So we can imagine it versus we haven't all used enterprise software.
So it doesn't make as good of an example per se.
So I find that the examples here work well
and he does a really good job of explaining them demonstrating their uses and giving cautionary
tales oh nice you'll have to check that out and it's free yeah it's pretty cool it looks like uh
he's working on an ebook um so you can sign up on his mailing list to get the ebook but in the
meantime you can read it all online on an html format
yep well i think that's that's it for this episode yeah definitely uh you know obviously
you know if you want to you know get involved in open source and other projects it's really
good to sort of wrap your head around some of these design patterns you'll see them all over
the place um so it won't be hard to find them but uh it might
be a little challenging to know that they're there at first um it's the way to step up your
programming to the next level that's right that's right i mean a lot of even languages like javascript
um is kind of you know a lot of like client server like socket io for example in javascript has like a socket io has this concept
of rooms where a room has an id and you can join a room and anyone who's in a room receives all the
messages that get posted to that room but it you know like it's basically a publisher subscribe
i mean what they're calling a room is really just a subscription that you can
join and leave. And if you're joining, then the server publishes messages that you receive and
vice versa. So, you know, you'll see the same patterns over and over again. They might have
different names. They might be called differently. But, you know, reading a book like Cutverse
Design Patterns and following our our podcast you'll be able to
see them when they come up so
we had some good emails so thank you for your email
and your continued support of this show
yeah somebody suggested
design patterns ironically and I
told that person I think people have suggested
almost all the topics we've ever covered
yeah that's true but
design pattern I told him uh oh no
patrick has this show picked out but we'll do design patterns next show i said that to somebody
like two days ago so it turns out that uh that's what you pick so someone has uh someone knows you
too well you and someone else your hearts are beating to the same drum that was actually just
me oh it was your alter ego on
google plus i'm just kidding but thanks for you guys for your reviews and your posts on our
community on google plus and emails yeah definitely we have a facebook page that i'll be keeping up to
date along with the blog and i won't lie i don't have a facebook account so you do not you still
don't have a facebook account i may have one i don't know
i've not logged on facebook in three four years how do you log into anything i make up fake emails
and passwords oh my gosh okay um i know i know it's just a thing i don't well yeah you don't
want i don't have time to keep up with the stuff i do have so yeah well i mean the bigger thing too is like everything
becomes linked then right um like uh a separate discussion for another time yeah if someone
compromises my facebook account now they have everything so i'll get to work
oh man it's good oh man did man. Just a really quick thing.
And maybe we'll talk about this on the next show.
But we definitely need to cover the Heartbleed OpenSSL fiasco.
All right.
Maybe we'll save that as a thing for the next show.
But, yeah, there's many soapboxes we can get on about that one.
Sounds good.
All right, guys.
Well, keep coding. keep using those design patterns,
and we'll see you guys in a couple weeks.
See you.
The intro music is Axo by Binar Pilot.
Programming Throwdown is distributed
under a Creative Commons Attribution Share Alike 2.0
license.
You're free to share, copy, distribute, transmit the work,
to remix, adapt the work,
but you must provide attribution to Patrick and I and share alike in kind.