Kategoriarkiv: Data

Skrytbrädan #1

Håll i hatten för nu blir det åka av! Jag tänkte skriva om mina fantastiska bedrifter och framgångar från den senaste tiden. Det är väl knappt att man får vara såhär mallig i dagens samhälle, men jag tänkte att på min egen blogg som nästan ingen läser borde det vara okej.

Statistik och sannolikhetslära – no problem!

Höstterminen 2015 läste jag kursen TDAB01, en grundkurs i statistik och sannolikhetslära. Efter en dålig start med lektionsuppgifterna lyckades jag aldrig fokusera på att lära mig och förstå materialet och då kursen var helt ny fanns inga gamla tentor att plugga in och därför var den första kuggningen i mitt studieliv ett faktum, det sved. Efter att ha pluggat ytterligare till omtentan i januari, och faktiskt lärt mig saker, var jag en ynka poäng ifrån godkänt. Close but no cigarr och jag fick vänta till augusti på nästa chans. Juli spenderades med att förstå materialet än en gång och utan att plugga jättemycket flöt nu intuitionen för statistiken i mina ådror. Nåja, tentan gick väldigt bra och jag dunkade in en stark 4:a i betyg!

Personlig tentastatistik för kursen TDAB01

Med mina nyvunna kunskaper kan jag nu till exempel skapa snygga diagram med R och ggplot2.

Fysik och mekanik – no problem!

Tillbaka till höstterminen 2015! Efter att ha misslyckandet från TDAB01 färskt i huvudet var det dags för fysik, ett ämne som legat i dvala hos mig sedan 2007. Med en kurs som tillät en att inte behöva förstå någonting à la ”slentrianskriva anteckningar hela föreläsningen/lektionen utan eftertanke” och en totalbrist på motivation bådade det inte gott inför tentan. Det blev ett bottenrekord, 0 poäng! Jag förstod mig varken på acceleration eller friktionskraft, så illa var det. Juli spenderade jag med att lära mig grunderna i fysik på högstadie-  och gymnasienivå och insåg att fysik är ganska coolt ändå. Ensam på omtentan lyckades jag klämma till med en stabil 3:a och jag är väldigt tacksam över att slippa släpa på en 1400 sidors fysikbok i fortsättningen.

Kandidatexamen – no problem!

Min första akademiska publikation är gjord! Min kandidatgrupps rapport finns att läsa här och den handlar om hur vi utvecklat en interaktivt webbapp för kryptoanalys, Knekt, och vilka lärdomar vi kunnat dra från projektet. Jag vet att rapporter för de flesta inte är världens mest spännande läsning men låt mig säga detta: Varje gruppmedlem skrev en individuell del i rapporten och min del handlar om parprogrammering och kodgranskning. Om inte det väcker intresset vill jag tillägga att mina grafer är gjorda i ggplot2 och bakom dem ligger mycket slit. Så ge lite kärlek till figur D.3 ;)

Checkpoint reached!

Tack vare en lyckosam omtenta-period i augusti har jag alltså avklarat tre kompletta år på Linköpings universitet och därmed fått en kandidatexamen på meritlistan. Detta har förstås flera fördelar, men det bästa är att jag nu kan använda detta som SMS-signal:

Jag vill passa på att tacka mina gruppkamrater från kandidatprojektet som inte bara såg till att vi lyckades väl med projektet utan att vi också hade väldigt kul på vägen! Jag vill även skicka iväg en shoutout till Khan Academy som hjälpte mig mycket med både statistiken och fysiken och som gör ett dunderjobb i att lära ut grundpelarna för att man sedan ska kunna lära sig mer avancerade koncept.

Tack för mig!

 

 

My Kubuntu Setup

