Digicted

Archief voor Werk

Een patch voor het cache path probleem in PHPDelicious

Wednesday, December 24th, 2008

Voor mijn stage bij Bemba was ik bezig met de del.icio.us API in PHP, waardoor ik natuurlijk koos voor de PHPDelicious library. Helaas zat er een foutje in de originele library, waardoor er niet gecached kon worden als het cache path niet expliciet werd meegegeven aan de constructor.

De fix voor dit probleem is gelukkig erg simpel. In cache.inc.php zoek je naar de volgende regel:

public function __construct($sKey, $iCacheTime, $sPrefix='', $sCachePath = CACHE_PATH) {

Dit zou normaal regel 44 moeten zijn. Het probleem zit ‘m in CACHE_PATH, wat eigenlijk PHP_DELICIOUS_CACHE_PATH zou moeten zijn. De nieuwe regel wordt dus:

public function __construct($sKey, $iCacheTime, $sPrefix='', $sCachePath = PHP_DELICIOUS_CACHE_PATH) {

Na deze kleine wijziging is alles ok. Ik heb een patch gestuurd naar de auteur, en naar mijn ervaring wordt de library wel gepatched.

De patch kan toegepast worden door de patch-file in dezelfde directory te plaatsen als PHPDelicious en dan patch -p0 -i fix_default_cache_path.patch te typen op je terminal.

UPDATE: ik bedacht me dat wij intern eigenlijk nog een extra patch gebruiken. Als er geen verbinding gemaakt kan worden met del.icio.us (zoals in de trein kennelijk.. duurde even voordat ik dat door had) is een duidelijke foutmelding wel handig. Hiervoor heb ik deze patch gemaakt.

Als de curl_exec() faalt, krijg je nu een PHP_DELICIOUS_ERR_CONNECTION_FAILED te zien.

UPDATE 2: inmiddels heb ik een email gehad van de auteur, waarin staat dat de CACHE_PATH-patch zal mee worden genomen in de nieuwe versie van PHPDelicious.

Goede voornemens voor 2008

Monday, December 31st, 2007

Het is weer die tijd van het jaar: goede voornemens en nieuwe doelen.

Dit jaar wil ik ze hier delen op mijn weblog (net als Mijndert), zodat iedereen ze kan lezen en kan zorgen dat ik me er netjes aan ga houden.

In willekeurige volgorde hier mijn voornemens:

  • Wat boeken lezen;
  • Minder tijd op internet doorbrengen (zodat ik meer heb om over te bloggen en Twitteren);
  • Een vast schema voor fitness opzetten en me er aan houden;
  • De jaaromzet van Crystal Labs verdubbelen*;
  • Getting Things Done lezen en meer toepassen;
  • Ook buiten Flickr, Hyves, Jaiku, Twitter, Last.FM en andere online diensten vrienden maken. Zie ook het tweede punt in deze lijst;
  • Proberen minder geld uit te geven aan hardware. Met name spullen die ik eigenlijk niet nodig heb.
  • En met het zich op de laatste paar weken: meer productiviteit. Door allerlei omstandigheden heb ik de laatste paar weken weinig gedaan en in januari moet daar echt weer verandering in komen. Punt 4 en 5 hebben hier ook mee te maken.

Zoals altijd ben ik ook geïnteresseerd in jullie goede voornemens, doelen en andere plannen voor 2008.

* = De huidige jaaromzet ga ik hier niet delen, maar er zijn mensen met wie ik dat wel bespreek die me hier aan het eind van volgend jaar kunnen herinneren.

Nieuwe hardware deel 5: Macbook(2)

Wednesday, September 5th, 2007

Sommige mensen wisten het al: de MacBook Pro van Silverware is naar een partner in dat bedrijf en ik heb een “gewone” MacBook gekocht. Voor sommige mensen misschien een verrassing, aangezien ik niet heel erg positief was toen ik voor het laatst een MacBook had.

Ze is echter zeer mobiel qua formaat en gewicht en nu er 2GB geheugen in zit (de vorige die ik tijdelijk had, had slechts 512MB geheugen) draait ze geweldig! Op toekomstige afspraken met klanten van Crystal Labs zal ik dus met notebook verschijnen. En uit ervaring kan ik zeggen dat dat toch wel erg makkelijk is.

Voor de technici onder ons: een 1.83GHz Intel Core 2 Duo, 2GB 667 MHz DDR2 SDRAM (geleverd door PC Megastore en keurig afgehandeld), 60GB 5400RPM harde schijf.

Voor de a-technici: het is een witte laptop.

Zie ook de foto’s van de Macbook op Flickr (in omgekeerd chronologische volgorde).

SysAdmin Dag

Friday, July 27th, 2007

Voor de geeksmensen die het vergeten waren: vandaag is SysAdmin Dag! Dankzij Erno Hannink kwam ik er achter dat we dit nu ook echt in Nederland vieren.

Helaas kom ik de systeembeheerder van ons bedrijf vandaag niet tegen en ben ik zelf de systeembeheerder in mijn andere bedrijf.

Toch, ook voor alle andere systeembeheerders: we houden van jullie, en we zeggen het niet altijd, maar we kunnen echt niet zonder jullie! ;-)

Dus als jij nu op de zaak zit en je hebt je systeembeheerder nog niet vertelt dat je z’n werk waardeert.. Ga dat dan nu even doen!

En de creative mensen onder ons kunnen David Brinks misschien helpen met een slogan voor deze dag. ;-)

