Laravel homestead, nginx & dynamic robots.txt

Bij het gebruik van Laravel 5 is homestead een zeer handige tool om te gebruiken. Binnen enkele minuten heb je een omgeving waar je in kan werken allemaal mooi geconfigureerd en op basis van Nginx. Voor het maken van een robots.txt is de makkelijkste oplossing om het bestand zo aan te maken en in te laden. Maar wat als je hem dynamisch aan wil laten maken?

Dynamisch je robots.txt maken

Via een controller kan je de robots.txt opbouwen en als een response terug sturen.

$var = '__contentforrobotstxt_';
return \Response::make($var, '200')->header('Content-Type', 'text/plain');

Hierbij heb je geen hardcoded robots.txt meer nodig en wordt hij iedere keer dynamisch opgebouwd. Op dat moment gaat nginx alleen helaas zeuren en geeft je een hele mooie 404 error. In de nginx configuratie staat een regel die er zo uit ziet.

location = /robots.txt { access_log off; log_not_found off; }

Het probleem zit in het location = /robots.txt

Het = teken betekent wanneer het verzoek gelijk staat, voer alleen deze regels uit en niet meer. Wanneer je een robots.txt hebt, dan wordt hij ingeladen zonder problemen. Maar zodra hij niet bestaat stuurt nginx een 404 terug.

De uiteindelijke oplossing is heel simpel. Het verwijderen van die regel in het nginx configuratie bestand. Deze is te vinden in /etc/nginx/sites-available/. Vergeet na het verwijderen alleen niet nginx opnieuw op te starten met ‘service nginx restart’.

