Skip to main content

Ralsina.Me — Roberto Alsina's website

A Simple Nikola Link Checker

One of the most im­por­tant things when you are build­ing a stat­ic site gen­er­a­tor like Niko­la is that your site should not be bro­ken. So, I re­al­ly should have done this ear­li­er ;-)

This is a very sim­ple link check­er that en­sures the pages Niko­la gen­er­ates have no bro­ken links. I will make it part of Niko­la prop­er once it's more pol­ished and doit sup­ports get­ting a list of tar­gets

To try it, get it and run it from the same place where you have your, right after you run doit.

import os
import urllib
from urlparse import urlparse

import lxml.html

def analyze(filename):
        # Use LXML to parse the HTML
        d = lxml.html.fromstring(open(filename).read())
        for l in d.iterlinks():
            # Get the target link
            target = l[0].attrib[l[1]]
            if target == "#":  # These are always valid
            parsed = urlparse(target)
            # We only handle relative links.
            # TODO: check if the URL points to inside the generated
            # site and check it anyway
            if parsed.scheme:
            # Ignore the fragment, since the link will still work
            # TODO: check that the fragment is valid
            if parsed.fragment:
                target = target.split('#')[0]
            # Calculate what file or folder this points to
            target_filename = os.path.abspath(
                os.path.join(os.path.dirname(filename), urllib.unquote(target)))
            # Check if it exists, or report it
            if not os.path.exists(target_filename):
                print "In %s broken link: " % filename, target
    except Exception as exc:
        # Something bad happened, report
        print "Error with:", filename, exc

# This is hackish: we use doit to get a list of all
# generated files. Minor modifications would let you check
# the non-generated files as well.

for task in os.popen('doit list --all', 'r').readlines():
    task = task.strip()
    if task.split(':')[0] in (
        'render_site') and '.html' in task:
            # It looks like a generated HTML file

Confessions of a Troll

And then he told me "Rober­to's a known trol­l" and I was like "re­al­ly?" he seems like a nice guy!

—Not say­ing who said it

So, that hap­pened a while ago in a din­ner. And I am that trol­l. I must con­fess it, so here it is. I have a long, long, long his­to­ry of trolling. Per­haps I could ra­tio­nal­ize it in­to just be­ing ar­gu­men­ta­tive, or just en­joy­ing a good ar­gu­men­t, but no, re­al­ly, I de­rive plea­sure from see­ing peo­ple re­act to what I say.

That could maybe be in some way con­struc­tive, I could just do it to make peo­ple see things from a dif­fer­ent an­gle, and in my good mo­ments I do that. But in oth­ers I just find some­one I dis­like, or some­one who says some­thing that rubs me the wrong way, and I ... well, it's not pret­ty.

What I usu­al­ly do is up the ante. I es­ca­late. I say out­ra­geous things. Usu­al­ly just slight­ly more out­ra­geous than what the oth­er guy says, so I can still ra­tio­nal­ize it as "he start­ed it", or "he de­serves it" but hon­est­ly, deep in­sid­e, I know it's not true. I know I am be­ing nasty be­cause I like it. And that suck­s. It sucks that I have this mean streak in me, and I can't get rid of it. It sucks that I have fun in­sult­ing the oth­er poor bas­tard.

I could even say that most of the peo­ple I troll are trolls them­selves. But that's not re­al­ly an ex­cuse. If they de­served con­tempt for their trolling, then I am just as de­serv­ing for mine. I am sure they, al­so, have their rea­sons and those rea­sons sound per­fect­ly ra­tio­nal to them­selves.

I could say that I of­ten troll those who spread poi­sonous speech. That I troll those who are spread­ing mis­in­for­ma­tion and evil ideas. And yes, that is true, but again, I could re­ply with­out trolling. I could re­ply ra­tio­nal­ly, and just point out where they are say­ing non­sense, where they are spread­ing stu­pid­i­ty, and avoid the flair, avoid the gra­tu­itous in­sult.

I could say that I troll those who both­er me per­son­al­ly out of their own free will. So yes, telling a Je­ho­vah's Wit­ness that I will be at the door as soon as I wash my hands of the blood sac­ri­fice I make to Sa­tan is fun­ny, but why is it any bet­ter than just telling them I am not in­ter­est­ed.

