Soms excentriek, vaak onopvallend

15 juli 2013, vertaling van het Engelse origineel

Wat jij wil

Al vanaf 20 november 2002 zijn de excentrieke, gekke, rare, ethisch onverantwoorde en irriterende kleuren op mijn website uitschakelbaar. Websitebezoekers kunnen op een link klikken die op veel maar niet op alle pagina’s staat, om aan te geven dat ze liever rustige, saaie, normale, acceptabele, esthetische kleuren willen. Er wordt dan een cookie gezet om die voorkeur te onthouden.

Speciaal voor mij, de enige mens op aarde die die idiote kleuren wil, omdat ik ze speciaal en helemaal zelf ontworpen heb, is er ook een hyperlink om een voorkeur voor het excentrieke vast te leggen. (Druk op F5, of een dergelijke knop die werkt voor jouw bladeraar (ook wel browser genoemd), om de pagina te laten herladen.)

Gisteren, dus op 14 juli 2013, heb ik een derde mogelijkheid toegevoegd, voorlopig alleen in dit artikel, die de cookie reset (d.w.z. verwijdert). Technisch is dat gerealiseerd door de cookie te zetten met een vervaldatum in het verleden.

Standaardwaarde

Blijft de vraag wat mensen te zien krijgen als ze niet expliciet aangeven wat ze willen, of als ze geen cookies willen laten zetten.

Tot 26 augustus 2011 was de default daarvoor: gekke kleuren. Ik kreeg klachten en besloot flauw en vlak de standaard te maken. Maar door wat domme programmeerkeuzen in 2002 was dat vreemd genoeg niet zo makkelijk te veranderen. Uiteindelijk lukte het me toch.

Ik schreef over die episode dit artikel. Alleen in het Nederlands en er komt waarschijnlijk ook nooit een Engelse versie van, vanwege de nauwe samenhang met wat Nederlandstalige twitterconfrontaties.

Dus toen waren voortaan de rustige kleuren de standaardinstelling, maar later veranderde ik het nog een paar keer heen en weer terug.

Tijdsafhankelijk

Op 21 april 2013 kreeg ik een idee, dat ik op 12 juli ook uitvoerde: een deel van de dag, zeg 33%, zouden mensen zonder uitgesproken voorkeur mijn website te zien krijgen zoals die bedacht was, met de wilde kleuren. De rest van de dag zou de verveling weer toeslaan.

De periode waarover dit omgeschakeld wordt is bijvoorbeeld 7 uur, met opzet zo gekozen dat 24 er geen veelvoud van is. Daardoor zullen de uren met de vreemde kleuren in de loop van de weken over de dag en nacht heen schuiven.

Om dat effect te versterken zijn er toevalswaarden in de berekeningen betrokken.

Dat is alles wat ik erover te zeggen heb. Al het andere, mocht het iemand interesseren, wat me zou verbazen, is te vinden in de programmatekst van de functie die ik aan het bestaande C-programmaatje heb toegevoegd. Ik publiceer die functie hiernavolgend.

Source code

/***********************************************************************
   This function was added 12 July 2013. 

   The idea is that those who did not click a link to explicitly ask for 
   either weird or dull colours, will get weird colours some 33% of the 
   time, and dull colours the remaining 67%. This is switched in an 
   approx. 7 hour scheme, so it traverses slowly through night and day. 
   Exact switchover times are severely randomised to get a surprise 
   element into it.

   To make it efficient, the program does not read data from the status
   files WeirdOnn and WeirdOff, but instead only enquires (using the 
   'stat' function) about their latest modification date. That's why 
   there are two different status files, instead of only one with a 
   yes/no content. 
   The file that was most recently updated/recreated ("touched")
   determines which colour scheme the website visitor will get to see.

   Users who clicked a colour link and had a cookie set, will not be
   affected by all this. They always just get the colour scheme they 
   prefer and asked for.
 ***********************************************************************/

 
static char *WeirdOnnFilename = "colschem/WeirdOnn";
static char *WeirdOffFilename = "colschem/WeirdOff";

#define DRAND() ((double)random() / (double)0x7fffffffL)
#define SRAND() (srandom((unsigned long)(getpid() + getppid() + time(NULL))))

/* Parameters, all times in seconds */

#define FractionWeird 0.33
#define RandomFactor  0.45
#define SwitchPeriod (7L*60*60) 
#define CoolingOff (SwitchPeriod * FractionWeird * (1.0 - RandomFactor))

int VariableInTime (void)
{
   struct stat WeirdOnnStat, WeirdOffStat;
   time_t TimeNow;
   FILE *fp;
   int Weird;

   if (stat(WeirdOnnFilename, &WeirdOnnStat) != 0 ||
       stat(WeirdOffFilename, &WeirdOffStat) != 0)
   {
      /* Initial create of two empty colour setting control files.
         They're empty because only the stat data (modification
         date) matters.
       */
      fp = fopen(WeirdOnnFilename, "w");
      if (fp) fclose(fp);
      fp = fopen(WeirdOffFilename, "w");
      if (fp) fclose(fp);
   }

   if (WeirdOnnStat.st_mtime > WeirdOffStat.st_mtime)
   {
      Weird = 1; /* Don't filter, so display weird colours */
   }
   else
   {
      Weird = 0;
   }

   /* Is it time to switch over? */
   time(&TimeNow);

   if ((Weird && (TimeNow - WeirdOnnStat.st_mtime < CoolingOff)) ||
      (!Weird && (TimeNow - WeirdOffStat.st_mtime < CoolingOff)) )
   {
      ; /* Do nothing the first 20 or so minutes after a switch-over, to make
           it more efficient */
   }
   else
   {
      time_t TimeToSwitch;

      SRAND();   

      if (Weird)
      {
         TimeToSwitch = FractionWeird * (float)SwitchPeriod; 
         TimeToSwitch *= 1.0 + (RandomFactor * (DRAND() * 2 - 1.0)); 
         TimeToSwitch += WeirdOnnStat.st_mtime;
      }
      else
      {
         TimeToSwitch = (1.0 -  FractionWeird) * (float)SwitchPeriod;
         TimeToSwitch *= 1.0 + (RandomFactor * (DRAND() * 2 - 1.0)); 
         TimeToSwitch += WeirdOffStat.st_mtime;
      }

      // printf("/* TimeToSwitch %ld, TimeNow %ld */\n", TimeToSwitch, TimeNow);

      if (TimeToSwitch <= TimeNow)
      {
         fp = fopen(Weird ? WeirdOffFilename : WeirdOnnFilename, "w");
         if (fp) fclose(fp);
         Weird = !Weird;
      }
   }
  
   return !Weird; /* Weird = don't filter, Dull = do filter, hence the ! */
}

Kleuren: Neutraal Raar Geen voorkeur Pagina opnieuw laden