Det virker for mig!

Mangt og meget er skrevet om unit testing – heriblandt også en masse kloge og generelle ting. Det vil jeg ikke forsøge på. Det er jeg slet ikke klog nok til.

I stedet vil jeg blot konstatere, at unit testing virker for mig, og det er lige meget, om det er mig eller andre, der skriver dem, og om de bliver skrevet før eller efter produktionskoden er skrevet.

Det, jeg for alvor har opdaget på det seneste, er, at min produktivitet afhænger proportionelt af mængden af tests (og kvaliteten af disse). Er der gode tests, er min konfidens større, jeg har nemmere ved at skabe overblik over koden, og jeg kan derfor hurtigere komme frem over stepperne.

Derfor insisterer jeg på, at unit testing (og anden testing) er en god ting, og derfor insisterer jeg på at bruge tid på det – ikke fordi nogen har skrevet en masse kloge ting.

Del med andre:
  • Print
  • email
  • Facebook
  • Twitter
  • Google Bookmarks
  • FriendFeed
3 Kommentarer
Tagged , ,
Ham, den gamle, sure mand

Hvis man følger mig på Twitter, så vil man have bemærket, at jeg er begyndt at brokke mig mere og mere over programmeringssproget Java:

Det skal kompileres, classloading er noget bøvl, implementationsdetaljer fra Javas serialiseringsmekanisme, som unødigt forurener klasser, Swing, der er virkelig besværligt at danse med, manglen på anonyme metoder (closures, blokke, lambdaer, kald dem hvad du vil), anonyme klasser, generics, som er sort magi (virker det, er man enten en troldmand eller blot heldig), osv.

Kort sagt: Jeg ser flere og flere ulemper ved Java.

Egentlig er det ikke Java, der er blevet dårligere. Det er blot mig, der er blevet klogere.

Jeg har indtil for et års tid siden stort set kun arbejdet med Java (og derhjemme rodet med PHP, Perl og Python), så jeg kendte stort set ikke andet. Men da jeg sidste år blev kastet nærmest hovedkulds ud i Ruby, skete der ting og sager.

Jeg blev fanget af sproget, og jeg er blevet ved med at arbejde med det – nu godt nok ikke i dagtimerne, men om eftermiddagen og aftenen arbejder jeg på et projekt, hvor udviklingen foregår i Ruby. Så jeg har pludselig anvendt et andet sprog end Java ganske intensivt, og det har i den grad åbnet mine øjne overfor, at tingene kan gøres på en anden måde.

Jeg vil ikke agitere for, at det er Rubys skyld som sådan, at jeg er blevet klogere – det er der ikke rigtigt noget belæg for. Det kunne lige så godt have været et andet sprog – det handler også om smag og behag.

Det, der derimod nok kan forklare, at jeg er blevet klogere, er, at jeg er kommet til at arbejde med noget, som ligger ganske langt fra det, jeg kendte i forvejen. Havde det f.eks. været C#, der havde været mit valg, ville jeg nok ikke have fået åbnet mine øjne så meget.

Sådan set handler dette slet ikke om programmeringssprog, softwareudvikling eller noget som helst nørdet (på trods af jeg ellers lagde hårdt ud..) – det handler i virkeligheden om faglig udvikling, og det er i virkeligheden heller ikke særligt banebrydende. I The Pragmatic Programmer (og måske også i Code Complete) nævnes det, at man som softwareudvikler bør lære et nyt programmeringssprog eller en eller anden teknologi om året.

Det er lige præcis det, jeg har gjort – og det har som sagt virket.. Faktisk i overraskende høj grad!

Del med andre:
  • Print
  • email
  • Facebook
  • Twitter
  • Google Bookmarks
  • FriendFeed
Ingen Kommentarer
Tagged , , , , ,
Itsy – Minimalistisk tweeting

Gennem et tweet fra @marks hørte jeg om Itsy, en yderst minimalistisk Twitterklient til Mac OS X.

Der er virkelig skåret ind til benet i Itsy – der er den helt basale funktionalitet, og så er der heller ikke mere!

Når man starter Itsy op første gang, er det, første man bliver præsenteret for, dette:

Itsy lige startet op

Itsy lige startet op

Og når man er logget ind, er det dette:

Itsy - logget ind

Itsy - logget ind

