Send mail to the author(s) E-mail

View Richard Soeteman's profile on LinkedIn

RSS 2.0 | Atom 1.0 | CDF




The opinions expressed herein are my own personal opinions and do not represent my employer's view in any way.

Sign In


# Sunday, 22 February 2009
Sunday, 22 February 2009 10:38:11 (GMT Standard Time, UTC+00:00) ( ASP.NET | Umbraco )

This Blog is not active anymore, further posts will be available on my company website. Read new posts here

Yesterday I gave a demo about events in Umbraco V4. I did this by describing a few "Business problems" that could be solved using events. A few facts about events in Umbraco V4:

  • You find events on every Component in Umbraco.
  • To uses events, you need references to the businesslogic, cms and interfaces assemlies.
  • To use events, you have to create a class that uses umbraco.BusinessLogic.ApplicationBase as the base class.  In the constructor you can wire up the event handler. These classes will be automaticly picked up when you put the file in the App_Code folder of Umbraco or put the compiled DLL in the bin folder of Umbraco. I prefer the last one.
  • Most of the event args derive from CancelEventArgs, so we can cancel the operation.
  • Because an event executes in the background you should always document that you're using events and make sure you will write a logmessage when you're event handler gets executed.

For my demo's, I've used an Umbraco V4 installation with the Creative Website Wizard installed.

Demo 1 Auto Expire news

In the first demo.I've showed how the document.BeforePublish can be used to check if  a news item is allready expired, if so cancel the publish event, otherwise check if the expire date is set and if not, set the expire date to 14 days from now.

   1:  using System;
   2:  using System.Collections.Generic;
   3:  using System.Text;
   4:  using umbraco.BusinessLogic;
   5:  using umbraco.cms.businesslogic.web;
   7:  namespace AutoExpire
   8:  {
   9:      /// <summary>
  10:      /// 
  11:      /// </summary>
  12:      public class Expire :ApplicationBase
  13:      {
  14:          /// <summary>
  15:          /// Constructor used to wire up the event
  16:          /// </summary>
  17:          public Expire()
  18:          {
  19:              Document.BeforePublish += new Document.PublishEventHandler(Document_BeforePublish);
  20:          }
  22:          /// <summary>
  23:          /// Check if the news item is expired, or check if we need to set the expire date
  24:          /// </summary>
  25:          void Document_BeforePublish(Document sender, umbraco.cms.businesslogic.PublishEventArgs e)
  26:          {
  27:              //Always LOG
  28:              Log.Add(LogTypes.Custom, sender.Id, "Event raised");
  29:              //Check if the doctype is news
  30:              if (sender.ContentType.Alias == "News")
  31:              {
  32:                  //Check if the expiredate is filled and the value is not allready expired
  33:                  if (sender.ExpireDate != DateTime.MinValue && sender.ExpireDate < DateTime.Now)
  34:                  {
  35:                      //Item is expired, cancel the publish
  36:                      e.Cancel = true;
  37:                  }
  38:                  else
  39:                  {
  40:                      //Date is not set set it now and save the doc. Probably better to to this in the before save event
  41:                      //since this is a demo it's allowed to do it here
  42:                      sender.ExpireDate = DateTime.Now.AddDays(14);
  43:                      sender.Save();
  45:                  }
  46:              }
  47:          }
  48:      }
  49:  }

During this demo someone asked if it's possible to show a custom message in the speechbubble event when an event is canceled. This is not possible (tested it this morning), I've created an item on CodePlex.

Demo 2 Auto archive news

