<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Daniel's blog</title><link>https://www.daniel-rosendorf.de/</link><description>Recent content on Daniel's blog</description><generator>Hugo -- gohugo.io</generator><language>en</language><copyright>Copyright &amp;copy; 2011-2023 - Daniel Rosendorf</copyright><lastBuildDate>Thu, 14 Jun 2018 00:00:00 +0000</lastBuildDate><atom:link href="https://www.daniel-rosendorf.de/index.xml" rel="self" type="application/rss+xml"/><item><title>Handling internal URL parameters</title><link>https://www.daniel-rosendorf.de/blog/2018-06-14-handling-internal-url-parameters/</link><pubDate>Thu, 14 Jun 2018 00:00:00 +0000</pubDate><guid>https://www.daniel-rosendorf.de/blog/2018-06-14-handling-internal-url-parameters/</guid><description>&lt;p>Yesterday I tweeted this: &lt;blockquote class="twitter-tweet">&lt;p lang="en" dir="ltr">Dear Twitter: IMO changing URL parameters manually is not a use case and I will not go the extra mile in my application to handle those cases. Discuss! ;-)&lt;/p>&amp;mdash; Daniel Rosendorf (@drosendorf) &lt;a href="https://twitter.com/drosendorf/status/1006807933185937408?ref_src=twsrc%5Etfw">June 13, 2018&lt;/a>&lt;/blockquote>&lt;script async src="https://platform.twitter.com/widgets.js" charset="utf-8">&lt;/script>&lt;/p>&lt;p>and got some answers and questions from colleagues, so I decided to elaborate a bit.&lt;/p>&lt;p>In our current project we build a web application that supports regional instances. For this to work correctly, the user selects a country during registration and immediately gets redirected to the instance corresponding to his selected country if necessary. The instance we redirect to lives under another (sub-)domain, so we are providing the already selected country as a URL parameter. This avoids that the user has to select the country again after the redirect.&lt;/p>&lt;p>We have two links on this page which depend on the selected country. So on each country change which does not trigger an instance redirect, we trigger an event that updates those link targets. This event is normally not triggered when the URL parameter in the navigation bar is changed after the page is already loaded. My coworker added a few lines of code to handle this case as well (he is a very thorough person ;-) ).&lt;/p>&lt;p>And this is the point I want to talk about &amp;hellip;&lt;/p>&lt;p>I would not have done this, simply because manually changing the parameter in the URL is not a relevant use case. The parameter is a technical detail which helps us make the application work as expected. To be clear: I have no problem with the few extra lines of code (they are in there and they will stay) and they will probably save us a few extra support cases. But if you are meddling with the URL parameters in my web application, you are doing something that you should not do and therefore I won&amp;rsquo;t spent any time on helping you with this.&lt;/p>&lt;p>P.S. In any case you should validate URL parameters as any other user provided input to ensure the security of your application!&lt;/p></description></item><item><title>Moving the blog</title><link>https://www.daniel-rosendorf.de/blog/2018-04-27-moving-the-blog/</link><pubDate>Fri, 27 Apr 2018 00:00:00 +0000</pubDate><guid>https://www.daniel-rosendorf.de/blog/2018-04-27-moving-the-blog/</guid><description>&lt;p>Short update: I&amp;rsquo;m moving away from using Octopress and my own virtual server to build and host this blog. Instead from now on I will be using &lt;a href="https://wyam.io">Wyam&lt;/a> to build and &lt;a href="https://netlify.com">Netlify&lt;/a> to host it. Comments will be powered by Github or more exactly &lt;a href="https://utteranc.es">utterances&lt;/a>.&lt;/p>&lt;p>Why? I realized that I do not need the infrastructure of a whole virtual server to host this blog. If I want a server to host a project I can use one hosted in the cloud and spun up on demand. This reduces costs and makes it easier for me to actually blog (hopefully ;-)).&lt;/p>&lt;p>Using utterances allows me to host comments to blog posts on Github which should not be a problem, considering that the main audience of my blog are supposed to be developers. And Netlify has its own CDN. Together with code hosting on Github this is basically an instant win for me ;-).&lt;/p></description></item><item><title>Updates to the Site</title><link>https://www.daniel-rosendorf.de/blog/2016-02-02-updates-to-the-site/</link><pubDate>Tue, 02 Feb 2016 00:00:00 +0000</pubDate><guid>https://www.daniel-rosendorf.de/blog/2016-02-02-updates-to-the-site/</guid><description>&lt;p>Since changing the layout of the blog I also did some optimizations to enhance it a little bit. Most of those enhancements were proposed by Google PageSpeed, another one I took from the theme setup pages of the used theme, others are more or less mandated by law ;-).&lt;/p>&lt;p>So what did I do?&lt;/p>&lt;ul>&lt;li>I optimized the used feature image and my &amp;ldquo;avatar&amp;rdquo; using &lt;a href="http://jpegclub.org/">jpegtran&lt;/a> which decreased the initial file size by about 10 percent for each image.&lt;/li>&lt;li>I changed my Nginx config to send out &lt;em>Cache-Control&lt;/em> and &lt;em>Expires&lt;/em> headers for all static assets set to 1 year from request. Here is the config snippet I added to the corresponding server directive:&lt;/li>&lt;/ul>&lt;p>{% highlight Nginx %}location ~* .(js|css|png|jpg|jpeg|gif|ico)$ {expires 1y;}{% endhighlight %}&lt;/p>&lt;ul>&lt;li>I added the async attribute to some of the locally hosted scripts to hopefully shave of a little time by asynchronously executing scripts.&lt;/li>&lt;li>I also added a basic cookie consent notification using &lt;a href="https://silktide.com/tools/cookie-consent/">Cookie Consent&lt;/a> and a little cookie policy site (located &lt;a href="https://www.daniel-rosendorf.de/cookiepolicy/">here&lt;/a>). The text is more or less shamelessly stolen from &lt;a href="https://silktide.com/privacy-policy/">Silktides own privacy policy site&lt;/a>.&lt;/li>&lt;li>Next I added support for responsive images using the &lt;a href="https://github.com/robwierzbowski/jekyll-picture-tag">Jekyll Picture Tag&lt;/a> plugin suggested in the original &lt;a href="https://mmistakes.github.io/minimal-mistakes/theme-setup/">theme setup pages&lt;/a> of the &lt;a href="https://mmistakes.github.io/minimal-mistakes/">Minimal Mistakes&lt;/a> theme.&lt;/li>&lt;li>And last but not least I added &lt;a href="https://github.com/penibelst/jekyll-compress-html">Jekyll HTML compression&lt;/a> to compress the generated HTML just a little bit. This reduces the index page by about 1570 bytes (which is by about 16 percent) using the following settings:{% highlight Yaml %}compress_html:clippings: allcomments: [&amp;quot;&lt;!-- raw HTML omitted -->&amp;quot;]endings: allignore:envs: []blanklines: falseprofile: falsestartings: [html, head, body]{% endhighlight %}It&amp;rsquo;s not much, but it&amp;rsquo;s not bad either and it depends on what markup to original markdown document contains, so numbers will differ.&lt;/li>&lt;/ul>&lt;p>All in all those are all just micro optimizations but I learned some new stuff and I won&amp;rsquo;t have to do it in the future.&lt;/p></description></item><item><title>Changes</title><link>https://www.daniel-rosendorf.de/blog/2016-01-25-changes/</link><pubDate>Mon, 25 Jan 2016 00:00:00 +0000</pubDate><guid>https://www.daniel-rosendorf.de/blog/2016-01-25-changes/</guid><description>&lt;p>It is now the year 2016 and as always things change. But this year is special for me and my family. Things are happening or have already happened, so here is a short overview &amp;hellip;&lt;/p>&lt;h1 id="the-bad">The bad&lt;/h1>&lt;p>Unfortunately, this year it will not only be good, but there is also something pretty bad coming up. I will not elaborate too much (there will be probably a separate post in a few months about this), let&amp;rsquo;s just say that there is some hospital time coming up for our smallest kid and that my wife and I are pretty shaken because of this.&lt;/p>&lt;h1 id="both-good-and-bad">Both good and bad&lt;/h1>&lt;p>Next up is something that is both good and bad: I&amp;rsquo;m going to leave my current employer for a new one. This is bad because I like my current workplace. I like the people, I like the work (at least, most of the time ;-). So why am I going? I feel like I&amp;rsquo;m not learning stuff as fast as I could. I need people that are as interested in technology and sharing their wisdom about it and other things as much as I am and that is something that&amp;rsquo;s missing currently. Mind you, it will change but I also need some fresh air.&lt;/p>&lt;p>I&amp;rsquo;ve been ten years with my current employer and I&amp;rsquo;ve grown restless in the last years, so I finally decided (with a little push from my wife ;-) to do something about it. And so in march I&amp;rsquo;m off to new adventures.&lt;/p>&lt;h1 id="only-good">Only good&lt;/h1>&lt;p>The site was updated a little bit. New layout, a little bit of new technology. While up until now the site was generated by Octopress (which in turn uses Jekyll), the new layout uses mainly Jekyll with some Octopress plugins sprinkled on.&lt;/p>&lt;p>This also changes my blogging workflow. Until this change, I generated the site locally and pushed the generated site onto the server which in turn copied it over to the served directory.Now I only push the source, generation of the final pages is actually done on the server. This allows me to use SSH on my tablet to work on posts as well, so I should be able to blog a little bit more.&lt;!-- raw HTML omitted -->&lt;!-- raw HTML omitted -->And that&amp;rsquo;s the list for now &amp;hellip;&lt;/p></description></item><item><title>Learning something new</title><link>https://www.daniel-rosendorf.de/blog/2015-03-04-learning-something-new/</link><pubDate>Wed, 04 Mar 2015 00:00:00 +0000</pubDate><guid>https://www.daniel-rosendorf.de/blog/2015-03-04-learning-something-new/</guid><description>&lt;h2 id="tldr">TL;DR;&lt;/h2>&lt;p>I&amp;rsquo;ve been coding in C# for more than 10 years now and last week I realized that I feel at home in this language. I feel comfortable in the language, but strangely I do not feel comfortable with this feeling itself ;-)&lt;/p>&lt;h2 id="whats-been-happening">What&amp;rsquo;s been happening&lt;/h2>&lt;p>For the last few weeks I&amp;rsquo;ve been involved in a project customizing a DMS for a customer. This customization is mostly done in a strange combination of Java and JavaScript. After a few weeks of coding, I had an excuse to work with C# again and this felt like seeing the day after a very long night. I feel at home when I&amp;rsquo;m coding C#. Maybe that&amp;rsquo;s because of the almost 10 years of experience I have in that language. But this also made me think. It&amp;rsquo;s time to learn something new, to increase the size of my comfort zone.&lt;/p>&lt;!-- raw HTML omitted -->&lt;h2 id="the-list">The list&lt;/h2>&lt;p>So here are a few things I want to delve into in the near and not so near future:&lt;/p>&lt;ul>&lt;li>&lt;p>&lt;a href="http://elixir-lang.org/">Elixir&lt;/a>&lt;br>A quite new language based on Erlang/OTP which should make it the perfect language to implement a web API. The idea is to use the &lt;a href="http://chimera.labs.oreilly.com/books/1234000001642">Études for Elixir&lt;/a> ebook as an outline for the exercises to get into the language. The solutions will be available on the my corresponding &lt;a href="https://github.com/WizzApp/EtudesForElixir">repository&lt;/a> on Github.&lt;/p>&lt;/li>&lt;li>&lt;p>&lt;a href="http://aurelia.io">Aurelia&lt;/a>&lt;br>A new JavaScript client framework developed &lt;a href="http://twitter.com/@EisenbergEffect">Rob Eisenberg&lt;/a> which looks very nice. The &lt;a href="http://aurelia.io/get-started.html">Get Started Guide&lt;/a> should provide a pretty good introduction.&lt;/p>&lt;/li>&lt;/ul>&lt;p>Other things on the list include flexbox layouts (which should also help me get into CSS in general ;-), &lt;a href="http://facebook.github.io/react/">React&lt;/a>, &lt;a href="http://oauth.net/2/">OAuth 2.0&lt;/a> and &lt;a href="http://openid.net/connect/">OpenID Connect&lt;/a>.&lt;/p>&lt;p>That should pretty much keep my from being bored outside of my day job, so let&amp;rsquo;s see how this works out.&lt;/p></description></item><item><title>I need someone to watch my back</title><link>https://www.daniel-rosendorf.de/blog/2015-01-16-i-need-someone-to-watch-my-back/</link><pubDate>Fri, 16 Jan 2015 00:00:00 +0000</pubDate><guid>https://www.daniel-rosendorf.de/blog/2015-01-16-i-need-someone-to-watch-my-back/</guid><description>&lt;h3 id="tldr">TL;DR;&lt;/h3>&lt;p>Writing code alone is not easy for me. I tend to get carried away or run into dead ends without someone occasionally steering my back to where I actually should be headed.&lt;/p>&lt;h3 id="a-little-bit-of-an-introduction">A little bit of an introduction&lt;/h3>&lt;p>Yesterday I had a talk with a coworker of mine. Somehow we reached the topic of software development and teams in general and I started to talk about how I&amp;rsquo;m not good in writing code when I do not have someone to help me.&lt;/p>&lt;h3 id="working-alone-sucks">Working alone sucks&lt;/h3>&lt;p>And that is coming from me, a self-proclaimed introvert ;-). The problem is that you do not get to talk about your problems the way you sometimes just have to do to think them through from end to end. Also you do not have anyone that immediately sees your code, hence no incentive to actually keep it clean and readable.&lt;/p>&lt;h3 id="why-do-you-actually-need-this">Why do you actually need this?&lt;/h3>&lt;p>Because I&amp;rsquo;m lazy. Actually taking care of your code is WORK (no way, really??) and takes time, but it pays off in the long run. Nevertheless one tends to just skip it if he has as much to do as I do in my current project. So a second developer in this case is more of a watch dog. Or not. Of course the additional help is appreciated as well ;-).&lt;/p></description></item><item><title>Kiss or how I wasted two work days</title><link>https://www.daniel-rosendorf.de/blog/2015-01-09-kiss-or-how-i-wasted-two-work-days/</link><pubDate>Fri, 09 Jan 2015 00:00:00 +0000</pubDate><guid>https://www.daniel-rosendorf.de/blog/2015-01-09-kiss-or-how-i-wasted-two-work-days/</guid><description>&lt;p>{% blockquote Wikipedia &lt;a href="http://en.wikipedia.org/wiki/KISS_principle">http://en.wikipedia.org/wiki/KISS_principle&lt;/a> KISS principle %}The KISS principle states that most systems work best if they are kept simple rather than made complicated; therefore simplicity should be a key goal in design and unnecessary complexity should be avoided{% endblockquote %}&lt;/p>&lt;p>Today I realized that I wasted almost two days worth of work because I tried to solve problems I did not (yet) have. KISS as defined by the quote above is about keeping things simple, but in my understanding it is also about not doing things that you really do not need.&lt;/p>&lt;h3 id="my-problem">My problem&lt;/h3>&lt;p>I tend to see problems where no problems are. To be more specific, I start to implement a solution to a problem at hand and almost immediately I start to think about future problems that my solution could solve as well. But in the worst case this distracts me that much from the actual problem that I start to lose focus. In this concrete example I&amp;rsquo;m talking about I worked 12 hours and the final solution did not solve my problem because I missed some details of my initial problem &amp;hellip; 12 hours wasted!&lt;/p>&lt;h3 id="the-solution">The solution&lt;/h3>&lt;p>Simple: Focus on the real problem. Ignore anything else that might come up. KISS. If there are future problems where the solution could come handy, I will see it, adapt the initial solution and maybe get something more generic out of the code, but first comes the real problem.&lt;/p>&lt;h3 id="but-the-funny-thing-is-">But the funny thing is &amp;hellip;&lt;/h3>&lt;p>&amp;hellip; I&amp;rsquo;m not actually a fan of generic solutions. Most of the time I actively oppose solving problems that do not yet exist when one of my coworkers asks me for advice. Yet I still fall into this trap. Why is that? I don&amp;rsquo;t know (that topic is for another post), but mark my words: From this day on I shall focus on the problem at hand and only on the problem at hand ;-)&lt;/p></description></item><item><title>Week 21, 2014</title><link>https://www.daniel-rosendorf.de/blog/2014-05-19-week-21-2014/</link><pubDate>Mon, 19 May 2014 00:00:00 +0000</pubDate><guid>https://www.daniel-rosendorf.de/blog/2014-05-19-week-21-2014/</guid><description>&lt;p>Ok, it has been a while since my &lt;a href="https://www.daniel-rosendorf.de/blog/2014/03/24/week-13-2014">last weekly post&lt;/a>. What happened? Well, work happened, as always. Also something big changed in my personal life. In between there was another &lt;a href="http://elo.com/">ELO&lt;/a> training which kept me busy for a whole week and now there are introductions into a new (old) project. So, now review this time because I actually do not really remember the work done in the last view weeks. But the goals are still here ;-).&lt;/p>&lt;h1 id="the-goals">The goals&lt;/h1>&lt;ol>&lt;li>There will be blog post this week. A good colleague of mine and me talked about a little architectural solution and I want to test that out. And I will not keep the results or the process to myself.&lt;/li>&lt;li>Finish a very little project (a windows service with self-hosted web to control status and run jobs). This will probably end up in a blog post too ;-).&lt;/li>&lt;li>Do some work.&lt;/li>&lt;/ol>&lt;p>On this note: Of to do some work, have a nice week!&lt;/p></description></item><item><title>Week 13, 2014</title><link>https://www.daniel-rosendorf.de/blog/2014-03-24-week-13-2014/</link><pubDate>Mon, 24 Mar 2014 00:00:00 +0000</pubDate><guid>https://www.daniel-rosendorf.de/blog/2014-03-24-week-13-2014/</guid><description>&lt;p>So, what was up with last week? No post on monday and also no review. Well, I got kind of &amp;ldquo;sucked into&amp;rdquo; a training course for &lt;a href="http://elo.com/wcm/en/products/eloprofessional">ELO&lt;/a>. It was interesting and also kept me away from my computer for the last week ;-). So without any further deviations on to the review and the goals for this week.&lt;/p>&lt;h1 id="the-review">The review&lt;/h1>&lt;ol>&lt;li>The &lt;a href="https://www.daniel-rosendorf.de/blog/2014/03/14/tools">blog post&lt;/a> is done, have a look!&lt;/li>&lt;li>The prototype &amp;hellip; well, its still a prototype and I sadly did not find any time in the last two weeks to work on it.&lt;/li>&lt;/ol>&lt;p>To be honest, I do not remember too much of the week before last, other than doing a rather satisfactory refactoring on a client project (actually, that was all I did that week ;-). It just feels good when you can replace an overly complex solution with a simpler one that has exactly the same functionality.&lt;/p>&lt;p>The training course last week was interesting although it covered just the basics. I heard that there is an advanced one covering scripting that I will probably attend as well. Let us see where this ends &amp;hellip;&lt;/p>&lt;h1 id="the-goals">The goals&lt;/h1>&lt;ol>&lt;li>Advance the prototype (depending on the time I have left over this week).&lt;/li>&lt;li>Find a topic for the next blog post.&lt;/li>&lt;/ol>&lt;p>The goals explain themselves, so I will not go into more detail here.&lt;/p>&lt;p>And now on to a new week.&lt;/p></description></item><item><title>Tools</title><link>https://www.daniel-rosendorf.de/blog/2014-03-13-tools/</link><pubDate>Thu, 13 Mar 2014 00:00:00 +0000</pubDate><guid>https://www.daniel-rosendorf.de/blog/2014-03-13-tools/</guid><description>&lt;p>As I said &lt;a href="https://www.daniel-rosendorf.de/blog/2014/03/03/week-10-2014">last week&lt;/a> I am going to talk a little bit about the tools I currently use/have installed on my dev machine. &amp;ldquo;Tools&amp;rdquo; in this case meaning almost everything, from languages/compilers to actual utilities and powershell scripts.&lt;/p>&lt;p>And to be honest, this is more for my own benefit as I need to keep track of all that so that I can rebuild it if necessary.&lt;/p>&lt;p>This will be just a list with links to the corresponding blog posts (or whatever) that helped me set the software up, so do not expect too much.&lt;/p>&lt;p>Here we go &amp;hellip;&lt;/p>&lt;h1 id="command-line">Command line&lt;/h1>&lt;p>I am a fan of the command line interface. Not a wizard, but a fan. So here is a short overview over my setup:&lt;/p>&lt;ol>&lt;li>&lt;p>&lt;a href="http://bliker.github.io/cmder/">Cmder&lt;/a> as a host for my standard Powershell console.&lt;/p>&lt;/li>&lt;li>&lt;p>&lt;a href="http://msysgit.github.io/*">msysgit&lt;/a>. The only true SCM ;-) in its official windows version.&lt;/p>&lt;/li>&lt;li>&lt;p>Powershell (of course) with some custom scripts and extensions in my profile:&lt;/p>&lt;ul>&lt;li>&lt;p>&lt;a href="http://bradwilson.typepad.com/blog/2008/12/find-to-set-aliasps1.html">find-to-set-alias&lt;/a> to set various aliases for Visual Studio and Sublime Text.&lt;/p>&lt;/li>&lt;li>&lt;p>&lt;a href="http://psget.net/">PsGet&lt;/a>&lt;/p>&lt;/li>&lt;li>&lt;p>&lt;a href="http://pscx.codeplex.com/">PowerShell Community Extensions&lt;/a>&lt;/p>&lt;/li>&lt;li>&lt;p>&lt;a href="http://dahlbyk.github.io/posh-git/">posh-git&lt;/a>&lt;/p>&lt;/li>&lt;li>&lt;p>I also have a line with a call to vcvarsall.bat in my PS profile:&lt;/p>&lt;pre tabindex="0">&lt;code>Invoke-BatchFile &amp;#34;C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\vcvarsall.bat&amp;#34; x86&lt;/code>&lt;/pre>&lt;p>This makes msbuild et al available so I can build most VS solutions from the shell as well.&lt;/p>&lt;/li>&lt;li>&lt;p>Also ssh-agent is started when I start a Powershell session as described in &lt;a href="http://haacked.com/archive/2011/12/19/get-git-for-windows.aspx/">this post&lt;/a> by Phil Haack.&lt;/p>&lt;/li>&lt;/ul>&lt;/li>&lt;li>&lt;p>&lt;a href="https://chocolatey.org/">Chocolatey&lt;/a>. More or less the apt-get of the windows world ;-)&lt;/p>&lt;/li>&lt;li>&lt;p>&lt;a href="http://scriptcs.net/">scriptcs&lt;/a>. Write C# like it is a scripting language. Nice to play around with.&lt;/p>&lt;/li>&lt;/ol>&lt;h1 id="languages">Languages&lt;/h1>&lt;ol>&lt;li>.NET Framework (and various corresponding SDKs, of course).&lt;/li>&lt;li>&lt;a href="http://nodejs.org/">nodejs&lt;/a>. For all the JS development that I never come around to.&lt;/li>&lt;li>&lt;a href="https://www.ruby-lang.org">Ruby&lt;/a>. You are not hip anymore without Ruby. Install with the &lt;a href="http://rubyinstaller.org/">RubyInstaller for Windows&lt;/a>.&lt;/li>&lt;li>&lt;a href="http://www.python.org/">Python&lt;/a>. Nothing to say here.&lt;/li>&lt;/ol>&lt;h1 id="ides">IDEs&lt;/h1>&lt;ol>&lt;li>Visual Studio&lt;/li>&lt;li>&lt;a href="http://www.sublimetext.com/3">Sublime Text 3&lt;/a>. I use that one for everything I do not use VS for ;-)&lt;/li>&lt;/ol>&lt;p>That is all for now, but I am almost positively sure that I missed something, so I will very probably update this post in the future.&lt;/p></description></item><item><title>Week 11, 2014</title><link>https://www.daniel-rosendorf.de/blog/2014-03-10-week-11-2014/</link><pubDate>Mon, 10 Mar 2014 00:00:00 +0000</pubDate><guid>https://www.daniel-rosendorf.de/blog/2014-03-10-week-11-2014/</guid><description>&lt;p>As detailed in this &lt;a href="https://www.daniel-rosendorf.de/blog/2014/03/03/week-10-2014">previous post&lt;/a> I am going to blog about my goals for this week (as they are related to work and mildly relevant to you). What I start with today is also a review of the previous week. Oh, and by the way: The reviews will cover any other work related happening I decide to include (almost like a journal) besides the previous weeks goals. So, on to actual content ;-)&lt;/p>&lt;h1 id="the-review">The review&lt;/h1>&lt;p>First, the goals:&lt;/p>&lt;ol>&lt;li>The tools blog post: I started it, but I am not yet sure on what level of detail I am going to write about this. I will very probably do just a short overview together with links and later go into more details (in additional blog posts).&lt;/li>&lt;li>The prototype: I started it and in the course dove a little into &lt;a href="https://jqueryui.com/">jQuery UI&lt;/a> and the draggable, droppable and resizable widgets. Interesting stuff, but learning new things always makes me slow ;-)&lt;/li>&lt;/ol>&lt;p>Additionally, after 3 months on working on a rather interesting project that project got put on hold by our customer. I hope that is temporary because the project and the technologies used are quite interesting. I learned a lot in those months, so let&amp;rsquo;s hope that the project continues.&lt;/p>&lt;h1 id="the-goals">The goals&lt;/h1>&lt;p>The goals for this week are rather similar to those last week:&lt;/p>&lt;ol>&lt;li>Finish the blog post.&lt;/li>&lt;li>Finish the prototype.&lt;/li>&lt;/ol>&lt;p>Also for the future I will try and choose goals that are actually doable for me in the coming week.&lt;/p>&lt;p>That&amp;rsquo;s all folks.&lt;/p></description></item><item><title>Week 10, 2014</title><link>https://www.daniel-rosendorf.de/blog/2014-03-03-week-10-2014/</link><pubDate>Mon, 03 Mar 2014 00:00:00 +0000</pubDate><guid>https://www.daniel-rosendorf.de/blog/2014-03-03-week-10-2014/</guid><description>&lt;h1 id="what-the--">What the &amp;hellip; ?&lt;/h1>&lt;p>So the weekend was nice and I had time to think a little bit about this blog and my (practically) non-existent blogging habit. I want to change that, so here is what I am going to do:&lt;/p>&lt;p>Every monday I am going to write up a list of up to three goals (work or at least somewhat computer related to stay relevant for my also non-existent readers ;-) and will try to keep or reach them during the week.&lt;/p>&lt;p>The next thing the monday posts will also contain are a review of the past week and its goals. Obviously the monday posts will not be written when I am on vacation etc. but I will keep those posts as constant as possible (hear, hear! ;-)&lt;/p>&lt;p>So, enough babbling, on to the goals for this week.&lt;/p>&lt;h1 id="the-goals">The goals&lt;/h1>&lt;ol>&lt;li>Write a blog posts about my must-have tools setup as a reference for any future computer setups I have to do (inspired by &lt;a href="http://mattanjakern.de/2014/02/must-have-software-tools/">this post&lt;/a> of a good colleague of mine). This will not be a complete list of everything, but I&amp;rsquo;ll start with the essentials and extend it in the future.&lt;/li>&lt;li>I also want to try and create a little prototype for side project (can not talk about this too much as it is kind of secret, but at least I can mention it here).&lt;/li>&lt;/ol>&lt;p>So, that&amp;rsquo;s it for this week. Now I challenge myself to keep those goals and next monday we will see how I did &amp;hellip; have a nice week!&lt;/p></description></item><item><title>Best practices when using Entity Framework Code First Migrations</title><link>https://www.daniel-rosendorf.de/blog/2014-02-25-best-practices-when-using-entity-framework-code-first-migrations/</link><pubDate>Tue, 25 Feb 2014 00:00:00 +0000</pubDate><guid>https://www.daniel-rosendorf.de/blog/2014-02-25-best-practices-when-using-entity-framework-code-first-migrations/</guid><description>&lt;p>After seeing migrations in Ruby on Rails a few years ago I regularly searched for an equivalent in the .NET space. Then finally with EF Code First Migrations were introduced. Search done!&lt;/p>&lt;p>Now, after doing two projects using Code First Migrations, here are some basic rules that you should follow&lt;sup id="fnref:1">&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref">1&lt;/a>&lt;/sup> if (and only if) you want to avoid trouble with migrations:&lt;/p>&lt;ol>&lt;li>&lt;p>Use a local development database.&lt;/p>&lt;p>&amp;rsquo;nough said.&lt;/p>&lt;/li>&lt;li>&lt;p>Use different seeds for different environments.&lt;/p>&lt;p>If your application requires users, your initial seed should in most cases contain an admin user to allow initial access to the application.For integration tests you should only have a bare minimum of data (just enough to get the application/integration tests running). Test-relevant data should be set up/created in your tests and cleaned before/after each test run.&lt;/p>&lt;/li>&lt;li>&lt;p>Your seed method should be repeatable.&lt;/p>&lt;p>Take care that your seed method creates one time data really only once (e.g. login data for a specific user or the user itself should not be created again if it already exists). The AddOrUpdate method provides the key selector parameter for that purpose, but there may be cases where that is not enough.&lt;/p>&lt;/li>&lt;li>&lt;p>Test your migrations.&lt;/p>&lt;p>The migrations generated by the&lt;/p>&lt;pre tabindex="0">&lt;code>add-migration&lt;/code>&lt;/pre>&lt;p>command assume an empty database. However once you actually go live your database will not be empty. So test each migration (ideally on a copy of the live database).&lt;/p>&lt;/li>&lt;li>&lt;p>Be aware of &amp;ldquo;merge&amp;rdquo; issues described in more detail in the MSDN article &lt;a href="http://msdn.microsoft.com/en-us/data/dn481501">here&lt;/a>.&lt;/p>&lt;p>A few ways to mitigate those are:&lt;/p>&lt;ul>&lt;li>Do not blindly commit your migrations. If you pull/update (depending on your SCM of choice) and you get a new migration that you do not have yet, recreate any migrations you created yourself and which are not yet committed/pushed to avoid merge issues. Take care that you roll back the migrations you are going to recreate to avoid troubles with your database.&lt;/li>&lt;li>You can also update your model and create your migration for your changes, then immediately commit/push your changes to avoid the point above. But be aware that this approach may lead to more migrations as you make additional model changes during the implementation of a feature.&lt;/li>&lt;/ul>&lt;/li>&lt;/ol>&lt;p>There are quite possibly more things to keep in mind, but those where the points that I remembered best. In my opinion you should follow all of those rules (with the possible exception of number 2) in any case, otherwise you and your teammates will spend some time to fix issues you will encounter when runningupdate-database and/or deploying your application.&lt;/p>&lt;div class="footnotes" role="doc-endnotes">&lt;hr>&lt;ol>&lt;li id="fn:1">&lt;p>In my not so humble opinion that is ;-)&amp;#160;&lt;a href="#fnref:1" class="footnote-backref" role="doc-backlink">&amp;#x21a9;&amp;#xfe0e;&lt;/a>&lt;/p>&lt;/li>&lt;/ol>&lt;/div></description></item><item><title>Brainstorming: Living documentation</title><link>https://www.daniel-rosendorf.de/blog/2013-08-02-brainstorming-living-documentation/</link><pubDate>Fri, 02 Aug 2013 00:00:00 +0000</pubDate><guid>https://www.daniel-rosendorf.de/blog/2013-08-02-brainstorming-living-documentation/</guid><description>&lt;p>&lt;em>So it&amp;rsquo;s been awhile since my last &lt;a href="https://www.daniel-rosendorf.de/blog/categories/brainstorming/">brainstorming&lt;/a> article (almost 2 years), but here is another one ;-)&lt;/em>&lt;/p>&lt;p>{% img right &lt;a href="http://www.daniel-rosendorf.de/images/library.jpg">http://www.daniel-rosendorf.de/images/library.jpg&lt;/a> %}&lt;/p>&lt;h3 id="introduction">Introduction&lt;/h3>&lt;p>So, I&amp;rsquo;m reading again &amp;hellip; after what seems like years I decided to read something &amp;ldquo;technical&amp;rdquo; again and this time I want to tackle &lt;a href="http://specificationbyexample.com/">Specification By Example&lt;/a> by &lt;a href="http://gojko.net/">Gojko Adzic&lt;/a>. After not even finishing the fist chapter an idea that I had some months ago came back to me.&lt;/p>&lt;h3 id="the-premise">The premise&lt;/h3>&lt;p>Imagine a typical software project with detailed specifications and a lot of automated acceptance tests (both of which do exist in every project, right? ;-). In &amp;ldquo;Specification By Example&amp;rdquo; Gojko talks about &lt;em>living documentation&lt;/em>, which means that specifications are &lt;em>executable&lt;/em> and are &lt;em>validated frequently&lt;/em> against the project.&lt;/p>&lt;p>Basically the specifications and the examples included are acceptance tests that get executed during the build and reflect the current development progress.&lt;/p>&lt;h3 id="the-problem">The problem&lt;/h3>&lt;p>Unless you are using something like the &lt;a href="">Gherkin&lt;/a> language to do your specifications, there will be no really easy way to translate specifications into tests and test cases that some system can automatically execute. So now what?&lt;/p>&lt;h3 id="the-solution-as-invented-by-me--">The solution (as invented by me ;-)&lt;/h3>&lt;p>You already have automatic tests in place and you already have the build fail if a test fails which in turn means you already have a test report. Everything that&amp;rsquo;s missing is a system to capture the specifications and some way to map the captured specifications to one or more automatic tests.&lt;/p>&lt;p>So that&amp;rsquo;s what we are going to build.&lt;/p>&lt;h3 id="the-web-application">The web application&lt;/h3>&lt;p>The web application has a basic user management and allows for the following things:&lt;/p>&lt;ul>&lt;li>Capture specifications (either directly in the web interface or through some kind of import, MS Excel would come to mind &amp;hellip; although I really do not know why :P)&lt;/li>&lt;li>Show current state of implementations (Not implemented, Ok, Failing)&lt;/li>&lt;li>Map specifications to tests in a test result report&lt;/li>&lt;li>Upload test result reports&lt;/li>&lt;/ul>&lt;h3 id="the-setup">The setup&lt;/h3>&lt;p>For this to work the projects test results need to be uploaded to the web application. This can either be done manually (HINT: Don&amp;rsquo;t!) or automatically by your CI server. For this the web application provides a simple API endpoint to post the documents to.&lt;/p>&lt;h3 id="the-workflow">The workflow&lt;/h3>&lt;p>Let&amp;rsquo;s assume we have a specification that we need to implement. We already have it in the system, so when a customer logs into the web interface the specification is shown as &amp;ldquo;Not implemented&amp;rdquo;. Now the developer has implemented some or all examples/test cases and the current test results got automatically uploaded to the application. So the developer logs in, selects the not yet implemented specification and is then able to map test results to this specification, so that after the mapping is done and the developer checks a checkbox during mapping that says &amp;ldquo;These are all test cases, there will not be any more&amp;rdquo; the specification and/or its examples will be shown as &amp;ldquo;Ok&amp;rdquo;. The mapping is stored so that when a mapped test fails, the project overview will be updated and show the status as &amp;ldquo;Failing&amp;rdquo;.&lt;/p>&lt;p>From here on, advanced workflows can be started, e.g. if a specification fails is it because requirements have changed or because of technical dependencies in the system (which probably should not be there).&lt;/p>&lt;h3 id="great-what-now">Great, what now?&lt;/h3>&lt;p>I honestly don&amp;rsquo;t know &amp;hellip; but I will make this some kind of conceptual series and blog about design details. So maybe at the end, we have a complete specification that we can implement ;-)&lt;/p>&lt;hr>&lt;p>Image courtesy of &lt;a href="http://www.flickr.com/people/i8ipod/">Yuri Levchenko&lt;/a>.&lt;/p></description></item><item><title>4 simple rules</title><link>https://www.daniel-rosendorf.de/blog/2012-09-11-4-simple-rules/</link><pubDate>Tue, 11 Sep 2012 00:00:00 +0000</pubDate><guid>https://www.daniel-rosendorf.de/blog/2012-09-11-4-simple-rules/</guid><description>&lt;h3 id="why">Why?&lt;/h3>&lt;p>I&amp;rsquo;m feeling quite depressed the last few days and I really do not know the cause of this. Vacation with my family was nice (although my wife was glad when I started working again ;-) and there are no other big factors in my life that pull me down that much. At least that&amp;rsquo;s what I think &amp;hellip;So I decided to do a little experiment this week.&lt;/p>&lt;h3 id="the-rules">The rules&lt;/h3>&lt;p>It&amp;rsquo;s easy, just 4 simple rules to follow:&lt;/p>&lt;ol>&lt;li>&lt;em>Go to bed (and sleep) at 10 pm.&lt;/em>&lt;br>No staying up late.&lt;/li>&lt;li>&lt;pre>&lt;code> *Get up at 5.30 am.* &lt;/code>&lt;/pre>That&amp;rsquo;s not too much of a problem as the kids are up this early as well :-)&lt;/li>&lt;li>&lt;pre>&lt;code> *Do not drink more than 4 cups of coffee during the day.* &lt;/code>&lt;/pre>This will be harder, because I&amp;rsquo;m quite addicted to coffee during my working hours.&lt;/li>&lt;li>&lt;pre>&lt;code> *Take time to work on your private projects.* &lt;/code>&lt;/pre>I have severall ideas of website and tools I want to build and it is time to start (and finish) at least one of those.&lt;/li>&lt;/ol>&lt;h3 id="what-are-the-expectations">What are the expectations?&lt;/h3>&lt;p>I hope that this will help me loosing those quite depressive (and also quite disturbing) feelings. I don&amp;rsquo;t know if it will work, but it&amp;rsquo;s at least worth a try. Wish me luck :-)&lt;/p></description></item><item><title>Types of tests in a software project</title><link>https://www.daniel-rosendorf.de/blog/2013-07-10-types-of-tests-in-a-software-project/</link><pubDate>Tue, 10 Jul 2012 00:00:00 +0000</pubDate><guid>https://www.daniel-rosendorf.de/blog/2013-07-10-types-of-tests-in-a-software-project/</guid><description>&lt;h3 id="disclaimer">Disclaimer&lt;/h3>&lt;p>The following descriptions and definitions are purely based on my own experience and knowledge. People will disagree. So be it ;-). I&amp;rsquo;m willing to talk about every definition in this post.&lt;/p>&lt;h3 id="types-of-tests">Types of tests&lt;/h3>&lt;ol>&lt;li>&lt;p>&lt;strong>Unit test&lt;/strong>&lt;br>Typically automated, this kind of tests exercises a single method in a system. In unit tests all external dependencies are mocked so that the tested code is completely isolated. Isolation in this case leads to a test that runs purely in memory as accessing a database of the filesystem would make this an integration test (see below).&lt;/p>&lt;/li>&lt;li>&lt;p>&lt;strong>Integration test&lt;/strong>&lt;br>Normally automated as well this kind of test does test a set of components and their interactions and their integration into the whole (thus the name integration test).&lt;/p>&lt;/li>&lt;li>&lt;p>&lt;strong>Acceptance test&lt;/strong>&lt;br>An acceptance test is another kind of integration test. Its goal is to verify that specific acceptance criterions (which are usually specified on a user story) are met when implementing a specific story.&lt;/p>&lt;/li>&lt;li>&lt;p>&lt;strong>User interface tests&lt;/strong>&lt;br>User interface tests drive the system through its user interface. Integration or acceptance tests may do this through special interfaces or on a layer just below the UI but a UI tests usually simulates a real user interaction like clicking a button or selecting an item in a dropdown.&lt;/p>&lt;/li>&lt;/ol>&lt;h3 id="its-all-just-words">It&amp;rsquo;s all just words&lt;/h3>&lt;p>Those are the types of tests that come to my mind at the moment. There are more and there are also other names for some of those tests above. Also the definition varies from developer to developer (and that&amp;rsquo;s good ;-). Nevertheless at least inside of a team a common vocabulary should be used for specific test types.&lt;/p>&lt;p>I hope this definitions help a little.&lt;/p></description></item><item><title>Why use Continuous Integration?</title><link>https://www.daniel-rosendorf.de/blog/2012-06-29-why-use-continuous-integration/</link><pubDate>Fri, 29 Jun 2012 00:00:00 +0000</pubDate><guid>https://www.daniel-rosendorf.de/blog/2012-06-29-why-use-continuous-integration/</guid><description>&lt;h3 id="tldr">TL;DR;&lt;/h3>&lt;p>&lt;a href="http://en.wikipedia.org/wiki/Continuous_integration">Continuous Integration&lt;/a> means that all changes are continuously integrated into a common integration branch. This allows for faster &amp;ldquo;compatibility&amp;rdquo; checks between various development branches, faster failure in case of test errors resulting from those changes and therefore less time developers have to spend hunting for issues that keep them from developing.&lt;/p>&lt;h3 id="continuous-integration-and-development-workflow">Continuous integration and development workflow&lt;/h3>&lt;p>From a developer point-of-view, continuous integration means that you should integrate the changes in your local development branch into a central integration branch as soon as possible. Note the wording &amp;ldquo;integration branch&amp;rdquo;. Changes committed to this integration branch may not necessarily be released as there may be still work to be done before the corresponding feature/bugfix is done. This leads to the following branches in your SCM:&lt;/p>&lt;ul>&lt;li>master (from which the releases are built)&lt;/li>&lt;li>&lt;pre>&lt;code>development/integration (as the name says ;-)&lt;/code>&lt;/pre>&lt;/li>&lt;li>&lt;pre>&lt;code>a number of feature branches&lt;/code>&lt;/pre>&lt;/li>&lt;/ul>&lt;p>and the following development workflow:&lt;/p>&lt;ol>&lt;li>&lt;pre>&lt;code> The developer works on a feature branch.&lt;/code>&lt;/pre>&lt;/li>&lt;li>&lt;pre>&lt;code> As soon as he wants to commit his changes to the integration branch (which should happen at least once a day, possibly more often), he merges his changes from this feature branch into the integration branch.&lt;/code>&lt;/pre>&lt;/li>&lt;li>&lt;pre>&lt;code> After that he checks that his changes do not break anything on his local machine (project still compiles, tests still pass) and then&lt;/code>&lt;/pre>&lt;/li>&lt;li>&lt;pre>&lt;code> pushes his changes to the central repository.&lt;/code>&lt;/pre>&lt;/li>&lt;/ol>&lt;p>From there, an automated build server gets the lastest version and does a clean build. This ensures that the developer merged everything needed to build the project (sometimes a source file does not get committed etc.), which in turn ensures that each developer can continue working as expected then he gets the lastest sources.&lt;/p>&lt;h3 id="ensuring-the-integrity-of-the-build">Ensuring the integrity of the build&lt;/h3>&lt;p>The workflow above should ensure that the automated build always passes. When this is not the case, fixing the build is the highest priority for the development team, as a broken build means that either&lt;/p>&lt;ul>&lt;li>&lt;pre>&lt;code>A feature is broken (marked by a failing test ... hopefully)&lt;/code>&lt;/pre>&lt;/li>&lt;li>&lt;pre>&lt;code>A test is broken (either because of changed requirements or brittle tests)&lt;/code>&lt;/pre>&lt;/li>&lt;li>&lt;pre>&lt;code>The project does not compile (which hinders other developers from getting the latest source and integrating their changes)&lt;/code>&lt;/pre>&lt;/li>&lt;/ul>&lt;h3 id="tools">Tools&lt;/h3>&lt;p>Continuous integration can be done totally by hand. You do not need a build server to check the build, you can do the clean build yourself. Nevertheless there are several tools (or classes of tools) that help you during the workflow:&lt;/p>&lt;ul>&lt;li>&lt;pre>&lt;code>A build server like [TeamCity](http://www.jetbrains.com/teamcity/), [Bamboo](http://www.atlassian.com/software/bamboo/overview) etc.&lt;/code>&lt;/pre>&lt;/li>&lt;li>&lt;pre>&lt;code>A DCVS like [Mercurial](http://mercurial.selenic.com/), [Git](http://git-scm.com/) or [Bazaar](http://bazaar.canonical.com/en/)&lt;/code>&lt;/pre>&lt;/li>&lt;/ul>&lt;p>As I said, you can do Continuous Integration without those or with other tools, but especially a DCVS eases the integration process.&lt;/p>&lt;h3 id="complementary-practices">Complementary practices&lt;/h3>&lt;p>Practices like TDD (and its various cousins) and automatic testing in general in combination with a build server allow you to verify the integrity of your project regularly. You can of course leave those out of the chain, but if you do automatic builds you should absolutely integrate automated tests as well (and everyone knows you should do TDD in any case, right ;-).&lt;/p></description></item><item><title>Blogging is hard</title><link>https://www.daniel-rosendorf.de/blog/2012-06-01-blogging-is-hard/</link><pubDate>Fri, 01 Jun 2012 00:00:00 +0000</pubDate><guid>https://www.daniel-rosendorf.de/blog/2012-06-01-blogging-is-hard/</guid><description>&lt;p>As the title says: Blogging is hard. At least for me. I&amp;rsquo;m used to consume stuff on the internet, getting myself to write about stuff that actually interests someone is not easy.But why? I guess it&amp;rsquo;s the process of writing things down.&lt;/p>&lt;h3 id="the-problem">The problem&lt;/h3>&lt;p>Most of the time when I&amp;rsquo;m developing something I think to myself: &amp;ldquo;Write a blog post about this!&amp;rdquo;. Then there are the things to do:&lt;/p>&lt;ol>&lt;li>&lt;em>Get a neutral example for the thing you want to blog about.&lt;/em>&lt;br>Most of the time the code you are working on is project specific although the real problem you want to blog about is not (otherwise, why blog about it in the first case?). So you have to come up with a generic example for your problem, which takes time.&lt;/li>&lt;li>&lt;em>Get the code in a form that your readers can work with it.&lt;/em>&lt;br>Although there are people who advocate posting code as images (as to avoid problems with Copy&amp;amp;Paste code) I like to provide the code in my posts as &lt;a href="https://gist.github.com/">gists&lt;/a>. This takes time and I have not yet developed a workflow that makes this fast and easy for me.&lt;/li>&lt;li>&lt;em>Actually write the blog post.&lt;/em>&lt;br>Coming up with the content, wording etc. takes time. I blog primarily for myself yet if no one can pull anything from my posts, the post is essentially worthless (which in fact my be true for this very post).&lt;/li>&lt;/ol>&lt;h3 id="so-what-to-do-about-this">So, what to do about this?&lt;/h3>&lt;p>Blog more. Develop a workflow for blogging. Get used to it. In the end it benefits me. It makes me think about the problem at hand, forcing my to come up with a more generic way to present it, seeing it from a slightly different angle.&lt;/p>&lt;p>And even small blog posts like this one (without too much content ;-) benefit me by familiarising me with &lt;a href="http://daringfireball.net/projects/markdown/">Markdown&lt;/a> syntax and just plain old writing.&lt;/p></description></item><item><title>Lowering the entry barrier for new developers on an existing project</title><link>https://www.daniel-rosendorf.de/blog/2012-05-18-lowering-the-entry-barrier-for-new-developers/</link><pubDate>Fri, 18 May 2012 00:00:00 +0000</pubDate><guid>https://www.daniel-rosendorf.de/blog/2012-05-18-lowering-the-entry-barrier-for-new-developers/</guid><description>&lt;h3 id="what-is-this-all-about">What is this all about?&lt;/h3>&lt;p>This post is a short compilation of suggested practices to ease the entry barrier for developers coming into an already running project. As I&amp;rsquo;m mainly using the .NET Framework and Visual Studio I will describe options that refer to this setup.&lt;/p>&lt;p>This is purely a thought experiment at the moment: None of the things mentioned here were actually implemented or used by me, although I guess there are projects out there (commercial and open source) that use things from this list and I will certainly take care that future projects that I&amp;rsquo;m involved in will include some of the things mentioned below.&lt;/p>&lt;h3 id="things-you-should-havedo">Things you should have/do&lt;/h3>&lt;ol>&lt;li>&lt;em>Have an easy way to set up a local development database.&lt;/em> Use either a tool like &lt;a href="https://github.com/chucknorris/roundhouse" title="RoundhousE">RoundhousE&lt;/a> or something like &lt;a href="http://blogs.msdn.com/b/adonet/archive/2012/02/09/ef-4-3-automatic-migrations-walkthrough.aspx" title="Entity Framework 4.3 Automatic migrations walkthrough">EF Migrations&lt;/a>.&lt;/li>&lt;li>&lt;em>Have documentation that points to places (or people) of interest (e.g. source control, build server, extended documentation).&lt;/em> Suggestions here would be a ReadMe document in the solution folder etc.&lt;/li>&lt;li>&lt;em>If additional software has to be installed to open projects in Visual Studio, provide a simple script that installs them if necessary&lt;/em>. Examples would be ASP.NET MVC projects etc.&lt;/li>&lt;li>&lt;em>Have all necessary libraries in a folder within the source control so that they are checked out with the project&lt;/em> (or have a script/tool that installs them like the &lt;a href="http://docs.nuget.org/docs/workflows/using-nuget-without-committing-packages" title="Using NuGet without committing packages">restore option of NuGet&lt;/a>)&lt;/li>&lt;/ol>&lt;p>The very simple goal for this is that a developer checks out a project and immediately has all the things necessary to start working on it without having to contact or disturb another dev.&lt;/p>&lt;p>Note that environment specific assumptions in scripts and tools may exist (e.g. the users machine has to be connected to a specific VPN to successfully execute the script etc.) but this means that they have to be taken care of first.Also take care to provide good error messages and advice if something in the scripts goes wrong.&lt;/p>&lt;h3 id="why-go-through-all-the-trouble">Why go through all the trouble?&lt;/h3>&lt;p>There are several reasons to do all this:&lt;/p>&lt;ol>&lt;li>If you are a small software shop, chances are that you need to shift developers frequently. Making it easy for developers to actually develop is just naturally a good thing to do.&lt;/li>&lt;li>Some of the practices above have the additional benefit that they integrate and help with automated builds and &lt;a href="http://martinfowler.com/articles/continuousIntegration.html" title="Continuous Integration">Continuous Integration&lt;/a> (and its more advanced form of &lt;a href="http://en.wikipedia.org/wiki/Continuous_Delivery" title="Continuous Delivery">Continuous Delivery&lt;/a>)&lt;/li>&lt;/ol>&lt;h2 id="final-thoughts">Final thoughts&lt;/h2>&lt;p>Practices shown in this article are overlooked most of the time. But I do not think that they take too much time to setup &amp;hellip; at least if you include them from the very beginning in your project. However as mentioned above I do not have the real world practice I&amp;rsquo;d like to have in this topic which in turn means that I will be missing a lot of points. If anyone has something to add to this list, feel free to leave a comment. I&amp;rsquo;ll try to update this post now and then to keep this list as current as possible.&lt;/p></description></item><item><title>Brainstorming: Automatic updates for Winforms/WPF applications</title><link>https://www.daniel-rosendorf.de/blog/2011-11-24-brainstorming-automatic-updates-for-winforms-slash-wpf-applications/</link><pubDate>Thu, 24 Nov 2011 00:00:00 +0000</pubDate><guid>https://www.daniel-rosendorf.de/blog/2011-11-24-brainstorming-automatic-updates-for-winforms-slash-wpf-applications/</guid><description>&lt;p>&lt;em>This post is the first of a collection of &lt;a href="https://www.daniel-rosendorf.de/blog/categories/brainstorming/">brainstorming&lt;/a> articles I&amp;rsquo;ll write in the near future. These are primarily meant to note down my thoughts on specific projects and/or feature implementations etc.&lt;/em>&lt;/p>&lt;p>Currently a lot of ideas whirl around in my head (which have nothing to do with my potential future project, of course ;-). One of those is an automatic update feature for windows client applications.&lt;/p>&lt;p>The idea is that there are two main components:&lt;/p>&lt;ul>&lt;li>An update server which is a web service of some kind. This server would include some tooling to allow for easier package creation (more on that later).&lt;/li>&lt;li>A client library which you can use to enable automatic updates. This may include dialogs for user notification.&lt;/li>&lt;/ul>&lt;h3 id="the-client">The client&lt;/h3>&lt;p>The application using the client would include a public key. The packages provided by the update server would be simple zip archives containing an xml file with relevant data (name of the application, version etc.) and the updated component (either an msi file or a dll for simple plugins). The xml file also contains a SHA1 hash of the updated component and will be signed with the private key corresponding to the public key stored in the application.&lt;/p>&lt;p>On startup or whenever the client application would check the update server for updates like this:&lt;script type="application/javascript" src="https://gist.github.com/WizzApp/1391207.js?file=ClientApplication.cs">&lt;/script>&lt;/p>&lt;p>The client can also send additional data (like license keys etc.) as an optional parameter in the GetVersionInfo method which may then be processed by the update server. This would change the webervice call above to something like this:&lt;script type="application/javascript" src="https://gist.github.com/WizzApp/1391207.js?file=ClientApplication2.cs">&lt;/script>&lt;/p>&lt;p>If the user chooses to download the update, the client application will download the whole zip file, extract it and first verify the signature of the xml file against the embedded public key and then the SHA1 hash against the downloaded update to verify its integrity. This should avoid most of the security risks as long as the update server is called via https and has a valid certificate.&lt;/p>&lt;p>The developer of the application will be able to choose whether a valid ssl certificate will be enforced on the client or not.&lt;/p>&lt;h3 id="the-server">The server&lt;/h3>&lt;p>As mentioned above the server stores update packages and provides a webservice to retrieve the current available version of an application and the update itself.&lt;/p>&lt;p>The server should store those updates in a single directory (maybe one subfolder for each application or updatable component). In the first step the server would only support the creation of the update package via a command line tool (e.g. a Powershell script):&lt;script type="application/javascript" src="https://gist.github.com/WizzApp/1391207.js?file=CreatePackage.ps1">&lt;/script>&lt;/p>&lt;p>This will ask the user for the passphrase for the private key and generate the xml file with the hash and signature automatically. It will also copy the output (both the update component and the xml file) to the directory provided in the &amp;ndash;out parameter.&lt;/p>&lt;p>The zip file for download will be created and cached on demand by the server. Later on a push of updates via the webservice itself may be implemented.&lt;/p>&lt;p>When the client asks for the version info the server will return the values from the xml in the applicable application subfolder. This means the client is responsible for checking if the provided version is newer or not.&lt;/p>&lt;p>Handling of additional data provided by the GetVersionInfo call can be easily added to the service by adding a custom version handler to an internal dictionary:&lt;script type="application/javascript" src="https://gist.github.com/WizzApp/1391207.js?file=Webservice.cs">&lt;/script>&lt;/p>&lt;p>This is what I have in mind so far, I guess there will be a follow up post to this when more thoughts come up ;-)&lt;/p></description></item><item><title>Waterfall is dead ... or is it?</title><link>https://www.daniel-rosendorf.de/blog/2011-11-10-waterfall-is-dead-dot-dot-dot-or-is-it/</link><pubDate>Thu, 10 Nov 2011 00:00:00 +0000</pubDate><guid>https://www.daniel-rosendorf.de/blog/2011-11-10-waterfall-is-dead-dot-dot-dot-or-is-it/</guid><description>&lt;p>{% img right &lt;a href="http://www.daniel-rosendorf.de/images/waterfall_medium.jpg">http://www.daniel-rosendorf.de/images/waterfall_medium.jpg&lt;/a> %}After working about 6 years on a project for one of our customers the time for me to move on has finally come.&lt;/p>&lt;p>My employer stays the same but I&amp;rsquo;ll switch to a new project and it really may be a &lt;em>new&lt;/em> project in the sense of that theres is not a single line of code written at the moment.We are currently in the state of creating a quote for this new project and there it hit me again: Waterfall &amp;hellip; or at least something like it.&lt;/p>&lt;p>But first, a little bit of background: For the last 6 years I worked in an environment that required us to be agile (even if we did not know the right name for it at that time). For the whole of my professional live up until this day I&amp;rsquo;m used to changing requirements and short deadlines.&lt;/p>&lt;p>But now it looks like in the next project this will change. Not. To be honest, I can not believe in a project where requirements will not change as soon as the customer actually gets to see the product. But I also know that the 1.5 projects I&amp;rsquo;ve done so far are not nearly enough to be used as a base for such a strong opinion.&lt;/p>&lt;p>Whatever happens, I&amp;rsquo;ll blog about it.&lt;/p>&lt;p>Image courtesy of &lt;a href="http://www.flickr.com/photos/robbieredball/">baaker2009&lt;/a>.&lt;/p></description></item><item><title>Testing the auto deployment hook</title><link>https://www.daniel-rosendorf.de/blog/2011-10-20-testing-the-auto-deployment-hook/</link><pubDate>Thu, 20 Oct 2011 00:00:00 +0000</pubDate><guid>https://www.daniel-rosendorf.de/blog/2011-10-20-testing-the-auto-deployment-hook/</guid><description>&lt;p>This is just a test post to test the auto deployment hook ;-)&lt;/p></description></item><item><title>Hello World ... again</title><link>https://www.daniel-rosendorf.de/blog/2011-10-19-hello-world-dot-dot-dot-again/</link><pubDate>Wed, 19 Oct 2011 00:00:00 +0000</pubDate><guid>https://www.daniel-rosendorf.de/blog/2011-10-19-hello-world-dot-dot-dot-again/</guid><description>&lt;p>Hello world &amp;hellip; again. This time in english ;-).&lt;/p>&lt;p>&lt;em>The goal:&lt;/em> at least one blog post per week starting with this one &amp;hellip; and to familiarize myself with &lt;a href="http://octopress.org">Octopress&lt;/a>.&lt;/p>&lt;p>&lt;em>The mission:&lt;/em> to not sound stupid and maybe offer some insight for someone who stumbles about my corner of the great interwebs.&lt;/p></description></item><item><title>Running Nancy with Kayak in a simple console application</title><link>https://www.daniel-rosendorf.de/blog/2012-03-23-running-nancy-with-kayak-in-a-simple-console-application/</link><pubDate>Wed, 23 Mar 2011 00:00:00 +0000</pubDate><guid>https://www.daniel-rosendorf.de/blog/2012-03-23-running-nancy-with-kayak-in-a-simple-console-application/</guid><description>&lt;p>Here we go again &amp;hellip;&lt;/p>&lt;p>In the last few days a did some smaller experiments for a new project idea that is spooking around in my head. One of those was to try and get &lt;a href="http://nancyfx.org/">Nancy&lt;/a> up and running with &lt;a href="http://kayakhttp.com/">Kayak&lt;/a> in a simple console application.&lt;/p>&lt;p>&lt;a href="http://whereslou.com/2012/01/16/gate-0-2-1-implementation-of-owin-online-at-nuget">This&lt;/a> post from &lt;a href="http://twitter.com/loudej">Louis DeJardin&lt;/a> provided a good place to start. Most of the post ist still current but there are some changes you have to make to get this up and running. I have no &amp;ldquo;official&amp;rdquo; information but I had to change the provided code in the KayakStarter class from this (taken from Louis post):&lt;/p>&lt;script type="application/javascript" src="https://gist.github.com/WizzApp/2173428.js?file=KayakStarter_old.cs">&lt;/script>&lt;p>to this:&lt;/p>&lt;script type="application/javascript" src="https://gist.github.com/WizzApp/2173428.js?file=KayakStarter.cs">&lt;/script>&lt;p>Did you spot the difference? The only change is the third parameter of the call to the Gate.Hosts.Kayak.KayakGate.Start method. This makes the non-working example files from the NuGet package working again, but it also seems like the Startup class is not used anymore.&lt;/p>&lt;p>Maybe someone with more experience in Kayak/OWIN can shed some light on this?&lt;/p></description></item></channel></rss>