Inhoudsopgave
-Voorwoord
-DriverEasy
-Cursus Access Voor Beginners - Hoofdstuk 13
-Prijsvraag augustus 2012
-Laat zien wat je doet in de terminal
-Secunia houdt applicaties up-to-date
-Hallo Google! Welkom op mijn website!
-Virusscanners zien malware, bedoeld voor plunderen bankrekening, niet
-Zet je site in een directory en kom hoger in Google
-Postvak-in
 

De redactie bestaat uit:
profpc (Eindredacteur)
CorVerm
Dillondarko (Junior Redacteur)
Djoane
ErpCity
femke98
FooBar (Junior Redacteur)
jackall
OctaFish

Aan deze nieuwsbrief hebben ook meegewerkt:
Chris Vermeulen

De redactie is te bereiken op nieuwsbrief@helpmij.nl. Naar dit e-mailadres géén vragen sturen die betrekking hebben op computers en dergelijke. Deze horen op het forum geplaatst te worden.

Oplage
De nieuwsbrief wordt naar 28674 unieke e-mailadressen verstuurd. Deze e-mailadressen zijn via opt-in geselecteerd.

Adverteren
Indien u een advertentie wilt laten plaatsen in deze nieuwsbrief neem dan contact op met de redactie.

nod32 bestellen

Advertentie informatie aanvragen

Aan- en afmelden
Om u aan te melden voor de nieuwsbrief kunt u naar deze pagina gaan.
Wilt u de volgende uitgaven niet meer ontvangen, dan kunt u zich hier afmelden. Is deze nieuwsbrief naar u doorgestuurd en wilt u hem zelf ontvangen? Ga dan naar deze pagina en meldt u aan. U zult dan automatisch de volgende nieuwsbrief ontvangen.

Wilt u nog eens een artikel nalezen? Wanneer u lid van de vereniging bent, kunt u hier in oude nieuwsbrieven bladeren.

DISCLAIMER
Alle handels en/of productnamen hier vermeld, zijn eigendom van de respectievelijke eigenaars. De redactie van de Helpmij Nieuwsbrief gaat uiterst zorgvuldig te werk bij de vergaring, totstandkoming en publicatie van de informatie in de nieuwsbrief. Niettemin kunnen er geen rechten worden ontleend aan de inhoud van de nieuwsbrief en sluit de redactie iedere aansprakelijkheid uit voor eventuele gevolgen, waaronder begrepen directe en indirecte schade. Het toepassen van informatie en gebruik van software is voor eigen risico. De adressen van de abonnees zullen nimmer openbaar worden gemaakt en/of verkocht aan derden. Bij misbruik van het distributiesysteem van de nieuwsbrief door onbevoegden of een mogelijke storing, van welke aard dan ook, kan de redactie niet aansprakelijk gesteld worden voor eventuele daaruit voortvloeiende schade. Het is niet toegestaan om de inhoud, of delen daarvan, zonder voorafgaande schriftelijke toestemming te gebruiken.

De redactie heeft het recht om (ingezonden) bijdragen zonder opgaaf van redenen te weigeren, dan wel te wijzigen of in te korten.


Voorwoord

Auteur: profpc

Top

Veel mensen zijn nu nog op vakantie of zijn al op vakantie geweest. Misschien heerlijk genieten van wat zon met zomerse temperaturen. Hier in Nederland mochten we ook een aantal dagen genieten van wat mooie zomerse dagen. Hopelijk mogen we nog van wat mooie zomerse dagen genieten!

Deze editie van de Helpmij.nl nieuwsbrief is wat dunner dan gebruikelijk vanwege de zomervakantie. Zoals beloofd in ons vorige nummer is het vervolg van het Access-artikel in deze editie te vinden. Er zullen weer nieuwe technieken geleerd worden!

Vragen en opmerkingen die betrekking hebben op de nieuwsbrief kunnen altijd aan ons gesteld worden via nieuwsbrief@helpmij.nl

Veel plezier met het lezen van de nieuwsbrief!




DriverEasy

Auteur: CorVerm

Top

Soms worden er in de sectie Handige software programma’s ingediend die de moeite van het proberen waard lijken. In dit geval lijkt DriverEasy (gratis versie) zo’n programma en dus hebben we het getest. Voordat we bespreken wat DriverEasy doet en hoe het werkt is een waarschuwing zeker op z’n plaats. Natuurlijk is het handig dat dit programma checkt of je drivers up-to-date zijn, maar het ontslaat de gebruiker er niet van om enige vorm van oplettendheid te betrachten.

DriverEasy wil je best een handje helpen bij het downloaden en installeren van nieuwe drivers, maar daar zit nu juist het “gevaar” waar we rekening mee moeten houden. Dat is best wel logisch als je bedenkt dat het hier om een hulpprogramma gaat en bovendien wegen we hier ook de resultaten mee die uit de test gekomen zijn. We willen echt benadrukken dat je de gratis versie van DriverEasy als hulpprogramma zult moeten zien, want voor de meeste functionaliteiten zul je toch de betaalde versie moeten hebben.

Leuke opties (te vinden in het menu Extra) zoals in de afbeelding hieronder te zien zijn, zullen in de gratis versie helaas niet werken. Daar heb je dan de pro-versie voor nodig. Normaal kost de licentie $59,95, maar op het moment van schrijven was dat $29,95.

augustus 2012: drivereasy 1..jpg

Als het programma geïnstalleerd is, dat overigens in het Nederlands gebeurt, klik je in het hoofdmenu op de knop Scan nu. Het resultaat van de scan is een lijst met drivers die al dan niet up-to-date is, of van eventueel ontbrekende drivers.

augustus 2012: drivereasy 2..jpg

Nu kun je twee dingen doen, of je klikt op de knop Laad drivers of je klikt op de menuknop Download. Het moment dat je de drivers kunt downloaden is nu aangebroken en daarbij is gezonde dosis geduld onmisbaar.

augustus 2012: drivereasy 3..jpg augustus 2012: drivereasy 5..jpg

De afgebeelde schildpad is waarschijnlijk veel sneller dan de download. Dus geduld hebben is in deze een wel een heel schone zaak. We halen een snelheid van 37,1KB/s en we moeten 3,1 MB binnenhalen. Dat is nog een kleinigheid vergeleken bij een download van ruim 30 MB die ook in het lijstje te updaten drivers staat. Nou ja, dan hadden we het programma maar moeten kopen, want dan is de downloadsnelheid onbeperkt.

augustus 2012: drivereasy 6..jpg

Het begin is goed, maar niet heus. Met een klik op de knop Installeer verschijnt een venster dat ons de keus voorlegt, of de pro-versie aanschaffen om de optie Smart Install te kunnen gebruiken, of de installatie handmatig uit te voeren.

augustus 2012: drivereasy 4..jpg

Tegelijk wordt ons gemeld dat setup.exe in het driverpakket niet gevonden kan worden. Een niet echt geruststellende gedachte. Maar goed, we kiezen uiteraard toch voor de optie om handmatig te installeren en kijken wel waar het schip strandt. Dus na op Volgende geklikt te hebben opent zich de locatie waar het gedownloade bestand zich bevindt. In ons geval is dat: C:UsersCorVermAppDataRoamingEasewareDriverEasydriversgwwqtwpp.cu1. Helaas, de driver blijkt niet geschikt te zijn voor mijn Windows-versie en dat is toch wel een tegenvaller. Logisch, want als we het .exe-bestand bekijken blijkt die voor een 64-bit versie te zijn terwijl wij het met een 32-bit versie doen.

In ieder geval weten we heel zeker om welke driver het gaat: Intel G4 Express Chipset. Een bezoek aan de site van Intel leert dat er inderdaad een update voor de driver is. Wat rest is de update downloaden en installeren, zo simpel is dat.

We proberen er nog één en wel de driver voor Logicool.

augustus 2012: drivereasy 7..jpg

Om de vraag te ontlopen of we de pro-versie willen aanschaffen klikken we op het pijltje naast Installeer en gaan in het menu voor Open Bestand Locatie. Inderdaad vinden we daar de setup voor de nieuwe driver en in enkele ogenblikken is die geïnstalleerd.

We worden nu echt brutaal en downloaden de driver voor Realtek High Definition Audio. Ook de installatie van deze driver verloopt goed, zodat we opgelucht adem kunnen halen.

 augustus 2012: drivereasy 8..jpg

Als je wilt weten wat de specificatie van de nieuwe is klik dan op de naam van de hardware om het Driver Informatiescherm te openen.

Het valt op dat het “leeftijdsverschil” van de oude en nieuwe driver niet groot is. Slechts drie maanden. Wat ook opvalt is dat Microsoft de leverancier van de huidige driver is en Intel van de “nieuwe”. En ja, er zit ook verschil in het versienummer. Misschien helpt deze info of je een driver  wilt updaten of niet.

augustus 2012: drivereasy 9..jpg

Een gegeven paard mag je niet in de bek (mond) kijken. Het paard dat DriverEasy heet heeft niet al te veel rotte tanden of kiezen, maar iets meer functionaliteit had er wat ons betreft wel in mogen zitten. Hoewel, aan de andere kant doet het programma waar het in principe voor bedoeld is, het (razendsnel) scannen van drivers, het (uiterst langzaam) ophalen van nieuwe drivers.