Silverware is live!

Friday, July 6th, 2007

Eindelijk is het zo ver .. Ik mag vertellen waarom het hier zo stil is: Silverware.

Het officiële persbericht:

Hardinxveld-Giessendam, 5 juli 2007 Silverware lanceert op donderdag 5 juli een nieuw zoekportaal speciaal gericht op particulieren en ondernemers. Via www.silverware.nl is het voor de ondernemer mogelijk om tegen een kleine jaarlijkse vergoeding een bedrijfsprofiel aan te maken, waarna onbeperkt gebruik kan worden gemaakt van alle diensten.

Deze diensten bestaan uit het plaatsen van aanbiedingen, aanbestedingen, bedrijfsinformatie, stageplekken, vacatures en weblogs, die worden opgenomen in de zoekmachine van Silverware en in het eigen bedrijfsprofiel van het geregistreerde bedrijf wat door een ieder te benaderen is.

Het bedrijfsprofiel geeft een overzicht van alle diensten waar een geregistreerd bedrijf gebruik van maakt. De ondernemer heeft ook de mogelijkheid om in het bedrijfsprofiel het bedrijfslogo, foto’s van het bedrijf en een afbeelding die betrekking heeft op een geplaatste aanbieding te plaatsen.

Dit alles wordt geregeld via het “Mijn Silverware” onderdeel van de ondernemer. Vanuit Mijn Silverware beheert de ondernemer zijn bedrijfsprofiel, waar onbeperkt informatie kan worden toegevoegd voor alle diensten en een overzicht gevonden kan worden van de behaalde zoekresultaten. Ook heeft de ondernemer de mogelijkheid om via Mijn Silverware rechten toe te kennen aan personen die een particulier account bij Silverware hebben, om hen op Silverware te laten handelen namens het bedrijf.

Particulieren kunnen gratis een account aanmaken op Silverware, waarmee zij diverse voordelen hebben ten aanzien van ongeregistreerde gebruikers, zoals het zoeken naar stageplekken en vacatures. Vanuit het “Mijn Silverware” onderdeel van de particulier kunnen zij dan onder andere hun CV toevoegen en berichten versturen. Ook is er de mogelijkheid een lijst met favoriete bedrijven bij te houden.

De doelstelling van Silverware is om dit concept in de toekomst verder uit te breiden en te optimaliseren met meer diensten, afgestemd op de wensen van de gebruikers.

Voor vragen of voor meer informatie kunt u contact opnemen met Brian van der Graaf via telefoonnummer 0184 621 736 tijdens kantooruren of e-mail adres info@silverware.nl en natuurlijk via het bedrijfsprofiel van Silverware op www.silverware.nl.

