Stage Eindwerk Studiegebied Bachelor Afstudeerrichting Academiejaar Student
Handelswetenschappen en Bedrijfskunde Toegepaste Informatica 2007-2008
Bart Matthys
Elektronisch uitgeven
STATS.6minutes.be De automatisering van statistische rapportage op een systeem van elektronische nieuwsbrief tracking
Stageplaats
Index NV Veurne
Voorwoord Dit project heb ik uitgewerkt in het kader van de stage die ik volgde bij Index NV te Veurne als laatstejaarsstudent Professionele Bachelor Toegepaste Informatica aan de Hogeschool WestVlaanderen departement Simon Stevin. Eerst en vooral zou ik Index willen bedanken voor het aanbieden van de stageplaats en voor de vriendelijke ontvangst die ik gekregen heb. Zij hebben mij de kans gegeven om een kijkje te nemen in het bedrijfsleven en alvast wat ervaring op te doen. De stageopdracht waar ik 13 weken lang mee geconfronteerd werd heb ik voornamelijk zelfstandig uitgewerkt, maar toch kon ik altijd rekenen op de expertise en hulp van mijn stagementor Pedro Decock als ik door een probleem niet verder kon of ergens raad bij nodig had. Ook wil ik de opdrachtgever van het project, Toon Lowette, bedanken voor de tijd die hij gestoken heeft in het verzorgen van een heleboel input en feedback om het project in goede banen te leiden. Tenslotte wil ik mijn stagebegeleider Dirk Vandycke bedanken om mijn project op te volgen en te begeleiden. Aan hem heb ik enkele goede tips te danken omtrent het project en stageverslag en een oplossing in verband met de gebruikte databank die mij een heel stuk verder bracht!
Voorwoord
3
Abstract Dit dossier behandelt de uitwerking van mijn stageopdracht bij Index NV. Deze stageopdracht bestond er uit een applicatie te ontwikkelen voor de elektronische uitgever 6minutes die over enkele verschillende domeinen statistische informatie moet verschaffen aan zijn beheerders, medewerkers en adverteerders. Het omvat de tracking van elektronisch verzonden nieuwsbrieven die voor de verschillende 6minutes rubrieken of voor externe opdrachtgevers periodiek worden verzonden. Daarbij is het onder meer mogelijk om te bekijken hoeveel nieuwsbrieven er per uitgave geopend werden, en hoe vaak er op links naar de artikels of adverteerders binnen deze nieuwsbrieven geklikt werd. Daarnaast wordt er een beeld verschaft van de bijdrage die de verschillende medewerkers leveren en de populariteit van de door hun geschreven artikels. Verder verzorgt het systeem een uitgebreide rapportage over de abonnees van de verschillende nieuwsbrieven, zoals de verdeling van profielkenmerken (geslacht, woonplaats, beroep, etc.). Ten slotte werd er ook gewerkt aan integratie met MetriWeb, dat dagelijks per keyword op de 6minutes website het aantal bezoekers, bezoeken en pagerequests kan leveren. Op het einde van mijn stage kon ik de applicatie achterlaten op de door Index gehoste server van 6minutes waar hij nu ten volle benut kan worden. Hierdoor beschikken zij nu over een systeem waarmee statistieken en rapporten met een klik op de knop bekeken of gedownload kunnen worden, dat vervolgens voor allerhande doeleinden gebruikt kunnen worden.
Abstract
4
Abstract (English) This file describes the realization on my practice term assignment at Index NV. The practice term assignment was to develop an application for the electronic publisher 6minutes that should provide statistical information over several areas to its administrators, staff members and advertisers. It includes the tracking of sent newsletters e-mails that are sent periodically for various 6minutes topics or for external principals. That way it is possible to monitor how many newsletters were opened for each issue, and how often the links to the articles or advertisers were clicked. Other than that it provides an image of the contributions that the staff members delivered and the popularity of the articles they wrote. Beside that the system maintains extensive reports of the several newsletters' subscribers, such as a comparison of all their characteristics (sex, habitat, occupation etc.). Finally there has also been worked on integration with MetriWeb, that supplies the amount of visitors, visits and page requests on the 6minutes for every keyword on a daily basis. At the end of my practice term I left the application on the server that Index hosts for 6minutes, where it can now be put to full use. In doing so 6minutes now possesses a system that can be used to view or download statistics or reports by a click on the mouse, which can be used for various purposes.
Abstract (English)
5
Inhoudsopgave Voorwoord......................................................................................................................................... 3 Abstract.............................................................................................................................................. 4 Abstract (English)........................................................................................................................... 5 Inhoudsopgave................................................................................................................................. 6 Verklarende woordenlijst............................................................................................................ 8 Het stagebedrijf............................................................................................................................... 9 Historiek.................................................................................................................................................................................. 9 Producten............................................................................................................................................................................. 10
Analyse............................................................................................................................................. 11 Huidige situatie.................................................................................................................................................................. Functionele eisen.............................................................................................................................................................. Voor beheer.......................................................................................................................................................... Over abonnees..................................................................................................................................................... Voor adverteerders........................................................................................................................................... Voor medewerkers............................................................................................................................................ Niet-functionele eisen..................................................................................................................................................... MoSCoW-methode............................................................................................................................................................ Use-cases.............................................................................................................................................................................. Paginastructuur................................................................................................................................................................. Databank..............................................................................................................................................................................
11 12 12 13 14 14 15 16 17 28 29
Realisatie......................................................................................................................................... 30 Gebruikte software........................................................................................................................................................... Webontwikkeling.............................................................................................................................................................. Algemeen............................................................................................................................................................... ASP.NET Design............................................................................................................................................ View State Page............................................................................................................................................. Periode Control............................................................................................................................................. GridView.......................................................................................................................................................... Databank Klasse........................................................................................................................................... Telerik RadControls.................................................................................................................................... Pagina's.................................................................................................................................................................. Login................................................................................................................................................................. Tracking nieuwsbrieven........................................................................................................................... Tracking artikels.......................................................................................................................................... Tracking advertenties en clicks.............................................................................................................. Abonnees en abonnementen................................................................................................................... Gebeurtenissen............................................................................................................................................. Integratie met CIM....................................................................................................................................... Beheer.............................................................................................................................................................. Windows Service............................................................................................................................................................... Algemeen............................................................................................................................................................... Inhoudsopgave
30 31 31 31 32 34 35 37 38 41 41 42 45 47 51 54 55 57 59 59 6
Implementatie..................................................................................................................................................... Tracking nieuwsbrieven samenvatten................................................................................................ Ophalen CIM keyword-statistieken...................................................................................................... Genereren rapporten van het abonneeprofiel................................................................................. Verwerking oude databank gegevens....................................................................................................................... Probleemstelling................................................................................................................................................ Verwerken tot samenvattingsgegevens.................................................................................................... Databankoptimalisatie....................................................................................................................................................
61 61 62 63 65 65 65 66
Conclusie......................................................................................................................................... 67 Kritische reflectie......................................................................................................................... 68 Algemeen.............................................................................................................................................................................. 68 Wat ik anders zou willen gedaan hebben................................................................................................................ 68
Bronnen........................................................................................................................................... 69 Colofon............................................................................................................................................. 70 Voor akkoord verklaring........................................................................................................... 71
Inhoudsopgave
7
Verklarende woordenlijst XML
eXtensible Markup Language is een standaard voor het definiëren van formele markup-talen voor de representatie van gestructureerde gegevens in de vorm van platte tekst. Deze representatie is zowel machineleesbaar als leesbaar voor de mens.
CIM
CIM staat voor het Centrum voor Informatie over de Media. Het CIM stelt zich tot doel zijn leden op permanente en regelmatige basis binnen de kortst mogelijke termijn nauwkeurige en betrouwbare gegevens te leveren die noodzakelijk zijn voor de objectieve weergave en de optimalisering van de reclamebestedingen in België.
MetriWeb
MetriWeb is een meetinstrument van het CIM. Met dit meetinstrument wordt voor alle deelnemende sites gemeten hoeveel mensen een site, en specifieke pagina's binnen een site, bezoeken en wanneer ze dat doen.
Telerik
Telerik is een vooraanstaand verkoper van User Interface (UI) componenten voor ASP.NET, Windows Forms en .NET rapportering oplossingen. Telerik helpt zijn klanten om ongekend rijke en interactieve applicaties te bouwen.
CSS
CSS staat voor Cascading Style Sheets. CSS is een techniek voor de stijl (vormgeving) van webpagina's. Die informatie kan in het HTML document zelf staan, maar ook in een extern document dat wordt geïmporteerd, wat ook wel stylesheet genoemd wordt.
PDF
PDF staat voor Portable Document Format. PDF is een de facto standaard voor de uitwisseling van elektronische documenten en formulieren die in hun oorspronkelijke vorm gereproduceerd moeten kunnen worden.
Verklarende woordenlijst
8
Het stagebedrijf Historiek In het jaar 1992 wordt Index NV opgericht. Programmeurs werden aangetrokken om alle ontwikkelingen in eigen handen te kunnen nemen. Het eerste product van Index, de Index Fiscale Databank, wordt een feit. Initieel was Index gehuisvest in de kantoren van Immo La Terrasse aan de Koninklijke Baan 172 te Koksijde. Deze behuizing werd al snel te klein en in 1994 werd een nieuwe locatie gevonden : de Zonstraat 36 te Koksijde. Vanaf 1995 kiest Index resoluut de weg van het internet, dat op dat moment in België nog relatief onbekend is. Drie jaar na de vorige verhuis, barst Index in 1997 alweer uit zijn voegen. De gebouwen van de voormalige drukkerij Pattyn te Veurne werden aangekocht. Tot op vandaag is Index nog steeds op de huidige locatie gevestigd. In 1998, na zes jaar ontwikkeling, wordt het personeelsbestand uitgebreid naar acht medewerkers en worden alle producten volop gecommercialiseerd. De eerste ontwikkelingen voor de vastgoedmarkt zijn tevens een feit. Rond het jaar 2000 is de klantenportefeuille van de Index Fiscale Databank uitgegroeid tot zo’n 1000 klanten. Vanaf het jaar 2002 richt Index zich ook tot de markt van de websites en de intranetten . Op heden heeft Index een mooie klantenportefeuille uitgebouwd voor elk van z’n producten.
Het stagebedrijf
9
Producten Index eXtended Edition Vakpers, boekhoud-, handels- en vennootschapsrecht, directe belastingen, BTW, Kadaster, successie, registratie en domeinen, rechtspraak, sociale zekerheid, jaarrekeningen,... Index eXtended bundelt, sorteert, klasseert en archiveert voor u elke dag opnieuw alle professionele informatie. Uitgeversonafhankelijk geven wij u de standpunten van zowel de administratie, rechtspraak als de volledige vakpers mee. Index eXtended geeft u naast deze schat aan fiscale en boekhoudkundige informatie tevens toegang tot uiterst interessante bijkomende modules ( I-VAT Web Assistant, jaarrekeningen, financiële analyses, ... ). Web De Index Web Manager biedt u de mogelijkheid om uw website zelf volledig aan te passen. IWM is een zeer gebruiksvriendelijke editor die iedereen toelaat om webpagina’s te beheren. Geen specifieke voorkennis of technische bagage is vereist om met dit systeem overweg te kunnen. Bijmaken, wijzigen of verwijderen, werken met IWM houdt in dat u de baas bent in uw eigen webhuis. Index ontwerpt de layout op basis van uw wensen, rekening houdend met het logo en de huisstijl. Daarna kan u met uw persoonlijke gebruikersnaam en wachtwoord gebruik maken van de online editor waar en wanneer u maar wil. Intranetten Reeds jaren houdt Index Development zich bezig met intranet-technologie. Bedrijven, groeperingen, verenigingen... kunnen via een gesloten en beveiligd internetgedeelte met elkaar communiceren op een zeer snelle en kostenbesparende manier. Dit intranet is enkel toegankelijk voor leden. Een intranet kan aanzien worden als een "one stop shopping point" vermits er databanken en softwareprogramma's in vervat zitten. Het doel van dit intranet is het op een gestructureerde wijze aanbieden van alle relevante informatie die de professionele gebruiker in zijn dagelijkse praktijk nodig heeft en kan gebruiken. Deze "afgesloten website" is opgebouwd uit verschillende onderdelen: ➢
Interactief; Het interactieve luik van het intranet heeft als doelstelling de communicatie tussen Index NV en haar leden, alsook tussen de leden onderling te vereenvoudigen.
➢
Databanken; Hieronder vindt u een overzicht van alle databanken die te raadplegen zijn op het Index-intranet. Enkele van deze databanken zijn gratis, andere zijn dan weer betalend en kunt u dankzij dit intranet tegen een voor u voordelige prijs raadplegen.
➢
Tools; Enkele programma's die het werk van de professional vergemakkelijken en hem opmerkelijke tijdswinst opleveren.
Het stagebedrijf
10
Analyse Huidige situatie 6minutes Press bvba is een uitgever van gratis nieuwsbrieven en de 6minutes website. Zowel nieuwsbrieven als site zijn een eigen journalistiek product gebaseerd op segmentatie, selectie en synthese, met de bedoeling de lezer in beperkte tijd kennis te laten nemen van de meest relevante informatie voor zijn of haar interessegebied. Sinds enige tijd worden de nieuwsbrieven van 6minutes elektronisch per e-mail verzonden. Zowel de 6minutes website als de infrastructuur om het verzenden van de nieuwsbrieven mogelijk te maken zijn ontworpen en gehost door Index NV. Omdat advertenties de voornaamste inkomsten vormen voor 6minutes, is het belangrijk dat de cijfers die hieromtrent belangrijk zijn voor adverteerders in kaart worden gebracht. Voor de website bestaat er al een uitgebouwd systeem van DoubleClick en van Google (Google Ads). Voor de advertenties in de nieuwsbrieven echter bestaat er niet zo'n systeem. Wel zijn er al de nodige voorzieningen getroffen om zo'n systeem mogelijk te maken: ✔
Zo zijn er verborgen afbeeldingen in de nieuwsbrieven gestoken die linken naar een afbeelding die met het abonneeid en nieuwsbriefid als parameters linkt. Op die manier wordt elke keer wanneer een nieuwsbrief geopend wordt een record toegevoegd in de TRACKEML-tabel op de (MS)SQL server.
✔
Daarnaast worden alle links in een nieuwsbrief omgevormd tot url's naar de 6minutes website die forwarden naar de desbetreffende link. Ook hier worden het abonneeid en nieuwsbriefid meegegeven als parameters en deze worden door de forward pagina toegevoegd aan de TRACKURL-tabel.
Het is mogelijk om rapporten voor deze gegevens te maken met SQL instructies. Maar dat vereist toegang tot de MSSQL server, die eigelijk zo veel mogelijk afgeschermd moet worden. Daarnaast is het opstellen van rapporten op deze manier een zware karwei, er kruipt immers veel tijd in om telkens SQL instructies te wijzigen wanneer de vraag verandert en deze gegevens dan in rapporten te verwerken. Zo ontstond de nood om een speciaal hiervoor toegewijde applicatie hiervoor te ontwikkelen:
stats6minutes was geboren, alsook mijn stageopdracht!
Analyse
11
Functionele eisen Voor beheer In deze groep gaat het vooral over instrumenten waarmee 6minutes de evolutie van gebruik van site en nieuwsbrieven kan volgen. Toegang: alleen het 6minutes beheer Tracking van openen van nieuwsbrieven
per editie het aantal verzonden en geopende nieuwsbrieven
per afgesloten dag, week, maand, kwartaal en jaar het aantal verzonden en geopende nieuwsbrieven voor alle nieuwsbrieven samen
per abonnee het aantal geopende nieuwsbrieven per maand - onderscheid tussen 6minutes-nieuwsbrieven en opdrachtnieuwsbrieven
per abonnee de datum van de laatst geopende 6minutes-nieuwbrief
per abonnee het aantal ontvangen en geopende advantage-mails
per abonnee de datum van de laatst geopende advantage-mail
Tracking van kliks op links in nieuwsbrieven
per advertentie en per landingpage het aantal kliks
per advertentie en per dag het aantal kliks
per adverteerder en per advertentie het aantal kliks
voor opgegeven sites of nieuwsbrieven per editie en per landingpage het aantal kliks naar niet-6minutes links
naar landingpages van Diskidee in nieuwsbrieven van PC Professional
naar landingpages van Wijnidee in nieuwsbrieven van Wijnidee
naar landingpages van easyMRO in easyMRO nieuwsbrieven NL-FR
naar eventueel andere
voor de links naar de site van 6minutes per maand het aantal kliks op links zoals homepage, colofon, etc.
Stats over aantal gelezen artikels (views)
per taal de lijst van meest frequent gelezen artikels, sorteermogelijkheid op datum, views of auteur, voor de laatste lopende week, maand, kwartaal, jaar
per rubriek aantal keer dat een artikel is opgevraagd, sorteermogelijkheid op datum of views
per auteur aantal keer dat een artikel is opgevraagd, sorteermogelijkheid op datum of views
per editie van nieuwsbrief het totaal van de views van de artikels in die nieuwsbrief
Analyse
12
per auteur overzicht van het aantal artikels, aantal views en gemiddeld views/artikel voor de meest recente 30 en 90 dagen
gemiddeld aantal views per artikel per taal
Stats over aantal gelezen gebeurtenissen (views)
totaal aantal views van gebeurtenissen per afgesloten dag, week, maand, kwartaal en jaar
totaal aantal views per gebeurtenis
totaal aantal views per kalenderdag, ongeacht het jaar van de gebeurtenis
Stats over bezoekers, bezoeken en pagerequests Die worden bij CIM dagelijks berekend met maandelijkse overzichten.
Over abonnees In deze groep gaat het vooral over de analyse van het profiel van de abonnees over de hele site en per nieuwsbrief. Abonnees
totaal aantal abonnees, en totaal per taal
het zou een mooie gimmick zijn om op de site een knop te hebben waarbij mensen kunnen klikken voor het real time aantal abonnees
overzicht van aantal abonnees per titel, afzonderlijk NL en FR, en samen
met daarbij een berekening van het aantal verzonden mails over de laatste maand
Profiel
voor het hele bestand verdeling van de profielkenmerken
per taalgroep verdeling van profielkenmerken
voor elke nieuwsbrief verdeling van de profielkenmerken
overzicht van landen met aantal abonnees
hoeveel abonnementen heeft een gemiddelde abonnee per profielkenmerk
Abonnementen
gemiddeld aantal nieuwsbrieven
hoeveel abonnementen hebben abonnees van elke titel gemiddeld
voor welke andere titels zijn de abonnees geabonneerd
hoeveel abonnees per titel hebben slechts één nieuwsbrief, en wie zijn zij
Providers
hoeveel abonnees hebben adres bij hotmail, gmail, skynet/belgacom, telenet/pandora
idem per nieuwsbrief
Analyse
13
E-mailclients - browsers
hoeveel abonnees gebruiken Outlook, Thunderbird, LotusNotes, Eudora,...
hoeveel abonnees gebruiken IE, Firefox, Apple, Opera...
hoeveel abonnees gebruiken Windows (versies), MacOS, Linux, Sun...
Voor adverteerders In deze groep gaat het vooral over de rapportering van het succes van advertenties in de nieuwsbrieven, en enkele andere die nuttig zijn voor de reclameregie Beweb. Met downloadmogelijkheid (excel en PDF).
rapportering met aantal verzonden, aantal geopende, aantal kliks, % geopend op verzonden, % kliks op verzonden, % kliks op geopend; per advertentie en per landingpage met totalen
aantal kliks per advertentie per dag
overzicht per adverteerder
Toegang: koppelen aan toegang voor reclame-invoer; alleen die resultaten kunnen worden opgevraagd waarvoor ook advertenties zijn ingevoerd.
Voor medewerkers In deze groep gaat het vooral over hoe vaak artikels gelezen zijn, per medewerker, en een combinatie met advertentiegegevens voor die gevallen waar de inkomsten van de medewerker afhangen van de reclame-inkomsten. Met downloadmogelijkheid (excel). Overzicht eigen artikels Bijkomend bij wat in het eerste deel (beheer) is omschreven over artikels:
ranking van de meest gelezen artikels per medewerker aangezien een medewerker in meer dan één rubriek kan schrijven: combineren met keuze per rubriek overzicht met rubriek, titel artikel, aantal views, datum, aantal dagen sinds publicatie
idem met ingang rubriek en combinatie met medewerker
Toegang: elke medewerker de rubrieken waarin zijn artikels staan; mag ook zicht geven op andere medewerkers in die rubrieken.
overzicht van meest gelezen artikels voor heel de site
Toegang: 6minutes beheer
Analyse
14
Niet-functionele eisen De presentatie van de resultaten is in principe webpagina's. Hiervoor moet ASP.NET gebruikt worden. Voor statistieken waar grafieken van pas komen kunnen Telerik RAD controls gebruikt worden die makkelijk te integreren zijn in ASP.NET pagina's. In sommige gevallen is downloaden voor excel of pdf ook van toepassing. Hiervoor kan gebruik gemaakt worden van externe bibliotheken om deze bestanden te genereren, zoals iTextSharp of PDFSharp om PDF bestanden te maken. De gegevens die nodig zijn voor de rapportering zijn grotendeels reeds aanwezig op een MSSQL databank. De statistieken van CIM zijn te vinden op een beveiligde web directory. Frequentie van berekening: niet alles moet in real-time berekend worden, veel gegevens uit de overzichten mogen op een kalm moment berekend worden. Hiervoor is het belangrijk om per onderdeel te bekijken wat er real-time kan berekend worden en wat er beter op een kalm moment gebeurt.
Analyse
15
MoSCoW-methode Must ➔
Een tracking van kliks op links in nieuwsbrieven leveren
➔
Een tracking van kliks op advertenties leveren
➔
Een tracking van kliks op 6minutes-links vanuit nieuwsbrieven leveren
➔
Statistieken over het aantal gelezen artikels leveren
➔
Een overzicht van de abonnees leveren
Should ➔
Statistieken over bezoekers, bezoeken en page requests leveren
➔
Statistieken over aantal gelezen gebeurtenissen leveren
➔
Een overzicht van de eigen artikels leveren
➔
Samenvatten van gegevens die niet real-time berekend moeten worden
Could ➔
Overzichten van het profiel van abonnees leveren
➔
Overzichten van e-mailclients, browsers, etc. van abonnees leveren
➔
Een e-mail adressenlijst van inactieve abonnees exporteren
Would / Won't ➔
Overzichten van e-mailclients, browsers, etc. van abonnees leveren
➔
Een e-mail adressenlijst van inactieve abonnees exporteren
Analyse
16
Use-cases Nummer use-case: 1 Naam use-case: Inloggen Doel: De gebruiker toegang geven tot de statistieken waartoe hij gemachtigd is. Korte beschrijving: De gebruiker logt in. Actoren: alle geregistreerde gebruikers: beheerders, medewerkers en adverteerders Uitvoeringsfrequentie: hoog Schaalbaarheid: middelmatig Kritikaliteit: hoog Overige niet-functionele eisen: De gebruiker moet in de databank aanwezig zijn. Precondities: geen Postcondities: De gebruiker is ingelogd. Primaire pad: – De gebruiker gaat naar het loginscherm. – De gebruiker voert zijn gebruikersnaam en wachtwoord in. – De gebruiker klikt op “Inloggen”. – Het systeem verifiëert de gebruiker en meldt de gebruiker aan. Use-cases gerelateerd aan primaire pad: geen Alternatieven: geen Use-cases gerelateerd aan alternatieven: nvt. Uitzonderingen: geen Use-cases gerelateerd aan uitzonderingen: nvt. Opmerkingen: geen Nummer use-case: 2 Naam use-case: Uitloggen Doel: De gebruiker uitloggen. Korte beschrijving: De gebruiker logt uit. Actoren: alle geregistreerde gebruikers: beheerders, medewerkers en adverteerders Uitvoeringsfrequentie: middelmatig Schaalbaarheid: middelmatig Kritikaliteit: middelmatig Overige niet-functionele eisen: geen Precondities: De gebruiker moet ingelogd zijn. Postcondities: De gebruiker is uitgelogd. Primaire pad: – De gebruiker gaat naar het overzichtscherm. – De gebruiker klikt op “Uitloggen”. – Het systeem meldt de gebruiker af en stuurt de gebruiker naar het loginscherm. Use-cases gerelateerd aan primaire pad: geen Alternatieven: De gebruiker wordt automatisch uitgelogd als zijn web-sessie verlopen is. Use-cases gerelateerd aan alternatieven: nvt. Uitzonderingen: geen Use-cases gerelateerd aan uitzonderingen: nvt. Opmerkingen: geen
Analyse
17
Nummer use-case: 3 Naam use-case: CIM login wijzigen Doel: De CIM login gegevens wijzigen. Korte beschrijving: De CIM login gegevens wijzigen die door de site gebruikt worden om statistieken van CIM te downloaden en te verwerken. Deze login gegevens worden maandelijks door CIM gewijzigd en de beheerder ontvangt hiervoor maandelijks een e-mail met de nieuwe login. Actoren: beheerders Uitvoeringsfrequentie: maandelijks Schaalbaarheid: laag Kritikaliteit: hoog Overige niet-functionele eisen: De gebruiker moet beschikken over de nieuwste CIM login gegevens. Precondities: De gebruiker moet ingelogd zijn. Postcondities: De CIM login gegevens zijn gewijzigd. Primaire pad: – De gebruiker klikt op “Ga naar beheer” en vervolgens op “Beheer CIM toegang”. – De gebruiker voert de nieuwe gebruikersnaam en wachtwoord in. – De gebruiker klikt op “Opslaan”. Use-cases gerelateerd aan primaire pad: geen Alternatieven: geen Use-cases gerelateerd aan alternatieven: nvt. Uitzonderingen: geen Use-cases gerelateerd aan uitzonderingen: nvt. Opmerkingen: In normale omstandigheden verandert enkel het wachtwoord en niet de gebruikersnaam. Nummer use-case: 4 Naam use-case: Site met domeinen toevoegen Doel: Toevoegen van een site met domeinen. Korte beschrijving: In een onderdeel van de site is het mogelijk om de clicks voor een bepaalde site per nieuwsbrief te bekijken. Hiervoor moet de site met zijn domeinen toegevoegd worden. Actoren: beheerders Uitvoeringsfrequentie: relatief laag Schaalbaarheid: laag Kritikaliteit: middelmatig Overige niet-functionele eisen: geen Precondities: De gebruiker moet ingelogd zijn. Postcondities: De site met domeinen is toegevoegd. Primaire pad: – De gebruiker klikt op “Ga naar beheer”, “Beheer domeinen sites en partnersites” en daarna op “Toevoegen”. – De gebruiker vult de naam van de site in en klikt op “Toevoegen”. – De gebruiker voegt daarna domeinen tot de site toe door telkens de domeinnaam in te vullen en op “Toevoegen” te klikken Use-cases gerelateerd aan primaire pad: Site domeinen wijzigen, Site met domeinen verwijderen Alternatieven: geen Use-cases gerelateerd aan alternatieven: nvt. Uitzonderingen: geen Use-cases gerelateerd aan uitzonderingen: nvt. Opmerkingen: geen
Analyse
18
Nummer use-case: 5 Naam use-case: Site domeinen wijzigen Doel: Wijzigen van de domeinen van een site. Korte beschrijving: In een onderdeel van de site is het mogelijk om de clicks voor een bepaalde site per nieuwsbrief te bekijken. Hiervoor moeten de domeinen van een site gewijzigd kunnen worden. Actoren: beheerders Uitvoeringsfrequentie: laag Schaalbaarheid: laag Kritikaliteit: middelmatig Overige niet-functionele eisen: geen Precondities: De gebruiker moet ingelogd zijn. Postcondities: De domeinen van een site zijn gewijzigd. Primaire pad: – De gebruiker klikt op “Ga naar beheer”, “Beheer domeinen sites en partnersites” en kiest dan een site en klikt op “domeinen”. – De gebruiker voegt daarna domeinen tot de site toe door telkens de domeinnaam in te vullen en op “Toevoegen” te klikken, of verwijdert een domeinnaam door deze te selecteren en op “Verwijderen” te klikken. Use-cases gerelateerd aan primaire pad: Site met domeinen toevoegen, Site met domeinen verwijderen Alternatieven: geen Use-cases gerelateerd aan alternatieven: nvt. Uitzonderingen: geen Use-cases gerelateerd aan uitzonderingen: nvt. Opmerkingen: geen Nummer use-case: 6 Naam use-case: Site met domeinen verwijderen Doel: Verwijderen van een site met domeinen. Korte beschrijving: In een onderdeel van de site is het mogelijk om de clicks voor een bepaalde site per nieuwsbrief te bekijken. Hiervoor moeten de sites met zijn domeinen verwijderd kunnen worden. Actoren: beheerders Uitvoeringsfrequentie: laag Schaalbaarheid: laag Kritikaliteit: middelmatig Overige niet-functionele eisen: geen Precondities: De gebruiker moet ingelogd zijn. Postcondities: De domeinen van een site zijn gewijzigd. Primaire pad: – De gebruiker klikt op “Ga naar beheer”, “Beheer domeinen sites en partnersites” en kiest dan een site en klikt op “verwijderen”. Use-cases gerelateerd aan primaire pad: Site met domeinen toevoegen, Site domeinen wijzigen Alternatieven: geen Use-cases gerelateerd aan alternatieven: nvt. Uitzonderingen: geen Use-cases gerelateerd aan uitzonderingen: nvt. Opmerkingen: geen
Analyse
19
Nummer use-case: 7 Naam use-case: Tracking nieuwsbrieven weergeven Doel: Het weergeven van de nieuwsbrieftracking voor een editie. Korte beschrijving: Trackinggegevens zoals aantal keren verzonden en geopend per nieuwsbrief weergeven voor een bepaalde editie, met de mogelijkheid om deze gegevens te exporteren naar Excel of PDF. Actoren: beheerders Uitvoeringsfrequentie: regelmatig Schaalbaarheid: middelmatig Kritikaliteit: relatief hoog Overige niet-functionele eisen: geen Precondities: De gebruiker moet ingelogd zijn. Postcondities: De gebruiker beschikt over de gewenste nieuwsbrief tracking gegevens. Primaire pad: – De gebruiker klikt op “Tracking openen nieuwsbrieven per editie”. – De gebruiker kiest een editie. – De gebruiker stelt een periode in en klikt op “Weergeven”. Use-cases gerelateerd aan primaire pad: geen Alternatieven: geen Use-cases gerelateerd aan alternatieven: nvt. Uitzonderingen: geen Use-cases gerelateerd aan uitzonderingen: nvt. Opmerkingen: geen Nummer use-case: 8 Naam use-case: Tracking van alle nieuwsbrieven weergeven Doel: Het weergeven van de nieuwsbrieftracking voor alle edities. Korte beschrijving: Trackinggegevens zoals aantal keren verzonden en geopend voor alle nieuwsbrieven van elke editie, met de mogelijkheid om deze gegevens te exporteren naar Excel of PDF. Actoren: beheerders Uitvoeringsfrequentie: regelmatig Schaalbaarheid: middelmatig Kritikaliteit: relatief hoog Overige niet-functionele eisen: geen Precondities: De gebruiker moet ingelogd zijn. Postcondities: De gebruiker beschikt over de gewenste nieuwsbrief tracking gegevens. Primaire pad: – De gebruiker klikt op “Tracking openen alle nieuwsbrieven”. – De gebruiker stelt een periode in en klikt op “Weergeven”. Use-cases gerelateerd aan primaire pad: geen Alternatieven: geen Use-cases gerelateerd aan alternatieven: nvt. Uitzonderingen: geen Use-cases gerelateerd aan uitzonderingen: nvt. Opmerkingen: geen
Analyse
20
Nummer use-case: 9 Naam use-case: Stats artikels per auteur/rubriek weergeven Doel: Het weergeven van statistieken over artikels per auteur en/of rubriek. Korte beschrijving: Voor ieder artikel wordt weergegeven hoeveel views er geweest zijn, voor een bepaalde auteur of voor alle auteurs samen en voor een bepaalde rubriek of voor alle rubrieken samen, met de mogelijkheid om deze gegevens te exporteren naar Excel of PDF. Actoren: beheerders, medewerkers Uitvoeringsfrequentie: regelmatig Schaalbaarheid: middelmatig Kritikaliteit: relatief hoog Overige niet-functionele eisen: geen Precondities: De gebruiker moet ingelogd zijn. Postcondities: De gebruiker beschikt over de gewenste artikel-statistieken. Primaire pad: – De gebruiker klikt op “Artikels per auteur en/of rubriek”. – De gebruiker kiest een auteur of selecteert “Alle auteurs”. – De gebruiker kiest een rubriek of selecteert “Alle rubrieken”. – De gebruiker stelt een periode in en klikt op “Weergeven”. Use-cases gerelateerd aan primaire pad: geen Alternatieven: geen Use-cases gerelateerd aan alternatieven: nvt. Uitzonderingen: geen Use-cases gerelateerd aan uitzonderingen: nvt. Opmerkingen: Medewerkers kunnen enkel het aantal views raadplegen op artikels die in één van de rubrieken staan waar hij zelf voor geschreven heeft. Nummer use-case: 10 Naam use-case: Stats voor alle auteurs weergeven Doel: Het weergeven van statistieken over artikels voor alle auteurs. Korte beschrijving: Er wordt voor iedere auteur weergegeven hoeveel artikels hij/zij gepubliceerd heeft en het totale aantal views op deze artikels alsook de gemiddelde populariteit, met de mogelijkheid om deze gegevens te exporteren naar Excel of PDF. Actoren: beheerders Uitvoeringsfrequentie: regelmatig Schaalbaarheid: middelmatig Kritikaliteit: relatief hoog Overige niet-functionele eisen: geen Precondities: De gebruiker moet ingelogd zijn. Postcondities: De gebruiker beschikt over de gewenste artikel-statistieken. Primaire pad: – De gebruiker klikt op “Auteur overzicht”. – De gebruiker stelt een periode in en klikt op “Weergeven”. Use-cases gerelateerd aan primaire pad: geen Alternatieven: geen Use-cases gerelateerd aan alternatieven: nvt. Uitzonderingen: geen Use-cases gerelateerd aan uitzonderingen: nvt. Opmerkingen: geen
Analyse
21
Nummer use-case: 11 Naam use-case: Tracking ads weergeven Doel: Het weergeven van advertentie statistieken voor een bepaalde adverteerder. Korte beschrijving: Voor iedere landingpage van een bepaalde adverteerder wordt weergegeven hoeveel clicks er geweest zijn, met de mogelijkheid om deze gegevens te exporteren naar Excel of PDF. Actoren: beheerders, adverteerders Uitvoeringsfrequentie: regelmatig Schaalbaarheid: middelmatig Kritikaliteit: relatief hoog Overige niet-functionele eisen: geen Precondities: De gebruiker moet ingelogd zijn. Postcondities: De gebruiker beschikt over de gewenste advertentie tracking gegevens. Primaire pad: – De gebruiker klikt op “Clicks advertenties”. – De gebruiker selecteert een adverteerder. – De gebruiker stelt een periode in en klikt op “Weergeven”. Use-cases gerelateerd aan primaire pad: geen Alternatieven: geen Use-cases gerelateerd aan alternatieven: nvt. Uitzonderingen: geen Use-cases gerelateerd aan uitzonderingen: nvt. Opmerkingen: Adverteerders kunnen enkel zichzelf als adverteerder selecteren. Nummer use-case: 12 Naam use-case: Tracking ads per dag weergeven Doel: Het weergeven van dagelijkse advertentie statistieken voor een bepaalde adverteerder. Korte beschrijving: Per dag worden voor iedere landingpage van een bepaalde adverteerder weergegeven hoeveel clicks er geweest zijn, voor een bepaalde editie of alle edities samen, met de mogelijkheid om deze gegevens te exporteren naar Excel of PDF. Actoren: beheerders, adverteerders Uitvoeringsfrequentie: regelmatig Schaalbaarheid: middelmatig Kritikaliteit: relatief hoog Overige niet-functionele eisen: geen Precondities: De gebruiker moet ingelogd zijn. Postcondities: De gebruiker beschikt over de gewenste advertentie tracking gegevens. Primaire pad: – De gebruiker klikt op “Clicks advertenties (per dag)”. – De gebruiker selecteert een adverteerder. – De gebruiker selecteert een editie of selecteert“Alle edities”. – De gebruiker stelt een periode in en klikt op “Weergeven”. Use-cases gerelateerd aan primaire pad: geen Alternatieven: geen Use-cases gerelateerd aan alternatieven: nvt. Uitzonderingen: geen Use-cases gerelateerd aan uitzonderingen: nvt. Opmerkingen: Adverteerders kunnen enkel zichzelf als adverteerder selecteren.
Analyse
22
Nummer use-case: 13 Naam use-case: Tracking ads opdrachtnieuwsbrieven weergeven Doel: Het weergeven van advertentie statistieken voor een bepaalde opdrachtnieuwsbrief. Korte beschrijving: Voor iedere landingpage van een bepaalde opdrachtnieuwsbrief wordt weergegeven hoeveel clicks er geweest zijn, met de mogelijkheid om deze gegevens te exporteren naar Excel of PDF. Actoren: beheerders Uitvoeringsfrequentie: regelmatig Schaalbaarheid: middelmatig Kritikaliteit: relatief hoog Overige niet-functionele eisen: geen Precondities: De gebruiker moet ingelogd zijn. Postcondities: De gebruiker beschikt over de gewenste advertentie tracking gegevens. Primaire pad: – De gebruiker klikt op “Clicks advertenties opdrachtnieuwsbrieven”. – De gebruiker selecteert een opdrachtnieuwsbrief. – De gebruiker stelt een periode in en klikt op “Weergeven”. Use-cases gerelateerd aan primaire pad: geen Alternatieven: geen Use-cases gerelateerd aan alternatieven: nvt. Uitzonderingen: geen Use-cases gerelateerd aan uitzonderingen: nvt. Opmerkingen: geen Nummer use-case: 14 Naam use-case: Clicks op site domeinen weergeven Doel: Het aantal clicks naar site domeinen weergeven. Korte beschrijving: Het aantal clicks naar bepaalde sites vanuit een bepaalde editie of vanuit alle edities samen weergeven. Deze sites en de domeinen die er toe behoren zijn instelbaar. Actoren: beheerders Uitvoeringsfrequentie: regelmatig Schaalbaarheid: middelmatig Kritikaliteit: relatief hoog Overige niet-functionele eisen: geen Precondities: De gebruiker moet ingelogd zijn. Postcondities: De gebruiker beschikt over de gewenste click statistieken. Primaire pad: – De gebruiker klikt op “Clicks domeinen 6minutes en partnersites”. – De gebruiker selecteert een opdrachtnieuwsbrief. – De gebruiker stelt een periode in en klikt op “Weergeven”. Use-cases gerelateerd aan primaire pad: Site met domeinen toevoegen Alternatieven: geen Use-cases gerelateerd aan alternatieven: nvt. Uitzonderingen: geen Use-cases gerelateerd aan uitzonderingen: nvt. Opmerkingen: geen
Analyse
23
Nummer use-case: 15 Naam use-case: Abonnees overzicht weergeven Doel: Een overzicht van de abonnees weergeven. Korte beschrijving: Per editie het aantal abonnees weergeven, en een verdeling van landen waar de abonnees wonen weergeven. Actoren: beheerders Uitvoeringsfrequentie: af en toe Schaalbaarheid: middelmatig Kritikaliteit: relatief laag Overige niet-functionele eisen: geen Precondities: De gebruiker moet ingelogd zijn. Postcondities: De gebruiker beschikt over een overzicht van de abonnees. Primaire pad: – De gebruiker klikt op “Algemeen overzicht” bij het onderdeel abonnees. Use-cases gerelateerd aan primaire pad: geen Alternatieven: geen Use-cases gerelateerd aan alternatieven: nvt. Uitzonderingen: geen Use-cases gerelateerd aan uitzonderingen: nvt. Opmerkingen: geen Nummer use-case: 16 Naam use-case: Abonnementen per editie weergeven Doel: Een verdeling van aantal abonnees per aantal abonnementen weergeven voor een bepaalde editie. Korte beschrijving: Een verdeling van aantal abonnees per aantal abonnementen weergeven voor een bepaalde editie. Actoren: beheerders Uitvoeringsfrequentie: af en toe Schaalbaarheid: middelmatig Kritikaliteit: relatief laag Overige niet-functionele eisen: geen Precondities: De gebruiker moet ingelogd zijn. Postcondities: Primaire pad: – De gebruiker klikt op “Aantal abonnementen van abonnees per editie”. – De gebruiker selecteert een editie Use-cases gerelateerd aan primaire pad: geen Alternatieven: geen Use-cases gerelateerd aan alternatieven: nvt. Uitzonderingen: geen Use-cases gerelateerd aan uitzonderingen: nvt. Opmerkingen: geen
Analyse
24
Nummer use-case: 17 Naam use-case: Overlappende abonnementen weergeven Doel: Het weergeven van de overlappende abonnementen op een bepaalde editie. Korte beschrijving: Voor een bepaalde editie wordt weergegeven hoeveel abonnees uit alle andere edities abonnee zijn van die geselecteerde editie, relatief aan hun eigen aantal abonnees. Actoren: beheerders Uitvoeringsfrequentie: af en toe Schaalbaarheid: middelmatig Kritikaliteit: relatief laag Overige niet-functionele eisen: geen Precondities: De gebruiker moet ingelogd zijn. Postcondities: Primaire pad: – De gebruiker klikt op “Overlappende abonnees per editie”. Use-cases gerelateerd aan primaire pad: geen Alternatieven: geen Use-cases gerelateerd aan alternatieven: nvt. Uitzonderingen: geen Use-cases gerelateerd aan uitzonderingen: nvt. Opmerkingen: geen Nummer use-case: 18 Naam use-case: Rapporten profielkenmerken weergeven Doel: Een rapport weergeven met een verdeling van profielkenmerken voor een bepaalde editie. Korte beschrijving: Een rapport in PDF-formaat exporteren met een verdeling van profielkenmerken voor een bepaalde editie. Actoren: beheerders Uitvoeringsfrequentie: af en toe Schaalbaarheid: middelmatig Kritikaliteit: relatief laag Overige niet-functionele eisen: geen Precondities: De gebruiker moet ingelogd zijn. Postcondities: De gebruiker beschikt over het gewenste rapport van profielkenmerken. Primaire pad: – De gebruiker klikt op “Rapporten profielkenmerken per editie”. – De gebruiker selecteert een editie en klikt op “Download PDF-bestand”. Use-cases gerelateerd aan primaire pad: geen Alternatieven: geen Use-cases gerelateerd aan alternatieven: nvt. Uitzonderingen: geen Use-cases gerelateerd aan uitzonderingen: nvt. Opmerkingen: Deze rapporteren worden iedere dag rond middernacht opnieuw gegenereerd.
Analyse
25
Nummer use-case: 19 Naam use-case: Stats gebeurtenissen weergeven Doel: Het weergeven van alle gebeurtenissen en het aantal clicks per gebeurtenis. Korte beschrijving: Het weergeven van alle gebeurtenissen en het aantal clicks per gebeurtenis Actoren: beheerders Uitvoeringsfrequentie: af en toe Schaalbaarheid: middelmatig Kritikaliteit: relatief laag Overige niet-functionele eisen: geen Precondities: De gebruiker moet ingelogd zijn. Postcondities: Primaire pad: – De gebruiker klikt op “Statistieken gebeurtenissen”. Use-cases gerelateerd aan primaire pad: geen Alternatieven: geen Use-cases gerelateerd aan alternatieven: nvt. Uitzonderingen: geen Use-cases gerelateerd aan uitzonderingen: nvt. Opmerkingen: geen Nummer use-case: 20 Naam use-case: Stats gebeurtenissen per dag weergeven Doel: Het weergeven van alle clicks op gebeurtenissen per dag. Korte beschrijving: Het weergeven van alle clicks op gebeurtenissen per dag. Actoren: beheerders Uitvoeringsfrequentie: af en toe Schaalbaarheid: middelmatig Kritikaliteit: relatief laag Overige niet-functionele eisen: geen Precondities: De gebruiker moet ingelogd zijn. Postcondities: Primaire pad: – De gebruiker klikt op “Statistieken gebeurtenissen per dag”. Use-cases gerelateerd aan primaire pad: geen Alternatieven: geen Use-cases gerelateerd aan alternatieven: nvt. Uitzonderingen: geen Use-cases gerelateerd aan uitzonderingen: nvt. Opmerkingen: geen
Analyse
26
Nummer use-case: 21 Naam use-case: Verdeling clicks 6minutes weergeven Doel: Het weergeven van een verdeling van clicks op 6minutes links uit nieuwsbrieven. Korte beschrijving: Het absolute en relatieve aantal clicks uit nieuwsbrieven naar de verschillende 6minutes onderdelen: artikels, gebeurtenissen, homepage, privacy-pagina en profiel-pagina. Actoren: beheerders Uitvoeringsfrequentie: af en toe Schaalbaarheid: middelmatig Kritikaliteit: relatief laag Overige niet-functionele eisen: geen Precondities: De gebruiker moet ingelogd zijn. Postcondities: Primaire pad: – De gebruiker klikt op “Verdeling clicks op 6minutes links uit nieuwsbrieven”. – De gebruiker stelt een periode in en klikt op “Weergeven”. Use-cases gerelateerd aan primaire pad: geen Alternatieven: geen Use-cases gerelateerd aan alternatieven: nvt. Uitzonderingen: geen Use-cases gerelateerd aan uitzonderingen: nvt. Opmerkingen: geen Nummer use-case: 22 Naam use-case: Stats CIM weergeven Doel: Het weergeven van CIM statistieken voor een bepaald keyword. Korte beschrijving: Per dag en per maand kan er gekeken worden hoeveel bezoekers en paginaverzoeken op de website er zijn voor een bepaald keyword. Actoren: beheerders Uitvoeringsfrequentie: regelmatig Schaalbaarheid: middelmatig Kritikaliteit: relatief hoog Overige niet-functionele eisen: geen Precondities: De gebruiker moet ingelogd zijn. Postcondities: Primaire pad: – De gebruiker klikt op “Statistieken CIM per keyword dagelijks en maandelijks”. – De gebruiker selecteert een keyword uit de lijst van keywords uit de laatste 7 dagen. Use-cases gerelateerd aan primaire pad: geen Alternatieven: – De gebruiker klikt op “Statistieken CIM per keyword dagelijks en maandelijks”. – De gebruiker zoekt een keyword via de zoekfunctie en selecteert deze. Use-cases gerelateerd aan alternatieven: nvt. Uitzonderingen: geen Use-cases gerelateerd aan uitzonderingen: nvt. Opmerkingen: Deze statistieken worden dagelijks geüpdatet.
Analyse
27
Paginastructuur Hieronder ziet u de paginastructuur van de 6minutes statistieken website. De navigatie is eenvoudig: één enkele overzichtpagina linkt naar alle statistieken en rapporten en naar de beheerpagina.
Login.aspx Overzicht.aspx
Beheer.aspx BeheerCIM.aspx
Pages Tracking nieuwsbrieven - TrackingOpenenNieuwsbrieven.aspx - TrackingOpenenAlleNieuwsbrieven.aspx
BeheerSites.aspx
Statistieken artikels - StatsArtikelsAuteurRubriek.aspx - StatsArtikels.aspx
Tracking advertenties - TrackingAds.aspx - TrackingAdsDagelijks.aspx - TrackingAdsOpdrachtNB.aspx - TrackingAdsPartnersites.aspx
Tracking abonnees - AbonneesOverzicht.aspx - AbonneesActiviteit.aspx - AbonneesAbonnementen.aspx - AbonneesProfiel.aspx
Tracking gebeurtenissen - StatsGebeurtenissen.aspx - StatsGebeurtenissenDagelijks.aspx
CIM statistieken - CIMstats.aspx - CIMstatsDetails.aspx
Overige - TrackingClicks6Minutes.aspx
Analyse
28
Databank 6minutes had reeds een bestaande databank, dus hiervoor was geen uitgebreide analyse meer nodig. Het merendeel van de voorzieningen om de gewenste statistieken weer te geven waren reeds voorzien in de bestaande tabellen: hier is enkel de tabel NieuwsbriefClicks aan toegevoegd die per nieuwsbrief bijhoudt hoe vaak ze geopend werd. De precieze functionaliteit hierachter wordt verder in dit dossier uitgelegd (zie p.61 Tracking nieuwsbrieven samenvatten). Hier ziet u het databankschema met de tabellen waar ik het meest mee te maken heb gehad:
Analyse
29
Realisatie Gebruikte software Op het ontwikkelsysteem Besturingssysteem: Microsoft Windows XP Professional met het .NET framework versie 2.0 Programmatuur:
Microsoft Visual Web Developer 2005 Express Edition Dit is een gratis versie van Microsoft Visual Studio, specifiek om aan web projecten te werken. Dit volstond prima voor de opdracht die mij gegeven was.
Microsoft SQL Server Management Studio Express Dit is een gratis versie van Microsoft SQL Server Management Studio. Het enige gebrek ten opzichte van de betaalde versie dat ik persoonlijk heb ervaren is de afwezigheid van de mogelijkheid om databank diagrammen te genereren.
Microsoft Visual C# 2005 Express Edition Dit is een gratis versie van Microsoft Visual Studio, specifiek om aan C# applicaties te werken. Een gebrek ten opzichte van de betaalde versie is dat een groot deel van de applicatie-templates uit de betaalde versie niet beschikbaar zijn. Hierdoor moet je zelf op zoek naar code om bijvoorbeeld een Windows-service aan te maken.
Op de server Besturingssysteem: Microsoft Windows Server 2003 met het .NET framework versie 2.0 Programmatuur:
Microsoft SQL Server 2000
Internet Information Services 6.0
Het plaatsen van de software en website op de server verliep bijna vlekkeloos. Het was enkel een kwestie van het juist instellen van NTFS machtigingen.
Realisatie
30
Webontwikkeling Algemeen ASP.NET Design Alle ASP.NET pagina's werden gemaakt op basis van een masterpage. Een masterpage is een webpagina waarin je de lay-out en het uiterlijk van de website kan maken, waarbij de ASP.NET pagina's die op basis hiervan gemaakt werden de pagina inhoudelijk vullen door gebruik te maken van zogenaamde “Content Placeholders” die in de masterpage geplaatst werden. Voor dit project heb ik een relatief eenvoudige masterpage opgesteld met slechts één content placeholder:
Voor de opmaak van de website wordt gebruik gemaakt van een appart CSS (Cascading Style Sheets) bestand. Het grote voordeel van het gebruik van een dergelijke stylesheet is dat opmaak voor een bepaald item, bijvoorbeeld een hyperlink, maar één keer moet gedefiniëerd worden in de stylesheet en dat alle pagina's die er gebruik van maken automatisch deze opmaak gebruiken voor hyperlinks. Omdat alle pagina's gebaseerd zijn op de masterpage en de masterpage met het CSS bestand gelinkt is zullen alle pagina's dus de aangepaste opmaak krijgen voor hyperlinks! Hieronder ziet u het stukje code uit het CSS bestand dat gebruikt wordt om hyperlinks een andere opmaak te geven. Code: a /* Een verwijzing naar
, de (X)HTML tag voor een hyperlink. */ { color:rgb(0,104,172); /* Geeft een lichtblauwe kleur */ text-decoration:underline; /* Onderlijnt de link */ } a:hover /* Dit is wijzigende opmaak die optreedt wanneer de muispijl over de link zweeft.*/ { text-decoration:none; /* Onderlijning weghalen */ }
Realisatie
31
View State Page De ViewState in een ASP.NET pagina bewaart de staat van de server controls die zich op de pagina bevinden. Zo kan je bijvoorbeeld de gegevens uit invulvelden behouden nadat de gebruiker een “postback” heeft veroorzaakt. Een postback is meestal het klikken op een knop om gegevens naar de server te sturen, maar dit kan ook op andere manieren automatisch gebeuren. Standaard wordt de ViewState van een pagina bewaard in een verborgen veld die ASP.NET aan het formulier in de pagina toevoegt. Een belangrijk nadeel bij het gebruik van de ViewState is echter dat naarmate er steeds meer of omvangrijke server controls aan de ViewState toegevoegd worden de ViewState steeds groter wordt. En omdat de ViewState steeds heen en weer gestuurd wordt tussen client en server bij elke postback kan dit voor enige vertraging zorgen. Bij dit project merkte ik dat vooral de grotere GridView controls en Telerik RadControls zoals grafieken veel ruimte in beslag namen in de ViewState. Daarom ging ik onderzoeken of de ViewState in omvang kleiner gemaakt kon worden en of er een andere oplossing mogelijk was. Een voor de hand liggende oplossing was het gebruik van ViewState volledig vermijden en gebruik te maken van sessie-variabelen of het Cache object in .NET, die langs de server kant gegevens kunnen bijhouden en die gebruikt kunnen blijven worden over verschillende postbacks heen. Het nadeel aan deze methode is echter dat er extra programmeerwerk aan te pas komt bij elke pagina waar je het wilt toepassen en dat het vrij omslachtig is om goed te implementeren. Dan ontdekte ik dat het mogelijk is om de ViewState gewoon te blijven gebruiken, maar deze in plaats van in het formulier te plaatsen, in sessie-variabelen of in het Cache object te bewaren langs de kant van de server. De manier waarop dit werkt is dat je een nieuwe klasse maakt op basis van de klasse Page, die de methode SavePageStateToPersistenceMedium en de functie LoadPageStateFromPersistenceMedium vervangt door zijn eigen implementatie. Door dan je ASP.NET pagina's op deze klasse te baseren in plaats van op de klasse Page, kun je transparant gebruik maken van het nieuwe systeem die de ViewState langs de kant van de server opslaat! Het gevolg is dat de formulieren in de webpagina's enkel een ViewStateKey bevatten om de juiste ViewState te koppelen aan die webpagina, en postbacks geen vertraging meer kennen vanwege het versturen van een grote ViewState. Onderzoek heeft uitgewezen dat dit een verbetering van maar liefst 500% aan doorstuur performantie kan betekenen ten opzichte van het gebruik van een ViewState op de klassieke manier. Op de volgende pagina vindt u een codevoorbeeld van een vereenvoudigde versie van een View State Page klasse die de ViewState in het Cache object bewaart.
Realisatie
32
Code: public class VSPage : System.Web.UI.Page // Er wordt overgeërft van de Page-klasse { protected override void SavePageStateToPersistenceMedium(object viewState) /* De vervangende methode voor het opslaan van de ViewState. De klassieke methode zorgde voor het coderen en registreren van de ViewState als verborgen formulierveld. */ { // Er wordt een ViewStateKey gemaakt die deze ViewState moet identificeren: String strViewStateKey = "VIEWSTATE_" + Request.UserHostAddress + "_" + DateTime.Now.Ticks.ToString(); // De ViewState wordt toegevoegd aan het Cache object: Cache.Add(strViewStateKey, viewState, null, DateTime.Now.AddMinutes(Session.Timeout), TimeSpan.Zero, CacheItemPriority.Default, null); // De ViewStateKey wordt geregistreerd als verborgen formulierveld, samen een leeg // ViewState veld: RegisterHiddenField("__VIEWSTATE_KEY", strViewStateKey); RegisterHiddenField("__VIEWSTATE", ""); } protected override object LoadPageStateFromPersistenceMedium() /* De vervangende functie voor het ophalen van de ViewState. De klassieke functie zorgde voor het ophalen van de ViewState uit een verborgen formulierveld. */ { // De ViewStateKey wordt opgehaald: String strViewStateKey = Request.Form["__VIEWSTATE_KEY"]; // Als de ViewStateKey niet begint met "VIEWSTATE_" is het veld ongeldig. if (!strViewStateKey.StartsWith("VIEWSTATE_")) { throw new Exception("Ongeldige ViewStateKey: " + strViewStateKey); } // Haalt de ViewState uit het Cache object volgens de ViewStateKey, // en retourneert deze als functiewaarde: return Cache[strViewStateKey]; } }
Realisatie
33
Periode Control In een groot deel van de rapporten en statistieken die voor het project verwezenlijkt moesten worden was er een methode nodig om een periode in te stellen: een begin- en einddatum die op een gebruiksvriendelijke manier aangeduid moet kunnen worden. Omdat dit iets is dat zo vaak hergebruikt moest worden, heb ik besloten hier een Web User Control van te maken. Een Web User Control is een ASP.NET component die éénmaal het opgemaakt en gecodeerd is, eenvoudig kan geplaatst worden in gewone ASP.NET pagina's of zelfs in een ander Web User Control component. De Periode Control moest 3 elementen bevatten:
Een keuzelijst met voorgedefinieerde periodes die de gebruiker kan selecteren: “Zelf kiezen”, “Vandaag”, “Gisteren”, “Laatste week”, “Laatste maand”, “Laatste 3 maanden”, “Laatste 6 maanden”, “Laatste jaar”, “Vorige week”, “Vorige maand”, “Vorige 3 maanden”, “Vorige 6 maanden” en “Vorig jaar”.
Een invoerveld om desgewenst manueel een begindatum in te stellen.
Een invoerveld om desgewenst manueel een einddatum in te stellen.
Voor de laatste twee elementen kon gebruik gemaakt worden van een control uit de Telerik RadControls collectie: RadDatePicker die onderdeel is van RadCalendar. Deze laat toe om zelf een datum in te vullen of één te kiezen met de grafische interface:
De keuzelijst met voorgedefinieerde periodes werd ingesteld zodat deze automatisch de pagina herlaadt en zelf de passende begin- en einddatum invult. Om de invoervelden begin- en einddatum beschikbaar moesten zijn vanuit de ASP.NET pagina's heb ik het facade design-pattern gebruikt om dit te realiseren: het PeriodeControl component kreeg de functies DatumBegin en DatumEinde om respectievelijk de begin- en einddatum van de periode te verkrijgen. Alles samen werd dan in een (X)HTML tabel gegoten. Het eindresultaat:
Hierna was het gebruiken van het PeriodeControl component slechts een kwestie van verslepen en plaatsen vanuit de Solution Explorer naar de ASP.NET pagina. Een Web User Control krijgt de extentie .ascx en het achterliggende codebestand .ascx.cs (cs staat hier voor C# oftewel CSharp, de gebruikte programmeertaal).
Realisatie
34
GridView Het GridView control is een onderdeel van ASP.NET 2.0 en is de opvolger van de DataGrid in ASP.NET 1.0. Een GridView wordt gebruikt om gegevens in tabelvorm weer te geven, ze te sorteren en/of er totalen van te maken. Om dit te bereiken moeten de brongegevens met behulp van “DataBinding” aan de GridView gekoppeld worden. Voor het stats.6minutes.be project heb ik intensief gebruik gemaakt van het GridView control om gegevens mee weer te geven in de talrijke rapporten. De brongegevens waren meestal DataTables. DataBinding Het koppelen van een DataTable aan een GridView is eenvoudig te doen met twee regels code. Best voegen we de DataTable ook toe aan de ViewState zodat deze gebruikt kan worden voor sortering. Code: // De DataTable instellen als databron voor de GridView: GridViewTabel.DataSource = dataTable; // De DataBinding doorvoeren: GridView.DataBind(); // Toevoegen van de DataTable aan de ViewState: ViewState["datatable"] = dataTable;
Sorteren Hieronder ziet u de code die gebruikt wordt om velden in de GridView te sorteren. Opdat deze code kan werken moet de naam van de methode als Sorting gebeurtenis ingesteld worden in de GridView. Daarnaast moet de eigenschap AllowSorting op “True” ingesteld worden en moet voor ieder veld waarop er gesorteerd moet kunnen worden een SortExpression eigenschap met een waarde bestaan dat normaal gezien overeenkomt met de naam van dat veld in de DataTable. Code: protected void GridViewTabel_Sorting(object sender, GridViewSortEventArgs e) { // De sorteerrichting ophalen, als die niet aanwezig is op ascending (oplopend) instellen: String dir = (ViewState["SortDir"] != null ? ViewState["SortDir"].ToString() : "ASC"); // De omgekeerde sorteerrichting in de ViewState opslaan: dit is de sorteerrichting die // gebruikt zal worden als de gebruiker nogmaals op het veld sorteert. ViewState["SortDir"] = (dir == "DESC" ? "ASC" : "DESC"); // Ophalen van de DataTable uit de ViewState: DataTable dt = (DataTable)ViewState["datatable"]; // Een DataView maken op basis van de DataTable, hierop kan sortering toegepast worden. DataView dv = new DataView(dt); // De sortering instellen: dv.Sort = e.SortExpression + " " + dir; // De DataView als nieuwe databron voor de GridView instellen & de DataBinding doervoeren: GridViewTabel.DataSource = dv; GridViewTabel.DataBind(); }
Realisatie
35
Totalen weergeven Soms is het handig om totalen te zien voor bepaalde numerieke kolommen. Hiervoor moet wel het één en ander ingesteld en geprogrammeerd worden. Eerst en vooral moet de eigenschap ShowFooter op “True” worden ingesteld. Tevens moet er voor ieder veld waarvoor totalen gemaakt moeten worden een extra Label toegevoegd worden in de ASPX code van het veld zoals in het volgende voorbeeld te zien is: Code:
Hieronder ziet u dan de achterliggende C# code die nodig is om de totalen in het extra veld uit het bovenstaande voorbeeld te zetten. De naam van deze methode moet ingesteld worden als RowDataBound gebeurtenis in de GridView. Code: protected int totVeld1; protected void GridViewTabel_RowDataBound(object sender, GridViewRowEventArgs e) { DataRowView tableData = e.Row.DataItem as DataRowView; // Initialiseer de totaalwaarde op 0 als de hoofding van de GridView gemaakt wordt: if (e.Row.RowType == DataControlRowType.Header) { totVeld1 = 0; } // Vermeerder de totaalwaarde met de waarde van het veld in elke datarij: else if (e.Row.RowType == DataControlRowType.DataRow) { totVeld1 += (int)tableData["waarde_veld1"]; } // Zet de totaalwaarde in het footer-veld eens de datarijen overlopen zijn: else if (e.Row.RowType == DataControlRowType.Footer) { Label LabelVeld1 = e.Row.FindControl("TotVeld1") as Label; LabelVeld1.Text = totVeld1.ToString(); } }
Realisatie
36
Databank Klasse Ik heb ervoor gekozen om voor de website stats.6minutes.be één partiële klasse te maken met de hoofdfunctionaliteit van de databank zoals het ophalen van gegevens in de vorm van DataTables of als enkele waarden (scalar values). En hieraan worden verschillende andere partiële klasses gekoppeld die de eigenlijke functies bevatten die gebruikt worden om gegevens op te halen in de verschillende webpagina's. Laatstgenoemde klasses bevatten dus de concrete SQL commando's. De hoofdfuncties in de databank-klasse zijn: // Functie om het resultaat van een SQL query als DataTable te retourneren: public DataTable GetDataTable(String sql) { ... } // Functie om het resultaat van een prepared statement als DataTable te retourneren: public DataTable GetDataTable(String preparedstatement, params object[] parameters) { ... } // Functie om de resultaten van een serie gelijkaardige SQL commando's aan elkaar te // plakken en te retourneren als DataTable zonder de onderlinge sortering te beïnvloeden: public DataTable GetDataTable(List<String> sqlReeks) { ... } // Functie om het resultaat van een prepared statement als DataTable te retourneren: public Object GetScalar(String sql) { ... }
SQL injection Op een bepaald moment tijdens mijn stage werden enkele minder goed beveiligde websites op één van de servers van Index aangevallen door een type van SQL injection die alle tekstvelden vulde met een schadelijk stukje javascript. Dat deed voor mij een belletje rinkelen dat mijn project mogelijk ook vatbaar was voor SQL injection. Ik deed zelf de test, en inderdaad: het was vatbaar. Ik kon bijvoorbeeld de tabel nieuwsbriefclicks wijzigen door proberen in te loggen met de gebruikersnaam: '; update nieuwsbriefclicks set clicks = clicks + 10000 -Toen heb ik een functie aan de Databank-klasse toegevoegd die dit misbruik tegenhoudt met behulp van prepared statements. Hierbij wordt iedere parameter in de SQL query gecontroleerd en kan er geen SQL injection meer plaatsvinden.
Realisatie
37
Telerik RadControls Voor mijn stageopdracht heb ik gebruik kunnen maken van dit softwarepakket dat door Index aangekocht werd. Telerik RadControls voor ASP.NET AJAX is een collectie van webcontrols die gebouwd zijn bovenop het ASP.NET AJAX framework. Met die controls kun je functionaliteit en interactiviteit aan een webpagina toevoegen. Overzicht RadControls componenten
RadAjax Hiermee kun je AJAX applicaties maken zonder een enkele regel javascript te moeten schrijven. Je maakt hiervoor gebruik van Callback panels en Trigger settings.
RadCalendar Met deze input-control kan de gebruiker een datum kiezen op een gebruiksvriendelijke manier.
RadChart Hiermee kun je data weergeven door middel van een grafiek. Het is mogelijk om verschillende series toe te voegen, al dan niet van hetzelfde type.
RadColorPicker Dit is een input-control waarmee de gebruiker een kleur kan kiezen uit een volledig configureerbaar kleurenpallet.
RadCombobox Dit is een combobox met uitgebreide functionaliteit: Zo kan je dynamisch gegevens laten inladen, en is het mogelijk om auto-complete in te stellen.
RadDock Deze control laat je toe om panelen te maken die voor de gebruiker verplaatsbaar en wijzigbaar in formaat zijn. Het is ook mogelijk om de aangepaste layout van een pagina met verschillende dergelijke panelen op te slaan en te herladen.
RadToolBar Hiermee kun je toolbars maken met knoppen die zich gedragen alsof het een toolbar is uit een desktopapplicatie.
RadFormDecorator Deze control voeg je toe aan een pagina om het uiterlijk van je formulieren te verbeteren. Zonder een regel code te schrijven pas je stijlen toe aan knoppen, inputvelden enzovoort.
Realisatie
38
RadEditor Dit is een control die een volledige WYSIWYG (What You See Is What You Get) HTML editor bevat. Zo hebben gebruikers geen technische kennis nodig om een tekst met een HTML layout te maken.
RadGrid Hiermee kun je data weergeven in tabelvorm op een klassieke manier of in de stijl van een Outlook Grid. Daarnaast is er ook nog Drag&Drop functionaliteit beschikbaar.
RadInput Deze control laat geavanceerde input technieken toe. Het is ook de basis van verschillende andere Rad input-controls.
RadMenu Hiermee kun je menu's aan je webpagina's toevoegen die er niet alleen goed uit zien maar ook gelijkwaardige functionaliteit bieden ten opzichte van zijn desktop-varianten.
RadScheduler Met deze control kan een gebruiker op een eenvoudige manier taken bekijken, toevoegen, wijzigen of verwijderen op een kalender.
RadSlider Dit is een schuifbalk die uitgebreid geconfigureerd kan worden, met een vloeiende schuifknop of volgens vooraf gedefiniëerde stappen.
RadPanelBar Deze control biedt een menu langs de linker- of rechterzijde in een Outlook-stijl, waarbij de menu's in en uit elkaar geklapt kunnen worden.
RadSpell Hiermee kun je een spellingschecker toevoegen aan gelijk welke input-control. De spellingschecker kan in meer dan 20 verschillende talen werken, waaronder ook het Nederlands.
RadSplitter Met splitters kun je verschillende gebieden in de layout van elkaar scheiden of interactief van grootte veranderen.
RadToolTip Deze control maakt gebruik van de OnMouseOver gebeurtenis om gedetailleerde informatie of een formulier weer te geven voor het onderliggende item.
Realisatie
39
RadTrieview Dit is een control waarmee een boomstructuur kan weergegeven worden op een efficiënte manier. Het control biedt ook de functionaliteit om dynamisch gegevens in te laden.
RadUpload Dit is een gespecialiseerd file-upload component. Het geeft de gebruiker de mogelijkheid één bestand of meerdere bestanden tegelijk te uploaden.
RadWindow Hiermee kun je de bekende javascript alert/prompt/confirm pop-ups vervangen door een beter vormgegeven versie, die volledig configureerbaar is.
RadTabStrip Dit component biedt de functionaliteit om tabbladen te creëren in je webpagina's.
Realisatie
40
Pagina's Login ➢
Login pagina (Login.aspx)
Use-case nummer: 1 Deze pagina krijgt de gebruiker te zien wanneer hij/zij naar http://stats.6minutes.be surft. Indien de gebruiker rechtstreeks naar een statistiek pagina probeert te surfen zal hij verwezen worden naar deze pagina. De gebruiker dient eerst zijn gebruikersnaam en wachtwoord correct in te vullen om in te loggen. Invoer
Uitvoer Als de login gegevens correct waren komt de gebruiker nu op een overzichtspagina terecht. Hier wordt afhankelijk van zijn rechten een lijst van statistieken en rapporten weergegeven die hij kan raadplegen. Zo kan een adverteerder enkel de rapporten in verband met zijn advertenties zien en een medewerker enkel de rapporten ivm. zijn/haar artikels. Een beheerder heeft rechten tot alle statistieken en rapporten. Indien de login gegevens foutief ingevuld werden krijgt de gebruiker een foutmelding te zien:
Realisatie
41
Tracking nieuwsbrieven ➢
Tracking openen nieuwsbrieven in editie (TrackingOpenenNieuwsbrieven.aspx)
Use-case nummer: 7 Met deze pagina kan een beheerder de evolutie van een bepaalde nieuwsbrief editie over een bepaalde periode volgen, met name per uitgave de oplage en het aantal keer dat de nieuwsbrief geopend werd. Invoer
Uitvoer
Er kan gesorteerd worden op volgnummer, datum, oplage, geopend, geopend (uniek) en geopend percentage. De gegevens kunnen geëxporteerd worden naar Excel of Pdf.
Realisatie
42
Naast de tabulaire weergave is er voor dit onderdeel ook een grafische voorstelling voorzien. Deze werd gerealiseerd met behulp van het Telerik RadControls: RadChart component. De meeste instellingen van het RadChart component kunnen gemaakt worden via de grafische interface. Voor het aantal verzonden (oplage) en het aantal geopende nieuwsbrieven worden series toegevoegd van het type “StackedArea”. De dynamische opvulling gebeurt aan de hand van de hieronder staande code. dtNieuwsbrieven is hier de DataTable met de brongegevens. Code: // Geen labels weergeven als er meer dan 12 nieuwsbrieven zijn. bool showLabels = (dtNieuwsbrieven.Rows.Count > 12); RadChartGrafiek.Series[0].ShowLabels = RadChartGrafiek.Series[1].ShowLabels = showLabels; // De volgnummer volgorde omdraaien door een DataView te maken en opnieuw te sorteren: DataView dv = new DataView(dtNieuwsbrieven); dv.Sort = "volgnr asc"; // Elke nieuwsbrief wordt aan de grafiek toegevoegd: // Enkele casts zijn nodig omdat de velden als decimal in de databank staan. foreach (DataRowView row in dv) { int geopend = (int)(decimal)row["clicksuniek"], oplage = (int)(decimal)row["oplage"]; // Toevoegen van het volgnummer label op de x-as: RadChartGrafiek.XAxis.AddItem(((decimal)row["volgnr"]).ToString()); // Items toevoegen tot de series: RadChartGrafiek.Series[0].AddItem(geopend); RadChartGrafiek.Series[1].AddItem(oplage - geopend), oplage.ToString()); // De waarde voor de 2de serie (Nieuwsbrieven verzonden) is (oplage – geopend) hoger // op de grafiek (= 1ste parameter) en krijgt de oplage als label (= 2de parameter). }
Het resultaat:
Realisatie
43
➢
Tracking openen alle nieuwsbrieven (TrackingOpenenAlleNieuwsbrieven.aspx)
Use-case nummer: 8 Met deze pagina kan een beheerder een vergelijking maken tussen de verschillende nieuwsbrief edities over een bepaalde periode: het aantal verzonden nieuwsbrieven, de totale verspreiding en het totaal aantal keer dat de nieuwsbrieven geopend werden. Invoer
Uitvoer
Er kan gesorteerd worden op oplage, frequentie, verspreiding, geopend, geopend (uniek) en geopend percentage. Er worden totalen gemaakt voor al deze kolommen uitgezonderd oplage. De gegevens kunnen geëxporteerd worden naar Excel of Pdf.
Realisatie
44
Tracking artikels ➢
Tracking Artikels per auteur (StatsArtikelsAuteurRubriek.aspx)
Use-case nummer: 9 Met deze pagina kan men raadplegen hoe vaak artikels die gepubliceerd werden binnen een bepaalde periode op de website bekeken werden. Een beheerder heeft de mogelijkheid om dit voor alle rubrieken te bekijken, terwijl een medewerker dat enkel kan voor de rubrieken waarvoor hij zelf een artikel geschreven heeft. Invoer
Uitvoer
Er kan gesorteerd worden op auteur, datum, dagen sinds publicatie en views. De gegevens kunnen geëxporteerd worden naar Excel of Pdf.
Realisatie
45
➢
Tracking Artikels: auteur overzicht (StatsArtikels.aspx)
Use-case nummer: 10 Met deze pagina kan per taal per auteur bekeken worden hoeveel artikels zij geschreven hebben en hoe vaak deze bekeken werden over een bepaalde periode. Een beheerder heeft de mogelijkheid om dit voor alle rubrieken te bekijken, terwijl een medewerker dat enkel kan voor de rubrieken waarvoor hij zelf een artikel geschreven heeft. Invoer
Uitvoer
Er kan gesorteerd worden op aantal artikels, aantal views en gemiddeld aantal views. De gegevens kunnen geëxporteerd worden naar Excel of Pdf. Realisatie
46
Tracking advertenties en clicks ➢
Tracking advertenties (TrackingAds.aspx)
Use-case nummer: 11 Op deze pagina kan voor een bepaalde adverteerder over een bepaalde periode bekeken worden hoeveel clicks er zijn geweest per landingpage per editie. Daarnaast worden hier ook de oplage en het aantal keer geopend voor iedere nieuwsbrief getoond, en de verhouding van clicks op de oplage. Een adverteerder kan enkel zijn eigen tracking gegevens bekijken, terwijl een beheerder dit voor alle adverteerders kan. Invoer
Uitvoer
Er kan gesorteerd worden op datum, editie, volgnummer, oplage, geopend, clicks en clicks op oplage. De gegevens kunnen geëxporteerd worden naar Excel of Pdf.
Realisatie
47
➢
Tracking advertenties per dag (TrackingAdsDagelijks.aspx)
Use-case nummer: 12 Op deze pagina kan bekeken worden hoe vaak er per dag geklikt is geweest op de landingpages van een adverteerder over een bepaalde periode en voor een bepaalde editie of voor alle edities samen. Een adverteerder kan enkel zijn eigen tracking gegevens bekijken, terwijl een beheerder dit voor alle adverteerders kan. Invoer
Uitvoer
De gegevens kunnen geëxporteerd worden naar Excel of Pdf.
Realisatie
48
➢
Tracking advertenties opdrachtnieuwsbrieven (TrackingAdsOpdrachtNB.aspx)
Use-case nummer: 13 Op deze pagina kan voor een bepaalde opdrachtnieuwsbrief over een bepaalde periode bekeken worden hoeveel clicks er zijn geweest per landingpage per editie. Daarnaast worden hier ook de oplage en het aantal keer geopend voor iedere nieuwsbrief getoond, en de verhouding van clicks op de oplage. Deze pagina is enkel toegankelijk voor beheerders. Invoer
Uitvoer
Er kan gesorteerd worden op datum, volgnummer, oplage, geopend, clicks en clicks op oplage. De gegevens kunnen geëxporteerd worden naar Excel of Pdf.
Realisatie
49
➢
Clicks domeinen 6minutes en partnersites (TrackingAdsPartnersites.aspx)
Use-case nummer: 14 Op deze pagina kan voor een bepaald domein of combinatie van domeinen over een bepaalde periode bekeken worden hoeveel clicks er zijn geweest naar deze domeinen voor een bepaalde editie of voor alle edities samen. Daarnaast worden hier ook de oplage en het aantal keer geopend voor iedere nieuwsbrief getoond, en de verhouding van clicks op de oplage. De domeinen kunnen door de beheerder ingesteld worden (zie p. 57). Deze pagina is enkel toegankelijk voor beheerders. Invoer
Uitvoer
Er kan gesorteerd worden op datum, editie, volgnummer, oplage, geopend, clicks en clicks op oplage. De gegevens kunnen geëxporteerd worden naar Excel of Pdf.
Realisatie
50
Abonnees en abonnementen ➢
Overzicht abonnees (AbonneesOverzicht.aspx)
Use-case nummer: 15 Deze pagina biedt een overzicht op de abonnees: het aantal abonnnees per taal per editie en een overzicht van abonnees per land. Deze pagina is enkel toegankelijk voor beheerders. Uitvoer Overzicht abonnees per taal per editie:
Overzicht abonnees per land:
Realisatie
51
➢
Abonnees activiteit (AbonneesActiviteit.aspx)
Use-case nummer: 16 Met deze pagina kan bekeken worden hoeveel actieve abonnementen van andere edities de abonnees van een bepaalde editie hebben. Deze pagina is enkel toegankelijk voor beheerders. Invoer
Uitvoer
Realisatie
52
➢
Overlappende abonnees per editie (AbonneesAbonnementen.aspx)
Use-case nummer: 17 Met deze pagina kan bekeken worden hoeveel abonnees van een bepaalde editie ook abonnee zijn op de andere edities. Vb: 90% van de abonnees voor editie A is ook abonnee voor editie B. Deze pagina is enkel toegankelijk voor beheerders. Invoer
Uitvoer
Realisatie
53
➢
Profielkenmerken abonnees (AbonneesProfiel.aspx)
Use-case nummer: 18 Op deze pagina kan een beheerder een rapport van de profielkenmerken van een bepaalde editie downloaden. Invoer
Uitvoer Het volledig rapport kan hier niet in detail weergegeven worden.
Gebeurtenissen ➢
Statistieken gebeurtenissen (StatsGebeurtenissen.aspx)
Use-case nummer: 19 Op deze pagina kan een beheerder raadplegen hoe vaak elke gebeurtenis op de website bekeken is. Uitvoer
Er kan gesorteerd worden op datum, gebeurtenis en views.
Realisatie
54
Integratie met CIM ➢
CIM statistieken (CIMstats.aspx en CIMstatsDetails.aspx)
Use-case nummer: 22 Met deze pagina's kan een beheerder voor elk keyword op de website bekijken hoe het aantal bezoekers, bezoeken en paginaverzoeken evolueert per dag of per maand. De manier waarop deze gegevens opgehaald worden, wordt verder uitgelegd op p. 62. Eerst moet de gebruiker een keyword aanduiden die in de laatste zeven dagen in de statistieken voorkwam of moet hij het keyword in het archief opzoeken:
Vervolgens kan de gebruiker een periode aanduiden waarvoor de dagelijkse evolutie moet weergegeven worden, of kan hij/zij de maandelijkse evolutie weergeven.
Realisatie
55
De dagelijkse evolutie:
De maandelijkse evolutie:
Realisatie
56
Beheer ➢
Beheer CIM toegang (BeheerCIM.aspx)
Use-case nummer: 3 Op deze pagina kan een beheerder de CIM login gegevens wijzigen. Deze login wordt gebruikt om de website statistieken gemeten door MetriWeb te downloaden uit een beveiligde web directory en deze te verwerken. De login gegevens worden maandelijks door CIM gewijzigd en de beheerder ontvangt hiervoor maandelijks een e-mail met de nieuwe login. Invoer
➢
Beheer domeinen sites en partnersites (BeheerSites.aspx)
Use-case nummers: 4, 5 en 6 Met deze pagina kan een beheerder partnersites definiëren en hun domeinen opgeven. Voor die partnersites kan dan gekeken worden hoeveel clicks er waren vanuit de nieuwsbrieven (zie p. 50).
Site toevoegen:
Realisatie
Site domeinen toevoegen of verwijderen:
57
De partnersites en hun domeinen worden in XML formaat opgeslaan. Code: <sites> <site naam="Diskidee"> <domein>diskidee.be <site naam="Wijnidee"> <domein>wijnidee.be <site naam="6minutes"> <domein>6minutes.be <domein>6minutes.net
Overige ➢
Tracking clicks op 6minutes links (TrackingClicks6Minutes.aspx)
Use-case nummer: 21 Met deze pagina kan een beheerder het absolute en relatieve aantal clicks uit nieuwsbrieven naar de verschillende 6minutes onderdelen over een bepaalde periode raadplegen. Invoer
Uitvoer
De gegevens kunnen geëxporteerd worden naar Excel of Pdf.
Realisatie
58
Windows Service Algemeen Een Windows Service is een programma dat op de achtergrond draait op een Microsoft Windows systeem, waarbij er geen interactie met de gebruiker nodig is om het programma naar behoren uit te voeren. Om verschillende redenen die u verder in dit hoofdstuk leest, werd het nodig om voor het stats.6minutes.be project zo'n service te maken, een programma dat periodiek enkele taken kan afhandelen die te lang zouden duren om realtime te doen wanneer de gebruiker het vraagt. Een Windows Service maken in .NET is relatief gemakkelijk. Jammergenoeg bevatten de express edities van Visual Studio geen template hiervoor, maar gelukkig zijn er genoeg voorbeeldservices van het internet te plukken. De basis van een Windows Service bestaat uit een WindowsService klasse gebaseerd op de klasse ServiceBase, en een WindowsServiceInstaller klasse gebaseerd op de klasse Installer. Op deze pagina ziet u een simpel voorbeeld van zo'n WindowsService klasse en op de volgende pagina een WindowsServiceInstaller klasse. Code: class WindowsService : ServiceBase { public WindowsService() { this.ServiceName = "VoorbeeldService"; // De naam van de service this.EventLog.Log = "Application"; // Het logboek waarin foutmeldingen moeten komen this.CanHandlePowerEvent = false; this.CanHandleSessionChangeEvent = false; this.CanPauseAndContinue = true; this.CanShutdown = true; this.CanStop = true; } static void Main() { ServiceBase.Run(new WindowsService()); } protected override void Dispose(bool disposing) { base.Dispose(disposing); } protected override void OnStart(string[] args) { // Hier code plaatsen die moet uitgevoerd worden wanneer de service wordt gestart. base.OnStart(args); } protected override void OnStop() { // Hier code plaatsen die moet uitgevoerd worden wanneer de service wordt stopgezet. base.OnStop(); } protected override void OnPause() { // Hier code plaatsen die moet uitgevoerd worden wanneer de service wordt gepauzeerd. base.OnPause(); } protected override void OnContinue() { // Hier code plaatsen die moet uitgevoerd worden wanneer de service wordt voortgezet. base.OnContinue(); } }
Realisatie
59
Code: [RunInstaller(true)] public class WindowsServiceInstaller : Installer { public WindowsServiceInstaller() { ServiceProcessInstaller serviceProcessInstaller = new ServiceProcessInstaller(); ServiceInstaller serviceInstaller = new ServiceInstaller(); // De service starten met de SYSTEM-account: serviceProcessInstaller.Account = ServiceAccount.LocalSystem; serviceProcessInstaller.Username = null; serviceProcessInstaller.Password = null; serviceInstaller.StartType = serviceInstaller.DisplayName serviceInstaller.Description serviceInstaller.ServiceName
ServiceStartMode.Automatic; = "Naam van de service"; // = "Voorbeeld beschrijving"; = "VoorbeeldService"; // De
// Automatisch opstarten Weergeefnaam van de service // Beschrijving v/d service naam van de service
this.Installers.Add(serviceProcessInstaller); this.Installers.Add(serviceInstaller); } }
Uiteraard zal deze voorbeeldservice niets uitvoeren. Om de service periodiek programmacode te laten uitvoeren kunnen timers gemaakt worden die bij het aflopen een callback methode oproepen. Met deze methode kun je dan bijvoorbeeld instanties maken van klasses om bepaalde programmacode uit te voeren, en eventueel de timer opnieuw instellen. Eens gecompileerd kan de service geïnstalleerd en gedeïnstalleerd worden met behulp van eenvoudige batch scripts. Als de service geïnstalleerd is moet het installatiescript niet opnieuw worden uitgevoerd, de service stopzetten als deze loopt, het uitvoerbaar bestand vervangen door de nieuwe versie en dan de service opnieuw opstarten is voldoende. Code: REM Voorbeeld service-installatiescript @ECHO OFF "%SystemRoot%\Microsoft.NET\Framework\v2.0.50727\InstallUtil" "VoorbeeldService.exe"
REM Voorbeeld service-deïnstallatiescript @ECHO OFF "%SystemRoot%\Microsoft.NET\Framework\v2.0.50727\InstallUtil" /u "VoorbeeldService.exe"
Realisatie
60
Implementatie Tracking nieuwsbrieven samenvatten Één van de beperkingen die het tracking systeem voor nieuwsbrieven had, was dat de gegevens in de databank gewoon te veel plaats innamen. Daardoor onstond de noodzaak om telkens als de databank “vol” zat (lees: te veel ruimte in nam) er een deel van de gegevens moest worden gewist. Al deze gegevens bleven echter bewaard in een offline Access databank (zie p. 65 Verwerking oude databank gegevens). Om de oude tracking gegevens te kunnen blijven gebruiken werd er besloten om een extra tabel toe te voegen aan de databank die enkel de samengevatte gegevens bijhoudt. Hierbij komt de service van pas om dagelijks (specifiek: om middernacht) die tracking gegevens uit te lezen en de samenvattingstabel hiermee te updaten. Concreet worden elke dag het aantal openingen en het aantal unieke openingen van elke nieuwsbrief opgeteld en bijgeteld bij het samenvattingsrecord voor de betreffende nieuwsbrief. Het aantal openingen is het totaal aantal keer dat een nieuwsbrief werd geopend, terwijl het aantal unieke openingen overeenkomt met het aantal abonnees dat op die dag de nieuwsbrief geopend heeft. Het systeem werkt op die manier dat het niet uitmaakt wanneer de service één of meerdere dagen niet loopt, zodat er geen problemen ontstaan bij een eventuele downtime. Zo wordt er per nieuwsbrief een datum bijgehouden die weergeeft wanneer de samenvattende gegevens het laatst geüpdatet werden. Een voorbeeld-illustratie van het samenvattingsproces: De TrackEML-tabel (nieuwsbrief tracking tabel) Nieuwsbriefid Abonneeid Datum
...
De NieuwsbriefClicks-tabel (samenvattingstabel) Nieuwsbriefid Clicks Clicksuniek LaatsteUpdate
1
1
(vandaag)
1
5.000 4.000
(gisteren)
1
2
(vandaag)
2
4.000 3.500
(gisteren)
1
3
(vandaag)
3
3.000 2.200
(gisteren)
1
1
(vandaag)
2
2
(vandaag)
2
3
(vandaag)
2
3
(vandaag)
Samenvatten tracking
Nieuwsbriefid Clicks Clicksuniek LaatsteUpdate
Realisatie
1
5.004 4.003
(vandaag)
2
4.003 3.502
(vandaag)
3
3.000 2.200
(gisteren)
61
Ophalen CIM keyword-statistieken MetriWeb is een meetinstrument van CIM die onder meer iedere dag het aantal bezoekers, bezoeken en paginaverzoeken meet per keyword van de website. Elke dag rond de middag wordt een volledig rapport van de vorige dag online gezet op een beveiligde web directory. Dit rapport is beschikbaar in ASCII (.txt), PDF en in XML formaten. De service download telkens het rapport in XML formaat en voegt de eerdervermelde gegevens (visitors/visits/pagerequests) van elk keyword toe aan een lokaal bestand. Deze kunnen dan gebruikt worden om de evolutie van de gegevens te volgen (zie p. 55 - 56). Het systeem is voorzien op een downtime van maximaal 20 dagen: d.w.z. dat de service steeds zal kijken of de gegevens van elk van die laatste 20 dagen beschikbaar zijn en indien ze niet beschikbaar zijn, ze zal proberen te downloaden. De brongegevens zijn als volgt in het XML rapport terug te vinden. De werkelijke cijfers zijn in dit voorbeeld verwijderd en vervangen door “#WAARDE#”. result <customer>minutes 2008 <month>05 20 ... <page_list id="part_5"> #WAARDE# #WAARDE# <page_requests value="absolute">#WAARDE# #WAARDE# #WAARDE# <page_requests value="absolute">#WAARDE# #WAARDE# #WAARDE# <page_requests value="absolute">#WAARDE# #WAARDE# #WAARDE# <page_requests value="absolute">#WAARDE# ... ...
De gegevens worden dan in een ietwat beknopter formaat toegevoegd aan het lokaal bestand: <stat date="2008-05-20"> <page keyword="A_la_carte" visitors="#WAARDE#" visits="#WAARDE#" page_requests="#WAARDE#" /> <page keyword="Ardennen" visitors="#WAARDE#" visits="#WAARDE#" page_requests="#WAARDE#" /> <page keyword="Auto" visitors="#WAARDE#" visits="#WAARDE#" page_requests="#WAARDE#" /> <page keyword="BOOTmagazine" visitors="#WAARDE#" visits="#WAARDE#" page_requests="#WAARDE#" /> ... <stat date="2008-05-19"> ... ...
Realisatie
62
Genereren rapporten van het abonneeprofiel Één van de functionele eisen was het weergeven van een verdeling van profielkenmerken per nieuwsbrief editie per taal. Jammergenoeg bleek het niet mogelijk om dergelijke rapporten realtime weer te geven op de website aan een acceptabele snelheid. Daarom werd besloten om het genereren van deze rapporten over te laten aan de Windows Service. Laatstgenoemde genereert dus dagelijks (specifiek: om middernacht) de rapporten voor elke nieuwsbrief editie en maakt deze beschikbaar voor de website. De oude versies worden telkens overschreven. Het genereren van de rapporten kan vele minuten in beslag nemen, maar doordat dit 's nachts uitgevoerd wordt, vormt dat niet echt een probleem omdat de internet traffiek dan lager ligt dan overdag. iTextSharp De rapporten worden gegenereerd in PDF formaat, en dit wordt afgehandeld door de iTextSharp bibliotheek. iTextSharp is een .NET poort van iText, een open source java bibliotheek. iTextSharp kan dus dynamisch PDF's opbouwen vanuit programmacode. Enkele van de mogelijkheden zijn het invoegen van paragrafen, lijsten, hoofd- en voetteksten, tabellen, afbeeldingen, andere grafische objecten etc. Hieronder ziet u een voorbeeld van het aanmaken van een Pdf met een paragraaf. Code: // Een nieuw A4 document creëren met marges van 25 punt: Document doc = new Document(PageSize.A4, 25F, 25F, 25F, 25F); // Een filestream koppelen aan het document: PdfWriter.GetInstance(doc, new FileStream(pdfPath + naam + ".pdf", FileMode.Create)); // Het document openen: doc.Open(); // Een paragraaf toevoegen met de tekst "Hello World!" in het lettertype Helvetica punt 12: Font font = FontFactory.GetFont(Font.HELVETICA, 12F, Color.BLACK); Paragraph paragraph = new Paragraph("Hello world!", font); doc.Add(paragraph); // Het document sluiten: doc.Close();
PieChart Het was wenselijk om ook een grafische voorstelling te hebben van de profielkenmerken. Ik ging dan op zoek naar een manier om taartdiagrammen aan de rapporten toe te voegen. Veel van de bibliotheken en codevoorbeelden voldeden echter niet aan de eisen. Zo bleek het maximaal aantal items die in de taart konden toegevoegd worden vaak te beperkt. Daarnaast moest de taart een ovale vorm hebben om de ruimte in het rapport optimaal te benutten. Hier kwamen veel bibliotheken (inclusief de .NET methode DrawPie) tekort door de hoeken van de scheidingslijnen niet correct aan te passen, zoals in de onderstaande afbeelding wordt gedemonstreerd:
Realisatie
63
De bibliotheek die het beste voldeed aan de eisen was PieChart, deze ondersteunt in principe oneindig veel items zolang je even veel verschillende kleuren meegeeft, geeft ovale taarten correct weer en ziet er bovendien niet mis uit, mits het goed geconfigureerd wordt. Een voorbeeld van het resultaat:
Realisatie
64
Verwerking oude databank gegevens Probleemstelling Omdat de gegevens van de nieuwsbrieftracking te veel plaats in beslag nemen om blijvend op de server te houden was er noodzaak om telkens een deel van deze gegevens te verwijderen, hoewel er steeds eerst een offline backup hiervan gemaakt werd. Het probleem kwam al eerder aan bod en dit werd opgelost door de trackinggegevens dagelijk samen te vatten (zie p. 61). Het lag voor de hand om de oude offline tracking gegevens ook te verwerken en deze in de samenvattingsgegevens op te nemen.
Verwerken tot samenvattingsgegevens De oude tracking gegevens waren opgeslagen in een MDB-bestand: een Access databank. Op zich is dat geen enkel probleem omdat er met het .NET platform prima gewerkt kan worden met databanken van dit bestandsformaat. In eerste instantie ben ik dus beginnen werken aan een programma om de trackinggegevens uit dit MDB-bestand samen te vatten. Ik kreeg al snel het deksel op de neus toen ik merkte dat de mogelijkheden met SQL op een Access databank wel erg beperkt waren ten opzichte van wat ik gewoon was met MS SQL Server. Dit struikelblok kon ik nog wel overwinnen maar toen ik zag hoe slecht de performantie was bij het testen van SQL queries werd mij duidelijk dat ik naar een andere oplossing moest uitkijken: Een Access databank is duidelijk niet gemaakt om met enkele miljoenen records te werken. Oplossing: converteren MDB naar MSSQL De oplossing was simpel: converteren van het MDB bestand naar een lokale MS SQL Server Express databank. Hiervoor gebruikte ik een programma genaamd “Full Convert Enterprise”. De gebruikte trial versie liet een watermerk achter op tekstvelden van de geconverteerde tabellen. Gelukkig had ik enkel de cijfergegevens nodig, en die bleven intact. Eens het converteren voltooid was kon er vlot gewerkt worden met de gegevens in tegenstelling tot bij de Access-databank, en was het samenvatten van de trackinggegevens een fluitje van een cent.
Realisatie
65
Databankoptimalisatie Toen mijn stagebegeleider tussentijds op stagebezoek kwam merkte hij op dat het uitvoeringsplan van een SQL query met de SQL Management Studio kon bekeken worden. Met dit plan kan je exact zien op welke manier de MS SQL Server aan het resultaat van een query komt, en aan welke onderdelen het meeste tijd besteed wordt. Hierdoor kan je ontdekken of er velden zijn waar eigenlijk een index moet op geplaatst worden om de query vlot te laten uitvoeren. Zo bleek dat het plaatsen van enkele indexen trackinggegevens de uitvoeringstijd van de zwaardere SQL queries sterk te verkorten. Hieronder ziet u het verschil in performantie op een query met en zonder een index op het veld Nieuwsbriefid in de TRACKURL-tabel. MET index:
ZONDER index:
Zoals u ziet duurt de query vier seconden zonder index en nog geen seconde met een index! De keerzijde van indexeren? Het toevoegen van de indexen op de trackinggegevens tabellen bleek de server ook extra te belasten doordat aan deze tabellen constant nieuwe records worden toegevoegd.
Jammergenoeg heb ik niet de tijd gehad om dit verder te onderzoeken in de duur van mijn stageperiode, om te zoeken naar een oplossing die zowel bevorderlijk is voor de server-load en voor de snelheid bij het gebruik van de gegevens in zware SQL queries.
Realisatie
66
Conclusie Ik vond mijn stage een zeer leerrijke ervaring. Wat mij vooral zal bijblijven is dat ik bij een project zoals deze eigenlijk veel meer vragen moet stellen bij de functionele eisen. In de twee eerste weken van mijn stage heb ik zo bijvoorbeeld enkele dingen gemaakt die uiteindelijk niet nuttig bleken te zijn en overbodig waren, doordat bepaalde dingen voor mij nog onduidelijk waren en ik niet goed wist wat er verwacht werd. Gelukkig werd ik op het goede spoor gezet door de uitstekende feedback en uitleg die ik kreeg van de opdrachtgever Toon Lowette. Wat betreft de realisatie van de stageopdracht denk ik dat ik mag zeggen dat dat geslaagd is, en de feedback die aan mij gegeven was, was ook erg positief. Toch zijn er nog tal van ideeën die zich geen weg hebben kunnen banen tot het eindresultaat van mijn stage, wat ik wel jammer vind. Daarnaast kunnen enkele onderdelen van de stats.6minutes.be website ook nog verder verfijnd worden. Naar de technische uitwerking toe ben ik blij dat ik heb kunnen kennismaken met Telerik RadControls, die ASP.NET applicaties mogelijk maakt die ik eerder niet voor mogelijk hield, terwijl de programmatie hierachter tot mijn verbazing vrij gemakkelijk is. Ook het gebruik en het experimenteren met andere softwarebibliotheken zoals iTextSharp vond ik zeer interessant, en het zorgde voor een goede afwisseling binnen het project.
Conclusie
67
Kritische reflectie Algemeen De mensen van Index NV hebben mij goed ontvangen. Ik ben blij met de ervaring die ik er gehad heb en ik zou het bedrijf zeker willen aanraden als zij in de toekomst opnieuw een stageplaats zouden voorzien. Naar de school toe wil ik zeggen dat de opleiding een goede basis aanleert en in mijn geval een goede voorbereiding was op mijn stageopdracht en wellicht ook op mijn verdere carrière.
Wat ik anders zou willen gedaan hebben Ik denk dat de hoofddoelstellingen van de stageopdracht bereikt werden. Maar aan sommige zaken heb ik achteraf gezien te weinig tijd besteed terwijl ik in sommige minder belangrijke zaken te veel tijd gestoken heb. Iets wat ik mijns inziens te weinig gedaan heb is het integreren van de verschillende pagina's met elkaar. Zo ontbreekt er bijvoorbeeld een koppeling vanuit de pagina met het overzicht van auteurs naar de artikels voor een bepaalde auteur, waarvoor met de huidige site een andere pagina geopend moet worden vanuit het overzichtscherm. Verder heb ik spijt dat ik soms zelf te weinig geprogrammeerd heb en teveel berust heb op bestaande controls. Een voorbeeld daarvan is het gebruik maken van het GridView control: hoewel het vrij practisch is om gebruik te maken van deze control (met enkele uitzonderingen) zou het een grotere uitdaging geweest zijn om zelf een control met de nodige functionaliteit te programmeren. Het samenvatten van trackinggegevens, dat ook in dit dossier aan bod komt, is iets waar ik veel eerder aan had moeten beginnen. Pas in een later stadium van mijn stage drong het tot mij door dat dit echt wel een vereiste was. Doordat ik hieraan pas later aandacht schonk bleek een deel van de door mij geschreven code verloren moeite geweest te zijn, doordat het nog geen rekening hield met de aanwezigheid van de samengevatte gegevens.
Kritische reflectie
68
Bronnen ➢
Index: Fiscale databank, Webdevelopment, Intranetten: http://www.index.be/
➢
RadControls for ASP.NET AJAX: http://www.telerik.com/products/aspnet-ajax/overview.aspx
➢
SteveX Compiled » String Formatting in C#: http://blog.stevex.net/index.php/string-formatting-in-csharp/
➢
W3Schools Online Web Tutorials: http://www.w3schools.com/
➢
Keep ASP.NET ViewState out of ASPX Page for Performance Improvement: http://www.codeproject.com/KB/viewstate/ServerViewState.aspx
➢
Creating a Basic Windows Service in C#: http://www.codeproject.com/KB/system/WindowsService.aspx
➢
3D Pie Chart: http://www.codeproject.com/KB/graphics/julijanpiechart.aspx
➢
Timer Objects in Windows Services with C#.NET: http://www.aspfree.com/c/a/C-Sharp/Timer-Objects-in-Windows-Services-with-Csharp-dot-NET/
➢
iTextSharp – Tutorial: http://itextsharp.sourceforge.net/tutorial/index.html
Bronnen
69
Colofon Dit stageverslag werd uitgewerkt met behulp van:
Windows XP Professional
Visual Studio .NET 2005
Paint.NET
OpenOffice.org Writer
De lettertypes in dit document zijn:
Standaard: Cambria, 11 punt
Code: Lucida Console, 8 punt
Titelblad: Tahoma
Colofon
70
Voor akkoord verklaring
Voor akkoord verklaard:
Dhr. Pedro Decock
Stagementor
Dhr. Dirk Vandycke
Stagebegeleider
Voor akkoord verklaring
71