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).