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)

RSS 2.0