laszlo.nu

Simple linked list (C) for OSP lab

A simple linked list (FIFO-queue) for future generations ;) Get the source.

/*
  Description: Very simple single linked list. Intended for use in the OSP lab
  at Chalmers. In the OS course at Chalmers, you are allowed and even
  encouraged to use an existing linked list instead of implementing your own -
  just remember to add a reference (or else it's cheating!).

  Author: André Laszlo <andre@laszlo.nu>
 */

#include <stdlib.h>
#include <stdio.h>

typedef struct node_s {
  void *data;
  struct node_s *next;
} NODE;

typedef struct list_s {
  NODE *first;
  NODE *last;
  int length;
} LIST;

/* Create a new list */
LIST* new_list()
{
  LIST *l;
  if (!(l=malloc(sizeof(LIST))))
    return NULL;

  l->length = 0;
  l->first = NULL;
  l->last = NULL;
  return l;
}

/* Create a new node that can be inserted into the list */
NODE* new_node(void *data)
{
  NODE *n;
  if (!(n=malloc(sizeof(NODE))))
    return NULL;
  n->next = NULL;
  n->data = data;
  return n;
}

/* Insert element at the end of the list */
void append(LIST *l, void *data)
{
  NODE *n = new_node(data);
  if (l->length == 0) {
    l->first = n;
    l->last = n;
  } else {
    l->last->next = n;
    l->last = n;
  }

  l->length++;
}

/* remove from head of list and return data */
void* pop(LIST *l)
{
  if (l->length == 0) {
    return NULL;
  } else if (l->length == 1) {
    void *data = l->first->data;
    free(l->first);
    l->first = NULL;
    l->length = 0;
    return data;
  } else {
    void *data = l->first->data;
    NODE *tmp = l->first->next;
    free(l->first);
    l->first = tmp;
    l->length--;
    return data;
  }

}

/* Return the position of an element in the list, or -1 if it does not exist */
int find(LIST *l, void* data)
{
  int i = 0;
  NODE *current = l->first;
  while (current != NULL) {
    if (current->data == data)
      return i;
    current = current->next;
    i++;
  }
  return -1;
}

/* Clean up list. TODO: Test this (since it's not used in lab) */
void destroy_list(LIST *l)
{
  NODE *current = l->first;
  NODE *next;
  while (current != NULL) {
    next = current->next;
    free(current->data);
    free(current);
    current = next;
  }
  free(l);
}

/* Return pointer to an integer with value n */
int* intpointer(int n)
{
  int* num = malloc(sizeof(int));
  *num = n;
  return num;
}

/* Test and demo subroutine */
int main()
{
  LIST *l = new_list();
  
  /* Should be zero */
  printf("Length: %d\n", l->length);

  /* Add some stuff to the list */
  int i;
  int *n;
  int *thing;
  for (i = 0; i < 10; i++) {
    n = intpointer(i);
    if (i == 4)
      thing = n; /* Keep this for searching, later */
    append(l, n);
  }

  /* Test find() */
  printf("Pos %d: %d\n", *(int*)thing, find(l, thing));
  int *other_thing = intpointer(12);
  printf("Pos %d: %d\n", *other_thing, find(l, other_thing));

  /* Test iteration */
  NODE* iter = l->first;
  printf("List: ");
  while(iter != NULL) {
    printf("%d ", *(int*)iter->data);
    /* Note: if reappending while iterating we might end up with an infinite
       loop. Try keeping a reference to the first reappended item if you want
       to break, or create a copy of the list */
    iter = iter->next; 
  }
  printf("\n");
  printf("Length: %d\n", l->length);

  /* Test pop() */
  int *popped = (int*)pop(l);
  while (popped != NULL) {
    printf("Pop result: %d\n", *popped);
    printf("Length: %d\n", l->length);
    popped = (int*)pop(l);
  }

  printf("Length: %d\n", l->length);

  /* Free up some memory */
  destroy_list(l);
  return 0;
}

Automatic Facebook replies using Gmail