Der er ikke så meget mere at fortælle om Itsy – det er ca. hvad man kan. Der er ingen overflødig gejl, og det er yderst nemt at anvende Itsy netop pga. den manglende overflødige gejl.

Itsy giver mig den funktionalitet, jeg har brug for, og fjerner alt det, jeg ikke har brug for. Det er sikkert ikke tilstrækkeligt for alle, men det er vel også de færreste applikationer, som kan opfylde alles behov.

Nå ja, en enkelt ting mere ved Itsy, som jeg er helt pjattet med, er ikonet – det kan da ikke andet end at gøre en glad :-D

Del med andre:
  • Print
  • email
  • Facebook
  • Twitter
  • Google Bookmarks
  • FriendFeed
Ingen Kommentarer
Tagged , , , , , ,
InspirationsInjektion #2

I går var der InspirationsInjektion #2 i GeekHouse. Brug de par minutter, det tager at læse siden, jeg linker til – InspirationsInjektion er en fantastisk serie af arrangementer; en slags mini-TED konference “på den jyske måde”.

Gårsdagens program oplevede en smule ændringer – Uffe Koch fra Huge Lawn Software og Martin Brynskov, der er tilknyttet Digital Urban Living, var forhindrede i at deltage, så i stedet havde arrangørerne fået fat i Kristian Ottosen, som stiftede Yawah, der blev opkøbt af Adobe.

I stedet for et sjette oplæg, blev det sidste stykke tid brugt på at samle ideer til forbedringer af InjektionsInspiration og input om, hvad der bliver det helt store og nye i 2010, sammen under kyndig vejledning af Bjarne Tveskov (egentlig var hans tanke, at det skulle have været vha. brainwriting, men der var desværre ikke nok kuglepenne).

Det var et virkelig godt arrangement, og som det vel nærmest er kotume, så var der selvfølgelig MiracleØl i pauserne.

Hvis du synes, det lyder som et spændende arrangement, så er det bare med at følge hash-tag’et #inin på Twitter og evt. også Tommy Dejbjerg Pedersen.

Del med andre:
  • Print
  • email
  • Facebook
  • Twitter
  • Google Bookmarks
  • FriendFeed
1 Kommentar
Tagged , , , , ,
MailChimp i Rails

Lige så snart man laver websites, hvor brugere kan registrere sig på den ene eller anden måde, løber man også ind i, at det kunne være rart at kunne kommunikere med dem via mails – enten som enkeltstående mails med vigtige oplysninger eller som deciderede kampagner, hvor man gerne vil kunne følge med i, om kampagnerne virker. Til dette er MailChimp som skræddersyet – man får en masse værktøjer til styring af maillists, kampagner, til statistik osv. Og de tilbyder tilmed, at man gratis kan gemme op til 500 mailadresser og sende op til 3000 mails om måneden!

Hele administrationen af mails, kampagner og lister er pakket pænt ind i et API, der bruger HTTP-protokollen til kommunikationsmedie, og dokumentationsniveauet af API’et er faktisk forbilledligt – alle metoder, parametre og returværdier er rimeligt godt beskrevet. Så hvis man vil, kan man selv skrive hele integrationen selv.

Men der er også en anden mulighed, hvis man arbejder med Rails – gem’en Hominid fungerer som en komplet Ruby wrapper af version 1.2 af MailChimp API’et. Dvs. at der ikke er decideret integration med ActiveRecord, ActionController osv. HTTP-kommunikationen er blot abstraheret væk, og så er Hominid også environment aware, så man nemt kan bruge forskellige MailChimp-konti i de forskellige miljøer.

I config/hominid.yml angiver man bl.a. brugernavn, password og api-nøgle på samme måde som man angiver databaseoplysninger i config/database.yml:

development:
	username: usrnme
	password: pw
	api_key: apikey
	send_goodbye: false
	send_notify: false
	double_opt_in: false

Tilsvarende kan man lave konfiguration til test og production (og alle de andre miljøer, man måtte have defineret).

Jeg vil ikke gå så meget i dybden med API’et – der er et eksempel på Github. Til gengæld vil jeg blot vise et lille eksempel på en praktisk anvendelse af Hominid.

