<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-10546079</id><updated>2012-01-31T17:21:46.746+01:00</updated><category term='rant'/><category term='programming'/><title type='text'>Dave's Rants</title><subtitle type='html'>My name is Dave and this is my blog.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://groovbird.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10546079/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://groovbird.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Dave Van den Eynde</name><uri>http://www.blogger.com/profile/09972986824333857480</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>31</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-10546079.post-5027717699074104392</id><published>2012-01-06T10:15:00.007+01:00</published><updated>2012-01-06T10:25:38.179+01:00</updated><title type='text'></title><content type='html'>Marco has a point. When you read &lt;a href="http://www.marco.org/2011/12/29/bullshit"&gt;his blogpost&lt;/a&gt;, this is how you should actually read it:&lt;div&gt;
&lt;/div&gt;&lt;div&gt;Apple:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;We'd like you to use our web app or social network instead and will annoy you until you do.&lt;/li&gt;&lt;li&gt;Our app-review rules are always in someone's best interest.&lt;/li&gt;&lt;li&gt;&lt;span&gt;&lt;span&gt;Anyone who wants a [popular new product category that Apple doesn’t make yet] should just curl up and die.&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(34, 34, 34); line-height: 25px; text-align: -webkit-auto; background-color: rgb(255, 255, 255); "&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span&gt;&lt;span style="line-height: 25px;"&gt;Google:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;span&gt;&lt;span style="line-height: 25px;"&gt;Android is using other people's work.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&lt;span style="line-height: 25px;"&gt;Don't look evil.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&lt;span style="line-height: 25px;"&gt;We solicit all of your personal information and track everything you do because that's how we make money.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span&gt;&lt;span style="line-height: 25px;"&gt;Facebook:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;span&gt;&lt;span style="line-height: 25px;"&gt;Our brands want to push their products onto our users.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&lt;span style="line-height: 25px;"&gt;We value your privacy as much as we think you do.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&lt;span style="line-height: 25px;"&gt;We're not tracking you when you log out. We simply never log you out.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10546079-5027717699074104392?l=groovbird.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://groovbird.blogspot.com/feeds/5027717699074104392/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://groovbird.blogspot.com/2012/01/marco-has-point.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10546079/posts/default/5027717699074104392'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10546079/posts/default/5027717699074104392'/><link rel='alternate' type='text/html' href='http://groovbird.blogspot.com/2012/01/marco-has-point.html' title=''/><author><name>Dave Van den Eynde</name><uri>http://www.blogger.com/profile/09972986824333857480</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10546079.post-1757686905904682286</id><published>2011-09-22T15:01:00.002+02:00</published><updated>2011-09-22T15:02:00.963+02:00</updated><title type='text'>Building a house!</title><content type='html'>The contract has been signed.&lt;div&gt;
&lt;/div&gt;&lt;div&gt;That's it for now. Later I'll tell you all about the house I'm building. As a teaser: I'm programming the PLC to do the home automation myself. It isn't much, but it's geeky enough to talk about.&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10546079-1757686905904682286?l=groovbird.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://groovbird.blogspot.com/feeds/1757686905904682286/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://groovbird.blogspot.com/2011/09/building-house.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10546079/posts/default/1757686905904682286'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10546079/posts/default/1757686905904682286'/><link rel='alternate' type='text/html' href='http://groovbird.blogspot.com/2011/09/building-house.html' title='Building a house!'/><author><name>Dave Van den Eynde</name><uri>http://www.blogger.com/profile/09972986824333857480</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10546079.post-3050438960315281148</id><published>2011-04-27T22:43:00.002+02:00</published><updated>2011-04-27T22:58:07.800+02:00</updated><title type='text'>Techdays, and a movie afterwards</title><content type='html'>Today was the second day of the TechDays Belgium 2011 conference. It was a blast, and I learned a bunch of new stuff that will keep me busy over the next couple of months as I begin to digest the information overload that I experienced over the last couple of days.&lt;div&gt;
&lt;/div&gt;&lt;div&gt;All the editions that I've participated in so far have been organized at the Metropolis in Antwerp. It's a movie theatre complex from the Kinepolis Group that I particularly like for their wide range of theatres and predictable service and choice of catering, and quality of their projections. Using it as a venue for a development conference pays off as you get to use the high quality projectors and screens and audio to do what a conference does best: show stuff to people. The catering is not bad either and all in all it's a wonderful experience that's very well handled by their staff. I'm sure tons of stuff went wrong behind the scenes that us "devs" will never even realize has happened because of the professionalism with which such as big event is organized.&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;div&gt;Which leaves me with a sad note. We were all given some nice swag to go along with the conference, like a bag with goodies (mostly marketing junk, but the bag is nice) to put the stuff in that you trade your soul for (as in: have your badge scanned and therefore agree to be spammed the remainder of your days). I also like to take the opportunity of attending this conference each year by finishing it with a visit to a movie. Except, this time I was met with the "other" side of the theatre.&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;div&gt;Even though there were like a 1000 guys like me walking around the complex with this issued bag for two days, I was promptly denied access to the theatre because this "bag" was deemed a security risk. It doesn't matter that this particular complex as a vast underground parking area from which one could easily plant some sort of explosive device that could do some serious damange. No, sir, your bag is a security risk, and we can't allow you to enter unless you're willing to part with your proudly received swag for a couple of hours in one of our fine locker rooms.&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;div&gt;It's not so much that I was discomforted by not being able to carry my bag inside (which contained the Oatmeal book that I planned to read during the commercial breakdown) but the fact that I felt seriously violated. Here I paid 9 euros to enter a theatre to watch a movie ("The Adjustment Bureau" and it's a nice one) and even before I entered the room I was assured to be treated like a criminal. And yet they keep wondering why they're losing customers. Apparently being subjected to anti-piracy campaigns before the start of the movie wasn't enough. What's next? Strip searches? Full body scanners? Uniformed company drones with blue gloves? &lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;div&gt;I am truly disgusted.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10546079-3050438960315281148?l=groovbird.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://groovbird.blogspot.com/feeds/3050438960315281148/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://groovbird.blogspot.com/2011/04/techdays-and-movie-afterwards.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10546079/posts/default/3050438960315281148'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10546079/posts/default/3050438960315281148'/><link rel='alternate' type='text/html' href='http://groovbird.blogspot.com/2011/04/techdays-and-movie-afterwards.html' title='Techdays, and a movie afterwards'/><author><name>Dave Van den Eynde</name><uri>http://www.blogger.com/profile/09972986824333857480</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10546079.post-7733354232979735269</id><published>2011-03-03T22:01:00.001+01:00</published><updated>2011-03-09T17:35:49.707+01:00</updated><title type='text'>Setting up Mono on Amazon EC2</title><content type='html'>A while ago I managed to set up &lt;a href="http://www.mono-project.com/"&gt;Mono&lt;/a&gt; on an &lt;a href="http://aws.amazon.com/ec2/"&gt;Amazon EC2&lt;/a&gt; instance running the standard &lt;a href="http://aws.amazon.com/amazon-linux-ami/"&gt;Amazon Linux AMI&lt;/a&gt;, by compiling from sources. Boy, that was a pain, took a while (I was stupid enough to do it on a Micro instance) and turned out to be totally unnecessary.  &lt;br /&gt;  &lt;br /&gt;Today I found a better way to do it, thanks to &lt;a href="http://stackoverflow.com/questions/3510320/install-mono-on-centos5-5-using-yum"&gt;this post&lt;/a&gt; on StackOverflow. You'll have to modify the steps that the poster follows, though, mostly because you can't log in as root on an Amazon Linux instance, but everything is available using sudo.  &lt;br /&gt;  &lt;br /&gt;First you have to set up an instance (use a Large instance, you won't regret it), and the easiest way to do that is through the Amazon Management Console. Once you have your instance running and you can log in, do the following:  &lt;br /&gt;  &lt;br /&gt;First, add the official Mono repository to yum. I'm quite new to yum, but the SO post made it quite clear. In your home directory, issue the command 'vi mono.repo', and press 'i' to enter 'insert mode', then paste the following snippet:  &lt;br /&gt;  &lt;br /&gt;&lt;span style="line-height: 18px; border-collapse: collapse; font-family: arial, &amp;#39;Liberation Sans&amp;#39;, &amp;#39;DejaVu Sans&amp;#39;, sans-serif; font-size: 14px" class="Apple-style-span"&gt;&lt;/span&gt;  &lt;br /&gt;  &lt;pre style="padding-bottom: 5px; border-right-width: 0px; overflow-x: auto; overflow-y: auto; background-color: #eeeeee; margin: 0px 0px 10px; padding-left: 5px; width: auto; padding-right: 5px; font-family: consolas, menlo, monaco, &amp;#39;Lucida Console&amp;#39;, &amp;#39;Liberation Mono&amp;#39;, &amp;#39;DejaVu Sans Mono&amp;#39;, &amp;#39;Bitstream Vera Sans Mono&amp;#39;, &amp;#39;Courier New&amp;#39;, monospace, serif; border-top-width: 0px; border-bottom-width: 0px; max-height: 600px; font-size: 14px; vertical-align: baseline; border-left-width: 0px; padding-top: 5px; background-clip: initial; background-origin: initial" class="default prettyprint"&gt;&lt;code style="padding-bottom: 0px; border-right-width: 0px; background-color: #eeeeee; margin: 0px; padding-left: 0px; padding-right: 0px; font-family: consolas, menlo, monaco, &amp;#39;Lucida Console&amp;#39;, &amp;#39;Liberation Mono&amp;#39;, &amp;#39;DejaVu Sans Mono&amp;#39;, &amp;#39;Bitstream Vera Sans Mono&amp;#39;, &amp;#39;Courier New&amp;#39;, monospace, serif; border-top-width: 0px; border-bottom-width: 0px; font-size: 14px; vertical-align: baseline; border-left-width: 0px; padding-top: 0px; background-clip: initial; background-origin: initial"&gt;&lt;span style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; color: black; font-size: 14px; vertical-align: baseline; border-left-width: 0px; padding-top: 0px; background-clip: initial; background-origin: initial" class="pun"&gt;[&lt;/span&gt;&lt;span style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; color: #2b91af; font-size: 14px; vertical-align: baseline; border-left-width: 0px; padding-top: 0px; background-clip: initial; background-origin: initial" class="typ"&gt;Mono&lt;/span&gt;&lt;span style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; color: black; font-size: 14px; vertical-align: baseline; border-left-width: 0px; padding-top: 0px; background-clip: initial; background-origin: initial" class="pun"&gt;]&lt;/span&gt;&lt;span style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; color: black; font-size: 14px; vertical-align: baseline; border-left-width: 0px; padding-top: 0px; background-clip: initial; background-origin: initial" class="pln"&gt;
name&lt;/span&gt;&lt;span style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; color: black; font-size: 14px; vertical-align: baseline; border-left-width: 0px; padding-top: 0px; background-clip: initial; background-origin: initial" class="pun"&gt;=&lt;/span&gt;&lt;span style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; color: #2b91af; font-size: 14px; vertical-align: baseline; border-left-width: 0px; padding-top: 0px; background-clip: initial; background-origin: initial" class="typ"&gt;Mono&lt;/span&gt;&lt;span style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; color: black; font-size: 14px; vertical-align: baseline; border-left-width: 0px; padding-top: 0px; background-clip: initial; background-origin: initial" class="pln"&gt; &lt;/span&gt;&lt;span style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; color: #2b91af; font-size: 14px; vertical-align: baseline; border-left-width: 0px; padding-top: 0px; background-clip: initial; background-origin: initial" class="typ"&gt;Stack&lt;/span&gt;&lt;span style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; color: black; font-size: 14px; vertical-align: baseline; border-left-width: 0px; padding-top: 0px; background-clip: initial; background-origin: initial" class="pln"&gt; &lt;/span&gt;&lt;span style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; color: black; font-size: 14px; vertical-align: baseline; border-left-width: 0px; padding-top: 0px; background-clip: initial; background-origin: initial" class="pun"&gt;(&lt;/span&gt;&lt;span style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; color: black; font-size: 14px; vertical-align: baseline; border-left-width: 0px; padding-top: 0px; background-clip: initial; background-origin: initial" class="pln"&gt;RHEL_5&lt;/span&gt;&lt;span style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; color: black; font-size: 14px; vertical-align: baseline; border-left-width: 0px; padding-top: 0px; background-clip: initial; background-origin: initial" class="pun"&gt;)&lt;/span&gt;&lt;span style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; color: black; font-size: 14px; vertical-align: baseline; border-left-width: 0px; padding-top: 0px; background-clip: initial; background-origin: initial" class="pln"&gt;
type&lt;/span&gt;&lt;span style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; color: black; font-size: 14px; vertical-align: baseline; border-left-width: 0px; padding-top: 0px; background-clip: initial; background-origin: initial" class="pun"&gt;=&lt;/span&gt;&lt;span style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; color: black; font-size: 14px; vertical-align: baseline; border-left-width: 0px; padding-top: 0px; background-clip: initial; background-origin: initial" class="pln"&gt;rpm&lt;/span&gt;&lt;span style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; color: black; font-size: 14px; vertical-align: baseline; border-left-width: 0px; padding-top: 0px; background-clip: initial; background-origin: initial" class="pun"&gt;-&lt;/span&gt;&lt;span style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; color: black; font-size: 14px; vertical-align: baseline; border-left-width: 0px; padding-top: 0px; background-clip: initial; background-origin: initial" class="pln"&gt;md
baseurl&lt;/span&gt;&lt;span style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; color: black; font-size: 14px; vertical-align: baseline; border-left-width: 0px; padding-top: 0px; background-clip: initial; background-origin: initial" class="pun"&gt;=&lt;/span&gt;&lt;span style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; color: black; font-size: 14px; vertical-align: baseline; border-left-width: 0px; padding-top: 0px; background-clip: initial; background-origin: initial" class="pln"&gt;http&lt;/span&gt;&lt;span style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; color: black; font-size: 14px; vertical-align: baseline; border-left-width: 0px; padding-top: 0px; background-clip: initial; background-origin: initial" class="pun"&gt;:&lt;/span&gt;&lt;span style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; color: grey; font-size: 14px; vertical-align: baseline; border-left-width: 0px; padding-top: 0px; background-clip: initial; background-origin: initial" class="com"&gt;//ftp.novell.com/pub/mono/download-stable/RHEL_5/&lt;/span&gt;&lt;span style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; color: black; font-size: 14px; vertical-align: baseline; border-left-width: 0px; padding-top: 0px; background-clip: initial; background-origin: initial" class="pln"&gt;
gpgcheck&lt;/span&gt;&lt;span style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; color: black; font-size: 14px; vertical-align: baseline; border-left-width: 0px; padding-top: 0px; background-clip: initial; background-origin: initial" class="pun"&gt;=&lt;/span&gt;&lt;span style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; color: maroon; font-size: 14px; vertical-align: baseline; border-left-width: 0px; padding-top: 0px; background-clip: initial; background-origin: initial" class="lit"&gt;1&lt;/span&gt;&lt;span style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; color: black; font-size: 14px; vertical-align: baseline; border-left-width: 0px; padding-top: 0px; background-clip: initial; background-origin: initial" class="pln"&gt;
gpgkey&lt;/span&gt;&lt;span style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; color: black; font-size: 14px; vertical-align: baseline; border-left-width: 0px; padding-top: 0px; background-clip: initial; background-origin: initial" class="pun"&gt;=&lt;/span&gt;&lt;span style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; color: black; font-size: 14px; vertical-align: baseline; border-left-width: 0px; padding-top: 0px; background-clip: initial; background-origin: initial" class="pln"&gt;http&lt;/span&gt;&lt;span style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; color: black; font-size: 14px; vertical-align: baseline; border-left-width: 0px; padding-top: 0px; background-clip: initial; background-origin: initial" class="pun"&gt;:&lt;/span&gt;&lt;span style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; color: grey; font-size: 14px; vertical-align: baseline; border-left-width: 0px; padding-top: 0px; background-clip: initial; background-origin: initial" class="com"&gt;//ftp.novell.com/pub/mono/download-stable/RHEL_5/repodata/repomd.xml.key&lt;/span&gt;&lt;span style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; color: black; font-size: 14px; vertical-align: baseline; border-left-width: 0px; padding-top: 0px; background-clip: initial; background-origin: initial" class="pln"&gt;
enabled&lt;/span&gt;&lt;span style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; color: black; font-size: 14px; vertical-align: baseline; border-left-width: 0px; padding-top: 0px; background-clip: initial; background-origin: initial" class="pun"&gt;=&lt;/span&gt;&lt;span style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; color: maroon; font-size: 14px; vertical-align: baseline; border-left-width: 0px; padding-top: 0px; background-clip: initial; background-origin: initial" class="lit"&gt;1&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;br /&gt;Then, press the 'escape' key, and type ':w' and ':q'. I'm not used to vi, but I know it's on there and this happens to work. Now you have the repo file in your home directory and you need to move it to the /etc/yum.repos.d directory, but only root can do that, so issue the command 'sudo mv mono.repo /etc/yum.repos.d'.