Yesterday I noticed that you can reply to your Facebook notification emails to answer wall posts and messages. Since I have decided not to use Facebook as actively as I used to now that Google+ is around, I thought I should use this feature to send an “out of Facebook” response to my Facebook friends.

Here’s how you do it, using canned responses and filters in Gmail:

  1. To be able to send automatic replies in Gmail, you need to enable the “Canned responses” feature. Look in Gmails settings → “Labs” tab and make sure it’s enabled. Don’t forget to save your changes.
  2. It’s time to create the automatic response. Start writing a new email. I wrote something like “Automatic reply: I have not been using Facebook very much lately. Please come see me at Google+ instead!”. Now, click the “Canned responses” menu (just below the subject line) and select “New canned response…”. Select an intelligent name for your response.
  3. Now you need to find out which email address your notification comes from. Look in your inbox for a Facebook notification and look at the sender’s email address. It should look something like this: notification+xyz@facebookmail.com where xyz is a seemingly random string. Copy this address.
  4. To tie it all together, create a new filter (there’s a link to the right of the search box). Enter the following settings:
    From: update+xyz@facebookmail.com OR notification+xyz@facebookmail.com (where xyz is the value you found in the previous step)
    Subject: "new messages from" OR "new message from" OR "commented on your wall post" OR "posted on your wall"
  5. Click “Test search” to see if your filter matches the notifications you want to reply to. If it doesn’t, chances are that you don’t have English as your current language setting on Facebook. Either change it on Facebook or enter the equivalent subject lines in your language.
  6. Final step: Click “Next step” and check the box next to “Canned response”. Select your message and save your filter.

Note: You can remove any of the strings in the subject line filter, to match only the kinds of notifications that you want to reply to.

Cameron vs Twitter

Faran med att avpolitisera upploppen i England: man söker enkla sätt att komma åt symtomen istället för sjukdomen (klassklyftor, social orättvisa och enorm [ungdoms]arbetslöshet) och lyckas på sitt eget totalitära sätt hugga huvudet av patienten istället för att ge henne en ipren.

Mr Speaker, everyone watching these horrific actions will be stuck by how they were organised via social media.

Free flow of information can be used for good. But it can also be used for ill.

And when people are using social media for violence we need to stop them.

So we are working with the Police, the intelligence services and industry to look at whether it would be right to stop people communicating via these websites and services when we know they are plotting violence, disorder and criminality.

- David Cameron

Vart är man på väg om man börjar förhindra människor att kommunicera fritt? När en premiärminister gör såna här uttalanden förstår jag att folk börjar tvivla på demokratin…

Kvinnodagen

Kvinnodagen: Barnvagnsrace och artiklar om “lyckade” damer — jättebra, fast det är nog mest fokus på var den godaste semlan i stan finns. Okej. Läste igår att den tredje vanligaste dödsorsaken hos världens fertila kvinnor är komplikationer efter en dåligt utförd abort. Varför inte ge lite pengar till något bra ändamål istället för att svulla semla?

Föreslår:

  • International Planned Parenthood Foundation - En jätteorganisation som kämpar för kvinnors rätt att välja när de ska bli gravida, inte bara i “U-länder” utan även i Europa och Amerika.
  • Oum El Banine (mor och barn) - En organisation i Marocko som ger stöd till fördrivna gravida kvinnor (PayPal-knapp finns längre ner på sidan, varje krona går direkt till organisationen).
  • Amnesty - Amnesty har på senare år uppmärksammat inte bara samvetsfångar utan även kvinnors mänskliga rättigheter.

Svensk diesel eller europadiesel? Lars Beckman rör till det för sig.

Jag såg nyss en grej som gjorde mig lite förvånad, trots allt. Källkritisk som jag är så kollade jag upp det och hittade följande.

Den här snubben heter Lars Beckman och är moderat riksdagsledamot, han är även suppleant i skatteutskottet och i miljö- och jordbruksutskottet:

Lars Beckman

