Bok: Test-Driven Development

Test-Driven Development By Example

av Kent Beck

ISBN: 9780321146533

Detta är en bok som i tre steg visar hur Kent Beck tycker man skall skriva kod. Boken är lättläst, enkel att förstå och Beck är ganska tydlig i vad  han menar och hur han föreslår att man skall jobba.

Min behållning av boken är den lilla privata lappen med “test att skriva” – något som han alltså förespråkar men som jag själv aldrig använt i större utsträckning. Jag petar istället ner alla test-idéer i kod, typ:

// FIXME: testa null

Om jag skall ge mig på att sammanfatta vad han förespråkar så är det:

  • börja litet
  • använd en lista där du skriver upp testfall som du vet eller kommer på behöver testas
  • låt design växa fram
  • använd refaktoreringssteget till att skriva den riktiga implementation
  • misslyckas man med ett stort test, skriv ett mindre istället
  • få hellre ett test till att gå igenom än att ha vacker kod

Jag rekomenderar boken till någon som har ett hum om vad TDD är men som inte sett hur det kan fungera i praktiken. Kodexemplen är visserligen ganska lätta men det intressanta är att se hur han jobbar med problemlösning, vad TDD-metodiken ger och att det banne mig inte är svårt att börja.

Build.version

Med hjälp av MANIFEST


				org.codehaus.mojo
				maven-buildnumber-plugin
				0.9.6
				
					
						validate
						
							create
						
					
				
			

Denna plugin kräver att man satt upp SCM ordentligt så att versionnummer kan hämtas därifrån!


				org.apache.maven.plugins
				maven-war-plugin
				2.0
				
					
						
							${buildNumber}
						
					
				
			
	private String readBuildNumber(ServletContext servletContext) {
		try {
			URL resource = servletContext.getResource("/META-INF/MANIFEST.MF");
			InputStream manifestStream = resource.openStream();
			Manifest mf = new Manifest(manifestStream);
			Attributes atts = mf.getMainAttributes();
			String value = atts.getValue("Implementation-Build");
			if (value == null) {
				throw new IllegalArgumentException("Implementation-Build attribute is not set in MANIFEST " + resource.toExternalForm());
			}
			manifestStream.close();
			return value;
		} catch (Exception e) {
			throw new IllegalStateException("Failed to read Implementation-Build attribute from MANIFEST.MF");
		}
	}

Eller som vanlig resource (properties)


		
			
				src/main/resources
				true
			
		

assertThat(Hamcrest).looksNice();

I väntan på David Saff’s alternative assertThat(x).y() så nöjer jag mig med:

public class EmptyMatcher extends TypeSafeMatcher<Collection < ?>> {

    @Override
    public boolean matchesSafely(Collection< ?> c) {
        return c.isEmpty();
    }

    public void describeTo(Description desc) {
        desc.appendText("empty");
    }

    @Factory
    public static lt;T> Matcher< ? super Collection> isEmpty() {
        return new EmptyMatcher();
    }
}

som gör att man kan skriva trevlig enkelt läsbar kod, t ex:

@Test
public void filteringAnEmptyListReturnsAnEmptyList() {
    List anEmptyList = new ArrayList();
    List result = testee.filter(emptyList());
    assertThat(result, isEmpty());
    // men helst: assertThat(result).isEmpty();
}

Webbtryck.se igång

Tomas Ekman (tidigare på Tryck Till Tusen Grafiska, nu på Brilliant Smile) frågade mig om jag kunde göra en web-to-print-lösning åt honom. Det gjorde jag på knappt 25 timmar och resultatet kör nu live på webbtryck.se.

Lösningen fungerar fint och Tomas kunder (mäklare där två kontor nu kör för fullt) är nöjda, så pass nöjda att jag skall försöka se om vi inte kan få fler kunder att använda systemet.

Optimera Stockholm