&lt;br /&gt;

&lt;br /&gt;Next, you'll need to clear the cache using 'sudo yum clean' and install the Mono stack using 'sudo yum install monotools-addon-server'. That will install the latest stable version of Mono, currently 2.10.1.

&lt;br /&gt;

&lt;br /&gt;You can do this on a Large instance and make it quicker, then shutdown your instance, make a snapshot, terminate the instance and make a new 'Micro' instance using the instance and you'll be set up. For some funny reason Micro instances are 64-bit and Large instances are too, but Normal instances are 32-bit only.

&lt;br /&gt;

&lt;br /&gt;Now I have to figure out how to set up a decent web server so I can try to get ASP.NET MVC going.

&lt;p&gt;&lt;strong&gt;UPDATE&lt;/strong&gt;: I definitely needed the following to make ASP.NET MVC work: I had to install WCF, by issuing this command: ‘sudo yum install mono-addon-wcf’. The mod_mono module is autohosting, which means that when installed, it automatically loads so ASP.NET should work out of the box, and the example site is located at /opt/novell/mono/lib/xsp/test.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10546079-7733354232979735269?l=groovbird.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://groovbird.blogspot.com/feeds/7733354232979735269/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://groovbird.blogspot.com/2011/03/setting-up-mono-on-amazon-ec2.html#comment-form' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10546079/posts/default/7733354232979735269'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10546079/posts/default/7733354232979735269'/><link rel='alternate' type='text/html' href='http://groovbird.blogspot.com/2011/03/setting-up-mono-on-amazon-ec2.html' title='Setting up Mono on Amazon EC2'/><author><name>Dave Van den Eynde</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10546079.post-1628406446995065002</id><published>2010-11-27T14:46:00.000+01:00</published><updated>2010-11-27T14:46:01.594+01:00</updated><title type='text'>Dear Proximus, tell your telemarketeers to stop lying in my face.</title><content type='html'>I had a call, the other day. It was a blocked number. I don't usually answer blocked numbers. They're usually telemarketeers. I hate telemarketeers. I don't want to answer the phone when it's a telemarketeer. But you're not really sure, right? So they called again, the day after. I answered, figuring that if I didn't answer, this would go on and on.&lt;br /&gt;
&lt;br /&gt;
It was Proximus, my mobile carrier. The nice voice on the other line started like this: "Hello sir, we've done an analysis of your mobile usage. This won't take long. Can I ask you, how much do you pay, on average, every month?".&lt;br /&gt;
&lt;br /&gt;
I thought to myself, if they've done an analysis, they probably know more about my usage than me, since I rarely check my phonebill. I'll spare you the details, but everything else was a plot to trick me into signing up to a different plan that would stick for 18 months where I would pay a lot more than what I pay today. Her words: "that's not so bad, is it?"&lt;br /&gt;
&lt;br /&gt;
Hmmm..... no thanks.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10546079-1628406446995065002?l=groovbird.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://groovbird.blogspot.com/feeds/1628406446995065002/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://groovbird.blogspot.com/2010/11/dear-proximus-tell-your-telemarketeers.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10546079/posts/default/1628406446995065002'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10546079/posts/default/1628406446995065002'/><link rel='alternate' type='text/html' href='http://groovbird.blogspot.com/2010/11/dear-proximus-tell-your-telemarketeers.html' title='Dear Proximus, tell your telemarketeers to stop lying in my face.'/><author><name>Dave Van den Eynde</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10546079.post-41936189133431831</id><published>2010-11-19T12:54:00.001+01:00</published><updated>2010-11-22T09:27:13.217+01:00</updated><title type='text'>10 steps to become a better .NET developer</title><content type='html'>In response to &lt;a href="http://abdullin.com/journal/2010/11/19/10-steps-to-become-better-net-developer.html"&gt;this blog article&lt;/a&gt;, I'd like to present to you my very own list of tips to become a better .NET developer.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Read a bunch of .NET related books. From each book, try to remember the stuff you feel will make you a better developer, and forget the rest.&lt;/li&gt;
&lt;li&gt;Read a bunch of programming books. From each book, try to remember the stuff you feel will make you a better developer, and forget the rest.&lt;/li&gt;
&lt;li&gt;Learn Unit Testing, so that when that day comes when your senior developer or manager coerces you into using it that at least you can defend yourself if you feel it’s not what you need.&lt;/li&gt;
&lt;li&gt;Idem dito about Continuous Integration, Cloud Computing, ORMs, Scrum, BDD, DDD, TDD, EDD, ServiceBus, Messaging Architectures, CQRS, IoC Containers.&lt;/li&gt;
&lt;li&gt;Keep yourself up to date by reading popular blogs and following popular people on Twitter. Many of these are biased or outright zealots, but that’s ok because you should follow all sides at once. While you do, keep an eye out for “the next big thing” and keep a ton of salt ready.&lt;/li&gt;
&lt;li&gt;Realize that, if you’re not a passionate developer, there’s not much use in reading these tips and you probably won’t ever become a better developer. If that makes you unhappy, find a different career.&lt;/li&gt;
&lt;li&gt;Learn about version control systems. Regardless of how many you know already, there may be more that you’ll never ever encounter, but it’s nice to see just how green the grass is on the other side. It may be greener, but it’s probably browner once you’re past the marketing fluff.&lt;/li&gt;
&lt;li&gt;Realize that, if you’re a passionate developer, you probably know most of these “tips” already, or at least you’re convinced you did and you’re just scanning over them to see if there’s any new acronyms in there that you didn’t hear about yet. Good boy.&lt;/li&gt;
&lt;li&gt;Listen to whatever Anders Hejlsberg says. He’s the next best thing to God himself. If he’s in town, clear your schedule.&lt;/li&gt;
&lt;li&gt;Realize that every list of tips you read is written by a passionate developer, who has his own personal beliefs that may cloud his judgement from time to time when he prepares such list of tips. Such as yours truly.&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10546079-41936189133431831?l=groovbird.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://groovbird.blogspot.com/feeds/41936189133431831/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://groovbird.blogspot.com/2010/11/10-steps-to-become-better-net-developer.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10546079/posts/default/41936189133431831'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10546079/posts/default/41936189133431831'/><link rel='alternate' type='text/html' href='http://groovbird.blogspot.com/2010/11/10-steps-to-become-better-net-developer.html' title='10 steps to become a better .NET developer'/><author><name>Dave Van den Eynde</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10546079.post-7756544543629159703</id><published>2010-09-23T16:49:00.001+02:00</published><updated>2010-09-23T16:49:02.454+02:00</updated><title type='text'>So Dave Newman announces he’s leaving .NET</title><content type='html'>&lt;p&gt;Dave Newman recently announced that &lt;a href="http://whatupdave.tumblr.com/post/1170718843/leaving-net"&gt;he’s leaving .NET for Ruby&lt;/a&gt;. Fine. But he’s giving a bunch of reasons that I strongly disagree with.&lt;/p&gt; &lt;p&gt;Dave thinks that the .NET community is “cut off from the world”, because he’s seen “developers build their own libraries and frameworks in curiously terrible ways”. Sure, fine. But is that a problem with .NET developers?&lt;/p&gt; &lt;p&gt;I’ve been around for a while now, and I’ve worked in .NET, C, C++ and Delphi. Yes, that Delphi, but that period of my life is over. I’ve worked as a freelancer for many years, and I’ve been in a lot of projects using a lot of different development tools and I can tell you this: it’s not a .NET problem. The problem is everywhere. In every project, in every company, there’s always a bunch of problems that need to be dealt with that could have been dealt with using some open-source library somewhere, code that was already written by someone else, but that &lt;em&gt;just wasn’t good enough&lt;/em&gt; to do it. Joel has written &lt;a href="http://www.joelonsoftware.com/articles/fog0000000007.html"&gt;good stuff&lt;/a&gt; in defense of not-invented-here syndrome.&lt;/p&gt; &lt;p&gt;In fact, I wouldn’t consider the phenomenon a problem as there may be very well good reasons why such a problem should be tackled in-house. Whether it’s a problem in such case depends on a lot of factors. But there you are, thinking that this .NET thing is over and that the community &lt;em&gt;sucks&lt;/em&gt; and that the grass is greener on the other side. That’s a natural thing. The grass is &lt;em&gt;always&lt;/em&gt; greener on the other side because you’re too far off to see how &lt;em&gt;not so much greener it really is.&lt;/em&gt;&lt;/p&gt; &lt;p&gt;Dave goes on bashing ASP.NET MVC and how &lt;em&gt;not open source &lt;/em&gt;it is because Microsoft doesn’t accept outside contributions. Well, check your facts, Dave. Accepting contributions is not a requirement of a project to be open-source. Some really high-profile open source products don’t accept outside contributions. &lt;a href="http://www.qmail.org/"&gt;qmail&lt;/a&gt; is such a nice example. Does that mean that no-one can contribute to qmail? Of course not. There’s patches everywhere! Will they work when/if qmail 2.0 comes out? That remains to be seen…&lt;/p&gt; &lt;p&gt;If you want, Dave, you can go and fork ASP.NET MVC yourself, set it up somewhere and start making and distributing your changes. In fact, that’s what you’re talking about when you mention someone setting up a github repository that is dead in the water. Oh, I’m sorry, can you expect from Microsoft to support every little fork out there? &lt;/p&gt; &lt;p&gt;So is Ruby very different?&lt;/p&gt; &lt;p&gt;Ruby, first of all, is a language. So it doesn’t really compare to ASP.NET MVC. You should actually compare it to C#, which has a much bigger community than just ASP.NET MVC. Ruby on Rails, on the other hand, compares much better than ASP.NET MVC, and is equally open source. If you go out and fork Ruby on Rails, will you expect to get support from the Ruby on Rails community? I don’t think so. And if you implement your own feature on top of it, will it be taken up upstream, garantueed? I don’t think so either. Not with David Heinemeier Hansson’s seal of approval. He likes to keep things &lt;a href="http://www.rubyinside.com/david-heinemeier-hansson-says-no-to-use-of-rails-logo-567.html"&gt;tight&lt;/a&gt;, y’know?&lt;/p&gt; &lt;p&gt;Lastly,&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;To those who want to be part of a vibrant community of passionate developers crafting new and innovative solutions, start hanging out with people who aren’t tied to a particular language or framework.&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;says the man who just jumped ship to Ruby.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10546079-7756544543629159703?l=groovbird.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://groovbird.blogspot.com/feeds/7756544543629159703/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://groovbird.blogspot.com/2010/09/so-dave-newman-announces-hes-leaving.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10546079/posts/default/7756544543629159703'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10546079/posts/default/7756544543629159703'/><link rel='alternate' type='text/html' href='http://groovbird.blogspot.com/2010/09/so-dave-newman-announces-hes-leaving.html' title='So Dave Newman announces he’s leaving .NET'/><author><name>Dave Van den Eynde</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10546079.post-3426411381087207553</id><published>2010-09-14T08:35:00.001+02:00</published><updated>2010-09-14T08:35:41.710+02:00</updated><title type='text'>The problem of “pre-owned games”</title><content type='html'>&lt;p&gt;Today, while checking up on one of my favorite game franchises, I ran into this article about how Treyarch are going to “defeat” the &lt;a href="http://blackops.digitalwarfare247.com/news/pre-owned-free-multiplayer"&gt;problem of pre-owned games&lt;/a&gt;. For a minute I was under the impression this article was going to be about how difficult it is these days for gamers to trade, swap and resell their old games, but no. It seems the “problem” is not the game itself, but the honest gamer who paid good money to buy the game in the first place.&lt;/p&gt; &lt;p&gt;You see, they still don’t get it. They think that they’re going to lose money when those gamers are able to trade in or swap games, just like you could swap books or DVD’s. Surely that criminal activity must be stopped! I should note that the article itself details how Treyarch is going to handle the “problem” by providing more quality. Uhmm, sure. But between the lines you can read how the industry feels about its consumer base. How long do they think those honest gamers will stay honest? Surely none of them will have the guts to look for a no-cd patch or any other way to circumvent the roadblocks put in place to stop their malicious behavior.&lt;/p&gt; &lt;p&gt;It happened before with DRM on music, and it will happen again with games and tomorrow with ebooks. Copy protection has had and will have zero effect on those who are not willing to fall in line with the publisher’s demands. Instead, it will keep pushing the paying customers away from spending their hard-earned cash.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10546079-3426411381087207553?l=groovbird.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://groovbird.blogspot.com/feeds/3426411381087207553/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://groovbird.blogspot.com/2010/09/problem-of-pre-owned-games.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10546079/posts/default/3426411381087207553'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10546079/posts/default/3426411381087207553'/><link rel='alternate' type='text/html' href='http://groovbird.blogspot.com/2010/09/problem-of-pre-owned-games.html' title='The problem of “pre-owned games”'/><author><name>Dave Van den Eynde</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10546079.post-513106733571003232</id><published>2010-09-06T13:15:00.003+02:00</published><updated>2010-09-06T13:16:43.514+02:00</updated><title type='text'>The Great App Bubble? I don't think so...</title><content type='html'>Another day, another "article" that gathers random facts and applies some strange statistics to it, only to come to some conclusion that, frankly, I don't see.&lt;br /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;In &lt;a href="http://www.fastcompany.com/1684020/the-great-app-bubble"&gt;this&lt;/a&gt; article, the blogger named Aaron Shapiro aims to take a stab at Apple's App Store, claiming that we're now in an App Bubble, that everybody wants to have an App whether it will make them money or not.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;In his first claim, that apps don't make money for developers, the author simply takes the grand total of revenue for all the apps and divides it by the number of apps available, while at the same time guesstimating what a 'typical' app would cost to make to conclude that the cost of a typical app is greater than the average revenue, and that therefore no profit can be made. First, there is no "typical" app, and can't see how you come to that "typical" cost of $35000 when most of the apps share a common platform on which they are built. Have a look at the list of recently released 'music' apps to find out how many of them are simply copies with different content and you'll see what I mean.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;Second, not every app is made to be profitable. Sometimes the apps aren't the products being sold, but simply exist to support the products being sold. I bought a WiThings scale the other day, and installed the free app that comes with it. Does that mean that the app doesn't make them money? Of course it does, because it provides value to the product that is really being sold: the scale. Or have a look at all the apps that guide you through a music festival, or a museum. There's plenty of examples of apps that don't even need ads to be profitable.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;In his second claim, Aaron states that apps don't make money for Apple. While that isn't a false claim, I don't see how it supports his idea of an App Bubble in the first place.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;The rest of the article is an amalgam of unrelated facts and trivia, with little or no substance to validate his claim.&amp;nbsp;"Marketers are spending money on iDevice apps at the expense of improving their mobile Web sites that everyone with a smart phone can access." How many? Who? Of course, there will always be people making the wrong decisions. Does that imply a climate? Of course not.&lt;br /&gt;
&lt;br /&gt;
What's needed are bloggers that don't give in to primal urges to come up with sensationalist ideas about the world we live in and then try to validate their claims by retrofitting unrelated and unsupportive facts.&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: Georgia, 'Times New Roman', Times, serif; font-size: 15px; line-height: 22px;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10546079-513106733571003232?l=groovbird.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://groovbird.blogspot.com/feeds/513106733571003232/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://groovbird.blogspot.com/2010/09/great-app-bubble.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10546079/posts/default/513106733571003232'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10546079/posts/default/513106733571003232'/><link rel='alternate' type='text/html' href='http://groovbird.blogspot.com/2010/09/great-app-bubble.html' title='The Great App Bubble? I don&apos;t think so...'/><author><name>Dave Van den Eynde</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10546079.post-7785157374623163820</id><published>2010-08-25T16:35:00.002+02:00</published><updated>2010-08-25T16:35:49.215+02:00</updated><title type='text'>When debugging WCF ...</title><content type='html'>...remember this attribute:&lt;br /&gt;
&lt;br /&gt;
[System.ServiceModel.ServiceBehavior(IncludeExceptionDetailInFaults = true)]&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10546079-7785157374623163820?l=groovbird.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://groovbird.blogspot.com/feeds/7785157374623163820/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://groovbird.blogspot.com/2010/08/when-debugging-wcf.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10546079/posts/default/7785157374623163820'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10546079/posts/default/7785157374623163820'/><link rel='alternate' type='text/html' href='http://groovbird.blogspot.com/2010/08/when-debugging-wcf.html' title='When debugging WCF ...'/><author><name>Dave Van den Eynde</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10546079.post-1097625226577861230</id><published>2010-08-18T18:03:00.000+02:00</published><updated>2010-08-18T18:03:47.657+02:00</updated><title type='text'>The Web is not 'dead'</title><content type='html'>Got my eyes on this so-called&amp;nbsp;&lt;a href="http://www.wired.com/magazine/2010/08/ff_webrip/all/1"&gt;article&lt;/a&gt;&amp;nbsp;today, claiming that the Web as we know it is dead.&lt;br /&gt;
&lt;br /&gt;
Just because there's a lot more traffic going to peer-to-peer and video applications doesn't mean that the Web is dead. I'm sure most of that video is fed over HTTP, the protocol that the Web is built on, and uses URLs to get found. Most of the third party applications that don't need a browser to talk to their servers using Web Services in one form or another, so I wouldn't consider that 'dead' either.&lt;br /&gt;
&lt;br /&gt;
The fact that people are using more and more devices that can reach the Web without actually using a browser also doesn't mean that the Web is dead. In fact, more and more devices (handhelds, smartphones, music players, consoles) actually gain a modern useful browser that can be used to browse all of the Web instead of being limited to device-specific formats such as WAP. So I'd say there's more useful browsers these days than before.&lt;br /&gt;
&lt;br /&gt;
The writer of that article clearly doesn't have a clue about what makes all these useful apps work. I just felt like pointing that out to anyone that takes that article at face value.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10546079-1097625226577861230?l=groovbird.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://groovbird.blogspot.com/feeds/1097625226577861230/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://groovbird.blogspot.com/2010/08/web-is-not-dead.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10546079/posts/default/1097625226577861230'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10546079/posts/default/1097625226577861230'/><link rel='alternate' type='text/html' href='http://groovbird.blogspot.com/2010/08/web-is-not-dead.html' title='The Web is not &apos;dead&apos;'/><author><name>Dave Van den Eynde</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10546079.post-3098521211559674383</id><published>2010-08-06T11:56:00.000+02:00</published><updated>2010-08-06T11:56:42.847+02:00</updated><title type='text'>Adam.JSGenerator</title><content type='html'>Over the past few months I've been working on a side project at work, that my employer has now allowed me to publish as my very first open source project. I'm very excited.&lt;br /&gt;
&lt;br /&gt;
Read more about it &lt;a href="http://tinyurl.com/ajsgen"&gt;here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10546079-3098521211559674383?l=groovbird.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://groovbird.blogspot.com/feeds/3098521211559674383/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://groovbird.blogspot.com/2010/08/adamjsgenerator.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10546079/posts/default/3098521211559674383'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10546079/posts/default/3098521211559674383'/><link rel='alternate' type='text/html' href='http://groovbird.blogspot.com/2010/08/adamjsgenerator.html' title='Adam.JSGenerator'/><author><name>Dave Van den Eynde</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10546079.post-7889470030123286492</id><published>2010-03-16T09:29:00.000+01:00</published><updated>2010-03-16T09:29:43.637+01:00</updated><title type='text'>Learning</title><content type='html'>Today I learned something.&lt;br /&gt;
&lt;br /&gt;
Today I learned that a &lt;a href="http://stackoverflow.com/"&gt;Stack Overflow&lt;/a&gt; is not just a good place to go when you're stuck with something or you want a second opinion. It's also a good place to go when you want to learn something.&lt;br /&gt;
&lt;br /&gt;
Here's how to do it.&lt;br /&gt;
&lt;br /&gt;
Go over there, and look for recent questions on the topic that you want to learn something about. Preferably questions that are not exactly completely answered, and that are non-trivial to answer. But, try to stay away from the "please do my homework for me" type of questions.&lt;br /&gt;
&lt;br /&gt;
You don't have to have an answer ready for it. I usually browse SO and sometimes find answers that I can just type from the top of my head and be done with it. But that's not what I'm aiming for here. Try to find a question where you know you'll spend a good 15 minutes to half an hour figuring out what the real answer is, and then try to answer it. Ideally, you'll have an understanding of the problem, but you just know that if you spend some time, you'll come up with a really good answer.&lt;br /&gt;
&lt;br /&gt;
You'll spend 15 to 30 minutes on it, because you'll have to do some research and you'll have to make some sample code (and test it too!). You don't need to write out an entire application. Sometimes it's enough to have a couple of lines of code in your answer that will do the trick, but you'll need to make that test app for yourself to make sure that what you write will work.&lt;br /&gt;
&lt;br /&gt;
Don't be a rep whore. You won't gain much reputation points, because it may be an older question (older than 2 minutes) and the person who posed the question may have left permanently, or there may be less complete answers that have already been accepted. But the point it not to gain rep. The point is to learn.&lt;br /&gt;
&lt;br /&gt;
That's what I did today. It took me little over half an hour. But I learned something. And I'm gonna do it again tomorrow.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10546079-7889470030123286492?l=groovbird.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://groovbird.blogspot.com/feeds/7889470030123286492/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://groovbird.blogspot.com/2010/03/learning.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10546079/posts/default/7889470030123286492'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10546079/posts/default/7889470030123286492'/><link rel='alternate' type='text/html' href='http://groovbird.blogspot.com/2010/03/learning.html' title='Learning'/><author><name>Dave Van den Eynde</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10546079.post-9063037772424575335</id><published>2010-02-25T14:45:00.002+01:00</published><updated>2010-02-25T14:45:59.820+01:00</updated><title type='text'>Visual Studio caches the project file and imported</title><content type='html'>Today I found &lt;a href="http://msdn.microsoft.com/en-us/library/ms171468.aspx"&gt;this one&lt;/a&gt; out the hard way:&lt;br /&gt;
&lt;blockquote&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 11px;"&gt;&lt;div class="CollapseRegionLink" style="color: black; cursor: pointer; font-size: 13px; font-weight: bold; text-decoration: none;"&gt;&lt;img class="LibC_o" src="http://i.msdn.microsoft.com/Global/Images/clear.gif" style="background-attachment: initial; background-clip: initial; background-color: initial; background-image: url(http://i3.msdn.microsoft.com/global/Images/LibC.gif); background-origin: initial; background-position: 0px 0px; background-repeat: initial initial; border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; height: 16px; vertical-align: middle; width: 16px;" /&gt;&amp;nbsp;&amp;nbsp;Editing Loaded Project Files&lt;/div&gt;&lt;div class="MTPS_CollapsibleSection" style="clear: both; display: block; padding-left: 10px;"&gt;&lt;a href="" id="sectionToggle13" style="color: #0033cc; text-decoration: none;"&gt;&lt;/a&gt;&lt;div style="margin-bottom: 10px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Visual Studio caches the content of project files and files imported by project files. If you edit a loaded project file, Visual Studio will automatically prompt you to reload the project so that the changes take effect. However if you edit a file imported by a loaded project, there will be no reload prompt and you must unload and reload the project manually to make the changes take effect.&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10546079-9063037772424575335?l=groovbird.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://groovbird.blogspot.com/feeds/9063037772424575335/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://groovbird.blogspot.com/2010/02/visual-studio-caches-project-file-and.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10546079/posts/default/9063037772424575335'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10546079/posts/default/9063037772424575335'/><link rel='alternate' type='text/html' href='http://groovbird.blogspot.com/2010/02/visual-studio-caches-project-file-and.html' title='Visual Studio caches the project file and imported'/><author><name>Dave Van den Eynde</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10546079.post-3803590599551866177</id><published>2010-01-25T15:57:00.000+01:00</published><updated>2010-01-25T15:57:00.586+01:00</updated><title type='text'>Unable to start debugging on the web server. The object identifier does not represent a valid object.</title><content type='html'>When you get this message, first thing you should check is if Windows Authentication is turned on for this website.&lt;br /&gt;
&lt;br /&gt;
That's all.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10546079-3803590599551866177?l=groovbird.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://groovbird.blogspot.com/feeds/3803590599551866177/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://groovbird.blogspot.com/2010/01/unable-to-start-debugging-on-web-server.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10546079/posts/default/3803590599551866177'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10546079/posts/default/3803590599551866177'/><link rel='alternate' type='text/html' href='http://groovbird.blogspot.com/2010/01/unable-to-start-debugging-on-web-server.html' title='Unable to start debugging on the web server. The object identifier does not represent a valid object.'/><author><name>Dave Van den Eynde</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10546079.post-2332080078256537402</id><published>2009-09-19T19:31:00.001+02:00</published><updated>2009-09-19T19:31:18.811+02:00</updated><title type='text'>Enabling client caching of dynamic content</title><content type='html'>&lt;p&gt;In my last post, I was explaining how I wanted to return pictures from my ASP.NET MVC based application. In short, this is what I did:&lt;/p&gt;  &lt;pre class="csharpcode"&gt;[ReplaceMissingPicture(Picture = &lt;span class="str"&gt;&amp;quot;~/Content/Images/nopicture.png&amp;quot;&lt;/span&gt;, MimeType = &lt;span class="str"&gt;&amp;quot;image/png&amp;quot;&lt;/span&gt;)]
&lt;span class="kwrd"&gt;public&lt;/span&gt; ActionResult Picture(&lt;span class="kwrd"&gt;int&lt;/span&gt; id)
{
    var item = Service.GetItem(id);

    &lt;span class="kwrd"&gt;if&lt;/span&gt; (item.Picture != &lt;span class="kwrd"&gt;null&lt;/span&gt;)
    {
        var picture = item.Picture.ToArray();
        var mime = item.PictureMime;

        &lt;span class="kwrd"&gt;return&lt;/span&gt; File(picture, mime);
    }
    &lt;span class="kwrd"&gt;else&lt;/span&gt;
    {
        &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;null&lt;/span&gt;;
    }
}&lt;/pre&gt;