In this Demo I've created some functionality to automaticly move a news item to the archive folder when a content manager sets the archive boolean to true. First an archive boolean must be added to the news document and a new Archive folder must be created where we can store the archived News items in.

   1:  using umbraco.BusinessLogic;
   2:  using umbraco.cms.businesslogic.web;
   4:  namespace AutoMoveToArchive
   5:  {
   6:      /// <summary>
   7:      /// Auto move demo
   8:      /// </summary>
   9:      public class AutoMoveToArchive : ApplicationBase
  10:      {
  11:          /// <summary>
  12:          /// Wire up the event handler
  13:          /// </summary>
  14:          public AutoMoveToArchive()
  15:          {
  16:              Document.BeforeSave += new Document.SaveEventHandler(Document_BeforeSave);
  17:          }
  19:          /// <summary>
  20:          /// Before a documents get saved we wil check if the archived proerty is.
  21:          /// When it's set move it to the archive folder.
  22:          /// Again it;s demo code, normally you should also check if it's not allready IN the archived foder ;-)
  23:          /// </summary>
  24:          void Document_BeforeSave(Document sender, umbraco.cms.businesslogic.SaveEventArgs e)
  25:          {
  26:              // Set Arrchive folder id, no excuse to use hard coded values in Umbraco ;-)
  27:              int archiveId = 1123; 
  28:              //Log that we are doing something
  29:              Log.Add(LogTypes.Custom, sender.Id, "Document After save Raised");
  31:              //Check if the item is news and must be archived
  32:              if (sender.ContentType.Alias == "News" && sender.getProperty("archived").Value.Equals(1))
  33:              {
  34:                  //Yes, move to archive
  35:                  sender.Move(archiveId);
  37:                  //Unpublish from current Node
  38:                  umbraco.library.UnPublishSingleNode(sender.Id);
  39:                  sender.UnPublish();
  40:                  //Publish will get called if the user selected Save and publish
  41:              }
  42:          }
  43:      }
  44:  }

Demo 3 Add Unpublish menu Item to the Context menu

In this demo I've showed that we can use events to modify the context menu. I'm missing a unpublish item  in the context menu. This example is a little bit harder because we we need to create a menu item also. A menu item can be created to create a class that derives from the IAction interface. I will leave the explanation of this interface for a future blogpost.

   1:  using System;
   2:  using umbraco.BusinessLogic;
   3:  using umbraco.cms.presentation.Trees;
   4:  using umbraco.interfaces;
   6:  namespace UnpublishAction
   7:  {
   8:      /// <summary>
   9:      /// Add unpublish to the menu item
  10:      /// </summary>
  11:      public class AddUnpublishActionEvent :ApplicationBase
  12:      {
  13:          public AddUnpublishActionEvent()
  14:          {
  15:              BaseContentTree.BeforeNodeRender += new BaseTree.BeforeNodeRenderEventHandler(BaseTree_BeforeNodeRender);
  16:          }
  18:          /// <summary>
  19:          /// Before a menu item gets rendered  we will add the unpublish action if the document is published
  20:          /// </summary>
  21:          private void BaseTree_BeforeNodeRender(ref XmlTree sender, ref XmlTreeNode node, EventArgs e)
  22:          {
  23:              ///Only unpublish when published
  24:              if (node.Menu!= null && !node.NotPublished.GetValueOrDefault(true))
  25:              {
  26:                  //Find the publish action and add 1 for the index, so the position of the ubpublish  is direct after the publish menu item
  27:                  int index = node.Menu.FindIndex(delegate(IAction a) { return a.Alias == "publish"; })+1;
  29:                  //Insert unpublish action
  30:                  node.Menu.Insert(index, UnpublishAction.Instance);
  31:              }
  32:          }
  33:      }
  34:  }

Download the complete solution for this demo here.

Demo 4 Invisible for Writer Usertype

In the last demo I've showed how to use the AfterNodeRender event to make protected nodes invisble for the Writer UserType

   1:  using System;
   2:  using umbraco.BusinessLogic;
   3:  using umbraco.cms.presentation.Trees;
   5:  namespace OnlyForAdmins
   6:  {
   7:      /// <summary>
   8:      /// Makes a document invisible for writers
   9:      /// </summary>
  10:      public class MenuIsNotForWriters : ApplicationBase
  11:      {
  12:          /// <summary>
  13:          /// Wire up the event handler
  14:          /// </summary>
  15:          public MenuIsNotForWriters()
  16:          {
  17:              BaseContentTree.AfterNodeRender += new BaseTree.AfterNodeRenderEventHandler(BaseContentTree_AfterNodeRender);
  18:          }
  20:          /// <summary>
  21:          /// Removes node from menu tree if page is protected and the user is a writer
  22:          /// </summary>
  23:          void BaseContentTree_AfterNodeRender(ref XmlTree sender, ref XmlTreeNode node, EventArgs e)
  24:          {
  25:              //check if page is protecetd and the usertype is writer
  26:              if (node.IsProtected.GetValueOrDefault(false) && umbraco.helper.GetCurrentUmbracoUser().UserType.Alias == "writer")
  27:              {
  28:                  //Writers cannot see protected pages
  29:                  sender.Remove(node);
  30:              }
  31:          }
  32:      }
  33:  }

