<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Tech Talk - Driessen HRM _ Payroll</title>
	<atom:link href="http://www.driessen.nl/techtalk/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.driessen.nl/techtalk</link>
	<description>Techtalk over Driessen HRM _ Payroll</description>
	<lastBuildDate>Fri, 12 Aug 2011 14:29:09 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Windows 8: eindelijk uniformiteit?</title>
		<link>http://www.driessen.nl/techtalk/windows-8-eindelijk-uniformiteit/</link>
		<comments>http://www.driessen.nl/techtalk/windows-8-eindelijk-uniformiteit/#comments</comments>
		<pubDate>Fri, 12 Aug 2011 14:25:08 +0000</pubDate>
		<dc:creator>Guido Schippers</dc:creator>
				<category><![CDATA[Algemeen]]></category>

		<guid isPermaLink="false">http://www.driessen.nl/techtalk/?p=1130</guid>
		<description><![CDATA[Gisteren kwam ik een interessante e-mail tegen in mijn mailbox. Deze kopte &#8220;Microsoft reveals first details about Windows 8&#8243;. Ik dacht: Dat zal vast niet veel voorstellen. Echter niets is minder waar; Er was gewoon een filmpje bij waarbij iemand van Microsoft het nieuwe besturingssysteem demo-de. Hieronder kan je het filmpje bekijken. Goed. Wat kunnen [...]]]></description>
			<content:encoded><![CDATA[<p>Gisteren kwam ik een interessante e-mail tegen in mijn mailbox. Deze kopte &#8220;Microsoft reveals first details about Windows 8&#8243;. Ik dacht: Dat zal vast niet veel voorstellen. Echter niets is minder waar; Er was gewoon een filmpje bij waarbij iemand van Microsoft het nieuwe besturingssysteem demo-de. Hieronder kan je het filmpje bekijken.</p>
<p><span id="more-1130"></span></p>
<p><iframe width="600" height="405" src="http://www.youtube.com/embed/p92QfWOw88I?hd=1" frameborder="0" allowfullscreen></iframe></p>
<p>Goed. Wat kunnen we hieruit concluderen? Dat alles gelukkig (?) gelijk getrokken wordt aan de interfaces van Windows Phone 7, XBox en Zune. Nu &#8216;heb elk voordeel zen nadeel&#8217;, en zo ook deze. Het feit dat Microsoft dit filmpje zo vroeg naar buiten heeft gebracht (en gaan geruchten dat Windows 8 in de tweede helft van 2012 uitgebracht wordt) heeft natuurlijk als reden gehad dat ze simpelweg aandacht willen krijgen voordat ze worden ondergesneeuwd door Google (Chromium OS) of Apple (iOS 5). Echter had ik gisteren een blog gelezen, waarin er goede tegenargumentatie besproken werd. De kans bestaat namelijk dat de verkoop van Windows 7 door een aankondiging als deze ingeperkt wordt.</p>
<p>De post is <a href="http://mobileopportunity.blogspot.com/2011/06/windows-8-beginning-of-end-of-windows.html" target="_blank">hier</a> te lezen. Hij maakt een goede opmerking over het koopgedrag van de consument: Wanneer je weet dat de opvolger eraan komt, wat zou de consument dan motiveren om de huidige versie aan te schaffen?</p>
<p>En waar die post dan geen rekening mee houdt: ons ontwikkelaars. Gaat Windows 8 nu ook gebruik maken van Silverlight als basis voor haar applicaties? Zal het slechts HTML5 applicaties gaan betreffen? Hoe gaan ze om met bestaande softwarepakketten (third party)? Dit zijn allemaal punten waar wij in ieder geval straks rekening mee moeten houden. Nu laat het filmpje wel zien dat er een oudere shell (Windows 7) beschikbaar is, maar ik persoonlijk vind dat niet de beste oplossing. Nu biedt dit denk ik wel de beste mogelijkheid voor backwards-compatibility, zowel voor de programma&#8217;s als voor de gebruikers zelf.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.driessen.nl/techtalk/windows-8-eindelijk-uniformiteit/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Multi UI-platform Model View Presenter</title>
		<link>http://www.driessen.nl/techtalk/model-view-presenter-in-windows-forms/</link>
		<comments>http://www.driessen.nl/techtalk/model-view-presenter-in-windows-forms/#comments</comments>
		<pubDate>Tue, 29 Mar 2011 10:10:18 +0000</pubDate>
		<dc:creator>Randy Keyers</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Algemeen]]></category>

		<guid isPermaLink="false">http://www.driessen.nl/techtalk/?p=1107</guid>
		<description><![CDATA[Er is inmiddels een vrijwel onuitputtelijke lijst met programmeermodellen: MVP, MVC, MVVM, MVPP enzovoorts. Allemaal met hun eigen voors- en tegens. RAP wordt op dit moment gebouwd op basis van MVC (Model View Controller), de overige (wat meer data-entry) applicaties worden gebouwd op MVP (Model View Presenter). Maar dan ECHT multi UI platform, met behulp van ons [...]]]></description>
			<content:encoded><![CDATA[<p>Er is inmiddels een vrijwel onuitputtelijke lijst met programmeermodellen: MVP, MVC, MVVM, MVPP enzovoorts. Allemaal met hun eigen voors- en tegens.<br />
RAP wordt op dit moment gebouwd op basis van MVC (Model View Controller), de overige (wat meer data-entry) applicaties worden gebouwd op MVP (Model View Presenter). Maar dan ECHT multi UI platform, met behulp van ons Driessen framework.<span id="more-1107"></span></p>
<p>Voor degenen voor wie het niet duidelijk is wat Model View Presenter doet, zal ik het even toelichten.</p>
<p><strong>Model</strong> staat voor het Model Domain: Het (business) probleem dat je op probeert te lossen.<br />
<strong>View</strong> staat voor de UI waarmee je met de gebruiker gaat communiceren.<br />
<strong>Presenter</strong> staat voor de laag tussen die je Model fysiek van de View scheidt. Deze laag zorgt ervoor dat je Model niet afhankelijk is van je UI. In de praktijk blijkt deze laag ook uitermate geschikt voor unittesting. Je bent immers niet langer afhankelijk van je UI om je businesslogic te kunnen testen.</p>
<p>In de praktijk zal bestaat het Model vaak uit een of meer data entiteiten en businessrules. De view bestaat uit een interface die de mogelijkheden die de UI heeft omschrijft. De UI (Windows/WPF/Silverlight/Web/???) implementeert de view interface. De presenter zorgt voor de communicatie tussen de view interface en het model.</p>
<div id="attachment_1127" class="wp-caption aligncenter" style="width: 421px"><a href="http://www.driessen.nl/techtalk/wp-content/uploads/2011/03/MVP-Schematic-Model.png"><img class="size-full wp-image-1127" title="MVP Schematic Model" src="http://www.driessen.nl/techtalk/wp-content/uploads/2011/03/MVP-Schematic-Model.png" alt="MVP Schematic Model" width="411" height="650" /></a><p class="wp-caption-text">MVP Schematic Model</p></div>
<p><strong>Voorbeeld:</strong><br />
Als voorbeeld gebruik ik een zeer vereenvoudigde manier om persoonsgegevens te muteren.</p>
<p>UI wordt geladen en roept op de Presenter een Initialize method aan. De presenter gebruikt het Model om de juiste gegevens te verzamelen. Vervolgens roept de presenter op de View de FillFields method aan en geeft de data als parameter mee. De UI die de View implementeert weet hoe de data weergegeven moet worden.</p>
<p>Vervolgens wordt er op OK geklikt. De OK button roept op de Presenter de SaveData method aan met de data, waarna de Presenter aan het Model opdracht geeft om eventuele wijzigingen op te slaan. Als hierbij een regel overtreden wordt, dan ontvangt de Presenter van het Model een validatie waarschuwing. De Presenter roept op de View een method aan aan met het validatiebericht, waarop de UI zorgt dat de melding getoond wordt.</p>
<p>Op deze manier is het zelfs mogelijk om twee hele verschillende UI&#8217;s dezelfde taak te laten uitvoeren. Als de UI de View inteface implementeert en de juiste calls op de presenter maakt zal het gewoon werken. De UI is in feite nog maar een heel dun schilletje dat geen enkele logica meer bevat.</p>
<p>Klinkt makkelijk he?</p>
<p>Is het deels ook. Deels ook helemaal niet. Dat komt door de fundamenteel verschillende manieren waarop een UI platform kan werken.<br />
Als je je namelijk bij het ontwerp van je MVP classes en interfaces alleen richt op Windows Forms applicaties dan kom je jezelf onherroepelijk tegen als je deze classes wil gebruiken in een ASP.NET Webforms applicatie. Je hebt namelijk waarschijnlijk je hele ontwerp erop gebaseerd dat je state hebt. En dat heb je in ASP.NET niet op dezelfde manier zoals je dat in een Windows Forms applicatie. ASP.NET is in de basis zo stateless als maar zijn kan. &#8216;Gewoon&#8217; even wat data in memory houden is er dus niet bij. Met statics moet je in ASP.NET Webforms rekening houden met multithreading.</p>
<p>Ok, dan vliegen we het toch aan vanuit de hoek van ASP.NET Webforms? Als je je bij het ontwerp van je MVP classes en interfaces alleen richt op ASP.NET Webforms dan kom je jezelf waarschijnlijk ook tegen. Je hebt het state probleem namelijk zojuist waarschijnlijk opgelost door gebruik te maken van je SessionState of Cache, wat het gebruik van deze classes en interfaces in een Windows Forms applicatie (bij het gebrek aan deze twee middelen) op zijn zachtst gezegd tot een uitdaging maakt.</p>
<p><strong>I bring to you: Stateless Windows Forms.</strong><br />
Als je dus geen gebruik mag maken van de &#8216;statehulpmiddelen&#8217; van ASP.NET, dan is ASP.NET WebForms tot nu toe helaas stateless. Daar doe je weinig aan. Bij Windows Forms heb je, hoewel het in het begin misschien wat vreemd aanvoelt, de keuze. Als je er rekening mee houdt dat je MVP classes en interfaces geen gebruik mogen maken van de state die Windows Forms biedt, maar ook niet van de technieken die ASP.NET biedt om het state(less) probleem op te lossen, dan kom je al een heel eind. Om jezelf te dwingen om hier rekening mee te houden doe je er goed aan om je Views en Presenters in een apart project onder te brengen waarbij je System.Windows.?? en System.Web.?? weigert te referencen. Bij je Model (data en businesslogic) hield je hier (als het goed is) al rekening mee.</p>
<p><strong>Oplossing in het Driessen Framework<br />
</strong>Met  bovengenoemde uitdaging in het achterhoofd hebben we in het framework een kleine &#8216;MVP Suite&#8217; gebouwd die het voor de develpers makkelijk moet maken om applicaties standaard op MVP op te tuigen. Zo is straks een eventuele overstap van Windows Forms naar WPF ook eenvoudiger.</p>
<p>Het klinkt misschien vrij complex maar de daadwerkelijke implementatie is eigenlijk een lachertje, als je het concept maar snapt.</p>
<p><strong>Model<br />
</strong>Voor het Model hebben we in het Driessen Framework een BaseModel class gebouwd. De specifieke model class zal hiervan inheriten en bevat, naast de data entiteit en eventuele gerelateerde gegevens, de businesslogic voor het domain model. Deze class is gebouwd volgens stateless sessions, maar zonder gebruik te maken van SessionState of Caching. In Web gebruik je wel het SessionId om de sessie voor de dataclass te identificeren. In Windows bepaald het entry form een SessionId door een GUID hiervoor te genereren. De data wordt gecached via een custom caching systeem dat dus multi-platform werkt. Dit systeem zorgt er bijvoorbeeld ook automatisch voor voor dat disposes op het juiste moment plaatsvinden.</p>
<pre class="brush: csharp; title: ; notranslate">
 /// &lt;summary&gt;
/// Base model for MVP projects that is able to work stateless/cross-session
/// Inherit: MyModel:BaseModel&lt;MyModel&gt;
/// &lt;/summary&gt;
/// &lt;typeparam name=&quot;TModelType&quot;&gt;The type of the model that inherits this BaseModel&lt;/typeparam&gt;
/// &lt;example&gt;
/// How to implement:
/// MyModel:BaseModel&lt;MyModel&gt;;
/// {
///    OtherEntityGrid otherEntityGrid;
///
///     public override Init(IBaseClass baseClass, IList&lt;RelatedItem&gt;relatedItems)
///     {
///         base.Init(baseClass, relatedItems);
///
///         otherEntityGrid = new OtherEntityGrid(baseClass.Core);
///         AutoDispose.Add(otherEntityGrid);
///     }
/// }
///
/// How to retrieve an instance:
/// MyModel myModel = MyModel.GetInstance(sessionId);
///
/// if (!myModel.Initialized)
/// {
///     myModel.Init(baseClass);
/// }
/// &lt;/example&gt;
public class BaseModel&lt;TModelType&gt; : IDisposable
where TModelType : IDisposable
{
   #region Instance Members

    private readonly DisposableList autoDispose = new DisposableList();

    /// &lt;summary&gt;
   /// Auto dispose list for the Model to use to automatically dispose resources
   /// &lt;/summary&gt;
   protected IList&lt;IDisposable&gt; AutoDispose
   {
      get
      {
         return autoDispose;
      }
   }

   /// &lt;summary&gt;
   /// True after the Init method was called
   /// &lt;/summary&gt;
   public virtual bool Initialized
   {
      get;
      private set;
   }

   /// &lt;summary&gt;
   /// The baseclass used for editing
   /// &lt;/summary&gt;
   public virtual IBaseClass BaseClass
   {
      get;
      private set;
   }

   /// &lt;summary&gt;
   /// The related items of the class
   /// &lt;/summary&gt;
   public virtual IList&lt;RelatedItem&gt; RelatedItems
   {
      get;
      private set;
   }

   /// &lt;summary&gt;
   /// Initializes the model
   /// &lt;/summary&gt;
   /// &lt;param name=&quot;baseClass&quot;&gt;The main baseclass of the model (optional)&lt;/param&gt;
   /// &lt;param name=&quot;relatedItems&quot;&gt;Related items for the model (optional)&lt;/param&gt;
   public virtual void Init(IBaseClass baseClass = null, IList&lt;RelatedItem&gt; relatedItems = null)
   {
      Initialized = true;
      BaseClass = baseClass;
      RelatedItems = relatedItems;
   }

   #endregion

   #region Static Members

   /// &lt;summary&gt;
   /// The default cache session id
   /// &lt;/summary&gt;
   private const string defaultSesionId = &quot;[DefaultSession]&quot;;

   /// &lt;summary&gt;
   /// The cache for session support
   /// &lt;/summary&gt;
   private static volatile DisposableDictionary&lt;string, TModelType&gt; cache = new DisposableDictionary&lt;string, TModelType&gt;();

   /// &lt;summary&gt;
   /// Gets an instance from the cache for the provided session (or for the default session)
   /// Creates a new instance if no instance exists for the session yet
   /// &lt;/summary&gt;
   /// &lt;param name=&quot;sessionId&quot;&gt;The session to get an instance for (optional)&lt;/param&gt;
   /// &lt;returns&gt;The instance for the provided session (or the default session instance)&lt;/returns&gt;
   public static TModelType GetInstance(string sessionId = defaultSesionId)
   {
      EnsureCache();

      TModelType returnValue;
      if (!cache.TryGetValue(sessionId, out returnValue))
      {
         returnValue = Activator.CreateInstance&lt;TModelType&gt;();
         cache.Add(sessionId,returnValue);
      }
      return returnValue;

   }

   /// &lt;summary&gt;
   /// Disposes the content for the session
   /// &lt;/summary&gt;
   /// &lt;param name=&quot;sessionId&quot;&gt;The session to dispose the content for (optional)&lt;/param&gt;
   public static void Dispose(string sessionId = defaultSesionId)
   {
      TModelType itemToDispose;

      if (cache != null &amp;&amp; cache.TryGetValue(sessionId, out itemToDispose))
      {
         itemToDispose.Dispose();
         cache.Remove(sessionId);
      }
   }

   /// &lt;summary&gt;
   /// Disposes the entire content of the cache
   /// &lt;/summary&gt;
   public static void DisposeAll()
   {
      if (cache != null)
      {
         cache.Dispose();
         if (cache.Count &gt; 0)
               cache.Clear();
      }
   }

   /// &lt;summary&gt;
   /// Ensures the existance of the cache
   /// &lt;/summary&gt;
   private static void EnsureCache()
   {
      if (cache == null)
         cache = new DisposableDictionary&lt;string, TModelType&gt;();
   }
   #endregion

   #region IDisposable

   /// &lt;summary&gt;
   /// Disposes the instance
   /// &lt;/summary&gt;
   public void Dispose()
   {
      Dispose(true);
      GC.SuppressFinalize(this);
   }

   /// &lt;summary&gt;
   /// Disposes the instance
   /// &lt;/summary&gt;
   /// &lt;param name=&quot;disposing&quot;&gt;Disposes managed objects&lt;/param&gt;
   protected virtual void Dispose(bool disposing)
   {
      if (disposing)
         autoDispose.Dispose();
   }
   #endregion

   }
}
</pre>
<p><strong>View<br />
</strong>Voor communicatie vanuit de businessrules naar de UI hebben we een 2-tal simpele call mechanismen in een standaard View interface gegoten waarmee een eenvoudig bericht of een validation result naar de UI doorgegeven kan worden. De UI bepaalt op welke manier dit weergegeven wordt, afhankelijk van het platform waarop gewerkt wordt.</p>
<pre class="brush: csharp; title: ; notranslate">
/// &lt;summary&gt;
/// The MVP view base
/// &lt;/summary&gt;
public interface IViewBase
{
   /// &lt;summary&gt;
   /// Shows a message
   /// &lt;/summary&gt;
   /// &lt;param name=&quot;messageText&quot;&gt;The message text&lt;/param&gt;
   /// &lt;param name=&quot;icon&quot;&gt;The message icon&lt;/param&gt;
   void ShowMessage(string messageText, ShowMessageIcon icon = ShowMessageIcon.Information);
   /// &lt;summary&gt;
   /// Shows the validation result
   /// &lt;/summary&gt;
   /// &lt;param name=&quot;validationResult&quot;&gt;The validationreuslt&lt;/param&gt;
   void ShowMessage(ValidationResult&lt;ValidationMessage&gt; validationResult);
}
</pre>
<p><strong></strong><strong>Presenter<br />
</strong>Voor de presenters hebben we in het framework een base class gemaakt die het BaseModel kan managen en initialiseren. De presenter zorgt zelf dat hij steeds de juiste data voor de huidige session paraat heeft staan als hij een call ontvangt.</p>
<pre class="brush: csharp; title: ; notranslate">
/// &lt;summary&gt;
/// Base Presenter class
/// &lt;/summary&gt;
/// &lt;typeparam name=&quot;TView&quot;&gt;The view corresponding to the presenter&lt;/typeparam&gt;
/// &lt;typeparam name=&quot;TModelType&quot;&gt;The type of the model&lt;/typeparam&gt;
public class PresenterBase&lt;TView, TModelType&gt;
where TView:IViewBase
where TModelType:BaseModel&lt;TModelType&gt;
{
  /// &lt;summary&gt;
  /// The view corresponding to the presenter
  /// &lt;/summary&gt;
  protected TView View
  {
    get;
    private set;
  }
  /// &lt;summary&gt;
  /// The model for the presenter
  /// &lt;/summary&gt;
  protected TModelType Model
  {
    get;
    private set;
  }
  /// &lt;summary&gt;
  /// The session ID
  /// &lt;/summary&gt;
  protected string SessionId
  {
     get;
     set;
  }
  /// &lt;summary&gt;
  /// Constructor
  /// &lt;/summary&gt;
  /// &lt;param name=&quot;view&quot;&gt;The view corresponding to the presenter&lt;/param&gt;
  public PresenterBase(TView view)
  {
    View = view;
  }
  /// &lt;summary&gt;
  /// Initializes the presenter and gets the Data class instance for the session
  /// &lt;/summary&gt;
  /// &lt;param name=&quot;sessionId&quot;&gt;The session ID to get the Data class instance for&lt;/param&gt;
  /// &lt;param name=&quot;baseClass&quot;&gt;A baseclass to work with (optional, not used at the framework level)&lt;/param&gt;
  public virtual void Init(string sessionId, IBaseClass baseClass = null)
  {
    SessionId = sessionId;
    Model = BaseModel&lt;TModelType&gt;.GetInstance(sessionId);
  }

 </pre>
<p>De combinatie van deze drie vormt een krachtig middel om ècht platform onafhankelijk het MVP concept te gebruiken.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.driessen.nl/techtalk/model-view-presenter-in-windows-forms/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Data changelog</title>
		<link>http://www.driessen.nl/techtalk/data-changelog/</link>
		<comments>http://www.driessen.nl/techtalk/data-changelog/#comments</comments>
		<pubDate>Fri, 25 Mar 2011 13:22:25 +0000</pubDate>
		<dc:creator>Randy Keyers</dc:creator>
				<category><![CDATA[Algemeen]]></category>

		<guid isPermaLink="false">http://www.driessen.nl/techtalk/?p=1099</guid>
		<description><![CDATA[Zeker als het gaat om gevoelige informatie zoals persoons- of salarisgegevens wil je een uitgebreide audit bijhouden van wijzigingen die gemaakt worden op deze gegevens. Ons eigen development framework bevatte al langer de ActionAudit class die gebruikt werd om dergelijke audits bij te houden. Dat deed hij in principe goed, maar het bleef de taak [...]]]></description>
			<content:encoded><![CDATA[<p>Zeker als het gaat om gevoelige informatie zoals persoons- of salarisgegevens wil je een uitgebreide audit bijhouden van wijzigingen die gemaakt worden op deze gegevens.</p>
<p>Ons eigen development framework bevatte al langer de ActionAudit class die gebruikt werd om dergelijke audits bij te houden. Dat deed hij in principe goed, maar het bleef de taak van de developer om op het juiste moment de juiste data via de ActionAudit te loggen. Zou het niet handig zijn als dit automatisch ging, met een minimale performance impact?<span id="more-1099"></span></p>
<p>Met dit in het achterhoofd ben ik aan de slag gegaan en niet zonder resultaat al zeg ik het zelf.</p>
<p>In ons framework hebben we een eigen ORM implementatie. We genereren dus typed classes tegen de tabellen in de database die een hoop logic en datahandling van de developer overnemen. Voor de datahandling worden automatisch stored procedures gegenereerd. In de ORM generator kunnen we vanalles instellen, uiteenlopend van dataformats tot lookups en zelfs de captions die in de UI voor een veld gebruikt worden.</p>
<p>Sinds gisteren hebben we daar een optie bij: Is Logged. Het enige dat een developer nu nog hoeft te doen om een volledige change audit te realiseren, is die optie inschakelen. Er hoeft verder niets aangepast te worden. Het begint gelijk te werken.</p>
<div id="attachment_1100" class="wp-caption alignnone" style="width: 665px"><a href="http://www.driessen.nl/techtalk/wp-content/uploads/2011/03/generator.png"><img class="size-full wp-image-1100" title="Generator" src="http://www.driessen.nl/techtalk/wp-content/uploads/2011/03/generator.png" alt="Generator - Tabelinstellingen" width="655" height="345" /></a><p class="wp-caption-text">Generator - Tabelinstellingen</p></div>
<p>Op het moment dat een developer deze optie inschakelt, wordt er naast de tabel een _log tabel geplaatst die dezelfde velden bevat als de tabel die gelogd moet worden, plus nog een aantal gegevens zoals: de soort mutatie, de datum/tijd van de mutatie en wie de mutatie heeft uitgevoerd.  Verder worden de insert,update en delete stored procedures die voor de tabel gegenereerd worden, uitgebreid zodat ze in een moeite door ook direct een audit regel in de bijbehorende _log tabel schrijven. De log tabel bevat geen indexes of constraints om hem zo light-weight mogelijk te maken. Zero-impact bestaat niet, maar we proberen natuurlijk wel weg te laten wat niet strikt noodzakelijk is.</p>
<div id="attachment_1101" class="wp-caption alignnone" style="width: 608px"><a href="http://www.driessen.nl/techtalk/wp-content/uploads/2011/03/log.png"><img class="size-full wp-image-1101" title="Log" src="http://www.driessen.nl/techtalk/wp-content/uploads/2011/03/log.png" alt="Log" width="598" height="325" /></a><p class="wp-caption-text">Log</p></div>
<p> Op deze manier is met maximale performance toch precies te volgen wat er wanneer door wie gemuteerd is, zonder dat er door de developer in code iets aangepast hoeft te worden.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.driessen.nl/techtalk/data-changelog/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Van WebForms naar MVC</title>
		<link>http://www.driessen.nl/techtalk/van-webforms-naar-mvc-2/</link>
		<comments>http://www.driessen.nl/techtalk/van-webforms-naar-mvc-2/#comments</comments>
		<pubDate>Fri, 18 Feb 2011 11:43:39 +0000</pubDate>
		<dc:creator>Ronald Strijbosch</dc:creator>
				<category><![CDATA[Geen rubriek]]></category>

		<guid isPermaLink="false">http://www.driessen.nl/techtalk/?p=1076</guid>
		<description><![CDATA[Omdat onze huidige RAP web-applicatie (die gebouwd is met webforms) niet meer helemaal aan de huidige wensen voldoet, mogen we deze geheel opnieuw gaan ontwikkelen. Tijdens ons bezoek aan de DevConnections in Las Vegas zijn we goed geïnformeerd over de mogelijkheden van MVC in combinatie met het Entity Framework. Dus de keuze File &#8211; New – [...]]]></description>
			<content:encoded><![CDATA[<div class="mceTemp">
<p>Omdat onze huidige RAP web-applicatie (die gebouwd is met webforms) niet meer helemaal aan de huidige wensen voldoet, mogen we deze geheel opnieuw gaan ontwikkelen. Tijdens ons bezoek aan de DevConnections in Las Vegas zijn we goed geïnformeerd over de mogelijkheden van MVC in combinatie met het Entity Framework. Dus de keuze File &#8211; New – Project – ASP.NET MVC3 WebApplication was snel gemaakt&#8230; Binnen enkele seconden heb je een compleet werkende applicatie om mee te starten. Voeg hier nog een class library met een Entity model voor de database aan toe en je kunt vooruit.<span id="more-1076"></span>Een van de eerste uitdagingen waar we tegen aan gelopen zijn, wil ik hier wat verder uitdiepen. We willen voor de navigatie gebruik maken van een hoofdmenu, bestaande uit iconen en meerdere submenu‘s, met iconen en een korte tekst.</p>
</div>
<div class="mceTemp">
<div id="attachment_1077" class="wp-caption alignnone" style="width: 619px"><a href="http://www.driessen.nl/techtalk/wp-content/uploads/2011/03/vanwebformsnaarmvc-1.png"><img class="size-full wp-image-1077" title="RAP Menu MVC" src="http://www.driessen.nl/techtalk/wp-content/uploads/2011/03/vanwebformsnaarmvc-1.png" alt="RAP Menu MVC" width="609" height="73" /></a><p class="wp-caption-text">RAP Menu MVC</p></div>
</div>
<h2>HTML helpers</h2>
<p>Voor het genereren van HTML wordt in MVC gebruik gemaakt van Html helpers. Er worden geen helpers mee geleverd om hyperlinks te maken voorzien van een afbeelding, dus die hebben we zelf geschreven. Gelijk maar in een class library geplaatst, omdat we verwachten dat er nog wel meer bij zullen komen en zodoende deze ook in toekomstige projecten hergebruikt kunnen worden.<br />
Nog even gekeken of we de TagBuilder zouden gebruiken danwel XElements, maar met XElements genereer je pure XML en dus geen HTML, wat nou juist de bedoeling is.</p>
<h2>Sitemaps</h2>
<p>Met onze eigen HTML helpers kunnen we nu eenvoudig de gewenste menu’s toevoegen aan de (master)View, die gebruikt wordt voor de layout van de pagina’s. Echter hebben we dan statische menu’s en we willen graag dynamische menu’s hebben door gebruik te maken van SiteMaps zoals dit ook in de huidige applicatie gedaan wordt. Helaas is dit mechanisme in MVC standaard  niet voorhanden.<br />
Op CodePlex hebben we een ASP.NET MVC SiteMap provider gevonden die precies doet wat we willen en ons een HTML helper geeft voor het genereren van een menu. Door het maken van  DisplayTemplates voor het hoofdmenu en de submenu’s kunnen we e.e.a, eenvoudig koppelen aan bovenstaande helpers voor de hyperlinks.</p>
<div>
<div id="imcontent">
<pre class="brush: xml; title: ; notranslate">
&lt;mvcSiteMap xmlns=&quot;href=&quot;http://mvcsitemap.codeplex.com/schemas/MvcSiteMap-File-3.0&quot; enableLocalization=&quot;true&quot;&gt;
    &lt;mvcSiteMapNode title=&quot;SitemapRootDummy&quot; clickable=&quot;false&quot; changeFrequency=&quot;Always&quot; updatePriority=&quot;Normal&quot; key=&quot;SitemapRootDummy&quot;&gt;
        &lt;mvcSiteMapNode title=&quot;Start&quot; controller=&quot;EmployerHome&quot; action=&quot;Index&quot; icon=&quot;Home&quot; changeFrequency=&quot;Always&quot; updatePriority=&quot;Normal&quot; /&gt;

        &lt;mvcSiteMapNode title=&quot;Extra&quot; controller=&quot;EmployerHome&quot; action=&quot;Extra&quot; icon=&quot;Other&quot; changeFrequency=&quot;Always&quot; updatePriority=&quot;Normal&quot;&gt;

            &lt;mvcSiteMapNode title=&quot;Cvdr export&quot;   controller=&quot;EmployerExtra&quot; action=&quot;CvdrExport&quot; icon=&quot;SmallOther&quot; /&gt;

            &lt;mvcSiteMapNode title=&quot;Portaalbeheer&quot; controller=&quot;EmployerExtra&quot; action=&quot;Admin&quot;      icon=&quot;SmallOther&quot; /&gt;

            &lt;mvcSiteMapNode title=&quot;FAQ/Support&quot;   controller=&quot;EmployerExtra&quot; action=&quot;Support&quot;    icon=&quot;SmallOther&quot; /&gt;

        &lt;/mvcSiteMapNode&gt;

    &lt;/mvcSiteMapNode&gt;

&lt;/mvcSiteMap&gt;
</pre>
</div>
</div>
<p>Op deze manier kunnen we elk gewenst menu maken zonder de layout pagina aan te hoeven te passen.</p>
<div class="mceTemp">
<h2>Sprites</h2>
<p>Bij een uitgebreid menu komen er op deze manier een aanzienlijk aantal (kleine) afbeeldingen op een pagina, die èèn voor èèn van de server over het netwerk naar de client-browser gestuurd moeten worden. Om de performance te verbeteren, wat een van de eisen aan de nieuwe web-applicatie is, maken we gebruik van sprites. Dit is een techniek waarbij er maar één afbeelding verstuurd wordt die is opgebouwd uit meerdere kleine afbeelingen.</p>
</div>
<div id="attachment_1078" class="wp-caption alignnone" style="width: 310px"><a href="http://www.driessen.nl/techtalk/wp-content/uploads/2011/03/sprites-mvc.png"><img class="size-medium wp-image-1078" title="Sprites mvc" src="http://www.driessen.nl/techtalk/wp-content/uploads/2011/03/sprites-mvc-300x46.png" alt="Sprites mvc" width="300" height="46" /></a><p class="wp-caption-text">Sprites mvc</p></div>
<div class="mceTemp">
<p>Door het zetten van een style op een img tag kan het gewenste gedeelde (een icoontje) uit de afbeeling gehaald worden.</p>
<pre class="brush: css; title: ; notranslate">
.LargeGlassIcons_SearchOpen-png {

width:48px;

height:48px;

background-image:url(sprite0.png);

background-position:-1078px -0px; }
</pre>
<p>Voor moderne browsers is het ook mogelijk om de bits van een icoon als source op te geven en hoeft er helemaal geen afbeelding meer verstuurd te worden.</p>
<pre class="brush: css; title: ; notranslate">
.LargeGlassIcons_SearchOpen-png {

width:48px;

height:48px;

background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAABGdBTUEAAK~

…

~/) no-repeat 0% 0%; }|
</pre>
<p>Om het samenstellen en gebruiken van sprites te vereenvoudigen heeft Microsoft recent preview 3 versie van het Sprite and Image Optimalization Framework uitgebracht.<br />
Door nu alle gewenste iconen in een speciale map te plaatsen zorgt het framework er voor dat, tijdens compileren, een samengestelde afbeelding wordt gegenererd. Ook worden er twee cascading stylesheets gegeneerd, een voor oudere browsers en een voor moderne brouwsers.<br />
Gelukkig voor ons is dit een open-source project waardoor de broncode beschikbaar is en we een signed assembly kunnen compileren, want dat is de manier waarop we werken!</p>
<p>Nu nog een aantal unittests bouwen om af te dekken dat onze (herbruikbare) class libraries ook precies doen, en blijven doen, wat we willen en we kunnen verder met de volgende onderdelen van de webapplictie.</p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.driessen.nl/techtalk/van-webforms-naar-mvc-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>DevConnections 2010</title>
		<link>http://www.driessen.nl/techtalk/devconnections-2010/</link>
		<comments>http://www.driessen.nl/techtalk/devconnections-2010/#comments</comments>
		<pubDate>Wed, 24 Nov 2010 16:48:54 +0000</pubDate>
		<dc:creator>Randy Keyers</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Algemeen]]></category>

		<guid isPermaLink="false">http://www.driessen.nl/techtalk/?p=1058</guid>
		<description><![CDATA[Om ons eens flink onder te dompelen in Visual Studio 2010 en .NET 4.0 hebben we in november 2010 de DevConnections in Las Vegas bezocht.. Een veel gehoorde vraag is: Waarom helemaal daarheen? Waarom gaan jullie niet gewoon naar de DevDays? De reden om sowieso jaarlijks naar de DevDays te gaan en in bijzondere gevallen ook naar een major [...]]]></description>
			<content:encoded><![CDATA[<p>Om ons eens flink onder te dompelen in Visual Studio 2010 en .NET 4.0 hebben we in november 2010 de <a title="DevConnections" href="http://www.devconnections.com" target="_blank">DevConnections </a>in Las Vegas bezocht..</p>
<p>Een veel gehoorde vraag is: Waarom helemaal daarheen? Waarom gaan jullie niet gewoon naar de <a title="Microsoft DevDays" href="http://www.techdays.nl/DevDays" target="_blank">DevDays</a>?<br />
De reden om sowieso jaarlijks naar de DevDays te gaan en in bijzondere gevallen ook naar een major event in het buitenland is tamelijk eenvoudig:</p>
<p>De DevDays is in mijn ogen met name erop gericht om mensen te laten weten wat er is, wat eraan komt en om ze aan de hand van pakkende voorbeelden te triggeren om eens wat dieper in de techniek te duiken. Dat is voor ons de reden om daar ook echt jaarlijks heen te willen. Je wil geen bruikbare technieken over het hoofd zien, of achter de feiten aanlopen.<span id="more-1058"></span>Major events zoals de <a href="http://www.vslive.com" target="_blank">VSLive!</a> en de DevConnections hebben voor een deel dezelfde strekking, maar voor het overgrote deel gaan ze nèt dat stapje verder. Een stukje &#8216;outside the comfort zone&#8217; van wat een technologie out-of-the-box kan. Als die geweldige nieuwe techniek (waarvan ons op de DevDays is verteld dat hij out-of-de-box de hele applicatie ongeveer voor je schrijft) in bepaalde gevallen onbruikbaar blijkt voor de wat grotere business processing applicaties, dan hoor je dat op deze events. En dat niet alleen: Er wordt ook uit de doeken gedaan hoe het dan wèl zou moeten of kunnen werken.</p>
<p>Mensen als <a title="Scott Guthrie" href="http://weblogs.asp.net/scottgu/" target="_blank">Scott Guthrie</a>, <a title="Brian Harry" href="http://blogs.msdn.com/b/bharry/" target="_blank">Brian Harry</a>, <a title="Billy Hollis" href="http://www.dotnetmasters.com/" target="_blank">Billy Hollis</a>, developers uit het Visual Studio team, de team lead van het C# compiler team, UI guru <a title="Mark Miller" href="http://community.devexpress.com/blogs/markmiller/default.aspx" target="_blank">Mark Miller</a> (DevExpress) en nog veel meer vak idioten waarvoor dit dagelijkse kost is, staan voor je klaar. Niet alleen tijdens de sessies, maar ook daar buiten zijn ze te porren voor een bakkie of een lunch.</p>
<p>In oktober 2007 waren we ook al in Las Vegas te vinden op de VSLive! waar we ons hebben vastgebeten in UI design, quality assurance en application lifecycle management met Team Foundation Server. De resultaten hiervan maken nu deel uit van onze dagelijkse werkzaamheden. De manier van samenwerken, de hoge kwaliteit en de manier waarop we Team Foundation Server &#8216;uitnutten&#8217; komt voor een groot gedeelte vanuit de VSLive!.</p>
<p>Waar we ons op de DevConnections 2010 mee hebben laten doorweken zijn in grote lijnen de do&#8217;s and dont&#8217;s van Silverlight, Windows Phone 7 development, MVC 3.0 en het Entity Framework.<br />
Eerste resultaat: De nieuwe versie van onze RAP applicatie zal gebaseerd zijn op MVC 3.0 in combinatie met het Entity Framework.</p>
<p>Patrick heeft nog een aantal <a title="Microsoft Lync" href="http://office.microsoft.com/nl-nl/lync/" target="_blank">Microsoft Lync</a> sessies bijgewoond, met als resultaat dat er nu op onze bureaus telefoons staan met een USB kabel in plaats van een telefoonstekker. Onze uitdaging is natuurlijk om hier uiteindelijk een koppeling op te maken vanuit onze software&#8230;</p>
<p>Gekkenhuis dus; Wanneer gaan we weer?!?</p>
<p>Op persoonlijke titel zou ik nog nog wel eens naar de <a title="Microsoft PDC" href="http://www.microsoftpdc.com" target="_blank">Microsoft PDC </a>willen. Daar doet Steve Ballmer himself de keynote <img src='http://www.driessen.nl/techtalk/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .<br />
Dat staat bij mij op hoog mijn persoonlijke &#8216;things to definitely do&#8217; lijstje. Wie weet&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.driessen.nl/techtalk/devconnections-2010/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>So freaking good!</title>
		<link>http://www.driessen.nl/techtalk/so-freaking-good/</link>
		<comments>http://www.driessen.nl/techtalk/so-freaking-good/#comments</comments>
		<pubDate>Fri, 01 Oct 2010 09:21:31 +0000</pubDate>
		<dc:creator>Patrick Adriaansen</dc:creator>
				<category><![CDATA[Algemeen]]></category>

		<guid isPermaLink="false">http://www.driessen.nl/techtalk/?p=1027</guid>
		<description><![CDATA[Je kent het wel… Je moet een schets maken van wat schermen van een nieuwe applicatie. Dus je pakt pen en papier en begint te kliederen. Nadat er een paar blaadjes zijn gesneuveld en de tekening een paar keer opnieuw is gemaakt, heb je uiteindelijk een pennenvrucht, die je zelf heel goed kunt lezen, maar [...]]]></description>
			<content:encoded><![CDATA[<p>Je kent het wel… Je moet een schets maken van wat schermen van een nieuwe applicatie. Dus je pakt pen en papier en begint te kliederen. Nadat er een paar blaadjes zijn gesneuveld en de tekening een paar keer opnieuw is gemaakt, heb je uiteindelijk een pennenvrucht, die je zelf heel goed kunt lezen, maar waar anderen geen chocola van kunnen maken.<span id="more-1027"></span></p>
<p>Een ander scenario is dat zulke schetsen in samenspraak met collega&#8217;s op een whiteboard worden geschilderd. Nadat je met elkaar eruit bent gekomen maak je een foto van het whiteboard en hang je de foto in TFS bij het product backlog item (ja ik weet het, we hebben nog een ‘poor-mans’ smart-board, wij maken er foto’s van <img src='http://www.driessen.nl/techtalk/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> ).</p>
<p>Toevallig liep ik vorige week bij het zoeken van mooie apps voor op mijn iPad, tegen een geweldige tool aan. Hij heet <a href="http://www.balsamiq.com/products/mockups" target="_blank">Balsamiq Mockups</a> en de tagline is ‘so freaking good’. Nou, ik moet je zeggen, dat pakket is echt heel erg goed. Het is een simpel pakket om heel eenvoudig mock-ups van schermen te maken. Het ziet er echt als schets uit (dus geen programma schermpjes of zo), en het werkt werkelijk super snel. Je hebt het vlug onder de knie en het is heel makkelijk te gebruiken. Voortaan gooien we bij dat schetsen gewoon de beamer aan en doen we het digitaal op de muur! Wie heeft er nu nog een smartboard nodig, das zo 2009….</p>
<p><a href="http://www.youtube.com/watch?v=zLysy3IPfFI"><span class="youtube">
<object width="640" height="505">
<param name="movie" value="http://www.youtube.com/v/zLysy3IPfFI?color1=d6d6d6&amp;color2=f0f0f0&amp;border=0&amp;fs=1&amp;hl=en&amp;loop=&amp;showinfo=0&amp;iv_load_policy=3&amp;showsearch=0&amp;rel=1" />
<param name="allowFullScreen" value="true" />
<embed wmode="opaque" src="http://www.youtube.com/v/zLysy3IPfFI?color1=d6d6d6&amp;color2=f0f0f0&amp;border=0&amp;fs=1&amp;hl=en&amp;loop=&amp;showinfo=0&amp;iv_load_policy=3&amp;showsearch=0&amp;rel=1" type="application/x-shockwave-flash" allowfullscreen="true" width="640" height="505"></embed>
<param name="wmode" value="opaque" />
</object>
</span><p><a href="http://www.youtube.com/watch?v=zLysy3IPfFI">www.youtube.com/watch?v=zLysy3IPfFI</a></p></a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.driessen.nl/techtalk/so-freaking-good/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Op zoek naar collega&#8217;s in het .NET Magazine</title>
		<link>http://www.driessen.nl/techtalk/op-zoek-naar-collegas-in-het-net-magazine/</link>
		<comments>http://www.driessen.nl/techtalk/op-zoek-naar-collegas-in-het-net-magazine/#comments</comments>
		<pubDate>Mon, 21 Jun 2010 10:07:57 +0000</pubDate>
		<dc:creator>Patrick Adriaansen</dc:creator>
				<category><![CDATA[.NET]]></category>

		<guid isPermaLink="false">http://www.driessen.nl/techtalk/?p=1012</guid>
		<description><![CDATA[Er staat een advertentie in de .NET Magazine waarin we nieuwe collega&#8217;s zoeken. We zijn op zoek naar nieuwe C# .NET developers. De gelukkige die hier mag komen werken valt daarbij meteen met zijn neus in de boter. Naast natuurlijk zulke fijne collega&#8217;s (kuch), mag hij/zij ook direct mee naar de DevConnections 2010 in Las [...]]]></description>
			<content:encoded><![CDATA[<p>Er staat een advertentie in de .NET Magazine waarin we nieuwe collega&#8217;s zoeken. We zijn op zoek naar nieuwe C# .NET developers.</p>
<p>De gelukkige die hier mag komen werken valt daarbij meteen met zijn neus in de boter. Naast natuurlijk zulke fijne collega&#8217;s (kuch), mag hij/zij ook direct mee naar de DevConnections 2010 in Las Vegas. Lijkt me een prima reden om direct te solliciteren.</p>
<p style="text-align: center;"><img class="size-full wp-image-1020 aligncenter" title="vegas_advertentie" src="http://www.driessen.nl/techtalk/wp-content/uploads/2010/06/vegas_advertentie.jpg" alt="vegas_advertentie" width="157" height="222" /></p>
<p>De advertentie kun je <a href="http://www.driessen.nl/techtalk/wp-content/uploads/2010/06/CNET_LasVegas_DevConnections.pdf">hier</a> vinden.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.driessen.nl/techtalk/op-zoek-naar-collegas-in-het-net-magazine/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Nieuwe developer PC&#8217;s</title>
		<link>http://www.driessen.nl/techtalk/nieuwe-developer-pcs/</link>
		<comments>http://www.driessen.nl/techtalk/nieuwe-developer-pcs/#comments</comments>
		<pubDate>Wed, 28 Apr 2010 15:47:18 +0000</pubDate>
		<dc:creator>Patrick Adriaansen</dc:creator>
				<category><![CDATA[Algemeen]]></category>

		<guid isPermaLink="false">http://www.driessen.nl/techtalk/?p=1003</guid>
		<description><![CDATA[Vandaag zijn er nieuwe PC&#8217;s gearriveerd. Met de omschakeling naar Visual Studio 2010 waren ook de PC&#8217;s waarop code werd geklopt aan vervanging toe.                 De specs van de nieuwe machines liegen er niet om: Intel Core i7 860 (op een gigabyte mainboard met SATA3 en USB 3.0) 4GB [...]]]></description>
			<content:encoded><![CDATA[<p>Vandaag zijn er nieuwe PC&#8217;s gearriveerd. Met de omschakeling naar Visual Studio 2010 waren ook de PC&#8217;s waarop code werd geklopt aan vervanging toe.</p>
<div id="attachment_1006" class="wp-caption alignleft" style="width: 310px"><img class="size-medium wp-image-1006" title="PC uitpaksessie" src="http://www.driessen.nl/techtalk/wp-content/uploads/2010/04/PC_Uitpaksessie_1-300x225.jpg" alt="Uitpakken van nieuwe PC's" width="300" height="225" /><p class="wp-caption-text">Uitpakken van nieuwe PC&#39;s</p></div>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p>De specs van de nieuwe machines liegen er niet om:</p>
<ul>
<li>Intel Core i7 860 (op een gigabyte mainboard met SATA3 en USB 3.0)</li>
<li>4GB Intern Memory</li>
<li>2x SSD 80GB Intel X25-M Postville (Raid-0)</li>
<li>2x 1TB Samsung HDD (Raid-0)</li>
<li>2x VGA card van Club 3d om 3 schermen aan te sturen</li>
<li>en al dit moois in een kast van Antec met een superstille voeding</li>
</ul>
<p>De SSD disks halen een doorvoer snelheid van meer dan 500MB per seconde! De Visual Studio IDE is in elk geval een heel stuk sneller geworden met de machines onder Windows 7. Ten op zichte van de vorige machines halen we een tijdsbesparing van 25% bij het builden van de applicaties en het draaien van de unit tests. We kunnen in elk geval weer een paar jaar vooruit!</p>
<div id="attachment_1007" class="wp-caption alignleft" style="width: 310px"><img class="size-medium wp-image-1007" title="PCs op een rijtje" src="http://www.driessen.nl/techtalk/wp-content/uploads/2010/04/PCs-op-een-rijtje-300x225.jpg" alt="Nieuwe developer PC's op een rijtje" width="300" height="225" /><p class="wp-caption-text">Nieuwe developer PC&#39;s op een rijtje</p></div>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p>De oude machines krijgen een mooi plekje als testservers. Met de in Raid-0 geschakelde disken en de dual core processors kunnen ze nog heel mooi dienst doen als SQL server in onze testfarm.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.driessen.nl/techtalk/nieuwe-developer-pcs/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Creating good software solutions</title>
		<link>http://www.driessen.nl/techtalk/creating-good-software-solutions/</link>
		<comments>http://www.driessen.nl/techtalk/creating-good-software-solutions/#comments</comments>
		<pubDate>Mon, 15 Mar 2010 09:22:45 +0000</pubDate>
		<dc:creator>Freek Bos</dc:creator>
				<category><![CDATA[Algemeen]]></category>

		<guid isPermaLink="false">http://www.driessen.nl/techtalk/?p=995</guid>
		<description><![CDATA[Software isn’t build because we can, but because there is a problem whereby computer software can provide a solution. When writing a software solution there is more to keep in mind than just one’s and zero’s. Creating software is understanding the ‘problem’ the client faces. This is the most important aspect of developing software. Secondly [...]]]></description>
			<content:encoded><![CDATA[<p>Software isn’t build because we can, but because there is a problem whereby computer software can provide a solution. When writing a software solution there is more to keep in mind than just one’s and zero’s. Creating software is understanding the ‘problem’ the client faces. This is the most important aspect of developing software.</p>
<p>Secondly is the software itself. Of course creating the software should ensure the client’s problem no longer exists, but the software shouldn’t create a new problem. This is where high quality solutions are expected.</p>
<p>When creating software solutions I keep the following criteria in mind.</p>
<ul>
<li>High quality software: Software of low quality will contain bugs and bugs cost money and result in unsatisfied end users.</li>
<li>User friendly software: Software with bad user experience will not be used and is a waste of money.</li>
<li>Multi-tier architecture: Bad architecture may cause early or unfixable bottle-necks, in the worst case leading to scrapping the solution entirely, with the inevitable cost.</li>
<li>Quick or good delivery: Software that is released too soon has the potential of having bugs or  corner-cutting. This could eventually lead to spending more time developing/bug-fixing after the first release.</li>
</ul>
<p><strong>High quality software</strong><br />
By using technologies like unit-testing, test driven development, code analysis and agile development, I can meet the higher expectations of sturdy and stable software. ‘Quick and Dirty is not an option’ is the motto I use when developing software.</p>
<p><em>Unit-testing</em> is the process of writing code to test your code. In other words, every little piece of code gets tested by several unit-tests making sure all scenarios this particular code block can handle will get handled with success. The size of the application grows but the tested scenarios increase as well, making sure that every block of code keeps working as expected.<br />
Since these tests exist in code and not by some test-script a human-tester needs to follow, thousands of tests can be run on a daily basis so the developer can detect flaws at a very early stage.</p>
<p><em>Test driven development</em> is a technique where the developer writes the unit-tests for a code block before the code block is created. This helps the developer to better understand the code he is supposed to write and helps the developer improve architecture of the code before the code is written.</p>
<p><em>Code analysis</em> is the use of strict coding rules and guidelines used and improved by .NET developers around the world. By building code according to these rules and guidelines, knowledge is used from developers worldwide who have experienced bad coding practices and written the rules or guidelines to ensure other developers don’t fall into the same trap.<br />
Agile development lets the client (or user) get involved in the development process. By showing the development progress to the end user in a two to four week cycle the user can</p>
<ol>
<li>Better understand the application when they start to use it;</li>
<li>Change the course of the development process as the application is growing (in this way the end product is exactly what the end user expected).</li>
<li>Achieve a better understanding of how the build progresses.</li>
</ol>
<p><strong>User friendly software</strong><br />
The success of an application doesn’t necessarily depend on how ‘clever’ it can be but more so on how ‘cleverly’ the user can use it.<br />
If the software has lots of buttons, checkboxes, settings and highly complicated calculation capabilities, then the user often backs away and hardly dares to touch it. Whereas applications that have a friendly and simple look-and-feel have more chance of being used.<br />
Why build a over complicated and flexible application if nobody knows or wants to use it?</p>
<p><strong>Multi-tier architecture</strong><br />
The larger software solutions mostly aren’t run on one computer and aren’t used by one user. The more complex software solutions will be used by many  users with more than one role and will most likely run on different computers in different locations. By using multi-tier technologies these solutions can be built.</p>
<p>Two-tier applications are application where there is a client application running on the user’s pc and a server application running on the server handling the data the users provide.</p>
<p>Three-tier applications have a separate application running on a server which in general is used for ‘number crunching’ that could eat up the entire server capacity. These number crunchers shouldn’t be run on a client pc or data server because it could freeze the client application.</p>
<p>These technologies are used to balance the workload of the software over several computers so the user-interface on the client machine keeps responding, and the data server can keep up with handling the data changes.</p>
<p><strong>Quick or good delivery</strong><br />
There is a very thin line between delivering a software solution too soon or too late.</p>
<p>If a tight deadline is set in advance, there is a bigger chance of active bugs in the final product because of cutting corners. But if the developer keeps building, testing and improving the software, the development process could end up in an endless loop of recreating and redesigning the software. The software is becoming too expensive to build.</p>
<p>Agile development helps in finding the right time for deployment of the software solution and ‘going-live’, even if there is a strict deadline or has strict functional requirements.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.driessen.nl/techtalk/creating-good-software-solutions/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>TFS Bugfarm Service</title>
		<link>http://www.driessen.nl/techtalk/tfs-bugfarm-service/</link>
		<comments>http://www.driessen.nl/techtalk/tfs-bugfarm-service/#comments</comments>
		<pubDate>Wed, 16 Dec 2009 14:56:49 +0000</pubDate>
		<dc:creator>Randy Keyers</dc:creator>
				<category><![CDATA[TFS]]></category>

		<guid isPermaLink="false">http://www.driessen.nl/techtalk/?p=971</guid>
		<description><![CDATA[Het laatste item op mijn Visual Studio / TFS 2010 checklist was het aanpassen van WITS zodat ze werken met onze service &#8216;TFSBugfarm&#8217;. Hiermee kunnen (interne) gebruikers en de portal sites zelf bij een fout een gedetailleerde bug inschieten in Team Foundation Server. In het geval van een windows applicatie zelfs met screenshot van de [...]]]></description>
			<content:encoded><![CDATA[<p>Het laatste item op mijn Visual Studio / TFS 2010 checklist was het aanpassen van WITS zodat ze werken met onze service &#8216;TFSBugfarm&#8217;. Hiermee kunnen (interne) gebruikers en de portal sites zelf bij een fout een gedetailleerde bug inschieten in Team Foundation Server. In het geval van een windows applicatie zelfs met screenshot van de situatie.</p>
<p>Om dit te laten functioneren moeten er enkele velden worden toegevoegd aan de bug workitem template. Sinds enkele weken is de <a title="beta van Power Tools voor TFS 2010" href="http://blogs.msdn.com/bharry/archive/2009/12/01/tfs-2010-power-tools-are-available.aspx" target="_blank">beta van Power Tools voor TFS 2010</a> beschikbaar. Ik heb nog geen tijd gehad om te kijken wat er nu echt allemaal nieuw en verbeterd is, maar ik heb wel gelijk de eerste <a title="Bug!" href="https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=520150" target="_blank">bug</a> te pakken. Gelukkig stond het mijn test van onze TFSBugFarm service niet in de weg, omdat ik de noodzakelijke velden gewoon toe kon voegen. De minimale vereiste voor de TFSBugFarm service is een veld voor de username, en een veld om een reply te kunnen geven aan de user.</p>
<p><strong>Wat is de TFS Bugfarm Service?</strong><br />
In essentie bestaat onze TFS Bugfarm Service uit een WCF service die verbonden is met Team Foundation Service en een base client met een Windows en een Web wrapper eromheen. Via de Windows wrapper is het voor de gebruiker mogelijk om zelf items  in te schieten in Team Foundation Server en om de afhandeling van deze items te volgen. Ook kan een Windows applicatie bij een crash zelf een screenshot maken en deze vervolgens, samen met de exception en de call-stack automatisch inschieten.</p>
<p>Via de Web wrapper kunnen onze portal sites (<a title="Payroll Portal" href="https://www.payrollportal.nl" target="_blank">Payroll Portal</a> en <a title="RAP" href="http://www.rechtspositie.info" target="_blank">RAP</a>) exceptions automatisch loggen in Team Foundation Server, zodat hiernaar gekeken kan worden. Via de Team Foundation Bug list kunnen items eenvoudig aan een sprint gekoppeld worden om opgelost te worden.</p>
<p>De Windows wrapper vind ik zelf wel erg leuk werken.  Hier zitten enkele standaard componenten in die je eigenlijk maar op een form hoeft te slepen. Vervolgens specificeer je alleen nog het TFS Bugfarm service URL en het TFS Project.</p>
<p>De componenten bestaan uit een issue list waarmee de voortgang van items kan worden bekeken en een submit form control om issues in te sturen. Die laatste bevat ook gelijk de mogelijkheid om attachments toe te voegen, en om screenshots direct vanaf het clipboard als attachment toe te voegen, zonder ze eerst op schijf op te hoeven slaan. Deze attachment zitten dan in TFS netjes als File Attachment aan het work item gekoppeld.</p>
<p>Als er zich een onverwachte exception voor doet, wordt dit scherm gestart. Automatisch wordt er een screenshot als attachment toegevoegd, en de exception message en call-stack worden in het bericht gezet. De gebruiker kan het item eventueel nog bewerken en hoeft vervolgens alleen maar op versturen te klikken.</p>
<p>Ik heb een paar screenshots gemaakt van de TFS Bugfarm client in Invio, een van onze Windows applicaties.</p>
<div id="attachment_973" class="wp-caption aligncenter" style="width: 206px"><a href="http://www.driessen.nl/techtalk/wp-content/uploads/2009/12/bugfarm_win_options.png"><img class="size-full wp-image-973" title="TFS Bugfarm client in Invio" src="http://www.driessen.nl/techtalk/wp-content/uploads/2009/12/bugfarm_win_options.png" alt="TFS Bugfarm opties in Invio" width="196" height="88" /></a><p class="wp-caption-text">TFS Bugfarm opties in Invio</p></div>
<p style="text-align: center;">
<div id="attachment_975" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.driessen.nl/techtalk/wp-content/uploads/2009/12/tfsbugfarm.png"><img class="size-medium wp-image-975" title="Meldingen bekijken" src="http://www.driessen.nl/techtalk/wp-content/uploads/2009/12/tfsbugfarm-300x168.png" alt="TFS meldingen bekijken in Invio" width="300" height="168" /></a><p class="wp-caption-text">TFS meldingen bekijken in Invio</p></div>
<div id="attachment_976" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.driessen.nl/techtalk/wp-content/uploads/2009/12/addtfs.png"><img class="size-medium wp-image-976" title="Incident insturen" src="http://www.driessen.nl/techtalk/wp-content/uploads/2009/12/addtfs-300x170.png" alt="Een nieuw incident insturen in Invio" width="300" height="170" /></a><p class="wp-caption-text">Een nieuw incident insturen in Invio</p></div>
]]></content:encoded>
			<wfw:commentRss>http://www.driessen.nl/techtalk/tfs-bugfarm-service/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