&lt;p&gt;Please see my last post for more information about what you see here.&lt;/p&gt;

&lt;p&gt;This is all nice, but there’s a problem. Every time the client requests our “Picture” action method, the picture is returned with a HTTP status code 200. This is what you normally want, but my concern is that this happens &lt;em&gt;every time&lt;/em&gt;. If this were a static file hosted by the web server, the web server would be smart enough to return an HTTP status code 304, meaning that the requested resource didn’t change since the last time it was requested.&lt;/p&gt;

&lt;p&gt;How does this work? That’s relatively simple. When the resource is first requested, and the picture is returned, the web application should add a header to the HTTP response named “&lt;strong&gt;Etag&lt;/strong&gt;”. This header contains a string that represents the “version” of the resource. This can really be anything.&lt;/p&gt;

&lt;p&gt;When the client requests the same resource again, and the client has a cached copy of the resource, it sends a request containing an extra header named “&lt;strong&gt;If-None-Match&lt;/strong&gt;”, meaning that if the resource still matches this version, it should return HTTP 304 and no content.&lt;/p&gt;

&lt;p&gt;So how do we implement this?&lt;/p&gt;

&lt;p&gt;For the version&amp;#160; information, I chose to place a &lt;strong&gt;timestamp&lt;/strong&gt; column in the table containing the picture, and an associated property in the LINQ to SQL business object. The timestamp column type is not related to dates and times. It’s just a value that you can check for if you want to know if the record has changed in any way since you last read it. Which is perfect for this example. &lt;/p&gt;