Overview of all Events

Class Events

BeforeAddMemberShipRoleToDocument AfterAddMemberShipRoleToDocument BeforeRemoveMemberShipRoleToDocument AfterRemoveMemberShipRoleToDocument BeforeRemoveMembershipUserFromDocument AfterRemoveMembershipUserFromDocument BeforeAddMembershipUserToDocument AfterAddMembershipUserToDocument











































Comments [6] | | # 
# Tuesday, 10 February 2009
Tuesday, 10 February 2009 12:14:32 (GMT Standard Time, UTC+00:00) ( )

This Blog is not active anymore, further posts will be available on my company website. Read new posts here

Last friday I've blogged about Macro Picker and got a few emails asking to make the source available to make (small) modifications. I'm very pleased to announce that the project is now available on Codeplex.  The license is MIT now so you can basically do everything with it. You can find the project on

Comments [0] | | # 
# Friday, 06 February 2009
Friday, 06 February 2009 16:24:22 (GMT Standard Time, UTC+00:00) ( )

This Blog is not active anymore, further posts will be available on my company website. Read new posts here

Recently I started working with  Design Revolution as a partner on Umbraco projects. Together we released a few sites and all these sites contained a section where a user can pick dynamic elements such as overviews, map locations etc. To achieve this we've  created a few macro's that contained functionality to display the correct information. For each section where the user can select a macro we've  created a tab(overview1/overview2 etc) with a Rich Text Editor to selected the macro. We came to the conclusion that this isn't the best solution because we want to force site integrity and we came up with the idea to create a datatype where a user can select a macro and fill in the macro properties as normal Umbraco data fields. 

How it works

In the video below I will demonstrate how the datatype works. I've installed a clean Umbraco installation with Runway and the following Runway modules installed

  • Runway FAQ Module
  • Runway JCarousel
  • Standard Top Navigation

I did modify the macro's a bit so that they accepted a content picker macro parameter so we can list the selected folder instead of the current folder. When you want to use the package it's good to know that you can use the normal syntax for a page item, all options that you can choose on a normal Text datatype will also work on the Macro Picker datatype.

<umbraco:Item field="[YourfieldNameHere]" runat="server"></umbraco:Item>
Comments [4] | | # 
# Thursday, 05 February 2009
Thursday, 05 February 2009 19:45:52 (GMT Standard Time, UTC+00:00) ( Umbraco )

This Blog is not active anymore, further posts will be available on my company website. Read new posts here

One of the things I like most about Umbraco is that you can extend it in a way that your custom functionality has exactly the same behaviour as the standard Umbraco functionality. The biggest compliment you can get from a user is when they say "I found a bug in Umbraco" while it's your own control (or love the way Umbraco works when it's your own control)..  One of the things to achieve that is to use the same mechanism to show messages to the user as Umbraco does. In this post we create a simple user control where the user can type a message and we will show that message using the Umbraco Speech bubble mechanism as shown in the image below.



To build this we need to create a standard WebUserControl called SpeechBubble.ascx. In the ascx file we add the following code that creates the UI and hooks up an Event Handler for the submit button.

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="SpeechBubble.ascx.cs" Inherits="SpeechBubble" %>
Message:<asp:TextBox ID="MessageTextBox" runat="server"></asp:TextBox> <asp:Button ID="SpeechButton" runat="server" onclick="SpeechButton_Click" Text="Submit" />

In the Code Behind file we will add the following code:

   1:  using System;
   2:  using umbraco.BasePages;
   4:  public partial class SpeechBubble : System.Web.UI.UserControl
   5:  {
   6:      protected void SpeechButton_Click(object sender, EventArgs e)
   7:      {
   8:          if (Page is BasePage)
   9:          {
  10:              //Okay we are in Umbraco
  11:              ((BasePage)Page).speechBubble(, "Message", MessageTextBox.Text);
  12:          }
  13:      }
  14:  }

We will run this code as an Dashboard Control which runs in the Umbraco context. Therefore we can cast the Page Type to a the Umbraco BasePage type and then use the speechBubble method which displays the message. If you want to play with this yourself, you can download the usercontrol here. Add the files in this zip file to the UserControl folder of Umbraco  and Modifiy the Dashboard.Config file which you can find in the Config folder:

<?xml version="1.0" encoding="utf-8" ?> 

    <tab caption="SpeechBubble">

Then when you login to Umbraco and go to the developer section you can send messages to yourself. Have fun.

