I found a camera today at home, and then it hit me: this was the camera
we took to Istanbul, dropped on the floor, never worked again, and I
never found after we came back! And it still had the SD card in it!

So, here are the pictures (not even filtered), so family can see them.

I am not going to explain this book. It's enough, I think, to say I loved it, and that it's
strange, and that it's a bit of a mistery.

Imagining a universe in which all the contents of the book could be real at the same time in a way that would allow all the pieces to be written as they are and yet, be, somehow, not the novel they are, but a found artifact, is both depressing and ellusive.

At the end, I felt something I can only describe as retrospective hope, the feeling that things
were supposed to end up better, but that even as terribly as they did end, were it not by that
earlier hope, they would have been more grim.

The control the author has over his own style is impressive. This book feels written by half a dozen completely different writers.

Some quotes (which may only make sense once you read the book):

"The sun was deaf'nin' so high up, yay, it roared an' time streamed from it."

"In the first set, each solo is interrupted by its successor: in the second, each interruption is recontinued, in order. Revolutionary or gimmicky? Shan't know until it's finished, and by then it'll be too late"

"What wouldn't I give now for a never-changing map of the ever-constant ineffable? To posess, as it were, an atlas of clouds."

It's not that I need a CDN in any way, since the traffic for this site is little
and the way the site is built is light, but hey, it's free, easy to setup
and easy to leave when I feel like it. And I expect to have significantly
higher traffic eventually after I finish some not-so-secret projects.

What's CloudFlare's service? They take over your DNS, then put a reverse proxy
between your site and the clients. That reverse proxy then uses a CDN to
serve you the pages from a conveniently located server, and can rewrite
the HTML/JS/CSS in some ways to make it faster/safer/nicer.

It also supposedly will protect my site from different kinds of attack (the only one that
could possibly affect me was DOS attack, but thanks anyway ;-)

Also, they offer a platform so apps can provide services for me, like
intruder detection, analytics, and others, which is a very cool idea.

So, I created an account at cloudflare.com and configured it so
that http://ralsina.com.ar (which is this exact same site except for
wrong comment counts) is served via cloudflare, and lateral.netmanagers.com.ar
is served directly.

What I've seen so far:

Setup is very simple

It works, even setting up experimental features

It does seem very slightly faster, but that's not a surprise since the
tiny server the site runs on has good conectivity and ample unused
resources.

It does do a good job of automatically optimizing some things in ways
that are generally accepted as a good idea (in other words, my pingdom
and YSlow numbers moved up)

So: no pain, maybe some gain. I will probably move all sites into it
tonight.

We all hear all the time that less is more. That simple is better, that
complex is worse, that options are evil, that defaults are what matter.

And yes, that is about 90% true. Except when it is false, which I know
because I bought a coat a few weeks ago.

This is a rather nice coat, and if you saw it without much care you would
miss one of its best features: it has two pockets on each side.

Let's think about why we want pockets in the sides of coats:

To put our hands when it's cold. Since this is a cold weather
coat, that's important. In moderate climates like this one,
gloves are more trouble than they are worth, and just sticking
hands in pockets is enough.

To put stuff that is not hands in them: keys, phones, money, candy, etc.

For the first use case, we want the pockets to be shallow angled, so that
the hand goes in naturally, almost horizontally. Also, we want the access
to be unobstructed, so no zippers, which also scratch the wrists.

For the second use case, we want things not to fall off. So we want either
a vertical pocket (perhaps with a flap) or a zipper. Zippers suck because
you can forget to zip them, and things fall off. Vertical pockets are awful
to put your hands in.

So, my jacket has two pockets on each side, one with a zipper, one without.
One for hands, one for things. Since it's a thick coat you don't see it
unless you know what you are looking for, and it's trivial to use:
everything goes in the zipped one, except my hand. I can even check the contents
of the zipped pocket without getting my hands out of their pockets.

This is one case where more is more, complex is better, options are
awesome, and defaults don't matter. Now, if you find a place in
software where that's the case, that's an opportunity.

Two upcoming features for the next release of Nikola,
my static site generator, due sometime in August.

Filters

Filters let you postprocess your output. Think of it like instagram for
websites, but useful. You can configure per file extension a series
of python functions or shell commands, which will be applied in place
to the output file.

For example, suppose you want to apply yui-compressor to your CSS and JS
files:

There, filters.yui_compressor is a simple wrapper around the command
so that it applies in-place to the output files.

If you use strings there (untested), they are taken as commands. The "%s" will
be replaced by the filename, the usual crazy shell quoting
rules apply:

FILTERS={".jpg":["jpegoptim '%s'"],".png":["pngoptim '%s'"],}

Keep in mind that the filters modify the output of Nikola, not the input, so
your images, CSS, and JS files will not be touched in any way. And of course
changing the filters applied to a file will force a rebuild, so you can
experiment freely.