Cursus Access Voor Beginners - Hoofdstuk 13

Auteur: OctaFish

Top

Een planningskalender maken

Een vraag die regelmatig terugkomt in het forum, is hoe je een kalender maandoverzicht kunt maken in Access met alle dagen in het overzicht, ongeacht of er gegevens zijn voor die dag. Die vraag is niet zo simpel te beantwoorden, omdat een database nu eenmaal werkt op basis van gegevens die in de tabel zijn opgeslagen. Je kunt makkelijk een overzicht maken van de dagen dat een persoon werkt, door in de tabel Planning te kijken welke dagen zijn ingevuld, maar zonder extra hulptabellen kun je niet laten zien op welke dagen die persoon er niet is. Daar heb je immers geen records voor. Hetzelfde probleem kom je tegen als je een Reserveringensysteem bouwt: je ziet wel wanneer een voorwerp is uitgeleend, maar niet de dagen dat het in huis is, en dus beschikbaar voor nieuwe verhuur.

We gaan in dit hoofdstuk een planningsrapport maken waarin we de bezettingsgraad van een kinderdagverblijf grafisch op een rapport weergeven. Het eindresultaat ziet er ongeveer zo uit:

augustus 2012: image002..jpg

In dit overzicht zie je per maand hoeveel kinderen er in de ochten aanwezig zijn, en hoeveel in de middag. Aan de hand van dit rapport is het dus eenvoudig om te bepalen hoeveel kinderen er nog bij kunnen, en hoeveel personeel je moet inzetten op een bepaald dagdeel van een bepaalde dag.

Als extraatje maken we het rapport met kolommen die zich in hoogte aanpassen aan de hoeveelheid personen, zodat je ook zonder de getallen kunt zien waar hoe de gegevens zich verhouden tot elkaar. Zo zie je in het voorbeeld heel snel dat de maandag ochtend beter bezet is als de vrijdag ochtend.

De voorwaarde: een hulptabel

Om zo'n rapport te kunnen maken, hebben we een tabel nodig met daarin de dagen die we terug willen zien in het overzicht. Die tabel heeft wat mij betreft twee varianten: ofwel een tabel met alle dagen van de week, ofwel een tabel met alleen werkdagen. Die laatste variant gebruik je bijvoorbeeld voor een personeelsplanning waarbij in het weekend niet gewerkt wordt. Dan hoef je die dagen uiteraard ook niet in het overzicht te zien.
De tabel die we op deze manier maken, gebruiken we later in een query die we gaan opzetten als een Cartesisch product. Deze term is in een van de eerste hoofdstukken ook al gevallen. Om het geheugen even op te frissen: dit is een query waarbij van een aantal tabellen alle mogelijke combinaties worden gemaakt. Heb je in tabelA 5 records, en in tabelB 12, dan zie je in het Cartesisch product van die twee 5 * 12  = 60 records terug.

Door in die query een filter aan te maken, hou je alleen de relevante combinaties over. En dat is dus wat we gaan doen met de Datum tabel.

De basisstappen

We hebben dus een extra tabel nodig met datums. Nu kun je een (arme) werkstudent inhuren en die een uurtje of wat datums laten inkloppen, maar dat kan natuurlijk veel simpeler, als we daar een functie voor gebruiken. Die functie kun je aanroepen vanaf een knop op een formulier bijvoorbeeld.

 augustus 2012: image003..png

Dit formulier kijkt naar de tabel met datums, en laat de eerste datum zien, en de laatste. De eerste is in dit geval niet interessant, maar de laatste dus wel, want je wilt als je de nieuwe datums toevoegt natuurlijk niet dat een datum er twee keer in komt te staan: de eerstvolgende nieuwe datum moet dan ook aansluiten bij de laatste.

Laten we eens kijken wat de knop precies doet.

Function DatumsToevoegen()

Dim iBegin As Long, iStart As Long, iEind As Long, iLaatsteDag As Long

Dim dtEind As Date

Dim iDD As Integer

Dim sDD(2) As String

    With CurrentDb.OpenRecordset("SELECT DISTINCT Max(CLng([Dag])) " _

        & "AS tmp FROM Datums;")

        On Error Resume Next

        If .RecordCount = 1 Then

            iLaatsteDag = .Fields("tmp").Value

        End If

        .Close

    End With

De functie begint (uiteraard zou ik ondertussen mogen zeggen) met het declareren van de variabelen die we nodig hebben. De matrixvariabele sDD heeft een vaste dimensie van twee; hierbij is in de algemene sectie wel Option Explicit 1 gedeclareerd; laat je deze regel weg, dan begint de matrix bij 0, en gebruik je de declaratie sDD(1) om twee dimensies vast te leggen.

Vervolgens wordt in een Recordset de hoogste waarde uit de tabel [Datums] opgehaald en toegewezen aan de variabele iLaatsteDag. Deze waarde wordt overigens gelijk al vertaald naar een getal, want we gaan de nieuwe datums baseren op de numerieke waarde van de datum. Vandaar dus Max(CLng([Dag])) als veld.

Daarna gaan we de begin- en einddatums bepalen die we willen toevoegen. Om het allemaal niet te ingewikkeld te maken, voegen we de datums per jaar toe. We hebben dus een startdatum nodig, en een einddatum. Deze worden ook weer aan variabelen toegewezen: iStart en iEind. In de volgende regel kijken we of de startdatum wel overeenkomt met de hoogste datum in de tabel (toegewezen aan de variabele iLaatsteDag). Voor het gemak behandel ik hier de variant die werkdagen aan de tabel toevoegt. Wil je alle dagen van de week, dan kun je de Do Until Weekday … Loop regels verwijderen. Deze lus controleert welke dag van de week de nieuwe dag is. Valt die op een zaterdag of zondag, dan moet de datum worden verhoogd, net zo lang tot het weer maandag is. Dan wordt ook de variabele iEind weer opnieuw gedefinieerd, want de startdatum zou nu in een volgend jaar kunnen liggen.

De Start- en Einddatum worden samengesteld met de functie DateSerial, waarin je op basis van een Jaartal, een Maandwaarde en een Dagwaarde een datum maakt.

    iStart = Clng(DateSerial(Year(Date), 1, 1))

    If iLaatsteDag > iStart Then

        iStart = iLaatsteDag + 1

        If Weekday(CDate(iStart), vbMonday) > 5 Then

            Do Until Weekday(CDate(iStart), vbMonday) = 1

                iStart = iStart + 1

            Loop

        End If

    End If

    iEind = CLng(DateSerial(Year(CDate(iStart)) + 1, 1, 1))   

Vervolgens begint het echte werk: het vullen van de tabel. Hiervoor wordt de tabel [Datums] geopend met een Recordset, en de records toegevoegd met .AddNew en .Update. Daarbij wordt het getal (we werken immers met getallen) terugvertaald naar een datum met de functie CDate.

Dit alles vindt plaats in een lus, die net zolang doorgaat tot de toe te voegen datum gelijk is aan de einddatum. Ook hier weer de variant met werkdagen, te herkennen aan de lus If Weekday(CDate(iStart), vbMonday) < 6. Wil je ook de zaterdagen, dan maak je er van: < 7, wil je alle dagen, dan kun je de lus verwijderen.

We gebruiken bovendien nog een extra lus om ook de dagdelen toe te voegen; elke dag heeft in het rapport een ochtendbezetting, en een middagbezetting, en die dagdelen moeten dus ook in de basistabel voorkomen. Hiervoor gebruiken we een vaste matrix variabele, die we vullen met de twee codes.

De matrix wordt als volgt gedeclareerd:

Dim sDD(2) As String

En we vullen hem als volgt:

    sDD(1) = "VM"

    sDD(2) = "NM"

    iBegin = iStart

    With CurrentDb.OpenRecordset("Datums")

        Do While iStart < iEind

            For iDD = 1 To 2

            ''If Weekday(CDate(iStart), vbMonday) < 6 Then

                .AddNew

                !Dag = CDate(iStart)

                !DagDeel = sDD(iDD)

                .Update

            ''End If

            Next iDD

            iStart = iStart + 1

        Loop

        .Close

    End With

    MsgBox "Datums " & CDate(iBegin) & " - " _

        & CDate(iEind - 1) & " toegevoegd."

End Function

De volledige code:

Dim iBegin As Long, iStart As Long, iEind As Long, iLaatsteDag As Long

Dim dtEind As Date

Dim iDD As Integer