&lt;p&gt;So the first thing we need to do is send the version to the client. In order to keep this testable, I decided to implement it in a way that closely resembles &lt;a href="http://stackoverflow.com/questions/1445838/how-to-get-and-set-http-headers-in-an-action-the-testable-way/1445942#1445942"&gt;this answer to my question on Stack Overflow&lt;/a&gt;. First of all, we need an interface that we can call from our Action method that deals with adding the tag and checking for it. This should do fine:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;interface&lt;/span&gt; ITagService
{
    &lt;span class="kwrd"&gt;string&lt;/span&gt; GetRequestTag();
    &lt;span class="kwrd"&gt;void&lt;/span&gt; SetResponseTag(&lt;span class="kwrd"&gt;string&lt;/span&gt; &lt;span class="kwrd"&gt;value&lt;/span&gt;);
}&lt;/pre&gt;

&lt;p&gt;When we add a property of this interface to our controller and initialize it in the constructor, we can decide what kind of implementation we use at runtime (whether that is the application hosted in IIS, or during testing). So we can use a mock for testing, and we can use the following class in IIS:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; HttpTagService : ITagService
{
    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; GetRequestTag()
    {
        &lt;span class="kwrd"&gt;return&lt;/span&gt; HttpContext.Current.Request.Headers[&lt;span class="str"&gt;&amp;quot;If-None-Match&amp;quot;&lt;/span&gt;];
    }

    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; SetResponseTag(&lt;span class="kwrd"&gt;string&lt;/span&gt; &lt;span class="kwrd"&gt;value&lt;/span&gt;)
    {
        HttpContext.Current.Response.AppendHeader(&lt;span class="str"&gt;&amp;quot;ETag&amp;quot;&lt;/span&gt;, &lt;span class="kwrd"&gt;value&lt;/span&gt;);
    }
}&lt;/pre&gt;