Bundles

Having many separate CSS or JS files is usually a nono for performance reasons
because each one may involve a separate HTTP transaction. The solution is to
"bundle" those files in a single, larger file.

The reason not to do that is that usually it means having a huge, uncomfortable
thing to handle. So Nikola tries to give you the best of both worlds, by letting
you have separate files, and bundling them (or not) on build.

There is a new option, USE_BUNDLES that defaults to False, and there are
some changes in the theme templates so that it uses the bundled version when
needed.

This was only possible thanks to Webassets.
However, if you don't have Webassets installed, or you don't enable USE_BUNDLES,
this should cause no changes in the output.

Conclusion

These new features will allow Nikola users to improve their site's performance
with minimal tweaking, which is always a good thing.

I was a sysadmin for a long time. I did that for money, so I never really
wanted to spend time doing the same thing in my own time, which lead to
a severe case of cobbler's children walking barefoot in my private server.

So, today at lunch, I decided to clean up my garbage. So this is what I ended
up with, which is the minimal server that is good enough to be generally
useful for me.

Hosting

This is a cheap VPS provided by the nice folks at burst.net
who are not giving me anything to speak nice things about their service. However,
I will do it anyway:

Crazy cheap ($5.50 but I have a 20% discount for life)

Good amount of monthly bandwidth

Lots of disk space

Good uptime

Fast network

Very cheap

Decent performance

Distribution

I had CentOS 5 installed, and it stays. If burst ever starts offering Ubuntu Precise, I
may switch. Or, since this works, I may not.

Virtual domains are just folders and symlinks inside /srv/www which is the easiest possilble way
to do it.

It supports reverse proxying for when I want to try a python web app I am working on.

Mail Server

No, I don't want a mail server. I have gmail and/or a real mail server for that. I want to get
the mails from cron. For this, I used ssmtp
and an extra gmail account. It works, and here's the whole config:

The best I can say about this configuration is that it works, and doesn't involve running
a daemon.

Misc

For when I need to be in two places at the same time: OpenVPN rules, and
there is no argument. I have a squid running occasionally, and there is a
Quassel core for IRC stuff. I installed mosh
to make ssh less painful, rsync handles file deployment
and backup storage, cron schedules stuff, and that's it.

This is a response to a response to this webcomic titled
"How to suck at your religion". While Oatmeal's comic is crass and paints things in broad
terms, it's a freaking webcomic. So it's supposed to do that. Butthe response is so full
of phallacies (and lacking in webcomic-ness) that it may deserve a response.

I have promised not to be a troll (anymore) so I will try to answer in a sensible manner.

Here's the article I am replying to go read it
if you want. I will not reply to all of it, but will instead cherrypick a couple of paragraphs.

In response to the "forcing dogma" panel:

So... religion is fine, unless you actually believe in it? Should parents not pass
their political, ethical or moral views on to their children as well? What parts of
parenting would be left if parents were to avoid passing their views on to their kids?
The irony here is that silence is itself a statement. Avoiding any mention of God to
your kids sends as clear a message as talking about God: specifically, it tells your
kids that God's existence is either untrue, unknown, or unimportant. Because if you
knew Him to exist, surely you'd share that knowledge, right?

Let's start from the top: you don't know god exists. You have faith that he exists, but
you don't know it for a fact. If you knew for a fact that he exists, you could not
possibly have faith because faith excludes certainty. As your bible says,
faith is "the substance of things hoped for, the evidence of things not seen."

So, do I tell my son god doesn't exist? Nope. I tell him I think he doesn't exist, and
that I have never seen r heard of any reliable evidence or datum that points towards his
existence, but also that some people do believe he does exist. I told him that because
I feel that's a honest answer. If your honest answer is "god exists", then bully for you,
but from the point of view of a non-believer you are telling your son a lie, or at best
a half-truth. And if you really don't know he exists for a fact then you are just
lying.

Now, are you sayin that you know god exists factually? Based on what? That's the usual
slippery slope for this argument. The religious are the ones making statements of fact
based on tradition. To the rest of us, they just seem to be playing loose with what
"fact" means, or what "god" means or what "know" means.

So, no, don't avoid mentions of god, just avoid lying to your kids if you can.

This next section is probably the worst, because it's just an incoherent argument.
A kid asks, “Dad, what happens to us after we die?” The author compares providing
the Christian answer to this question with correcting your kid for having green as
a favorite color. What?? That just isn’t a coherent argument. In what world are
those two ideas parallel, or even comparable?

According to the webcomic, good parenting is to pretend to be agnostic, and say
that “no one really knows for sure.” Of course, if the Resurrection is true, that
claim is false. So to be a good parent, you apparently have to deny the Resurrection
and embrace agnosticism, treating beliefs about the afterlife as mere matters of
personal preference like having a favorite color. This is just… stupid. There’s
just no other way of describing it. Imagine if we treated everything that way.
“Dad, what’s 3 x 3?” “No one really knows for sure. What do YOU think 3 x 3 is?”