Dim sDD(2) As String

   

    With CurrentDb.OpenRecordset("SELECT DISTINCT Max(CDbl([Dag])) AS LaatsteDag FROM Datums;")

        On Error Resume Next

        If .RecordCount = 1 Then

            iLaatsteDag = .Fields(0).Value

        End If

        .Close

    End With

    iStart = CDbl(DateSerial(Year(Date), 1, 1))

    iEind = CDbl(DateSerial(Year(Date) + 1, 1, 1))

    If iLaatsteDag > iStart Then

        iStart = iLaatsteDag + 1

        iEind = CDbl(DateSerial(Year(CDate(iStart)) + 1, 1, 1))

    End If

   

    sDD(1) = "VM"

    sDD(2) = "NM"

    iBegin = iStart

    With CurrentDb.OpenRecordset("Datums")

        Do While iStart < iEind

            For iDD = 1 To 2

            ''If Weekday(CDate(iStart), vbMonday) < 6 Then

                .AddNew

                !Dag = CDate(iStart)

                !DagDeel = sDD(iDD)

                .Update

            ''End If

            Next iDD

            iStart = iStart + 1

        Loop

        .Close

    End With

    MsgBox "Datums " & CDate(iBegin) & " - " & CDate(iEind - 1) & " toegevoegd."

End Function

Vervolgens wordt de tabel gesloten, en krijg je nog een samenvatting in een dialoogvenster.

Opzet van de query

Voordat we de definitieve query kunnen maken, moeten we eerst een andere query maken: een Union query. Kijk maar eens naar de brontabel die we gebruiken:

augustus 2012: image006..jpg

Hierin zie je een schema opgenomen van dagdelen waarop de verschillende kinderen aanwezig zijn met de data waarop ze het dagverblijf bezoeken. De dagdelen waarop de kinderen aanwezig zijn worden vastgelegd met selectievakjes, waarvan de naam bestaat uit de verkorte dagnaam (Ma, Di etc) en de term VM voor de ochtend, en NM voor de middag. [Do_VM] houdt dus in: Donderdag middag.

Om het rapport te kunnen maken op basis van een maandselectie, moeten we eerst een genormaliseerde tabel maken van deze tabel. Daarmee bedoel ik een tabel waarin elk specifieke veld slechts eenmaal voorkomt. De naam komt bijvoorbeeld een keer voor, en dat is dus een genormaliseerd veld. Maar de entiteit dagdelen (bestaande uit een dagnaam en een aanduiding voor voormiddag of namiddag), die allemaal apart vermeld zijn, is dat niet. Elk dagdeel heeft nu namelijk een eigen veld. In een ideale situatie (genormaliseerde tabel) hebben we één veld voor de dag, en één veld voor het dagdeel. We moeten dus voor elk aangevinkt selectievakje een eigen record te maken waarbij de naam van het dagdeel in het veld Dagdeel wordt gezet, en de betreffende dag in het veld Dagnaam. Zo zullen er in de nieuwe query 4 records zitten voor Anton, en 6 records voor Michaela (kijk maar wanneer zij aanwezig zijn).

Voor deze query maken we een Union query. Ook dat querytype is al eerder behandeld, dus de uitleg hou ik kort: dit is een query waarbij je verschillende queries samenvoegt tot één query. Een Union query kun je niet in het Ontwerpvenster maken; hij moet in het SQL venster worden getypt. Gelukkig kun je met de basisquery (op basis van een gewone Selectiequery) beginnen, en daar later de overige elementen in plakken.

 We gaan eerst een query maken waarbij voor het eerste dagdeel dat een kind aanwezig is een record wordt gemaakt. We beginnen met het filteren op het dagdeel VM, en op de dag Maandag. De basisquery voor deze query luidt:

SELECT Kind.KindNR, Kind.Naam, Datums.Dag, Format([Dag],"ddd") AS DagNaam, "VM" AS Dagdeel

FROM Kind, Datums

WHERE (((Datums.Dag) Between [Startdatum] And [Einddatum]) AND ((Format([Dag],"ddd"))="Ma") AND ((Kind.Ma_VM)=True));

En in het Queryvenster ziet dat er zo uit:

augustus 2012: image007..gif

Wat misschien opvalt aan deze query, is het niet-gebonden veld [Dagdeel], dat we vullen met de tekst VM of NM, en niet met een waarde uit een veld. Het veld [Dagnaam] vullen we middels een formule met de naam van de dag.

Aan de regel FROM Kind, Datums kun je herkennen dat we een Cartesisch Product maken, omdat de twee tabellen niet aan elkaar gekoppeld zijn. Dat zie je ook terug in de afbeelding; er is geen verbindingslijn tussen de twee tabellen.

 Samenvattend: de query gebruikt de velden Kind.KindNR, Kind.Naam uit de tabel [Kind], en het veld [Dag] uit de tabel [Datums]. Verder zie je dat er nog een verkorte dagnaam wordt gegenereerd op basis van het veld [Dag], en een nieuw veld wordt gemaakt met de naam [Dagdeel] en de waarde "VM".

De query wordt gefilterd op het veld [Ma_VM]. Omdat we alleen records willen zien in dit deel van kinderen die op Maandagochtend aanwezig zijn. Verder wordt het veld [DagNaam] gefilterd op de tekst "Ma" omdat we alleen de dag "Maandag" willen zien.

Deze query zou zonder verder criterium prima werken, en voor elk kind dat het veld Ma_VM aangevinkt heeft een record maken. Volgens de afbeelding zijn dat Anton, Lisa,Piet, Farah, Senna en Michaela.

Omdat een Cartesisch product alle datums laat zien die voldoen aan de criteria die we nu gebruiken, en de query dus geen rekening houdt met de datums [Startdatum] en [Einddatum], moeten we er nog een extra criterim aan toevoegen. Dat gebeurt op het veld [Dag] waar je een criterium ziet staan: Between [Startdatum] And [Einddatum]. En dit filter kijkt per datumrecord of de datum tussen de begin- en einddatum ligt, en die datums worden dan getoond. Kijken we bijvoorbeeld naar Farah, dan krijgen we nu slechts deze records:

KindNR 

Naam

Dag

DagNaam

Dagdeel

6

Farah

5-3-2012

Ma

VM

6

Farah

12-3-2012

Ma

VM

6

Farah

19-3-2012

Ma

VM

6

Farah

26-3-2012

Ma

VM

6

Farah

2-4-2012

Ma

VM

6

Farah

9-4-2012

Ma

VM

6

Farah

16-4-2012

Ma

VM

6

Farah

23-4-2012

Ma

VM

6

Farah

30-4-2012

Ma

VM

6

Farah

7-5-2012

Ma

VM

6

Farah

14-5-2012

Ma

VM

6

Farah

21-5-2012

ma

VM

6

Farah

28-5-2012

ma

VM

 Farah is namelijk alleen aanwezig tussen 1-3-2012 en 31-5-2012.

Kortom: de query met het Cartesisch product doet precies wat we verwachten, en hiermee is het hoofdgedeelte van de query bepaald. Het enige dat we nu nog moeten doen, is de query uitbreiden, en er een UNION query van maken. Dat gaat het beste in een teksteditor zoals Notepad++, omdat je dan simpel kunt kopiëren en plakken. Om te beginnen moet je naar het SQL venster van de query, om de SQL code te kunnen bewerken. Daar zie je de code die hierboven ook staat terug. Deze code moet je selecteren, en kopiëren.

Vervolgens haal je de puntkomma aan het einde van de SQL weg, en typ je op een nieuwe regel:  UNION.

Vervolgens maak je weer een nieuwe regel, en plak je de gekopieerde tekst. Omdat je nu twee keer dezelfde selectie maakt, wat een beetje onzinnig is, gaan we nu de tweede SELECT aanpassen aan de nieuwe voorwaarden.

  • Verander de tekst ((Format([Dag],"ddd"))="Ma") in ((Format([Dag],"ddd"))="Di")
  • Verander ((Kind.Ma_VM)=True)) in ((Kind.Di_VM)=True))

 Het resultaat ziet er dan zo uit:

SELECT Kind.KindNR, Kind.Naam, Datums.Dag, Format([Dag],"ddd") AS DagNaam, "VM" AS Dagdeel

FROM Kind, Datums

WHERE (((Datums.Dag) Between [Startdatum] And [Einddatum]) AND ((Format([Dag],"ddd"))="Ma") AND ((Kind.Ma_VM)=True))

UNION

SELECT Kind.KindNR, Kind.Naam, Datums.Dag, Format([Dag],"ddd") AS DagNaam, "VM" AS Dagdeel

FROM Kind, Datums

WHERE (((Datums.Dag) Between [Startdatum] And [Einddatum]) AND ((Format([Dag],"ddd"))="Di") AND ((Kind.Di_VM)=True));

Als je de query nu uitvoert, heb je de selectie uitgebreid; nu zie je de kinderen die op Maandagochtend en Dinsdagochtend aanwezig zijn. Door de SELECT tekst nog een te plakken, kun je de volgende selectie toevoegen.

  • Voeg onderaan de query het woord UNION toe op een nieuwe regel
  • Plak de tekst nog een keer, en verander de volgende waarden:
  • Verander "VM" AS Dagdeel in "NM" AS Dagdeel
  • Verander ((Kind.Ma_VM)=True)) in ((Kind.Ma_NM)=True))

Voer de query weer uit; je hebt nu Maandag Ochtend, Maandag Middag en Dinsdag Ochtend in de selectie zitten.

