Bloggbyte genomfört!


Jag har bytt blogg -- du hittar mig numera på

http://olofb.wordpress.com


Dataspel

image25Kort spekulation / eftertanke:

  1. Grafiken får dig att börja
  2. Kontrollen får dig att stanna
  3. Musiken får dig att komma tillbaka

Läs även andra bloggares åsikter om ,

Boktips.net, wow

image24Bra grejer: surfa in på boktips.net direkt och leta upp en bok du är intresserad av!

Det verkar vara ett samarbete mellan sveriges folkbibliotek, där bibliotekarier tipsar om och recenserar böcker de läst. (och de lär ju ha läst en del med sin femåriga litteraturutbildning.. för att inte tala om alla sega dagar när det inte finns något att göra på bibblan!)

Läs även andra bloggares åsikter om , ,

Modern hyrfilm via nätet

image23DN recenserar några olika sätt att hyra film via nätet / ip-trafik. Har prövat lovefilm (som hette brafilm tidigare) men blev "lurad" av deras finstilta text (fick betala 200 spänn fast jag blev lovad "gratis" prövotid). Kanske de bättrat på sig, vad vet jag.

Intressant att DN tipsar om piratebay som den mest användarvänliga alternativ :)

Läs även andra bloggares åsikter om , , ,

Program för att lösa Sudoku

image22Har funderat på att bygga ett program som löser Sudoku-pussel automatiskt ett tag nu. En simpel algoritm är följande:

  1. Upprepa följande, så länge det finns någon tom ruta i pusslet:
  2. Leta upp en ruta, som har precis en "kandidatsiffra"
  3. Fyll i rutan med kandidaten
Det låter väldigt enkelt, men jag tror att det räcker långt. Fullt ut vet jag inte ännu. Så jag funderar på att koda ihop algoritmen (mha. TDD såklart!) och se hur långt den räcker.

I Pseudokod skulle de kunna se ut något sånt här:

sudoku = GetInputSudoku()
GreedySolver(sudoku)
print sudoku

function GreedySolver(sudoku)
__do
____pos = FindCandidatePos(sudoku)
____if pos!=null
______sudoku.Set(pos, sudoku.FindCandidates(pos)[0])
__while pos!=null

function FindCadidatePos(sudoku)
__foreach(pos in sudoku)
____cands = sudoku.FindCandidates(pos)
____if(cands.Count == 1)
______return pos
__return null


Läs även andra bloggares åsikter om , ,

TV3, var är Star Wars 3?

image21Såg på Star Wars episod 1 i fredags, episod 2 igår lördag, men hör och häpna: nu idag söndag går episod 4!!

Så var tog episod 3 vägen??

Är det någon som vet?

Asstörigt.

Andra bloggar om ,

Regex i C#

image20Den allra mest användbara metoden för reguljära uttryck i C# är nog Regex.IsMatch():
string input = "olof"; 
string pattern = "of";
if(Regex.IsMatch(input, pattern))
MessageBox.Show("Found match!");
Observera att match betyder "återfinns någonstans i strängen".

Läs även andra bloggares åsikter om , , ,

Stora projekt, en reflektion

image19
Så sant, så sant ...
Läs även andra bloggares åsikter om , ,

Testa vad?

image18Här är ett litet "tyckande" från mig, när det gäller TDD. I traditionell enhetstestning, uppmuntras man att ringa in "corner cases" eller "edge cases". Jag tycker att långt viktigare än dessa "specialfall" är de vanligaste fallen. Dessa bör det skrivas test för först av allt! När man skriver dessa enkla, vardagliga test, och implementerar kod för dem, kommer man att "se" corner cases i implementationen, och kan lägga till test/kod för dessa efter "vardagstesten". Så ska det vara!

Läs även andra bloggares åsikter om , ,

Testning av geometriska konstruktioner

image17Satt och fick huvudvärk på jobbet nyss. Försökte testa algoritmer för att generera en viss typ av geometrisk data; inte klassiska Circle(), Point() och Line() utan mer specialinriktat än så (maskinstyrning om du nu måste veta).

I alla fall; eftersom jag är den ende utvecklaren med TDD-inriktning på jobbet, är koden ibland svår att testa.