I recently had to reinstall Kubuntu 14.04 on my PC due to some driver issues which I wrote about in my last post. Doing so made me realize that I had quite a few tweaks made to the vanilla installation to get a pleasant experience. I also realized that I had forgotten many of my configurations and had to spend a couple of hours looking through blog posts and whatnots to  rediscover all my favorite settings. To avoid this hassle the next time I’m reinstalling, I’m going to list the most important settings to make Kubuntu the best distribution, by far.

Font Settings

The first thing that strikes me when booting a freshly installed Kubuntu is the fonts which not only look bad but also hurt my eyes, everything is so small. My current font settings are heavily inspired by this blog post, with the exception that I have increased every font size by one. I also increase the zoom level in Firefox for some sites, especially Reddit and Youtube go nice with being zoomed in once or twice, keeping your eyes relaxed and happy!

Font settings in KDE

Anti alias settings

The Anti-alias settings. I have no idea what this stuff actually do but this looks good to me.

Application and workspace style

From the screenshots above you can see that the style is somewhat darker than the defaults. This spurred from the fact that, IIRC, the default taskbar had a transparency effect that I didn’t like. Instead of removing the transparency effect I decided to do a full overhaul of the appearance. From the System Settings menu, enter the Workspace Appearance and make sure that you’re using the Oxygen theme in Window Decorations. Second, we need to change the Desktop Theme to Caledonia. There might be more than one way to install Caledonia, but I just downloaded this KDE theme archive and followed the installation instructions. After a successful installation you should be able to select the Caledonia theme from the list of themes in Desktop Theme settings.

Next up is the style for the application window as the default settings in combination with the Caledonia theme is very ugly, so let’s fix that right away. From the System Settings menu, go to Application Appearance->Colors and click the Get New Schemes button. From the list of schemes you should be able to search for a scheme named DarkRed and install it, done! DarkRed might work somewhat bad when filling in online forms as you might end up typing black text on a black background. Apart from that, it’s nearly perfect.

Turning Firefox into fire and shadow

When switching to a dark desktop theme, or any theme for that matter, you probably want to achieve a high level of consistency regardless of which program you’re running. When it comes to Firefox and websites you will of course not reach perfect darkness as some pages simply aren’t dark by design. Well, a small attempt to make Firefox look nicer is to install some visually enhancing add-ons and themes and do some magic for frequently visited sites. Install the add-ons Stylish, Customize about:newtab and if you surf Reddit, install RES and activate night mode. I’ve installed Stylish themes for Facebook och Youtube. My customizations to the about:newtab page consists of setting the columns to 5 and rows to 2, all to make some room for this background image. This goes along very well with the Dark Fox Firefox theme.

And finally some must-have packages

This is in no way a complete list, it’s just some of the packages that I usually install during the first hours so I might as well list them here just in case it come in handy sometime.

sudo apt-get install terminator emacs htop vim git

To wrap this up I leave you with a screenshot of my main screen! G’night :D

A screenshot, very nice.

It’s so beautiful…

Driver du med mig?

Den här veckan fick jag ett paket med prylar från Inet. Det brukar oftast vara en glädjefylld tid när man får nya datorgrejer att leka  med men den här gången kan jag konstatera att det blev en jobbig start. Låt oss ta det från början.

Lite datorprylar

From Inet with love and pingvinstång.

Ett tränat öga kanske lägger märke till att grafikkortet (det stora paketet) har text med kyrilliska bokstäver. Är det ryssen som planerar invasion månntro? Tja, en snabb översättning med det här fina tangentbordet och Google Translate avslöjar att det medföljer en uppsättning vapen som gåva. Men jag tror vi kan vara lugna, jag är rätt säker på att de hör till spelet War Face.

Det vara bara till att knö in grafikkortet i min ganska trånga datorlåda. Allt gick inte perfekt, det var svettigt och jag var rätt hungrig trots energin från pingvinstången, men till slut blev det såhär fint:

Innehållet i min dator.

Snyggt byggt, fräsig kärra

