månadsarkiv: november 2013

FA adventures with Eric

Foreword
I began writing the draft for this post in English, and I think it’s for the best if a continue doing so. Sorry if bad English.

Tonight’s plan was set for a visit to a small café in central Linköping called Babettes Kafferi. On this very night the café had invited the authors of the book Kärlekens väg to come and speak about christian beliefs and animal rights. As I’m keen on the vegan lifestyle and don’t have that good of an understanding of christianity I thought it could be a very interesting evening.

I got the address and jumped on my bike and swooshed down to central Linköping. I had trouble finding the café and was running a bit late. What’s worse, I felt a sudden need to use a restroom as I’d been drinking lots of water which had now been processed and needed to get out.

Being unable to find the café, now being 15 minutes late, I aborted the search. I felt lost and didn’t know what to do now. I was just roaming the streets, which was pretty nice, feeling anonymous, walking without a purpose. This feeling was not to last though and eventually I thought that while I’m downtown I might as well go get an after work beer at some nice place, just like a real grownup.

However, I didn’t feel too hyped about the idea to start my after work session by asking the waiter for the restroom first thing after entering the restaurant, and by now I really needed to go. I remembered a tourist sign pointing to a public restroom. I tracked it (the restroom) down and standing in front of it I could read the directions: ”Press for entrance” – Okay, I thought as I pressed the button that made a big silver door slide open. I entered, and the door slide shut. The door only had an emergency open handle but I was looking for someway to lock myself in. I found another button that said it would lock the door, I pressed it and nothing seemed to happen. Apparently, you’re supposed to trust electronics for locking the door of a public restroom. Unimpressed, I wished for a hasp or a clasp or some other mechanical, trustworthy device.

Feeling a bit uneasy, I pressed another button for instructions, which were presented by a friendly female voice. This calmed me and I did my business, I was, however, not allowed to flush as that was to be done automatically after I had left the restroom, that did not make me feel less uneasy. After putting my hands under the tap in various ways I managed to get the water running to was my hands off. Finally, I was done. At last, I could flee this futuristic and scary place as a happier and enlightened being, everything went all right after all.

Back to tonight’s new bonus objective, a beer at Överste Mörner. I took a longcut to build up the courage I needed to enter the pub, arrived outside, checked the menu and then continued to walk down the street. I stopped. I walked back to the pub and this time I managed to get inside.

Greeted by the waiter I was asked if I wanted to eat. ”No, just a beer.” I replied and was directed to the bar. The bartender gives me a generic greeting and awaits my order. ”A Staropramen, thank you” because Staropramen is one not too common beverage that also has a bearable taste, or maybe it’s beerable. *rimshot*

I have bad hearing, but after a second try I catch the bartenders question and I show him my ID. ”Do I really look like 17?” I ask myself. The bartender tells me the cost, twice, and I pay in cash, even tip the guy 1 SEK. I’ve been served, and I start to wonder if I’m allowed to take place at a table or am I stuck sitting in the bar? Well, I really needed a table to jot down all my thoughts from this evening so I discretely search for a place to sit and hope for the best. The beer cost me 70 SEK and the place is far from crowded, I feel no shame for sitting wherever I want. I find a good spot, I am safe once again.

Sitting there, I can’t help to wonder what makes people go out to a place like this on a Tuesday night. It is quite cosy, but the music is drowned by all the murmurs from everyone. Prices are somewhat expensive, but maybe the food is really good, or maybe people have to much money. All these thoughts about food made me hungry, and I began feeling the need to leak again, it was time to go home.

I have school tomorrow.

And now I’m drunk, great.

And why didn’t that girl turn up that I had imagined to just magically crash down by my table, being super interested in me and what I was writing down. She was supposed to fix my ”Have no company for the hunger games movie”-problem. Oh well, that will be sorted in some other way.

Get it together Cher

Visst är det skönt när man inser varför saker och ting är som de är.

Denna kväll har jag haft ett sådant uppvaknande, kommit till insikt med hur världen är och varför den är på det viset. Med dess ord kanske jag har gett lite för mycket hype till hela alltet och några av er kanske blir besvikna när jag säger att det handlar om musik, närmare bestämt Cher Lloyd, popartist.

Chers singel With ur love är varken hennes första stora hit och kanske inte heller den största, men den är den bästa. Want u back har för närvarande flest visningar men så var det ju också den videon som lanserades i samband med hennes genombrott i staterna. Jag vet inte, men det verkar som att jänkarna bara lyssnar på musik som har importerats och noggrant förtullats  samtidigt som de själva sprider sin musik av blandad kvalitet världen över. Förstår inte hur det fungerar riktigt.

Åter till Cher Lloyd. Anledning till att hennes låt With ur love är hennes bästa beror helt enkelt på en sak, självaste Max Martin har varit med och producerat låten. Den mannen vet hur en poplåt skall smidas, ta en titt på hans diskografi om ni törs. Cher borde definitivt kollaborera mer med honom.