I detta fall var det jobbigt att kontrollera om genererad geometri stämde överrens med förväntningar eftersom inte en enda av c:a 15 klasser implementerade Equals() - och referenslikhet räcker inte långt då man gör enhetstester av instanser som är lika i matematisk mening (samma "värde").

  • Alternativ ett: implementera Equals() och GetHashCode() på alla klasser. Huvudvärk! Av flera skäl:

  1. Det är bökigt att få rätt på Equals() i C# (det finns hur många trådar som helst som behandlar detta på nätet)
  2. Det stökar ned de i övrigt ganska atomära klasserna jag ville testa
  3. Övriga utvecklare hade inte uppskattat att jag lagt till detta "aber" i klasserna
  4. Det hade påtvingat en "implicit policy" vid tilläggande av fler, mer sammansatta klasser. Att implementera Equals() för dem är helt onödigt för slutprodukten.

  • Alternativ två, som jag var rädd att välja först, verkar efter dessa två timmars huvudbry inte så dumt längre. Det är att helt enkelt bygga specialtester för "de vanligaste klasserna" -- det är trots allt det enda jag kan testa i dagsläget (framtida klasser är svåra att testa!).

Läxa att lära:
Equals() är inte nödvändig för tillstånds-testning!




Läs även andra bloggares åsikter om tdd, geometri, testning, programmering

Hållbar utveckling

image16Jag är en s.k. miljömedveten individ. Eller jag tror jag är det.

I alla fall; hållbar utveckling är ett bra begrepp rent mjukvarumässigt också! Mjukvarautveckling mha. TDD är hållbar mjukvaruutveckling.

Att designa för testbarhet

image15Jag har lagt mig till med en ny designtumregel.

Håller på att läsa "Working Effectively with Legacy Code" av Michael Feathers, det är från den följande insikt bubblat upp:

1. Varje klass ska gå att instansiera utan beroenden, varken interna (att den instansierar/anropar metoder i sina metoder) eller externa (beroende på fil / databas etc.).
2. Om en klass behöver externa / interna beroenden, ska dessa skickas med explicit i konstruktorn

Detta gör enhetstestning av klassen möjlig. Och därmed ökar kvalitén på klassen. Och den här stackars kodaren mår bättre :)

Om man måste använda sig av GUI/Databas och annat grejsimojs, kan man försöka bryta ut "logik" ur den koden till "Santas Little Helper"-klasser som man kan testa istället.

Läs även andra bloggares åsikter om , , ,

Böcker jag vill läsa och/eller ha i hyllan

  • image10Working Effectively with Legacy Code (Michael Feathers)
  • image11Refactoring to Patterns (Joshua Kerievsky)
  • image12Programming Pearls (Jon Bentley)
  • image13Mythical Man Month (Frederick Brooks)
  • image14Game Programming Gems 2-7 (div.; jag har ettan redan)

Jade Warrior

Jaha, så har jag sett Jade Warrior, det finsk-kinesiska kampsportseposet.

Har radas den ena sago/epos-klyschan efter den andra. Tyvärr identifierar jag mig inte med någon av rollfigurerna, så de blir bara dockor i ett animerat skyltfönster för mig, hur snyggt det än ser ut.

Sedan blir trovärdigheten låg när man försöker lura i mig att kineser på något sätt härstammar eller har något slags mystiska förkinesiska band till Finland. Finnar som talar kinesiska må väl existera, svårare att tro på är kineser som talar finska (på medeltiden typ), men allra svårast har jag för hammarsvingande finnar som slåss som kineser.

Ledsen Finland, men det här kan kineserna bättre än er, låt dem göra det.

image9

Flytta källkodsfiler i SVN+VisualStudio-miljö

image8image7Det är inte superenkelt att flytta filer om man kör VisualStudio och SVN som arkivprogram.

Problemet är att Visual Studio's projektfiler innehåller sökvägarna till källkodsfilerna. Alternativet, som storkonkurrenten Eclipse valt, är att det är en 1-1 mappning mellan filsystem och projekt.

Detta gör att det blir hårigt att flytta en källkodsfil som finns med i ett projekt. Här är min nuvarande "algoritm", om någon har ännu smidigare sätt, hojta till!

Jag förutsätter att man vill flytta en fil in i en ny projekt-mapp för att strukturera upp sitt projekt.

I projektroten: A.cs
Vill ha den i: rot\NyMapp\A.cs

  1. Skapa NyMapp mha. Visual Studio högerklick på projektet
  2. Stäng av Visual Studio
  3. Högerklicks-dra A.cs till NyMapp, välj "SVN Move versionen files here" på kontextmenyn
  4. Starta Visual Studio
  5. Högerklicka på NyMapp och välj "Add->Existing Item", välj A.cs
En metod jag också prövat är att ha Visual Studio avstäng och skapa NyMapp + flytta filen (SVN Move). Men det ställer till problem när man vill skapa projektmappen i Visual Studio - man får upp felmeddelande med "Folder already exists" och det räcker inte med att döpa om mappen i filsystemet, man måste verkligen stänga av Visual Studio (den måste cacha eller något..).

Läs även andra bloggares åsikter om , ,

RSS 2.0