På MailChimp har man mulighed for selv at oprette navngivne felter til forskellige slags data, man ønsker modtagere skal oprettes med; såkaldte merge tags. Følgende er blot et lille eksempel på, hvordan man registrerer en ny modtager vha. et ActiveRecord callback (i dette tilfælde after_save), hvor man samtidig sender data med, som skal knyttes til merge tags. Det er ikke raketvidenskab, og det er i høj grad eksempelkode, da der ikke er nogen former for fejlhåndtering eller validering.

class User < ActiveRecord::Base
  after_save :send_to_mailchimp

protected
  def send_to_mailchimp
    list = Hominid::List.find_by_name("users")
    list.subscribe(self.email, :merge_tags => {"NAME" => self.name, "CNAME" => self.company_name})
  end
end

Det interessante her foregår i linie 7, hvor man kan se, at jeg som andet argument til list.subscribe sender et hash med, hvor den eneste value er et andet hash – i det andet hash skal man blot angive navnene på de ønskede merge tags som keys i hashet. Mere er der sådan set ikke i det.

Mere skal der ikke til for at oprette modtagere i MailChimp – og lige som man kan oprette modtagere, kan man naturligvis opdatere dem og slette dem igen. Foruden alle de andre ting, som API’et også giver mulighed for.

Hvis jeg dog skulle nævne en enkelt ting, jeg godt kunne ønske mig (eller selv lave), så er det at kunne integrere MailChimp helt med ActiveRecord – f.eks. vha. en acts_as_subscriber-metode, hvor man kan angive hvilke af modelobjektets attributer, man ønsker at sende over til MailChimp, og så sørger den ellers for at registrere de nødvendige callbacks.

Del med andre:
  • Print
  • email
  • Facebook
  • Twitter
  • Google Bookmarks
  • FriendFeed
Ingen Kommentarer
Tagged , , , , ,
Træt af Twitter

To gange i løbet af det sidste døgn, har jeg fået mails fra Twitter om, at de har nulstillet mit password, fordi jeg er blevet udsat for et tredjeparts-phishing-forsøg.. Og nu er min konto blevet låst i en time.

Tidspunktet taget i betragtning gør det selvfølgelig ikke så meget, at min konto er låst. Men det er stadig pisseirriterende, at Twitter er så anale, som de åbenbart er – især når de ikke fortæller mig mere om, hvad det drejer sig om, end at det er fra et tredjepartssite.

Fortæl mig noget mere Twitter, eller rend og skid!

Del med andre:
  • Print
  • email
  • Facebook
  • Twitter
  • Google Bookmarks
  • FriendFeed
2 Kommentarer
Tagged , ,
Herlig dag (og aften)!

Der har været knald på i dag – der var ikke meget, der mindede om ferie (hvilket i øvrigt heller ikke gør noget – man bliver noget så sløv og dum af for meget ferie!).

Kode hele dagen indtil aftensmadstid.. Derefter aftensmad, en lille lur og så en løbetur.

En ganske hård løbetur egentlig – det var ret koldt, og den kolde lufts påvirkning kan stadig mærkes på mine lunger. Men det var nu alligevel rart at komme ud og løbe igen efter to – tre ugers pause pga. dovenskab, travlhed og dårligt vejr (ja ja, der findes ikke dårligt vejr..).

Eneste problem lige nu er, at løbeturen – og en lille kop kaffe – har gjort mig temmelig frisk; der er ikke meget antydning af, at klokken faktisk næsten er ved at være midnat.

Men som sagt – en herlig dag og aften, hvor jeg både har været produktiv og gjort noget for mit velbefindende.

Del med andre:
  • Print
  • email
  • Facebook
  • Twitter
  • Google Bookmarks
  • FriendFeed
Ingen Kommentarer
Tagged , , , ,
Oksehalesuppe
Oksehalesuppe

Oksehalesuppe

Så er julen efterhånden overstået – ja ja, det er 2. juledag, men alligevel. Juleaften og julefrokost er vel overstået, så i aften stod den igen på madlavning selv, og da det jo er ferie, og jeg er hjemme, besluttede jeg mig for, at det skulle være en af mine vintertraditioner, jeg ville give mig i kast med. Nemlig hjemmelavet suppe.

Normalt koger jeg suppe på oksebryst eller sådan noget lignende. Men denne gang skulle det være lidt finere, og valget faldt på oksehalesuppe. Fremgangsmåden er den samme som med andet suppe, og slutresultatet ligner andet suppe – smagen er bare lige lidt finere, synes jeg.

