Linguistic forms

Load testing via predefined number of threads

March 22, 2009 · Leave a Comment

Wrote a short class for use with a load test. Probably it could be useful to someone else:-)

The class basically initiates e.g. 100 threads, and through a predefined delegate some method can be called more or less simultaneously from all of the threads.

Please remember that the .NET runtime allocates 1 MB ram to each thread. Hence you will get an OutOfMemory Exception if you attempt to initialize more threads than the memory available on your client can handle (1.000 threads ~ 1GB memory).

How to use the LoadTest


    class Program
    {
        static void DoWork()
        {
            Console.WriteLine("test");
        }
        static void Main(string[] args)
        {
           LoadTest load = newLoadTest(100, DoWork);
            load.Start();
        }
    }

LoadTest Code


using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;

namespace LoadTest
{
    public delegate void TestMethod();
    public class LoadTest
    {
        static TestMethod m_TestMethod;

        static List m_ThreadWaitEvents = new List();
        Int32 m_NumberOfThreads = 0;

        static void baseTestMethod()
        {
            //Reference m_ThreadWaitEvents
            AutoResetEvent threadWaitEvent = new AutoResetEvent(false);
            m_ThreadWaitEvents.Add(threadWaitEvent);
            threadWaitEvent.WaitOne();

            //Invoke the test method
            m_TestMethod.Invoke();
        }

        public void Start()
        {
            foreach (AutoResetEvent e in m_ThreadWaitEvents)
            {
                e.Set();
            }
        }

        public LoadTest(Int32 numberOfThreads, TestMethod testMethod)
        {
            m_TestMethod = testMethod;
            m_NumberOfThreads = numberOfThreads;

            //Initialize threads
            for (Int32 t = 0; t < m_NumberOfThreads; t++)
            {
                Console.WriteLine("Waiting. Thread " + t + " initiated.");
                Thread thread = new Thread(baseTestMethod);
                thread.Start();
            }
            //Wait until all threads are initialized and references threadWaitEvent
            while (m_ThreadWaitEvents.Count < m_NumberOfThreads)
            {
                Console.WriteLine("Initializing. " + m_ThreadWaitEvents.Count.ToString() + " of " + m_NumberOfThreads.ToString() + " threads started.");
                Thread.Sleep(100);
            }
        }
    }
}

→ Leave a CommentCategories: Development
Tagged: , , ,

Shortcircuiting operators in .NET

March 7, 2009 · Leave a Comment

If you’re into nerdy algorithmic discussions this one about the implementation of the && operator in .NET is quite interessting – it makes it more clear why there is both shortcircuiting and non-shortcircuiting operators for ‘and’ and ‘or’ (&&, &, ||, and |).

Check it out:

http://bytes.com/groups/net-c/230257-shortcircuiting-operators-c

→ Leave a CommentCategories: Uncategorized

Hide mail addresses from spam bots automatically

January 23, 2009 · Leave a Comment

As an attempt to get rid of all the ridiculous spam I receive, I wrote some code a while ago which automatically hides email adresses on a web site by replacing them with JavaScript.

How the email hider hides the email address

The “email address hider” is written in c# and is very simple to implement with a basic knowledge of ASP.NET. The code works like this: It goes through all text and looks for email addresses. Whenever it finds an email address, it replaces the email address with JacaScript before the site is sent to the end user (who could be a spam bot). Hence, the browser will not receive the ‘raw’ email address, but will receive some JavaScript which makes the email address more difficult to obtain automatically.

How to use the email hider

1. Download the binaries from  http://www.m-8.dk/downloads/m8.text.zip

2. Create a reference to m8.text.dll which is placed in the downloaded zip file

3. Implement a call to m8.text.ReplaceEmailWithJavascript in your code, e.g.:

String html = @"My mail address id <a href=""mailto:minmail@retkomma.dk"">mymail@retkomma.dk</a>";
Response.Write(ReplaceEmailWithJavaScript.ReplaceAll(html));

Normally email adresses on a website would look like this to spam robots:

<a href="mailto:mail@domain.com">mail@domain.com</a>

But after parsing a page with the email hider utility, the above email code will be replaced by:

This email address is hidden: 

    <script type="text/javascript" language="javascript">

        var a_t = '@';var fn = 'mail'; var ln = 'domain.dk';var lto = 'lto';

        var m_to = ' mai' + lto + ':';

        document.write('<a href="' + m_to + 'mail' + a_t + 'domain.dk' + '">' + fn + a_t + ln + '</a>');

    </script>

    <noscript>

        <p>The email address is hidden. Please activate JacaScript to view the mail address.</p>

    </noscript>

The email address could be hidden even better, but this level of “cryptation” have been sufficient to avoid spam wherever I’ve used it.

For the users visiting the web site the mail address will look the same:

mail@domain.dk

About the email hider

