Content tagging met en zonder taxonomie

Content logica voor het bepalen van een relatie of filteren kan op een eenvoudige manier en een uitgebreide manier. In de basis wordt voor beide gevallen de content verrijkt met tags. Aan een artikel kunnen meerdere termen of tags worden toegewezen.

Eenvoudig
De eenvoudige manier van omgang met tags is een vergelijking of de tag voorkomt in een artikel. Om bijvoorbeeld een lijst van nieuws voor Rotterdam te tonen worden alle artikelen getoond die te tag “Rotterdam” bevatten. We spreken hier over filteren van content. Om te bepalen welke artikelen een relatie hebben met elkaar wordt er gekeken of een bepaalde tag van een artikel voorkomt in een ander artikel.

Uitgebreid
De uitgebreide manier van omgang met tags is het gebruik van een taxonomy. Een taxonomy is een classificatie van termen. Zo is “Amsterdam” een tag en “Noord-Holland” een tag. Het is in een taxonomy zo dat de tag “Amsterdam” een kind relatie heeft t.o.v. “Noord-Holland”. Zo kan “Nederland” een ouder relatie hebben met “Noord-Holland”. Met deze structuur kan er op een slimmere manier gefilterd en gerelateerd worden op content. Zo kan een artikel met de tag “Alkmaar” een relatie hebben met een ander artikel dat de tag “Amsterdam” heeft. Deze relatie wordt dan over “Noord-Holland” gelegd. Zo kan een artikel met de tag “Rotterdam” voorkomen in een gefilterde lijst voor “Zuid-Holland”.
Hoe hoog of laag er gerelateerd of gefilterd wordt is een factor die samenhangt met de aanwezige content. Bij veel content wordt er nauwelijks naar boven of naar beneden genavigeerd.

Pdf doorzoeken met Lucene.Net en iTextSharp

Lucene.Net is een open source search engine voor het Microsoft.Net platform. Origineel komt Lucene.Net uit de java wereld. De versie voor het Microsoft.Net framework is een conversie van java. Het raamwerk behoort tot de ASF (Apache Software Foundation). Op dit moment worden zowel Microsoft.NET 1.1 als 2.0 ondersteund.

Lucene.Net is geen standalone applicatie. Het biedt de basis functionaliteit om tekst gebaseerde bestanden te indexeren en later te doorzoeken. Functionaliteit om bijvoorbeeld PDF bestanden te indexeren zal dus zelf gemaakt moeten worden. In deze post probeer ik d.m.v. UML een voorbeeld te geven van een mogelijke Lucene.Net implementatie. Gelukkig zijn er aardig wat componenten op de markt om PDF bestanden te parsen naar platte tekst. In dit voorbeeld gebruik ik iTextSharp. Dit component is een conversie van de java variant genaamd iText. Naast de mogelijkheid om PDF te genereren is het ook mogelijk om PDF te lezen. Hiervoor moet nog wel een eigen parser ontwikkeld worden.

Onderstaand figuur is het klasse diagram van het maken van een index. Dit diagram maakt gebruik van twee design patterns. Namelijk het ‘service pattern’ en het bekendere ‘strategy pattern’.

Het idee van de service pattern is dat er een control object bestaat dat alle afhandeling doet met onderliggende structuur. In dit diagram is de klasse genaamd SearchService het control object. Deze klasse haalt de paden voor het indexeren en het pad naar alle bron documenten op uit de ConfigurationManager. Daarnaast maakt het gebruik van de Indexer klasse. De SearchService klasse wordt aangeroepen op de search methode. Deze methode geeft een instantie van de IndexResult klasse terug. Via deze instantie is onder andere de totale indexeringstijd af te lezen.

De Indexer klasse is onderdeel van een ‘strategy pattern’. Voor elke extensie kan een strategie toegevoegd worden. In dit voorbeeld worden de txt (TxtStrategy), pdf (PdfStrategy) en docx (DocxStrategy) extensies gebruikt. Elke extensie krijgt dus zijn eigen klasse. Het resultaat van elke strategie is een Document object dat bij het Lucene.Net raamwerk hoort.

Een Document bevat Field instanties waar eigenschappen aan gekoppeld kunnen worden. Zo kan een Document twee Field instanties bevatten die elk de inhoud en bestandsnaam vasthouden. Voor elk Field is weer te bepalen of deze in de index opgeslagen moet worden. Daarnaast kan er een Analyzer de losse woorden indexeren in een Field. Dit kan ook genegeerd worden zodat er alleen op de hele inhoud van het Field gezocht kan worden. Er wordt dan geen Analyzer gebruikt.

De TxtStrategy maakt gebruik van een StringReader die meteen gevoed kan worden aan een Field in Lucene.Net. Voor de PdfReader is dit anders. Deze strategie maakt gebruik van iTextSharp om PDF te converteren naar tekst. Hierna kan er een Field gevoed worden voor Lucene.Net.

Umbraco level 2 certificering

Afgelopen week reisde ik af naar Gent in Belgie voor mijn certificering voor Umbraco.

Voor wie het product niet kent. Umbraco is een open source content management systeem waarmee online systemen (veelal websites) mee worden geproduceerd. Umbraco is vriendelijk voor de developer omdat er met eenvoudige middelen snel resultaat behaald kan worden. Dit allemaal met de laatste versies als .NET 4 en een Razor viewengine (4.6 JUNO).

De certificering was in een mooi pand genaamd One Office. Hier werdt in twee dagen de level 2 training gegeven door Tim Geyssens en Richard Soeteman. Helaas was de inhoud van de cursus voor mij niet veel nieuws. Wel heb ik toch nog veel kunnen leren door wat directere vragen te stellen.

De certificering is overigens binnen en ik kan mezelf met trots “Umbraco Certified Developer” noemen.

Reactive Extensions voor Microsoft.NET

Mijn aandacht werd laatst getrokken door een nieuwe .NET library genaamd Rx. Reactive Extensions (Rx) is een .NET library voor het coördineren van asynchrone en event gebaseerde programma’s.

De kern van de library zijn twee nieuwe interfaces IObservable and IObserver die ook in .NET 4 geïntroduceerd gaan worden. Met deze library is het mogelijk om LINQ queries te schrijven over events. LINQ kan nu gebruikt worden voor pull gebaseerde collecties zoals IEnumerable en IEnumerator. Met de komst van RX is het mogelijk om gebruik te maken van push verzamelingen (observeerbare verzamelingen). Met andere woorden programmeren op reacties.

De library is inmiddels al uit en te downloaden. Er is ook een framework voor silverlight beschikbaar.

Nederlandse Hartstichting – Nieuwe website

De Nederlandse Hartstichting heeft de opdracht gegeven voor een nieuwe website. In dit project vulde ik de rol in als Software Engineer.

De website maakt gebruik van het bekende CMS Morello van Media Surface. Normaal gesproken wordt dit systeem meer ingezet op het Java platform. Aangezien er nu een versie beschikbaar is voor .NET stonden we als team voor een geheel nieuwe uitdaging. Tijdens het project is er veel gebruik gemaakt van open source .NET componenten zoals log4net, Mass Transit, Topshelf en Castle Project Windsor/MicroKernel. De toepassing van deze raamwerken hebben veel tijd bespaard in de opzet van de applicatie. De webapplicatie zelf maakt gebruik van het Microsoft MVC (Model View Controller) raamwerk.

Mass Transit is gebruikt om de gehele architectuur volgens SOA (Service Oriented Architecture) op te zetten. Alle services om de web applicatie heen communiceren zo via een message bus met de website. Enkele voorbeelden hiervan zijn het inschrijven op de nieuwsbrief en het versturen van e-mail.

Jumbo Supermarkten – Nieuwe website

Jumbo Supermarkten is de snelst groeiende supermarkt van de afgelopen jaren als je het mij vraagt. Voor Jumbo Supermarkten is een geheel nieuwe website ontwikkeld op het CMS genaamd EPI Server.

In dit project heb ik de rol als software engineer vervuld. Een van de hoofd functionaliteiten waar ik aan heb bijgedragen is de export module van de winkel gegevens naar een XML import module. Verder heb ik het grootste gedeelte van de recepten module opgezet.

DAF – Maut calculator

Op 1 januari 2009 zijn de nieuwe Maut-tarieven in Duitsland ingegaan. Om dit bedrag visueel weer te geven is voor DAF een zogeheten Maut calculator ontwikkeld. De Maut calculator is het eerste project voor mij dat vervaardigd is met behulp van Adobe AIR.

Op 1 januari 2009 zijn de nieuwe Maut-tarieven in Duitsland ingegaan. Dit betekent dat voor een truck met emissienorm Euro 1 tot en met Euro 4 aanzienlijk meer betaalt moet worden dan met Euro 5 of EEV. Afhankelijk van de Euronorm van de truck en de kilometers die jaarlijks in Duitsland gereden worden, kan de keuze voor Euro 5 al duizenden euro’s besparen.

Om dit bedrag visueel weer te geven is voor DAF een zogeheten Maut calculator ontwikkeld. De Maut calculator is het eerste project voor mij dat vervaardigd is met behulp van Adobe AIR. Verder zijn er technieken en tools gebruikt als PureMVC en Flex Builder.

Het project bestond uit twee delen. Het eerste deel was een Flash applicatie voor de website van DAF. Het tweede deel bestond uit een AIR applicatie uitgevoerd in 17 talen.

Tijd voor wat onderwijs

Afgelopen week heb ik mijn tijd erg nuttig besteed al zeg ik het zelf. Deze week stond namelijk de UML cursus bij vijfhart in Nieuwegein op de planning. De cursus genaamd: ‘Object georiënteerde analyse en design met UML 2.0’ bestond uit vier volle dagen met daarin zeer interessante onderwerpen. Het doel van deze cursus is het kunnen ontwerpen van flexibele, goed onderhoudbare object georiënteerde systemen m.b.v. een stapsgewijze aanpak gebruikmakend van de UML 2.0 standaard.
De eerste dag van de cursus zijn diverse soorten UML diagrammen behandeld. Ik was al aardig bekend met UML, dus dit was een helder en duidelijk opfris moment. Hoe zat het ook al weer met afhankelijkheden van objecten, en wat was het verschil tussen een aggregatie en een compositie? UML is ondertussen in vele boeken beschreven en elke schrijver heeft weer zijn eigen kijk op UML vertalingen. Helaas kun je aan een boek weinig vragen dus ik had nu eindelijk een leraar die open stond voor al mijn vragen. De cursus werd gegeven door René de Jong die naast docent veel ervaring heeft met de praktijk. In de dagen erna werd er meer de diepte ingegaan op architecturen in software oplossingen. Naast UML 2.0 diagrammen en methodieken zijn er onderwerpen behandeld waaronder design principes, architectuur stijlen, RUP, XP, design patterns en refactoring.
Veel onderwerpen waren mij al bekend maar vielen verassend goed samen in deze opleiding. Een aanrader voor elke programmeur. Naast de aangename ervaring heb ik mooie documentatie mee gekregen om nog eens rustig alles door te lezen.

Op zomerkamp naar België

Het is zes uur in de ochtend. Ik stel mijn navigatiesysteem in op Dinant (België) waar over vier uur het Adobe AIR summercamp van start gaat. Dit evenement dat van 20 t/m 22 augustus gehouden werd is een jaarlijks terugkomend evenement exclusief voor Adobe partners. Dit jaar stond de Adobe AIR runtime centraal.
De voorgaande twee dagen heb ik geprobeerd mijn kennisniveau in de avonduren bij te spijkeren door de opgestuurde training DVD betiteld ‘Total Training for Adobe Flex 3 Rich Internet and AIR Applications’ door te spitten. Het is meer dan een feit dat Adobe met Flex nu een goede ontwikkelomgeving heeft neergezet voor RIA’s (Rich Internet Application).
Een maal aangekomen in het Mercure hotel in Dinant stond er al een kleine groep ontwikkelaars te wachten voor de start van het evenement. Nadat ik mijn spullen had ingecheckt begon er een reeks sessies die aan Flex, AIR en LifeCycle ES waren toegewijd. Het doel van het Adobe AIR summercamp evenement was het kennismaken met overige flash developers en het ontwikkelen van applicaties in Adobe AIR.
De gehele tweede dag werd er in groepen van twee, maximaal drie ontwikkeld aan eigen Adobe AIR applicaties. De groepen waren onderverdeeld in de vakgebieden enterprise en design. De winnaar van elk vakgebied zou kaarten krijgen voor het Adobe MAX evenement in Milaan. Aangezien ik geen fulltime flash developer ben was ik helaas geen concurrentie voor overige deelnemers waarvan sommigen zelfs uit de gaming hoek kwamen. Toch is het indrukwekkend hoe eenvoudig het is om een Abobe AIR applicatie te schrijven. Daarnaast is Flex (waarmee AIR applicaties ontwikkeld kunnen worden) gebouwd op Eclipse en dus voor velen een vertrouwde ontwikkelomgeving. Tijdens de tweede dag was er voldoende mogelijkheid om de experts te raadplegen voor vragen. Ik heb hier dan ook veel gebruik van gemaakt.
Naast het ontwikkelen was er ook voldoende tijd voor ontspanning. Het doel van het evenement was immers het ontmoeten van professionals. In de middag werden er paintball en outdoor activiteiten gedaan. Na een korte nacht werden de winnaars op de derde dag bekend gemaakt. Dit waren de applicaties genaamd hAIRy en Bubble Trouble. Deze twee applicaties zijn overigens (binnenkort) te vinden op het internet. Beide winnaars hebben in een notendop laten zien hoe krachtig de Adobe AIR runtime is.
Achteraf gezien heb ik het evenement als succesvol ervaren. Ik heb veel kunnen leren en heb een goed beeld gekregen van de toepassing van Adobe AIR. Ik denk dat Adobe een juiste keuze heeft gemaakt om een dergelijke runtime op te starten met aansluiting op een reeds bestaande groep ontwikkelaars.