&lt;p&gt;&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;So now our Picture action method looks like this:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;[ReplaceMissingPicture(Picture = &lt;span class="str"&gt;&amp;quot;~/Content/Images/nopicture.png&amp;quot;&lt;/span&gt;, MimeType = &lt;span class="str"&gt;&amp;quot;image/png&amp;quot;&lt;/span&gt;)]
&lt;span class="kwrd"&gt;public&lt;/span&gt; ActionResult Picture(&lt;span class="kwrd"&gt;int&lt;/span&gt; id)
{
    var item = Service.GetItem(id);

    var responseTag = item.Version != &lt;span class="kwrd"&gt;null&lt;/span&gt; ? 
        Convert.ToBase64String(item.Version.ToArray()) :
        &lt;span class="kwrd"&gt;string&lt;/span&gt;.Empty;

    &lt;span class="kwrd"&gt;if&lt;/span&gt; (item.Picture != &lt;span class="kwrd"&gt;null&lt;/span&gt;)
    {
        var picture = item.Picture.ToArray();
        var mime = item.PictureMime;

        TagService.SetResponseTag(responseTag);

        &lt;span class="kwrd"&gt;return&lt;/span&gt; File(picture, mime);
    }
    &lt;span class="kwrd"&gt;else&lt;/span&gt;
    {
        &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;null&lt;/span&gt;;
    }
}&lt;/pre&gt;

&lt;p&gt;A simple &lt;strong&gt;ToBase64String&lt;/strong&gt;() from our version column (which is mapped to a &lt;strong&gt;Binary&lt;/strong&gt; object) should do just fine.&lt;/p&gt;

&lt;p&gt;Before we go into how we’ll check for the tag (which is pretty trivial) we also need to know how to return the actual HTTP 304 status. The following needs to happen:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Response.SuppressContent&lt;/strong&gt; must be set to true.&lt;/li&gt;

  &lt;li&gt;&lt;strong&gt;Response.StatusCode&lt;/strong&gt; needs to be set to 304.&lt;/li&gt;

  &lt;li&gt;&lt;strong&gt;Response.StatusDescription&lt;/strong&gt; needs a description.&lt;/li&gt;

  &lt;li&gt;&lt;strong&gt;Response&lt;/strong&gt; needs a header “&lt;strong&gt;Content-Length&lt;/strong&gt;” set to “0”.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This last one is important, as it will allow the client to keep the connection open for the next request while not expecting any more output from the current request.&lt;/p&gt;

&lt;p&gt;In order to keep this testable, I chose to create a custom &lt;strong&gt;ActionResult&lt;/strong&gt; called &lt;strong&gt;NotModifiedResult&lt;/strong&gt;. Here’s the implementation:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; NotModifiedResult : ActionResult
{
    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; ExecuteResult(ControllerContext context)
    {
        var response = context.HttpContext.Response;

        response.SuppressContent = &lt;span class="kwrd"&gt;true&lt;/span&gt;;
        response.StatusCode = 304;
        response.StatusDescription = &lt;span class="str"&gt;&amp;quot;Not Modified&amp;quot;&lt;/span&gt;;
        response.AddHeader(&lt;span class="str"&gt;&amp;quot;Content-Length&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;0&amp;quot;&lt;/span&gt;);
    }
}&lt;/pre&gt;

&lt;p&gt;&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;This is exactly what we need, and ASP.NET MVC makes it easy again to keep this all neat and tidy. Our tests can simply check for the type of result returned, and &lt;strong&gt;ExecuteResult&lt;/strong&gt;() never needs to be executed in a test environment.&lt;/p&gt;

&lt;p&gt;So finally, our Picture action method looks like this:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;[ReplaceMissingPicture(Picture = &lt;span class="str"&gt;&amp;quot;~/Content/Images/nopicture.png&amp;quot;&lt;/span&gt;, MimeType = &lt;span class="str"&gt;&amp;quot;image/png&amp;quot;&lt;/span&gt;)]
&lt;span class="kwrd"&gt;public&lt;/span&gt; ActionResult Picture(&lt;span class="kwrd"&gt;int&lt;/span&gt; id)
{
    var item = Service.GetItem(id);

    var requestTag = TagService.GetRequestTag() ?? &lt;span class="kwrd"&gt;string&lt;/span&gt;.Empty;
    var responseTag = item.Version != &lt;span class="kwrd"&gt;null&lt;/span&gt; ? 
        Convert.ToBase64String(item.Version.ToArray()) :
        &lt;span class="kwrd"&gt;string&lt;/span&gt;.Empty;

    &lt;span class="kwrd"&gt;if&lt;/span&gt; (responseTag == requestTag)
    {
        &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; NotModifiedResult();
    }

    &lt;span class="kwrd"&gt;if&lt;/span&gt; (item.Picture != &lt;span class="kwrd"&gt;null&lt;/span&gt;)
    {
        var picture = item.Picture.ToArray();
        var mime = item.PictureMime;

        TagService.SetResponseTag(responseTag);

        &lt;span class="kwrd"&gt;return&lt;/span&gt; File(picture, mime);
    }
    &lt;span class="kwrd"&gt;else&lt;/span&gt;
    {
        &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;null&lt;/span&gt;;
    }
}&lt;/pre&gt;

&lt;p&gt;I’m sure this doesn’t need any explanation. &lt;/p&gt;

&lt;p&gt;Two more things I’d like to mention. First of all, I decided to turn the Picture column into a delay loaded column by setting its Delay Loaded property to true in the LINQ to SQL designer. This way, when the table is queried, the column is not selected by default. Only when you access the picture column a new query is started specifically for the picture. This way, when you don’t need the picture (like in a table overview of the business objects) it’s not queried for and retrieved from the database. Also, this means that our action method requires two queries: one for the Item and one for the Picture column. Except that in the case of a client cached picture, the second query doesn’t need to be executed. &lt;/p&gt;

&lt;p&gt;Second, I want you to know that this technique here doesn’t just apply to pictures, it applies to any sort of content that can be accessed as a resource. If the client can cache it, you can enable the web application to support that caching method.&lt;/p&gt;

&lt;p&gt;Now all I need to do, is apply the same to my &lt;strong&gt;ReplaceMissingPicture&lt;/strong&gt; filter that I talked about last time.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10546079-2332080078256537402?l=groovbird.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://groovbird.blogspot.com/feeds/2332080078256537402/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://groovbird.blogspot.com/2009/09/enabling-client-caching-of-dynamic.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10546079/posts/default/2332080078256537402'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10546079/posts/default/2332080078256537402'/><link rel='alternate' type='text/html' href='http://groovbird.blogspot.com/2009/09/enabling-client-caching-of-dynamic.html' title='Enabling client caching of dynamic content'/><author><name>Dave Van den Eynde</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10546079.post-5221963340095552537</id><published>2009-09-19T11:53:00.002+02:00</published><updated>2009-09-19T17:39:52.768+02:00</updated><title type='text'>About returning missing pictures.</title><content type='html'>&lt;p&gt;While working on my pet project, I wanted to return pictures stored in the database. This is actually pretty much child’s play in ASP.NET MVC, and is well documented elsewhere.&lt;/p&gt;  &lt;p&gt;Practically, it boils down to this:&lt;/p&gt;  &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; ActionResult Picture(&lt;span class="kwrd"&gt;int&lt;/span&gt; id)
{
    var item = Service.GetItem(id);

    &lt;span class="kwrd"&gt;if&lt;/span&gt; (item.Picture != &lt;span class="kwrd"&gt;null&lt;/span&gt;)
    {
        var picture = item.Picture.ToArray();
        var mime = item.PictureMime;

        &lt;span class="kwrd"&gt;return&lt;/span&gt; File(picture, mime);
    }
    &lt;span class="kwrd"&gt;else&lt;/span&gt;
    {
        &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;null&lt;/span&gt;;
    }
}&lt;/pre&gt;

&lt;p&gt;In this particular code, Service is a my data service returning an item (which is a business object in my application) and Picture is a Binary property, linked to a varbinary(MAX) column by LINQ to SQL.&lt;/p&gt;

&lt;p&gt;All you need here is a byte array, and a mime type string, and calling File() will return a FileContentResult that takes care of everything else. Like I said, child’s play.&lt;/p&gt;

&lt;p&gt;But there’s a couple of things missing. First of all, what happens if the picture can’t be found? What do we return? Do we throw an exception? Well, we certainly throw an exception in the Service when the item can’t be found, but nothing will point to this Action when the item doesn’t exist, so the only way the user would get this exception is by explicitly demanding this Action (and in that case, I don’t care if they get a 404).&lt;/p&gt;

&lt;p&gt;But if the item exists, yet there is no picture, then what do we return? The sane thing to return is another picture, that visually says “Sorry, but there’s no picture.”. But returning it from the Action means we need to look it up, use Server.MapPath() to get to the file and return that instead. That means that we’ll need to call Server.MapPath() from inside the Action, and that’s bad for testability.&lt;/p&gt;

&lt;p&gt;So what I decided to do was create an Action Filter, that would respond to null being returned from the Action method and replace the content with the missing picture. So here goes:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; ReplaceMissingPictureAttribute : ActionFilterAttribute
{
    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; Picture { get; set; }
    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; MimeType { get; set; }

    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; OnActionExecuted(ActionExecutedContext filterContext)
    {
        &lt;span class="kwrd"&gt;if&lt;/span&gt; (filterContext.Result &lt;span class="kwrd"&gt;is&lt;/span&gt; EmptyResult)
        {
            filterContext.Result = &lt;span class="kwrd"&gt;new&lt;/span&gt; FilePathResult(filterContext.RequestContext.HttpContext.Server.MapPath(Picture), MimeType);
        }
        &lt;span class="kwrd"&gt;base&lt;/span&gt;.OnActionExecuted(filterContext);
    }
}&lt;/pre&gt;