Ps. Eventueel kun je ook de standaard response veranderen (Zie oplossing 1 van https://trepmal.com/2014/03/28/nginx-robots-txt-and-copy-pasta/)

Zend Framework 2 config and classmaps

Binnen Zend Framework 2 werk je met heel veel config files die via autoloaders worden geladen. Dit maakt het bijzonder prettig modulair werken maar geeft in productie snel een flinke load. Nu kun je eenvoudig de caching hiervan configureren voor betere performance in productie.

Application.config.php

Ik heb ervoor gekozen te werken met een application_env (zoals ik dat gewend was in Zend Framework 1) om environment gebonden configuraties toe te passen. Globaal ziet mijn config er zo uit (als het gaat om caching en de environment);

$env = getenv('APPLICATION_ENV') ?: 'production';

$array = array(
    'modules' => array(
        'Application',
    ),
    'module_listener_options' => array(
        'module_paths' => array(
            './module',
            './vendor',
        ),
        'config_glob_paths' => array(
            'config/autoload/{,*.}{global,' . $env . '}.php',
        ),
        'cache_dir' => __DIR__ . '/../data/cache/modulecache',
        'config_cache_enabled' =>  true,
        'config_cache_key' =>  $env,
        'module_map_cache_enabled' => true,
        'module_map_cache_key' => $env,
    ),
);

if('development' == $env) {
    $array['module_listener_options']['module_map_cache_enabled'] = false;
    $array['module_listener_options']['config_cache_enabled'] = false;
    array_unshift($array['modules'], 'Whoops');
    array_push($array['modules'], 'BjyProfiler', 'ZendDeveloperTools');
}

return $array;

Dat laatste stukje is beetje een iets minder mooie maar effectieve oplossing om mijn development-omgeving gebonden tools (ZendDeveloperTools, BjyProfiler & Whoops) te laden en de caching, die by default op true staat, uit te zetten. In acceptatie, productie en welke environment dan ook werkt alles wel conform de reguliere config. Dus caching aan en een enviroment-based key.

Autoload_classmap.php

Wel een leuke performance toevoeging. Classmaps die met autoload meekomen zodat Zend niet alles overal hoeft te zoeken. Je kunt ze eenvoudig via de commandline genereren met de, met ZF2 meegeleverde, classmap_generator.php. Deze staat uiteindelijk in de root van je module dus bijv. in dit geval /task/autoload_classmap.php

In je Module.php zet je dan het volgende neer om deze classmap te laden;

    /**
     * @return array
     */
    public function getAutoloaderConfig()
    {
        return array(
            'Zend\Loader\ClassMapAutoloader' => array(
                __DIR__ . '/autoload_classmap.php',
            ),
        );
    }

De autoload_classmap.php ziet er ongeveer zo uit (hangt er af van je module, in dit geval ‘task’);

// Generated by ZF2's ./bin/classmap_generator.php
return array(
  'Task\Task'                                   => __DIR__ . '/Task.php',
  'Task\Controller\TaskAdminController'       => __DIR__ . '/src/Task/Controller/TaskAdminController.php',
  'Task\Entity\TaskAdminEntity'               => __DIR__ . '/src/Task/Entity/TaskAdminEntity.php',
  'Task\Form\TaskAdminForm'                   => __DIR__ . '/src/Task/Form/TaskAdminForm.php',
  'Task\InputFilter\TaskInputFilter'          => __DIR__ . '/src/Task/InputFilter/TaskInputFilter.php',
  'Task\Model\TaskAdminModel'                 => __DIR__ . '/src/Task/Model/TaskAdminModel.php',
  'Task\Service\TaskAdminService'             => __DIR__ . '/src/Task/Service/TaskAdminService.php',
);

Simpelste fake hybride Office 365 on premise constructie

Wij werden recent door een klant benaderd met het probleem dat zij eigenlijk een on-premise omgeving wilde combineren met een Office 365 omgeving. Normaliter zijn hiervoor wel wat routes maar deze vereisen aardig wat complexe configuratie en afstemming. Microsoft heeft hier diverse routes en plannen voor (zie ook de Microsoft site hierover) maar dit gaat veel te diep.

Inleiding

Met on-premise bedoeld Microsoft een omgeving die lokaal draait. In de meest ideale situatie is dit een Exchange platform waarmee een naadloze integratie op te zetten is. Hebben we het echter over een shared hosting server dan wordt het een heel ander verhaal. Waarom zou je dit überhaupt willen?

Stel dat je een organisatie hebt met een tiental mailboxen waarvan er maar 1 of 2 in de cloud terecht hoeven te komen (bijvoorbeeld om licentiekosten te sparen of omdat het gewoon geen zin heeft qua implementatie). Je zou dit liefst natuurlijk naast elkaar doen maar hierover is maar weinig te vinden.

De oplossing

Wij kwamen uiteindelijk na wat gestoei met de volgende oplossing;
Er wordt een regulier Office 365 account aangemaakt conform de normale regels behalve dat de mail primair bij de on-premise locatie blijft binnenkomen. Voor de 1 of 2 gewenste boxen zetten we een forward op naar het @onmicrosoftonline.com adres. Hierdoor komt deze mail daar binnen terwijl de rest bij de primaire server blijft binnenkomen. Uiteraard niet de mooiste oplossing en er zitten best een paar haken en ogen aan.

Zo is het niet mogelijk vanuit de boxen naar andere mailboxen intern te mailen omdat deze, logisch ook, door Microsoft gepoogd worden intern te bezorgen wat niet gaat. Daarnaast geeft deze constructie soms wat verwarring qua waar mail vandaan komt en naartoe moet (spamfilters, reply’s etc.). Echter is het de meest platte oplossing en zeker als het om één box gaat wat ons betreft een prima oplossing.

Zo creëer je eigenlijk heel snel en simpel een fake hybride Office 365 on premise oplossing.

MySQL Workbench – Navicat Data Modeler

Database design is altijd wel een leuk onderdeel van het werk. De plek waar je de functionele wensen en eisen van de applicatie gaat omvormen tot een soort blauwdruk voor de techniek. Normaliter werk ik graag met MySQL Workbench welke met iedere versie weer een stukje beter wordt. Alleen soms doet hij zulke gekke dingen dat je eigenlijk uit het raam wilt springen en dan zoek je naar alternatieven en die zijn er niet dus ga je weer verder en accepteer je de bugs. Nu toch een keer een poging gedaan met een trial van Navicat Data Modeler.

Navicat Data Modeler

Ik heb altijd opgekeken naar de naam Navicat. De makers van prima en solide software rondom het beheren van databases. Hoog was dan ook mijn verwachting van de Data Modeler. De teleurstelling was echt onbeschrijfelijk. Heb ze zelfs nog gemaild met wat vragen omdat ik een aantal (in mijn beleving basis dingen) niet kon vinden. Helaas blijken die er ook niet te zijn of ooit misschien te komen.

Als je hem ziet denk je ‘wow, sexy programma’ de diagram ziet er prachtig uit. Een auto-layout (even kijken hoe dat werkt) ziet er redelijk bruikbaar uit. Heb dit eerder met MySQL Workbench wel eens gedaan die doodleuk alle tabellen op een hoop gooide.

Echter het eerste waar ik tegenaan liep (heb daar niet eens een punt van gemaakt) is dat je een diagram niet kan verwijderen. Superleuk als je ze met 1 klik kan toevoegen maar verwijderen is dan ook wel prettig. Niet te vinden en reageerde niet op de door mij gegokte knoppen.

Dan mijn echte grote struikelblok; Navicat Data Modeler biedt op dit moment geen ondersteuning voor het instellen van de foreign key constraints options (UN UPDATE RESTRICT, SET NULL, DELETE, CASADE etc) . Gewoon niet, null, pech. Je kan het doen via de database zelf of via een beheertool maar niet vanuit je model. Alles zit erin, overal is aan gedacht maar dit, nee. Nog niet nodig.

Volgens de meneer van Navicat wel vaker gevraagd en staat op de requirements lijst voor nieuwe ontwikkelingen. Daar heb je echter 0.0 aan met een trial van 30-dagen. Wat een teleurstelling. Toch maar weer terug bij mijn vertrouwde Workbench. Er is weer een nieuwe versie, wie weet zijn er weer een paar rare bugs uit gehaald.

 

Google maps coördinaten ophalen met klik op een kaart

Het gebruiken van een Google maps (of iedere andere kaartleverancier) voor het tonen van winkels, gebouwen, locaties enzovoorts is steeds gebruikelijker. Normaliter kun je op basis van een adres of postcode prima bepalen waar iets gelegen is. Heel soms willen mensen echter iets meer precisie hierin. Bijvoorbeeld omdat het formele adres anders is dan wat voor bezoekers logisch is of omdat het een groot pand betreft waarbij de exacte locatie niet altijd de meest gewenste is.

Met het volgende simpele stukje code kun je een Google maps kaart renderen die, als men erop klikt, de latitude en longitude beschikbaar stelt om bijvoorbeeld op te slaan of in een veld van een formulier te wijzigen.

De HTML


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html lang="en">
  <head>
    <meta http-equiv="content-type" content="text/html; charset=utf-8">
    <script type="text/javascript" src="https://maps.googleapis.com/maps/api/js?v=3.exp"></script>
    <script type="text/javascript" src="/javascript_code_zoals_hieronder_getoond.js"></script>
  </head>
  <body>
    <div id="maps" style="width: 400px; height: 400px; border: 1px solid grey"></div>
  </body>
</html>

JavaScript code

<script>
    function initialize() {
        var mapOptions = {
            zoom: 7,
            center: new google.maps.LatLng(51.9568120077237, 4.570355415344238)
        };

        var map = new google.maps.Map(document.getElementById('maps'), mapOptions);

        google.maps.event.addListener(map, 'click', function(e) {
            if (confirm("GEO-locatie (opnieuw) vaststellen?") == true) {
                if(!marker) {
                    var marker = new google.maps.Marker({
                        position: map.getCenter(),
                        map: map
                    });
                }
                map.setCenter(e.latLng);
                marker.setPosition(e.latLng);

                console.log(e.latLng.lat());
                console.log(e.latLng.lng());
            }
        });
    }

    google.maps.event.addDomListener(window, 'load', initialize);
</script>

Vagrant + Windows static file caching

Oplossing voor het vreemdste probleem van vandaag; Ik heb een Vagrant box draaien in Virtualbox welke via een vm.share_folder een virtuele share maakt tussen bestanden op de pc en de virtuele server. Dit werkte voor dynamische bestanden prima maar bij o.a. CSS & JS files ging het fout.

Als ik het bestand opriep via de browser kreeg ik een oude versie (ongeacht of je er bijvoorbeeld .css?1 van maakte of iets). Gooide ik het bestand weg dan werkte het wel. Alles nagelopen rondom browser en server-side caching maar daar zat het niet.

De dader: Sendfile()

Na wat onderzoek op het grote web kwam ik erachter dat dit komt door de manier waarop statische files worden opgehaald middels de sendfile() call welke in Virtualbox echter niet goed werkt. Hierdoor werd het bestand als het ware éénmalig echt opgehaald en vanaf dat punt kreeg je een versie uit de ‘cache’ terug. De verwarring is groot omdat dit bestand zich niet als gecached gedraagt; de headers zijn goed, er zijn geen opvallende cache-tags te vinden of iets.

De oplossing

Als je op Windows zit is de meest handige oplossing om sendfile uit te schakelen. Dit doe je met de volgende config line voor je Apache;
EnableSendfile off

Voor Mac gebruikers zou ik eerder gaan kijken naar andere manier om de virtual share te maken namelijk NFS: http://docs-v1.vagrantup.com/v1/docs/nfs.html

Dit probleem speelt hier niet en de performance is aanzienlijk beter.

Zend Framework 2: Form validation error messages translated

Om mij nog niet geheel duidelijke redenen gebruikt ZF2 voor de vertalingen van validatie errors niet de default locale. Dit is erg spijtig maar is relatief eenvoudig op te lossen. Even de stappen bij elkaar om het helder te houden.

Translator configureren: autoload/global.php

'service_manager' => array(
    'aliases' => array(
        'translator' => 'MvcTranslator',
    ),
),
'translator' => array(
    'locale' => 'nl_NL',
    'translation_file_patterns' => array(
        array(
            'type' => 'phpArray',
            'base_dir' => __DIR__ . '/../../resources/languages',
            'pattern' => '/%s/Zend_Validate.php',
        ),
    ),
),

Hierbij zorgt regel 7 ( ‘locale’ => ‘nl_NL’) ervoor dat de default locale van de gehele applicatie op nl_NL komt te staan. Uiteraard kan dit ook via bijvoorbeeld een call in de bootstrap gedaan worden op basis van taalinstellingen browser, url of wat voor leuks dan ook.

Forceren validation error translation: module.php

Dan de verassing; de vertalingen van de validatie errrors zijn niet vertaald. Om dit te forceren moet je in de bootstrap van de module het volgende toevoegen;

public function onBootstrap($e)
{
    $translator = $e->getApplication()->getServiceManager()->get('translator');
    AbstractValidator::setDefaultTranslator($translator);
}

Met een beetje geluk zijn nu de validatie errors van de forms netjes vertaald naar de Nederlandse versie.

Skydrive synchronisatie problemen

Het kan soms voorkomen dat Microsoft Skydrive stopt met synchronisatie. Hij geeft een minimalistische error zonder een specifiek bestand of map als schuldige te benoemen. Het herstarten van de synchronisatie werkt niet en enige optie lijkt het compleet verwijderen van de gesynchroniseerde map om deze opnieuw aan te maken.

Oplosbare errors

Toch zijn er een paar errors welke nog wel oplosbaar zijn. Sowieso loopt hij eruit bij bestandsnamen die onmogelijke karakters bevatten of te lang zijn – komt voort uit de Sharepoint web-structuur die onderhevig is aan andere technische kaders dan een normaal filesysteem. Zie ook de FAQ hierover op de Microsoft site.

Daarnaast kan het soms voorkomen dat hij een error ondervindt bij het uploaden van een map of bestand wat als gevolg heeft dat de cache defect is. Er is dan geen specifieke plek die fouten geeft maar hij is ook niet meer in staat opnieuw de synchronisatie op te zetten.

Kijk in het overzicht wat de laatste succesvolle synchronisatie was en ga naar
C:\Users\[jouwgebruikersnaam]\AppData\Local\Microsoft\Office\15.0\OfficeFileCache

En verwijder hier de file/files die aangemaakt zijn rondom de tijd van de laatste succesvolle synchronisatie. Met een beetje geluk bespaar je hiermee een complete ontkoppeling en herkoppeling van de synchronisatie.

Zend Framework 2 controller based layout

In Zend Framework 2 kan het soms wenselijk zijn een afwijkende layout te configureren voor een controller. Bijvoorbeeld om een admin & front controller te dienen met een afwijkende layout. Er zijn hiervoor een aantal voorbeelden te vinden maar was zelf niet helemaal tevreden hierover dus kwam uiteindelijk met het volgende om een verschil te maken tussen de PageAdminController.php & PageFrontController.php

module.config.php


return array(
    'view_manager' => array(
        'template_map' => array(
            'layout/layout' => __DIR__ . '/../view/layout/default.phtml',
            'layout/admin' => __DIR__ . '/../view/layout/admin.phtml',
            'layout/front' => __DIR__ . '/../view/layout/front.phtml',
        ),
    ),
);

module.php


public function onBootstrap($e)
{
    $eventManager = $e->getApplication()->getEventManager();
    $eventManager->getSharedManager()->attach(
        'Zend\Mvc\Controller\AbstractActionController',
        'dispatch',
        function ($e) {
            $controller = $e->getTarget();
            $ccString = preg_split('/(?=[A-Z])/', get_class($controller));
            $layoutType = strtolower($ccString[count($ccString) - 2]);
            $config = $e->getApplication()->getServiceManager()->get('config');
            if (isset($config['view_manager']['template_map']['layout/' . $layoutType])) {
                $controller->layout('layout/' . $layoutType);
            }
        }
    );
}

Wat hij nu doet is in de module.php op basis van de controller-naam controleren of er een layout gedefinieerd is. Zo niet dan doet hij niets en gebruikt hij de default (layout/layout). Bestaat hij wel dan gebruikt hij bijvoorbeeld de layout/admin of layout/front.

Skydrive Pro error 0x80040208

SkyDrive Pro is een persoonlijke bibliotheek bestemd voor het opslaan en organiseren van documenten. Als integraal onderdeel van Office 365 (SharePoint Server 2013) kun je met SkyDrive Pro werken binnen de parameters van de organisatie, met functies zoals directe toegang tot het adresboek van uw organisatie enzovoorts.

Probleem met synchronisatie

Skydrive Pro loopt in sommige gevallen vast met een synchronisatie probleem waarbij voor alle bestanden een rood kruis komt te staan in Windows Explorer. Kijk je bij het synchronisatie log dan geeft hij de errorcode 0x80040208.

Error 0x80040208

Deze ontstaat als er één of meer bestanden van meer dan 64 tekens in de gesynchroniseerde folders staan. Lastig is deze te vinden al zijn hier wel tools voor te vinden (zie hier een voorbeeld van een Powershell oplossing op Stackoverflow). Mocht je direct al weten welke bestanden het zijn dan ben je er al bijna. Als alles goed gaat kun je de synchronisatie opnieuw opstarten en werkt alles naar behoren. Mocht hij toch problemen blijven geven / helemaal niets veranderen dan volgt het volgende scenario.

Alle cachefiles vernietigen

Beetje een grove methode (je moet hierna de synchronisaties opnieuw aanmaken etc) maar soms de enige oplossing.

  1. Sluit Skydrive Pro
  2. Ga naar \%userprofile%\AppData\Local\Microsoft\Office\15.0\
    en verwijder OfficeFileCache
  3. Ga naar \%userprofile%\AppData\Local\Microsoft\Office\Spw \
    en verwijder de inhoud

Nu even Skydrive Pro opnieuw starten, de synchronisaties opnieuw starten en klaar.

Office 365 domein verwijderen of aanpassen

Als je in Office 365 de primaire domeinnaam wilt wijzigen of in zijn geheel wilt verwijderen gaat dat niet zomaar. De primaire domeinnaam wordt in Office 365 op diverse plaatsen toegepast en is ‘hard’ gekoppeld. Verwijderen kan pas als hij volledig ontkoppeld is.

Redenen om dit te willen?

Stel dat je organisatie een nieuwe naam, en dus ook domeinnaam, krijgt of dat de persoon die de migratie startte een fout heeft gemaakt in de domeinnaam. Een andere reden, en de reden dat wij dit vandaag deden, is dat iemand een P-pakket* heeft maar heeft gekozen voor het laten beheren van de DNS door Microsoft. Wij gebruiken zelf normaliter de E-pakketten* omdat je hierin altijd zelf de DNS kunt beheren. In een P-pakket* kan dit wel maar als je eenmaal voorbij de wizzard bent is dit niet meer aanpasbaar. De makkelijkste weg leek mij het gehele proces terug te draaien en opnieuw te starten met de juiste configuratie. Hiervoor moest het domein wel eerst ontkoppeld worden.

* Met een P-pakket bedoelen we de licenties voor kleine- en middelgrote bedrijven. Lees meer over de verschillende pakketten

De stappen

Voor het in Office 365 verwijderen of aanpassen van een primaire domeinnaam moet je de volgende stappen doorlopen;

  1. Log in als admin van het account
  2. Klik rechts op ‘bedrijfsgegevens’
  3. Scroll naar beneden bij bedrijfsprofiel en verander het default domein naar het standaaard @microsoftonline account
  4. Verwijderen aliassen van e-mailboxen op dit domein (mits van toepassing)
  5. Ontkoppel eventuele licenties die aan het domein hangen (bijv. voor Lync)
  6. Je kunt nu het domein verwijderen

Het kan zijn dat het toch niet lukt de domeinnaam te verwijderen uit de lijst. Controleer even op alle schermen of er toch niet toevallig een gebruiker, licentie of iets aan gekoppeld is. Spijtig genoeg geeft Microsoft je geen goede informatie over de redenen van het niet kunnen verwijderen. Het kan soms even zoeken zijn. Maar met bovenstaande lijst heb je vaak het meeste al gedekt.

Chrome font rendering windows 7

Tijdens het testen van de nieuwe Webparking website viel ons op dat deze in Chrome heel lelijk renderde qua font in Windows 7. Nog even getest op andere devices en platforms maar daar was alles prima. Na enig onderzoek kwamen we diverse melden hiervan tegen en het lijkt te maken te hebben met een ongelukkige samenloop van Windows font-rendering en Chrome. In Firefox en Internet Explorer zag het er wel netjes uit.

De oplossingen voor Chrome font rendering windows 7

Die liepen redelijk uiteen. Nu gaan de meeste oplossingen uit van een andere volgorde van CSS markup voor het font maar; in dit geval is het een Google web font dus de exacte stack is niet aan ons om te bepalen. Na nog vele oplossingen geprobeerd te hebben legden wij ons er al bijna bij neer dat het zo was. Het leek namelijk iets te zijn waar ooit vanuit Chrome wel een oplossing voor zou komen.

Daar een prettige rendering wel zo fijn was hebben wij uiteindelijk het gewenste effect bereikt middels een hele kleine text-stroke.

Verschil text-stroke 0.2px

Hieronder een afbeelding met het visuele verschil. bovenste afbeelding is zonder de text-stroke en de onderste afbeelding is met de text-stroke;

Untitled-1
De oplossing in code

Absoluut niet perfect maar beter (zie o.a. de P in apps);

-webkit-font-smoothing: antialiased !important;
-webkit-text-stroke: 0.2px;

Skeleton CSS framework 1024 px

Persoonlijk hou ik van lichtgewicht en eenvoudig. Om responsive websites snel te maken wilde ik wel iets van een framework gebruiken maar o.a. Bootstrap vind ik persoonlijk te nadrukkelijk aanwezig en te zwaar.

Skeleton CSS

Al enige tijd gebruik ik Skeleton CSS wat erg prettig werkt door zijn compacte opzet. Skeleton is bedoeld als ‘style agnostic’ en richt zich puur op het faciliteren van het responsive grid. Ondanks deze fantastische bedoeling heeft de auteur toch besloten om wat styling toe te voegen voor bijvoorbeeld de typografie en buttons. Snap absoluut niet waarom dit toch gedaan is omdat het naar mijn idee zeer weinig toevoegd. Gelukkig is de styling er redelijk eenvoudig eruit te halen en dan hou je een mooi en lichtgewicht framework over met een handig grid van 16 kolommen.

Ga naar de website van het Skeleton CSS Framework

Skeleton CSS framework 1024 px

Daar mist iets. Het framework gaat maar tot 960px en is al paar jaar niet meer van updates voorzien. Omdat ik nu echt een 1024px versie nodig had heb ik hem zelf aangevuld. Gelijk dit moment aangegrepen om de overbodige styling eruit te halen en paar fixes door te voeren (viel me op dat hij in bepaalde smalle renderings beetje ongelukkig uitkwam qua breedte). Mijn update is terug te vinden in Github voor wie dat prettig vindt.

Ga naar mijn toevoeging voor 1024px ondersteuning

Testen in Internet Explorer

Tijdens de ontwikkeling van een website of webapplicatie wil en moet je deze testen op diverse platforms en browsers. Voor een deel van de platforms (denk aan mobiele telefoons, verschillende IOS versies etc) ben je aangewezen op individuele apparaten als je het echt goed wilt testen. Er zijn wel emulators maar dit is vaak geen realistische test. zeker als het gaat om specifieke implementaties van de HTML/CSS specificaties die met versies van software en devices kunnen veranderen.

Testen in Internet Explorer

Altijd een beetje een vervelende geweest om te testen maar wel vereist. Internet Explorer heeft namelijk nogal wat verschillende gezichten die ook nog wisselen per Windows versie-Browser versie combinatie. Er zijn prima online rendering oplossingen maar deze zijn prijzig of van onbruikbare kwaliteit. Microsoft biedt zelf echter de helpende hand aan developers en designers middels Modern.ie.

Modern.ie

Hier tref je diverse configuraties aan van het Windows platform met zijn verschillende browser versies. Allemaal te downloaden als images van virtualisatie platforms zoals Virtualbox of VMware. Wij gebruiken zelf meestal Virtualbox (zowel op Windows als Mac omgevingen).

Na het downloaden van een image beschik je over een prachtige (vanilla) Windows installatie met de juiste browser voor de meest natuurgetrouwe test. Dit is trouwens niet alleen handig voor het testen op oudere platform/combinaties zoals Windows XP met Internet Explorer 6 maar ook iets nieuws als Windows 8.1 met Internet Explorer 11.

Ga naar de dowload sectie van Modern.IE

Office 365 backups

Naar de cloud overstappen is zo gedaan maar nu? Hoe veilig zijn je bestanden eigenlijk en moet je zelf nog backups maken? Laten we deze vraag even opsplitsen in de twee mee belangrijke zaken die van een backup zouden kunnen worden voorzien:

  • E-mail & agenda
  • Documenten

Wat doet Microsoft al voor mij?

Microsoft zelf draagt zorg voor zijn Office 365 backups van de zaken in de cloud waarvan we mogen veronderstellen dat deze afdoende zijn voor het beschermen van de data die je ze in vertrouwen geeft (o.a. middels redundante opslag etc.). Lees hier meer over hoe Microsoft hier zelf tegenaan kijkt als het gaat om haar verantwoordelijkheden.

Het grootste risico is echter het zelf per ongeluk verwijderen van data;

E-mail & agenda

Standaard beschikt Office 365 over een ‘prullenbak’ waarin je verwijderde items terug te vinden zijn. De termijn dat ze bewaard worden hangt af van je instellingen maar is standaard 14 dagen en kan (hang beetje af van de gekozen licentie) aanzienlijk langer gemaakt worden. Dit dekt in principe het (per ongeluk) verwijderen van e-mail en agenda items.

Optioneel zou je, als je helemaal zeker wilt zijn, zelf handmatig of automatisch backups kunnen maken van je PST bestanden voor het geval van een complete vernietiging van alle bij Microsoft opgeslagen data.

Documenten

Alles wat je in de cloud opslaat (Skydrive pro, sharepoint etc) wordt bij verwijdering wederom via een prullenbak voor je veilig gesteld. Daarnaast biedt Microsoft een soort versie-controle bij bestandstypen die het systeem ondersteund (zoals Word-documenten, PDF-bestanden etc). Dit houdt in dat er van iedere mutatie een kopie bewaard wordt van de vorige versie. Zo kun je terug gaan naar eerdere versies zodat bijvoorbeeld het abusievelijk leegmaken van een document nog op te lossen is.
Wil je echter serieuze backups van de documenten dan zijn de opties wel iets lastiger. Je zou ze lokaal kunnen dupliceren met backup software.

Backup oplossingen

Nu je ziet dat meer een meer organisaties de cloud in stappen zijn de leveranciers van Office 365 backups en gerelateerde diensten hier even snel bij. Het inwisselen van je fysiek aanwezige servers voor cloud opslag is bij veel bedrijven een (niet onterecht) spannende stap. Om deze angst weg te nemen zijn er zeer veel oplossingen waarbij je kunt kiezen uit het online (wederom in een cloud) laten opslaan van je data of lokaal (zoals vroeger ). Bij beide zou je je weer opnieuw moeten afvragen of dit qua veiligheid en privacy opweegt tegen het risico op een complete failure bij Microsoft.