The code is written in c# and is contained in one assembly, m8.text.dll. This assembly contains a precompiled regex, which can recognize mail addresses + a business logic that takes care of replacing the recognized mail addresses with javascript. The business logic is coded with the .NET frameworks MatchEvaluator delegate, which is called everytime a mail address is matched. This is the method that actually replaced the found mail address with med javascript.

A couple of issues

* If the user has not activated JacaScript in her browser, she will not see the mail addresses

* Email addresses which the spam bots have allready captured will not become freem of spam from day 1 (or day 2, or day 3, or…)

* The dll is not com visible, so it’s .NET or nothing:-)

* Drop me a comment if you encounter problems or have a change request.

→ Leave a CommentCategories: HTML · natural language processing · regular expressions · regulære udtryk

KorpusDK og dansk sprogteknologi

December 28, 2008 · Leave a Comment

Et initiativ, jeg har vanvittig lyst til at rose og viderebringe: http://www.ordnet.dk/korpusdk/. Tidligere var korpusset opdelt i Korpus2000 og Korpus90, men altså nu samlet med en noget lækrere søgeflade, som bl.a. understøtter – hey – regulære udtryk:-D Eller i hvert fald simple regex-konstruktioner, men bedre end ingenting.

Jeg skal være ærlig og indrømme, at jeg ikke altid har været lige imponeret over niveauet i dansk sprogteknologi, som i vidt omfang bærer præg af alt for få resurser, for lidt teknisk pondus osv. – de, der lever for det, gør det helt sikkert godt, men tyngden gør, at det stadig kun er en garage(ba)rocksk undergrundsgeschäft – (pistolen er ikke kun rettet mod ‘de andre’ – det gælder desværre for så vidt også mine egne fritidsprojekter).

Men lad os få de gode projekter frem i lyset – og KorpusDK er et af dem!

→ Leave a CommentCategories: Uncategorized

System.Nullable og Int32?

August 21, 2008 · Leave a Comment

Faldt over dette i dag. Det har åbenbart altid eksisteret i C#, så det er åbenlyst mig, der er langsom i optrækket.

Man kan sætte en value type (eller en struct) til null ved at sætte et ? efter typen, fx:

Int32? i = null; 

Dette er syntactic sugar for:

System.Nullable i = null;

Egentlig er det et super-simpelt trick. Hvis vi ser på noget IL for System.Nullable ser constructoren sådan ud (uden at jeg skal påstå at være IL-ekspert):

.method public hidebysig specialname rtspecialname
instance void .ctor(!T 'value') cil managed
{
// Code size 15 (0xf)
.maxstack 8
IL_0000: ldarg.0
IL_0001: ldarg.1
IL_0002: stfld !0 valuetype System.Nullable`1::'value'
IL_0007: ldarg.0
IL_0008: ldc.i4.1
IL_0009: stfld bool valuetype System.Nullable`1::hasValue
IL_000e: ret
} // end of method Nullable`1::.ctor

Dvs. System.Nullable<T> er blot en klasse, der enkapsulerer en struct i det interne private felt ‘value’. Selve klassen er en reference type og kan derfor sættes til null. Det er således ikke value typen, fx Int32, der sættes til null, men det enkapsulerende objekt af typen System.Nullable<T>, der jo per definitioni kan være null. Enkelt, men smart. Den er skrevet bag øret:-)

→ Leave a CommentCategories: Uncategorized

Twine – er det overhovedet semantic web ?

August 19, 2008 · Leave a Comment

Har netop modtaget mit beta-logon til Twine.

Det er formodentlig vanskeligt at lave semantic web uden at bruge RDF, men det er helt enkelt at anvende RDF uden at det har noget med semantic web at gøre at all. Det ser i hvert fald ud til at lykkedes for Twine at udvikle en RDF-baseret løsning, som ikke har det mindste med semantic web at gøre.

