Thursday 20 December 2007

Bladeraars

Wij internetpagina-ontwikkelaars hebben het maar zwaar. Gelukkig wordt het leven steeds makkelijker voor ons en verschuift het zwaartepunt van ons werk naar de leuke dingen.

Het meest vervelende is wel om al je creaties compatibel te krijgen voor alle bladeraars; zoals onze zuiderburen een browser noemen. Vlak voor de eeuwwisseling hadden we nog Netscape en Internet Explorer die gevecht waren voor de internetgebruiker. Nu zijn het er aantal meer geworden. Gelukkig worden de bladeraars steeds beter en focussen zo ook op het goed weergeven van de creatie doordat ze de opmaak presenteren volgens de standaarden.

Een test om de standaard te testen is de acid 2 test. Opera benadert de standaard al enige tijd redelijk goed, ook FireFox en Safari doen een goede poging. Ondanks eerdere uitlatingen van onze vrienden uit Redmond gaat Internet Explorer 8 de acid 2 test halen (Hell just froze over...).

Er zijn helaas nog geen IE8 alpha of beta downloads beschikbaar.
Wat er echter al wel is en dat is op zich ook een hele goede vooruitgang: FireFox 3.0 beta 2 (standalone). Snel halen dus!

Thursday 25 October 2007

Referenties

Referenties binnen PHP zijn ongeveer, maar niet precies hetzelfde als pointers binnen een taal zoals C. Een referentie is eigenlijk een verwijzing naar een variabele. Als de verwijzing veranderd, veranderd de variabele mee.
In PHP4 moet je expliciet aangeven dat je een referentie wilt gebruiken, in PHP5 worden objecten altijd als referentie gebruikt. Met referenties kunnen ook onverwachte dingen gebeuren, die in eerste instantie een bug lijken.

Ook in een foreach lus kan je nu een referentie gebruiken naar de waarden in de originele array zonder dat je dus met een kopie van die array werkt. Dit kan soms echter voor verassingen zorgen. Zo levert onderstaande code een array op met de waarden: een, twee, twee en niet meer een, twee, drie zoals je zou verwachten.

<?php
$a = array('een', 'twee', 'drie');

foreach ($a as &$v) {
}

foreach ($a as $v) {
}

print_r($a);
?>


Weet jij waarom?

Thursday 13 September 2007

Fly in Agile

Agile event (hype of werkelijkheid)

Agile is een cultuur, een gedachtengoed dat de samenwerking, opleiding, kwaliteit en werklust moet verbeteren. Het is geen methode zoals XP, SCRUM, RUP, DSDM, SDM of waterval. Maar Agile kan binnen al die methoden worden gebruikt.

Agile manifesto
In 2001 is het Agile manifesto gemaakt, dat bestaat uit de volgende 4 punten:
  • Individuen en samenwerking; boven processen en methoden
  • Werkende software; boven uitgebreide documentatie
  • Klantsamenwerking, boven contractonderhandelingen
  • Reageren op verandering, boven een uitgestippeld plan
De rechterkant heeft veel waarde, maar we waarderen de linker kant meer.

Wat er vooraf ging
  • 1940 Deming circle
  • 1957 Mercury project NASA (XP)
  • 1970 Waterfall
  • 1976 EVO
  • 1993 SCRUM
  • 1995 DSM
  • 1995 RUP
  • 1996 XP
Software ontwikkeling
Vanuit programmeurs en technici is Agile ontstaan, een programmeur kent veel werkdruk, heeft contact met de klant, moet documentatie leveren en als er iets mis gaat is hij het bokje. Een stressvol bestaan dus.

Even een paar puntjes uit de praktijk:
  • Klanten weten pas wat ze willen als de applicatie is opgeleverd (denk actielijsten, FO-discussies et cetera).
  • Veel details binnen de programmatuur komen naar voren bij het programmeren, hoe goed je ook ontwerpt.
  • Mensen kunnen maar een maximale complexiteit aan.
  • Er komt binnenkort weer een nieuwe verandering aan.
Binnen Agile draait het om de mens en niet om de code of de documentatie. Agile gaat om samenwerking in een team, er komen geen orders van team en projectleiders, deze dicteren niet maar geven richting. Een Agile ontwikkelaar streeft naar perfectie, reflectie en aanpassing; maar zo goed mogelijke software, bekijk wat je hebt gemaakt en pas aan waar nodig.

Hoe moeten we Agile juist toepassen?
  • Autoriseer team. Een team moet voldoende beslissingsmogelijkheden hebben om vlot te kunnen werken.
  • Elimineer afval, functies en zaken die niet worden gebruikt worden verwijderd.
  • Heb 100% vertrouwen in je team.
  • Versneld leren, de minst bekwame persoon doet de moeilijkste opdrachten (pair programming)
  • Vrijheid van zaken in een team. Geen bureaucratie of papieren rompslomp.
  • Agile moet je agile aanpakken.
Beloften
Agile maakt een paar beloften. Agile is echter niet zaligmakend.
  • Sneller time to market
  • Toename in productiviteit
  • Toename in kwaliteit
  • Betere creaties
  • Betere integratie IT en business
  • Betere klanttevredenheid
  • Hoge betrokkenheid medewerkers
Doel
Doel is niet het opleveren van het systeem maar om een succesverhaal op te leveren voor de klant.

Wednesday 22 August 2007

Fatsoenlijk afbeeldingen schalen

Viaviavia zag ik dit: Advanced photo resizing. Helemaal de bom!

Afbeeldingen zo schalen dat de minst belangrijke informatie wordt weggefilterd. Een afbeelding behoudt dus zijn waarde en onderwerp zonder dat deze onscherp of onduidelijk wordt. Dit moeten we op websites kunnen plaatsen, dat zou echt super zijn, maar hoe lang duurt het nog?

We zitten ook nog steeds op een goede werking van SVG te wachten.

Tuesday 21 August 2007

FULL OUTER JOIN in MySQL < 5

In tegenstelling tot databases kent MySQL voor versie 5 geen FULL OUTER JOIN's. Lekker belangrijk zal je zeggen, totdat je het nodig hebt. Daarom zijn er mensen die oplossingen daarvoor verzinnen. Een UNION. Wat?!!
Tja, een trage UNION gebruiken om een MySQL gebrek op te lossen. Daar gaat je snelheidswinst!

MySQL maakt bij mij nog steeds geen vrienden .

Frameworks

Er is meer dan één definitie van een framework. In meer of mindere mate nemen we aan dat een framework een verzameling klassen en objecten is dat een bepaald probleem helpt op te lossen. Een implementatie en verzameling van design patterns dat vele malen hergebruikt kan worden.

Elk webgeörienteerd software ontwikkelingsbedrijf is wel bezig met een CMS of Framework te ontwikkelen dat aansluit bij de problematiek van hun klanten. Mocht je één van die gasten zijn die zijn vingers daaraan vuil moet maken, kijk dan eens naar Evolving Frameworks.

Thursday 16 August 2007

E-mailadres valideren

Via een goede vriend werd ik geattendeerd op een leuk stukje e-mailvalidatiecode. Namelijk eentje die precies volgens de juiste RFC het e-mailadres ontleed. Cal Henderson is de auteur van de code en tevens progger van Flickr.com, die zou dus wel moeten weten hoe het moet.

Als je dus ooit een e-mailadres dikker wil checken dan alleen op apenstaart, punt en top-level-domein dan moet je deze gebruiken.

Monday 13 August 2007

iDeal rommelt door

Naar aanleiding van een fraudebericht op nu.nl het volgende:

De betalingsdienst iDeal verzorgt een goedkoop betaalalternatief voor creditcard-betalingen, gewoon door met je eigen pas bij je eigen bank te betalen. Ze bieden echter twee verschillende implementaties aan. De eerste is een gratis variant die een onbevestigde betaling verzorgt, bij de anderen varianten kunnen de betalingen onderwater door de webapplicatie worden gecontroleerd.

In het eerste geval moet een webwinkelier dus voor elke betaling inloggen in zijn zogenaamde dash-board en de betaling nakijken alvorens goed te keuren. Er kan dus geen betalingsbevestiging naar de klant worden gestuurd of automatische processen aan het resultaat van de betaling worden gekoppeld. Onduidelijk voor de klant, werkintensief voor de ondernemen, maar gratis.

De andere variant kosten duidelijk meer geld, maar dan is de betaling wel te controleren en hoeft de webwinkelier geen extra werk te doen. De veiligheid van betaling en handelen wordt hierdoor vergroot. Bij een fraudegevoelig medium als internet is dit dus de minimale gewenste werking.

Implementeer daarom nooit de goedkoopste variant, dit leidt tot onduidelijkheid en gaat daardoor op langere termijn wel geld en energie kosten. Mijn vraag aan iDeal is dan ook: willen jullie aub het goedkope abonnement stopzetten, of een onderwater controle op de betaling mogelijk maken?

Thursday 19 July 2007

KPN maakt eindelijk juiste beslissing

I-mode gaat dood.

De hype van Japan heeft nooit echt draagvlak in Nederland gekregen. KPN heeft daarom besloten te stoppen met i-mode. Voor ons ontwikkelaars is dat goed nieuws. I-mode heeft ons heel wat uren gekost met alle uitzonderingen die elk nieuw toestel met zich meebracht.

R.I.P i-mode, we zullen je niet missen.

Wednesday 18 July 2007

CSV en PDF downloads

Om downloads in PHP in alle browsers beschikbaar te maken zijn nogl wat strubbelingen nodig, daarom even snel de juiste headers:

CSV:
header(sprintf("Content-Disposition: attachment; filename=%s", urlencode($filename)));
header("Content-type: application/csv");
header("Content-Transfer-Encoding: binary");

PDF:
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header(sprintf('Content-Disposition: attachment; filename=%s', urlencode($filename)));
header('Content-Type: application/pdf');

// om ook te werken in niet-browsers zoals IE

header('Content-Type: application/octet-stream');
header('Content-Transfer-Encoding: binary');


Succes!

Tuesday 17 July 2007

De volgende top

Wat komt er na de socialisatie van internet? Volgens Marion Jensen is het lokatie. Daarbij speelt de opkomst van het mobiele internet een grote rol. Zoeken op trefwoorden wordt old school, het vinden van de juiste informatie in je directe omgeving de nieuwe hype.

We zullen zien Marion, we zullen zien.

Tuesday 19 June 2007

Browser hell

Een beetje webontwikkelaar heeft meerdere browsers naast elkaar draaien om te controleren of zijn creaties door iedereen kunnen worden bekeken op de manier dat de ontwikkelaar wenst.

Maar bij IE heb je altijd een probleem, bij een nieuwe versie wordt de oude vervangen. Gelukkig zijn er wat handige jongens en meisjes op de planeet die workarounds verzinnen hiervoor. Dus draai IE6 en IE7 gewoon naast elkaar!

Oh, en download dan gelijk ook maar Safari voor Windows (beetje brak maar dan krijg je tenminste het idee hoe het zou moeten werken op een Mac).

Maar ik blijf gewoon Opera fan.

Sunday 17 June 2007

Dutch PHP Conference

Afgelopen zaterdag was de Dutch PHP Conference in de RAI in Amsterdam. De weg naar de RAI was gemakkelijk te vinden, gewoon een kwestie van nerds volgen. Tja, dan kom je erachter dat je er ook één bent.

De aftrap werd genomen door Cal Evans, die begon met een verhaal over zijn ervaringen met het mixen van HTML, PHP, Ajax. Bijzonder leuke spreker waar ik zeker meer van moet lezen, gelukkig kan dat, via zijn website: calevans.com.

Vervolgens sprak een vermakelijke Kevlin Henny over de do's en don'ts in PHP. Enkele tips die hij gaf zijn:
  • gebruik geen type hinting, dit kan resulteren in fatal errors.
  • vermijd train wrecks: $a->$b->$c.
  • pas op vampires, verberg alle functies en methoden die niet voor de buitenwereld bedoelt zijn.
Hierna was het tijd voor verschillende parallelsessies. Ik bezocht achtereenvolgens een presentatie over Webwereld en Zoom, PDO en de SURFnet videotheek.

De eerste was een beetje een dooddoener, Sander van de Graaf vertelde weinig dingen die ik niet wist, ik had verwacht dat er spectaculaire oplossingen waren verzonnen om het hoge aantal gebruikers een redelijke service te kunnen bieden. Helaas werd er performance gewonnen door bepaalde code anders te schrijven, maar is er nauwlijks gekeken naar een betere database performance door bijvoorbeeld een OLAP structuur op te zetten.

De tweede presentatie getiteld PHP data objects, door Lukas Kahwe Smith, trok mijn aandacht omdat ik een presentatie verwachte over het uitwisselen van gegevens en het verpakken van die gegevens in objecten. Helaas was het een presentatie over de PDO module binnen PHP. Toch was de presentatie interessant en overweeg ik om eens naar PDO te kijken als ik een systeem ga bouwen dat op meerdere databases moet draaien.

Als laatste ben ik bij een presentatie van SURFnet geweest door Herman van Dompseler. Wat hij vertelde sluit aan bij een opdracht waar ik nu voor een klant mee bezig ben en was dus voor mij erg interessant. Ik denk echter dat veel mensen die erbij zaten niets aan de presentatie hadden. Herman had het over een 5-lagenmodel, A-Select, SOA, VP-X en REST.

Als afsluiter van de dag werd er een presentatie gegeven over Test Driven Development door Derick Rethans. Een interessant verhaal hoe je met tests de ontwikkeling van je websites kan verbeteren. Een stuk Agile development waarbij men eerst tests maakt op basis van requirement specifications en dan de software zo programmeerd dat de tests goed gaan. Door elke keer de tests te runnen, kan constant de kwaliteit van de software in de gaten worden gehouden. Met ontwikkel iteraties van drie weken kan zo regelmatig een stabiel systeem worden opgeleverd.

Al met al een uiterst leerzame dag, die me weer veel leesvoer heeft opgeleverd:

Friday 1 June 2007

Design Patterns

Niet het wiel opnieuw uitvinden. Dat is wat je met Design Patterns doet. Als je een probleem tegenkomt wat je niet zo snel kan oplossen, dan kan je gaan snuffelen in PHP websites met sample code of je pakt er een boek bij. Maar als dat niet helpt, of als je er geen bal aanvindt om andersmans code door te spitten, kijk dan eens naar Design Patterns.

Het lijkt lastig op het eerste gezicht, maar als je begrijpt wat je er mee kan ben je verkocht. Op dit moment heb ik met succes de volgende patterns geimplementeerd:
- Singleton: sta een enkele objectinstantie van een class toe
- Factory: gebruik een enkele class om objecten van een ander type te bouwen
- Observer: gebruik een class om meldingen te versturen naar een lijst van objecten
- Decorator: gebruik een class om een object te voorzien van extra informatie
- Adapter: gebruik een class om een andere class te converteren naar de huidige implementatie

Kijk eens op Wikipedia of Google naar Design Patterns, het is taaie kost, maar de moeite waard.

Friday 25 May 2007

ReCAPTCHA

CAPTCHA wordt veel gebruikt om spam tegen te gaan. Er zijn veel implementaties van, maar nu is er ook een nuttige versie, die helpt om boeken te digitaliseren. En ik hou van boeken, zowel stoffige papieren versies als digitale exemplaren in de vorm van PDF.

De automagische vertaling van boeken is een probleem, maar met behulp van ReCAPTCHA wordt de hulp van mensen in geroepen om een vertaling aan te leveren. En er is een makkelijke PHP library gemaakt zodat je het snel en makkelijk op je website kan gebruiken.

Dus snel en simpel en behulpzaam.

Check de ReCAPTCHA website!

Thursday 24 May 2007

REST en PHP

REST is cool.

Voor wie het niet kent; REST houdt in dat resources via URL's worden aangeboden en kunnen worden gemodificeerd via het HTTP. Goed dat is misschien voor de meesten mensen abracadabra, daarom een kleine uitleg. Allereerst moet ik wat vertellen over Web Services. Web Services zijn diensten die een persoon of bedrijf aanbiedt waarmee andere personen of websites iets doen. Zoals SOAP. Via SOAP koppelingen of RPC's worden gegevens opgevraagd en soms kunnen er zelfs gegevens worden weggeschreven. Meestal zijn deze methodes lelijk en ondoorzichtig voor een gebruiker.

REST is een architectuur stijl voor het maken van een webapplicatie, het defineert dus geen protocol maar een manier om met elkaar te communiceren. Een URL wordt aangeroepen en een presentatie van een resource wordt teruggegeven. Het is niet gedefineerd wat het content-type van deze resource is; en dat is handig. We kunnen dus allerlei verschillende gegevens in verschillende formaten uniform aanbieden.

Met REST maken we gebruik van bestaande methoden en technieken om informatie uit te wisselen. Tijd voor een klein voorbeeld. Een auto die bij een autodealer te koop staat kan via REST opgevraagd worden. Het is een Volvo met kenteken LD-85-NG. De auto is direct via een URL op te vragen, bijvoorbeeld: http://www.autodealer.nl/autos/LD-85-NG. Via een HTTP GET request krijgen we nu bijvoorbeeld in XML een beschrijving van de auto.

En nu denk ja, jamaar, dat bestaat al lang. Ik gebruik altijd dit systeem. Dat klopt, het web is RESTful. Het gebruikt namelijk URL's die naar resources van verschillende contenttypes verwijzen. We gaan dus eigelijk met REST terug naar de basis concepten van het internet. Maar ook verder, het wordt namelijk veel leuker.

Stel dat je zelf een dealer bent en je bent aangesloten bij een automarktplaats. Je wilt snel en simpel je auto's beheren. Dan zou je dat via REST en bijvoorbeeld XML kunnen doen. Indien je een nieuwe auto gaat verkopen met dan stuur je de gegevens in XML op naar
http://www.autodealer.nl/autos/ via een HTTP PUT methode. Er wordt dan een nieuwe auto aangemaakt en bij autodealer.nl getoond. Wil je de prijs van de auto aanpassen dan HTTP POST je de nieuwe gegevens naar autodealer en die werkt de gegevens van de te verkopen auto bij. En als de auto verkocht is stuur je de XML naar http://www.autodealer.nl/autos/LD-85-NG met een HTTP DELETE request.

Doordat we een URL gebruiken om de gegevens op te halen, kunnen we naast verschillende content-types ook cache-haders mee sturen, en dan wordt het leuk. Middels de cache-headers kunnen we dus aangeven hoe lang de informatie van bijvoorbeeld de eerder genoemde auto geldig is. Stel dat wij een autoverkoop portal zijn en auto's van autodealer.nl uitlezen dan weten we precies wanneer we welke auto's moeten updaten. Voor kleine sites is dit overbodige luxe. Maar bij een grote site kan het cachen van gegevens, al is het maar een minuut, veel requests op de webserver schelen.

Tot zover, we gaan er op door, want ik vind dit weer bijster interessant.