Je kunt nu zelf de overige dagdelen toevoegen. Als alles klaar is, kun je de query opslaan en uitvoeren. Je hebt nu een dynamische tabel (dat is immers een query) gemaakt die voor alle kinderen een record heeft gemaakt van de dagen en dagdelen waarop ze aanwezig zijn. Deze query zou zonder de tabel Datums dus niet te maken zijn! In deze cursus heb ik de query qAanwezig genoemd; ik zal die naam dan ook in het verdere verloop van dit hoofdstuk gebruiken. Deze query maakt een vrij stevige dynamische tabel aan; in mijn voorbeeld met 8 kinderen zijn dat er al zo’n 2900. Dat komt natuurlijk doordat er voor elk kind een groot aantal records nodig is om voor elke dag dat ze tussen de begindatum en de einddatum aanwezig zijn een of twee records te maken. En dat wordt alleen maar meer voor elk jaar waarvoor je records aanmaakt in tDatums!

Het keuzeformulier

In een eerdere afbeelding zag je een knop (en twee datumvelden) waarmee je de datums kon toevoegen aan de basistabel tDatums. Die afbeelding was een onderdeel van een groter formulier, dat je hier ziet.

augustus 2012: image008..png

In het formulier <fSelectie> zitten nog twee keuzelijsten waarmee je een jaartal kiest, en een keuzelijst om de maand voor het rapport te selecteren. Met de knop <Planningsrapport> worden de gegevens uit de query [qAanwezig] gefilterd, en toegewezen aan een tijdelijke query. Deze tijdelijke query wordt vervolgens aan het rapport gehangen. Het voordeel van een variabele query is dat de query altijd wel gegevens bevat, en het rapport dus ook. Je hoeft kortom niet eerst het formulier te openen om een selectie te maken; je kunt het rapport zonder meer openen met de selectie die de laatste keer is gemaakt met behulp van het formulier.

Omdat we in dit formulier een aantal technieken gebruiken die al eerder zijn behandeld, volsta ik met het geven van de code. Die code is nu nog niet compleet, omdat de knop twee dingen doet: een nieuwe query maken (met de selectie), en het rapport openen dat is gebaseerd op de nieuwe selectiequery. Omdat we het rapport nog niet hebben, geef ik nu dus alleen het eerste deel, de code voor de query. Ik ga er zonder meer van uit dat je die zelf onder de knop kunt hangen!

Opdracht

  • Maak een formulier met daarin twee keuzelijsten. In de eerste keuzelijst cboJaar moet je de jaartallen kunnen selecteren waarop kinderen zijn ingeschreven, en met de keuzelijst cboMaand de maanden die beschikbaar zijn voor dat betreffende jaar.

De selectie query

Zodra je op de knop <Planningsrapport> klikt, moet er een query gemaakt worden die de records uit de query [qAanwezig] filtert op de gekozen waarden. De techniek daarvoor is eerder gebruikt: we nemen een vaste query, en passen middels VBA code de SQL aan. Omdat duidelijkheid in naamgeving het werken wel zo plezierig maakt, krijgt de nieuwe query de naam [qAanwezig_Selectie]. De code kun je inmiddels zelf dus onder de knop hangen, en die ziet er zo uit:

Private Sub cmdPlanning_Click()

Dim dbs As DAO.Database

Dim qTmp As DAO.QueryDef

Dim strSQL As String, sFilter As String

On Error GoTo Err_cmdPlanning_Click

   

    strSQL = "SELECT Format([Datums]![Dag],'mmmm') AS Maand, Datums.Dag, qAanwezig.Dagdeel, Count(qAanwezig.KindNR) AS AantalPers " _

        & "FROM Datums LEFT JOIN qAanwezig ON Datums.Dag = qAanwezig.Dag" & vbCrLf

    strSQL = "SELECT Format([Datums]![Dag],'mmmm') AS Maand, Datums.Dag, Datums.DagDeel, Count(qAanwezig.KindNR) AS AantalPers " _

        & "FROM Datums LEFT JOIN qAanwezig ON (Datums.DagDeel = qAanwezig.Dagdeel) AND (Datums.Dag = qAanwezig.Dag)"

      If Not Me.cboJaar.Value = vbNullString Then

        sFilter = "WHERE (Year([Datums]![Dag]) = " & Me.cboJaar.Value & ")"

    End If

    If Not Me.cboMaand = vbNullString Then

        If Not sFilter & "" = "" Then sFilter = sFilter & " AND " Else: sFilter = "WHERE "

        sFilter = sFilter & "(Month([Datums]![Dag]) = " & Me.cboMaand.Value & ")"

    End If

    If Not sFilter & "" = "" Then strSQL = strSQL & sFilter & vbCrLf

    strSQL = strSQL & "GROUP BY Datums.Dag, Datums.DagDeel " & vbCrLf

    strSQL = strSQL & "ORDER BY Datums.Dag, Datums.DagDeel DESC;"

   

    Set dbs = CurrentDb

    Set qTmp = dbs.QueryDefs("qAanwezig_Selectie")

    qTmp.SQL = strSQL

Zoals je ziet, wordt de nieuwe SQL gemaakt op basis van de query [qAanwezig]. De functie is in essentie een Totalenquery; er wordt gegroepeerd op de velden [Dag] en [Dagdeel], en er is een veld [AantalPers] dat per dag en dagdeel het aantal personen telt. Het filter wordt apart opgebouwd op basis van de keuzelijsten op het formulier, en later samengevoegd met de SQL van de hoofdquery.

Enige uitleg, voor zover nodig bij de laatste 3 regels. Hier wordt de variabele qTmp (gedefinieerd als QueryDef) gebruikt om de (reeds bestaande; zou de query niet bestaan dan krijg je een foutmelding) query [qAanwezig_Selectie] opnieuw te definiëren.

Deze techniek is goed bruikbaar als je één query hebt voor een rapport, waar steeds een andere query(selectie) aan is toegewezen. Je zou deze techniek bijvoorbeeld kunnen overwegen als je een rapport hebt dat je wilt mailen met steeds een andere selectie. Bijvoorbeeld een factuur waarbij je een klant selecteert op een formulier. Het rapport baseer je dan op één query, en middels het aanpassen van de SQL van die query filter je steeds opnieuw op de juiste klant.

Het rapport Planningsrapport

We gebruiken dus een niet-afhankelijk rapport voor de presentatie van het resultaat. We borduren hierbij voort op de techniek van het rapport dat we hebben gemaakt in de nieuwsbrief van April 2012, want ook het rapport uit dit hoofdstuk gaan we vullen a.d.h.v. een query bij openen (oplettende lezers hebben ook alang gezien dat ook het startformulier wel overeenkomsten heeft).