So, comparing life after death with color preference is stupid and incoherent, but
comparing it the christian belief of resurrection with basic arithmethics is a-ok?
That must have taken some effort to write with a straight face, I'm sure.

So, let's go slowly on this one. Beliefs about the afterlife are, like most other
beliefs, probably not a personal preference, but just something you have, because
of, in most cases, indoctrination early in life, peer pressure, and just because
you live in a society where that belief is normal and approved of.

But what is it your belief in the afterlife is not?

It's not inherent to "you". If you were born in another place or time, you would
probably believe something else.

It's not undisputed. Because there exists a majority of people who don't believe
the same thing, either by details or entirely.

It's not unique. Because other religions have had similar resurrection beliefs.

It's not reliable. Even if we were to accept everything the bible says as true
that would not mean we know what will happen to you or to me after we die. We
would have a testimony about what happened in a few days in the afterlife of a
specific person, at a point in the past, as told to someone by someone. Is that
the same as knowing what will happen? No it's not.

Let's compare that to 3x3 as the author attempted:

If I was a chinese in the 12th century: 3x3 is 9.

There is no group of people that believes 3x3 is 8 or 10.

There has not been in the past any real disagreement about the value of 3x3. We have
not achieved that result via a gradual improvement.

We rely on 3x3 being 9 every day in our lives. If you drive a car, use a phone,
or zip your pants, you are agreeing 3x3 is 9.

We don't expect 3x3 not to be 9 in the future.

Notice any differences? Yes, me too.

Personally, I consider your faith in god more akin my liking Queen (the band, not the ruler).
I was exposed to Queen at the right time, it was approved by my peers, and I like it. On the
other hand, I understand that Queen is not everyone's cup of tea, and I don't claim Queen to
be the "right" band.

The whole "if the Resurrection is true, that claim is false" line of thought is not logical.
If my cat had wings, then the claim that winged cats are awesome is false. But my cat doesn't
have wings. Does it make the winged cats less or more awesome that he doesn't? It's not that
it's not right, it's that it's not even wrong.

I had proposed a talk for PyCon Argentina called "Driving 3 Nails with a Shoe". I know,
the title is silly, but the idea was showing how to do things using the wrong tool,
intentionally. Why? Because:

It makes you think different

It's fun

The bad side is, of course, that this talk's contents have to be a secret, or else
the fun is spoiled for everyone. Since the review process for PyConAr talks is
public, there was no way to explain what this was about.

And since that means the reviewers basically have to take my word for this being
a good thing to have at a conference, which is unfair, I deleted the proposal.
The good (maybe) news is that now everyone will see what those ideas I had were about.
And here is nail number 1: Writing a spreadsheet using doit.

Since I have been using doit for Nikola
I am impressed by the power it gives you. In short, doit lets you create tasks, and those tasks
can depend on other tasks, and operate on data, and provide results for other tasks, etc.

See where this is going?

So, here's the code, with explanations:

cells is our spreadsheet. You can put anything there,
just always use "cellname=formula" format, and the formula must be valid Python, ok?

task_calculate creates a task for each cell, called calculate:CELLNAME.
The "action" to be performed by that task is evaluating the formula. But in order
to do that successfully, we need to know what other cells have to be evaluated
first!

This is implemented using doit's
calculated dependencies
by asking doit to run the task "get_dep:FORMULA" for this cell's formula.

For example, in our test sheet, A1 depends on A3 and A2 but those depend on
no other cells. To figure this out, I will use the tokenize module, and just remember what
things are "names". More sophisticated approaches exist.

The task_get_dep function is a doit task that will create a task called "get_dep:CELLNAME"
for every cell name in cells.

What get_dep returns is a list of doit tasks. For our A1 cell, that would be
["calculate:A2", "calculate:A3"] meaning that to calculate A1 you need to
perform those tasks first.

defget_dep(formula):"""Given a formula, return the names of the cells referenced."""deps={}try:fortokeningenerate_tokens([formula].pop):iftoken[0]==1:# A variabledeps[token[1]]=NoneexceptIndexError:# It's okpassreturn{'result_dep':['calculate:%s'%keyforkeyindeps.keys()]}deftask_get_dep():forcellincells:name,formula=cell.split('=')yield{'name':formula,'actions':[(get_dep,(formula,))],}

And that's it. Let's see it in action. You can get your own copy here
and try it out by installing doit, editing cells and then running it like this:

As you can see, it always does the minimum amount of effort to calculate the desired result.
If you are so inclined, there are some things that could be improved, and I am leaving as
exercise for the reader, for example: