onsdag, februari 28, 2007

XMLChess V 0.0.1

Nej jag kunde inte vänta, vad ska jag annars göra förutom att läsa till tentorna? Eftersom XSL inte har stöd för arrayer använder jag än så länge ett hack där jag bygger upp brädets innehåll i en sträng med hjälp av rekursion. Resultatet blir vid partiets start:

[h8|rook2|player2][g8|knight2|player2][f8|bishop2|player2]
[e8|king1|player2][d8|queen1|player2][c8|bishop1|player2]
[b8|knight1|player2][a8|rook1|player2][h7|pawn8|player2]
[g7|pawn7|player2][f7|pawn6|player2][e7|pawn5|player2]
[d7|pawn4|player2][c7|pawn3|player2][b7|pawn2|player2]
[a7|pawn1|player2][h1|rook2|player1][g1|knight2|player1]
[f1|bishop2|player1][e1|king1|player1][d1|queen1|player1]
[c1|bishop1|player1][b1|knight1|player1][a1|rook1|player1]
[h2|pawn8|player1][g2|pawn7|player1][f2|pawn6|player1]
[e2|pawn5|player1][d2|pawn4|player1][c2|pawn3|player1]
[b2|pawn2|player1][a2|pawn1|player1]

Det är inte särskilt vackert men det fungerar och jag kan sedan matcha mot rutornas namn och undersöka om rutans namn finns i strängen med brädets innehåll och då plocka fram innehållet, exempelvis 'vit dam'. Än så länge jag har inte lagt in några bilder så resultatet när jag ritar upp brädet är föga upphetsande:

[rook1][knight1][bishop1][queen1][king1][bishop2][knight2][rook2] 
[pawn1][pawn2][pawn3][pawn4][pawn5][pawn6][pawn7][pawn8] 
[ ][ ][ ][ ][ ][ ][ ][ ] 
[ ][ ][ ][ ][ ][ ][ ][ ] 
[ ][ ][ ][ ][ ][ ][ ][ ] 
[ ][ ][ ][ ][ ][ ][ ][ ] 
[pawn1][pawn2][pawn3][pawn4][pawn5][pawn6][pawn7][pawn8] 
[rook1][knight1][bishop1][queen1][king1][bishop2][knight2][rook2]

Men till nästa version lovar jag att ordna lite bilder, dom får nog definieras i en CSS. Ajabaja för att blanda presentation med data.

tisdag, februari 27, 2007

Laboration i XML/XSL

Ja nu förstår jag att du måste vara väldigt nyfiken på vad jag har gjort för något de senaste veckorna. Uppgiften gick ut på att skapa en databas över kvitton och deras innehåll och i förlängningen även låta artiklarna associeras med mer generella varor och även varugrupper. Själva databasen var inte särskillt besvärlig att bygga så det blev en del tid över och då snickrade jag en del på presentationen av kvittona. Resultatet blev ett ganska mastigt system och ett övergripande diagram finns här nedanför.

Eftersom det gick såpass bra föreslog läraren att jag skulle använda mina fyra valbara poäng till att arbeta vidare med XML i allmänhet och XSL i synnerhet. Känns väl lite skumt nu när jag har drygt hundra "valfria" poäng ifrån Karlstad men det ska jag göra iallafall.

Jag tror att det ska bli ett schackspel där man matar in vilken ruta man vill gå ifrån och vart man vill gå och om draget tillåts genereras det nya brädet. På så vis borde man också med hjälp av Java Script kunna spola framåt och bakåt i partiet. Kan nog bli intressant.

World Press Photo

Efter att ha bläddrat igenom bidragen mår jag riktigt dåligt. En liten 'realitycheck' kanske man skulle kunna säga. Två bilder som jag kommer att ha extra svårt att glömma är förstapristagaren i kategorin porträtt och vinnaren av tävlingen. Hittar du någon egen favorit?

måndag, februari 26, 2007

Spännande!

Det här hade jag aldrig räknat med men det kanske beror på att det aldrig skulle ha inträffat i Karlstad med de obefintliga näringslivskontakter som finns där, bortsett ifrån skogsindustrin.

Kul att det lönar sig att satsa på högre betyg.

fredag, februari 23, 2007

Widescreen i Ubuntu

När jag köpte skärmen hade jag aldrig räknat med några problem att använda den eftersom grafikkortet i datorn klarade den upplösning som skärmen fungerade bäst med (1680x1050). Det visade sig inte vara helt simpelt tyvärr, i Windows fungerade allt bra förutom i dockningsstationen där den startade i 1024x768 på den interna skärmen efter att ha tagit ur datorn under en "hibernation". Det fanns en enkel lösning, [Fn]+[F10] växlade mellan intern och extern skärm. Väldigt smidigt.

I Ubuntu har jag haft andra problem, Xorg förstår inte vad grafikkortet klarar av har det visat sig. Hur fixar man det då? I Windows är inte det något problem eftersom det finns drivrutiner ifrån Intel som tar hand om det här. I Linux får man fixa det själv... tillsammans med de övriga 30 miljoner linuxanvändarna. En av dessa är Alain Poirier som skapat 855resolution som jag nu kan använda för att programera om BIOS:et på grafikkortet, men man får inte glömma att lämna en fake upplösning i sin xorg.conf. Min svåger pratade om att tweaka Windows, det här är samma sak men utan störande GUIs som begränsar. Efter att ha kört:

855resolution 5a 1680 1050

För att ladda in den nya upplösningen och startat om Xorg fungerar allt fint, tyvärr rensas BIOS varje gång jag startar om datorn och därför behöver jag köra 855resolution varje gång. Det kan man ordna med ett script som placeras i /etc/init.d mappen. Därefter kör man rcconf för att se till att scriptet körs under rätt runlevel men man får inte glömma att byta namn på filen eftersom de körs i bokstavsordning och man vill inte starta Xorg innan konfigurationen av BIOS genomförts.

Lät det rörigt? Jag har druckit vin...

tisdag, februari 20, 2007

Jobb - updatering

Nu har jag varit på besök hos Nordicstation och det känns helt rätt, jag har inte skrivit på något ännu men allt pekar på att jag ska börja till sommaren. Tjänsten verkar klockren med lagom balans mellan ansvar och frihet, unga kollegor och en liten smidig organisation. Kontoret ligger ca en kilometer norr om Östra station vilket passar mig utmärkt då jag slipper byten på vägen till och från jobbet.

Frågan är nu vad som kan gå fel? Eftersom jag ska genomföra ett examensarbete över sommaren behöver jag ta kontakt med de ansvariga på skolan och höra vad jag behöver göra för att de ska godkänna det och ge mig en handledare. Om det är för tätt inpå kan det bli problem men ett par av de studenter som ska göra sitt exjobb under nästa period (som börjar om någon vecka) har inte några problem så då borde det gå bra för mig med. Men det vet man aldrig. Jag håller tummarna.

Under helgen var jag i Karlstad och hälsade på Sara, Jonas och Anton. Dessutom passade jag på att gå på rugbyklubbens årsmöte och dricka ett par öl med grabbarna-grus. Karlstad verkade vara sig likt förutom den nya gallerian.

onsdag, februari 14, 2007

Lansering av Rugbywiki

Ja då var det dags! I dagarna ska kansliet lägga upp en länk på förbundets sajt och sedan bär det av. Det bästa vore om rugbysverige tog till sig och använde wikin och det sämsta om ingen brydde sig alls. Antagligen kommer resultatet att vara där emellan, ett mediokert nederlag. Oavsett har det varit kul och lärorikt att sätta upp programvaran och jobba lite med grafik som omväxling. Här är den bild som förhoppningsvis kommer att återfinnas på Rugby.se inom kort:

Det ska bli väldigt intressant att se hur bra folk kan hantera den här nya informationskanalen med tanke på att forumet på Rugby.se blivit känt för smutskastning och baktaleri. Varför lyckas jag alltid hamna i smeten? Jag vill bara hjälpa till...

måndag, februari 12, 2007

Fibonaccital

Jag kunde inte hålla mig. Här är ett diagram som visar hur lång tid (jag har beräknat alla n tio gånger och beräknat medelvärdet) det tar att beräkna ett visst tal i talföljden. Fram till 30 går det nästan snabbt men redan vid 50 orkade jag inte vänta på att datorn skulle räkna färdigt åt mig. Talen i sig finns det nästan hur mycket information om som helst. Man kan bland annat hitta att det 100:e talet är 354224848179261915075 och att om man dividerar två på varandra följande tal (det större delat med det mindre) så blir resultatet det gyllene förhållandet (mer eller mindre exakt beroende på hur stora tal man använder). Det gyllene förhållandet i sin tur går att hitta på olika platser i naturen, exempelvis i snäckor. Antalet kronblad på blommor är ofta fibonaccital; smörblomman har fem, liljor och irisar har tre och astrar har 34, 55 eller tillochmed 89 blad. Ganska häftigt.

Ett par länkar:

Rekursion för nybörjare

Vad är rekursion, när gör man det och hur? Jag delar upp frågan i tre delar:

  • Vad är rekursion?
  • När använder man rekursion?
  • Hur använder man rekursion?

Vad är rekursion

Inom programmering handlar rekursion om att repetera en beräkning fler gånger tills man når sitt mål och då returnera svaret, en beräkning är inte avslutad förens svaret returneras.

Om man skulle göra en liknelse med verkligheten kan man föreställa sig att en person (funktion) har möjligheten att skapa kopior av sig själv genom att ropa en fråga in i en tratt. När ljudet kommer ut ur tratten finns exakt samma person på andra sidan förutom att det är en ny instans, en ny exakt likadan människa. Den människa som tar emot frågan har samma möjligheter som den som ställde frågan att svara på frågan.

Det faktum att personen som tar emot frågan har samma möjligheter att svara på frågan som den som inte kunde svara på frågan kanske låter lite dumt, om dom nu har samma beräkningskapacitet, hur ska då den andra kunna svara på något som inte den första kan? Nu kommer det något finurligt, den som ställer frågan tar inte bara in information i öronen och ropar ut en fråga in i tratten utan förenklar även problemet. Om inte problemet kan förenklas och inte lösas direkt går det inte att lösa alls. Däremot, så länge problemet förenklas för varje rop kommer man någonstans i framtiden att nå slutet. Därifrån ropas sedan svaren tillbaka åt andra hållet genom tratten och den person som tidigare ropade frågan får ett svar. Svaren byggs ihop allteftersom och till slut hamnar det sista svaret hos den första personen i kedjan som slår samman det sista svaret med sin egen förenkling och sedan ropar ut det kompletta svaret.

Det är svårt att göra en liknelse med verkligheten eftersom förutsättningarna är helt olika, det finns inte samma möjligheter att skapa kopior av människor. Jag har inte tagit droger även om det verkar så av beskrivningen. En del av det svåra med rekursion är inte att lyckas genomföra det utan att förstå hur det fungerar. Här är ett exempel på rekursion:

function factorial(n) 
{
  if (n <= 1)
    return 1;
  else
    return n * factorial(n-1);
}

Funktionen anropar sig själv tills parametern n är mindre än eller lika med ett. Då skickas resultatet upp för stegen (enligt bilden i föregående post). För varje anrop ned för trappan minskas värdet (problemet förenklas).

När använder man rekursion

Inom programmering har rekursion i takt med att programmering gått ifrån konst till teknik fasats ut. Vissa problem (exempelvis för att beräkna ett godtyckligt tal i fibonacciserien) går inte att lösa utan rekursion och då används det men i stort innebär rekursion ett stort "NO-NO". Det som väger tyngst mot rekursion är att för varje rekursivt anrop sparas en kopia av föregående funktion i minnet och ja du förstår, till slut tar minnet slut och då når man aldrig lösningen utan i bästa fall avslutas programmet av operativsystemet och i värsta händer ingenting, ingenting alls. Ett annat potentiellt problem är att rekursion, även om det är vackert, kan vara svårt att förstå och speciellt om man inte har skrivit koden själv utan ska försöka tyda någon annans vilket händer allt oftare idag. Om man kan ska man undvika rekursion. Oftast finns en likvärdig lösning utan rekursion som kodsnutten här nedan som gör exakt samma sak som den ovan men utan rekursion utan med en loop:

function factorial(n)
{
  if (n <= 1)
    return 1;
  else
  {
    var result = n;
    while (n-- > 1)
      result *= n;
    return result;
  }
}

Tyvärr finns inte loopar inom strikt funktionell programmering så där får man hålla tillgodo med rekursion. Men vad jag förstår används strikt funktionell programmering främst i den akademiska världen. Exempelvis Lisp (som är ett funktionellt programspråk) tillåter både loopar och rekursion.

Hur använder man rekursion

Ett förvånansvärt enkelt svar är att så fort en funktion anropar sig själv uppstår rekursion. Om du vill använda rekursion kan du alltså låta en funktion anropa sig själv helt enkelt men oftast vill man även utföra en beräkning som i fibonacciberäkningen här nedan som tar ett tal n som motsvarar vilket tal i serien man vill ha ut:

long fibonacci(int n)
{
  if (1 == n || 2 == n) {
    return 1;
  } else {
    return (fibonacci(n-1) + fibonacci(n-2));
  }
}

För att skapa en sådan funktion börjar man vanligtvis med att definiera ett slutvilkor där rekursionen ska vända om (där anropen går ifrån ovansidan av stegen till undersidan i bilden), här utgörs slutvilkoret av att parametern n tar värdet 1 eller 2. Därefter lägger man till det rekursiva anropet, minst ett men kan vara flera som i exemplet. Det är viktigt att problemet förenklas, som här genom att parametern minskar med 1 respektive 2 för varje anrop. Därefter kan funktionen anropas.

Det verkar kanske inte så svårt om man kan programmera men att uppfinna fibonacciserien är en helt annan femma.

söndag, februari 11, 2007

Rekursion

När jag var ute och strövade på nätet efter en lösning till ett problem som jag har snubblade jag över en genialisk bild på IBMs sajt. Jag minns att Nils Dåverhög som är lärare vid KaU beskrev rekursion som tre steg:

  1. Anrop
  2. Rekursivt anrop
  3. Slut kondition
Det fungerar bra om man vet vad man gör (vilket man sällan gör eftersom rekursionen ibland löper amok och inte bör användas). För att mer åskådligt se vad som händer skulle jag rekommendera den här bilden:

I bilden kan man klart och tydligt se hur funktionsanropen och deras resultat är tänkta att fungera. Om inte annat kan man visa hur rekursion fungerar i teorin och är tänkt att fungera i praktiken.

För att binda ihop de två varianterna kan man säga att anropet sker längst upp i trappan (på ovansidan), varje steg nedåt i trappan är ett rekursivt anrop och slutkonditionen motsvaras av hoppet där rekursionen övergår till att börja returnera resultat (ifrån ovansidan av trappan till undersidan, längst ner).

lördag, februari 10, 2007

Tack Sara!

Under våren 2006 arbetade jag och Mats med vårt examensarbete för Landstinget i Värmland. Idén till det hela kom ifrån min syster som arbetar vid hudmottagningen på sjukhuset. Vi hade aldrig räknat med att få ut någon ersättning i form av pengar för arbetet vi lade ner -vi var så glada att få hjälpa till någonstans där vi kunde både tillämpa våra kunskaper och göra nytta att vi inte brydde oss särskilt mycket.

För någon månad sedan träffade jag min syster och döm om min förvåning när hon talar om att vi kommer att få en viss ersättning. Att sedan Mats avstod sin del gjorde att jag helt plötsligt hade möjlighet att investera i lite ny elektronik, så det har jag gjort nu. En skärm, portreplikator (för att få DVI-D) och ett nytt tangentbord blev det. Rena rama julafton! Här är en bild på prylarna, portreplikatorn är den lilla L-formade plastiga saken som datorn står i nere till vänster om skärmen:

torsdag, februari 08, 2007

Gamla hemsidor

Tänka sig att dessa tillåts ligga kvar:

Det var innan Internet öppnades för allmänheten och när det fortfarande fungerade fint med statisk HTML. ICQ var det enda sättet förutom mIRC som var allmänt känt för chat, idag finns det nog inte en enda sajt utan egen chatavdelning.

Rugbywiki

Under föreningskonferansen (jag visste egentligen det här innan) kom det fram att det saknades ett bra verktyg för informationsutbyte föreningar emellan. Sedan jag kom hem igen har jag därför skaffat en domän och installerat en Wiki där. Sajten ska lanseras inom någon vecka på Svenska Rugbyförbundets hemsida så då får jag se om någon är intresserad av att bidra. Hoppas det.

onsdag, februari 07, 2007

Två blev tre och problemet krympte

Det visade sig att mejlet jag fick ifrån 10Ton inte hade något att göra med det jobb som Martin tipsade mig om. Strax innan, igår kväll, ringde 10Ton och bad mig komma in på intervju idag klockan två. Fort ska det gå! Tidigare på dagen kom jag överens med Nordicstation om ett möte den 19:e februari.

Det fina med kråksången är att nu behöver jag inte ta jobbet hos EBI systems om dom erbjuder mig det eftersom jag alltid kan falla tillbaka på Nordicstation. Då har jag ändå inte räknat med Martins wildcard som jag inte vet något om.

Slippsen är framme och färdigknuten så nu ska jag bara förbi Täby och röntga axeln på vägen till intervjun.

tisdag, februari 06, 2007

Jobb

Jag varken kan eller vill välja vilket av jobben jag ska inrikta mig på så jag har bestämt mig för att söka båda, jag kommer säkert inte att få något av dem ändå.

Trevligt problem

Men ändå ett problem, jag har två jobb på gång. Sedan i höstas har jag haft kontakt med Nordicstation och jag ska dit nästa vecka för att diskutera i första hand sommarjobb. Igår ringde Martin och frågade om jag kunde C#, han kände någon som kände någon som trodde att det kanske kunde finnas ett jobb för mig i Stockholm. Nu har jag fått mejl ifrån 10TON och känner mig lite i kläm.

Först och främst ska jag gå färdigt de kurser som jag går nu; Avancerad datahantering med XML och Industriell ekonomi. Mest för att det är intressant. Efter det kommer jag inte att kunna ta ut någon examen, den är ungefär 15 poäng bort. Under period fyra kommer jag (om jag fortsätter att läsa) att gå en kurs och en halvfarts kvällskurs i Datormusik, det känns som ett bra tillfälle att smita ifrån och få lite smak på arbetslivet.

Med tanke på att jag kanske inte får något av jobben så känner jag mig ändå ganska säker, det finns alltid skolan att falla tillbaka på. Ponera att jag får ett av jobben, vilket ska jag välja? Det som antagligen kommer att väga tyngst är det faktum att jag haft kontakt med Nordicstation sedan i våras, det skulle kännas lite fult att tacka nej nu. Men sedan då? Jag jämför:

EBI systemsNordicstation
Omsättning 15 Mkr
Antal anställda 14
Geografi>1km, vid Valhallav.

Äh, det där gick inte så bra. Det är svårt att hitta information om företagen men det verkar som att EBI systems är mycket större och har fler anställda som delar kakan. Hos EBI skulle jag få arbeta med deras Platinum plattform som fått mycket positiv kritik från bl.a Bill Gates. Nordicstation är däremot mer konsultinriktat, mer varierande arbetsuppgifter.

Jag ska hälsa på Nordicstation nästa vecka och efter det vet jag förhoppningsvis lite mer.

När Harry mötte Sally

I söndags var det dags för Idas julklapp, hon hade köpt teaterbiljetter till föreställningen När Harry mötte Sally. Jag fick välja restaurang innan och försökte först hitta något mysigt och litet men efter att ha tänkt till kom jag fram till att en mysig restaurang som dessutom är mindre sällan har hemsida med meny på Internet. Så det blev Barcelona tapas bar, en kanna San miguel för 135kr känns billigt (jämfört med Karlstad). Att restaurangen låg granne med teatern gjorde inte saken sämre.

Pjäsen var bra, det häftigaste var kuben mitt på scenen som snurrades på för att visa olika scenerier. På en sida fanns ett bord och på en annan fanns en bokhylla osv. Den sida som inte visades för publiken kunde prepareras på baksidan.

Harry spelades av Jakob Eklund som jag innan bara sett på TV men han är visst ganska bra på teater också. Eva Röse som spelar Sally är fenomenal, inte minst i scenen där hon förklarar varför Harry måste ha råkat ut för en tjej som fejkat orgasm någon gång eftersom han träffat så många tjejer och alla tjejer har fejkat åtminstone en gång.

fredag, februari 02, 2007

Axel -fortsättning

Efter att ha tagit tag i problemet med min fortfarande ömmande axel har jag nu varit på besök hos min husläkare i Åkersberga. Jag ringde och beställde tid för ett par veckor sedan och fick en tid nästan direkt men den kunde jag inte ta eftersom det krockade med en föreläsning. Nu har jag alltså varit där. Det tog ca 3 minuter tills domen föll... eller snarare inte föll, röntgen i Täby. Idag fick jag kallelsen och den 7:e februari är det dags. Snabba ryck.

Det är klart att jag ångrar att jag inte tagit tag i det här tidigare men jag har räknat med att det ska läka och försvinna, det har det inte gjort. När det hände (i maj) försökte jag förgäves få tag i en läkartid vid vårdcentralen i Kronoparken men däremot lyckades jag få tag i en sjukgymnast som undersökte mig och gav mig ett par övningar. Det tråkiga är att jag fortfarande kan säga att jag gjorde vad jag kunde, det var inte akut så jag kunde inte åka till sjukhuset och jag kunde inte få någon tid inom sommaren vid vårdcentralen.