Het rapport dat we nu gaan maken, heeft velden die dynamisch gevuld gaan worden op basis van een query waarin dus al totalen zijn berekend, en een datumselectie is gemaakt (de query [qAanwezig_Selectie]. Enige probleem: omdat we twee dagdelen hebben, en voor elke dag dus twee records, valt er op het rapport nog niet zo eenvoudig een overzicht te maken. Het zou beter zijn als de data per dag in één record weergegeven kan worden. Gelukkig is dat vrij simpel, omdat we de data nu goed genormaliseerd hebben opgeslagen in de query [[qAanwezig_Selectie]. Je kunt namelijk op basis van deze query een Kruistabelquery maken, waarin je de velden [Maand] en [Dag] als rijkop gebruikt, het veld [Dagdeel] als Kolomkop en het veld [Aantalpers] als Waarde.

Het rapport wordt dus gebaseerd op deze Kruistabelquery, die de naam [qMaandbezetting_Selectie] krijgt.

De eerste stap in het ontwerp van het rapport bestaat uit het maken en plaatsen van de tekstvakken. Een deel van het rapport zie je hieronder.

augustus 2012: image010..png

Je ziet hier de Paginakoptekst 10 van de in totaal 31 labels, en in de Details sectie 10 van de 31 tekstvakken voor het dagdeel Ochtend, en 10 van de 31 tekstvakken voor het dagdeel Middag. De reden dat er 31 tekstvakken zijn, is uiteraard dat er niet meer dan 31 dagen in een maand vallen.

In het voorbeeld dat in dit hoofdstuk gebruikt wordt, heb ik de labels benoemd van ‘l1’ t/m ‘l31’, de tekstvakken in de bovenste rij heten ‘v1v’ t/m ‘v31v’ en de tekstvakken in de onderste rij heten ‘v1n’ t/m ‘v31n’.

Doorgaans probeer ik in een rapport of formulier altijd namen te gebruiken die overeenkomen met de veldnamen in de onderliggende tabel of query, maar bij een niet-afhankelijk formulier kun je beter namen gebruiken die je in een lus kunt aanroepen. Dat gaan we namelijk doen bij het openen van het rapport.

De blauwe tekstvakken hebben allemaal dezelfde hoogte, en bevinden zich op dezelfde verticale positie. Kijk je nog eens naar het voorbeeld aan het begin van het hoofdstuk, dan zie je dat de tekstvakken een grootte hebben die is aangepast aan het aantal personen voor dat dagdeel. Aan de hand van de waarden die we tegen gaan komen in de query (zie de query hieronder) bepalen we hoe hoog de hoogste kolom gaat worden. Deze waarde wordt dan gebruikt om de positie van de tekstvakken te bepalen.

Helaas gaat Access een beetje onhandig om met het positioneren van tekstvakken op een rapport: de positie wordt namelijk niet vanaf de onderkant van de sectie ingesteld, maar vanaf de bovenkant. Je kunt dus wel Object.Top instellen, maar niet Object.Bottom. En dat is dus wel eens lastig, want als je wilt weten op welke lijn 3 objecten van verschillende hoogte moeten staan, dan heb je niks aan het instellen van een vaste hoogte van die objecten. Dan staan ze netjes uitgelijnd aan de bovenkant, maar niet aan de onderkant!

Wil je de onderkant van een serie tekstvakken van ongelijke hoogte instellen, dan moet je dus de hoogte van het grootste object weten, en de (voor elk object gelijke) basis Topwaarde. Het berekenen van de positie is dus een klusje waar we speciale aandacht aan besteden!

De code begint weer met het declareren van de variabelen, en het uitlezen van de query en vullen van een matrixvariabele.

Private Sub Report_Open(Cancel As Integer)

Dim sVelden() As String, sMaand As String

Dim i As Integer, j As Integer, iMax As Integer, iHoog As Integer, iJaar As Integer

Dim tmpHoog As Long, tmpTop As Long

 

    With CurrentDb.OpenRecordset("qMaandbezetting_Selectie")

        If .RecordCount > 0 Then

            .MoveLast

            .MoveFirst

            i = .RecordCount

            sMaand = .Fields("Maand").Value

            iJaar = Year(.Fields("Dag").Value)

            ReDim Preserve sVelden(i, 3)

In het eerste stuk wordt de query geopend, en wordt het aantal records opgezocht en toegewezen aan de variabele i. Het aantal dagen wordt vervolgens gebruikt om de dimensies van de matrix variabele vast te leggen. In de volgende fase wordt de matrix gevuld met de velden uit de query.

            Do While Not .EOF

                If .BOF Then

                    sMaand = .Fields("Maand").Value

                    iJaar = Year(.Fields("Dag").Value)

                End If                j = j + 1

                sVelden(j, 1) = .Fields("Dag").Value

                sVelden(j, 2) = .Fields("VM").Value

                sVelden(j, 3) = .Fields("NM").Value & ""

                If sVelden(j, 2) > iMax Then iMax = sVelden(j, 2)

                If sVelden(j, 3) > iMax Then iMax = sVelden(j, 3)

                .MoveNext

            Loop

            .Close

        End If

    End With

    On Error Resume Next

    iHoog = Me.v1v.Height * iMax

De matrix variabele is nu gevuld met de velden [Maand], [Dag], [VM] en [NM]. Je ziet ook dat er een waarde wordt toegekend aan de variabele iMax. Deze variabele wordt straks gebruikt om de positie te berekenen van de tekstvakken. De variabele moet het grootste getal krijgen, dus hij wordt alleen overschreven als één van de waardevelden een grotere waarde bevat dan op dat moment in iMax zit.

Je kunt overigens ook overwegen om twee iMax variabelen te declareren; één voor de bovenste lijn (VM), en één voor de onderste (NM).

De variabele iHoog wordt vervolgens bepaald a.d.h.v. de eerder ingestelde variabele iMax. Daarvoor wordt de hoogte van een willekeurig tekstvak genomen (ze zijn namelijk allemaal even hoog) en vermenigvuldigd met iMax. We weten nu dus de maximale hoogte van de kolommen.

Het hele proces wordt nu uitgevoerd in een lus.

    For i = LBound(sVelden) To UBound(sVelden)

        Me("l" & i).Caption = Format(sVelden(i, 1), "ddd") & vbCrLf & Format(sVelden(i, 1), "dd")

        Me("v" & i & "v").Caption = sVelden(i, 2)

De lus wordt begonnen op basis van de laagste dimensiewaarde uit de matrix (Ubound(sVelden)), en loopt door tot de hoogste waarde (Ubound(sVelden)). In regel 2 wordt voor elke dag het label ingesteld; de naam van de dag en de kalenderwaarde. De derde regel zet de waarde van de dag in het label.

        tmpHoog = Me("v" & i & "v").Height * sVelden(i, 2)

        Me("v" & i & "v").Height = tmpHoog

        tmpTop = iHoog - tmpHoog

        Me("v" & i & "v").Top = (Me("v" & i & "v").Top + tmpTop)

        Me("v" & i & "v").TopMargin = (tmpHoog - 350)

Dit blokje bevat de berekening voor de hoogte, en dus ook voor de afstand vanaf de bovenrand. Nog even herhalen: je kunt van een object niet de plaats van de onderkant instellen, maar alleen de plaats t.o.v. de bovenrand. Om te weten hoe ver de onderkant van een object van de bovenrand af staat, moet je dus weten wat de hoogte is van het object. Die hoogte wordt bepaald door de standaardhoogte (die wordt uitgelezen met Me("v" & i & "v").Height) ) te vermenigvuldigen met de waarde van het veld. De uitkomst wordt voor het gemak toegewezen aan de variabele tmpHoog. Bij de waarde 2 wordt het tekstobject dus 2 keer zo groot gemaakt, en bij 4 vergroten we het object 4 keer.

We hebben eerder al de maximale hoogte van het grootste object uitgerekend en aan de variabele iHoog toegekend. Door tmpHoog van iHoog af te trekken, weten we dus hoeveel pixels we het actieve object moeten verschuiven t.o.v. de bovenrand. Die uitkomst zetten we in de variabele tmpTop.

Nu kunnen we de definitieve positie instellen op het object. Die positie is namelijk de bestaande waarde (Me("v" & i & "v").Top) en daarbij tellen we dan tmpTop op.

        If sVelden(i, 2) > 0 Then Me("v" & i & "v").Visible = True Else: Me("v" & i & "v").Visible = False

Simpele opdracht, na de vorige: als de waarde van het veld 0 is, dan moet het veld niet worden getoond. Je zou anders een dunne streep krijgen, en dat ziet er niet zo fraai uit.

In het volgende stuk code wordt het proces min of meer herhaald, maar nu voor de middag velden.  Die staan al op een goede startpositie, dus er hoeft niet zoveel te worden veranderd behalve de objectnamen.

        Me("v" & i & "n").Caption = sVelden(i, 3)

        tmpHoog = Me("v" & i & "n").Height * sVelden(i, 3)

        Me("v" & i & "n").Height = tmpHoog

        tmpTop = iHoog - tmpHoog

        Me("v" & i & "n").Top = (Me("v" & i & "n").Top + tmpTop)

        Me("v" & i & "n").TopMargin = (tmpHoog - 350)

        If sVelden(i, 3) > 0 Then Me("v" & i & "n").Visible = True Else: Me("v" & i & "n").Visible = False

        Me("l" & i).Visible = True

    Next i

De lus is klaar, en alle objecten geplaatst, hebben een waarde gekregen en zijn afhankelijk daarvan zichtbaar gemaakt of niet. Als laatste worden de labels Ochtend en Middag uitgelijnd met de rij kolommen. En de titel wordt opgemaakt.

    Me.lblochtend.Top = Me.v1v.Top + Me.v1v.Height - Me.lblochtend.Height

    Me.lblmiddag.Top = Me.v1n.Top + Me.v1n.Height - Me.lblmiddag.Height

    Me.lblTitel.Caption = "Overzicht van " & StrConv(sMaand, vbProperCase) & " " & iJaar

End Sub

Als laatste stap moet de code op het formulier nog worden uitgebreid. Die mist nog de code om het rapport te openen.

Opdracht

  • Maak de code van de knop <cmdPlanning> zodanig af dat het rapport <Planningsrapport> wordt geopend.
  • Test het rapport met verschillende selecties.

Samenvatting

In dit hoofdstuk hebben we een uitgebreid niet-afhankelijk rapport gemaakt dat voortborduurt op de techniek die we in april hebben behandeld. De opzet van het rapport is om een grafisch overzicht te maken met kolommen die de bezettingsgraad over een tijdperiode laat zien.

In het hoofdstuk zijn de volgende technieken behandeld:

  • Een functie die een tabel vult met vaste waarden (datums in dit geval)
  • De Union query (om gegevens van verschillende dagen samen te brengen)
  • Een Kruistabel query (om de genormaliseerde gegevens te splitsen)
  • Een procedure om een rapport te koppelen aan een wisselende gegevensbron
  • Techniek om tekstvakken op een rapport te manipuleren (grootte, plaats)

De database die als basis is gebruikt voor dit hoofdstuk vind je in het Access forum, in de topic <Vragen, Opmerken, Reacties en Tips voor de Access cursus>. Hierin zit ook de uitwerking van de case.

Volgende aflevering

Omdat het de vakantieperiode is, en een redacteur ook wel eens aan iets anders denkt, volgende maand een aflevering met oplossingen voor veel voorkomende problemen. Als je het Access forum met enige regelmaat bezoekt, zal het je opvallen dat veel vragen vaak terugkomen. Voor een aantal daarvan zal ik een oplossingen aandragen, die algemeen toepasbaar zijn.




Prijsvraag augustus 2012

Auteur: Helpmij.nl

Top

De winnaar van de prijsvraag van juli 2012 is: AndreazZz! Twee andere inzenders van de juiste antwoorden ontvangen een Helpmij.nl goodie pakket. Alle winnaars gefeliciteerd met jullie prijzen!

Natuurlijk hebben we ook deze maand weer een prijsvraag. De prijsvraag van augustus 2012 van Helpmij.nl:

prijsvraag

Vraag 1: Wie is de uitvinder van de webcam


Vraag 2: Welk probleem was de aanleiding voor deze uitvinding en werd erdoor opgelost


Vraag 3: Welk bedrijf en in welk jaar bracht de eerste webcam op de consumentenmarkt

Stuur een e-mail met de juiste antwoorden op de bovenstaande drie vragen vóór 31-08-12 naar wedstrijd@helpmij.nl  en maak kans op deze prachtige Logitech c270 webcam.

Bovendien ontvangt de winnaar een licentie voor Nod32 antivirus software van ESET

De prijzen zijn beschikbaar gesteld door augustus 2012: logo..jpg en augustus 2012: SpicyLemon-logo..png

*Bestuur en wedstrijdcommissie zijn uitgesloten van deelname!

*De winnaar wordt bekend gemaakt in de september editie van onze nieuwsbrief.




Laat zien wat je doet in de terminal

Auteur: femke98

Top

Stel, je wilt aan iemand uitleggen hoe je bepaalde beheerderstaken uitvoert in de terminal van je Ubuntu-/Mint- (of andere Linux-) installatie. Degene aan wie je het uitlegt, begrijpt het niet en je zou willen dat je het hem/haar kon laten zien hoe het moet. Nou, dat kan nu dus!!

Er bestaat een programma waarmee je je terminalsessie kan opnemen en daarna kan afspelen. Het programma heet “ttyrec” en je kan het installeren via Synaptic of via het commando in de terminal: $ sudo apt-get install tty

Ttyrec is leuk en handig programma waarmee je alles kan opnemen wat je in de terminal aan het doen bent. Dat kan heel handig zijn als je bijvoorbeeld iemand wilt laten zien hoe het werkt of als iemand iets niet begrijpt. Het kan ook heel handig zijn als je zelf een probleem hebt dat je moet oplossen en je naderhand de commando's voor in de terminal niet meer weet. Op deze wijze kan je het dus bewaren, omdat je alles hebt kunnen opnemen. Het registreert stap voor stap wat jij hebt ingegeven, dus je ziet het stap voor stap weer terug.

Wanneer je het programma hebt geïnstalleerd, dan open je het als volgt met het onderstaande commando in de terminal:

$ ttyrec bestand.tty

(de naam “bestand” kan je uiteraard veranderen door de naam te geven die jij wilt)

Je ziet daarna niets gebeuren, maar niets is minder waar. Het programma "ttyrec" begint nu alles te registreren wat je doet. Probeer het eens uit en geef wat commando's in, pas bestanden aan, draai of installeer programma's of doe gewoon eens iets om te kijken hoe het werkt. Het programma "ttyrec" registreert echt alles wat je ingeeft, totdat je het afsluit met Ctrl+D of met exit. Daarna vind je alles wat je gedaan hebt terug in het bestand met die naam. In mijn voorbeeld staat dus als naam “bestand” maar het is uiteraard handiger om de naam er aan te hangen met wat je gedaan hebt. Het bestand komt trouwens in de persoonlijke map te staan.

Afspelen

Een met "ttyrec" opgenomen sessie speel je af met "ttyplay":

$ ttyplay bestand.tty

Wanneer je nu gaat kijken wat er is opgenomen, zie je dat al je commando's met dezelfde snelheid worden afgespeeld. Je kan met de toetsen + en - het proces van terugkijken versnellen of vertragen en met de toets 1, keer je terug naar de normale snelheid. Om periodes waarin je even niets hebt ingetoetst over te slaan (omdat je hebt moeten nadenken of iets moest opzoeken), kan je elke toets van je toetsenbord gebruiken. Je spoelt dan op met die toets door naar het volgende commando. 

Een handige bijeenkomst is dat je ook tegelijk een sessie kunt opnemen en dezelfde sessie kan afspelen. Heel handig omdat je op deze manier iemand kan laten meekijken. Om dit te kunnen zal de ene gebruiker ttyrec bestand.tty in moeten voeren en zal zijn/haar sessie beginnen en de andere gebruiker voert ttyplay -p bestand.tty in om dezelfde sessie gelijkertijd af te spelen.

Bewaren van je file

De website Playterm is een soort YouTube-website voor terminalsessies. Je kunt daar je eigen sessie uploaden en dat doe je via de grote uploadknop die rechtsboven op de website staat. Wanneer je je eigen sessie upload moet je wel ingeven welke grootte je wilt. De website accepteert namelijk alleen groottes van 80x24 of 120x35. Als je dat hebt aangegeven, krijg je de vraag of je tevreden bent met de opname en of je deze wilt saven. Klik dan op Ja.

Wanneer dit is gelukt, kan je kiezen wanneer de geldigheisduur van de geüploade terminalsessie afloop. Je kan kiezen uit 3 opties, namelijk de file verloopt over 1 week, 1 maand of 1 jaar. Klik daarna op Upload! Verder krijg je een html-code die je op je website kan plaatsen om de terminalsessie te tonen, of je kan de file rechtstreeks op de website Playterm bekijken. Als je de file aan anderen wilt laten zien, geef je de url die je hebt gekregen door aan deze personen, zodat zij hem kunnen bekijken. De url kan je, als je dat wilt publiekelijk maken. Andere personen kunnen er zelfs commentaar op geven. 

Mijn voorbeeld

Om een voorbeeld te geven heb ik even een kleine test gedaan en HPLIP geïnstalleerd op mijn pc. Omdat deze al op mijn pc staat, heb ik de installatie afgekapt maar dat zie je dus ook terug in het tty bestand. Het filmpje blijft 1 maand op de website staan.

Helaas kon het oorsprinkelijke filmpje hier niet neergezet worden, aangezien deze de hele nieuwsbrief een beetje uit zijn vorm haalde. Ook is de code die je via de site verkrijgt in javascript en omdat de meeste e-mail programma's gewoonlijk geen javascript kunnen uitvoeren, is het filmpje in de nieuwsbrief niet zichtbaar voor de ontvanger. Het filmpje kan je dus alleen op de website van Playterm bekijken, klik daarvoor HIER.




Secunia houdt applicaties up-to-date

Auteur: CorVerm

Top

Secunia PSI is ontworpen om verouderde applicaties te scannen en de nieuwste versies, die beveiligingsupdates bevatten, te downloaden en te installeren. In een aantal gevallen zal Secunia PSI dat geheel automatisch doen, in andere gevallen zal dat handmatig moeten gebeuren. In alle gevallen worden de updates opgehaald bij de makers van de betreffende applicaties. Met andere woorden blijven de geïnstalleerde programma’s up-to-date en daarmee blijft ook het beveiligingsaspect zo hoog mogelijk.

Secunia Personal Software Inspector 3.0 is uitgebracht door het gelijknamige Deense beveiligingsbedrijf. De interface en mogelijkheden van Secunia PSI zijn sterk vereenvoudigd ten opzichte van de vorige versies. Het programma doet wat het doen moet en dat is het up-to-date houden van applicaties. Denk daarbij dan aan programma’s zoals Acrobat reader, Java (JRE), Adobe Flash Player en andere programma’s die er om bekend staan dat verouderde versies nogal eens voor problemen kunnen zorgen. Op dit moment kan Secunia PSI beveiligingsupdates leveren voor zo’n 3000 programma’s. Denk er vooral aan dat het puur dáár om gaat en dus geen vervanger is van antivirusprogramma’s of dergelijke. Het programma is bedoeld als extra laag om je te bescherming tegen aanvallen die worden uitgevoerd via kwetsbare (verouderde) software.

augustus 2012: secunia..jpg

Na de installatie zal Secunia PSI met Windows mee opstarten. Het programma zal voordurend op de achtergrond de software scannen en updaten. Wordt er een programma gevonden waar Secunia PSI geen update voor in “voorraad” heeft dan verschijnt in het systeemvak een melding dat er een programma gevonden is dat een handmatige update behoeft. Wil je niet dat Secunia PSI met Windows mee opstart? Onder Settings kun je dat uitschakelen door het vinkje weg te halen bij Start on boot.

augustus 2012: secunia 1..jpg

Secunia PSI kun je dan desgewenst opstarten onder de startknop  > Alle programma’s.

Het nieuwe versienummer vind je onder het pictogram van het programma dat een update nodig heeft. Het oude versienummer bekijk je door met rechts op het pictogram te klikken en daarna op Show details. Wil je de download niet binnenhalen? Klik dan op Ignore (negeer)updates to this program.




Hallo Google! Welkom op mijn website!

Auteur: Chris Vermeulen

Top

We zijn vaak zo bezig met ons inleven in de bezoekers van onze sites en het aanpassen van onze site om het hun naar de zin te maken, dat we wel eens vergeten dat de crawlers (scripts) van Google en andere zoekmachines ook regelmatig onze websites bezoeken.

Het is best verstandig om ook die 'bezoekers' het naar de zin te maken door ze in staat te stellen jouw site heel gemakkelijk te indexeren. Een sitemap is daarbij erg belangrijk. Het helpt je niet altijd om hoger te komen, maar het helpt wel om je site beter en vaker geïndexeerd te krijgen.

Er zijn twee soorten sitemaps: een html-sitemap en een XML-sitemap.

Een html-sitemap

Een html-sitemap is gewoon een pagina van je site waarop je links naar alle andere belangrijke pagina's van je site zet. Simpel om te maken en handig voor de zoekmachines EN voor je bezoekers. Zeker doen dus. Je kunt dat doen in de vorm van een boomstructuur, die lijkt op een mappenstructuur. Een voorbeeld daarvan zie je hier. Wij zelf houden ervan om het in categorieën in te delen. Een voorbeeld daarvan zie je hier.

In SwiftySite kun je met een paar klikken een html-sitemap maken die zichzelf automatisch updatet wanneer jij een pagina bijmaakt of verplaatst.

Een XML-sitemap

Een XML-sitemap is een document op je site dat links naar alle andere pagina's van je site bevat, maar dan zo opgesteld (XML) dat Google (en andere zoekmachines) ze makkelijk kunnen volgen.

Een XML-sitemap heeft per link naar een andere pagina van je site aanvullende informatie voor de zoekmachines. Zo staat er bijvoorbeeld per pagina hoe belangrijk jij die pagina vindt en hoe vaak jij wilt dat de zoekmachines die pagina indexeren. De zoekmachinescripts hoeven jouw richtlijnen niet te volgen, maar in de regel doen ze dat wel.

Hoewel elke site er goed aan doet een XML-sitemap te maken is het met name interessant voor sites die erg veel pagina's hebben die niet zo goed aan elkaar gelinkt zijn en is het een must voor sites die dynamisch gegenereerde pagina's hebben, zoals webwinkels. Je wilt dan in feite graag dat Google elke (dynamisch gegenereerde) productpagina netjes indexeert.

XML staat voor Extensible Markup Language. Dat klinkt misschien spannend, maar het is gewoon een set afspraken over hoe elektronische documenten gecodeerd worden. Voor de duidelijkheid: je hoeft geen verstand van XML te hebben om een XML-sitemap te kunnen maken :-)

Een XML-sitemap maken

Er zijn verschillende manieren om een XML-sitemap te maken. Je kunt die zelf maken, met de hand zeg maar, je kunt een XML-sitemapgenerator gebruiken en in sommige content management systemen zit een XML-sitemapgenerator standaard ingebouwd.

In SwiftySite bijvoorbeeld, wordt de crawler van Google (en die van de andere zoekmachines) automatisch naar het XML-sitemap-document geleid. Die sitemap wordt automatisch door SwiftySite aangemaakt en telkens wanneer jij een pagina bijmaakt of op een pagina iets verandert, geüpdatet.

Als je graag zelf een XML-sitemap wilt maken, dan verwijs ik je graag naar dit artikel: SEO tips deel 5.

Als je graag gebruik maakt van een XML-sitemapgenerator, dan verwijs ik je graag naar: http://www.xml-sitemaps.com/

Daar kun je jouw domeinnaam ingeven en aangeven wanneer je site voor het laatst aangepast is en hoe vaak je die gemiddeld aanpast.

Door op de knop te klikken, genereert het script voor jou een XML-sitemap die je kunt downloaden en vervolgens kunt uploaden naar je site. Hij kent automatisch per pagina de prioriteit eraan toe, maar je kunt er later altijd zelf nog wijzigingen in aanbrengen. De code is namelijk vrij basic en goed te begrijpen, ook al heb je er geen verstand van.

Stappenplan van deze week:

Stap 1: maak een html-sitemap

Als je nog geen normale sitemap-pagina op je site hebt, dan is dit het moment om die één te gaan maken. Maak gewoon een pagina op je site die je bijvoorbeeld /sitemap noemt. Maak op die pagina een overzicht van de (belangrijkste) pagina's van je site en maak de omschrijvingen van die pagina's klikbaar.

Stap 2: maak een XML-sitemap

Ga naar http://www.xml-sitemaps.com/ en volg de instructies. Download het bestand en upload het vervolgens naar je site. Je moet het bestand in de root van je site zetten. Dat is dezelfde plek waar je index-pagina zich bevindt. Voor Alphamegaklanten dus in de map HTTPDOCS.

Als je een SwiftySite hebt mag je deze stap overslaan. Wij hebben dan automatisch een xml-sitemap voor jouw site gemaakt die ook automatisch geüpdatet wordt.

Stap 3: Laat een ander de links checken

Het zou jammer zijn om de moeite te nemen een sitemap te maken waar vervolgens foutjes in zitten. Laat dus een ander even kijken of alle links wel werken en goed ingevuld zijn. Kleine moeite, groot plezier!

Stap 4: Werk je websitelogboek even bij!

Door een logboek van die veranderingen bij te houden kun je later altijd terugvinden welke veranderingen nou de doorslag hebben gegeven.

Veel succes deze week!

augustus 2012: Alpha..jpg AlphamegaHosting.com is een betrouwbare en kwalitatief hoogstaande hostingprovider die levert in Nederland en België. Zij staan bekend om hun proactieve hulp en begeleiding. Klik hier om kennis te maken met AlphamegaHosting.com.



Virusscanners zien malware, bedoeld voor plunderen bankrekening, niet

Auteur: CorVerm

Top

Onlangs (13 juli) zijn er berichten verschenen over incassobureaus uit wier naam door internetcriminelen e-mails worden verzonden die zeer schadelijke malware op de computer installeren. In de mail staat dat je een betalingsachterstand hebt en je wordt verzocht om op een link te klikken. Meteen na het aanklikken van de link wordt de malware op de computer geïnstalleerd en worden je privégegevens gestolen. Uiteraard met alle narigheid van dien.

Hieronder een voorbeeld van zo’n pishing-mail. Overigens is het genoemde incassobureau net zo goed slachtoffer als de ontvangers van de mail. Onder de mail lees je wat de fraudehelpdesk over dit onderwerp schrijft.

CorVerm.

 


From: Straetus Incasso [mailto:info@visitpinel.com]
Sent: donderdag 12 juli 2012 12:02
To: info@hofstransport.nl
Subject: Betaling Achterstand openstaande vordering

Geachte heer/mevrouw,

Helaas hebben wij moeten constateren dat u uw betalingen niet nakomt waardoor er inmiddels een achterstand is ontstaan. Ik verzoek u de vorderingen te bekijken en ons te informeren over de status en betaling van de vorderingen.

Bij gebreke hiervan hebben wij opdracht gekregen een gerechtelijke procedure te starten. De kosten hiervan zijn aanzienlijk hoger dan de kosten die u nu verschuldigd bent. Indien u vragen en/of opmerkingen heeft, vernemen wij dit graag zo spoedig mogelijk. U kunt hiervoor rechtstreeks met de dossierbehandelaar contact opnemen.

Door deze link te volgen kunt u uw vordering bekijken.

Bij voorbaat dank voor uw medewerking.

Hoogachtend,
Mevrouw M. Segerink

Straetus Incasso

 

Wat zegt de Faudehelpdesk daarover?

In april is een nieuwe variant van het Zeus Banking Trojan virus verschenen dat door veel virusscanners niet herkend wordt. Dat zegt beveiligingsbedrijf ThreatMetrix.

Deze malware werd eerder dit jaar ingezet tegen Nederlandse bedrijven en heeft mogelijk 35 miljoen euro gestolen.

Ook consumenten-pc's blijken regelmatig met Zeus geïnfecteerd. Het virus komt dan binnen via bijvoorbeeld kwaadaardige bijlagen in e-mailbijlagen of drive-by downloads (die u opdoet tijdens het surfen naar malafide websites).

Recent zijn er vanuit meerdere "afzenders" mails verzonden met als gezamenlijk kenmerk de melding van een openstaande vordering en een link waarop geklikt moest worden voor meer informatie. In alle gevallen zaten er achter die link websites die uw computer willen aanvallen met een virus. Schattingen van de aantallen verzonden mails lopen uiteen van enkele honderdduizenden tot meer dan een miljoen.

Zbot of ZeusTrojan virus.

Het virus dat op de loer lag op de betreffende websites betrof een "Zbot", een Zeus Trojan. Het aanvallen met Zeus, zo laten de meldingen van de afgelopen tijd zien, moet gezien worden als de volgende en veel gevaarlijker stap na Phishing.

Zeus is een malware-toolkit waarmee criminelen simpel een Trojan-infectie kunnen inrichten zonder dat ze zelf programmeerkennis hoeven te hebben. Zeus wordt in het criminele circuit aangeboden voor een bedrag vanaf zo’n drieduizend dollar. Afhankelijk van benodigde features kan dat oplopen tot zo’n 10.000,-