Det är lite lockande att som Göteborgare passa på att skämta om bästkust och hur man har behov av optimering i Stockholm medan allt är fint i Götet, men dagens seminarie/minikonferens (twittertag #optsthlm) på ämnet webboptimering/webbprestanda förtjänar inget annat än lovord! Talarnas ämnen och innehåll var mycket väl utspridda över hela problemrymden från server till klient och allt där mellan. Continue reading “Optimera Stockholm”

Speed Matters

Some high traffic sites conducted research and uncovered the following:

  • Google.com: +500 ms (speed decrease) -> -20% traffic loss [1]
  • Yahoo.com: +400 ms (speed decrease) -> -5-9% full-page traffic loss (visitor left before the page finished loading) [2]
  • Amazon.com: +100 ms (speed decrease) -> -1% sales loss [1]

[1] http://home.blarg.net/~glinden/StanfordDataMining.2006-11-29.ppt
[2] http://www.slideshare.net/stoyan/yslow-20-presentation

Signeringsfest: GPG och CA Fire and Forget

Jag var för första gången med vid en stor “signeringsfest” på Fosdem2010 – över 250 nycklar var inskickade men i slutändan var det inte fler än 80 som dök upp i kylan och duggregnet. (Jag själv kom 20 minuter sent.)

Hur som haver – efteråt gäller det att signera och få iväg de signerade nycklarna. Till detta finns caff, CA Fire and Forget, som just gör det man vill:

  • hämtar hem nyckeln
  • signerar den
  • skickar den krypterad till mottagarens adress (bara mottagaren med rätt privat nyckel kan läsa signaturen).

caff -m yes -u 9B1E4234 `cat keys-to-sign.txt`

och detta kommer i paketet signing-party.

Det finns dock inget som plockar ut fingerprintdelen ur den ASCII-fil som distribueras, så jag fick hacka ihop detta själv med lite python:

#!/usr/bin/python

indicies = []
keysByIndex = {}
lastIndex = False

# get the indexes of the keys "verified", as they appear on the key paper (000, 001, ...)
for line in open("id-verified.txt"):
  if len(line) == 4:
    indicies.append(line[0:3])

# build up index > key part
for line in open("ksp-fosdem2010.txt"):
  if "Fingerprint OK" in line:
    lastIndex = line[0:3]
  else:
    if lastIndex:
      key = line[12:20]
      keysByIndex[lastIndex] = key
      lastIndex = False

# write keys out to file
print "You've mareked %s out of %s - verify this before running caff" % (len(indicies), len(keysByIndex))
out = open("keys-to-sign.txt", "w")
for index in indicies:
  key = keysByIndex[index]
  out.write(key)
  out.write(" ")

Getting Things Done & Pomodoro

Emellanåt har jag fler än två saker att göra på jobbet (annat var det förr!) så mitt behov av pomodoro eller annan strategi för att beta av en att göra-lista är mycket begränsat. Lite då och då sitter jag dock med en “privat” att göra-lista (som bara växer) och nu är ett sådant tillfälle – “dags att testa pomodoro” tänkte jag och letar upp en Pomodor-timer för Gnome lite snabbt.

Den visar sig inte vara översatt till svenska (använder gtranslator för detta) och den kommer inte förkompilerad som binär. Det var längesedan jag byggde debianpaket, men det brukar vara ganska enkelt. Låt oss se:

sudo aptitude install debian-builder

Efter uppackning av tar-bollen kör jag debuild som säger:

dpkg-checkbuilddeps: Ej uppfyllda byggberoenden: cdbs (>= 0.4.43) debhelper (>= 6) python-distutils-extra (>= 2.10)

Så vi drar in dem med: sudo aptitude install cdbs debhelper python-distutils-extra och kör debuild igen.

Bygget fungerade tyvärr inte ändå och fick rapporteras som en bugg. Använder tills vidare timer-applet.

Internet Explorer under Ubuntu 10.04

Ja – min arbetsgivare använder en lösning för registrering av utlägg som är hårt knuten till ActiveX-komponenter. Därför är det smidigt att kunna köra Internet Explorer under Ubuntu GNU/Linux 10.04 (äks Lucid Lynx). Paketet som de flesta kört heter IEs4Linux och man får installera det själv – Ubuntu paketerar det inte.

Jag drog in det och instruktionerna på hemsidan stämmer, men jag fick (som andra också rapporterat) problem med GTK+ pga att jag körde flera skärmar. Med flaggan –no-gui körde installationsprogrammet ies4linux utan större problem – flash-installationen sparkade bakut men det gör mig inget.