Comments [3] | | # 
# Friday, 23 January 2009
Friday, 23 January 2009 16:19:45 (GMT Standard Time, UTC+00:00) ( Package | Umbraco )

This Blog is not active anymore, further posts will be available on my company website. Read new posts here

Content Maintenance Dashboard is a simple package to bulk publish, unpublish and delete content items based on name,state and document type. When you install it and go to the developer section of Umbraco you can see the search screen like the image below. From the search results screen you can perform actions on a single Item or you can choose to perform the same action on all the items in the search result.


The package is using sql to search for the documents. I'm using the new datalayer so it should be working on any type of database that is supported by Umbraco, however I only tested the package on SQL Server. I have tested this package also on the Umbraco RC3 release(this is probably the first package that is compiled against the RC3 Binaries). You can download the package here, if you want the complete source code you can download it here.

Comments [7] | | # 
# Wednesday, 21 January 2009
Wednesday, 21 January 2009 08:38:02 (GMT Standard Time, UTC+00:00) ( Umbraco )

This Blog is not active anymore, further posts will be available on my company website. Read new posts here

Voor de echte Umbracoholics in de Benelux organiseert de Umbraco gebruikersgroep Benelux op zaterdag 21 februari haar tweede gebruikersbijeenkomst in Amsterdam. Het belooft weer een zeer informatieve dag te worden waar de nadruk uiteraard zal liggen op Umbraco V4, waarvan de tweede release candidate inmiddels uit is. In een informele sfeer zullen onder andere de volgende  onderwerpen behandeld worden.

  • Umbraco een showcase. 
  • Umbraco V4, een overzicht
  • Canvas (voorheen Live Editing)
  • DataLayer.
  • Event model.
  • Uitbreiden van Umbraco.

Uiteraard bestaat er ook de mogelijkheid je eigen implementaties, of ontwikkelde packages te tonen.

De gebruikersdag wordt gehouden bij Mirabeau in Amsterdam. Mirabeau is als full service internet bureau betrokken bij enkele grotere Umbraco implementaties, waarvan er één als showcase gepresenteerd zal worden.  Klik hier voor adres informatie en een routebeschrijving.

We zullen beginnen om 9:30 en eindigen rond 16:00. De gebruikersdag is gratis, het enige dat we vragen is je even in te schrijven via dit formulier. Doe dit snel, het aantal plaatsen is beperkt.

Tot zaterdag 21 februari.  

Comments [0] | | # 
# Thursday, 08 January 2009
Thursday, 08 January 2009 21:41:44 (GMT Standard Time, UTC+00:00) ( Tools | Umbraco )

This Blog is not active anymore, further posts will be available on my company website. Read new posts here

Last September I've created a package called UmbImport which is capable of importing content  from various datasources into Umbraco. For a demo of this package please checkout the video below.

UmbImport from Richard Soeteman on Vimeo.

The package was based on Beta1 of Umbraco 4 and threw errors when installing on Umbraco 4 RC.  I've fixed these bugs and created a new package. Currently I'm also working on a new version that is capable of importing members and I will add support for plugging in your own datasource, so you can import data from any datasource you like.

Download umbImport here

Comments [7] | | # 
# Thursday, 09 October 2008
Thursday, 09 October 2008 22:30:46 (GMT Daylight Time, UTC+01:00) ( )

This Blog is not active anymore, further posts will be available on my company website. Read new posts here

Mensen die me al wat langer kennen weten dat mijn carrière als Microsoft Developer ooit begonnen is als programmeur bij Internet Bureau Indivirtual, in de begin periode nog Netpresence. Ruim een jaar geleden heb ik Soeteman Software opgericht en wilde me weer meer met CMS implementaties bezig gaan houden. Echter heb ik niet de ambitie zelf een CMS in elkaar te zetten, wel moet een dergelijk systeem goed in elkaar zitten en het liefst Open Source  zijn. Zoekend naar een dergelijk op .NET gebaseerd Open source CMS kwam als eerste optie DotNetNuke naar voren, dit CMS is namelijk redelijk bekend. Na even met dit systeem gespeeld te hebben kwam al vrij snel naar voren dat DotNetNuke niet het pakket is wat ik mijn eindgebruiker wil aandoen. De UserInterface is alles behalve gebruikersvriendelijk en ook in layout ben je beperkt, ook al zegt men van niet.