Zeus is in staat online inloggegevens te stelen van de geïnfecteerde computer. Gevaarlijker aan dit virus is echter dat het in staat is om bijvoorbeeld tijdens een internetsessie met de bank een scherm te presenteren dat vraagt extra gegevens af te geven. Je denkt dat je in een beveiligde (https-) omgeving actief bent maar speelt alsnog je gegevens door aan de criminelen. Dit wordt ook wel “Man in the middle” of “Man in the browser” genoemd. Een bekende variant is die waarbij tijdens het internetbankieren een pop-up verschijnt die, "om beveiligingsredenen", vraagt om een extra Tan-code in te voeren. Met die Tan-code autoriseer je dan een extra overboeking die de crimineel in de achtergrond heeft klaar gezet.

Een bijkomend probleem is dat virusscanners dit virus vaak niet herkennen omdat het door de grote aanpasbaarheid iedere keer weer een nieuwe, andere, signatuur heeft.

Recent is bijvoorbeeld het Zeus Banking Trojan herhaaldelijk in het nieuws geweest.




Zet je site in een directory en kom hoger in Google

Auteur: Chris Vermeulen

Top

Lang, heel lang geleden, was er eens een inhoudsopgave van het internet. Hoewel er toen ook al wel zoekmachines waren, zoals Altavista, had men het plan opgepakt om een inhoudsopgave van het internet te maken, het zogeheten Open Directory Project. Een directory, eigenlijk niet veel meer dan een lijst verdeeld in categorieën, is net zoiets als een telefoonboek.

In 1998 zag DMOZ het licht. Het Open Directory Project is een bonte verzameling van links naar websites, in categorieën ingedeeld. DMOZ is vandaag de dag nog altijd de autoriteit op dit gebied. Het is zelfs zo dat Google Directory (niet te verwarren met de natuurlijke zoekresultaten) simpelweg DMOZ in een Google jasje is. Mensen maken niet veel gebruik meer van directories, maar...

Zoekmachines hechten veel waarde aan sites die in DMOZ vermeld staan

Weet je waarom? Omdat een team van vrijwilligers wereldwijd eerst jouw site beoordelen en valideren en in de juiste categorie zetten. Google moet heel het internet indexeren en moet daarvoor vertrouwen op scripts om de volgorde en categoriën te bepalen. Maar een betrouwbare, onafhankelijke menselijke check, daar kan natuurlijk niks tegenop.

Dus als je met jouw site in de juiste afdeling binnen DMOZ staat, vindt Google jou ineens een stuk leuker en krijg je een zeer waardevolle inkomende link erbij (linkbuilding!).

Het aanmelden van je site bij DMOZ is gratis, maar het kan best wel lang duren voordat je ook echt in de lijst verschijnt. Je site wordt immers door echte personen, vrijwilligers beoordeeld en die zitten met enorme wachtlijsten. Reden te meer om vandaag je site aan te melden.

Doe het gewoon vandaag en vergeet het verder. Het kan maanden duren voor je verschijnt, dus zet in je agenda een taakje om tegen die tijd in DMOZ te checken of je er al in staat. Je krijgt namelijk geen bericht. Staat je site er nog niet in? Geen paniek, er zijn verhalen bekend waarbij het tot meer dan een jaar duurde.

En toch is het zwaar de moeite waard!

Het is namelijk maar een half uurtje werk en als je er eenmaal in staat, dan krijgt je site een flinke boost.

Startpagina

Je zou ook eens kunnen kijken of je je site op één of meer dochterpagina's van Startpagina.nl of start.be kunt krijgen. het is niet zeker of je daarmee hoger komt in Google, maar het is weinig werk dus de moeite waard om het te proberen.

Elke dochterpagina heeft namelijk een beheerder en daar heb je weer die menselijke check die Google zo waardeert. Het nadeel is dat je voor sommige dochterpagina's moet betalen om er op te kunnen. In zo'n geval zou je een test kunnen doen, maar alleen als je ook echt het effect kunt meten.

Van die startpagina-achtige sites krijg je immers ook gewoon echt bezoekers, dus ze zijn niet alleen fijn als een kwalitatieve inkomende link waarmee je hoger in Google kunt komen.

Stappenplan

Stap 1: Meld je site aan bij DMOZ

Ga naar http://www.dmoz.org/World/Nederlands/ en browse naar de categorie waar jouw site het beste in past. Klik dan bovenin op de link "URL aanmelden". Lees even goed door en vul de gegevens in. Binnen 10 minuten ben je klaar.

Voor de Belgen onder ons, er is geen aparte pagina voor België, omdat deze afdelingen binnen DMOZ op taal ingedeeld zijn en niet op land.

Stap 2: Meld je site aan bij een dochterpagina van Startpagina.nl of Start.be

Bezoek deze sites en zoek de dochterpagina's op die het beste bij jouw site passen. Dat kunnen er meerdere zijn. Bij start.be moet je eenmalig een paar tientjes betalen en bij Startpagina.nl varieert het per pagina. Soms kom je er gratis op en soms moet je betalen. Bekijk goed of het voor jou interessant genoeg is.

Stap 3: Werk je logboek even bij

Schrijf even op waar je je site aangemeld hebt, zodat je dat later nog kunt terugvinden.

Veel succes deze week!

augustus 2012: Alpha..jpg AlphamegaHosting.com is een betrouwbare en kwalitatief hoogstaande hostingprovider die levert in Nederland en België. Zij staan bekend om hun proactieve hulp en begeleiding. Klik hier om kennis te maken met AlphamegaHosting.com.



Postvak-in

Auteur: Redactie

Top

In onze vaste rubriek beantwoorden we vragen aan de hand van onze nieuwsbrief en plaatsen we reacties van onze lezers.


Beste Helpmij Nieuwsbrief Redactie.

Waarom heet die eigenlijk een nieuwsbrief? Ik lees 'de brief' nu al een hele tijd (niet deze speciaal maar eigenlijk alle) en ineens kwam de vergelijking met de KIJK (http://nl.wikipedia.org/wiki/Kijk) naar boven. Het is meer een zelfstandig internet tijdschrift dan 'alleen maar' een nieuwsbrief. Ik bedoel als je toch cursussen en zelfbouwprojecten op een pagina zet is dat geen 'nieuws' maar een volwaardig artikel. Ik vind het helemaal prachtig hoor maar zulke juweeltjes verdienen toch een beter 'vlag' dan nieuwsbrief?

Hoe je het beestje ook noemt, ik zal het blijven lezen... voor de artikelen hè? Niet voor die twee grote speakers die me nu aanstaren. ;^)

Vriendelijke groet,
Puppy Zwolle

Hoi Puppy Zwolle,

Ja, waarom heet onze nieuwsbrief eigenlijk nieuwsbrief? Goeie vraag vinden wij, maar het beestje moet een naam hebben en wij vinden het niet de slechtste naam. Wij brengen immers nieuws op het computerfront, en ja, ook geven wij cursussen. En nee, het is geen nieuwsbrief in de zin dat er de laatste verenigingsontwikkelingen worden gemeld, of de laatste roddels worden gebracht uit het verenigingscircuit.

Uiteraard hebben we ook op Wikipedia gekeken aan de hand van de link die je meegestuurd hebt en lezen daar dat: KIJK een Nederlands populairwetenschappelijk tijdschrift is. En daar, beste Puppy Zwolle, kunnen wij ons natuurlijk niet mee meten.

Overigens zijn wij zeer vereerd dat jij onze nieuwsbrief een hogere status toedicht. Dat betekent dat onze nieuwsbrief zeer gewaardeerd wordt en daar zijn wij uitermate blij mee.

Dank daarvoor.

Redactie.


Hoi,

WIN7 installeren via Wintoflash zal bij mij niet lukken. Norton vond er een Trojan in …

M.vr.gr.

Ane Duijff

Beste Ane,

Wij hebben met verschillende antivirusprogramma's deze software gescand en er geen Trojan of wat dan ook in gevonden. Volgens ons betreft het in uw geval een zogenaamde false positive melding.

Lees hieronder eens wat PC Web Plus hierover schrijft.

Een false positive is een bestand dat onterecht als 'kwaadaardig' word aangezien door een antivirus of anti-malware programma, dit heeft vooral te maken met het feit dat er gescand word op basis van 'signatures', indien deze niet in de gebruikte AV (antivirus) MW (malware) database zijn opgenomen kan een bepaald bestand aangezien worden als een bedreiging.
Het scannen en analyseren op basis van 'signatures' heeft als voordeel dat niet het volledige bestand geanalyseerd hoeft te worden. Deze methode van scannen heeft in de basis te maken met 'snelheid', als een antivirus of anti-malware programma elk bestand compleet zou moeten analyseren is het scannen van de gemiddelde computer monnikenwerk en zeer tijdrovend, vandaar dat antivirus of anti-malware programma’s gebruik maken van een 'virusdefinitie database' met handtekeningen (signatures), waardoor bestanden snel geanalyseerd kunnen worden. Maar soms gaat dit fout en geeft het antivirus of anti-malware programma de melding dat er een kwaadaardig bestand is gedetecteerd.

Als extra controle kunt u het bestand natuurlijk online laten scannen op b.v. de onderstaande websites.

VirusTotal
Jotti's malware scan

Belangrijk!!!

De bestanden die u hier (online) laat scannen worden verstuurd naar de bedrijven van de gebruikte virusscanners, dus als u privacy gevoelige bestanden wilt laten scannen kunt u dit beter niet doen.

Redactie