Han skrev nyligen en motion tillsammans med en moderatkollega. Frågan är om den är betald av Statoil. Statoil har nämligen en broschyr på sin hemsida som heter “Kom 3% längre”. Det är ju bara att jämföra:

  1. Statoil:
    “I Sverige har vi en egen diesel, MK1. Den introducerades för snart tjugo år sedan och var då världens första svavelfria diesel.”
    Lars:
    “I Sverige använder vi vår egen diesel, MK1. Den introducerades för snart tjugo år sedan och var då världens första svavelfria diesel.”
  2. Statoil:
    “Idag är all diesel inom EU svavelfri, men i Sverige har vi fortfarande kvar 1991 års MK1-diesel. Den är tre procent mindre energieffektiv och den ger totalt sett högre utsläpp av koldioxid.”
    Lars:
    “Trots att all diesel inom EU idag är svavelfri använder Sverige fortfarande 1991 års MK1-diesel, som är tre procent mindre energieffektiv och som totalt sett ger högre koldioxidutsläpp.”
  3. Statoil:
    “En unik dieselkvalitet för en liten marknad driver upp priserna. Av Europas alla raffinaderier är det bara fem som tillverkar MK1.”
    Lars:
    “En unik dieselkvalitet för en liten marknad driver upp priserna. Av Europas alla raffinaderier är det bara fem som tillverkar MK1-diesel.”
  4. Statoil:
    “Produktionskostnaden för att tillverka en liter MK1 är ungefär 10 öre högre än det kostar att tillverka svavelfri europadiesel. Men skatten på svavelfri europadiesel är 40 öre högre (50 öre inklusive moms).”
    Lars:
    “Produktionskostnaden för att tillverka en liter MK1 är cirka 10 öre högre än kostnaden för att producera svavelfri Europadiesel. Men skatten på svavelfri Europadiesel är 40 öre högre (50 öre inklusive moms).”
  5. Statoil:
    “Med samma skatt på svavelfri europadiesel som på MK1 skulle därför dieselpriserna kunna sänkas. Det skulle vara möjligt eftersom vi skulle spara i produktionskostnad samt köpa på en mer konkurrensutsatt marknad.”
    Lars:
    “Skulle man sänka skatten på den svavelfria Europadieseln till samma nivå som MK1 skulle dieselpriserna kunna sänkas, då man sparar i produktionskostnad och kommer in på en mer konkurrensutsatt marknad.”

Alla argument och all information i motionen kommer alltså direkt från Statoil. Men det är ju ganska bra argument? Eller?

Inte om man får tro en undersökning gjord av AVL MTC, “värdens största privatägda och oberoende företag inom drivlineutveckling samt utveckling och tillverkning av mät- och testinstrument”:

Gällande de reglerade avgaskomponenterna uppmättes inte någon signifikant skillnad mellan kolväten, kväveoxider, koldioxid (därmed också bränsleförbrukning) från de olika bränslekvaliteterna. Mängden partiklar från MK1 diesel är 30 % lägre jämfört med EN 590 vilket ger en signifikant höjning av negativa hälsoeffekter vid användandet av EN 590 diesel. Även emissionerna av kolmonoxid var högre för EN590 jämfört med MK 1.

Den här studien är beställd av Preem, som tillverkar MK1. Nu undrar jag varför de inte också köpt en moderat. Studiens slutsats är alltså, för den som inte orkar läsa akademikersvenskan, att koldioxidutsläppen är likadana för båda typerna av diesel, men att europadieseln ger upphov till betydligt mer hälsoskadliga partiklar än MK1.

Min slutsats är att antingen AVL eller Lars Beckman bara hittar på när det gäller koldioxidutsläppen. Skillnaden är väl att AVL gjort en ganska grundlig studie och publicerat både metod och resultat, men mister Beckman har bara kopierat en broschyr. Pinsamt.

Källor:

Edit: Tidigare gick det här inlägget till personangrepp mot Lars Beckman. Det ångrar jag, det är egentligen mot mina principer. Så ska man inte hålla på. Förlåt.

Edit 2: Lars Beckman har gjort något som jag sällan sett en politiker göra, nämligen svarat på det jag skrev online. Det ska han ha creds för. Jag tycker visserligen inte att han svarar på det jag skrev här ovanför, men ändå. Här är hans svar, och mina:

Lars:
Jag har kommenterat hur jag ser på frågan på www.larsbeckman.se [dvs här]

Jag:
Jag tycker att du missar poängen lite i ditt svar. Visst kan man diskutera om man gynnar ett företag eller ett annat. Det jag tycker är viktigare än femtioöringar hit och dit är om den ena dieseln faktiskt är hälsoskadligare än den andra, och om den ena har större miljöpåverkan än den andra. Studien som beställdes av Preem hävdar att växthusemmisionerna är ekvivalenta, men partikelutsläppen är 30% mindre för MK1, en svensk forskare hävdar att det är försumbart. Men frånsett kortsiktiga ekonomiska vinster, är inte miljön och människors hälsa viktigare? Om det nu finns forskning som säger emot dina argument, ge gärna en referens till någon studie som stödjer dem. Inte bara en broschyr producerad av någon som råkar hålla med dig.

Hur ser du på det Lars? För mig verkar det som att politik är som vetenskapens motsats, där man väljer slutsats och sedan letar argument som passar - istället för att ta reda på fakta först.

Lars:
Frågan handlar i det första blogginlägget om jag har påverkats av Statoil när jag skrev motionen, men det har jag inte. Frågan är då på vilket sätt som Preem har påverkat socialdemokraterna eftersom de använder just Preems argument i frågan, och som tidningen Riksdag och departement påpekar idag så tjänar just Preem mycket pengar på att skatteförmånen för deras diesel blir kvar. Som Riksdagsledamot tycker jag att det är viktigt att företräda allmänintresset och inte ett oljebolag. Samma tidning har en artikel där en erkänt välkänd professor konstaterar att ur miljösynpunkt kan man inte mäta någon miljöeffekt av MK 1 i förhållande till Europadiesel. Men jag har full respekt för Preems agerande eftersom de självklart ur affärsmässiga skäl ska försöka slåss för sin produkt.

Jag:
Nåväl, som jag skrev tidigare tycker jag att du missar poängen där. Lobbyister kan ha rätt och de kan ha fel, det bryr jag mig inte så mycket om. Det jag egentligen undrade över var om du kunde förklara var du fått uppgifterna om att koldioxidutsläppen för MK1 “totalt sett är högre” ifrån. Läser man motionen är det ju uppenbart att du helt enkelt litat blint på Statoils version, trots att det finns forskning som visar motsatsen (även om man kan ifrågasätta om studien verkligen är oberoende, när den beställts av Preem som du påpekar).

Trevligt att du svarar på kritik online.

Reversing Wordpress Audioplayer url obfuscation

One of my favourite artists recently posted a new song to his blog. I wanted to download the mp3 file but he uses the Wordpress Audioplayer plugin, which obfuscates the original url of the file being played. The plugin is released under the open source MIT license so I had a look at the source code for decoding these urls. It turns out that the algorithm is really simple. Just look up each character in the obfuscated string in a key. Make a string of the position of each character’s position, represented as a six bit binary number, then just treat this string as a binary representation of an ordinary ascii string. My python version of the algorithm looks like this (download it):

def int2bin(n):
    assert n >= 0, "Number must be positive"
    res = ""
    if n == 0: return "0"
    while True:
        if n == 0:
            return res
        elif n % 2 == 0:
            res = "0" + res
        else:
            res = "1" + res
            n -= 1
        n /= 2

def decode(source):
    key = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_-"
    binary = ""

    for char in source:
        code = key.find(char) # look up each char in the code key
        binary += int2bin(code).rjust(6, "0") # append char index as a six bit binary string
    
    chunks = [] 
    # split string into segments of length 8
    while len(binary) > 0:
        chunks.append(binary[:8]) 
        binary = binary[8:]

    chars = [chr(int(x, 2)) for x in chunks] # convert the segments to chars
    return "".join(chars)

# http://www.mabd.se/?p=682
test = "aHR0cDovL3d3dy5tYWJkLnNlL3VwbG9hZC8yMDEwLzEyL0RlbWVudG9yZXIubXAzA"
print(test, decode(test))