Op een Dotned gebruikersavond kwam ik iemand tegen die me wees op Umbraco. Umbraco bied me standaard alles wat ik van een CMS verwacht. Een mooie gebruikers interface, overzichtelijk en werkt voor de eindgebruiker zeer intuïtief. Door het gebruik van templates en document types waarmee je de content onderdelen samen stelt is het in te passen in elk design. Zelfs het type content is variabel.  Zo kan content gebruikt worden voor een HTML pagina maar kan het middels een andere template ook gebruikt worden voor XML output wat erg handig is als je de content bijvoorbeeld in een flash animatie of iets dergelijks wilt gebruiken. Ook is het mogelijk je standaard .NET (user) controls die je in de site of webapplicatie wil gebruiken te koppelen via de public properties  en wil je eigen functionaliteit toevoegen aan Umbraco is daar negen van de tien keer een standaard Interface voor waardoor je eigen functionaliteit zo kan inpluggen. Oh ja het is nog Open Source ook. Al met al  heeft me dit vrij snel doen besluiten dat dit het CMS is wat ik standaard voor projecten inzet. Mocht je zelf voor de keuze staan om een CMS te selecteren en je wilt wat meer weten over Umbraco, schroom dan niet om contact op te nemen. 


Umbraco kent eigenlijk slechts één nadeel en dat is dat de Nederlandse community erg klein is. Wereldwijd is de community wel redelijk groot. De content die voortaan op mijn weblog zal verschijnen zal meer Umbraco dan .NET algemeen gerelateerd zijn, Immers over .NET is het meeste wel geschreven en voor Umbraco is dit helaas nog niet het geval. Therefore future posts will be in English.

Comments [0] | | # 
# Sunday, 03 August 2008
Sunday, 03 August 2008 08:27:53 (GMT Daylight Time, UTC+01:00) ( Visual Studio )

This Blog is not active anymore, further posts will be available on my company website. Read new posts here

We kennen allemaal de kracht van een debug visualizer, even snel de data van een dataset bekijken, selecteer de juiste visualizer in Visual Studio en een mooi debugger dialog window wordt getoond met daarin je complete datastructuur en data. Het maken van een debugger visualizer is ook redelijk simpel. Voor wie dat nog nooit heeft gedaan raad ik aan deze video eens te bekijken.

Het nadeel van deze video en andere tutorials die over dit onderwerp gaan is dat ze altijd een serializable object gebruiken. Nu zijn je eigen objecten vaak wel serializable, maar er zijn ook heel veel objecten niet serializable en soms wil je daar echt een visualizer voor hebben. Probeer je deze objecten toch te gebruiken krijg je de volgende foutmelding te zien.


Een aantal maanden geleden werkte ik op een project waar intensief gebruik werd gemaakt van querystring- en formulierdata en wilde hiervoor een Visualizer maken. Ik werd direct geconfronteerd met bovenstaande foutmelding en besloot wat dieper in de materie te duiken. Middels onderstaand code voorbeeld zal ik uitleggen wat er gebeurd.

   1:  using System.Diagnostics;
   2:  using System.Web.UI;
   3:  using Microsoft.VisualStudio.DebuggerVisualizers;
   5:  [assembly: DebuggerVisualizer(typeof(PageErrorVisualizer.PageErrorVisualizer), typeof(VisualizerObjectSource), Target = typeof(Page), Description = "PageErrorVisualizer Visualizer")]
   6:  namespace PageErrorVisualizer
   7:  {
   8:      /// <summary>
   9:      /// The Visualizer for type System.Web.UI.Page
  10:      /// </summary>
  11:      public class PageErrorVisualizer : DialogDebuggerVisualizer
  12:      {
  13:          /// <summary>
  14:          /// Shows the object in the visualizer form
  15:          /// </summary>
  16:          protected override void Show(IDialogVisualizerService windowService, IVisualizerObjectProvider objectProvider)
  17:          {
  18:              Page page = (Page)objectProvider.GetObject();
  20:              //Initialize the Visualizer Form and Show the data
  21:              using (VisualizerForm frm = new VisualizerForm())
  22:              {
  23:                  frm.ShowVisualizer(pageData);
  24:              }
  25:          }
  26:      }
  27:  }