Daar heb ik weinig aan toe te voegen natuurlijk, dus het enige wat ik nog kan zeggen (vooral aan mijn collega-ondernemers): registreren!

Ruby: tab completion in IRB

Monday, May 7th, 2007

Het is nog steeds erg druk bij Silverware, dus dit wordt even een snelle post, maar misschien dat er nog mensen zijn die hier erg blij van worden? ;)

Als je net zoals ik nog wel eens werk met de Interactive RuBy shell (kortweg IRB) heb je vast wel eens autocompletion gemist. Dankzij de geweldige tip van Eli Bendersky is dat niet langer nodig!

Hij plaatste zelf de volgende tip voor Windows-gebruikers:

For some reason, however, irb doesn’t come with tab completion out of the box. To set it up, you can create a batch file called irbb.bat, for instance, which calls:

  irb -r irb/completion
  

And call that instead of irb. A simpler method, IMHO, is directly edit the irb.bat file in the Ruby installation bin/ directory to require irb/completion.

Voor de mensen die echter Mac OS (of Linux/BSD of een ander UNIX-based OS) gebruiken werkt het beter om even je .profile (een verborgen bestand in je homedirectory) te bewerken (als je gebruikt maakt van bash in ieder geval). Door onderaan het regeltje alias irb='irb -r irb/completion' te plaatsen, het bestand op te slaan en dan . .profile in te typen op de terminal zou je autocompletion toegevoegd moeten hebben.

Managers in een kennismaatschappij

Tuesday, April 10th, 2007

Regelmatig hoor ik op verjaardagen klachten, of eigenlijk vaak vooroordelen, over managers:

  • ze zijn overbodig en lastig;
  • ze krijgen alle eer als het goed gaat;
  • ze doen zelf niets (behalve golf natuurlijk);
  • ze hebben een dure auto, maar ze zijn er nooit;
  • ze zullen daarom vast veel vakantie hebben;
  • ze hebben altijd commentaar, maar steken nooit de handen uit de mouwen;

En ach.. Ik denk dat we er allemaal nog wel een paar kennen, is het niet? Helaas zien mensen vaak niet wat de manager echt doet, of, erger nog - hebben ze inderdaad te maken met een slechte manager.

Manager lijkt dus, net als bijvoorbeeld verkoper, een beroep te worden wat je niet trots vertelt op een verjaardag. Daarom snap ik ook niet dat verkopers “manager” op hun kaartje willen hebben, toch het lijkt wel de trend te zijn. Maar wat is nu echt de taak van een manager? Is dat echt met de eer strijken, golfen, vakantie nemen en commentaar leveren? Of is dat coachen en mensen helpen groeien?

Of, zoals Jeffrey Philips de vraag mooi stelt: What’s a manager to do?

Hij noemt drie punten die, in zijn ogen, belangrijk zijn voor een manager in deze maatschappij waarin informatie beheerd wordt:

  1. Het vertalen van de doelen en richting van de CEO (of gewoon algemeen directeur natuurlijk, maar tegenwoordig moet iedereen Engelse titels… afain, dat is een blogpost op zich waarschijnlijk) naar de rest van de medewerkers.

    Door deze invulling niet over te laten aan ieder individu, maar te laten definiëren door één persoon (in dit geval de manager), ontstaat er geen verwarring over deze definitie.

  2. Omdat het niet altijd makkelijk is een duidelijk overzicht te hebben (en houden) in onze informatie-cultuur, over de verantwoordelijke voor een taak is het belangrijk dat er iemand is die dat doet.

    Een goede manager zal er voor zorgen dat iedereen duidelijk weet waar hij/zij aan toe is en dat ook van andere mensen weet, zodat heldere communicatie mogelijk is.

  3. Ten slotte het nemen van beslissingen, iets waar veel mensen meer moeite mee hebben dan ze toegeven. Duidelijke grenzen stellen en beslissingen op tijd nemen zijn ook taken die een goede manager uitvoert.

Ook wordt in het artikel vermeld dat een goede manager mensen niet vertelt wat ze moeten doen, maar stimuleert om te groeien en dus meer als coach moet fungeren.

Het artikel is wat mij betreft een absolute aanrader voor iedereen die zich bezig houdt met management, of zich afvraagt waarom z’n baas een grotere auto heeft..

Takenlijst met “toevoegen” en “verwijderen” maken met prototype

Saturday, April 7th, 2007

Eerder deze week schreef ik al over het toevoegen van een nieuwe rij met prototype waar ik uitlegde hoe je een tabel gemakkelijk dynamisch kunt uitbreiden met behulp van wat Javascript.
Dit keer gaan we weer aan de slag met prototype, maar maken we een dynamische todolist. We willen gebruikers items laten toevoegen en verwijderen en vervolgens opslaan. Voor het gemak heb ik hier een plat tekstbestand voor gebruikt, maar het is natuurlijk ook mogelijk om het naar een database te schrijven. Laten we maar weer beginnen de HTML te schrijven:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
  "http://www.w3.org/TR/html4/strict.dtd">
<html>
  <head>
    <title>Todolist</title>
    <script type="text/javascript" src="prototype.js"></script>
    <script type="text/javascript" src="todolist.js"></script>
  </head>
  <body>
    <form action="displaylist.php" method="post" id="items">
      <fieldset>
        <legend>Items</legend>
        <ul id="todolist">

        </ul>
        <input type="submit" name="done" value="Klaar" id="done">
      </fieldset>
    </form>
    <form id="addtodo" action="" method="post">
      <fieldset>
        <legend>Nieuwe items</legend>
        <label for="item">Item</label>
        <input type="text" name="item" id="item">
        <input type="submit" name="add" value="Voeg toe" id="add">
      </fieldset>
    </form>
  </body>
</html>

Het lijkt me niet dat ik hier veel uitleg bij hoef te geven. Er komen simpelweg twee formulieren en een lijst. Het tweede formulier is voor het toevoegen van nieuwe items en het eerste formulier hebben we straks nodig om de waarden echt op te slaan.

En dan het Javascript:

function addItem()
{
  $( 'addtodo' ).onsubmit = function()
  {
    var item = $F( 'item' );
    id = id + 1;
    var newitem = '<li id="todo-' + id  + '">' + item;
    newitem += ' (<a href="#" id="delete-item-' + id + '" class="delete">verwijderen</a>)';
    newitem += '<input type="hidden" name="items[]" value="' + item + '">';
    newitem += '</li>';
    new Insertion.Bottom( "todolist", newitem );
    deleteItem();
    $('item').value = '';
    Form.Element.focus( 'item' );
    return false;
  }
}

function deleteItem()
{
  var items = document.getElementsByClassName("delete");
  for (var i=0; i < items.length; i++)
  {
    var myitem = items[i];
    items[i].onclick = function()
    {
      $( 'todo-' + this.id.substring( 12 ) ).remove();
      return false;
    }
  }
}

function init()
{
  id = 0;
  addItem();
}

Event.observe(window, 'load', init, false);

Hier zien we eerst een functie om een nieuw item toe te voegen aan de lijst (additem) als het onderste form gesubmit wordt. We voegen het item toe aan de lijst en maken daarna het vak leeg. Daarna plaatsen we de focus in het vak, zodat er gelijk een nieuw item getypt kan worden.
De return false; is om te voorkomen dat het formulier echt gesubmit wordt.

Daarna deleteItem() om ook items te kunnen verwijderen. Eerst halen we daar alle elementen op met de class “delete” en daarna kijken we of er op geklikt wordt. Als dit zo is verwijderen we de complete li met het dat id van het DOM.
De andere functies zullen aardig vanzelfsprekend zijn als je het vorige artikel hebt gelezen

Nu komt de PHP:

<?php
$sList = '';
foreach( $_POST[ 'items' ] as $sItem )
{
  $sList .= "- " . $sItem . "\n\r";
}
file_put_contents( "list.txt", $sList );
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
  "http://www.w3.org/TR/html4/strict.dtd">
<html>
  <head>
    <title>Resultaat</title>
  </head>
  <body>
    <p><a href="list.txt">De lijst</a> is succesvol weggeschreven.</p>
  </body>
</html>