&lt;p&gt;And we apply it like so:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;[ReplaceMissingPicture(Picture = &lt;span class="str"&gt;&amp;quot;~/Content/Images/nopicture.png&amp;quot;&lt;/span&gt;, MimeType = &lt;span class="str"&gt;&amp;quot;image/png&amp;quot;&lt;/span&gt;)]
&lt;span class="kwrd"&gt;public&lt;/span&gt; ActionResult Picture(&lt;span class="kwrd"&gt;int&lt;/span&gt; id)
{
    var item = Service.GetItem(id);

    &lt;span class="kwrd"&gt;if&lt;/span&gt; (item.Picture != &lt;span class="kwrd"&gt;null&lt;/span&gt;)
    {
        var picture = item.Picture.ToArray();
        var mime = item.PictureMime;

        &lt;span class="kwrd"&gt;return&lt;/span&gt; File(picture, mime);
    }
    &lt;span class="kwrd"&gt;else&lt;/span&gt;
    {
        &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;null&lt;/span&gt;;
    }
}&lt;/pre&gt;

&lt;p&gt;So we’re still pointing to the right content to return in case null is returned, but the filter takes care of looking up the right content instead of the Action. So when we test for this, we can simply test for null being returned.&lt;/p&gt;

&lt;p&gt;Next time I’ll discuss how I managed to make this client cacheable.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10546079-5221963340095552537?l=groovbird.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://groovbird.blogspot.com/feeds/5221963340095552537/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://groovbird.blogspot.com/2009/09/about-returning-missing-pictures.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10546079/posts/default/5221963340095552537'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10546079/posts/default/5221963340095552537'/><link rel='alternate' type='text/html' href='http://groovbird.blogspot.com/2009/09/about-returning-missing-pictures.html' title='About returning missing pictures.'/><author><name>Dave Van den Eynde</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10546079.post-4021587991424887865</id><published>2009-07-15T10:40:00.004+02:00</published><updated>2009-09-19T14:07:57.138+02:00</updated><title type='text'>HandleError and HTTP response codes.</title><content type='html'>&lt;p&gt;After asking &lt;a href="http://stackoverflow.com/questions/1129900/in-asp-net-mvc-should-onexception-be-used-for-application-exceptions"&gt;this question&lt;/a&gt; on Stack Overflow, I went out and used HandleError for my application exception handling. It works, as long as you turn on the customErrors configuration element. Then, after applying the HandleError attribute twice on my controller base class, I was able to get the exceptions NotFoundException and NoAccessException (my own, the names speak for themselves) turned into a nice rendering of the NotFound and NoAccess views. &lt;/p&gt;  &lt;p&gt;Then I read up on HTTP status codes, and figured that HTTP code 500 is perhaps not the most appropriate for a situation in which an object with a certain Id cannot be found. In the future, for example, I might conclude that if the user wants to &lt;span style="font-style: italic"&gt;delete&lt;/span&gt; one of his objects, that object wouldn't be really deleted in the database but instead just &lt;span style="font-style: italic"&gt;flagged&lt;/span&gt; as such. In that case, my model should throw a DeletedException instead of a NotFoundException, so that I could inform the user that the object once existed but is no longer there. Also, I would want to return HTTP code 410 (&amp;quot;Gone&amp;quot;) along with it, so that search engines can remove the entry from their indexes.&lt;/p&gt;  &lt;p&gt; HandleError doesn't allow you to do that. But no worry, since I derived a new one from it, temporarily called MyHandleError (perhaps to be renamed HandleErrorWithStatus in the future) that would call the base OnException, and set the StatusCode in the Reponse after the correct View has been selected. Here’s the code to do it:&lt;/p&gt;  &lt;pre class="csharpcode"&gt;[SuppressMessage(&lt;span class="str"&gt;&amp;quot;Microsoft.Performance&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;CA1813:AvoidUnsealedAttributes&amp;quot;&lt;/span&gt;,
Justification = &lt;span class="str"&gt;&amp;quot;This attribute is AllowMultiple = true and users might want to override behavior.&amp;quot;&lt;/span&gt;)]
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = &lt;span class="kwrd"&gt;true&lt;/span&gt;, AllowMultiple = &lt;span class="kwrd"&gt;true&lt;/span&gt;)]
&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; MyHandleErrorAttribute : HandleErrorAttribute
{
    &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; statusCode = 500;

    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; StatusCode
    {
        get
        {
            &lt;span class="kwrd"&gt;return&lt;/span&gt; statusCode;
        }
        set
        {
            statusCode = &lt;span class="kwrd"&gt;value&lt;/span&gt;;
        }
    }

    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; OnException(ExceptionContext filterContext)
    {
        &lt;span class="kwrd"&gt;if&lt;/span&gt; (filterContext == &lt;span class="kwrd"&gt;null&lt;/span&gt;)
        {
            &lt;span class="kwrd"&gt;throw&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; ArgumentNullException(&lt;span class="str"&gt;&amp;quot;filterContext&amp;quot;&lt;/span&gt;);
        }

        &lt;span class="rem"&gt;// If custom errors are disabled, we need to let the normal ASP.NET exception handler&lt;/span&gt;
        &lt;span class="rem"&gt;// execute so that the user can see useful debugging information.&lt;/span&gt;
        &lt;span class="kwrd"&gt;if&lt;/span&gt; (filterContext.ExceptionHandled || !filterContext.HttpContext.IsCustomErrorEnabled)
        {
            &lt;span class="kwrd"&gt;return&lt;/span&gt;;
        }

        &lt;span class="kwrd"&gt;if&lt;/span&gt; (!ExceptionType.IsInstanceOfType(filterContext.Exception))
        {
            &lt;span class="kwrd"&gt;return&lt;/span&gt;;
        }

        &lt;span class="kwrd"&gt;if&lt;/span&gt; (&lt;span class="kwrd"&gt;new&lt;/span&gt; HttpException(&lt;span class="kwrd"&gt;null&lt;/span&gt;, filterContext.Exception).GetHttpCode() != 500)
        {
            &lt;span class="kwrd"&gt;return&lt;/span&gt;;
        }

        &lt;span class="kwrd"&gt;base&lt;/span&gt;.OnException(filterContext);

        filterContext.HttpContext.Response.StatusCode = StatusCode;
    }

}&lt;/pre&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10546079-4021587991424887865?l=groovbird.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://groovbird.blogspot.com/feeds/4021587991424887865/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://groovbird.blogspot.com/2009/07/handleerror-and-http-response-codes.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10546079/posts/default/4021587991424887865'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10546079/posts/default/4021587991424887865'/><link rel='alternate' type='text/html' href='http://groovbird.blogspot.com/2009/07/handleerror-and-http-response-codes.html' title='HandleError and HTTP response codes.'/><author><name>Dave Van den Eynde</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10546079.post-7217320660477075735</id><published>2009-07-04T07:38:00.003+02:00</published><updated>2009-07-04T07:40:00.006+02:00</updated><title type='text'>Intel X25-M</title><content type='html'>I took the jump and installed &lt;a href="http://www.intel.com/design/flash/nand/mainstream/index.htm"&gt;one of these suckers&lt;/a&gt; into my XPS1330M. Something I should've done a long time ago.

