Søg på DotNyt:
Denne blog er flyttet til www.nielsbrinch.com


onsdag den 19. november 2008

Eksperiment i at blive fundet

skrevet af Niels Brinch

Jeg har lige set Heckler, som er en dokumentar der på et meget personligt plan handler om komikere som fortæller om hvor hårdt det rammer dem, når de er udsat for en såkaldt heckler. Nok om det.

På et tidspunkt i filmen forklarer en kritiker en af komikerne, at hans "communion wafer joke" er meget uoriginal, fordi man kan finde den på internettet. Filmen opfordrer så seeren til at prøve at søge efter den på nettet. Som filmen også lover, finder man næsten ingenting.

Jeg forestiller mig, at andre som mig lige prøver at lave en søgning. Mit lille eksperiment er nu, at skrive communion wafer joke her i bloggen og så vente spændt ved Google Analytics, indtil jeg bliver fundet.

Jeg ved ikke om resultatet bliver interessant. Sikkert ikke. Men Google Analytics fortæller mig resultatet og så opdaterer jeg dette indlæg med hvornår indlægget bliver fundet og hvor mange der finder det.

Edit 21-11-2008: Man kan allerede nu finde mit indlæg ved at søge på "communion wafer joke" på Google. Mit indlæg kommer over det andet hit som var der før. Der er endnu ingen der faktisk har fundet indlægget via det søgeord.

Edit 25-11-2008: To har fundet indlægget ud fra søgeordet "communion wafer joke" - men det er formentlig to som har læst dette indlæg og forsøgt at søge. Der er nok ikke nok som har set Heckler, eller også er der ikke nok som synes det kunne være sjovt at søge efter det. Så det endte med at blive lidt uinteressant.

Hvis jeg fornemmer et eller andet bliver er ved at blive hyped, vil jeg prøve at købe et relateret .com-domæne og gentage eksperimentet og se hvordan trafikken udvikler sig.

Det kunne f.eks. være en ny skuespiller, en sportstjerne eller et eller andet begreb.

1 kommentarer

søndag den 16. november 2008

Universel ToString med Extension Methods

skrevet af Niels Brinch

Efter at have læst Christian's indlæg som blandt andet handlede om "Pure evil ToString", blev jeg inspireret til at afsløre min egen variant. Start med at læse om "Pure Evil ToString", bare lige lidt, og vend så tilbage til dette indlæg.

...

Ok? Godt.

...

Overordnet handler det om, at man gerne vil kunne skrive en streng ud for et vilkårligt objekt - og det skal være let.

Formålet for "Pure Evil ToString" er tilsyneladende både logging og til at danne strenge til brugergrænsefladen. Problemet med den er til gengæld, at den kan give problemer i runtime, fordi man skal skrive navne på properties i ren tekst som senere kan ændre sig uden compileren opdager sammenhængen.

Formålet med min variant, er udelukkende logging. Den bruger Reflection til at skrive alle oplysninger ud om et objekt og det kan man så logge. Da man ikke angiver præcis hvilke oplysninger man er interesseret i, kan der heller ikke opstå problemer i runtime.

Nok snak. Lad os se på metoden.

public static string GetAsString(object o)

{

    if (o == null)

    {

        return "null";

    }

    else if (o is string)

    {

        return o.ToString();

    }

    else

    {

        Type t = o.GetType();

        System.Reflection.BindingFlags flags = System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.FlattenHierarchy;

 

        string output = "ClassName: " + t.Name + Environment.NewLine;

 

        foreach (System.Reflection.FieldInfo info in t.GetFields(flags))

        {

            output += info.Name;

 

            if (info.GetValue(o) != null)

            {

                output += ": " + info.GetValue(o) + Environment.NewLine;

            }

            else

            {

                output += Environment.NewLine;

            }

        }

 

        return output;

    }

}

Eller som Extension Method
Udskift metodens signatur med følgende, for at anvende den som Extension Method.

public static string GetAsString(this object o)

Effekten er, at samtlige objekter i din applikation, har en GetAsString()-metode. Ret bekvemt, synes jeg.

Anvendelse
Den er praktisk at anvende i forbindelse med logging. Jeg kan ikke komme på andre rigtig gode anvendelsesmuligheder. Man kunne måske anvende den til at vurdere om to forskellige objekter indeholder præcis de samme værdier?

Idet der anvendes Reflection, er performance ikke særligt god. Derfor er det vigtigt at man kun anvender metoden til logging OG, at man har indrettet sin logging på en måde, så logging-kald kun bliver kaldt når logging er slået til.

Jeg bruger log4net, så min logging ser ud som nedenstående, men jeg er sikker på du forstår pointen med det, selvom du anvender en anden form for logging.

if (isDebugEnabled)

{

    log.Debug("User: " + user.GetAsString());

}


Den dyre "GetAsString-metode bliver således kun kaldt når logging er slået til.

2 kommentarer


 
Til forsiden

Niels Brinch

- Seneste indlæg