Ook dit stelt op zich niet zo heel veel voor:

  1. Loop door alle inputvelden heen en voeg ze toe aan een variable.
  2. Schrijf deze variable weg naar een bestand. Ik gebruik hier de functie file_put_contents, die pas beschikbaar is vanaf versie 5; als er behoefte is aan een PHP4-versie wil ik deze later nog posten.
  3. Geef de gebruiker een linkje naar zijn nieuwe todolist. Het is natuurlijk ook mogelijk om de lijst al gelijk weer te geven.

Bekijk hier de demo en stel eventuele vragen in de reacties.

Over op webapplicaties

Wednesday, April 4th, 2007

Zoals ik twee dagen terug al schreef kunnen we steeds meer op het web doen, waar we eerst nog offline applicaties voor nodig hadden. Daarom heb ik besloten mijn veelgebruikte applicaties eens te analyseren en te zien of ik een web-alternatief ga zoeken of niet.
Hier, in volgorde zoals ik ze op dit moment in m’n dock zie staan, de applicaties:

  1. Finder: blijft offline, aardig vanzelfsprekend.
  2. Firefox: voor het lezen van feeds gebruik ik Bloglines al en voor de bookmarks ga ik weer eens opnieuw kijken naar del.icio.us.
  3. iTerm: blijft offline.
  4. Textmate: één van mijn favoriete Mac-applicaties, Textmate, kent wat mij betreft gewoon geen alternatief, online en offline niet.

    Update: Karel wees me net op skEdit, mogelijk toch een alternatief voor Textmate. ;)

  5. Mail: ik geef nog steeds de voorkeur aan een goede offline mailapplicatie, zeker zolang het zoeken in GMail gewoon slecht is. Wat enigszins ironisch is aangezien het product van Google komt.
  6. iCal: toch Google Calender proberen en synchroniseren met iCal, zoals Sanne ook doet.
  7. Adium: MSN en GTalk kunnen allebei online gebruikt worden, maar dat werkt lang niet zo prettig als een goede offline applicatie met tabs en andere leuke speeltjes, zoals het versturen van bestanden.
  8. CocoaMySQL: hoewel ik lange tijd gebruik heb gemaakt van PHPMyAdmin, vind ik dat nu lang niet zo snel werken als CocoaMySQL. Dit houd ik dus ook offline.
  9. Cyberduck: hoewel ik niet echt tevreden ben over deze FTP-client, vind ik het toch beter dan een online FTP-client. Voor een enkele file uploaden werkt een webapplicatie nog wel, maar een grote batch bestanden werkt al minder prettig.
  10. Nu niet open, maar wel veelgebruikt, is iTunes ook een applicatie waar ik geen goed online alternatief voor ken. Alleen last.fm biedt wat dat betreft leuke opties aan, waar ik zo af en toe eens gebruik van maak.
  11. Dan nog twee uit de menubar: Quicksilver en VirtueDesktops. Hoewel je met verschillende vensters en tabs best leuke dingen kunt doen in Firefox, komt het niet in de buurt van VirtueDesktops. Ook Quicksilver houd ik voorlopig maar offline.

Over een onbepaalde periode (;)) zal ik hier laten weten hoe de webapplicaties me bevallen, of dat ik misschien weer terug ben naar de offline applicaties.

Nieuwe rij toevoegen in tabel met prototype

Sunday, April 1st, 2007

Van de week kwamen we ineens een probleem tegen in de interface van Silverware. Helaas kan ik op dit moment nog niet ingaan op details (maar het zal niet erg lang meer duren voor we live gaan, beloofd! ;)), maar we moesten een mogelijkheid hebben om onbeperkt rijen toe te voegen aan een tabel.
Laten we aannemen dat de basis van de tabel ongeveer als volgt is:

<table>
  <tbody>
    <tr>
      <td>1.1</td>
      <td>1.2</td>
    </tr>
    <tr>
      <td>2.1</td>
      <td>2.2</td>
    </tr>
    <tr>
      <td>3.1</td>
      <td>3.2</td>
    </tr>
  </tbody>
</table>

