nemrod.se Various guides and experiments

Validera Personnummer (Swedish SSN Validator)


This post will be in Swedish since it will mainly be interesting to a Swedish audience. The code will work just the same and shouldn’t be too hard to figure out.

På ett uppdrag jag slutförde för ett tag sedan uppstod problemet att bekräfta att en person inte redan fanns registrerad i databasen. Det är givetvis rätt lätt att kolla om personnumret redan finns registrerat, men vad är det som säger att personen inte helt enkelt bestämde sig för att skriva in några slumpmässiga siffror i fältet? Inget, om du inte validerar personnumret.

Ett personnummer är uppbyggt av sex siffror för födelsedatumet, två siffror för var man föddes (innan 1990) eller ett löpnummer (efter 1990), en udda siffra för män eller en jämn för kvinnor och till sist en kontrollsiffra, som är den siffra vi måste räkna ut för att bekräfta att personnumret är giltligt utformat. Du kan läsa mer på Wikipedias artikel om personummer i Sverige.

Så här ser koden jag skrev ut:

function validateSSN($personnummer = 'yymmddxxxx') { 
    $summa = 0;  
    for($i = 1; $i < 10; $i++) { 
        $del = $personnummer[$i - 1] * ($i % 2 + 1); 
        $summa += ($del > 9 ? 1 + $del % 10 : $del); 
    }   
    return !(($summa + $personnummer[9]) % 10);
}

Självklart bekräftar inte det här att det är personens riktiga personummer och om han på liknande sätt räknar ut en kontrollsiffra för ett slumpmässigt personnummer eller gissar tillräckligt länge kommer han förmodligen att kunna komma förbi valideringen. Det är ändock en viktig validering då de flesta i min erfarenhet ger upp att “förfalska” sitt personummer när de märker att deras första slumpmässiga input inte fungerar.

Uppdatering: gjorde om det till en funktion och kortade ner koden en aning.


Posted in Projects | Leave a comment

EvoMaxx SEO Quiz


A while back I assisted in writing questions for an SEO quiz (in Swedish). It’s a quite difficult quiz (especially if you don’t speak Swedish…), as you can tell from the statistics, so don’t be offended if you get a low score. I, of course, got 100%. Then again, I did write most of the questions. ;)

Feel free to comment any suggestions or opinions, or maybe just your score! I’d love to hear about how you did. :)


Posted in Miscellaneous | Leave a comment

Pong in C/ncurses


This is a two players, one keyboard Pong written in C with “graphics” using the ncurses library. It was written over a year and a half ago and I haven’t read the code since, so it’s likely to be total or at least partial crap.

Playing it now I can spot two immediate flaws that I should’ve done something about. First of all the ball always moves at the same angle and speed. Second of all if you press and hold a key to move, the opponent can press a key and your movement will stop.

Other than that it’s pretty straight forward, just compile the C source file and play, against yourself or with a friend, an up and down key pair each.

It’s free as in free speech (and free beer) so you have no restrictions regarding usage or modifications to it, but it’s always nice to hear from anyone using what you make so feel free to post a comment or send me a mail. Any bug fixes, improvements or other additions would be neat to get so I can host any new versions here. :)

pong.c


Posted in Projects | 5 Comments

Hangman in Python


This is a refurbished version of a Python script I wrote on Dreamhack many years ago. It’s pretty simple, there is an array of words that it randomly selects one from and then you can guess. It displays the word with underscores as placeholders for unknown characters, with the real characters where they’re supposed to be if you’ve guessed them right.

It also displays wrong guesses and ASCII art of the classic hangman scenery according to how many times you’ve guessed on a wrong letter. You can change the ASCII file without affecting the game, just remember to keep every scene on ten lines. You can add more scenes (10 lines per scene) to the file and the game will adjust accordingly, not letting the game end until you get to the last scene.

It uses a wide range of methods and tricks in Python, such as list comprehension and shorthand if, so it might be fun to learn from. For example, this is how it prints the scenery:

    file = open('ascii', 'r')
    hangman = file.readlines()
    print ''.join([line for line in hangman[len(wrong) * 10:len(wrong) * 10 + 10]])

and this is how it prints the word (letter or underscore):

    for letter in word:
        print letter if letter in right else '_ ',

It’s also only about 45 lines of code (30-35 SLOC I guess), so it’s not very much code to look at. :)

It’s free as in free speech (and free beer) so you have no restrictions regarding usage or modifications to it, but it’s always nice to hear from anyone using what you make so feel free to post a comment or send me a mail. Any bug fixes, improvements or other additions would be neat to get so I can host the new version here. :)

hangman.py
ascii art of hangman, required to play


Posted in Projects | Leave a comment