Der er ikke så meget opskrift, når det kommer til suppe.

Det handler bare om, at man bruner oksehalerne godt af i noget olie, inden der hældes vand over og tilsættes grøntsager, rodfrugter og et godt bundt af diverse krydderurter – pak evt. krydderurterne i en gazepose. Derefter er det blot at lade det stå og simre i mindst 3-4 timer (og gerne dobbelt så længe). Den første time eller to, skal man dog være lidt over suppen og sørge for at skumme den jævnligt. Jo bedre man skummer den, des klarere bliver den.

Når suppen har stået tilstrækkeligt tid, fiskes kød, grøntsager og krydderurter op. Hvis der ligger meget fedt, kan man sagtens skumme noget af den fra. Smag derefter på suppen for at afgøre, om den skal koges ind.

Når suppen er tilpas kraftig, pilles kødet af knoglerne og rodfrugter snittes i passende størrelse. Læg kødet tilbage i suppen sammen med rodfrugterne i rækkefølge efter deres kogetid – jeg har valgt selleri og pastinak, som skal have ca. lige lang tid. Slut af med porrer, som blot skal have 3 minutters tid. Smag suppen til med salt.

Server den med noget godt brød til.

Del med andre:
  • Print
  • email
  • Facebook
  • Twitter
  • Google Bookmarks
  • FriendFeed
Ingen Kommentarer
Tagged , , , , , , ,
Botanisk Have Klædt i Hvidt

Klaus, en af mine venner, og jeg var et smut i Botanisk Have i går – vejret var jo perfekt til at opholde sig udenfor. Det var klart, vindstille og koldt. Herlig dansk vintervejr – og særdeles velegnet til en fototur!

Sne og høj solskin (samt lavtstående sol) er dog alligevel ret udfordrende omstændigheder, som giver god lejlighed til at øve sig i at tage billeder i omgivelser med høj kontrast, hvor der er risiko for lens flares osv.

Efter et par timer i relativt koldt vejr (dog modvirket af lange underbukser, uldsokker og uldtrøje), hvor vi var i konstant fare for at blive pløjet ned af fartgale unger på deres kælke, drog vi hjemad – og det viste sig, at jeg da heldigvis havde fået et par fornuftige skud i kassen.

Alt i alt var det en glimrende tur, men jeg var godt nok også træt, da jeg kom hjem!

Del med andre:
  • Print
  • email
  • Facebook
  • Twitter
  • Google Bookmarks
  • FriendFeed
2 Kommentarer
Tagged , , ,
Tak til COP15, goddag til COP1500

COP15 blev til, hvad alle havde regnet med – varm luft om ingenting.. Det eneste, der er kommet ud af det, er blot mere CO2..

Men hvad kan man forvente, når der er politikere indblandet.. Selv Obama har vist sig at være en vatdiller.

Drop klimakonferencerne – at opnå aftaler, som er juridisk bindende, er utopi. Det er spild af tid, spild af penge og til temmelig stor gene for befolkningen på de steder, hvor sådanne konferencer bliver afholdt. Om vi så fortsætter til det bliver til COP1500, så vil der ikke komme nogen international aftale.

Løsningen er i virkeligheden meget mere enkel – hvis du mener, det er vigtigt, at der bliver gjort noget for at begrænse udledningen af CO2, så få fingeren ud af måsen og brug den absolut største magt, der findes – din pengepung.

Brug dine penge på lokalt producerede varer, på varer produceret af firmaer, som gør noget aktivt for at begrænse deres miljømæssige fodaftryk mest muligt osv. Hvis folk generelt gør dette, vil det betyde, at der sker noget – ikke blot vil firmaer begynde at jagte miljøvenlige produktionsmetoder samt drive udviklingen i retningen af mere ressourcebesparende produkter, og de vil ikke mindst også lægge pres på deres forsyningskæde.

Det kommer til at blive dyrere at købe “klimavenligt” – men hvis du tror på, at det gør en forskel, er det så ikke en ringe pris at betale?

Ansvaret ligger ikke på politikerne – ansvaret er dit. Ønsker du handling, så start med dig selv.

Del med andre:
  • Print
  • email
  • Facebook
  • Twitter
  • Google Bookmarks
  • FriendFeed
Ingen Kommentarer
Tagged , ,