Nu var det bara till att veva igång muskedundret och ägna sig åt mjukvaran istället för hårdvaran, vilket jag i regel tycker är mycket roligare. Den här gången skedde ett undantag från regeln. Jag är ledsen över att behöva gå in rätt djupt på de tekniska detaljerna nu, men situationen krever detta för att kunna ge en rättvis bild av eländet. (Och jag vet hur man stavar kräver men ibland får jag mina associationer. För dig som inte vill läsa vidare kan jag därför istället rekommendera en kik på Ett kilo mjöl.)

Planen var nu att installera drivrutiner från Nvidia. Det skulle inte vara svårt, det fanns en jättebra guide på Ask Ubuntu och jag hade faktiskt installerat Nvidias drivrutiner på Linux på min gamla dator Svinpäls för typ fem år sen, det kunde väl knappast ha blivit svårare med åren? Jag hade dessutom tänkt på att jag redan hade en drivrutin till mitt integrerade grafikkort i Intelprocessorn, den avinstallerade jag enkelt med kommandot

sudo apt-get autoremove --purge intel-linux-graphics-installer

och till slut var jag redo att installera den nya drivrutinen. Men det var något som inte ville fungera. Varje gång jag försökte installera drivrutinen så avbröts den med felmeddelandet ”Unable to load kernel module” eller nåt liknande. Detta var inget jag trodde skulle vara några problem, det fanns ju en detaljerad loggfil och Google att tillgå. I loggfilen såg jag två fel, dels att ”Kernel configuration is invalid.” och nåt om ”Unknown symbol drm_*”. För mig sa det inte så mycket, men på Google kunde man hitta många andra som hade haft liknande problem. Så de följande timmarna bestod mest av att installera paket, ta bort paket, skriva saker i konfigurationsfiler, starta om datorn, köra installationsprogrammet, misslyckas. Om och om igen, allt i den fantastiska upplösningen av 800×600 pixlar.

Tiden gick, jag blev hungrigare, tröttare, argare och jag behövde sova för nästa dag var en helt vanlig arbetsdag. Om den här historien hade haft ett lyckligt slut hade det stått att jag till slut insåg att det var några gamla rester från den där Inteldrivrutinen som låg och skräpade. Jag läste på lite noggrannare om hur man avinstallerade drivrutinen och kunde läsa att man behövde ta bort ett dkms-paket som jag tidigare förbisett. Hursomhelst har inte den här historien ett så pass lyckligt slut, och jag vet inte om det faktiskt var det där dkms-paketet som var roten till det onda. Det fanns nämligen en ”enklare” lösning: ominstallation! Enkelt var ordet, så enkelt att jag gjorde en liten lista över hela förfarandet:

Bestämma mig att det är dags att gå över till Kubuntu 15.04 -> Ladda ner ISOn -> Fixa bootbart USB-minne på macen, inte via UNetbootin utan via Manual Approach för att jag i den stunden är en idiot. -> Kopierar med dd till /dev/disk2, tar jättelång tid så efter en kvart avbryter jag och kör via /dev/rdisk2 istället, går på tre minuter. -> Installera via USB-stickan, bara det att installationen krashar halvvägs och säger att den troligtvis är korrupt, misstänker att /dev/rdisk2 var fel väg att ta. -> Kopierar på nytt via /dev/disk2 istället, hinner ta en dusch under tiden. -> Försöker installera via USB-stickan på nytt, samma fel. Verkar som att den nedladdade ISO-filen var helt paj. -> Försöker ladda ner på nytt, superlångsam server. -> Laddar ner via BitTorrent istället. -> Installerar via UNetbootin istället, framsteg! -> Lyckas installera! -> Lyckas installera grafikdrivrutinen. -> Bara till att installera alla program på nytt.