If your boot time takes longer than 10s, you should check the event log to see what kept it so long (like a missing UPEK FingerPrint Reader driver, for example)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10546079-7217320660477075735?l=groovbird.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://groovbird.blogspot.com/feeds/7217320660477075735/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://groovbird.blogspot.com/2009/07/intel-x25-m.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10546079/posts/default/7217320660477075735'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10546079/posts/default/7217320660477075735'/><link rel='alternate' type='text/html' href='http://groovbird.blogspot.com/2009/07/intel-x25-m.html' title='Intel X25-M'/><author><name>Dave Van den Eynde</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10546079.post-2036783692819588327</id><published>2009-07-04T07:18:00.002+02:00</published><updated>2009-09-19T14:03:44.930+02:00</updated><title type='text'>Win7, ASP.NET MVC, IIS 7, SQL Server 2008</title><content type='html'>&lt;p&gt;While setting up my development machine for the coming weeks, I needed to make a number of tough decisions. The first decision was whether to go with SQL Server 2005 or SQL Server 2008. I figured it was not a bad thing to go with the lastest version for new development. I remember there was an issue with Visual Studio 2008 integrating with SQL Server 2008, but that seemed to be fixed in Visual Studio 2008 SP1. &lt;/p&gt;  &lt;p&gt;The next decision was whether to go with SQL Server Express or Standard. I chose the latter, simply because it's a different environment and if I'm going to test my app with a &amp;quot;real&amp;quot; server I might as well start to use it in development as well. &lt;/p&gt;  &lt;p&gt;The final decision to make was whether to use the development web server included with VS2008 or go with IIS7. Again, I chose the latter for the aforementioned reasons: if I'm going to deploy to IIS7, I might as well debug it in IIS7 as well. That will tell me about the kind of problems I might run into before I go into &amp;quot;production&amp;quot;. &lt;/p&gt;  &lt;p&gt;Seems that a number of those problems already found me while trying to use the simplest ASP.NET MVC project possible: File&amp;gt;Create New. Compile. Run. &lt;em&gt;Fail&lt;/em&gt;. &lt;/p&gt;  &lt;p&gt;The problem was that it was impossible to register with the new website. ASP.NET MVC out of the box uses the ASP.NET MembershipProvider to offer signup/login functionality. Which is cool. But of course, it won't work out of the box when you're using the SQL Server 2008 Standard edition. &lt;/p&gt;  &lt;p&gt;The first issue is that the Standard edition doesn't support attached databases. So creating a new database file (.mdf) won't work. That also means that no such database is ready when you're running for the first time. You'll have to make it yourself. That one is easy: ASP.NET comes with a nice &lt;a href="http://msdn.microsoft.com/en-us/library/x28wfk74.aspx"&gt;tool&lt;/a&gt; that does this for you on any database of your choosing. I knew that! So I opened SQL Server Management Studio, created a new database (I called it &amp;quot;aspnetdb&amp;quot;. Aptly. Very aptly.) and used the aspnet_regsql tool to create the required schema in there. &lt;/p&gt;  &lt;p&gt;Then, I changed the connection string in Web.config to use this database. I kept the integrated security on (anyone still using &amp;quot;mixed mode security&amp;quot; should be dragged onto the street and shot). So then it worked. But only when using the development webserver. Because that uses my personal account to connect to SQL Server, and I happen to be database administrator (at least, that's what SQL Server tells me) so it can connect and do all of its stuff just fine.&lt;/p&gt;  &lt;p&gt;When you use IIS 7, it uses the identity of the app pool of your web app to connect to SQL Server. That's also an easy guess. The problem is that in Windows 7, there's some weirdness about what user account is used exactly to that purpose. SQL Server will report a failed login for &amp;quot;IIS APPPOOL\DefaultAppPool&amp;quot;. But I couldn't find such a user. While I was googling, I came across a number of sites advising me to switch it back to using Network Service for the DefaultAppPool, but I knew there had to be a better way. The weirdness ended when I took a leap of faith: I added a login named IIS APPPOOL\DefaultAppPool without checking the name. That worked. &lt;/p&gt;  &lt;p&gt;After that, I made it dbo of the aspnetdb database (which is probably too much, but it'll do for now) and then everything went smoothly. This is exactly the sort of problems I was hoping to encounter before actually deploying. So my plan worked!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10546079-2036783692819588327?l=groovbird.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://groovbird.blogspot.com/feeds/2036783692819588327/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://groovbird.blogspot.com/2009/07/win7-aspnet-mvc-iis-7-sql-server-2008.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10546079/posts/default/2036783692819588327'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10546079/posts/default/2036783692819588327'/><link rel='alternate' type='text/html' href='http://groovbird.blogspot.com/2009/07/win7-aspnet-mvc-iis-7-sql-server-2008.html' title='Win7, ASP.NET MVC, IIS 7, SQL Server 2008'/><author><name>Dave Van den Eynde</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10546079.post-1223582899845240139</id><published>2009-07-02T20:56:00.001+02:00</published><updated>2009-07-02T20:57:32.900+02:00</updated><title type='text'></title><content type='html'>&lt;a href="http://kmwoley.com/blog/?p=345"&gt;Here&lt;/a&gt; I found an excellect blogpost on how to make a bootable USB drive to install Windows 7 RC from. Excellent! Worked like a charm!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10546079-1223582899845240139?l=groovbird.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://groovbird.blogspot.com/feeds/1223582899845240139/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://groovbird.blogspot.com/2009/07/here-i-found-excellect-blogpost-on-how.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10546079/posts/default/1223582899845240139'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10546079/posts/default/1223582899845240139'/><link rel='alternate' type='text/html' href='http://groovbird.blogspot.com/2009/07/here-i-found-excellect-blogpost-on-how.html' title=''/><author><name>Dave Van den Eynde</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10546079.post-9192001010709730074</id><published>2009-07-02T09:53:00.004+02:00</published><updated>2009-09-29T14:51:25.803+02:00</updated><title type='text'>About Hyper-V, VPN, the next few weeks</title><content type='html'>In the coming months, I'll be at home enjoying my "vacation" and using it to learn some cool technologies, and hopefully I'll find some time to write interesting things about the process. One of the first things on my tasklist is setting up a number of VM's on a server running Hyper-V. I need a development server that will run the latest build of my project as well as the source repository. Another server will run the "release" build that will, hopefully, one day be public.&lt;br /&gt;
I already have a server, a nice Dell PowerEDGE with 4 cores humming happily with 12GB of RAM and a raid system. Nothing too fancy. On it, I have the Windows Server 2008 installed with the Hyper-V role. &lt;br /&gt;
One of the first issues I had was setting up &lt;a href="http://technet.microsoft.com/en-us/magazine/2007.06.cableguy.aspx"&gt;SSTP&lt;/a&gt; correctly. I did this a couple of months ago, and it worked fine but now that I'm on Windows 7 I didn't quite remember all the hoops I had to jump through the first time around. Luckily there's the &lt;a href="http://support.microsoft.com/kb/947031"&gt;Interweb&lt;/a&gt;, and I found some info about what that issue might be. &lt;br /&gt;
The problem is of course that I'm a cheap bastard and that I'm using a self-signed certificate (aren't we all?) and that the client doesn't necessarily approve of this. I read &lt;a href="http://support.microsoft.com/kb/947031"&gt;this post&lt;/a&gt;, and &lt;a href="http://blogs.technet.com/rrasblog/archive/2007/11/08/do-you-want-to-change-the-certificate-used-by-the-sstp-server-read-how.aspx"&gt;this post &lt;/a&gt;as well. I figured out that it wasn't enough to import the server certificate into any old certificate store. No. It had to be the root store on the Computer account. And also, registering the certificate itself wasn't enough. It had to be the root certificate that issued the server certificate. So I had to open up the certificate, switch to the Certification Path tab, click on the topmost certificate, click "View Certificate", in there switch to the "Details" tab, and click Copy to File in order to export the signing certificate. Then, I had to import it into the Trusted Root Certification Authorities store of the Local Computer account. And then it worked. &lt;br /&gt;
Also note that for Windows 7 RC, there's an update called RTAS for Windows 7, that will enable you to install (yes, it won't install it, but the option will be there) the Hyper-V management console in Windows 7. After installing the update, use the "Turn Windows Features On or Off" in the Control Panel to install the Hyper-V maangement console. And use the excellent &lt;a href="http://code.msdn.microsoft.com/HVRemote"&gt;HVRemote&lt;/a&gt; to make it all work, of course.&lt;br /&gt;
&lt;br /&gt;
Update: now that Windows 7 has gone RTM, the link to RTAS for Windows 7 is no longer valid. &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=7d2f6ad7-656b-4313-a005-4e344e43997d&amp;amp;displaylang=en"&gt;Here's the real deal&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10546079-9192001010709730074?l=groovbird.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://groovbird.blogspot.com/feeds/9192001010709730074/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://groovbird.blogspot.com/2009/07/about-hyper-v-vpn-next-few-weeks.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10546079/posts/default/9192001010709730074'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10546079/posts/default/9192001010709730074'/><link rel='alternate' type='text/html' href='http://groovbird.blogspot.com/2009/07/about-hyper-v-vpn-next-few-weeks.html' title='About Hyper-V, VPN, the next few weeks'/><author><name>Dave Van den Eynde</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10546079.post-1169175728198070556</id><published>2009-06-14T20:53:00.002+02:00</published><updated>2009-06-14T20:55:41.372+02:00</updated><title type='text'>MCPD EAD Certified!</title><content type='html'>This week I passed 70-549, concluding my series of exams to earn the MCPD Enterprise Application Developer certification.