Nåväl, nog om pop, det finns annan musik som man kan lägga sin tid på som inte är lika utmattande. Som avslutning bjuder jag på ett klipp med Lambretta och låten Creep, som delvis är skriven av Max Martin. Dessutom är videon rippad från ZTV, nostalgiskt :)

Såg på videon och tänkte att ”en sån där vespa skulle man ha”. Insåg snabbt därefter att jag ville ha ALLT som fanns i den där videon ;)

Kram och gonattt

Professorer och Python

Hej, det är jag.

Professor Spelet

När jag packade mina saker som jag ville ha med mig till Linköping snubblade jag över ett spel som varit i familjens ägo sedan jag var liten. Spelet i fråga kallas ”Professor Spelet” och är ett pusselspel av hög svårighetsgrad. Jag tänkte att det vore ett perfekt spel att ta med ner, något som kan hålla mig varm om ensamma kvällar, kokande av frustration då det är ett ganska omöjligt pussel om man försöker lösa det på det konventionella sättet. Låt mig visa med hjälp av några bilder hur pusslet ska lösas:

Framsidan på karotngen till Professor Spelet

Här ser vi framsidan av spelets kartong med ett förslag, visserligen inkorrekt, på hur man kan placera de 16 brickorna som följer med spelet.

Varje kort består av två överkroppar och två par ben, varje del har en av färgerna blå, brun, grön och lila. Varje professor är utsmyckad med ett extremt självbelåtet flin då de vet att de kommer driva dig till vansinne om du försöker dig på att lösa deras pussel.

Varje kort består av två överkroppar och två par ben, varje del har en av färgerna blå, brun, grön och lila. Varje professor är utsmyckad med ett extremt självbelåtet flin då de vet att de kommer driva dig till vansinne om du försöker dig på att lösa deras pussel.

Sedär, grön överkropp passar med gröna ben, bra jobbat. Nu gäller det bara att passa ihop de återstående 14 korten på motsvarande sätt i en 4×4 formation.

Sedär, grön överkropp passar med gröna ben, bra jobbat. Nu gäller det bara att passa ihop de återstående 14 korten på motsvarande sätt i en 4×4 formation.

Jag tänkte att jag skulle lösa pusslet med hjälp av lite mysig Python-programmering, men innan kodningen tar fart kan det vara bra att komma på (en början till) receptet till framgång.

Algoritmen

Eftersom en dator kan göra vissa uträkningar mycket snabbt formulerade jag en lösning på pusslet som helt enkelt provar att lägga ut kort så långt det går och om det inte går får man backtracka. I detalj:

  1. Lägg ett kort ”längst upp till vänster”.
  2. Gå igenom resterande kort och se om något passar på nästa position. Nästa position är i regel till höger om kortet du just la ut MEN om man har en rad av kort som är fyra till antalet lägger man inte nästa kort till höger utan istället läggs nästa kort under det vänstra kortet på den lägsta raden. ”Passar” gör korten om de kroppsdelar som sätts ihop har samma färg men inte är av samma typ. (Man kan ju inte ha en professor som bara är två par ben, även om det säkert passar bra i andra spel.)
  3. Om inget av dina resterande kort passar på nästa position så säger vi att det kortet du just la ut var ”FEL” och det tas bort och man får prova med något annat kort man har på handen.
  4. Till slut kommer du hamna i ett av två lägen. Antingen lyckas du lägga ett kort längst ner till höger, då har vi lyckats! Det andra utfallet är om vi inte kan lägga ut något av de 16 korten på platsen högst upp till vänster, dvs alla kort har markerats som ”FEL” och vi har tokfailat.

Det där var en något förenklad bild av hur jag valt att lösa pusslet, till exempel nämner jag inget om att man kan (såklart) rotera korten och få nya möjligheter till att matcha korten på hand med de som ligger på bordet. Men vet ni vad, det var tillräckligt svårt att ge beskrivningen ovan, om jag fortsätter kommer det nog tyvärr resultera i att både jag och mina fina läsare får en fruktansvärd huvudvärk.

Innan jag presenterar koden vill jag peka lite extra på några saker med programmering i allmänhet och kanske Python i synnerhet, nämligen dundermysiga dictionaries och vad man kan göra med dem.

Dundermysiga Dictionaries

På svenska kan man kalla en dictionary för en associativ lista, på svenska som någon förstår kan man kalla en associativ lista för en säck med objekt där varje objekt också är ett par objekt där den ena delen är ett nyckelord som man kan använda för att få fram värdet på den andra delen. Hmm, ingen förstod nog det där sista heller.. Ojoj, det är klurigt att förklara saker i programmering, jag försöker visa det med några exempel istället. Och jag kanske väljer att kalla en dictionary för en ordlista i fortsättningen, genialiskt. :)