Oh, sure, I could say that telling some­one who in­sult­ed me "opin­ions are like ass­holes, and so are you" is some­what clev­er, but I could just say "y­ou are wrong, rude, and un­de­serv­ing of my at­ten­tion".

I sure could say that trolling some­one who is rude, in­sult­ing, ob­nox­ious and dis­rup­tive may teach him (it's al­ways a he, is­n't he?) a lesson, but it's just not true. They just see those re­spons­es as chal­lenges.

I could say that feed­ing the oth­er troll is just harm­less fun, but it's not true be­cause I know it hurts peo­ple, and cre­ates an ob­nox­ious en­vi­ron­men­t. I could say that trolling those who de­serve to be trolled is fair. But it's not true be­cause I am noone's judge.

So, if I have trolled you, ac­cept this post as an apol­o­gy. Not a "sor­ry if I of­fend­ed you" apol­o­gy, but a straight apol­o­gy. I am sor­ry I trolled you. I will try to stop.

I will not stop say­ing and writ­ing what I think, and I will not ab­stain from re­ply­ing to oth­er peo­ple's opin­ion­s, but I will do a hon­est try to do it in a not-trolling man­ner, of of­fer­ing my opin­ion as it is, in­stead of as a per­for­ma­ce to make the oth­er one feel hu­mil­i­at­ed or hurt or un­de­serv­ing.

Be­cause, and here is my on­ly piece of ex­cuse: I hate bul­lies. I was sent to school two years too ear­ly. So that you have an idea how that can af­fect some­one, I am of av­er­age height, but un­til I was 13 I was con­vinced I was very short. I man­aged to be­come a de­cent swim­mer, but un­til I was 12 or so, I was con­vinced I sucked at all sports and games. I was in­ceas­ing­ly bul­lied since I first ev­er met my "peer­s" un­til I was able to kick the crap out of them. I be­came a tough kid. I could take a beat­ing like you can't imag­ine, be­cause I was too small to hit back, and the on­ly way not to be a to­tal los­er was to keep get­ting up and go­ing to be beat­en again, while mak­ing sar­cas­tic com­ments.

And it turned out that those sar­cas­tic com­ments worked. I got my ass kicked, but the next day that kid re­mem­bered how I was get­ting back on my feet and jok­ing about his moth­er. And that, of course, lead to fur­ther bul­ly­ing. When I was about 12, I was so ex­treme, I scared ev­ery­one so much, they stopped. I was scary. I talked like a freak­ing psy­cho. I prob­a­bly was close to be­ing one.

And the les­son I learned was that if you make fun of peo­ple, they got hurt enough to want to avoid it lat­er. So, I was, in fac­t, a bul­ly my­self. And thus, I be­came that which I hat­ed. I have had bet­ter times and worst times, I have been more in con­trol and not so much. And it has tak­en me a long time to fig­ure this out. I don't like what I be­came. So I will stop. And I am sor­ry.

Just gen­tle rib­bing and self­-dep­re­ca­tion from now on. Prom­ise.

This is Not Math

My niece goes to school. She has home­work. Ev­ery now and then, her mom and great­mom will not be able to help her. I am sort of the math helper of last re­sort in the fam­i­ly. So, the oth­er day I got this ques­tion:

What is the next number on this series:

2, 12, 16, 17, 18, 19

I just could not come up with an answer at the time. I have been told the answer is 200. Why? Because it's a list of numbers starting with "d".

Oh, you may say two does­n't start with "d" but hey, this was in span­ish, so it does. The prob­lem is, this is just not math­e­mat­ic­s, at al­l.

It's about a com­plete­ly in­ci­den­tal fea­ture of the rep­re­sen­ta­tion of a num­ber in span­ish, which is a com­plete­ly un­math­e­mat­i­cal thing. Makes me won­der why they are mak­ing stu­dents think about this. Any­one knows?

Pennies for the Ferryman (Dead Eye #1)


There are shaky rules here, and good rules are a nec­es­sary thing when read­ing about this kind of sub­ject­s, at least to me. Oth­er than that, nice, light read. Cheap on Kindle, too.

Contents © 2000-2021 Roberto Alsina