Dagen därpå märkte jag att Kubuntu 15.04 har en bug, och just där och då hade jag inte tålamod för fler buggar och problem. Jag hamnar i en mindre distributionskris, om jag inte trivs med Kubuntu, vad finns det då för hopp? Jag bestämmer mig för att gå tillbaka till det som funkar, och installerar Kubuntu 14.04 på nytt, med samma gamla installationssticka som jag använde för 10 månader sen när datorn var ny. Eländescirkeln var sluten.

Jag hade gärna gått igenom hur installationen av 14.04 gick och vad jag behövde göra för att få det att fungera som jag vill, men det här inlägget är långt nog nu, så det spar vi. Det jag har lärt mig är att ibland kan det vara en bra idé att vid problem ta ett steg tillbaka, laga mat till lunchlådan nästa dag och äta lite men när min dator inte fungerar är det svårt att slita sig från problemet, det är lite av mitt skötebarn. En ominstallation är sällan den bästa lösningen och den här gången var det sannerligen inte enkelt. Ta hand om er och era datorer :)

– Eric

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

Gamla vanor

Som så många gånger förut kommer jag idag skriva om vad jag stoppar i mig för att överleva.

Jag vet inte varför, men när jag skriver om mat och sånt så är jag i min komfortzon, känner mig säker på det jag skriver och oroar mig inte för vad andra ska tycka. Troligtvis för att jag kan hantera att folk inte gillar det jag äter, eller hur jag äter för den delen. Fun fact, jag äter pizza inifrån mitten och utåt, deal with it. ;)

Hursomhelst, jag insåg för några veckor sen att det fanns ett dilemma i mitt leverne. I skolan, hemma, ute och på många andra ställen jag vistas är det ganska kallt. Sådär kallt så efter att ha suttit och programmerat märker att man vill ha sköna tumvantar på sig. Men med tumvantar får man inte mycket kod skriven. Ett välbeprövat alternativ är förstås att dricka kaffe, men jag har inte lärt mig att dricka kaffe än och tänker inte börja nu. Te är okej, men jag blir oftast sängliggande efter en kopp (inte sant men behövde en anledning) så det går också bort.

Jag bestämde mig därför att göra varm choklad till min hot beverage of choice.

Varm choklad, inga konstigheter. Men varm choklad brukar ju oftast innehålla mjölk, och jag gillar inte mjölk. Jag tittade efter alternativ och experimenterade lite. Resultatet är som följer:

Erics härligt enkla chokladdryck (EHEC):
För 1 portion

  • 3 dl sojamjölk (Till exempel från Alpro)
  • 3 tsk kakao
  • 3 tsk socker
  • Vaniljsocker (1 krm eller efter behag)

Häll upp sojamjölk i en kastrull och tillsätt de torra ingredienserna. Hetta upp medan du vispar roliga mönster i kastrullen (cirklar, åttor osv) tills precis innan det börjar koka.
Servera! Men låt svalna så du inte bränner dig på tungan :)

Sojamjölken är faktiskt inget dumt alternativ till vanlig mjölk. Smaken är det inget fel på och för mig känns det bra att veta att ingen stackars ko har behövt bli befruktad på konstgjord väg och börjar producera mjölk till sin kommande kalv (en kalv som separeras från sin mor dagar efter födseln) och tvingas mjölkas av en maskin bara för att jag vill dricka varm choklad.

Jag måste bara kommentera vaniljsockret. Det är helt frivilligt att ha det i sin brygd. Något som däremot alla borde göra är att se till att ha vaniljsocker i skafferiet, alltid. Sen jag köpte en burk är det en fröjd att öppna skafferiet och känna doften av ljuvlig vanilj. Om du inte har vaniljsocker i hemmet, spring till närmsta mataffär och köp ett gäng paket vaniljsocker, placera ut på lämplig ställen i hemmet och känn livsglädjen frodas.

Till sist vill jag visa en funktion skriven i Python3 som kan vara till hjälp när man gör varm choklad av godtycklig mängd.

Förbättringar till receptet, koden eller livet mottages gladeligen.