I would like to thank &lt;a href="http://blog.briandicroce.com/2008/10/22/the-road-towards-mcpd-ead-i-passed-exam-70-528-70-526-and-70-549-mission-accomplished/"&gt;Brian&lt;/a&gt; to point me to the Transcender preparation exams. They are really a lot harder than the exams themselves, and the answers try to teach you something at the same time.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10546079-1169175728198070556?l=groovbird.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://groovbird.blogspot.com/feeds/1169175728198070556/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://groovbird.blogspot.com/2009/06/mcpd-ead-certified.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10546079/posts/default/1169175728198070556'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10546079/posts/default/1169175728198070556'/><link rel='alternate' type='text/html' href='http://groovbird.blogspot.com/2009/06/mcpd-ead-certified.html' title='MCPD EAD Certified!'/><author><name>Dave Van den Eynde</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10546079.post-2826620727157861600</id><published>2009-04-11T02:12:00.002+02:00</published><updated>2009-09-19T13:59:10.030+02:00</updated><title type='text'>MCPD here we come!</title><content type='html'>Today I passed MCP exam 70-528, so I've earned the credential &amp;quot;MCTS .NET 2.0: Web Applications&amp;quot;. This is one step closer to MCPD. While preparing for the exam, I used Transcender's study guide and preparation tests, and it really made a difference. For the last exam, 70-536, I used the ones included with the exam guide, and then bought into MeasureUP's preparation tests, but they were very frustrating. So if you're busy getting ready for certification, you should really check out those Transcender's tests.    &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10546079-2826620727157861600?l=groovbird.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://groovbird.blogspot.com/feeds/2826620727157861600/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://groovbird.blogspot.com/2009/04/mcpd-here-we-come.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10546079/posts/default/2826620727157861600'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10546079/posts/default/2826620727157861600'/><link rel='alternate' type='text/html' href='http://groovbird.blogspot.com/2009/04/mcpd-here-we-come.html' title='MCPD here we come!'/><author><name>Dave Van den Eynde</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10546079.post-3683073165852849074</id><published>2009-04-09T09:35:00.002+02:00</published><updated>2009-09-19T13:58:54.711+02:00</updated><title type='text'>The Trashcan</title><content type='html'>&lt;p&gt;Some people, when starting a new project decide they need a &amp;quot;base library&amp;quot; of some sorts to put all the neat little tricks in that somehow were &amp;quot;left&amp;quot; out of the .NET Framework. They need some wrapper around some functions that do extra checking or they feel generic collections lack a couple of features or something like that. &lt;/p&gt;  &lt;p&gt;First of all, I don't have anything against that, since I also think a nice function here and there can make the body of a lot of code more readable, more elegant. The truth is however, that this little base library quickly becomes the defacto container for everything that was deemed &amp;quot;unworthy of finding a true place&amp;quot;. &lt;/p&gt;  &lt;p&gt;There's a place for everything, and some of that stuff has some place elsewhere, but somehow the developer couldn't be bothered (or couldn't figure out) where to really put it. Perhaps because there wasn't enough time to think about it, or perhaps because that developer was lazy, considering that it might be a good idea to do this at &amp;quot;refactoring time&amp;quot; (which probably equals to &amp;quot;will never happen&amp;quot;). &lt;/p&gt;  &lt;p&gt;So this little library turns into a &amp;quot;trashcan&amp;quot; of stuff that doesn't belong there, stuff that has nothing to do with the other stuff. Sometimes that stuff might be shared among two different projects in the solution. Two is usually enough to decide that this thing needs to be &amp;quot;reusable&amp;quot;. So after a while every single project in the solution has a reference to the trashcan, and every single project becomes really &amp;quot;dependent&amp;quot; on it. Without it, that project will not build. And then comes the time that someone wants to flex their &amp;quot;code reuse&amp;quot; muscles and decides that some part of the application is &amp;quot;reusable&amp;quot; within another app. But of course, the trashcan has to be shared as well, even though 90% of the trashcan is totally useless or even dangerous to that other application. &lt;/p&gt;  &lt;p&gt;So fear the trashcan, people.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10546079-3683073165852849074?l=groovbird.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://groovbird.blogspot.com/feeds/3683073165852849074/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://groovbird.blogspot.com/2009/04/trashcan.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10546079/posts/default/3683073165852849074'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10546079/posts/default/3683073165852849074'/><link rel='alternate' type='text/html' href='http://groovbird.blogspot.com/2009/04/trashcan.html' title='The Trashcan'/><author><name>Dave Van den Eynde</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10546079.post-624633350574401795</id><published>2009-02-11T15:25:00.003+01:00</published><updated>2009-09-19T13:57:27.139+02:00</updated><title type='text'>Podcast Overflow</title><content type='html'>&lt;p&gt;I like &lt;a href="http://www.joelonsoftware.com/"&gt;Joel Spolsky&lt;/a&gt;. He's an interesting guy, and he writes interesting stuff, and I've been reading him for years now. I'm subscribed to his mailing list, but it had gotten awful quiet for a long while now. I also like &lt;a href="http://www.asp.net/mvc/"&gt;ASP.NET MVC&lt;/a&gt;, and I really enjoyed watching Phil Haack's &lt;a href="http://channel9.msdn.com/pdc2008/PC21/"&gt;presentation&lt;/a&gt; on the subject. Jeff Atwood was in that presentation as well. I had been reading his blog for a couple months. It was nice to finally put a face to the blog. So then I found out that Joel and Jeff were in this &lt;a href="http://stackoverflow.com/"&gt;Stack Overflow&lt;/a&gt; thing together. Wow! And they have a podcast? I love podcasts! &lt;/p&gt;  &lt;p&gt;They make me a safer driver, particularly because I don't pay so much attention to all the idiots on the road anymore. The radio is just plain boring these days. So I decided to tune in to the podcast, and I loved it. But then I had to go and download all previous thirty something episodes of it and listen to them in the right order to catch up. Which is what I've been doing for the last two weeks. &lt;/p&gt;  &lt;p&gt;Now I'm at episode 34, and even though it's been fun to listen, I do get a bit&lt;span style="font-style: italic"&gt; &lt;span style="font-style: italic"&gt;saturated&lt;/span&gt;&lt;/span&gt;. It's as if everytime I'm reading something, it's Jeff Atwood's voice in my head &lt;span style="font-style: italic"&gt;narrating the text&lt;/span&gt; to me. So Jeff, if you're reading this, I think you should start narrating interesting stuff to read, because you have a really nice voice that goes well with technical stuff, so that I can listen to your audiobooks while in the car.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10546079-624633350574401795?l=groovbird.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://groovbird.blogspot.com/feeds/624633350574401795/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://groovbird.blogspot.com/2009/02/podcast-overflow.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10546079/posts/default/624633350574401795'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10546079/posts/default/624633350574401795'/><link rel='alternate' type='text/html' href='http://groovbird.blogspot.com/2009/02/podcast-overflow.html' title='Podcast Overflow'/><author><name>Dave Van den Eynde</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10546079.post-7767399480198123398</id><published>2009-02-05T20:49:00.002+01:00</published><updated>2009-09-19T13:56:12.289+02:00</updated><title type='text'>Resharper? No thanks...</title><content type='html'>&lt;p&gt;I was trying out Resharper this week. I saw it being used on some screencast and thought &amp;quot;wow, that sounds like something useful&amp;quot;, but after a week I gotta say, it just kept getting in my way. You have to understand my typing skills. &lt;/p&gt;  &lt;p&gt;I'm over-confident when I type. I can type blind easily, but I do tend to speed up too fast (partly because my brain is always ahead of my fingers) so I do make typing errors all the time. That does not work well with this tool. It's like in Visual Studio... when you accidentally tab twice but only meant like once (like when you want to indent something) and when you backspace it, you have to hit backspace &lt;span style="font-style: italic"&gt;four times&lt;/span&gt; because it's already converted into spaces. That sort of lame, but much worse. And it also tries to give you little programmer hints, like suggesting to make private members &lt;span style="font-style: italic"&gt;readonly&lt;/span&gt; just because it can't find any code that tries to modify it. &lt;/p&gt;  &lt;p&gt;Yes, I know, it's probably a good thing to do when you don't, but I'm currently trying to implement this feature and I get distracted easily already so I don't really want to spend time thinking about that &lt;span style="font-style: italic"&gt;right now&lt;/span&gt;. I'm sure you can set all these options left and right. But that's besides the point. It's a productivity tool, not something I want to spend half my time with just to train it. The blind person gets the &lt;span style="font-style: italic"&gt;trained&lt;/span&gt; guide dog and is not supposed to train it, y'know?&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10546079-7767399480198123398?l=groovbird.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://groovbird.blogspot.com/feeds/7767399480198123398/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://groovbird.blogspot.com/2009/02/resharper-no-thanks.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10546079/posts/default/7767399480198123398'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10546079/posts/default/7767399480198123398'/><link rel='alternate' type='text/html' href='http://groovbird.blogspot.com/2009/02/resharper-no-thanks.html' title='Resharper? No thanks...'/><author><name>Dave Van den Eynde</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10546079.post-5950430576834227708</id><published>2009-02-03T12:41:00.002+01:00</published><updated>2009-09-19T13:54:38.315+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Ninject or not?</title><content type='html'>&lt;p&gt;For my next project, I'm looking into using a Dependency Injection framework. For those of you who don't know what it is, I would like to forward you to &lt;a href="http://martinfowler.com/articles/injection.html"&gt;this article&lt;/a&gt; from Martin Fowler. The book I'm reading uses &lt;a href="http://www.castleproject.org/container/index.html"&gt;Castle Windsor&lt;/a&gt;, but it hasn't been updated in a while so I'm looking into others, like the &lt;a href="http://msdn.microsoft.com/en-us/library/cc468366.aspx"&gt;Unity&lt;/a&gt; application block. &lt;/p&gt;  &lt;p&gt;I came across &lt;a href="http://www.ninject.com"&gt;Ninject&lt;/a&gt; lately (thanks to &lt;a href="http://stackoverflow.com/questions/21288/which-c-net-dependency-injection-frameworks-are-worth-looking-into"&gt;StackOverflow&lt;/a&gt;) but it seems awkward to choose for a DI framework without the ability to configure it from outside the code.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10546079-5950430576834227708?l=groovbird.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://groovbird.blogspot.com/feeds/5950430576834227708/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://groovbird.blogspot.com/2009/02/ninject-or-not.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10546079/posts/default/5950430576834227708'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10546079/posts/default/5950430576834227708'/><link rel='alternate' type='text/html' href='http://groovbird.blogspot.com/2009/02/ninject-or-not.html' title='Ninject or not?'/><author><name>Dave Van den Eynde</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10546079.post-8892101809592799370</id><published>2009-02-02T12:19:00.005+01:00</published><updated>2009-09-19T13:49:49.084+02:00</updated><title type='text'>CruiseControl.NET</title><content type='html'>I'm currently taking a look at &lt;a href="http://confluence.public.thoughtworks.org/display/CCNET/Welcome+to+CruiseControl.NET"&gt;CruiseControl.NET&lt;/a&gt; to see how it would fit in my "learning curve" for my next pet project. It all feels a bit daunting, but I'm sure I can manage.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10546079-8892101809592799370?l=groovbird.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://groovbird.blogspot.com/feeds/8892101809592799370/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://groovbird.blogspot.com/2009/02/cruisecontrolnet.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10546079/posts/default/8892101809592799370'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10546079/posts/default/8892101809592799370'/><link rel='alternate' type='text/html' href='http://groovbird.blogspot.com/2009/02/cruisecontrolnet.html' title='CruiseControl.NET'/><author><name>Dave Van den Eynde</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10546079.post-5371830479199826920</id><published>2009-01-30T19:39:00.006+01:00</published><updated>2009-09-19T13:53:48.919+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>About this ASP.NET book...</title><content type='html'>&lt;p&gt;So in the previous post I wrote that I'm learning about ASP.NET MVC. Even though I'm a proud card-carrying member of the MCP club with my ASP.NET certification (version 1.1!), I haven't actually produced a lot of working .NET code over the last few years. That doesn't mean it didn't interest me; I just sort of fell behind while I'm doing this day-to-day C++ job right now. So I decided I want back in to the .NET game, and I started attending these nice sessions brought by VISUG.&lt;/p&gt;  &lt;p&gt; The first one that I attended was about ASP.NET by &lt;a href="http://blog.maartenballiauw.be/"&gt;Maarten Balliauw&lt;/a&gt;, and I was definitely interested to learn more about it. I did walk out of that session with a feeling that I didn't like, the feeling that I've been out of it for too long and that I was a kind of &lt;span style="font-style: italic"&gt;noob&lt;/span&gt; at this stuff, but since then I've been doing a lot of reading and searching and trying things out and I've shed this feeling a bit, but I wanted more. &lt;/p&gt;  &lt;p&gt;So I set out to fulfill one of the pet projects I've had stuck in my head for a few years and I bought a copy of &lt;a href="http://apress.com/book/view/1430210079"&gt;this book&lt;/a&gt; to help me out. This is a nice book, but the thing about it is that it's not even out yet. Right now you can buy and download a bunch of chapters that were written for an older version of ASP.NET MVC (which in itself hasn't been released yet either, but that's going to happen any day now) so you end up following the examples and finding out that some of this stuff has &lt;span style="font-style: italic"&gt;changed&lt;/span&gt;.&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://mybebook.com/images/BeBookProductpaginaCrop3.jpg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; width: 170px; float: right; height: 293px; cursor: pointer" border="0" alt="" src="http://mybebook.com/images/BeBookProductpaginaCrop3.jpg" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Now this is not necessarily a bad thing, because it forced me dig a little deeper to find out what's changed and why and how you're supposed to do it now. I still have long way to go, but knowing that I can augment the lack of documentation by browsing the source code actually gives me a little bit more courage to keep going at it. I don't like how they lock this &lt;span style="font-style: italic"&gt;electronic&lt;/span&gt; version of the book down, though. When you pay up you'll have the opportunity to download the chapters like, &lt;span style="font-style: italic"&gt;individually&lt;/span&gt;, and they're all password protected. That kind of sucks. Especially since I want to read them on my&lt;span style="font-style: italic"&gt;&lt;span style="font-weight: bold"&gt;&lt;span style="font-weight: bold"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;a href="http://mybebook.com/"&gt;&lt;span style="font-weight: bold"&gt;&lt;span style="font-weight: bold"&gt;Bebook&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style="font-style: italic"&gt;&lt;span style="font-weight: bold"&gt;&lt;span style="font-weight: bold"&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;span style="font-weight: bold"&gt;&lt;span style="font-weight: bold"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: bold"&gt;&lt;span style="font-style: italic"&gt;&lt;span style="font-weight: bold"&gt;&lt;span style="font-weight: bold"&gt;&lt;span style="font-weight: bold"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;It's a nice device, but it needs to mature, and electronic books need to mature, and prices need to go down. And they will, I'm certain of that.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10546079-5371830479199826920?l=groovbird.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://groovbird.blogspot.com/feeds/5371830479199826920/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://groovbird.blogspot.com/2009/01/about-this-aspnet-book.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10546079/posts/default/5371830479199826920'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10546079/posts/default/5371830479199826920'/><link rel='alternate' type='text/html' href='http://groovbird.blogspot.com/2009/01/about-this-aspnet-book.html' title='About this ASP.NET book...'/><author><name>Dave Van den Eynde</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10546079.post-5584366463646519570</id><published>2009-01-30T12:03:00.005+01:00</published><updated>2009-09-19T13:49:01.604+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rant'/><title type='text'>YAFB</title><content type='html'>I've decided to restart this blog. I've deleted all the old posts, because they'll be irrelevant for what I'll be using this blog for.&lt;br /&gt;
&lt;br /&gt;
I'm not making any assumptions about who reads this blog. If you're reading this, and you're not me, then welcome. But I don't think I'll have that many readers, for the time being.&lt;br /&gt;
&lt;br /&gt;
What do I want to blog about? Technical stuff, mostly. I'm learning ASP.NET MVC, working out a few pet projects that have been stuck in my head for a couple of years now, trying to pick up where I left off when all of a sudden I got into photography and making music and electronics and stuff like that. I tend to lose interesting fast so I keep switching and spending money on those kinds of things. You can't spend time on all of those things at once.&lt;br /&gt;
&lt;br /&gt;
I'm on facebook nowadays. It's actually quite neat. It allows you to stay in touch with everyone you know even though you know you're not nearly making enough time for those people.&lt;br /&gt;
&lt;br /&gt;
Hopefully I'll be writing more often. Why would I be writing when no one will be reading this? First of all, It's always possible that somebody stumbles upon this blog. So effectively people will be reading this. But I'll be writing more about ideas that I may have, or about stuff that I find cool and links that I found. Putting all of that in a blog will allow me to keep track of it all as well, as those things are archived and searchable.&lt;br /&gt;
&lt;br /&gt;
I'll be taking the moral high road up front and say that I will welcome any comments you may have, so I'll be enabling comments on this blog. But I do take things personally so please be objective about it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10546079-5584366463646519570?l=groovbird.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://groovbird.blogspot.com/feeds/5584366463646519570/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://groovbird.blogspot.com/2009/01/yafb.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10546079/posts/default/5584366463646519570'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10546079/posts/default/5584366463646519570'/><link rel='alternate' type='text/html' href='http://groovbird.blogspot.com/2009/01/yafb.html' title='YAFB'/><author><name>Dave Van den Eynde</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
