tag:blogger.com,1999:blog-58218889934636129682023-03-03T10:00:08.133+01:00S'trueInsights and outlooks on software developmentThomas Lhttp://www.blogger.com/profile/01658215829967656886noreply@blogger.comBlogger143125tag:blogger.com,1999:blog-5821888993463612968.post-25882144062520720572013-03-29T20:36:00.000+01:002013-03-29T20:37:05.659+01:00On Why Ruby<p>So <a href="https://twitter.com/codinghorror">Jeff Atwood</a> (of <a href="http://www.codinghorror.com/blog/">Coding Horror</a> fame) wrote a post he called <a href="http://www.codinghorror.com/blog/2013/03/why-ruby.html">"Why Ruby"</a> a week ago. In that post (go read it, it's great!) he lists a number of arguments why his new venture, <a href="http://www.discourse.org/">Discourse</a>, is written in Ruby, and not C#, which he is most used to.</p>
<p>"Why Ruby" was as I understand written from the outset of trying to spread usage and draw committers to the open-source software Discourse. I thought I should add my thoughts on why I choose to use Ruby for my start-up Finn Medicinen and why I prefer using Ruby when consulting/contracting on others' systems.</p>
<p>First off, let me explain where I'm coming from. Since I started my first job after university, around 2003/2004 sometime, I've primarily used .NET based languages at work. Mostly C#, but I've also come across VB.NET. I haven't used the language which actually looks most interesting on the CLR stack, F#. This is probably since I started using Ruby before F# was launched, and I've been totally in love of the language. On the current "About Me" page on this blog, <a href="http://blog.thomaslundstrom.com/2008/12/on-me.html">a post written in 2008</a>, I wrote "I work with .NET, but I have an affair on the side with Ruby". As I stand right now, I've actually ditched .NET and married my previous lover. This is why.</p>
<p><b>The language and its consistency</b>. Since you've come across my blog, I suppose you're a programmer. If so, you've probably seen the Ruby language, and boy, is it a beauty! The object model is incredibly consistent. You can do "a string".length, just as you can do [1,2,3].length. I know, the example is a bit contrieved, but it's striking how consistent the core and the libraries are. In Python, being a language rather similar to Ruby, you can smell the heritage of it being a procedural language from the get-go with OO added after the fact. To get the length of an Array in Python, you do len([1,2,3,4,5]) instead - the functionality is there, but it breaks with the mental model of objects having instance methods; you instead have to use the global function 'len'.
</p>
<p>
<b>The community</b>. I spoke to a friend the other day, regarding why we, two start-up founders, did choose Ruby (on Rails) without having a broad and deep experience in it, instead of .NET (for me) and Java (for him). My reasoning was that I can get a boatload of things without having to implement it myself. DB migrations that work smoothly out-of-the-box? <a href="http://guides.rubyonrails.org/migrations.html">Check</a>. Solid HTML screen-scraping utilities? <a href="http://nokogiri.org/">Check</a>. Heck, a great web framework ScottGu and the others at DevDiv are using man-years to reimplement in C#? <a href="http://rubyonrails.org">Check</a>. When you do .NET development, you're lucky if you find one OSS library for the thing you're implementing. When using Ruby, you're instead have to choose from the five you've found just by googling quickly. (And I'd rather have to many than too few.) If you don't believe me, check <a href="https://github.com/languages">this list</a> to see an example of how popular Ruby is for developing open-source software.
</p>
<p>
<b>The innovation</b>. As I look around me at the start-up world, both in Malmö and more broadly in the world, I see lots of great software being built in Ruby. This might be due to me being biased by meeting with the <a href="http://malmorb.se/">Malmö Ruby</a> devs at Malmö-Ruby, but still. Being able to be a part of the forefront of software and business development is fun. Cranking out Sharepoint sites and drag-dropping controls to a ASP.NET Webforms page? No thanks.
</p>
<p><b>The culture</b>. In my C# years, I've had to fight with everyone and his/her mother to make sure the software we build include automatic tests. In the Ruby world, a suite of automated regression tests that you can use for keeping safe are more or less standard. Devs actually beg for forgiveness if their test suite isn't in a good state. That's a culture I like.
</p>
<p><b>The deployment</b>. Deploying to Windows servers is a chore. I know, it's getting better with PowerShell and whatnot, but command-line scripting and automated deploys are so much easier to do in the land of *nix. Using capistrano to ssh to a number of servers and update without touching the mouse is a boon.
</p>
<p>
Ok, this list was more or less a brain-dump of what I think of Ruby at the moment. There are of course lots of things I don't like with Ruby and, particularly, Rails. But for me, at this point of my career, I'm glad I'm using Ruby.
</p>
<p>
What's your take? The comments section is open!
</p>Thomas Lhttp://www.blogger.com/profile/01658215829967656886noreply@blogger.com0tag:blogger.com,1999:blog-5821888993463612968.post-11583612484391910992013-02-05T19:06:00.002+01:002013-02-05T19:07:52.293+01:00On RequireJS at lat55<p>A couple of weeks ago I held a presentation about RequireJS at the lat55 user group in Malmö. See below for a 20 minutes long video of my presentation, in Swedish.
</p>
<iframe width="560" height="315" src="http://www.youtube.com/embed/HJqb0f0Leko" frameborder="0" allowfullscreen></iframe>Thomas Lhttp://www.blogger.com/profile/01658215829967656886noreply@blogger.com0tag:blogger.com,1999:blog-5821888993463612968.post-59931076713692612972012-11-05T09:19:00.000+01:002012-11-05T09:21:38.071+01:00On Malmö-Ruby UserGroup<p>There has been rather quiet around UserGroups dealing with Ruby in the Malmö area. In Stockholm, <a href="https://groups.google.com/forum/?hl=sv&fromgroups#!forum/rails-se">SHRUG</a> meets rather regularly, across Öresund we have <a href="http://copenhagenrb.dk/">Copenhagen Ruby Brigade</a>, both rather active, but in Malmö/Lund there's been low (if any) activity.</p>
<p>No longer, though. In October the <a href="http://www.meetup.com/malmo-ruby/">Malmö-Ruby</a> UserGroup was awoken. There was a quick slideshow presentation, which was followed by a walk to Bishop's Arms to get some beer and burgers. In November there's <a href="http://www.meetup.com/malmo-ruby/events/88083112/">another event</a>, which will be hosted by <a href="http://www.softhouse.se/">Softhouse</a>. I'll hold a quick lightning talk about JavaScript in Rails today with the Asset Pipeline. In the talk I'll show how RequireJS can be used to modularize your JavaScript code when dealing with Asset Pipeline.</p>
<p>If you saw <a href="http://blog.thomaslundstrom.com/2012/04/on-my-requirejs-presentation-from.html">my RequireJS presentation</a> at ScanDevConf you will surely recognize some thoughts and ideas.</p>Thomas Lhttp://www.blogger.com/profile/01658215829967656886noreply@blogger.com0tag:blogger.com,1999:blog-5821888993463612968.post-30575093944397036082012-04-22T19:45:00.001+02:002012-11-05T09:20:11.206+01:00On micro-ciSo Softhouse had a kick-off this Friday, and as a social event, we could choose to take part in an open-source project. Me and my colleague <a href="https://twitter.com/#%21/jhkarlsson">Joakim Karlsson</a> have for quite some time thought about the sizes of CI environments, and the rather wacky requirement that you need to run a web server in order to configure the CI server. So we decided to create our own.<br />
Enter <a href="https://github.com/Softhouse/micro-ci">micro-ci</a>. Me and <a href="https://github.com/petterl">Petter</a>, another colleague (Joakim was ill), hacked together a solution built with Ruby in four hours. It's not much right now, but at least it can check a directory tree for changes and call a command-line script to build.<br />
With this blog post, I'm not saying that you should start using micro-ci (but, by all means, do). I'm saying that it's actually quite easy to accomplish a small project that scratches your current itch.Thomas Lhttp://www.blogger.com/profile/01658215829967656886noreply@blogger.com0tag:blogger.com,1999:blog-5821888993463612968.post-19376663484882349492012-04-22T19:29:00.000+02:002012-11-05T09:21:50.728+01:00On my RequireJS presentation from Scandinavian Developer Conference<p>An embedded presentation hosted at SlideShare.</p>
<div style="width:425px" id="__ss_12641009"><strong style="display:block;margin:12px 0 4px"><a href="http://www.slideshare.net/thomaslundstrom/using-requirejs-for-modular-javascript-code" title="Using RequireJS for Modular JavaScript Code">Using RequireJS for Modular JavaScript Code</a></strong><object id="__sse12641009" width="425" height="355"><param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=requirejs-120422122533-phpapp01&stripped_title=using-requirejs-for-modular-javascript-code&userName=thomaslundstrom" /><param name="allowFullScreen" value="true"/><param name="allowScriptAccess" value="always"/><param name="wmode" value="transparent"/><embed name="__sse12641009" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=requirejs-120422122533-phpapp01&stripped_title=using-requirejs-for-modular-javascript-code&userName=thomaslundstrom" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" wmode="transparent" width="425" height="355"></embed></object><div style="padding:5px 0 12px">View more <a href="http://www.slideshare.net/">presentations</a> from <a href="http://www.slideshare.net/thomaslundstrom">Thomas Lundström</a>.</div></div>Thomas Lhttp://www.blogger.com/profile/01658215829967656886noreply@blogger.com0tag:blogger.com,1999:blog-5821888993463612968.post-51033799033995931612012-04-10T11:23:00.001+02:002012-04-10T11:24:00.952+02:00On ScanDev 2012<p>I'll be presenting two talks at <a href="http://www.scandevconf.se">Scandinavian Developer Conference</a> on April 16 and 17: RequireJS for modular JavaScript code and Introducing ASP.NET MVC in Legacy Webforms Applications.</p>
<p>Read more about the talks <a href="http://www.scandevconf.se/2012/conference/speakers/thomas-lundstrom/">here</a>. If you're there, don't hesitate to come and talk to me!</p>
<p>If you won't be able to attend, I'll be posting the presentations here. Stay tuned.</p>Thomas Lhttp://www.blogger.com/profile/01658215829967656886noreply@blogger.com0tag:blogger.com,1999:blog-5821888993463612968.post-67941350899197797292012-02-16T18:11:00.002+01:002012-02-16T18:11:55.906+01:00On DuckDuckGo and search suggestions<p>I like <a href="https://duckduckgo.com/">DuckDuckGo</a> but I don't like that its default Firefox search plugin doesn't support search suggestions. Enter <a href="http://ddgg.nfriedly.com/">Duck Duck Go + Google Suggest Search Plugin</a>.</p>
<p>(Via lifehacker.)</p>Thomas Lhttp://www.blogger.com/profile/01658215829967656886noreply@blogger.com2tag:blogger.com,1999:blog-5821888993463612968.post-78396612032786061452011-09-16T17:33:00.001+02:002011-09-16T17:33:46.499+02:00On Flickr and JSON vs JSONP<p>
I've been playing somewhat with the Flickr API lately since I've been preparing a workshop in introductory jQuery, and the Flickr API is a great example in doing GETs for JSON content. However, the Flickr API returns JSONP instead of JSON by default. A typical response:
</p>
<pre name="code" class="javascript">
jsonFlickrApi({
"photos": {
"page": 1,
"pages": 1033,
"perpage": 100,
"total": "103268",
"photo": [{...}]
}
})
</pre>
<p>In order not to confuse my students, I wanted to start using pure JSON, i.e. letting the response be</p>
<pre name="code" class="javascript">
{
"photos": {
"page": 1,
"pages": 1033,
"perpage": 100,
"total": "103268",
"photo": [{...}]
}
}
</pre>
<p>I couldn't find this in the Flickr API docs, which are rather good, but later I found out that you can append &nojsoncallback=1 to the request URL to accomplish the latter response.</p>Thomas Lhttp://www.blogger.com/profile/01658215829967656886noreply@blogger.com0tag:blogger.com,1999:blog-5821888993463612968.post-51381265330764538562011-09-02T18:13:00.000+02:002011-09-02T18:14:10.378+02:00On design vs. style<p>So, recently I was listening to the <a href="http://thisdeveloperslife.com/post/2-0-4-taste">Style</a> episode of <a href="http://thisdeveloperslife.com/">This Developer's Life</a>, talking about the importance of design. In the beginning, the interviewer talks to a designer working at Microsoft, and it hit me that they, without mentioning it, are talking about the single reason why Apple has fared so well in the marketplace.</p>
<blockquote>
Design is not just what it looks like and feels like. Design is how it works.<br />
- Steve Jobs</blockquote>
<p>Compare the quote from Steve Jobs above to the Microsoft designer talking about colors in the code surface.</p>
<p>Design isn't visuals, it's the entire user experience. If you're only doing a fair job thinking about how the user will actually use your feature, there's no way the user is going to think your product is good even though you put a lot of thought into the color scheme.</p>Thomas Lhttp://www.blogger.com/profile/01658215829967656886noreply@blogger.com0tag:blogger.com,1999:blog-5821888993463612968.post-31163466956786244172011-05-12T09:40:00.001+02:002011-05-30T13:52:32.938+02:00On a Code Kata in Malmö<p>Me and <a href="http://twitter.com/jhkarlsson">Joakim Karlsson</a> are arranging a Code Kata in Malmö. The purpose is to be in "training" mode in order to build knowledge, instead of trying out stuff on a real project. This way we can experiment and reflect on our modelling and designing skills more thoroughly than when we are in a real production code setting.</p><p>If you're interested, go to <a href="http://www.meetup.com/Lean-Tribe/events/18091821/">our meetup event page</a> (in Swedish) and sign up!
</p>Thomas Lhttp://www.blogger.com/profile/01658215829967656886noreply@blogger.com0tag:blogger.com,1999:blog-5821888993463612968.post-65855306523734084392011-05-11T16:33:00.002+02:002011-05-11T16:37:15.880+02:00On Spring MVC running on AppEngine<p>
I've just published a (modified) version of the Google AppEngine Java tutorial which runs using Spring and Spring MVC. Since it was rather tedious to get everything running as it should, I thought it could be spread to the world.
</p><p>Go check it out at <a href="https://github.com/thomaslundstrom/springmvc-gae-guestbook">github</a>! Pull requests are welcome.
</p>Thomas Lhttp://www.blogger.com/profile/01658215829967656886noreply@blogger.com0tag:blogger.com,1999:blog-5821888993463612968.post-34734299215530233062011-04-04T17:08:00.003+02:002011-04-04T17:16:50.444+02:00On my Scandinavian Developer Conference presentation<p>This is the presentation I held on April 4, 2011 at the Scandinavian Developer Conference 2011 in Gothenburg.</p>
<p>
<div style="width:425px" id="__ss_7510545"> <strong style="display:block;margin:12px 0 4px"><a href="http://www.slideshare.net/thomaslundstrom/railsify-your-web-development" title="Railsify your web development">Railsify your web development</a></strong> <iframe src="http://www.slideshare.net/slideshow/embed_code/7510545" width="425" height="355" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe> <div style="padding:5px 0 12px"> View more <a href="http://www.slideshare.net/">presentations</a> from <a href="http://www.slideshare.net/thomaslundstrom">Thomas Lundström</a> </div> </div>
</p>Thomas Lhttp://www.blogger.com/profile/01658215829967656886noreply@blogger.com0tag:blogger.com,1999:blog-5821888993463612968.post-28378101069941093192011-03-30T19:45:00.003+02:002011-03-30T19:52:33.175+02:00On ScanDevConf 2011<p>I haven't remembered to note this on this blog (but I hope you've seen it on <a href="http://twitter.com/thomaslundstrom">my Twitter feed</a>), but I'll do a session on <a href="http://www.scandevconf.se">Scandinavian Developer Conference</a>, which takes place in Gothenburg April 4-5. My session is called "Railsify your web development". In that session I'll try to explain how to become (almost) as effective in your legacy web app development as when you're doing <a href="http://rubyonrails.org">Ruby on Rails</a> development, by using some of the practices Rails developers use.</p><p>I'll make sure I post the presentation from that conference here.
</p><p>If you read this blog, don't hesitate to come talk to me!
</p>Thomas Lhttp://www.blogger.com/profile/01658215829967656886noreply@blogger.com0tag:blogger.com,1999:blog-5821888993463612968.post-17965377786896070732011-01-21T15:59:00.007+01:002011-01-21T16:18:41.345+01:00On upgrading Rails from 2.3.5 to Rails 3 (via 2.3.8)<p>I run a rather small and basic, but functional, web site for me and some friends on Rails. The site has been running on Rails 2.3.5 for a rather lengthy period, but a couple of weeks ago I decided to enter the new era of Rails 3. This is what I had to do in order to get things working.</p>
<p>While still remaining on Rails 2.3.5, I changed the project to use <a href="http://gembundler.com/">Bundler</a> and made sure all of my tests ran well, and added a few extra ones.</p>
<p>I then upgraded to Rails 2.3.8. The upgrade was rather smooth, I didn't get any incompatibilities there, so I made sure everything worked, and then jumped on to the real upgrade, to Rails 3.</p>
<p>In Rails 3, I had trouble with the <a href="https://github.com/mislav/will_paginate">will_paginate</a> gem (solved by upgrading the gem to version 3.0.pre2). I also had problems with <a href="https://github.com/binarylogic/authlogic">Authlogic</a> saying: "undefined method `to_key' for #<usersession:>". I solved this by using the form_for helper change mentioned <a href="http://techoctave.com/c7/posts/37-authlogic-and-rails-3-0-solution">here</a>.</usersession:></p>
<p>Since there are quite a few changes between Rails 2.3 and Rails 3, e.g. the new application.rb, I got help from the plugin rails-upgrade (<a href="http://omgbloglol.com/post/364624593/rails-upgrade-is-now-an-official-plugin">instructions</a>).</p>
<p>In controllers, old root redirects didn't work, i.e.</p><pre name="code" class="ruby">redirect_to root_url</pre>
<p>To solve this, I had to define a named route in routes.rb like so:</p>
<pre name="code" class="ruby">match '/' => 'posts#index', :as => :root</pre>
<p>Then I can use redirect_to like so:</p>
<pre name="code" class="ruby">redirect_to :root</pre>
<p>Rails 3 has removed the markdown view helper method, so I had to use the <a href="https://github.com/dtrasbo/formatize">formatize</a> gem to get this working.</p>
<p>From Rails 3 onwards, all of the stuff output in the views are html escaped. Make sure that you stop escaping the user-generated things, and, more importantly, un-escaping the outputs in the views that should contain regular HTML.</p>
<p>Happy upgrade!</p>Thomas Lhttp://www.blogger.com/profile/01658215829967656886noreply@blogger.com3tag:blogger.com,1999:blog-5821888993463612968.post-87948023649664925772010-09-22T14:41:00.003+02:002010-09-22T14:46:39.173+02:00On my presentation for TelecomCity DevCon<p>This is (a preliminary) version of the presentation on September 23, 2010 at the TelecomCity DevCon 2010 in Karlskrona.</p>
<p><div style="width:425px" id="__ss_5257852"><strong style="display:block;margin:12px 0 4px"><a href="http://www.slideshare.net/thomaslundstrom/bdd-for-web-applications-at-telecomcity-devcon-2010" title="Bdd for Web Applications at TelecomCity DevCon 2010">Bdd for Web Applications at TelecomCity DevCon 2010</a></strong><object id="__sse5257852" width="425" height="355"><param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=bddforwebapplications-100922074006-phpapp01&stripped_title=bdd-for-web-applications-at-telecomcity-devcon-2010&userName=thomaslundstrom" /><param name="allowFullScreen" value="true"/><param name="allowScriptAccess" value="always"/><embed name="__sse5257852" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=bddforwebapplications-100922074006-phpapp01&stripped_title=bdd-for-web-applications-at-telecomcity-devcon-2010&userName=thomaslundstrom" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"></embed></object><div style="padding:5px 0 12px">View more <a href="http://www.slideshare.net/">presentations</a> from <a href="http://www.slideshare.net/thomaslundstrom">Thomas Lundström</a>.</div></div></p>Thomas Lhttp://www.blogger.com/profile/01658215829967656886noreply@blogger.com0tag:blogger.com,1999:blog-5821888993463612968.post-20822803090900527322010-08-13T11:25:00.005+02:002010-08-13T11:32:44.479+02:00On DevCon10<p>In September, I'll speak at <a href="http://www.telecomcity.org/hem/devcon10.aspx">TelecomCity DevCon 2010</a> in Karlskrona, Sweden. My topic is near and dear to me, BDD for Web Applications. I'll show how you'd go about to build a Java web app with the support from BDD, more specifically Cucumber with Java steps. For more information, go <a href="http://www.telecomcity.org/hem/devcon10/forelasare.aspx">here</a> and scroll down to my presentation.</p><p>I hope I'll see you there!</p>Thomas Lhttp://www.blogger.com/profile/01658215829967656886noreply@blogger.com0tag:blogger.com,1999:blog-5821888993463612968.post-62087503377101672942010-04-27T19:56:00.003+02:002010-04-27T20:10:42.951+02:00On Opening Applications from the Terminal in OS X<p>Let's say you have used the Terminal in OS X to navigate to the directory containing a file you want to open with the default program, e.g. the .xcodeproj bundle. How do you open that file?</p><p>It's as simple as 'Open MyApp.xcodeproj'.</p><p>The same goes for when you want to open an app. 'Open MyApp.app'.
</p>Thomas Lhttp://www.blogger.com/profile/01658215829967656886noreply@blogger.com0tag:blogger.com,1999:blog-5821888993463612968.post-72132279160775795362010-04-18T15:03:00.005+02:002010-04-18T15:13:11.220+02:00On RVM<p>Do you happen to run Ruby on your Mac? If so, take 5 minutes and set up <a href="http://rvm.beginrescueend.com/">RVM</a>, the super simple Ruby Version Manager.</p><p>By using RVM, you can install different rubies by using 'rvm install jruby-1.4.0' and switch between them by using 'rvm use jruby-1.4.0'.</p><p>Info on how to install <a href="http://rvm.beginrescueend.com/rvm/install/">here</a>.</p><p>
</p>Thomas Lhttp://www.blogger.com/profile/01658215829967656886noreply@blogger.com0tag:blogger.com,1999:blog-5821888993463612968.post-14678957601969154932010-03-27T13:48:00.001+01:002010-03-27T13:49:04.560+01:00On Process Workarounds<p>In product development in fairly large organizations, there are often rather strict development processes, which sometimes have to be worked around. All such Process Workarounds are evidence of a process that doesn’t fit the organization.</p> <p>Let me give an example. How many times have you heard this conversation?</p> <p>Project manager <br />- May 5th is our feature complete deadline, after that we won't change or create any new features.</p> <p>Developers <br />- All right, then we'll do nothing than fixing bugs prep the release after that</p> <p>Project manager <br />- Oh, but we still have a couple of changes to the functionality after that</p> <p>Developers <br />- But didn't you just say we mustn't develop on features?</p> <p>Project manager <br />- Oh yeah, let's file that as a bug!</p> <p>Developers <br />- ...</p> <p>The reason for the feature complete deadline is a common one in waterfall organizations; there is a lot of fear in the organization about (the previously promised) deadlines and thus the project manager has to promise to his/her steering committee that there won't be any changes to the current feature set. This self-imposed limit to the feature set is then worked around by filing changes as bugs.</p> <p>In this situation I can fully understand the need to have deadlines; it’s very demanding to come to the lean development process where there is flow between the producer and the consumer of a module. However, it’s the workaround that bothers me. Either the change is performed, or it isn’t.</p> <p>To the developers in this situation, my only advice is to learn to say No. When a process workaround is performed, it’s done by people, and people are the ones who can stop it.</p> <p>To any project manager in this situation, my advice is to reflect on the why's of filing this as a bug, and the consequences. If you really need the changed feature, you definitely need to be able to sell the change to the steering committee. If you can't do this, the feature should probably not be implemented. Additionally, by filing the feature as a bug, you poison the defect rate measurements.</p> <div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:fe9d3a42-dd26-4ac0-9b4e-5f8b430a3b94" class="wlWriterEditableSmartContent">Technorati Tags: <a href="http://technorati.com/tags/Thomas+Lundstr%c3%b6m" rel="tag">Thomas Lundström</a>,<a href="http://technorati.com/tags/Agile" rel="tag">Agile</a>,<a href="http://technorati.com/tags/Project+management" rel="tag">Project management</a>,<a href="http://technorati.com/tags/Requirements" rel="tag">Requirements</a></div> Thomas Lhttp://www.blogger.com/profile/01658215829967656886noreply@blogger.com0tag:blogger.com,1999:blog-5821888993463612968.post-40698414758404277912010-03-27T13:25:00.001+01:002010-03-27T13:25:49.634+01:00On BDD for web applications at ScanDevConf 2010<p>The second of two posts on my Scandinavian Developer Conference presentations. (See the first <a href="http://blog.thomaslundstrom.com/2010/03/on-ruby-for-c-ers-at-scandevconf-2010.html">here</a>.)</p> <p>Like the first one, this too is designed to be viewed together with some live demonstrations (in this case, <a href="http://cukes.info/">cucumber</a> + <a href="http://wiki.github.com/brynary/webrat/">webrat</a> executing the requirements against a <a href="http://wicket.apache.org/">Wicket</a> Java web app).</p> <div style="width: 425px" id="__ss_3570634"><strong style="margin: 12px 0px 4px; display: block"><a title="Bdd For Web Applications from Scandinavian Developer Conference 2010" href="http://www.slideshare.net/thomaslundstrom/bdd-for-web-applications-from-scandinavian-developer-conference-2010">Bdd For Web Applications from Scandinavian Developer Conference 2010</a></strong><object width="425" height="355"><param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=bddforwebapplicationsscandevconf2010-100327063628-phpapp01&stripped_title=bdd-for-web-applications-from-scandinavian-developer-conference-2010" /><param name="allowFullScreen" value="true" /><param name="allowScriptAccess" value="always" /><embed src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=bddforwebapplicationsscandevconf2010-100327063628-phpapp01&stripped_title=bdd-for-web-applications-from-scandinavian-developer-conference-2010" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"></embed></object> <div style="padding-bottom: 12px; padding-left: 0px; padding-right: 0px; padding-top: 5px">View more <a href="http://www.slideshare.net/">presentations</a> from <a href="http://www.slideshare.net/thomaslundstrom">thomaslundstrom</a>.</div> </div> <div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:f7dfe42c-949c-436d-ac48-1ea398284cd0" class="wlWriterEditableSmartContent">Technorati Tags: <a href="http://technorati.com/tags/Thomas+Lundstr%c3%b6m" rel="tag">Thomas Lundström</a>,<a href="http://technorati.com/tags/BDD" rel="tag">BDD</a>,<a href="http://technorati.com/tags/Conference" rel="tag">Conference</a>,<a href="http://technorati.com/tags/Requirements" rel="tag">Requirements</a>,<a href="http://technorati.com/tags/ScanDevConf+2010" rel="tag">ScanDevConf 2010</a>,<a href="http://technorati.com/tags/Cucumber" rel="tag">Cucumber</a></div> Thomas Lhttp://www.blogger.com/profile/01658215829967656886noreply@blogger.com0tag:blogger.com,1999:blog-5821888993463612968.post-65042739005535921742010-03-27T12:53:00.001+01:002010-03-27T12:53:01.384+01:00On Ruby for C#-ers at ScanDevConf 2010<p>As I’ve said on <a href="http://twitter.com/thomaslundstrom">Twitter</a>, I’ve done two presentations on the Scandinavian Developer Conference in Gothenburg. As promised (although a tad bit late), this is the first of the presentations; my presentation on Ruby for C#-ers.</p> <p>The presentation is designed to view together with some demos; those aren’t posted here.</p> <div style="width: 425px" id="__ss_3570665"><strong style="margin: 12px 0px 4px; display: block"><a title="Ruby for C#-ers (ScanDevConf 2010)" href="http://www.slideshare.net/thomaslundstrom/ruby-for-cers-scandevconf-2010">Ruby for C#-ers (ScanDevConf 2010)</a></strong><object width="425" height="355"><param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=rubyforc-erssdc2010-100327064309-phpapp02&stripped_title=ruby-for-cers-scandevconf-2010" /><param name="allowFullScreen" value="true" /><param name="allowScriptAccess" value="always" /><embed src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=rubyforc-erssdc2010-100327064309-phpapp02&stripped_title=ruby-for-cers-scandevconf-2010" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"></embed></object> <div style="padding-bottom: 12px; padding-left: 0px; padding-right: 0px; padding-top: 5px">View more <a href="http://www.slideshare.net/">presentations</a> from <a href="http://www.slideshare.net/thomaslundstrom">Thomas Lundström</a>.</div> <div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:fa8ce3b0-9ea1-490d-8a02-bd9c3836e0e4" class="wlWriterEditableSmartContent">Technorati Tags: <a href="http://technorati.com/tags/Thomas+Lundstr%c3%b6m" rel="tag">Thomas Lundström</a>,<a href="http://technorati.com/tags/ScanDevConf+2010" rel="tag">ScanDevConf 2010</a>,<a href="http://technorati.com/tags/sdc2010" rel="tag">sdc2010</a>,<a href="http://technorati.com/tags/IronRuby" rel="tag">IronRuby</a>,<a href="http://technorati.com/tags/Ruby" rel="tag">Ruby</a>,<a href="http://technorati.com/tags/.NET" rel="tag">.NET</a>,<a href="http://technorati.com/tags/ALT.NET" rel="tag">ALT.NET</a>,<a href="http://technorati.com/tags/Conference" rel="tag">Conference</a>,<a href="http://technorati.com/tags/DSL" rel="tag">DSL</a></div> </div> Thomas Lhttp://www.blogger.com/profile/01658215829967656886noreply@blogger.com0tag:blogger.com,1999:blog-5821888993463612968.post-16835924249913652272010-02-14T20:25:00.001+01:002010-02-14T20:25:20.332+01:00On Operational Excellence<p>A quote from <a href="http://www.ineak.com/2009/01/the-toyota-way-using-operational-excellence-as-a-strategic-weapon/">The Toyota Way - Using Operational Excellence as a Strategic Weapon</a>:</p> <blockquote> <p>We place the highest value on actual implementation and taking action. There are many things one doesn’t understand and therefore, we ask them why don’t you just go ahead and take action; try to do something? You realize how little you know and you face your own failures and you simply can correct those failures and redo it again and at the second trial you realize another mistake or another thing you didn’t like so you can redo it once again. So by constant improvement, or, should I say, the improvement based upon action, one can rise to the higher level of practice and knowledge.</p> <p>—Fujio Cho, President, Toyota Motor Corporation, 2002</p> </blockquote> <p>If we compare this to the XP/Agile way of building software, this is more or less the same. Instead of doing <a href="http://en.wikipedia.org/wiki/Big_Design_Up_Front">BDUF</a>, we develop a small slice through the system (Alastair Cockburn calls this pattern “<a href="http://alistair.cockburn.us/Walking+skeleton">Walking Skeleton</a>”; the Pragmatic Programmers call it “<a href="http://www.pragprog.com/the-pragmatic-programmer/extracts/tips">Tracer Bullets</a>”). Then we inspect the way the current implementation works, learn and adapt.</p> <div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:7b376f51-f785-42d4-828e-56aadf2519be" class="wlWriterEditableSmartContent">Technorati Tags: <a href="http://technorati.com/tags/Thomas+Lundstr%c3%b6m" rel="tag">Thomas Lundström</a>,<a href="http://technorati.com/tags/Toyota" rel="tag">Toyota</a>,<a href="http://technorati.com/tags/TPS" rel="tag">TPS</a>,<a href="http://technorati.com/tags/XP" rel="tag">XP</a>,<a href="http://technorati.com/tags/Agile" rel="tag">Agile</a>,<a href="http://technorati.com/tags/BDUF" rel="tag">BDUF</a></div> Thomas Lhttp://www.blogger.com/profile/01658215829967656886noreply@blogger.com0tag:blogger.com,1999:blog-5821888993463612968.post-82267006587716333852009-12-16T18:30:00.001+01:002009-12-16T18:30:42.152+01:00On opening up data<p><a href="http://open.bekk.no/2009/12/13/hva-skjer-nar-man-gir-bort-flydata-gratis/">This</a> (in Norwegian) is a very intriguing article about <a href="http://www.avinor.no/">Avinor</a>, the company that owns and runs Norway’s 46 public airports, and their releasing of flight data to third parties. The data is openly exposed in xml format for anyone to use.</p> <p>The article describes three implications of opening the data:</p> <ul> <li>Better data quality through the eyes of many reviewers (i.e. the public)</li> <li>Collective innovation - services are created using the public data</li> <li>The opinion of Avinor in the public eye is increased</li> </ul> <p>I like this process a lot. The more public data, the more innovation and services for us in the public.</p> <p>Has <a href="http://www.lfv.se">Luftfartsverket</a> (the Swedish equivalent) released their flight data? If not, go ahead and take the plunge!</p> <div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:c00f3e59-ac65-4386-9ac2-39b79574fb64" class="wlWriterEditableSmartContent">Technorati Tags: <a href="http://technorati.com/tags/Thomas+Lundstr%c3%b6m" rel="tag">Thomas Lundström</a>,<a href="http://technorati.com/tags/Biz" rel="tag">Biz</a>,<a href="http://technorati.com/tags/Community" rel="tag">Community</a></div> Thomas Lhttp://www.blogger.com/profile/01658215829967656886noreply@blogger.com0tag:blogger.com,1999:blog-5821888993463612968.post-5122974241051973912009-11-18T18:21:00.001+01:002009-11-18T18:21:15.799+01:00On the Twitter retweet feature<p><a href="http://lh6.ggpht.com/_9Os8Bt-P6JQ/SwQtCCQdgMI/AAAAAAAAAI8/oXy6ELu6lq8/s1600-h/3736077839_562764afcd%5B3%5D.jpg"><img style="border-bottom: 0px; border-left: 0px; border-top: 0px; border-right: 0px" border="0" alt="3736077839_562764afcd" align="right" src="http://lh5.ggpht.com/_9Os8Bt-P6JQ/SwQtCh4uhHI/AAAAAAAAAJA/jafTgS24L0s/3736077839_562764afcd_thumb%5B1%5D.jpg?imgmax=800" width="217" height="244" /></a> So you might have heard about Twitter <a href="http://blog.twitter.com/2009/08/project-retweet-phase-one.html">implementing</a> a <a href="http://blog.twitter.com/2009/11/retweet-limited-rollout.html">retweet</a> feature in its API. The reason is that today there are a number of different ways to retweet, and Twitter wants to clean up the UI and usage. I think it's a bad decision. Twitter is changing the structure of its entities in order to support the new feature.</p> <p>In my mind, the thing that makes a Unix system work so well for the power user is that there are a large amount of different programs that can be combined using only a standard text format between each other. I'd like Twitter to work the same. If everyone agreed upon how a retweet would look, then the different clients could collapse the UI so that no one got a Retweet-storm, wherein one tweet is retweeted by twenty of your friends. That's the Unix way to solving the problem.</p> <p>(<a href="http://www.flickr.com/photos/jacquedavis/3736077839/">Image credits</a>)</p> <div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:e06fb705-6250-482a-a767-ba9adfdcb3a1" class="wlWriterSmartContent">Technorati Tags: <a href="http://technorati.com/tags/Twitter" rel="tag">Twitter</a>,<a href="http://technorati.com/tags/Thomas%20Lundstr%c3%b6m" rel="tag">Thomas Lundström</a></div> Thomas Lhttp://www.blogger.com/profile/01658215829967656886noreply@blogger.com0tag:blogger.com,1999:blog-5821888993463612968.post-8751905862409219902009-11-14T11:08:00.001+01:002009-11-14T11:20:20.694+01:00On migrations<p><a href="http://codebetter.com/blogs/aaron.jensen/">Aaron Jensen</a> recently asked <a href="http://codebetter.com/blogs/aaron.jensen/archive/2009/10/24/machine-migrations-changes.aspx">what migrations tools people use</a> for .NET development. In my current project, I use <a href="http://code.google.com/p/migratordotnet/">MigratorDotNet</a>, which works quite well for us. The standard types of migrations, like add table, add column, add fk, are there, but if you need to do something more advanced, there's always a possibility to execute the SQL raw against the database.</p> <p>What tool do <em>you</em> use to handle the database during development?</p> <div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:f3ff4bdf-2b7d-4290-8fef-14aa1a1b1eca" class="wlWriterSmartContent">Technorati Tags: <a href="http://technorati.com/tags/Thomas%20Lundstr%c3%b6m" rel="tag">Thomas Lundström</a>,<a href="http://technorati.com/tags/ALT.NET" rel="tag">ALT.NET</a>,<a href="http://technorati.com/tags/Migrations" rel="tag">Migrations</a>,<a href="http://technorati.com/tags/MigratorDotNet" rel="tag">MigratorDotNet</a>,<a href="http://technorati.com/tags/.NET" rel="tag">.NET</a></div> Thomas Lhttp://www.blogger.com/profile/01658215829967656886noreply@blogger.com1