Under semantic web-tab’en giver de dette eksempel (som led i en længere beskrivelse – http://www.twine.com/tour/semantic):

<rdf:RDF    xmlns:basic="http://www.radarnetworks.com/2007/09/12/basic#"    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"    xmlns:s="http://www.w3.org/2000/01/rdf-schema#">    <rdf:Description about="http://www.twine.com/item/1sj51123-2g5">           <s:label>Jurassic Park</s:label>           <basic:author>Michael Crichton</basic:author>           <basic:manufacturer>Arrow Books Ltd</basic:manufacturer>           <basic:tag>Science Fiction</basic:tag>           <rdf:type rdf:resource="http://www.radarnetworks.com/2007/09/12/basic#Book"/>           <radar:wasCreatedBy rdf:resource="http://www.twine.com/user/lew"/>           <app:hasComment rdf:resource="http://www.twine.com/item/1slbszfg-2x9"/>           </rdf:Description>    <rdf:Description about="http://www.twine.com/item/1slbszfg-2x9">           <rdf:type rdf:resource="http://www.radarnetworks.com/shazam#Comment"/>           <basic:description>One of my favorites</basic:description>           <radar:wasCreatedBy rdf:resource="http://www.twine.com/user/lew"/>     </rdf:Description> </rdf:RDF>

Men hele finden med semantic web er jo for fa’en at repræsentere entiteter som en række url’er. Dette er blot et eksempel på én bruger, der har uploadet sin yndlingsbog ‘Jurassic Park’ – og bogen er defineret via labels. Næste gang en bruger uploader samme bog, vil ovenstående mere eller mindre blive gentaget i stedet for at linke unikt til bogen. Twine aner med andre ord ikke en rygende fis om bogen Jurassic Park – den har intet semantisk indhold, ja – den kan ikke engang identificeres – Twine aner ikke, at den eksisterer. Det eneste, Twine ved er, at hjemmesiden er en more or less vilkårlig bog + hvilken bruger, der har oprettet bogen. Hvis dette skulle være semantic webish, så skulle alle brugere referere til samme ‘Jurassic Park’ med en unik url, til en unik forfatter, til et unikt forlag – come one, bare et eller andet unikt identificerbart. Så skulle Twine samle viden om den unikke bog ‘Jurassic Park’ og om brugere, der kan lide ‘Jurassic Park’.

I mine øren lyder RDF som en virkelig potentiel standard, men der skal være en grund til ikke blot at anevnde SQL. Ellers er RDF blot en dum udviklignsomkostning – og lur mig om ikke RDF-formatet alligevel er gemt i en SQL-database;-) Ovenstående kunne umiddelbart lige så godt ligge i ethvert andet dataformat end RDF.

Dog – fordelen ved ovenstående er, at Twine har opmærket data. Det er ikke meget bedre, end hvis det var ordentligt skrevet HTML, but still.. Det vil jeg umiddelbart kreditere dem for.

Nåh, lad os give Twine a benefit of a doubt. Måske er ovenstående bare en teaser – måske har de noget sindssygt semantisk i ærmet. Indtil da holder jeg mig til Facebook;-)

→ Leave a CommentCategories: semantic web · semantik

Åbne .NET sprogresurser

July 25, 2008 · Leave a Comment

www.m-8.dk har jeg frigivet en række .NET sprogresurser, som jeg har arbejdet med det sidste stykke tid.

Formålet har været at udvikle nogle kodestumper, som nogle af de få udviklere, der arbejder med tekst, har mulighed for at anvende i deres arbejde.

Det drejer sig fx som en HtmlTextDocument-klasse, der automatisk kan hente hjemmesider og udtrække ord, sætninger m.v. på baggrund af tags – fx samles alle ord, der forekommer i overskrifter, i alt-attributter, i p-tags m.v.

Mulighed for automatisk at skjule alle forekomster af mailadresser på en hjemmeside for spam-robotter.

Blandt resurserne er der også en række regulære udtryk til at udtrykke ord og sætninger af tekst, genkende mailadresser og andet.

Jeg har desuden udviklet en binær database, som er specialdesignet til at indeksere tekstdata.

En del af resurserne er udviklet på preview-plan, men måske det kan anvendes. Resurserne er skrevet i C# og kan downloades som .NET dll-filer.

→ Leave a CommentCategories: grammatik · natural language processing · regulære udtryk
Tagged:

XSD-referencer

July 25, 2008 · Leave a Comment

Sidder og arbejder med xml schema og faldt i den forbindelse over en fyr, der har lavet en masse goodies med fine, objektive analyser og udviklingsforslag. Kig forbi ham ved lejlighed på:

http://www.xfront.com/BestPracticesHomepage.html

→ Leave a CommentCategories: Uncategorized
Tagged: ,

Semantic Web-resurser

March 2, 2008 · 1 Comment

Der begynder så småt at springe anvendelige, lettere tilgængelige beskrivelser frem af de mest populære semantic web-teknologier, såsom RDF(S) og OWL. Tjek nogle af dem her:

Generelt forudsættes viden om (X)HTML, XML og namespaces.

Altova er desuden begyndt at udvikle ‘WYSIWYG’-software til konstruktion af RDF/OWL. Jeg har tjekket demoudgaven ud, og det virker desværre ikke så prangende, men mon ikke at det bliver det på et tidspunkt. Tjek det evt. selv på http://www.altova.com/SemanticWorks/.

→ 1 CommentCategories: owl · rdf · semantic web · semantik

Semantic web – begrebsforvirring?

January 12, 2008 · Leave a Comment

Til at begynde med skulle man nok have valgt et andet udtryk end semantic web. Det mener i hvert fald Tim Berners-Lee, der som bekendt er formand for W3C og normalt tilskrives opfindelsen af internettet.

Tim Berners-Lee har tidligere foreslået betegnelsen The Data Web i stedet, og det er på sin vis også mere dækkende. Jeg tror, at problemstillingen er, at semantik betyder noget lidt forskelligt afhængigt af, hvilke faggrupper man spørger – og derfor anvendes semantik også ofte i forskellige betydninger afhængigt af om man taler semantisk søgning, semantic web eller noget helt tredje.

Semantic web – “the data web”

For en udvikler har semantik noget at gøre med betydningen af et stykke kode. Koden skal overholde nogle regler/syntaks for at den overhovedet kan forstås – semantikken er så hvad koden udtrykker mere betydningsmæssigt. Fx gør følgende kodelinjer det samme i sprog fra C-familien.

  1. x += 5;
  2. x = x + 5;

Syntaksen er dog forskellig. Derimod er semantikken den samme, nemlig: tag en variabel, x, og læg 5 oveni.

Med semantic web tænkes der specifikt på denne type semantik, snarere på den semantik, der udtrykkes i fx xml-dokumenter. Lad os antage, at vi skal lave en ordbog. Den kunne vi i en simpel udgave fx strukturere sådan:

<ord>    <opslag>spise</opslag>  <ordklasse>verbum</ordklasse></ord>

Men vi kunne også gøre sådan:

<word>  <lexeme>spise</lexeme> 

  <class>V</class> 

</word>

Og sådan kunne man blive ved. Men hvis vi nu en gang for alle kunne vedtage altid at gøre det på den ene måde og lægge en beskrivelse på nettet et sted, så alle kan se hvordan man skriver en ordbog, så ville man pludselig have ensrettet alle ordbogsdata i hele verden. Det ville være et eksempel på at udnytte mulighederne i the data web.

Man kunne også udtrykke mere komplekse relationer mellem data. For personen x kunne man fx udtrykke, hvilke hjemmesider x redigerer, hvor man kan finde et billede af x, privatadresse, telefonnummer osv. – Essensen er: Hvis vi kan blive enige om en datastruktur og gøre den offentlig kendt, så kan alle data på nettet pludselig begynde at spille sammen. Det er the data web.

Hvorfor så termen semantic web? Mit bud er, at det hænger sammen med den programmør-tradition, der kort er beskrevet ovenfor. Når jeg skriver, at vi skal være enige om en datastruktur, så skal vi egentlig blive enige om, hvordan semantik udtrykkes syntaktisk i forskellige strukturer. Det er således ikke længere nok, at et xml-dokument overholder almindelig xml-syntaks, hvis det skal være en del af the data web. For at dokumentet kan læses “semantisk” af andre personer eller softwarekomponenter, så kræver det at en specifik syntaks er overholdt, hvor det er vedtaget, hvordan syntaks og semantik hænger sammen. Ved at overholde denne syntaks kan det derfor lade sig gøre for eksternt software at afkode “meningen” med den givne data. Det er sq en cool tanke!

Semantisk søgning

Men det har ikke nødvendigvis meget at gøre med semantisk søgning. Her bruges ordet semantik nemlig en anelse anderledes. Semantisk søgning handler normalt om at få en søgemaskine til at forstå betydning i natursprog. Et eksempel er PowerSet Labs, hvis søgemaskine afkoder WikiPedia for sætninger som “Eiffel-tårnet blev bygget i 1889″. Når så en bruger spørger: Hvornår blev Eiffel-tårnet bygget? – Så skulle PowerSet Labs gerne kunne svare: 1889.

Man kan hævde, at det i bund og grund er et samme, der sker: Noget software (en søgemaskine) forsøger via en syntaks at afkode semantikken i noget tekst. Problemet er bare, at der ikke er givet nogen fælles syntaks og semantik for naturlige sprog som engelsk og dansk. Derfor er semantikken ikke umiddelbart mulig at afkode, og der eksisterer ligeledes ikke den samme konsensus, som det er tilfældet i the data web, hvor ambitionen er, at syntaks og semantik altid skal være eksplicit for omverdenen. I semantisk søgning er begrebet semantik såleldes en væsentligt mere ubestemmelig og ustandardiseret størrelse.

I øjeblikket synes de semantiske søgemaskiner ikke at have mærkbare fordele frem for en traditionel søgemaskine som Google. Semantic web er heller ikke ligefrem slået igennem – formodentlig fordi teknologien er så relativt kompleks, at den ikke kan erhverves på en eftermiddag af hvem som helst i modsætning til html. Visionen om the data web kommer sikkert til at stå og falde med, om it-amatører såvel som -professionelle tager teknologien til sig. Og det vil nok igen kræve, at der blive udviklet nogle hjælperedskaber eller lignende, som gør det mere effektivt og overskueligt at arbejde med “semantik”.

- Men ville være pænt sejt, hvis det lykkedes!

→ Leave a CommentCategories: Uncategorized