Wanneer je een debug visualizer maakt zal je in het Assembly attribuut moeten aangeven dat we een DebuggerVisualizer aan het maken zijn en verwacht de volgende gegevens:

  • Het object type van de Visualizer die we gaan gebruiken
  • Het object type van de VisualizerObjectSource die we willen gebruiken
  • Het object type waar we een visualizer voor willen maken
  • De omschrijving die in Visual studio wordt getoond wannneer we de visualizer selecteren

Het VisualizerObjectSource object dat standaard in visual studio zit bleek de boosdoener. In het standaard  VisualizerObjectSource object wordt er vanuit gegaan dat een object serializable is, wat dus niet altijd het geval is en daarmee de oorzaak van bovenstaande foutmelding. Nu kunnen we van deze klasse afleiden. Eén van de methoden die we kunnen overschrijven is de methode GetData. Getdata verwacht het object waar we een visualizer voor willen maken en de stream waar de data ingeplaatst mag worden.

Onderstaand voorbeeld toont een versimpelde vorm van  de klasse die ik gebruikt heb. In GetData cast ik het target object naar een page object en creëer ik een instantie van PageData object. Het PageData object is een eigen gemaakt serializable object dat de benodigde waarden kan vasthouden.  Hier kan ik vervolgens de benodigde data op plaatsen.  Uiteindelijk vervang ik het Page object in target door mijn eigen PageData object en de base functionaliteit zorgt ervoor dat het PageData object netjes serialized wordt en in de visualizer gebruikt kan worden.

   1:  using System.Data;
   2:  using System.Web;
   3:  using Microsoft.VisualStudio.DebuggerVisualizers;
   5:  namespace WebVisualizers.ObjectSource
   6:  {
   7:      /// <summary>
   8:      /// Specialized ObjectSource for System.Web.UI.Page
   9:      /// </summary>
  10:      /// <remarks>
  11:      /// This class is needed because the System.Web.UI.Page is not serializable and IVisualizerObjectProvider expects it to be serializable
  12:      /// In the GetData Method System.Web.UI.Page will be turned into something that is Serializable
  13:      /// </remarks>
  14:      public class WebPageObjectSource : VisualizerObjectSource
  15:      {
  16:          /// <summary>
  17:          /// Takes a Page object get Data from it and store it into PageData
  18:          /// Replace the target object wit PageData and call the base functionality
  19:          /// </summary>
  20:          /// <param name="target">System.Web.UI.Page</param>
  21:          /// <param name="outgoingData">Output stream (PageData)</param>
  22:          public override void GetData(object target, System.IO.Stream outgoingData)
  23:          {
  24:              if (target != null)
  25:              {
  26:                  Page page = (Page)target; ;
  27:                  PageData pageData = new PageData();
  28:                  //Fill Pagedata based on page object
  29:                  //example pageData.Add(page.Session)
  31:                  //Replace target with PageData object
  32:                  target = pageData;
  33:              }
  34:              //Call Base functionality
  35:              base.GetData(target, outgoingData);
  36:          }
  37:      }
  38:  }

Op deze manier kunnen we dus voor elk gewenst object een Debug Visualizer maken, mits we in een eigen VisualizerObjectSource klasse ervoor zorgen dat het object in target vervangen wordt door een serializable object wat de benodigde data vasthoudt.  De code die ik in deze blogpost heb gebruikt, maakt deel uit van het WebVisualizer project wat ik enige tijd geleden op codeplex heb geplaatst. De volledige source code van dit project is hier te downloaden.

Comments [0] | | # 
# Wednesday, 02 January 2008
Wednesday, 02 January 2008 19:37:06 (GMT Standard Time, UTC+00:00) ( )

This Blog is not active anymore, further posts will be available on my company website. Read new posts here

MCP(rgb) Onlangs was ik via LinkedIn lid geworden van een Microsoft Certified Professionals groep. Nadat mijn aanmelding goedgekeurd was viel het me op dat er voornamelijk scandinavische namen voorkwamen in de ledenlijst. Vanochtend werd me duidelijk wat de reden hiervoor was. Ze hadden de naam omgedoopt van "Microsoft Certified Professionals"  naar  "Microsoft Certified Professionals - Denmark". Voor mij had het dus geen zin om hier lid van de zijn. Het idee van deze groep sprak me destijds wel aan, daarom heb ik de groep "Microsoft Certified Professionals - Netherlands" op LinkedIn aangemeld.

Mocht je Microsoft gecertificeerd zijn en interesse hebben om deel te nemen kan je je aanmelden via deze link.

Comments [0] | | #