|
AspAlliance Author Profile
|
My Blog
|
| tag:blogger.com,1999:blog-219673812009-11-19T00:00:27.064ZBen Hall's BlogI don't know darling....i'm doing my workBen Hallhttp://www.blogger.com/profile/17734933641904484310Blog@BenHall.me.ukBlogger476125Subscribe with My Yahoo!Subscribe with NewsGatorSubscribe with My AOLSubscribe with BloglinesSubscribe with NetvibesSubscribe with GoogleSubscribe with Pageflakestag:blogger.com,1999:blog-21967381.post-24691126747795588722009-11-19T00:00:00.001Z2009-11-19T00:00:27.162ZI've written a book on Testing ASP.net Web Applications<p>If you have been following me on <a href="http://twitter.com/ben_hall" rel="nofollow">twitter</a> then this will be old news however I realised I never announced it on my blog. </p>
<p>Well, here is it! I have written a book on Testing ASP.net Web Applications! The website for which can be found at <a href="http://www.testingaspnet.com/">http://www.testingaspnet.com/</a></p>
<p><img src="http://www.testingaspnet.com/cover.png" alt="Testing ASP.net Web Applications cover" /></p>
<p>I agreed to co-author the book with <a href="http://www.mcwherter.net/blog/" rel="nofollow">Jeff McWherter</a> at PDC08 almost a year ago. Now, after a long hard year of constant work on both of our parts, I'm pleased to say that <strong>the book is now available on both <a href="http://www.testingaspnet.com/book">Amazon.com</a> and <a href="http://www.testingaspnet.com/bookuk">Amazon.co.uk</a>.</strong></p>
<p>The book provides the reader with an introduction into the main issues faced when testing ASP.net web applications, both WebForms and MVC. We wanted to provide a guide covering the various different issues you will face during the development and testing lifecycle.</p>
<p>The chapters are:<br/>
Chapter 1: Preliminary Concerns<br/>
Chapter 2: Design and Testability<br/>
Chapter 3: Unit Testing and Test Driven Development<br/>
Chapter 4: Integration Testing <br/>
Chapter 5: Automated UI Testing <br/>
Chapter 6: Acceptance Testing <br/>
Chapter 7: Manual Testing <br/>
Chapter 8: Performance Testing <br/>
Chapter 9: Accessibility Testing <br/>
Chapter 10: Security Testing <br/></p>
<p>As proof that the book does actually exist, the amazing <a href="http://visuallounge.techsmith.com/">Betsy Weber</a> spotted the book on the Wiley stand at PDC09.</p>
<p><a href="http://twitter.com/betsyweber/status/5805581354" rel="nofollow"><img src="http://www.testingaspnet.com/wild/PDC_Wiley_Stand.jpg" alt="Testing ASP.net Web Applications @ PDC09" /></a></p>
<p>If you happen to spot the book anywhere, or if you have read a copy and have feedback then please do let us know! We would love to hear from you!</p>
<p>Since completing the book, I've taken a break, joined <a href="http://www.7digital.com" rel="nofollow">7Digital.com</a> and started working on a number of other projects. Exciting times!</p>
<div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21967381-2469112674779558872?l=blog.benhall.me.uk' alt='' /></div><img src="http://feeds.feedburner.com/~r/BenHall/~4/MwduSeXxq1U" height="1" width="1"/>Ben Hallhttp://www.blogger.com/profile/17734933641904484310Blog@BenHall.me.uk0http://blog.benhall.me.uk/2009/11/i-written-book-on-testing-aspnet-web.htmltag:blogger.com,1999:blog-21967381.post-89212663332725525682009-11-18T00:01:00.001Z2009-11-18T00:07:48.410ZWelcome to GitHub - Your first git repository<p>I've been using GitHub for a while now as it's a great way to share ideas and code in the public domain. Recently, I've had a number of people ask me how they can get started using GitHub. Thankfully, GitHub is an extremely simple service to use!! </p>
<p>Firstly, GitHub is a social coding repository, building on top of git (a source control system) to encourage collaboration on code and open source projects. By having this aim, the site is organised in such a way to make it very simple to upload code, as well as add additional contributors to the project. GitHub also has paid for accounts offering private repositories and additional features. </p>
<p>First, to use GitHub you need a git client installed. If you are on OSX, I recommend using the <a href="http://code.google.com/p/git-osx-installer/downloads/list">git-osx-installer</a> while if you are on windows I suggest the <a href="http://code.google.com/p/msysgit/downloads/list">MSysGit project</a>. From my experience, I've found these to be the most effective way to start using git. </p>
<p>After signing up for a <a href="https://github.com/signup/free">free account</a> on GitHub, you need to create a <a href="http://github.com/guides/providing-your-ssh-key">public key</a>. The next stage is to create a public repository to store code. </p>
<p>All you need to do is enter a name for a new repository, a description and click Create. Each project has it's own repository, unlike with other source control systems such as SVN. <br/></p>
<p><img src="http://lh5.ggpht.com/_exs7ZT6h_9Q/Sn7fNzwLoPI/AAAAAAAAAKo/JFnDA95UdKc/GitHub_Create.png?imgmax=800" alt="GitHub_Create.png" border="0" width="450" height="270" /><br/></p>
<p>After clicking create, you have your repository. GitHub provides you with the next steps about how you can add code in your public repository. A great way to learn the fundamentals of git at the same time. <br/></p>
<p><img src="http://lh5.ggpht.com/_exs7ZT6h_9Q/Sn7f-EDib6I/AAAAAAAAAKs/zAzuI8V7y44/GitHub_ReproCreated.png?imgmax=800" alt="GitHub_ReproCreated.png" border="0" width="450" height="200" /><br/></p>
<p>The first command you will need is 'git init', this creates your local repository to store your project. Once you have a local repository, you can do all the standard commands you would expect such as git add, git commit, branch etc. </p>
<p>After you push your code to github, everyone will be able to view, clone, fork your repository. A great way to allow others to collaborate on your project. In my case, the repository I created was <a href="http://github.com/BenHall/SimplyRubyServer/">http://github.com/BenHall/SimplyRubyServer/</a>.</p>
<p>As you start using GitHub and Git more and more, you will really understand how powerful they are. </p>
<div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21967381-8921266333272552568?l=blog.benhall.me.uk' alt='' /></div><img src="http://feeds.feedburner.com/~r/BenHall/~4/O7eZ4kjvEns" height="1" width="1"/>Ben Hallhttp://www.blogger.com/profile/17734933641904484310Blog@BenHall.me.uk0http://blog.benhall.me.uk/2009/11/welcome-to-github-your-first-git.htmltag:blogger.com,1999:blog-21967381.post-17761568955865158692009-10-22T20:50:00.001Z2009-10-22T20:50:34.110ZGiven.org at #launch48<p><a href="http://www.given.org" target="_blank"><img style="border-bottom: 0px; border-left: 0px; display: inline; margin-left: 0px; border-top: 0px; margin-right: 0px; border-right: 0px" title="3-given_logo" border="0" alt="3-given_logo" align="right" src="http://lh3.ggpht.com/_exs7ZT6h_9Q/SuDFjP0KwmI/AAAAAAAAAK8/3f32450nvZg/3-given_logo%5B5%5D.png?imgmax=800" width="240" height="115"></a> </p> <p>This weekend I attended an awesome event called <a href="http://www.launch48.com/" target="_blank">Launch48</a> at the PayPal\eBay offices in Richmond (London). The concept is simple, anyone is allowed to pitch an idea in 1 minute on the Friday evening, this event had around 30 pitches. After this, people vote on which ideas they like. Next the top 12 teams give a 2 minute pitch and Q&A. After a second vote, the 6 top teams start work. Everyone who attended selects a team to help with the aim of having a demoable product and business by 4pm on Sunday. Our team created Given.org, video explaining the idea can be found below. </p> <p>GIVEN helps companies find and support people’s causes on Facebook. </p> <p><object width="400" height="220"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=7126886&server=vimeo.com&show_title=1&show_byline=1&show_portrait=0&color=&fullscreen=1" /><embed src="http://vimeo.com/moogaloop.swf?clip_id=7126886&server=vimeo.com&show_title=1&show_byline=1&show_portrait=0&color=&fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="400" height="220"></embed></object></p> <p><a href="http://vimeo.com/7126886">30 Seconds about Given.org</a> from <a href="http://vimeo.com/user2477667">Given dot Org</a> on <a href="http://vimeo.com">Vimeo</a>.</p> <p>It gives companies the ability to publicly sponsor fundraising initiatives – whether they are being led by employees, fans or customers. This offers companies a new way to engage with people on Facebook and support worthwhile causes.<br><br>For fundraisers GIVEN offers a whole new world of potential sponsors beyond their existing network of family and friends. GIVEN helps people raise money from over 20,000 companies that currently have a presence on Facebook. Luckily, the team had some amazing designers from <a href="http://www.evisua.com" target="_blank">Evisua.com</a> who created the website below:</p> <p></p> <p><a href="http://lh4.ggpht.com/_exs7ZT6h_9Q/SuDFkNp7ycI/AAAAAAAAALA/zq9Y0Ck9uzA/s1600-h/image%5B5%5D.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://lh3.ggpht.com/_exs7ZT6h_9Q/SuDFk4PjOmI/AAAAAAAAALI/HjG2j31hHss/image_thumb%5B3%5D.png?imgmax=800" width="640" height="402"></a> </p> <p>While the designers did their thing, the developers, which I was one of, worked on the facebook application. Creating facebook applications has a small learning curve, but actually pretty straight forward to create once you get started. Our application looked like this after the end of the weekend: </p> <p><a href="http://lh6.ggpht.com/_exs7ZT6h_9Q/SuDFlvV3FrI/AAAAAAAAALM/5LQ2qabtOFw/s1600-h/image%5B10%5D.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://lh4.ggpht.com/_exs7ZT6h_9Q/SuDFmWYmNuI/AAAAAAAAALQ/Ipkn5a657xY/image_thumb%5B6%5D.png?imgmax=800" width="640" height="389"></a> </p> <p>Hopefully you will be hearing more about this in the future, but wanted to give people a heads up into what is happening in and around London. If you want to know about the other five teams, check out the <a href="http://eu.techcrunch.com/2009/10/18/launch48-startups-present-their-ideas-after-a-frantic-48-hours/" target="_blank">TechCrunch article</a>. </p> <div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21967381-1776156895586515869?l=blog.benhall.me.uk' alt='' /></div><img src="http://feeds.feedburner.com/~r/BenHall/~4/MiiANxVAybw" height="1" width="1"/>Ben Hallhttp://www.blogger.com/profile/17734933641904484310Blog@BenHall.me.uk0http://blog.benhall.me.uk/2009/10/givenorg-at-launch48.htmltag:blogger.com,1999:blog-21967381.post-4947272666747956812009-10-19T22:07:00.001Z2009-10-19T22:07:19.944ZMEF – NxtGenUG Coventry<p>Tonight I gave another run out of my MEF session at NxtGenUG Coventry. Thank you to everyone who attended, I had a great time. Below are my slides and code samples. Any questions, just let me <a href="http://twitter.com/ben_hall" target="_blank">know</a>.</p> <div style="text-align: left; width: 425px" id="__ss_2283942"><a style="margin: 12px 0px 3px; display: block; font: 14px helvetica,arial,sans-serif; text-decoration: underline" title="Mef - NxtGenUG Coventry" href="http://www.slideshare.net/BenHalluk/mef-nxtgenug-coventry">Mef - NxtGenUG Coventry</a><object style="margin:0px" width="425" height="355"><param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=mef-091019163348-phpapp01&stripped_title=mef-nxtgenug-coventry" /><param name="allowFullScreen" value="true" /><param name="allowScriptAccess" value="always" /><embed src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=mef-091019163348-phpapp01&stripped_title=mef-nxtgenug-coventry" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"></embed></object> <div style="font-family: tahoma,arial; height: 26px; font-size: 11px; padding-top: 2px">View more <a style="text-decoration: underline" href="http://www.slideshare.net/">presentations</a> from <a style="text-decoration: underline" href="http://www.slideshare.net/BenHalluk">BenHalluk</a>.</div></div> <p><strong>Download code: </strong><a href="http://blog.benhall.me.uk/downloads/NxtGenUG/CambridgeMEF/Code.zip" target="_blank"><strong>Code.zip</strong></a></p> <div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21967381-494727266674795681?l=blog.benhall.me.uk' alt='' /></div><img src="http://feeds.feedburner.com/~r/BenHall/~4/42f4VeyR9tk" height="1" width="1"/>Ben Hallhttp://www.blogger.com/profile/17734933641904484310Blog@BenHall.me.uk0http://blog.benhall.me.uk/2009/10/mef-nxtgenug-coventry.htmltag:blogger.com,1999:blog-21967381.post-36909606817874454272009-09-29T21:45:00.001Z2009-09-29T21:45:39.335Zno such file to load -- mkmf<p>Today I was attempting to install a package on my ubuntu machine and I received the following error:</p><pre>extconf.rb:1in 'require': no such file to load -- mkmf (LoadError)</pre>
<p>To solve the problem, I simply installed the ruby1.8-dev package, this was done by the command:</p><pre>sudo apt-get install ruby1.8-dev</pre>
<p>I could then happily install the package I wanted.</p> <div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21967381-3690960681787445427?l=blog.benhall.me.uk' alt='' /></div><img src="http://feeds.feedburner.com/~r/BenHall/~4/9bz2txIBlh8" height="1" width="1"/>Ben Hallhttp://www.blogger.com/profile/17734933641904484310Blog@BenHall.me.uk0http://blog.benhall.me.uk/2009/09/no-such-file-to-load-mkmf.htmltag:blogger.com,1999:blog-21967381.post-78523482546007187302009-09-29T00:17:00.001Z2009-09-29T00:18:56.539ZMaking my blog suck less - Syntax Highlighting<p>Following on in the series of how I have improved my blog, its time to address the issue of syntax highlighting. I admit, this is something which I think has really let me down and something which is long overdue. </p>
<p>There are a number of difference approaches available to solve this problem, however the best approach I came across is from <a href="http://alexgorbatchev.com/wiki/SyntaxHighlighter" rel="nofollow">http://alexgorbatchev.com/wiki/SyntaxHighlighter</a>. This is a javascript+css library which can be installed on your blog, which thankfully is a very simply task. The CSS you need to reference are the following:</p>
<pre class="brush: css;">
<link type="text/css" rel="stylesheet" href="syntaxhighlight/styles/shCore.css"/>
<link type="text/css" rel="stylesheet" href="syntaxhighlight/styles/shThemeDefault.css"/>
</pre>
<p>The javascript I have referenced in shown below.</p>
<pre class="brush: js;">
<script type="text/javascript" src="syntaxhighlight/scripts/shCore.js"></script>
<script type="text/javascript" src="syntaxhighlight/scripts/shBrushBash.js"></script>
<script type="text/javascript" src="syntaxhighlight/scripts/shBrushCSharp.js"></script>
<script type="text/javascript" src="syntaxhighlight/scripts/shBrushCss.js"></script>
<script type="text/javascript" src="syntaxhighlight/scripts/shBrushDiff.js"></script>
<script type="text/javascript" src="syntaxhighlight/scripts/shBrushJava.js"></script>
<script type="text/javascript" src="syntaxhighlight/scripts/shBrushJScript.js"></script>
<script type="text/javascript" src="syntaxhighlight/scripts/shBrushPlain.js"></script>
<script type="text/javascript" src="syntaxhighlight/scripts/shBrushPython.js"></script>
<script type="text/javascript" src="syntaxhighlight/scripts/shBrushRuby.js"></script>
<script type="text/javascript" src="syntaxhighlight/scripts/shBrushScala.js"></script>
<script type="text/javascript" src="syntaxhighlight/scripts/shBrushSql.js"></script>
<script type="text/javascript" src="syntaxhighlight/scripts/shBrushXml.js"></script>
<script type="text/javascript">
SyntaxHighlighter.config.clipboardSwf = 'scripts/clipboard.swf';
SyntaxHighlighter.all();
</script>
</pre>
<p>In my posts, I can then simply wrap the snippet in a pre block and assign the appropriate brush class to highlight the syntax.</p>
<p><pre class="brush: c-sharp;">
public string test()
{
return "abc";
}
</pre></p>
<p>The following are a list of brushes for the different languages I have referenced.</p>
<p>C# - c-sharp<br/>
CSS - css<br/>
JavaScript - js<br/>
Java - java<br/>
Ruby - ruby<br/>
Python - python<br/>
Scala - scala<br/>
SQL - sql<br/>
Xml - xml</p>
<p>For those who are using Windows Live Writer, there is a plugin to make syntax highlighting even easier! This is available to download from <a href="http://www.codeplex.com/precode" rel="nofollow">http://www.codeplex.com/precode</a></p>
<p>Hopefully this should make code much easier to read in the future. Another approach I was tempted by is using GitHub Gists. Gists are snippets of code hosted on github which you can then embed into your posts, as shown below. </p>
<script src="http://gist.github.com/195464.js"></script>
<p>The reason I didn't go down this route is that it makes it difficult to insert code when writing a blog 'offline' and when GitHub is down. As a result, I decided to stick with the classic approach for now. But what do you think?</p><div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21967381-7852348254600718730?l=blog.benhall.me.uk' alt='' /></div><img src="http://feeds.feedburner.com/~r/BenHall/~4/1OAZKMV1Rr8" height="1" width="1"/>Ben Hallhttp://www.blogger.com/profile/17734933641904484310Blog@BenHall.me.uk0http://blog.benhall.me.uk/2009/09/making-my-blog-suck-less-syntax.htmltag:blogger.com,1999:blog-21967381.post-2090024204439493722009-09-28T23:51:00.001Z2009-09-29T00:04:26.269ZMaking my blog suck less - Retweet (via @Tweetmeme)For those of your who haven't come across <a href="http://tweetmeme.com/">Tweetmeme</a> before, they are a Reading (UK) based startup aggregating all the links which are retweeted on twitter. Many say it is 'digg for twitter'.
While my blog posts generally don't get retweeted, I wanted to include a retweet button as an experiment to see if it will have any difference on the traffic, tweets of blog posts or my followers count.
To add the tweetmeme button onto my posts, I simply include the following javascript. Note, I've made some adjustments, firstly I have gone for the compact style, I have also manually set the url which the button relates to which is set by the blogger platform and finally set the retweet to come from me.
<pre class="brush: js;">
< script type="text/javascript" >
tweetmeme_style = 'compact';
tweetmeme_url = '<$BlogItemPermalinkUrl$>';
tweetmeme_source = 'ben_hall';
</script>
< script type="text/javascript" src="http://tweetmeme.com/i/scripts/button.js" >< /script >
</pre><div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21967381-209002420443949372?l=blog.benhall.me.uk' alt='' /></div><img src="http://feeds.feedburner.com/~r/BenHall/~4/W_5HPQov4S8" height="1" width="1"/>Ben Hallhttp://www.blogger.com/profile/17734933641904484310Blog@BenHall.me.uk0http://blog.benhall.me.uk/2009/09/making-my-blog-suck-less-retweet-via.htmltag:blogger.com,1999:blog-21967381.post-33207274063212867692009-09-28T22:37:00.001Z2009-09-28T22:39:49.879ZMaking my blog suck less<p>While I've been blogging for a number of years, my theme and layout has never really had my full attention. This has resulted in a number of issues, poor experience and finding older content more difficult than it needed to be. As such, I've decided to give the site a face-lift. A lot of this has been inspired by <a href="http://www.hanselman.com/blog/">Scott Hanselman</a> and the tips he has given to improve his blog.</p>
<p>This post covers the initial changes I have made, why I've made them and some tips you could apply to your own site if you wished. </p>
<p><strong>1) Added a notice bar</strong></p>
<p>At the top of every page I have added a notice bar with links to various internal and external pages which I would like my readers to pay attention to and visit. These include various social sites such as GitHub and Twitter with the hope that by having them in the notice bar people will be able to more easily identify them. Of course, there still needs to be excellent content on those sites, but making it easier for readers to access should be a high priority.</p>
<p><strong>2) Making my favourite personal posts easier to find</strong></p>
<p>There are a number of posts which I'm proud of which new visitors might be interested in and as such I wanted to make it easier for people to find. The aim is to reduce the bounce rate of visits from search engines, but also ensure that this content can be accessible to anyone who might be interested in what I have written previously.</p>
<p><strong>3) Clean HTML</strong></p>
<p>One of my personal bug bears at the moment is having clean(ish) HTML and CSS. I used to let this slide, but over time I've come to realise just how important it is. Not only does it improve compatibility across different browsers, but it also improves the load-time as the HTML is more streamlined as well as allowing for a more consistent look across the blog. The added advantage being that the html is now in a maintainable state meaning I'm not scared of updating the template like before. The problem with this is that things might not look 100% correct - if you notice any problems with formatting, then please let me know.</p>
If you visit my homepage, you hopefully will notice a number of other changes some of which I'll cover in later posts. I'm hoping you will find some benefit in my new changes. If you think there is anything else I need to change, then please let me know. <div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21967381-3320727406321286769?l=blog.benhall.me.uk' alt='' /></div><img src="http://feeds.feedburner.com/~r/BenHall/~4/IIKDw50BxD0" height="1" width="1"/>Ben Hallhttp://www.blogger.com/profile/17734933641904484310Blog@BenHall.me.uk0http://blog.benhall.me.uk/2009/09/making-my-blog-suck-less.htmltag:blogger.com,1999:blog-21967381.post-9898316521656866532009-09-22T22:01:00.001Z2009-09-22T22:01:59.791ZMono XSP == OSX ASP.net Web ServerOver the weekend I required a very simple web server on my MacBook to allow me to play around with some iPhone Web App development. It didn't need to do much, simply accept requests and serve webpages. While I've created web servers before, after sending a tweet out I was reminded about <a href="http://www.mono-project.com/ASP.NET">Mono XSP</a>. XSP is an ASP.net web server developed under the Mono project banner allowing you to serve web pages and asserts (javascript, css, images etc) to clients. Simply - it's great!
After installing Mono, to launch a server simply navigate to the directory where your pages resides using a Terminal (command prompt), and type in XSP. This will start a full webserver on port 8080 serving pages from the directory. Now, within seconds, I can quickly make any directory on my laptop accessible over HTTP!
On OSX, the execution simply looks like this:
Pretty:Base Ben$ <strong>xsp</strong><br/>
<em>xsp2<br/>
Listening on address: 0.0.0.0<br/>
Root directory: /Users/Ben/SourceControl/iPhoneWebApp101/iWebKit/Base<br/>
Listening on port: 8080 (non-secure)<br/>
Hit Return to stop the server.</em><br/>
Great for prototyping and rapid development and while I haven't tried it, it should work on Windows equally as well. <div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21967381-989831652165686653?l=blog.benhall.me.uk' alt='' /></div><img src="http://feeds.feedburner.com/~r/BenHall/~4/L-pH4eW5G6w" height="1" width="1"/>Ben Hallhttp://www.blogger.com/profile/17734933641904484310Blog@BenHall.me.uk0http://blog.benhall.me.uk/2009/09/mono-xsp-osx-aspnet-web-server.htmltag:blogger.com,1999:blog-21967381.post-40127602646083710822009-08-29T21:18:00.002Z2009-09-28T20:54:13.832ZInternet is fast moving - introducing BenHall.Tumblr.com<p>In my previous post I spoke about <a href="http://blog.benhall.me.uk/2009/08/getting-personal-with-posterous.html" target="_blank">Getting personal with Posterous</a>. Well, after signing up I gave <a href="http://benhall.tumblr.com/" target="_blank">Tumblr</a> a go, and I have to say I was impressed! </p> <p>
<a href="http://www.screencast.com/users/BenHalluk/folders/Jing/media/078f2206-614d-4290-bd76-4142e16ebc1f"><img src="http://content.screencast.com/users/BenHalluk/folders/Jing/media/078f2206-614d-4290-bd76-4142e16ebc1f/00000015.png" height="219" width="380" style="margin: 0 10px 10px 0; border: 0px" /></a>
<br />
</p> <p> As such, I would like to introduce <a href="http://benhall.tumblr.com/" target="_blank">http://benhall.tumblr.com/</a>. Two great services! However, I think Tumblr has the edge for allowing you to easily write different style of blog posts - such as text, images or videos. Overall, it also has a nicer feel and experience. </p><div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21967381-4012760264608371082?l=blog.benhall.me.uk' alt='' /></div><img src="http://feeds.feedburner.com/~r/BenHall/~4/tlUrBdDhhHY" height="1" width="1"/>Ben Hallhttp://www.blogger.com/profile/17734933641904484310Blog@BenHall.me.uk0http://blog.benhall.me.uk/2009/08/internet-is-fast-moving-introducing.htmltag:blogger.com,1999:blog-21967381.post-45576560309996917162009-08-29T20:47:00.002Z2009-09-28T19:46:36.914ZGetting personal with PosterousWhile <a href="http://twitter.com/ben_hall" rel="nofollow" target="_blank">Twitter</a> is great for sharing ideas, I'm getting a little frustrated at the 140 character limit. Sometimes it is great, other times you need a few more characters. I also want to keep this blog more 'professional' and technical related. As such, I'm going to use a service called <a href="http://www.posterous.com/" rel="nofollow" target="_blank">Posterous</a> to post some random thoughts and comments of a more personal nature about my life. Some of you might be interested, however I'm guessing most of you won't be :)
One of the great things about Posterous is how easy it is to get started as you simply send an email to post@posterous.com. This then creates a blog for you:
<p><a href="http://www.screencast.com/users/BenHalluk/folders/Jing/media/42a2c8f1-15b8-4e13-8fa4-e66387680ae4"><img src="http://content.screencast.com/users/BenHalluk/folders/Jing/media/42a2c8f1-15b8-4e13-8fa4-e66387680ae4/00000012.png" style="border: 0px none ; margin: 0pt 10px 10px 0pt;" height="219" width="380" /> </a> </p> However, in order to get a real URL you need to claim your post by clicking the link.
<p><a href="http://www.screencast.com/users/BenHalluk/folders/Jing/media/6c38c51d-882f-433e-8ec1-158d61318586"><img src="http://content.screencast.com/users/BenHalluk/folders/Jing/media/6c38c51d-882f-433e-8ec1-158d61318586/00000013.png" style="border: 0px none ; margin: 0pt 10px 10px 0pt;" height="219" width="380" /> </a> </p> Done! The blog has been created. The domain name is <a href="http://benhall.posterous.com/" target="_blank">http://benhall.posterous.com/</a> - Feel free to follow what I'm saying. <p><a href="http://www.screencast.com/users/BenHalluk/folders/Jing/media/6e022c43-dc83-4257-b107-a047b462762f"><img src="http://content.screencast.com/users/BenHalluk/folders/Jing/media/6e022c43-dc83-4257-b107-a047b462762f/00000014.png" style="border: 0px none ; margin: 0pt 10px 10px 0pt;" height="219" width="380" /> </a> </p> If you want to start blogging, sharing ideas - either personal, or technical then posterous is a very quick way to get started.<div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21967381-4557656030999691716?l=blog.benhall.me.uk' alt='' /></div><img src="http://feeds.feedburner.com/~r/BenHall/~4/x3PHJRTDGz0" height="1" width="1"/>Ben Hallhttp://www.blogger.com/profile/17734933641904484310Blog@BenHall.me.uk0http://blog.benhall.me.uk/2009/08/getting-personal-with-posterous.htmltag:blogger.com,1999:blog-21967381.post-84198110752079103472009-08-13T20:46:00.001Z2009-08-13T20:46:39.065ZxUnit Browser Attribute – Run Cross-Browser WatiN tests effortlessly<p>Recently I wanted to run a web UI test across multiple different browsers using WatiN. WatiN supports FireFox, IE and Chrome so that wasn’t a problem, however in order to test the application on difference browsers I would have to duplicate the logic multiple times. This harms readability and maintainability of your tests and is just pain wrong. As such, I created a very similar xUnit Browser Attribute, code can be found on my <a href="http://github.com/BenHall/xUnitBrowserAttribute/tree/master" rel="nofollow" target="_blank">GitHub repository</a> along with the <a href="http://github.com/BenHall/xUnitBrowserAttribute/downloads" rel="nofollow" target="_blank">binaries</a>.</p> <p>The concept is simple, have the instance of the browser created for you outside of your test and provided the instance as a argument during execution. By using attributes, you can define multiple different browsers, each one will generate a separate test. The advantage of having the tests in this fashion means that if a test one particular browser fails then you can quickly see the problem and the results form the other browsers. If they where just a single test, if one part of test failed, you wouldn’t be able to see the results for the other part. This can make identify where the problems lies much more difficult. An example of the attribute and a test is below. </p><pre class="brush: csharp;">public class Example
{
[Theory]
[Browser("IE")]
[Browser("FireFox")]
[Browser("Chrome")]
public void Should_Click_Search_On_Google_And_Return_Results_For_AspNet(Browser browser)
{
browser.GoTo("http://www.google.co.uk");
browser.TextField(Find.ByName("q")).Value = "asp.net";
browser.Button(Find.ByName("btnG")).Click();
Assert.True(browser.ContainsText("The Official Microsoft ASP.NET Site"));
}
}
</pre>
<p>This example is made possible by taking advantage of the <a href="http://blog.benhall.me.uk/2008/01/creating-your-own-xunit-extension.html" target="_blank">xUnit Extensibility</a> model and being able to create <a href="http://blog.benhall.me.uk/2006/08/creating-objects-dynamically-with-c-20.html" target="_blank">objects dynamically in C#</a>. The attribute code is below, as WatiN has a clean namespace structure creating an object based off the string of the name is easy. </p><pre class="brush: csharp;">public class BrowserAttribute : DataAttribute
{
public string Browser { get; set; }
public BrowserAttribute(string browser)
{
Browser = browser;
}
public override IEnumerable<object[]> GetData(MethodInfo methodUnderTest, Type[] parameterTypes)
{
Type type = Assembly.GetAssembly(typeof(Browser)).GetType("WatiN.Core." + Browser);
return new[] { new[] {Activator.CreateInstance(type) }};
}
}
</pre>
<p>With this attribute, you can now quickly and easily define the browsers you want the test to run against, without having to duplicate the test itself. </p> <div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21967381-8419811075207910347?l=blog.benhall.me.uk' alt='' /></div><img src="http://feeds.feedburner.com/~r/BenHall/~4/GtEqn3wAiuI" height="1" width="1"/>Ben Hallhttp://www.blogger.com/profile/17734933641904484310Blog@BenHall.me.uk2http://blog.benhall.me.uk/2009/08/xunit-browser-attribute-run-cross.htmltag:blogger.com,1999:blog-21967381.post-26932589599478614142009-08-09T11:29:00.001Z2009-08-09T11:33:35.025ZMonoTouch Error - Missing UIKit.h<img src="http://blog.benhall.me.uk/images/MarsEdit/MonoTouch%20Error.png" alt="MonoTouch Error.png" border="0" width="400" height="300" align="right" />If you haven't heard about MonoTouch, then you need to be on <a href="http://twitter.com/ben_hall">twitter</a>. MonoTouch allows you to write iPhone applications using C#! It's in early, private, beta at the moment but it is very cool with huge amounts of potential.
However, on my first attempt to compile an application I received the following error:
"uikit.h no such file or directory"
UIKit.h is one of the iPhone SDK files. I knew I had the iPhone SDK installed, however it turns out I didn't have the 3.0 SDK! After installing the latest version, the application compiled without a problem. A note of the future in-case you hit the same error.
<b>UPDATE: Sorry about edits, I was playing around with MarsEdit and the formatting. </b>
<div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21967381-2693258959947861414?l=blog.benhall.me.uk' alt='' /></div><img src="http://feeds.feedburner.com/~r/BenHall/~4/PGVrA45utyg" height="1" width="1"/>Ben Hallhttp://www.blogger.com/profile/17734933641904484310Blog@BenHall.me.uk0http://blog.benhall.me.uk/2009/08/monotouch-error-missing-uikith.htmltag:blogger.com,1999:blog-21967381.post-60980733328028061692009-07-25T15:01:00.001Z2009-07-25T15:01:44.219ZMaking users happy by taking advantage of what you already have<p><a href="http://blog.benhall.me.uk/images/Makingusershappybytakingadvantageofyoure_2A48/image.png"><img style="border-right-width: 0px; margin: 0px 0px 5px 10px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Spotify" border="0" alt="Spotify" align="right" src="http://blog.benhall.me.uk/images/Makingusershappybytakingadvantageofyoure_2A48/image_thumb.png" width="375" height="300"></a>I think <a href="https://www.spotify.com/en/" rel="nofollow" target="_blank">Spotify</a> is an amazing service! Spotify have millions of tracks available for you to start listening to over the internet for free! It’s very simple to use, very quick and has a great collection of music – it is now rare that I even have to access my local mp3 collection! </p> <p>In the UK we have a <a href="http://www.mercuryprize.com/" rel="nofollow" target="_blank">Mercury Prize</a> for album of the year. 12 albums are nominated, some of which I would have already have listed too but generally there are one or two bands I’ve never heard of. Previously, I would have had search (generally MySpace) to find out more information about these bands and listen to their music. </p> <p>Today I was reading the <a href="https://www.spotify.com/blog/archives/2009/07/23/mercury-prize-nominees/" rel="nofollow" target="_blank">Spotify blog</a> and noticed they have put together a playlist of the albums nominated for the prize. Instantly I had a wow moment. They had taken their existing infrastructure and provided something cool, with very little effort or cost to themselves. I can now listen to the artists entire album instead of attempting to find one or two tracks!</p> <p>The reason for the post is that sometimes you don’t need to implement massive, expensive, features to make users happy. Sometimes the little touches can make just as much impact. Having the playlist made me happy, it made it easier to access to music which I was interested in. As a result I was <a href="http://twitter.com/Ben_Hall/statuses/2830261896" rel="nofollow" target="_blank">compelled</a> to tell people. </p> <p>If you look beyond making users happy, Spotify could now sell ads based on this playlist – promoting gigs for the artists or even just having the playlist ‘branded’ by Barclay who sponsor the prize. </p> <p>I was a little disappointed to find that Florence & the Machine’s album was not included. Not sure the reasons behind this but it feels very strange. The label have an opportunity to reach new fans via a cool and growing service. More fans results in increased merchandise sales, increases gig ticket sales, more exposure which will increase the likely hood of people actually buying the album and spending money. It’s not always about direct album sales.</p> <div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21967381-6098073332802806169?l=blog.benhall.me.uk' alt='' /></div><img src="http://feeds.feedburner.com/~r/BenHall/~4/mCClpC5ZtjA" height="1" width="1"/>Ben Hallhttp://www.blogger.com/profile/17734933641904484310Blog@BenHall.me.uk0http://blog.benhall.me.uk/2009/07/making-users-happy-by-taking-advantage.htmltag:blogger.com,1999:blog-21967381.post-19549510784500611782009-07-20T16:26:00.001Z2009-07-20T16:26:28.306ZIronRuby Session – Video and Slides<p><b></b>On Wednesday (15th July) I delivered my IronRuby presentation to the VistaSquad usergroup at Microsoft Victoria in London. </p> <p>Big thank you to <a href="http://irascian.blogspot.com/" target="_blank">Ian</a> who recorded and encoded the session, which I have embedded along with the slides below. </p> <p><b>Vimeo video</b></p> <p> <object width="640" height="360"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=5660902&server=vimeo.com&show_title=1&show_byline=1&show_portrait=0&color=&fullscreen=1" /><embed src="http://vimeo.com/moogaloop.swf?clip_id=5660902&server=vimeo.com&show_title=1&show_byline=1&show_portrait=0&color=&fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="640" height="360"></embed></object></p> <div style="font-family: tahoma,arial; height: 26px; font-size: 11px; padding-top: 2px"><a href="http://vimeo.com/5660902">Iron Ruby (Ben Hall)</a> from <a href="http://vimeo.com/vistasquad">Vista Squad</a> on <a href="http://vimeo.com">Vimeo</a>.</div> <p><b></b> </p> <p><b>SlideShare</b> presentation</p> <div style="text-align: left; width: 425px" id="__ss_1736234"><object style="margin:0px" width="425" height="355"><param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=presentation-090717154337-phpapp02&stripped_title=ironruby" /><param name="allowFullScreen" value="true" /><param name="allowScriptAccess" value="always" /><embed src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=presentation-090717154337-phpapp02&stripped_title=ironruby" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"></embed></object> <div style="font-family: tahoma,arial; height: 26px; font-size: 11px; padding-top: 2px"><b><a title="IronRuby" href="http://www.slideshare.net/BenHalluk/ironruby">IronRuby</a></b>. View more <a style="text-decoration: underline" href="http://www.slideshare.net/">presentations</a> from <a style="text-decoration: underline" href="http://www.slideshare.net/BenHalluk">BenHalluk</a>.</div></div> <div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21967381-1954951078450061178?l=blog.benhall.me.uk' alt='' /></div><img src="http://feeds.feedburner.com/~r/BenHall/~4/nKauPfa8YcM" height="1" width="1"/>Ben Hallhttp://www.blogger.com/profile/17734933641904484310Blog@BenHall.me.uk1http://blog.benhall.me.uk/2009/07/ironruby-session-video-and-slides.htmltag:blogger.com,1999:blog-21967381.post-28301330906154615762009-07-14T15:06:00.001Z2009-07-14T15:06:34.855ZCancel a cancellation?<p>I’m currently on a cut-costing exercise and one of the items which needed to go was a premium Ning service. Priorities changed, aims changed and as such it was no longer required. </p> <p>Finding how to cancel the service was pretty simple task. However, once I was there I felt something was missing. Notice anything from the screen below? </p> <p><a href="http://blog.benhall.me.uk/images/Cancelacancellation_E280/image.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://blog.benhall.me.uk/images/Cancelacancellation_E280/image_thumb.png" width="782" height="447"></a></p> <p>In my mind, Cancel is a way of backing out of a decision. In this case, it was a way to confirm. </p> <p>Logically, it made sense – you are explicitly clicking cancel. However, based on how every other application works I was expecting an OK or Yes button to appear next to it. </p> <p>It is important to think about what users are expecting to see together with how certain terms might have more than one possible meaning. </p> <div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21967381-2830133090615461576?l=blog.benhall.me.uk' alt='' /></div><img src="http://feeds.feedburner.com/~r/BenHall/~4/iHcSNYtlj4k" height="1" width="1"/>Ben Hallhttp://www.blogger.com/profile/17734933641904484310Blog@BenHall.me.uk1http://blog.benhall.me.uk/2009/07/cancel-cancellation.htmltag:blogger.com,1999:blog-21967381.post-5614445502213260042009-07-13T23:08:00.001Z2009-07-13T23:08:27.852ZAsking is not a bad thing…<p>I’m all for applications providing users with a streamlined experience, reducing clicks and the amount of dialogs they have to confirm to get the job done. However, sometimes it can go a step too far. </p> <p>Today, I had to buy a printer. Came home, plugged it in and Windows 7 happily installed the correct drivers – job done. Not quite. Sadly I had left Word open in the background. After continuing to do work on the document, AutoRecovery kicked in and saved the file. At this point I was shown the following dialog. </p> <p><a href="http://lh5.ggpht.com/_exs7ZT6h_9Q/Slu-Xe3k97I/AAAAAAAAAKI/UVAt9h4UWpw/s1600-h/image7.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://lh5.ggpht.com/_exs7ZT6h_9Q/Slu-YbTMK9I/AAAAAAAAAKM/SqEllAwjbK0/image_thumb3.png?imgmax=800" width="616" height="480"></a> </p> <p>Instantly I had to stop, take a step back and wonder what I had done to cause this to happen. I was confused, and confusion is very bad for a user. I had no indication of what was happening, how long it would take or why it had happened in the first place. I can only assume it was related to the installation of the printer which caused Word to reconfigure itself.</p> <p>To make matters worse, after it had completed I was then shown this dialog. There is no reason why Word should need me to reboot my machine. </p> <p><a href="http://lh6.ggpht.com/_exs7ZT6h_9Q/Slu-Y-Y7AwI/AAAAAAAAAKQ/LovzYGDIfWk/s1600-h/image11.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://lh6.ggpht.com/_exs7ZT6h_9Q/Slu-ZE_aIiI/AAAAAAAAAKU/1gWnfgvCbac/image_thumb7.png?imgmax=800" width="384" height="140"></a> </p> <p></p> <p>Clicking no was my natural reaction given the choice as I was in the middle of working. Word had other ideas.</p> <p><a href="http://lh3.ggpht.com/_exs7ZT6h_9Q/Slu-aDQbsFI/AAAAAAAAAKY/28btCYYpIlk/s1600-h/image16.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://lh3.ggpht.com/_exs7ZT6h_9Q/Slu-aplZXKI/AAAAAAAAAKc/Y-IcrtEutVA/image_thumb10.png?imgmax=800" width="379" height="150"></a></p> <p>At this point it had back round the cycle at which point I caved and accepted the reboot. After receiving random errors, Word informed me it could not save my work resulting in a loss of work. </p> <p>Lessons to take away from this.</p> <blockquote> <p>1) If the action the application is taking is uncommon or could cause the user confusion – tell them. It would actually have been nice to have a dialog saying – “Sorry, we need to do some configuration as your printer settings have changed.”</p> <p>2) At which point, I should have been given the option of ‘Now’, or ‘When I close Word’. Actions such as configuration are best performed when the user closes the application as they have finished their work and as such won’t mind the delay.</p> <p>3) If they don’t want the action to happen – make sure you can cope. In this situation Word obviously couldn’t. </p> <p>4) Finally, always think about how the user will feel when the dialog pops up or an action is taken without their consent.</p></blockquote> <p>Worse user experience <strike>ever!</strike> <strike>today</strike> so far today.</p> <div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21967381-561444550221326004?l=blog.benhall.me.uk' alt='' /></div><img src="http://feeds.feedburner.com/~r/BenHall/~4/Lqs7eg5EKaw" height="1" width="1"/>Ben Hallhttp://www.blogger.com/profile/17734933641904484310Blog@BenHall.me.uk0http://blog.benhall.me.uk/2009/07/asking-is-not-bad-thing.htmltag:blogger.com,1999:blog-21967381.post-55737064236231878582009-07-08T14:53:00.001Z2009-07-08T14:53:36.283ZMEFUnit – Prototype of a MEF Unit Testing Framework<p>Recently I have been paying close attention to <a href="http://www.codeplex.com/MEF" target="_blank" rel="nofollow">MEF</a>, the Managed Extensibility Framework. MEF is an extremely powerful framework aimed at making parts (internal or external extensibility points) more discoverable.</p> <p>While I was looking at this, it dawn on me. Unit testing frameworks main role is identifying and executing methods. If that is their main function – how could you use MEF to identify and execute those methods? The result of this pondering is <a href="http://github.com/BenHall/MefUnit/tree/master" target="_blank" rel="nofollow">MEFUnit</a>. Like with <a href="http://blog.benhall.me.uk/2009/06/xunitgwt-given-when-then-gwt-extension.html" target="_blank" rel="nofollow">xUnit.GWT</a> this is located on <a href="http://github.com/BenHall/" target="_blank" rel="nofollow">GitHub</a> and has been mentioned on <a href="http://twitter.com/ben_hall" target="_blank" rel="nofollow">twitter</a> once or twice.</p> <p><strong>The Tests</strong></p> <p>The tests look very similar to any other kind of unit testing framework you might have used. The attribute [Mef] identifies which methods should be executed, and like with any other framework they can pass (no exception), fail (assertion exception) and be skipped (skipped exception).</p><code> <p>public class Example<br>{<br> [Mef]<br> public void Test1()<br> {<br> throw new AssertException("Test Failed");<br> } <p> [Mef]<br> public void Test2()<br> {<br> throw new SkipException();<br> } <p> [Mef]<br> public void Test3()<br> {<br> }<br>}</code> <p>Fundamentally, this is the main concept of most unit testing frameworks. Yes, some have parameterized tests and other such features which are great, but many people got by with just this. When you run the tests, you get the following output. <p>Executing Tests<br>Executing Test1... Test Failed<br>Executing Test2... Skipped<br>Executing Test3... Passed<br> <p><strong>Key implementations points of MEFUnit</strong></p> <p>But how are these methods actually turned into unit tests? The main point in the above example is the MEF attribute. This is simply a custom ExportAttribute. I could have wrote:</p><code> <p>[Export("Mef", typeof(Action)]<br>public void Test() {}</code></p> <p>However, I feel creating a custom attribute improves the readability and usability of my framework for the user. It also means if I need to change the contract I can do it without effecting my dependent exports. The second important fact is that the exports are of type Action. By storing the method references as Action I can executed them anywhere in my code. This is the trick which makes this all possible. It means I can execute each test as shown and report the result to the console. </p><code> <p>public void RunMefs()<br>{<br> foreach (var mef in Mefs)<br> {<br> Console.Write("Executing " + mef.Method.Name + "... "); <p> try<br> {<br> mef();<br> Console.WriteLine("Passed");<br> }<br> catch (AssertException ex)<br> {<br> Console.WriteLine(ex.Message);<br> }<br> catch (SkipException)<br> {<br> Console.WriteLine("Skipped");<br> }<br> }<br>} </code> <p>The Mefs collection is populated via the MEF framework and the use of an Import attribute. Within the class, the property looks like this: <code> <p>[MefTests]<br>public IEnumerable<Action> Mefs { get; set; } </code> <p>As with the Export attribute, I wanted to hide the actual contract I used to import the Action methods. This allowed me to hide the fact I was using AllowRecomposition, enabling tests to be dynamically identify when new assemblies are loaded. <p><code>public MefTests() : base("Mef", typeof(Action))<br>{<br> AllowRecomposition = true;<br>} </code> <p>When you combine this with the Compose method which hooks together the core parts of MEF you have the core concept of a unit testing framework. <p>I have to admit, I’m not expecting anyone to actually use this. However, I think it shows some of the interesting capabilities which MEF brings to the table.</p> <div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21967381-5573706423623187858?l=blog.benhall.me.uk' alt='' /></div><img src="http://feeds.feedburner.com/~r/BenHall/~4/D1XO4ZC-hc4" height="1" width="1"/>Ben Hallhttp://www.blogger.com/profile/17734933641904484310Blog@BenHall.me.uk1http://blog.benhall.me.uk/2009/07/mefunit-prototype-of-mef-unit-testing.htmltag:blogger.com,1999:blog-21967381.post-54349019047615275112009-06-29T10:36:00.001Z2009-06-29T10:36:57.561ZxUnit.GWT - Given When Then (GWT) extension for xUnit.net<p>One of the most important considerations when writing automated tests, especially customer acceptance tests is readability. I have been looking at how you could potentially create more readable tests targeted against C# applications. While I have spoke before about IronRuby and RSpec\Cucumber as customer acceptance tests for C# applications, this combination still has some performance issues together with an initial ‘fear factor’ for some users. </p> <p>One of the reasons why I created this framework was based on previous experiences of introducing new concepts. Attempting to introduce too many new concepts to a team unfamiliar with the idea can be a huge challenge. Team members focus too much on the amount of information they have to learn instead of focusing on the concept and how it can be applied. </p> <p>In an attempt to combat this, I have created a prototype which approaches the topic of creating customer acceptance tests in a similar fashion to cucumber, however in the familiarity of C#. While you could successfully write your tests like this, my aim is to use this as a gateway to move people onto other frameworks such as Cucumber via IronRuby.</p> <p>The code for this can be found on my <a href="http://github.com/BenHall/xUnit.GWT" target="_blank" rel="nofollow">GitHub</a> repository. For those of you following me on twitter, you will be aware that this code has been available for a while – I’ve only just managed to find time the time to write a post about the framework. If you want to stay up to date, I recommend to stay up to date is follow me on <a href="http://twitter.com/ben_hall" target="_blank" rel="nofollow">twitter</a>, <a href="http://github.com/BenHall/" target="_blank" rel="nofollow">GitHub</a> and of course my blog.</p> <p>Back on to the prototype. It is called xUnit.GWT and builds on top of the amazing extensibility model xUnit has in place. </p> <p><strong>Example</strong></p> <p><code>[Feature("As a user... I want to... So that I...")]<br>public class This_is_my_story : This_is_my_story_Base<br>{<br> [Scenario]<br> public void when_transferring_between_two_accounts()<br> {<br> Given("both accounts have positive balances"); <br> When("transfer money from a to b");<br> Then("a should have the total balance of b", () => a.Balance.ShouldBe(3));<br> Then("balance of b should be 0", () => b.Balance.ShouldBe(0));<br> }<br>}</code> <p>The above code is an example of how a test would look with this prototype. This can be executed using TestDriven.NET, ReSharper and the xUnit.Console itself. <p>First, lets focus on the class. The class has an attribute called Feature. This should define the feature which the various different scenarios relate to. The scenarios are methods within the class. These methods has been flagged with the attribute Scenario so xUnit can detect and execute them. <p>Each scenario is then broken down into three different stages. Each of the Given, When, Then statements are in fact method calls with two overloads. One just accepts a string, while the other accepts a string and a delegate. <p>The reason we can simply pass in a string, is because the associated delegate has already been set within a base class. An example base class is shown here. <p><code>public class This_is_my_story_Base : Story<br>{<br> protected Account a;<br> protected Account b; <p> public This_is_my_story_Base()<br> {<br> SetGiven("both accounts have positive balances", () =><br> {<br> a = new Account();<br> a.Balance = 1;<br> b = new Account();<br> b.Balance = 2;<br> }); <p> SetWhen("transfer money from a to b", () =><br> {<br> a.Balance += b.Balance;<br> b.Balance = 0;<br> });<br> }<br>} </code> <p>The use of SetGiven or SetWhen allows us to store re-usable blocks of code. Using the string as a key, in our subclass we can use the same key to indicate which block of code should be executed. The aim is that these blocks of code should be reusable enough to allow different scenarios to make use of them and as such improve the readability of our tests. </p> <p>While playing around, I found this sometimes caused too much overhead which is why you can simply pass in the delegate to execute within the method call. Using the explicit approach when defining your Then'\Assertions can actually improve the readability. </p> <p>With this structure in place, we can now start becoming more flexible. One thing I found when working on test harnesses at Red Gate is that you want to write the boiler plate test while it is fresh in your head, even if the actual implementation is not in place. Having these in place can also provide a good indication of the state of the project. If the test is still pending – it isn’t done.</p> <p>To cope, you can pass in a delegate called Pending. When you execute the scenario the test will be skipped and not executed.</p> <p><code>[Scenario]<br>public void test_marked_as_pending()<br>{<br> Given("one pending block", Pending);<br> Then("it should be marked as pending in the report");<br>}</code> </p> <p>The same applies in case you haven’t provided an implementation for anyone of the blocks you are attempting for use.<code></p> <p>[Scenario]<br>public void pending_block()<br>{<br> Given("a block which has been defined");<br> When("no action assigned");<br> Then("it should be marked as pending");<br>} </code> <p>Yet, this is not the whole story. Another problem I commonly experienced was with the NUnit report embedded into CCNet. Even if you have take the effort to make your namespaces, classes and methods make sense I still found it difficult to read. <p>Taking advantage of the more readable tests, I have created a custom XSLT which can be applied to the xUnit report. <p>With a bit of styling and bold text in the right place, the report can be extremely readable. When the above examples are executed and the transform has been applied, the report looks like this. <p><a href="http://lh6.ggpht.com/_exs7ZT6h_9Q/SkiZRo-j9_I/AAAAAAAAAKA/jKLFVIUA03g/s1600-h/Screenshot7.png"><img title="Screenshot" style="border-top-width: 0px; display: block; border-left-width: 0px; float: none; border-bottom-width: 0px; margin-left: auto; margin-right: auto; border-right-width: 0px" height="218" alt="Screenshot" src="http://lh3.ggpht.com/_exs7ZT6h_9Q/SkiZSEi-tOI/AAAAAAAAAKE/3-nHNRuNhh4/Screenshot_thumb5.png?imgmax=800" width="900" border="0"></a></p> <p>You can easily see which scenarios are passing, failing or pending while also taking advantage of the readable blocks of code to provide more context about what was executed. </p> <p>This is just a prototype. It is only one possible syntax which you could use. As such, I would be really interested to hear your feedback on this. The framework is fully usable, the binaries can be downloaded <a href="http://blog.benhall.me.uk/code/xunit.gwt/xunit.gwt.zip" target="_blank">here</a>. If your interested in the actual implementation, all the code is available on GitHub. If you have any questions, then please contact me via <a href="http://twitter.com/ben_hall" target="_blank" rel="nofollow">twitter</a>. </p> <div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21967381-5434901904761527511?l=blog.benhall.me.uk' alt='' /></div><img src="http://feeds.feedburner.com/~r/BenHall/~4/Fo9CmU0K6kk" height="1" width="1"/>Ben Hallhttp://www.blogger.com/profile/17734933641904484310Blog@BenHall.me.uk0http://blog.benhall.me.uk/2009/06/xunitgwt-given-when-then-gwt-extension.htmltag:blogger.com,1999:blog-21967381.post-75591091866165229742009-06-25T11:21:00.001Z2009-06-25T11:27:03.446ZIs it wrong to spend £5 on pick n’ mix from Woolworths ?<p><a href="http://lh6.ggpht.com/_exs7ZT6h_9Q/SkNdlLeqITI/AAAAAAAAAJo/vG8kew2vONs/s1600-h/image%5B4%5D.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://lh5.ggpht.com/_exs7ZT6h_9Q/SkNdl-w-rFI/AAAAAAAAAJs/eTHH2eMSD1s/image_thumb%5B2%5D.png?imgmax=800" width="640" height="337"></a> </p> <p>This is the question of the day! For those of you not in the UK, Woolworths felt the force of the credit crunch and went into administration, closing its 807 stores. Woolworths was a national treasure, opening it’s first store in 1909 (<a title="http://news.bbc.co.uk/1/hi/in_pictures/7801807.stm" href="http://news.bbc.co.uk/1/hi/in_pictures/7801807.stm" rel="nofollow" target="_blank">http://news.bbc.co.uk/1/hi/in_pictures/7801807.stm</a>). It’s still a sad sight to walk past an abandon store bearing it’s name. </p> <p>Woolworths was a very well respected brand, however lost it’s way and as a result the product line became confusing – they sold everything and anything? The stores became confusing and you lost the joy of entering, which I’m sure many of you experienced as a child. Their community moved onto stores like Tesco and as such there was only ever going to be one way it ended. </p> <p>However! Today it has <a href="http://news.bbc.co.uk/1/hi/business/8117433.stm" rel="nofollow" target="_blank">returned</a>, as a <a href="http://www.woolworthsparty.co.uk/pick_n_mix/" target="_blank">online store</a> at least. But that’s not the interesting part. After seeing the outpouring of love for the brand with people paying <a href="http://news.bbc.co.uk/1/hi/england/london/7903509.stm" rel="nofollow" target="_blank">£14,500</a> for the last bag of pick n’ mix, @team_woolies started to utilise social media to connect this loyal following and build a community. @team_woolies have been utilising <a href="http://twitter.com/team_woolies" rel="nofollow" target="_blank">twitter</a>, <a href="http://www.facebook.com/WoolworthsUK" rel="nofollow" target="_blank">facebook</a> and other social media sites to connect the huge following around the brand. </p> <p>By building a Social media platform, they have allowed people to share their love of pick n’ mix and all things Woolworth! This has created a huge buzz around the brand that has has got people talking amongst themselves and the different aspects and what they loved. The team could have purchased TV and print ads and attempted to force the new relaunch onto people – this would have failed. It would have cost huge amounts of money and most people would have ignored the ads.</p> <p>Social media has allowed them to build awareness, promotion and a buzz. The results is that they have created a huge buzz around their relaunch with lots of people talking – without Woolworths having to do anything! </p> <p><a href="http://lh3.ggpht.com/_exs7ZT6h_9Q/SkNdmUkORyI/AAAAAAAAAJw/01rQFC1eqrQ/s1600-h/image%5B8%5D.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://lh3.ggpht.com/_exs7ZT6h_9Q/SkNdnMHD-aI/AAAAAAAAAJ0/TjxhjXZqK8c/image_thumb%5B4%5D.png?imgmax=800" width="572" height="484"></a> </p> <p>The <a href="http://www.woolieshq.co.uk/" rel="nofollow" target="_blank">Woolies HQ</a> site provides a personal touch to the site and has even gone as far to use Last.fm and Spotify to create <a href="http://www.woolieshq.co.uk/lounge" rel="nofollow" target="_blank">Radio Woolies</a>. While they are little things, together they build a great way to engagement with users. </p> <p><a href="http://lh3.ggpht.com/_exs7ZT6h_9Q/SkNdoA93URI/AAAAAAAAAJ4/lz27eMneFQE/s1600-h/image%5B12%5D.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://lh4.ggpht.com/_exs7ZT6h_9Q/SkNdo04NvkI/AAAAAAAAAJ8/MAjj-mKyHzY/image_thumb%5B6%5D.png?imgmax=800" width="557" height="484"></a> </p> <p>Some would consider Radio Woolies just to be a cost centre – a pointless exercise that will never return any money. That is not the point! The point is to engage. Allow people to feel connected, involved and important. Little things which make people smile are worth the effort for a company to get right! If people love you, then you’re sure to be a success. </p> <p>Now they have launched, I hope that they keep the buzz alive. Imagine a facebook application which would allow you to list your favourite pick n’ mix items? Not only would this allow you to share your favourite combinations with friends, but also allow their friends to purchase that combination with a single click as an impulse buy? @team_woolies - if you need help, let me know!</p> <p>Finally – "Is it wrong to spend £5 on pick n’ mix from Woolworths?” – I was taken away in the moment, the hype and my joy of sweet things… so I hope not.</p> <div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21967381-7559109186616522974?l=blog.benhall.me.uk' alt='' /></div><img src="http://feeds.feedburner.com/~r/BenHall/~4/Qkhq_DvINlQ" height="1" width="1"/>Ben Hallhttp://www.blogger.com/profile/17734933641904484310Blog@BenHall.me.uk0http://blog.benhall.me.uk/2009/06/is-it-wrong-to-spend-5-on-pick-n-mix.htmltag:blogger.com,1999:blog-21967381.post-65058346143578603132009-06-15T20:46:00.001Z2009-06-15T20:46:40.227ZMySQL – Creating a new user<p>It’s funny how you forget the simple things when you haven’t done them in a while. </p> <p>Tonight I wanted to setup MySQL on my Windows 7 machine. The installation was simple and I happily had my root account created. However, I didn’t want to use my root account for development – mainly because I didn’t want the password to be sorted in clear text. </p> <p>In order to create a new user, I used the command line MySQL client tool which allows me to execute commands against the server. You enter this via the command.</p> <p><code>mysql --user="root" ––password</code></p> <p>This will then prompt you for the root password. I could have entered this on the command line as well, but again it would be in the clear.</p> <p>From the tool, I enter the following two commands. The first creates the user, the second assigns permissions. </p> <p><code>CREATE USER 'new_username'@'localhost' IDENTIFIED BY 'password'; </code></p> <p><code>GRANT ALL ON *.* TO 'new_username'@'localhost'; </code></p> <p>I can then happily use this new user with my application. I wanted to post this in case anyone else keeps forgetting like me…</p> <div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21967381-6505834614357860313?l=blog.benhall.me.uk' alt='' /></div><img src="http://feeds.feedburner.com/~r/BenHall/~4/vA_JcEUhPOU" height="1" width="1"/>Ben Hallhttp://www.blogger.com/profile/17734933641904484310Blog@BenHall.me.uk1http://blog.benhall.me.uk/2009/06/mysql-creating-new-user.htmltag:blogger.com,1999:blog-21967381.post-27618663227783181302009-05-24T21:19:00.001Z2009-05-24T21:19:57.964ZDDD South West - Dynamic Languages and .NET and Creating extensible application using MEF<p>This weekend I attended and presented two sessions at <a href="http://www.dddsouthwest.com/" rel="nofollow" target="_blank">DDD South West</a>. Thank you to everyone who attended my sessions and the organisers for hosting the event, if you have any questions then please <a href="http://www.twitter.com/ben_hall" rel="nofollow" target="_blank">let me know</a>. Slides and code for the two sessions can be found on the posts below.</p> <p><strong>Creating Extensible applications using MEF</strong></p> <p><a title="http://blog.benhall.me.uk/2009/05/nxtgenug-cambridge-creating-extendable.html" href="http://blog.benhall.me.uk/2009/05/nxtgenug-cambridge-creating-extendable.html">http://blog.benhall.me.uk/2009/05/nxtgenug-cambridge-creating-extendable.html</a></p> <p><strong>Dynamic Languages and .NET</strong></p> <p><a title="http://blog.benhall.me.uk/2009/05/dynamic-languages-and-net-developer-day.html" href="http://blog.benhall.me.uk/2009/05/dynamic-languages-and-net-developer-day.html">http://blog.benhall.me.uk/2009/05/dynamic-languages-and-net-developer-day.html</a></p> <div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21967381-2761866322778318130?l=blog.benhall.me.uk' alt='' /></div><img src="http://feeds.feedburner.com/~r/BenHall/~4/dmJYAsq57JU" height="1" width="1"/>Ben Hallhttp://www.blogger.com/profile/17734933641904484310Blog@BenHall.me.uk0http://blog.benhall.me.uk/2009/05/ddd-south-west-dynamic-languages-and.htmltag:blogger.com,1999:blog-21967381.post-89843795720407815982009-05-19T22:59:00.001Z2009-05-19T22:59:20.745ZNxtGenUG Cambridge: Creating extendable applications using MEF slides and code<p>Tonight I gave a slightly modified version of my MEF presentation at NxtGenUG in Cambridge. Thank you to everyone who attended. Slides and code available below. I’ll be repeating the same session, or at least based on feedback, at DDD South West on Saturday. </p> <div style="text-align: left; width: 425px" id="__ss_1461336"><a style="margin: 12px 0px 3px; display: block; font: 14px helvetica,arial,sans-serif; text-decoration: underline" title="Creating extendable applications using MEF" href="http://www.slideshare.net/BenHalluk/creating-extendable-applications-using-mef?type=presentation">Creating extendable applications using MEF</a><object style="margin:0px" width="425" height="355"><param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=mef-090519173805-phpapp02&stripped_title=creating-extendable-applications-using-mef" /><param name="allowFullScreen" value="true" /><param name="allowScriptAccess" value="always" /><embed src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=mef-090519173805-phpapp02&stripped_title=creating-extendable-applications-using-mef" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"></embed></object> <div style="font-family: tahoma,arial; height: 26px; font-size: 11px; padding-top: 2px">View more <a style="text-decoration: underline" href="http://www.slideshare.net/">presentations</a> from <a style="text-decoration: underline" href="http://www.slideshare.net/BenHalluk">BenHalluk</a>.</div></div> <p><strong>Download code: </strong><a href="http://blog.benhall.me.uk/downloads/NxtGenUG/CambridgeMEF/Code.zip" target="_blank"><strong>Code.zip</strong></a></p> <p>The MVC Sample application which I mentioned but didn’t show was taken from <a title="http://blogs.msdn.com/hammett/archive/2009/04/23/mef-and-asp-net-mvc-sample.aspx" href="http://blogs.msdn.com/hammett/archive/2009/04/23/mef-and-asp-net-mvc-sample.aspx" target="_blank">http://blogs.msdn.com/hammett/archive/2009/04/23/mef-and-asp-net-mvc-sample.aspx</a></p> <div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21967381-8984379572040781598?l=blog.benhall.me.uk' alt='' /></div><img src="http://feeds.feedburner.com/~r/BenHall/~4/2jSPSZdAXko" height="1" width="1"/>Ben Hallhttp://www.blogger.com/profile/17734933641904484310Blog@BenHall.me.uk2http://blog.benhall.me.uk/2009/05/nxtgenug-cambridge-creating-extendable.htmltag:blogger.com,1999:blog-21967381.post-58246776944165698012009-05-12T08:56:00.001Z2009-05-14T20:44:24.529ZAlt.Net.UK London - August 2009 – Registration opens TODAY!<p>Over the past month <a href="http://codebetter.com/blogs/ian_cooper" rel="nofollow" target="_blank">Ian Cooper</a>, <a href="http://thoughtpad.net/alan-dean.html" rel="nofollow">Alan Dean</a>, <a href="http://serialseb.blogspot.com/" rel="nofollow">Sebastian Lambla</a>, <a href="blogs.conchango.com/michelleflynn" rel="nofollow" target="_blank">Michelle Flynn</a> and I have been discussing the next Alt.Net.UK conference. We feel its time for another conference and this year we are doing it slightly differently. </p> <p>The plan is: </p> <p>Friday 31 July Evening 6pm-9pm: Alt.Net Beers: Yes we are integrating Seb's alt.net event to warm you up with a chance to relax with like-minded individuals @ <small><a href="http://maps.google.co.uk/maps?q=82+Dean+Street%2c+London%2c+W1D+3HA%2c+United+Kingdom" rel="nofollow">82 Dean Street, London, W1D 3HA, United Kingdom</a> (Tequila)</small> <p>Saturday 1 August Day 9am-5pm: Open Space Coding: Alan Dean's <a href="http://openspacecode.com/home.en.xhtml" rel="nofollow">Open Space Coding Day</a> event joins our weekend. the emphasis is on writing code over jawing @ <small><a href="http://maps.google.co.uk/maps?q=36+Southwark+Bridge+Road%2c+London%2c+SE1+9EU%2c+United+Kingdom" rel="nofollow">36 Southwark Bridge Road, London, SE1 9EU, United Kingdom</a> (Conchango)</small> <p>Sunday 2 August Day 9am-5pm: AltNetConf: Open Space discussion about the topics that have grabbed you today. Be prepare to be surprised @ <small><a href="http://maps.google.co.uk/maps?q=36+Southwark+Bridge+Road%2c+London%2c+SE1+9EU%2c+United+Kingdom" rel="nofollow">36 Southwark Bridge Road, London, SE1 9EU, United Kingdom</a> (Conchango)</small> <p><strong>REGISTRATION:</strong> <strong><strike>Opens 13:00 on Tuesday 12th May</strike> – Visit </strong><a href="http://www.altnetuk.com" target="_blank"><strong>www.altnetuk.com</strong></a><strong> for more information. You don’t need to attend all three events but if you can – that is great! Simply let us know which ones you can\can’t attend so we can plan numbers accordingly.</strong> <p><strong>REGISTRATION UPDATE: As you may have noticed, registration is not open :( Don’t worry – instead it opens 13:00 on Friday 15th May (Tomorrow!). </strong> <p>A huge thank you to our hosts, sponsors and supporters who have made this possible. Times are hard but they are still willing to help which is great!! Please go check out what they do and the services they offer. <h4><strong>Our Hosts</strong></h4> <p><a href="http://www.conchango.com/" rel="nofollow"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="3524045955_13cf87e4c2_o" border="0" alt="3524045955_13cf87e4c2_o" src="http://lh3.ggpht.com/_exs7ZT6h_9Q/Sgk50aTwuqI/AAAAAAAAAIc/Mo35vm58iqs/3524045955_13cf87e4c2_o%5B4%5D.jpg?imgmax=800" width="240" height="50"></a></p> <p><a href="http://www.tequila-uk.com/" rel="nofollow"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="3524074979_3128307e6e_t" border="0" alt="3524074979_3128307e6e_t" src="http://lh5.ggpht.com/_exs7ZT6h_9Q/Sgk50ihB_3I/AAAAAAAAAIg/XDvHcJlPpNg/3524074979_3128307e6e_t%5B4%5D.jpg?imgmax=800" width="100" height="28"></a></p> <h4><strong>Our Sponsors</strong></h4> <p><a href="http://www.red-gate.com/" rel="nofollow"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="3524046013_1652e368b6_o" border="0" alt="3524046013_1652e368b6_o" src="http://lh4.ggpht.com/_exs7ZT6h_9Q/Sgk5085DKAI/AAAAAAAAAIk/uUZLNKmvbjk/3524046013_1652e368b6_o%5B4%5D.gif?imgmax=800" width="240" height="47"></a></p> <p><a href="http://cognitiveconsulting.co.uk/" rel="nofollow"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="3524045987_bc4888eafe_o" border="0" alt="3524045987_bc4888eafe_o" src="http://lh4.ggpht.com/_exs7ZT6h_9Q/Sgk51QDZ7LI/AAAAAAAAAIo/ZTxqill1X2I/3524045987_bc4888eafe_o%5B4%5D.gif?imgmax=800" width="167" height="73"></a></p> <p><a href="http://www.thoughtworks.com/" rel="nofollow"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="3524854448_5c655b575a_o" border="0" alt="3524854448_5c655b575a_o" src="http://lh5.ggpht.com/_exs7ZT6h_9Q/Sgk51ha5-tI/AAAAAAAAAIs/z8g358qkmXE/3524854448_5c655b575a_o%5B4%5D.jpg?imgmax=800" width="240" height="66"></a></p> <h4><strong>Our Supporters</strong></h4> <p><a href="http://www.huddle.net/" rel="nofollow"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="3524854428_8d847d49eb_o" border="0" alt="3524854428_8d847d49eb_o" src="http://lh3.ggpht.com/_exs7ZT6h_9Q/Sgk51yDuALI/AAAAAAAAAIw/7VPxOoHZOgY/3524854428_8d847d49eb_o%5B3%5D.gif?imgmax=800" width="100" height="39"></a></p> <p><a href="http://skillsmatter.com/" rel="nofollow"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="3524046087_0555060d73_o" border="0" alt="3524046087_0555060d73_o" src="http://lh3.ggpht.com/_exs7ZT6h_9Q/Sgk52F8FIeI/AAAAAAAAAI0/9rP-YjJWeaQ/3524046087_0555060d73_o%5B4%5D.gif?imgmax=800" width="100" height="38"></a></p> <p> </p> <p>Any questions, please let one of us know!</p> <div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21967381-5824677694416569801?l=blog.benhall.me.uk' alt='' /></div><img src="http://feeds.feedburner.com/~r/BenHall/~4/dBnqyOYm1Cs" height="1" width="1"/>Ben Hallhttp://www.blogger.com/profile/17734933641904484310Blog@BenHall.me.uk0http://blog.benhall.me.uk/2009/05/altnetuk-london-august-2009.htmltag:blogger.com,1999:blog-21967381.post-85603705931378067562009-05-04T12:53:00.001Z2009-05-04T14:12:41.168ZDynamic Languages and .NET - Developer Day Scotland slides and code samples<p>This weekend I was in Glasgow presenting my ‘dynamic languages and .NET’ presentation at <a href="http://developerdayscotland.com/main/Default.aspx" target="_blank">DeveloperDay Scotland</a>. I demonstrated how you can take advantage of IronRuby as a language, but also how you could host the DLR within your own application to enhance your feature set. I had a great time and the conference was a great success. A massive thank you to <a href="http://www.colinmackay.net/" target="_blank">Colin Mackay</a> and the others for organising the event, as well as everyone who attended my session.</p> <p>Slides can be found below, hosted via <a href="http://www.slideshare.net/BenHalluk" target="_blank">SlideShare</a>. Code samples can be downloaded <a href="http://blog.benhall.me.uk/downloads/DDDS2/CodeSamples.zip" target="_blank">here</a>. Photos can be found <a href="http://www.flickr.com/photos/tags/dddscot/" target="_blank">here</a>.</p> <div style="text-align: left; width: 425px" id="__ss_1382896"><a style="margin: 12px 0px 3px; display: block; font: 14px helvetica,arial,sans-serif; text-decoration: underline" title="Embracing a new world - dynamic languages and .NET" href="http://www.slideshare.net/BenHalluk/embracing-a-new-world-dynamic-languages-and-net-1382896?type=powerpoint">Embracing a new world - dynamic languages and .NET</a><object style="margin:0px" width="425" height="355"><param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=presentation-090504090728-phpapp02&stripped_title=embracing-a-new-world-dynamic-languages-and-net-1382896" /><param name="allowFullScreen" value="true" /><param name="allowScriptAccess" value="always" /><embed src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=presentation-090504090728-phpapp02&stripped_title=embracing-a-new-world-dynamic-languages-and-net-1382896" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"></embed></object> <div style="font-family: tahoma,arial; height: 26px; font-size: 11px; padding-top: 2px">View more <a style="text-decoration: underline" href="http://www.slideshare.net/">presentations</a> from <a style="text-decoration: underline" href="http://www.slideshare.net/BenHalluk">BenHalluk</a>.</div> </div> <p>I was also involved in the Database Testing panel. Very interesting discussion on how to test databases, thank you to everyone who attend the discussion.</p> <p>One slight disappointment, Gary Short left before giving his IronSmalltalk grok talk - <a title="http://www.flickr.com/photos/colinangusmackay/3496808871/" href="http://www.flickr.com/photos/colinangusmackay/3496808871/" target="_blank">http://www.flickr.com/photos/colinangusmackay/3496808871/</a></p> <p>Next up, <a href="http://www.dddsouthwest.com/" target="_blank">DDD South West</a>.</p> <div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/21967381-8560370593137806756?l=blog.benhall.me.uk' alt='' /></div><img src="http://feeds.feedburner.com/~r/BenHall/~4/FZbfx4PY8-U" height="1" width="1"/>Ben Hallhttp://www.blogger.com/profile/17734933641904484310Blog@BenHall.me.uk2http://blog.benhall.me.uk/2009/05/dynamic-languages-and-net-developer-day.html |
|


|