Nu willen we dus onbeperkt rijen toe kunnen voegen aan deze tabel en dan het liefst zonder de pagina te verversen. Omdat ik toch al gebruik maak van Prototype heb ik besloten dat gewoon te gebruiken.
Waarschijnlijk zijn er ook andere methoden om dit op te lossen en misschien is mijn methode niet de beste (waarschijnlijk niet, ik ben niet zo’n Javascript-held eigenlijk), maar deze methode werkte goed voor mij. Eerst had ik wat problemen in Safari, maar dit is getest (en werkend bevonden) in IE6, IE7, Firefox 2, Safari 2 en Opera 9.

Om te beginnen is het natuurlijk belangrijk dat je Prototype download, zelf heb ik gebruik gemaakt van versie 1.5.0 en dat werkte prima.

De volgende stap is onze eigen javascript, wat er zo uit kwam te zien:

function addField()
{
  url = 'addrow.php';
  $( 'add-new-row' ).onclick = function()
  {
    rows = $( 'mybody' ).getElementsByTagName( 'tr' );
    id = rows.length + 1;
    doRequest( url, id, 'mybody' );
  }
}

function doRequest( url, id, type )
{
  pars = 'id=' + id +  '&type=' + type;
  addTo = type;
  var myAjax = new Ajax.Request(
                            			url,
                            			{
                            				method: 'get',
                                    parameters: pars,
                            				onComplete: showResponse
                            			});
}

function showResponse(originalRequest)
{
  new Insertion.Bottom(addTo, originalRequest.responseText );
}

Event.observe(window, 'load', addField, false);

De functie addField() wordt aangeroepen als er geklikt wordt op de link die we straks in de HTML zullen zien. Hij telt alle rijen in de tabel, telt er één bij op en je hebt een nieuw id. Misschien niet altijd wat je wilt, maar voor het voorbeeld goed denk ik.

De functie doRequest accepteert 3 parameters: url (dit is het path naar ons PHPscript), id (dit is het nieuwe id) en type (het id van ons tbody). Vervolgens bouwt het een URL op die er uiteindelijk ongeveer zo uit zou zien: phpscript.php?id=onsid&type=onstype.

Als het PHPscript de output heeft teruggestuurd, wordt showResponse() aangeroepen die een nieuwe rij toevoegt aan het einde van de tbody.

Eigenlijk is de echte versie iets uitgebreider, maar dit is denk ik het stukje wat er toe doet voor dit artikel.
Nu de HTML (uiteraard ook aardig gestripped):

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
  "http://www.w3.org/TR/html4/strict.dtd">
<html>
  <head>
    <meta http-equiv="Content-type" content="text/html; charset=utf-8">
    <title>Dynamisch rijen toevoegen</title>
    <script type="text/javascript" src="prototype.js"></script>
    <script type="text/javascript" src="addrow.js"></script>
  </head>
  <body>
    <table>
      <tbody id="mybody">
        <tr>
          <td>1.1</td>
          <td>1.2</td>
        </tr>
        <tr>
          <td>2.1</td>
          <td>2.2</td>
        </tr>
        <tr>
          <td>3.1</td>
          <td>3.2</td>
        </tr>
      </tbody>
    </table>
    <p><a href="#" id="add-new-row">Nog een rij</a></p>
  </body>
</html>

En dan ten slotte het PHP-script:

  <?if( ctype_digit( $_GET[ 'id' ] ) ):?>
    <tr>
      <td><?=$_GET[ 'id' ]?>.1</td>
      <td><?=$_GET[ 'id' ]?>.2</td>
    </tr>
  <?endif?>

Heel kort, maar effectief. Eerst checken we even of het ID wel een nummer is (in de praktijk wil je misschien nog meer security checks doen) en vervolgens voegen we een rij toe met 2 cellen. Uiteraard heb ik even een demo online gezet om te zien dat het ook werkt in de praktijk.

Voor geïnteresseerden is de volledige code ook te downloaden.

Nog één belangrijke tip: het is heel belangrijk dat je de rij toevoegt aan je <tbody /> en niet aan je <table />. Het heeft mij behoorlijk wat tijd gekost om dat te ontdekken…