Exempel: Familjen Andersson har ett system där varje famlijemedlem får skriva upp en matvara och tillsammans utgör varje medlems matvara veckans inköpslista. Familjen Andersson är pappa Rickard, mamma Cecilia och barnen Johan, Mikael, Jessica samt Linn. När man vet vad man vill ha lägger man till informationen i den fina ordlistan och jag ska visa er hur det ser ut i Pythonkod.

>>> { }

Såhär ser ordlistan ut när den är tom ‘{‘ (vänster curlingparentes) är början och ‘}’ (höger dito) markerar slutet, tråkigt =/

>>> {"Johan": "Rödbetor"}

Hurra, Johan har lagt in att han är sugen på rödbetor, kanske har han en pakt med övriga i familjen att det ska ätas pytt-i-panna. Här ser vi alltså ett objekt i ordlistan, ”Johan” utgör nyckeln och ”Rödbetor” är värdet.

>>> {"Johan": "Rödbetor", "Jessica": "Polarbröd","Rickard": "Havrefras",
     "Linn": "Jordnötssmör", "Cecilia": "Sötmandel"}

Johans drömmar om pytt-i-panna tycks ha slagits i spillror. Men nu har vi iaf en ordlista med fem nycklar som har tillhörande fem mumsiga värden (matvarorna). Vi gör en tilldelning och sparar vår ordlista i en variabel vi kallar för matkassen:

matkassen = {"Johan": "Rödbetor", "Jessica": "Polarbröd",
             "Rickard": "Havrefras", "Linn": "Jordnötssmör",
             "Cecilia": "Sötmandel"}

Nu vill pappa Rickard samla ihop allt detta till en behändig inköpslista, det gör han med en loop och nycklar (namnen) som gör en uppslagning i matkassen för att ta reda på värdet till nyckeln, det vill säga vad varje person har önskat sig.

inköpslista = [] # Japp, inköpslistan är tom i början, quelle surprise.
for namn in ["Rickard", "Cecilia","Johan", "Mikael", "Jessica", "Linn"]:
    inköpslista.append( matkassen.get(namn) )

När Rickard går igenom inköpslistan ser han att det bara finns fem stycken matvaror, fast de är sex stycken i familjen. Efter ett mycket välorganiserat familjeråd kommer det fram att Mikael inte önskat sig någon matvara då han istället för att äta tänker spendera den kommande veckan med att skriva en dikt om den svarta kaninen han hittade när han var på urban exploration i Varbergs största bunker, Bergabunkern. Pappa Rickard har en lösning på problemet med inköslistan och gör en ny loop:

inköpslista = [] # Töm inköpslistan igen, tan terrible.
for namn in ["Rickard", "Cecilia","Johan", "Mikael", "Jessica", "Linn"]:
    matkassen.setdefault(namn, "Mera havrefras")
    inköpslista.append( matkassen.get(namn) )

Det funktionen setdefault gör är att om en nyckel inte finns i en ordlista så skapas den med ett valfritt värde, i exemplet ovan ”Mera havrefras”. Havrefras har trots allt en tendens att ta slut mycket fortare än man vill. Nu kommer Rickard alltid att ha en fullständig inköpslista varje gång även om någon familjemedlem missar att önska, den önskan blir bara ersatt med ”Mera havrefras”. Men vänta, Linn som är 1337 tar en titt på koden och säger ”Pappa, din kod kan optimeras, låt mig snygga till den här spagettiröran lite”:

inköpslista = [] # Töm inköpslistan, ich liebe es.
for namn in ["Rickard", "Cecilia","Johan", "Mikael", "Jessica", "Linn"]:
    inköpslista.append( matkassen.get(namn, "Mera havrefras") )

Ni förstår, funktionen get som används på matkassen kan ta ett andra argument. Om nyckeln man försöker använda inte finns i matkassen kommer funktionen returnera det andra argumentet. Funktionen setdefault har sina användningsområden, men kanske inte just här.

TL, DR; Python dictionaries är användbara saker och funktionerna get() och setdefault() är coola och kan vara kul att känna till.

Från bugg till segerdans

När jag väl hade bestämt mig för att lösa det här pusslet med hjälp av programmering tog jag och ägnade hela lördagen till att få mitt program att fungera. Det var mycket frustrerande när jag inte kunde få programmet att fungera på natten till söndagen och till slut fick jag gå och lägga mig med buggarna kvar. Men att sova på ett programmeringsproblem kan vara ett mycket enkelt sett att komma framåt och morgonen därpå gick jag igenom min kod och kunde göra den mycket enklare och till slut hade jag fått fram en lösning till Professor Spelet, mitt uppdrag var slutfört.

Låt mig därmed presentera koden till mitt program. Det finns säkert några buggar kvar och designen inte är den bästa. Kommentarer som tillför mer förvirring än förståelse finns det gott om, sånt tycker jag är kul.

Musikförslag till när ni läser koden:

KOD