<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;AkMBSHk9cCp7ImA9WhRUFUk.&quot;"><id>tag:blogger.com,1999:blog-11485756</id><updated>2012-01-26T04:27:39.768+01:00</updated><category term="ruby" /><category term="viaboxx" /><category term="javazone" /><category term="wiki" /><category term="blogger" /><category term="agile" /><category term="java" /><category term="git" /><category term="cms" /><category term="spring" /><category term="stuff" /><category term="portal" /><category term="iplabs" /><category term="maven" /><category term="objectware" /><category term="jazoon" /><category term="blogging" /><category term="guava" /><category term="git-svn" /><title>Thomas Ferris Nicolaisen's blog</title><subtitle type="html">My thoughts on software development.</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://blog.tfnico.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://blog.tfnico.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/11485756/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>Thomas Ferris Nicolaisen</name><uri>https://profiles.google.com/101470099289717563604</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-MH85nZaMLeo/AAAAAAAAAAI/AAAAAAAABO8/cZT0o_8utuc/s512-c/photo.jpg" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>205</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/tfnico" /><feedburner:info uri="tfnico" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:browserFriendly>This is an XML content feed. It is intended to be viewed in a newsreader or syndicated to another site, subject to copyright and fair use.</feedburner:browserFriendly><entry gd:etag="W/&quot;AkAFRXsyfyp7ImA9WhRXGEg.&quot;"><id>tag:blogger.com,1999:blog-11485756.post-8888575207446153305</id><published>2011-12-26T01:18:00.001+01:00</published><updated>2011-12-26T01:18:34.597+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-12-26T01:18:34.597+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="git-svn" /><title>Git-SVN mirror product: SubGit</title><content type="html">Just a quick mention for you people who can't be bothered with &lt;a href="http://www.tfnico.com/presentations/git-and-subversion"&gt;my somewhat intricate Git-SVN mirror setup&lt;/a&gt;, there now is a now is a solution packed into a product: &lt;a href="http://subgit.com/"&gt;SubGit&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
I tried it out on a little local SVN repo recently, and it worked just fine. It delivered pretty much perfect two-way syncing/bi-directional mirror (which I've earlier &lt;a href="http://blog.tfnico.com/2011/03/dream-of-bi-directional-git-svn-mirror.html"&gt;deemed to be very impractical with git-svn&lt;/a&gt;).&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;The bad parts are:&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;It's new (use at your own risk, in other words: DO NOT install it in your main-line subversion repo used by a 100 devs).&lt;/li&gt;
&lt;li&gt;It's closed source, so you're at the mercy of the SubGit devs for fixing any feature that you need in your &lt;i&gt;special&lt;/i&gt; repository.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;It requires instrumentation on the Subversion repository installation. If the repository is beyond your control (hosted externally, or by some separate department), you're stuck with &lt;a href="http://www.tfnico.com/presentations/git-and-subversion"&gt;my old setup&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;b&gt;The good parts:&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;Super-sweet functionality! I mean, bi-directional Git/SVN is highly sought after.&lt;/li&gt;
&lt;li&gt;Seems to have a pretty high *just-works* factor, easy setup.&lt;/li&gt;
&lt;li&gt;It's still free (as long as they're in the EAP phase)&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11485756-8888575207446153305?l=blog.tfnico.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/tfnico?a=nxm33lFl-1g:HlNv2UmtH1o:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/tfnico?i=nxm33lFl-1g:HlNv2UmtH1o:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/tfnico/~4/nxm33lFl-1g" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.tfnico.com/feeds/8888575207446153305/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.tfnico.com/2011/12/git-svn-mirror-product-subgit.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/11485756/posts/default/8888575207446153305?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/11485756/posts/default/8888575207446153305?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/tfnico/~3/nxm33lFl-1g/git-svn-mirror-product-subgit.html" title="Git-SVN mirror product: SubGit" /><author><name>Thomas Ferris Nicolaisen</name><uri>https://profiles.google.com/101470099289717563604</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-MH85nZaMLeo/AAAAAAAAAAI/AAAAAAAABO8/cZT0o_8utuc/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.tfnico.com/2011/12/git-svn-mirror-product-subgit.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUcHR30_fCp7ImA9WhRXFk0.&quot;"><id>tag:blogger.com,1999:blog-11485756.post-8993427137723361698</id><published>2011-12-15T13:37:00.003+01:00</published><updated>2011-12-23T02:17:16.344+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-12-23T02:17:16.344+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="guava" /><title>Google Guava's Predicates</title><content type="html">So the other day I was working away on some rather tricky rules for validating an incoming identifier code. Like&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;999392304II+TJAJEIAJTI901119&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;EPFOOMNNVLLALOWEIITOE&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Now, the system where this code is going is rather picky about what these codes should look like. (For the sake of this blog-post, I'll invent some business rules here on the fly, in reality they are a bit different, but the nature of them are the same):&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;A code cannot be null, or&amp;nbsp;an empty string (of course)&lt;/li&gt;
&lt;li&gt;If there are only letters (A-Z) in the code, it must be longer than 10 characters, but fewer than 20&lt;/li&gt;
&lt;li&gt;On the other hand, if there are letters mixed with numbers, it must be exactly 10 or 15 characters&lt;/li&gt;
&lt;li&gt;Numbers only are not allowed&lt;/li&gt;
&lt;li&gt;No other symbols are allowed, but + signs are allowed, if the code starts with 999. In this case, the max length is 10.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
Instead of just going straight for the if-else'ing my way through these rules, I implemented it using &lt;a href="http://guava-libraries.googlecode.com/svn/trunk/javadoc/com/google/common/base/Predicates.html"&gt;Predicates&lt;/a&gt; from &lt;a href="http://code.google.com/p/guava-libraries/"&gt;Google Guava&lt;/a&gt;. I was pretty happy with the result, and wanted to put it up against what the classic solution would look like.&lt;br /&gt;
&lt;br /&gt;
I've created &lt;a href="https://github.com/tfnico/guava-predicates"&gt;a little project on Github&lt;/a&gt; that demonstrates the above rules. There are two branches:&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;ifelse&lt;/b&gt; - &amp;nbsp;The old imperative way, using if's and else's&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;predicate&lt;/b&gt; - The new functional way, using predicates&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
Both branches pass the same test suite. I won't swear on the correctness of the implementation, as it's currently 01:59 in the night, and the tests aren't really extensive.&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Performance is not a big thing in this validation function. We're dealing with codes that come in every few seconds, so we've got plenty of milliseconds to spend on making the code look as nice as possible. Also, my regexp sucks, I know.&lt;br /&gt;
&lt;br /&gt;
Here's a quick look of what I ended up with using if's and else's:&lt;/div&gt;
&lt;div&gt;
(&lt;a href="https://github.com/tfnico/guava-predicates/blob/ifelse/src/main/java/com/tfnico/examples/guava/predicates/BusinessRules.java"&gt;Source on Github&lt;/a&gt;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;script src="https://gist.github.com/1512455.js?file=ifelse.java"&gt;
&lt;/script&gt;
&lt;br /&gt;
&lt;div&gt;
And here's using predicates:&lt;br /&gt;
(&lt;a href="https://github.com/tfnico/guava-predicates/blob/predicates/src/main/java/com/tfnico/examples/guava/predicates/BusinessRules.java"&gt;Source on Github&lt;/a&gt;)&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;script src="https://gist.github.com/1512455.js?file=predicates.java"&gt;
&lt;/script&gt;
&lt;br /&gt;
&lt;div&gt;
In order to really appreciate the differences, it's best to have a look at the whole classes on Github. It's a Maven project, so you can import it into IDEA or Eclipse, and use Git to jump between the two branches for comparison.&lt;br /&gt;
&lt;br /&gt;
I'm not saying that the predicates way is easier to read or write, but there is something functional and declarative about it that feels kind of.. powerful. A nice thing about those predicates is that they can easily be combined with eachother, and re-used in other places, like in filtering collections using other Guava utils.&lt;br /&gt;
&lt;br /&gt;
Note that the full predicate style solution is much larger, but much to blame are those base-predicates I'm defining for saying matching, shorterThan, longerThan and exactLength.&lt;br /&gt;
&lt;br /&gt;
If we were dealing with a language that properly supported functions (a predicate is a function that evalutes to true/false), it would probably look a lot nicer. Perhaps with Java 8, I can slim down the code quite a bit..&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
I just read that the Guava developers are going to include new fluent interfaces for combining predicates in a more elegant way, than the prefix style I've used above. Maybe something like&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp;new FluentPredicate().not(NULL_OR_EMPTY).and(ONLY_LETTERS).build().&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
Read more &lt;a href="http://code.google.com/p/guava-libraries/issues/detail?id=11"&gt;here about FluentPredicates&lt;/a&gt;, etc. They can't be too far away, release-wise.&lt;br /&gt;
&lt;br /&gt;
For other Guava resources, check out &lt;a href="http://www.tfnico.com/presentations/google-guava"&gt;my collection here&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11485756-8993427137723361698?l=blog.tfnico.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/tfnico?a=GB__zS26Uws:evlQbEnk9Zs:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/tfnico?i=GB__zS26Uws:evlQbEnk9Zs:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/tfnico/~4/GB__zS26Uws" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.tfnico.com/feeds/8993427137723361698/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.tfnico.com/2011/12/google-guavas-predicates.html#comment-form" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/11485756/posts/default/8993427137723361698?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/11485756/posts/default/8993427137723361698?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/tfnico/~3/GB__zS26Uws/google-guavas-predicates.html" title="Google Guava's Predicates" /><author><name>Thomas Ferris Nicolaisen</name><uri>https://profiles.google.com/101470099289717563604</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-MH85nZaMLeo/AAAAAAAAAAI/AAAAAAAABO8/cZT0o_8utuc/s512-c/photo.jpg" /></author><thr:total>2</thr:total><feedburner:origLink>http://blog.tfnico.com/2011/12/google-guavas-predicates.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A08NRXcyfCp7ImA9WhRTFkw.&quot;"><id>tag:blogger.com,1999:blog-11485756.post-1182008227010142182</id><published>2011-11-06T23:51:00.002+01:00</published><updated>2011-11-06T23:51:34.994+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-11-06T23:51:34.994+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="git" /><title>Some thoughts on Git vs complexity</title><content type="html">&lt;br /&gt;
&lt;div style="background-attachment: initial; background-clip: initial; background-color: white; background-image: initial; background-origin: initial; margin-bottom: 8px; margin-left: 8px; margin-right: 8px; margin-top: 8px;"&gt;
&lt;div style="font-family: Arial, Helvetica, sans-serif; font-size: 13px;"&gt;
I originally&amp;nbsp;&lt;a _mce_href="https://groups.google.com/d/msg/git-users/BCg1if7fDJU/pt-9yF51PzUJ" href="https://groups.google.com/d/msg/git-users/BCg1if7fDJU/pt-9yF51PzUJ"&gt;wrote this&lt;/a&gt;&amp;nbsp;in the Git For Human Beings mailing list.&amp;nbsp;The thoughts are stolen from Rich Hickey's &lt;a href="http://www.infoq.com/presentations/Simple-Made-Easy"&gt;Simple Made Easy talk&lt;/a&gt;. (Matthew McCullough&amp;nbsp;&lt;a _mce_href="http://agile.dzone.com/polls/poll-has-git-won-version#comment-58515" href="http://agile.dzone.com/polls/poll-has-git-won-version#comment-58515"&gt;commented the same parallel&lt;/a&gt;&amp;nbsp;the same day, but I think his timestamp was a few hours afterwards). I wanted to tweet about it, but it ended up being a whole post, as I'm trying to gather my thoughts on it for &lt;a href="http://blog.tfnico.com/2011/11/presenting-git-on-windows-at-next-bonn.html"&gt;my next Git talk&lt;/a&gt;.&lt;/div&gt;
&lt;div style="font-family: Arial, Helvetica, sans-serif; font-size: 13px;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="font-family: Arial, Helvetica, sans-serif; font-size: 13px;"&gt;
&lt;/div&gt;
&lt;div style="font-family: Arial, Helvetica, sans-serif; font-size: 13px;"&gt;
&lt;b&gt;There's simple stuff, and there's easy stuff.&lt;/b&gt;&lt;/div&gt;
&lt;div style="font-family: Arial, Helvetica, sans-serif; font-size: 13px;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="font-family: Arial, Helvetica, sans-serif; font-size: 13px;"&gt;
Simple means the opposite of complex. Easy, on the other hand, means it's very close to the stuff you already know. Git is "simple" but hard. Subversion is "easy", but eventually complex.&lt;/div&gt;
&lt;div style="font-family: Arial, Helvetica, sans-serif; font-size: 13px;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="font-family: Arial, Helvetica, sans-serif; font-size: 13px;"&gt;
Git is *a lot* of features in one tool (think of the 100+ git plumbing commands). Each feature is simple, but learning to use them together is good bit of work. As soon as you've understood the model and you get that Eureka-moment, the tool never fails you, and you find it more and more fun to use the more you learn. (This is why there are so many git enthusiasts, I reckon.)&lt;/div&gt;
&lt;div style="font-family: Arial, Helvetica, sans-serif; font-size: 13px;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="font-family: Arial, Helvetica, sans-serif; font-size: 13px;"&gt;
Subversion has a very limited set of features.It also turns awfully complex when you want to do stuff like merging. Actually the more I learned about Subversion, and the more I used it, the more frustrating I found it.&lt;/div&gt;
&lt;div style="font-family: Arial, Helvetica, sans-serif; font-size: 13px;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="font-family: Arial, Helvetica, sans-serif; font-size: 13px;"&gt;
&lt;/div&gt;
&lt;div style="font-family: Arial, Helvetica, sans-serif; font-size: 13px;"&gt;
&lt;b&gt;Why is Subversion complex?&lt;/b&gt;&lt;/div&gt;
&lt;div style="font-family: Arial, Helvetica, sans-serif; font-size: 13px;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="font-family: Arial, Helvetica, sans-serif; font-size: 13px;"&gt;
- Because the stuff on the server is something different from what you have locally. Your local checkout is just a thin skin. All the interaction goes over the network with a really thin and crappy API. It’s like reading a book using binoculars. The same information is there, but it’s horrible to get at it.&lt;/div&gt;
&lt;div style="font-family: Arial, Helvetica, sans-serif; font-size: 13px;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="font-family: Arial, Helvetica, sans-serif; font-size: 13px;"&gt;
- Everybody is tangled together using the same repository. People start making mistakes like committing without updating first. Everyone mis-use trunk as their own sandbox. This is complexity too (everything in one bucket).&lt;/div&gt;
&lt;div style="font-family: Arial, Helvetica, sans-serif; font-size: 13px;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="font-family: Arial, Helvetica, sans-serif; font-size: 13px;"&gt;
- It mixes together committing, and pushing the changes to central. A commit should do one thing, and one thing well, and the reasoning should be in the commit message. Some are refactorings, others are feature-changes.&lt;/div&gt;
&lt;div style="font-family: Arial, Helvetica, sans-serif; font-size: 13px;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="font-family: Arial, Helvetica, sans-serif; font-size: 13px;"&gt;
- Because branches are completely disconnected - there’s nothing that ties them together, except being a lot like each other. That’s how merging in Subversion works: “I assume that these two directories will be very similar”, and if they aren’t, BOOM.&lt;/div&gt;
&lt;div style="font-family: Arial, Helvetica, sans-serif; font-size: 13px;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif; font-size: x-small;"&gt;&lt;b&gt;Git, on the other hand, is simple: It all boils down to being three kinds of objects in a graph (commits, blobs, trees), and the rest of it are algorithms that work this data-structure.&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11485756-1182008227010142182?l=blog.tfnico.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/tfnico?a=SxtEMjGjJwc:IHe-XzqAHlo:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/tfnico?i=SxtEMjGjJwc:IHe-XzqAHlo:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/tfnico/~4/SxtEMjGjJwc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.tfnico.com/feeds/1182008227010142182/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.tfnico.com/2011/11/some-thoughts-on-git-vs-complexity.html#comment-form" title="6 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/11485756/posts/default/1182008227010142182?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/11485756/posts/default/1182008227010142182?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/tfnico/~3/SxtEMjGjJwc/some-thoughts-on-git-vs-complexity.html" title="Some thoughts on Git vs complexity" /><author><name>Thomas Ferris Nicolaisen</name><uri>https://profiles.google.com/101470099289717563604</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-MH85nZaMLeo/AAAAAAAAAAI/AAAAAAAABO8/cZT0o_8utuc/s512-c/photo.jpg" /></author><thr:total>6</thr:total><feedburner:origLink>http://blog.tfnico.com/2011/11/some-thoughts-on-git-vs-complexity.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkQGSH05fyp7ImA9WhRSFkg.&quot;"><id>tag:blogger.com,1999:blog-11485756.post-5560495894934073917</id><published>2011-11-05T21:48:00.002+01:00</published><updated>2011-11-19T00:18:49.327+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-11-19T00:18:49.327+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="git" /><title>Presenting Git on Windows at the next Bonn-to-Code.net meeting</title><content type="html">&lt;b&gt;Update 18.11.2011: Due to &lt;a href="http://www.bonn-to-code.net/1883.aspx"&gt;Gad J. Meir visiting Bonn-to-Code.net&lt;/a&gt; all the way from Israel, we've postponed our talks that were planned for the 28th of November. Most likely I'll be doing the talk near the end of January next year instead.&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
It's been a while since I ran Visual Studio on my laptop. In my early university-college days, around ten years ago, &lt;a href="http://en.wikipedia.org/wiki/.NET_Framework#History"&gt;.NET&lt;/a&gt; was just coming out of the oven. We learned algorithms and data-structures doing Java, but when it came down to actual application development, desktop- and web, connecting GUI's with databases, .NET was the thing.&lt;br /&gt;
&lt;br /&gt;
I liked it. It was bit of an eye-opener for me, that I could actually use programming for building useful stuff, and not just fantasize about being a game developer.&lt;br /&gt;
&lt;br /&gt;
Later on, I fell back into the Java/J2EE world, and rode there for a while. While working for &lt;a href="http://blog.tfnico.com/search/label/objectware"&gt;Objectware&lt;/a&gt;'s Java department, it was always interesting to see what the .NET department was up to, and while they were part of them evil scheme of Microsoft's technology lock-in, they were mighty productive in certain domains.&lt;br /&gt;
&lt;br /&gt;
So, the reason I'm installing Visual Studio again is this: The &lt;a href="http://www.bonn-to-code.net/1883.aspx"&gt;Bonn-to-Code.Net meeting on the 29th of November&lt;/a&gt;. I'll be showing off how to get Git working in the hands of a .NET developer.&lt;br /&gt;
&lt;br /&gt;
My employer,&amp;nbsp;&lt;a href="http://www.viaboxxsystems.de/"&gt;Viaboxx Systems&lt;/a&gt; was kind enough to sponsor me with three &lt;a href="http://www.amazon.de/Git-Verteilte-Versionsverwaltung-Code-Dokumente/dp/3941841424/ref=sr_1_1?ie=UTF8&amp;amp;qid=1320268519&amp;amp;sr=8-1"&gt;German Git books&lt;/a&gt; I can give away at the event. Hint: Asking questions might result in a free book!&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://p.twimg.com/AdZrNuoCEAIpBg9.jpg:large" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="https://p.twimg.com/AdZrNuoCEAIpBg9.jpg:large" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Those who follow this blog know I'm actually a Mac/Linux user, so it's actually been quite a lot of research for me into finding the right Git tools to use on Windows and how to use them. Here are the things I hope to show off (with actual live demos!):&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://code.google.com/p/msysgit/"&gt;msysgit&lt;/a&gt; (of course) and some Git basics&lt;/li&gt;
&lt;li&gt;PowerShell integration with &lt;a href="https://github.com/dahlbyk/posh-git"&gt;posh-git&lt;/a&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Visual Studio integration with&amp;nbsp;&lt;a href="http://code.google.com/p/gitextensions/"&gt;GitExtensions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://code.google.com/p/tortoisegit/"&gt;TortoiseGit&lt;/a&gt; (quick mention)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://github.com/"&gt;GitHub&lt;/a&gt; interaction&lt;/li&gt;
&lt;li&gt;&lt;a href="http://gitblit.com/"&gt;Gitblit&lt;/a&gt; (Windows-friendly&amp;nbsp;git repository serving)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.tfnico.com/presentations/git-and-subversion"&gt;git-svn&lt;/a&gt; (for those who want to convert)&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
If you're planning on attending the talk, I'd love to hear any background or expectations you have. If you're undecided on attending, be aware that I just finished Scott Berkun's &lt;a href="http://www.amazon.com/Confessions-Public-Speaker-Scott-Berkun/dp/0596801998"&gt;Confessions of a Public Speaker&lt;/a&gt;, so I know all the tricks of the trade now! Additionally, &lt;a href="http://www.tfnico.com/presentations"&gt;I've spoken a bunch of times before&lt;/a&gt;, some of which are recorded if you're curious what my talks are like. I promise an action-packed and dynamic talk with zero slides.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11485756-5560495894934073917?l=blog.tfnico.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/tfnico?a=yisGoM0cx9w:zsOJXWVQgus:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/tfnico?i=yisGoM0cx9w:zsOJXWVQgus:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/tfnico/~4/yisGoM0cx9w" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.tfnico.com/feeds/5560495894934073917/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.tfnico.com/2011/11/presenting-git-on-windows-at-next-bonn.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/11485756/posts/default/5560495894934073917?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/11485756/posts/default/5560495894934073917?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/tfnico/~3/yisGoM0cx9w/presenting-git-on-windows-at-next-bonn.html" title="Presenting Git on Windows at the next Bonn-to-Code.net meeting" /><author><name>Thomas Ferris Nicolaisen</name><uri>https://profiles.google.com/101470099289717563604</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-MH85nZaMLeo/AAAAAAAAAAI/AAAAAAAABO8/cZT0o_8utuc/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.tfnico.com/2011/11/presenting-git-on-windows-at-next-bonn.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A04BSXs9eip7ImA9WhdaE0Q.&quot;"><id>tag:blogger.com,1999:blog-11485756.post-5569750690021906434</id><published>2011-10-23T21:59:00.001+02:00</published><updated>2011-10-23T21:59:18.562+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-10-23T21:59:18.562+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="stuff" /><title>Be a Good Audience</title><content type="html">&lt;br /&gt;
So I'm sitting here reading Scott Berkun's&amp;nbsp;&lt;a href="http://shop.oreilly.com/product/9780596802004.do"&gt;Confessions of a Public Speaker&lt;/a&gt;, pretty good book by the way (from the Viaboxx library). I'm just through the chapter about "Working a hard room".&lt;br /&gt;
&lt;br /&gt;
And then it hits me:&amp;nbsp;&lt;i&gt;I actually spend an effort being a good audience at talks&lt;/i&gt;. I go to the odd conference and user-group meeting, and whoever is speaking, and even if the talk is not hitting home with me, I always try to...&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Sit down in the middle, close to the speakers where they can see my face&lt;/li&gt;
&lt;li&gt;Focus my full attention on them - no smartphone/laptop&lt;/li&gt;
&lt;li&gt;React to what they're saying with my face, friendly smile when they say something smart, raise my eyebrowsand smile &amp;nbsp;when they say something surprising&lt;/li&gt;
&lt;li&gt;Laugh at their jokes (I mean, not fake laugh, but be open to laugh)&lt;/li&gt;
&lt;li&gt;Ask questions when I wonder about something&lt;/li&gt;
&lt;li&gt;Hold my criticism till after the talk, if any, and give it in person&lt;/li&gt;
&lt;li&gt;Think about and note any questions I'd like to ask in the Q&amp;amp;A&lt;/li&gt;
&lt;/ul&gt;
A good speaker/talk summons this behavior in the audience naturally, but I also give an effort in the not-so-good talks.&lt;br /&gt;
&lt;br /&gt;
I do this because when I'm up there speaking myself, I would like to get the same behavior. A more involved audience makes my talk better, and gives more value back to them in the end.&lt;br /&gt;
&lt;br /&gt;
PS: My next talk is presenting "Git for Windows users" at the Bonn .Net user group, &lt;a href="http://www.bonn-to-code.net/"&gt;Bonn-to-code.net&lt;/a&gt;, 29th of November.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11485756-5569750690021906434?l=blog.tfnico.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/tfnico?a=TeISZCosAyM:ogKA7p3lsno:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/tfnico?i=TeISZCosAyM:ogKA7p3lsno:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/tfnico/~4/TeISZCosAyM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.tfnico.com/feeds/5569750690021906434/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.tfnico.com/2011/10/be-good-audience.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/11485756/posts/default/5569750690021906434?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/11485756/posts/default/5569750690021906434?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/tfnico/~3/TeISZCosAyM/be-good-audience.html" title="Be a Good Audience" /><author><name>Thomas Ferris Nicolaisen</name><uri>https://profiles.google.com/101470099289717563604</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-MH85nZaMLeo/AAAAAAAAAAI/AAAAAAAABO8/cZT0o_8utuc/s512-c/photo.jpg" /></author><thr:total>1</thr:total><feedburner:origLink>http://blog.tfnico.com/2011/10/be-good-audience.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DU4MQH49eyp7ImA9WhdUFko.&quot;"><id>tag:blogger.com,1999:blog-11485756.post-4244651030071481669</id><published>2011-10-03T23:39:00.001+02:00</published><updated>2011-10-03T23:39:41.063+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-10-03T23:39:41.063+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="agile" /><title>Why Releasing More Frequently is Good For You</title><content type="html">So I was thinking a bit about frequent releases. There are many agile books and articles that explain how more frequent releases are a good thing. However, to many people in management, this is counter-intuitive. They say "Slow means safe. Slowing down means more time to improve quality, more time to test, and more time to fix bugs. Also slow is cheaper, because it's less overhead costs." I've seen a lot of projects where release frequency slows down, especially after the initial development burst and launch of a product, and I think this is a shame.&lt;br /&gt;
&lt;br /&gt;
So how do I go about explaining people that the slow-means-safe line of thought is wrong?&lt;br /&gt;
&lt;br /&gt;
I've come up with a little model I'd like to go through here.&lt;br /&gt;
&lt;br /&gt;
I start off with defining a&amp;nbsp;&lt;b&gt;Rate of Development&lt;/b&gt;, which we'll assume is constant throughout the model (leaving out factors as motivation and skill).&lt;br /&gt;
&lt;br /&gt;
Now, having a high rate of development is not worth anything if we're not &lt;b&gt;Doing&lt;/b&gt;&amp;nbsp;t&lt;b&gt;he Right Thing&lt;/b&gt;. This symbolizes working in the right direction, and our &lt;b&gt;Performance &lt;/b&gt;ultimately is decided by Doing the Right Thing at our Rate of Development. Performance represents the long term success of our organization.&lt;br /&gt;
&lt;br /&gt;
&lt;div style="text-align: center;"&gt;
So so far we've got &lt;i&gt;RoD x DtRT =&amp;gt; Performance&lt;/i&gt;&lt;/div&gt;
&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-M5AZZOw1BO8/ToolfYkwzTI/AAAAAAAABcE/iquGg4YULjQ/s1600/dtrt-perf.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="230" src="http://3.bp.blogspot.com/-M5AZZOw1BO8/ToolfYkwzTI/AAAAAAAABcE/iquGg4YULjQ/s400/dtrt-perf.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
Now we won't pick at the RoD in this model (assumed to be constant), but rather look at DtRT: Doing the Right Thing encompasses all the hundred little decisions we make every day, from whether or not we should rename this method, which OS we choose on our servers, to which feature we choose to develop. So what tells us what is the right thing to do? Answer: &lt;b&gt;Feedback&lt;/b&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;div style="text-align: center;"&gt;
&lt;i&gt;Feedback =&amp;gt; DtRT&lt;/i&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-HH85j1QrUd8/Tool76vsyxI/AAAAAAAABcI/BLBI4b3fRQs/s1600/fb-dtrt.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="193" src="http://1.bp.blogspot.com/-HH85j1QrUd8/Tool76vsyxI/AAAAAAAABcI/BLBI4b3fRQs/s400/fb-dtrt.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style="text-align: center;"&gt;
&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;
&lt;br /&gt;
Feedback comes from customer (support, sales, social media), developers (retrospectives, standups), monitoring metrics and logs on the product, doing user experience testing, market response and stuff like that. This feedback gives us the intelligence we need to Do the Right Thing.&lt;br /&gt;
&lt;br /&gt;
How can we increase Feedback? Answer: With more &lt;b&gt;Frequent Releases&lt;/b&gt;. This is fairly intuitive, releasing more frequently will increase the mass of Feedback in most channels.&lt;br /&gt;
&lt;br /&gt;
&lt;div style="text-align: center;"&gt;
&lt;i&gt;Frequent Releases =&amp;gt; Feedback&lt;/i&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-Qg2FaI1rLD8/ToonDrgZlkI/AAAAAAAABcM/2x40jtVkEfE/s1600/fr-fb.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://2.bp.blogspot.com/-Qg2FaI1rLD8/ToonDrgZlkI/AAAAAAAABcM/2x40jtVkEfE/s320/fr-fb.png" width="211" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style="text-align: center;"&gt;
&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;
&lt;br /&gt;
At this point traditional management will cross their arms and say hold on, it's not that easy: We can't risk releasing more often, it's too dangerous. So, let us consider &lt;b&gt;Safety&lt;/b&gt;&lt;i style="font-weight: bold;"&gt;&amp;nbsp;&lt;/i&gt;as a parameter for that.&lt;br /&gt;
&lt;br /&gt;
&lt;div style="text-align: center;"&gt;
&lt;i&gt;Safety =&amp;gt; Frequent Releases&lt;/i&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-UxZe9bK9TyY/TooniKMGKnI/AAAAAAAABcQ/yxMwa4Exz1I/s1600/s-fr.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="275" src="http://1.bp.blogspot.com/-UxZe9bK9TyY/TooniKMGKnI/AAAAAAAABcQ/yxMwa4Exz1I/s320/s-fr.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style="text-align: center;"&gt;
&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;
&lt;br /&gt;
Safety means no nasty bugs or deployment botches.&amp;nbsp;The problem with management is that they mix up what is the cause of the effect here. They see Frequent Releases as a driver for Safety going down, while in reality it is on the other side the factors lie.&lt;br /&gt;
&lt;br /&gt;
So let's dig a bit deeper and see what leads to Safety. Here are the typical factors:&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Tests&lt;/b&gt;&amp;nbsp;(automated tests, unit-, integration-, as well as manual testing where necessary)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Good Code &lt;/b&gt;(fewer unexpected side-effects from making changes)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Small Feature Set&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-0oEZi97Kyic/Toon8YLEh-I/AAAAAAAABcU/OmUpst4LfDg/s1600/s.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="245" src="http://1.bp.blogspot.com/-0oEZi97Kyic/Toon8YLEh-I/AAAAAAAABcU/OmUpst4LfDg/s320/s.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
The first two there are fairly obvious. The last one is a pill management has a hard time swallowing:&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Releasing a&lt;b&gt;&amp;nbsp;Smaller Feature Set&lt;/b&gt;&amp;nbsp;means more safety, because there are fewer features to figure out, develop, and to test in parallel. Fewer moving parts that can malfunction, so to speak.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Now the model is complete. Have a look at the complete thing:&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-XgDSovesxJQ/ToobpdOeLOI/AAAAAAAABcA/eRPT58aNTXk/s1600/DSC00338.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="480" src="http://2.bp.blogspot.com/-XgDSovesxJQ/ToobpdOeLOI/AAAAAAAABcA/eRPT58aNTXk/s640/DSC00338.JPG" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
(You can also draw a line from&amp;nbsp;Doing the Right Thing leading back up to the factors increasing Safety.)&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Typical objections from management that object to this model (exercise for the reader: are these fallacies or not?):&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;ul&gt;
&lt;li&gt;Doing the Right Thing is better decided by planning/strategy/architecture, than by&amp;nbsp;Feedback.&lt;/li&gt;
&lt;li&gt;Safety increases linearly with QA: 10 times as many features is just as well tested by 10 times the QA.&lt;/li&gt;
&lt;li&gt;Good Code is irrelevant to Safety. (Refactoring is actually regarded as a minus to safety in some places).&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
While Frequent Releases are the &lt;i&gt;result&lt;/i&gt; of Safety and the drivers behind it, traditional management unfortunately sees it as a lever they can turn down to increase safety.&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
So, I'm not sure if the model will be of any help to you. For me it's just a nice way to explain the benefits of frequent releases to non-developers.&amp;nbsp;&lt;/div&gt;
&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11485756-4244651030071481669?l=blog.tfnico.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/tfnico?a=wLZaeVs9-io:cwaZdaZRNpA:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/tfnico?i=wLZaeVs9-io:cwaZdaZRNpA:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/tfnico/~4/wLZaeVs9-io" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.tfnico.com/feeds/4244651030071481669/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.tfnico.com/2011/10/why-releasing-more-frequently-is-good.html#comment-form" title="4 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/11485756/posts/default/4244651030071481669?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/11485756/posts/default/4244651030071481669?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/tfnico/~3/wLZaeVs9-io/why-releasing-more-frequently-is-good.html" title="Why Releasing More Frequently is Good For You" /><author><name>Thomas Ferris Nicolaisen</name><uri>https://profiles.google.com/101470099289717563604</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-MH85nZaMLeo/AAAAAAAAAAI/AAAAAAAABO8/cZT0o_8utuc/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-M5AZZOw1BO8/ToolfYkwzTI/AAAAAAAABcE/iquGg4YULjQ/s72-c/dtrt-perf.png" height="72" width="72" /><thr:total>4</thr:total><feedburner:origLink>http://blog.tfnico.com/2011/10/why-releasing-more-frequently-is-good.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEUDRX49fip7ImA9WhdVGU0.&quot;"><id>tag:blogger.com,1999:blog-11485756.post-4698299713299644391</id><published>2011-09-25T01:07:00.000+02:00</published><updated>2011-09-25T01:17:54.066+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-09-25T01:17:54.066+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="git-svn" /><title>Git-SVN Mirror without the annoying update-ref</title><content type="html">&lt;b&gt;&lt;span class="Apple-style-span" style="background-color: yellow;"&gt;This post is part of&amp;nbsp;&lt;a href="http://www.tfnico.com/presentations/git-and-subversion"&gt;a series on Git and Subversion&lt;/a&gt;. To see all the related posts, screencasts and other resources, please&amp;nbsp;&lt;a href="http://www.tfnico.com/presentations/git-and-subversion"&gt;click here&lt;/a&gt;.&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
So no sooner than I had done &lt;a href="http://blog.tfnico.com/2011/09/my-javzone-gitsvn-talk-is-online.html"&gt;my git-svn presentation at JavaZone&lt;/a&gt;, I &lt;a href="http://blog.tfnico.com/2010/10/gitsvn-5-centralized-git-svn-mirror.html?showComment=1315840894507#c8680910683841758271"&gt;got word&lt;/a&gt; of &lt;a href="http://kris.me.uk/2010/10/01/svn-master-with-git-mirrors.html"&gt;a slightly different Git-SVN mirror setup&lt;/a&gt; that makes it a bit easier to work with:&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;In short, my old recipe includes an annoying &lt;b&gt;git update-ref&lt;/b&gt; step to keep the git-svn remote reference up to date with the central bare git repo. This new recipe avoids this, so we can simply use &lt;b&gt;git svn dcommit&lt;/b&gt;&amp;nbsp; directly.&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
So, longer version, with the details. &lt;a href="http://blog.tfnico.com/2010/11/git-svn-mirror-for-multiple-branches.html"&gt;My original recipe&lt;/a&gt; is laid out in five steps:&lt;br /&gt;
&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;Clone a fresh Git repo from Subversion. This will be our&amp;nbsp;&lt;i&gt;fetching repo.&lt;/i&gt;&lt;/li&gt;
&lt;li&gt;Set up a&amp;nbsp;&lt;i&gt;bare repo.&lt;/i&gt;&lt;/li&gt;
&lt;li&gt;Configure pushing from the fetching repo to bare repo&lt;/li&gt;
&lt;li&gt;&lt;b&gt;In the shoes of a developer, clone the repo&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Set up an SVN remote in the developer's repo&lt;/b&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;
In the new approach, we redefine those last two steps:&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
(See the original post for how to do the first three.)&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;4. Clone the bare repo&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Note the -o parameter that specifies that we want to call the origin remote "mirror":&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;tfnico@flint:~/sources/git/&amp;gt;git clone -o mirror ~/git-repos/websites.git/&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
We can now&amp;nbsp;&lt;a href="http://www.gitready.com/intermediate/2009/01/09/checkout-remote-tracked-branch.html"&gt;track the remote branches&lt;/a&gt;, and pull the latest changes as they come in to the bare repo.&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;tfnico@flint:~/sources/git/websites/&amp;gt;git checkout -t mirror/yksi&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;tfnico@flint:~/sources/git/websites/&amp;gt;git pull --rebase&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
(Remember to use&amp;nbsp;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;--rebase&lt;/span&gt;&amp;nbsp;to avoid merge commits in case you have local commits.)&lt;br /&gt;
&lt;br /&gt;
When the time comes to push commits back to Subversion, we have to complete the last step.&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;5.&amp;nbsp;Set up an SVN remote in the developer's repo&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
We'll do an svn-init with the same parameters as we cloned in the beginning, adding a prefix &lt;b&gt;that matches the name of the remote "mirror"&lt;/b&gt;:&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;tfnico@flint:~/sources/git/websites/&amp;gt;git svn init --prefix=mirror/ -s file:///svn-repos/company-repo/websites/&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Times New Roman'; font-size: small;"&gt;The point of the mirror/ prefix is that whenever we do a pull, the git-svn reference will be updated along with the normal remote reference. So now you can do &lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;git svn dcommit&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Times New Roman'; font-size: small;"&gt; without any further ado.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11485756-4698299713299644391?l=blog.tfnico.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/tfnico?a=bxbwzQLni2k:eVKpiA-HrpQ:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/tfnico?i=bxbwzQLni2k:eVKpiA-HrpQ:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/tfnico/~4/bxbwzQLni2k" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.tfnico.com/feeds/4698299713299644391/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.tfnico.com/2011/09/git-svn-mirror-without-annoying-update.html#comment-form" title="17 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/11485756/posts/default/4698299713299644391?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/11485756/posts/default/4698299713299644391?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/tfnico/~3/bxbwzQLni2k/git-svn-mirror-without-annoying-update.html" title="Git-SVN Mirror without the annoying update-ref" /><author><name>Thomas Ferris Nicolaisen</name><uri>https://profiles.google.com/101470099289717563604</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-MH85nZaMLeo/AAAAAAAAAAI/AAAAAAAABO8/cZT0o_8utuc/s512-c/photo.jpg" /></author><thr:total>17</thr:total><feedburner:origLink>http://blog.tfnico.com/2011/09/git-svn-mirror-without-annoying-update.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEQEQnkzfSp7ImA9WhdVGU0.&quot;"><id>tag:blogger.com,1999:blog-11485756.post-6043782152372135144</id><published>2011-09-09T01:19:00.001+02:00</published><updated>2011-09-25T01:18:23.785+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-09-25T01:18:23.785+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="git" /><category scheme="http://www.blogger.com/atom/ns#" term="javazone" /><category scheme="http://www.blogger.com/atom/ns#" term="git-svn" /><title>My JavZone git+svn talk is online</title><content type="html">&lt;b&gt;&lt;span class="Apple-style-span" style="background-color: yellow;"&gt;This post is part of&amp;nbsp;&lt;a href="http://www.tfnico.com/presentations/git-and-subversion"&gt;a series on Git and Subversion&lt;/a&gt;. To see all the related posts, screencasts and other resources, please&amp;nbsp;&lt;a href="http://www.tfnico.com/presentations/git-and-subversion"&gt;click here&lt;/a&gt;.&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;i&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;
&lt;i&gt;&lt;b&gt;Update&lt;/b&gt;: I've also shared my notes from the talk.&amp;nbsp;&lt;a href="https://docs.google.com/document/d/1It3ba6FamU3xQDIlD989BJTqWKlDXXqq44pK1diTpaE/edit?hl=en_US"&gt;Here they are&lt;/a&gt;.&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
So, the Cisco/JavaZone folks were lightning fast and uploaded the recording of my session at JavaZone the day after I held it. Here it is:&lt;br /&gt;
&lt;br /&gt;
&lt;div style="text-align: center;"&gt;
&lt;iframe allowfullscreen="" frameborder="0" height="300" src="http://player.vimeo.com/video/28762003?title=0&amp;amp;byline=0&amp;amp;portrait=0" webkitallowfullscreen="" width="400"&gt;&lt;/iframe&gt;&lt;/div&gt;
&lt;div style="text-align: center;"&gt;
&lt;a href="http://vimeo.com/28762003"&gt;Living with Git and Subversion in Parallel&lt;/a&gt; from &lt;a href="http://vimeo.com/javazone"&gt;JavaZone&lt;/a&gt; on &lt;a href="http://vimeo.com/"&gt;Vimeo&lt;/a&gt;.&lt;/div&gt;
&lt;br /&gt;
You'll have to watch it fullscreen and in HD to follow the command line action, I reckon.&lt;br /&gt;
&lt;br /&gt;
I think this marks the climax, and probably the end of my adventures with git+svn. I mean, we're still using it at work, and I'll still help people with it when they ask on the &lt;a href="https://groups.google.com/forum/#!forum/git-users"&gt;"Git for human beings" mailing list&lt;/a&gt;. However, I won't submit it to any more conferences or user group meetings.&lt;br /&gt;
&lt;br /&gt;
It's been a really interesting topic, and an important one. The resources-page has gotten 6000 views (plus a lot more on the blog posts), and the screencasts on YouTube have received nearly 4000 views. It's been adopted by &lt;a href="http://wiki.gnucash.org/wiki/Git#Acknowledgments"&gt;at least one open source project&lt;/a&gt;, two companies where I set it up, and I've seen some incoming links from some big companies' intranets. I still hope more people will find them and make use of the knowledge.&lt;br /&gt;
&lt;br /&gt;
One problem is that if you &lt;a href="http://www.google.de/search?q=git+svn"&gt;google "git svn"&lt;/a&gt;, my &lt;a href="http://www.tfnico.com/presentations/git-and-subversion"&gt;resource page&lt;/a&gt; is nowhere near the first page. The top results are littered with typically 3-4 year old posts with really trivial git-svn stuff. So if you want to help others find this stuff, you can help out by linking to it like this:&lt;br /&gt;
&lt;br /&gt;
&lt;div style="text-align: center;"&gt;
&lt;i&gt;Check out this &lt;a href="http://www.tfnico.com/presentations/git-and-subversion"&gt;git svn&lt;/a&gt; page!&lt;/i&gt;&lt;/div&gt;
So, google-bomb away :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11485756-6043782152372135144?l=blog.tfnico.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/tfnico?a=3OF1J0yA1iQ:ebbRHwV4oqw:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/tfnico?i=3OF1J0yA1iQ:ebbRHwV4oqw:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/tfnico/~4/3OF1J0yA1iQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.tfnico.com/feeds/6043782152372135144/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.tfnico.com/2011/09/my-javzone-gitsvn-talk-is-online.html#comment-form" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/11485756/posts/default/6043782152372135144?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/11485756/posts/default/6043782152372135144?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/tfnico/~3/3OF1J0yA1iQ/my-javzone-gitsvn-talk-is-online.html" title="My JavZone git+svn talk is online" /><author><name>Thomas Ferris Nicolaisen</name><uri>https://profiles.google.com/101470099289717563604</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-MH85nZaMLeo/AAAAAAAAAAI/AAAAAAAABO8/cZT0o_8utuc/s512-c/photo.jpg" /></author><thr:total>2</thr:total><feedburner:origLink>http://blog.tfnico.com/2011/09/my-javzone-gitsvn-talk-is-online.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0IHR3o9fyp7ImA9WhdSFUw.&quot;"><id>tag:blogger.com,1999:blog-11485756.post-229430766995921124</id><published>2011-07-24T16:58:00.001+02:00</published><updated>2011-07-24T16:58:56.467+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-07-24T16:58:56.467+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="viaboxx" /><category scheme="http://www.blogger.com/atom/ns#" term="stuff" /><title>New job</title><content type="html">In the end of June, I left &lt;a href="http://www.iplabs.de/"&gt;IP Labs&lt;/a&gt; to work as a developer at &lt;a href="http://www.viaboxxsystems.de/"&gt;Viaboxx Systems&lt;/a&gt;. I had a great time at IP Labs, and learned a lot there, but it was time to try something different.&lt;br /&gt;
&lt;br /&gt;
Viaboxx is a small company, much like a startup (although a bit more established). It's a small team of excellent professionals, and they are agile to the very core, much to my liking.&lt;br /&gt;
&lt;br /&gt;
I'm learning a lot: Groovy, Grails, with options of doing JavaScript and even some native platform dev in the future. But my favorite part is that I get to work on a whole product. From the user experience in the front-end, through software to the hardware components, the whole team is responsible for making it as good as can be.&lt;br /&gt;
&lt;br /&gt;
And just to mention a couple of perks: Waiting for me on my first day was a brand new top-o-the-line 27" iMac. We've got 20% innovation time (FedEx days). We work in a villa. We cook and eat together every day.&amp;nbsp;And the company is sending me &lt;a href="http://blog.tfnico.com/2011/07/speaking-at-javazone-2011.html"&gt;up to Oslo for the JavaZone X conference&lt;/a&gt;&amp;nbsp;in September.&lt;br /&gt;
&lt;br /&gt;
For more insight into what Viaboxx is about, have a look at &lt;a href="http://www.viaboxxsystems.de/blog"&gt;our blog&lt;/a&gt;, where I'll probably be writing some entries in the near future.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11485756-229430766995921124?l=blog.tfnico.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/tfnico?a=ry3pSpQk5dw:f49g4k7PXB4:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/tfnico?i=ry3pSpQk5dw:f49g4k7PXB4:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/tfnico/~4/ry3pSpQk5dw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.tfnico.com/feeds/229430766995921124/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.tfnico.com/2011/07/new-job.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/11485756/posts/default/229430766995921124?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/11485756/posts/default/229430766995921124?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/tfnico/~3/ry3pSpQk5dw/new-job.html" title="New job" /><author><name>Thomas Ferris Nicolaisen</name><uri>https://profiles.google.com/101470099289717563604</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-MH85nZaMLeo/AAAAAAAAAAI/AAAAAAAABO8/cZT0o_8utuc/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.tfnico.com/2011/07/new-job.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DE8AQnYycSp7ImA9WhdSFUw.&quot;"><id>tag:blogger.com,1999:blog-11485756.post-6724094012115942153</id><published>2011-07-24T16:14:00.000+02:00</published><updated>2011-07-24T16:14:03.899+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-07-24T16:14:03.899+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="javazone" /><title>Speaking at JavaZone 2011</title><content type="html">Some weeks back I got word that my &lt;a href="http://www.tfnico.com/presentations/git-and-subversion"&gt;Git-SVN&lt;/a&gt; talk &lt;a href="http://javazone.no/incogito10/events/JavaZone%202011/sessions#69998a2e-13a5-4f92-85d5-de66b56b95f6"&gt;got accepted for JavaZone&lt;/a&gt;!&lt;br /&gt;
&lt;br /&gt;
Last time I attended JavaZone was in 2008, where I did &lt;a href="http://blog.tfnico.com/2008/10/my-javazone-video-is-out.html"&gt;my talk on Web Testing&lt;/a&gt; (video available). Since then I've moved to Germany, and haven't really had the chance to attend the conference. However, I've heard its kept getting bigger and better every year, and I have no doubt this is the best Java conference in the world. So I'm really looking forward to coming back there, meeting a lot of old friends, and learning a whole lot of new stuff.&lt;br /&gt;
&lt;br /&gt;
This year marks JavaZone's 10th anniversary, and as usual their marketing is hilarious:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;object width="320" height="266" class="BLOGGER-youtube-video" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0" data-thumbnail-src="http://2.gvt0.com/vi/5U1_KW6ww7Y/0.jpg"&gt;&lt;param name="movie" value="http://www.youtube.com/v/5U1_KW6ww7Y&amp;fs=1&amp;source=uds" /&gt;
&lt;param name="bgcolor" value="#FFFFFF" /&gt;
&lt;embed width="320" height="266"  src="http://www.youtube.com/v/5U1_KW6ww7Y&amp;fs=1&amp;source=uds" type="application/x-shockwave-flash"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;
&lt;br /&gt;
So, see you in Oslo, early morning Wednesday the 7th of September!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11485756-6724094012115942153?l=blog.tfnico.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/tfnico?a=yZ97I2IXvZo:daJQdpX8VaA:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/tfnico?i=yZ97I2IXvZo:daJQdpX8VaA:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/tfnico/~4/yZ97I2IXvZo" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.tfnico.com/feeds/6724094012115942153/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.tfnico.com/2011/07/speaking-at-javazone-2011.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/11485756/posts/default/6724094012115942153?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/11485756/posts/default/6724094012115942153?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/tfnico/~3/yZ97I2IXvZo/speaking-at-javazone-2011.html" title="Speaking at JavaZone 2011" /><author><name>Thomas Ferris Nicolaisen</name><uri>https://profiles.google.com/101470099289717563604</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-MH85nZaMLeo/AAAAAAAAAAI/AAAAAAAABO8/cZT0o_8utuc/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.tfnico.com/2011/07/speaking-at-javazone-2011.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUQESHY5fCp7ImA9WhZUGUo.&quot;"><id>tag:blogger.com,1999:blog-11485756.post-1874873321973214914</id><published>2011-06-13T15:55:00.000+02:00</published><updated>2011-06-13T15:55:09.824+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-06-13T15:55:09.824+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="stuff" /><title>2nd day at GearConf</title><content type="html">I was gonna post this Friday evening, but I got knocked out by a cold over the weekend. Anyhow, here's Friday's highlights from &lt;a href="http://gearconf.com/"&gt;GearConf&lt;/a&gt; the way I remember it:&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://twitter.com/#!/shochdoerfer"&gt;Stephan Hochdörfer&lt;/a&gt; did a talk on building software using generators and DSLs. The message didn't quite reach me, but the idea of &lt;a href="http://www.generative-programming.org/"&gt;generative programming&lt;/a&gt; was interesting enough. Some concrete examples and demos would have helped.&lt;br /&gt;
&lt;br /&gt;
Afterwards, Martin Geisler presented&amp;nbsp;&lt;a href="http://cdn.bitbucket.org/mg/mercurial-talk/downloads/query-languages.pdf"&gt;Mercurial's Query Language (PDF link)&lt;/a&gt;&amp;nbsp;- which was a really impressive array of features. As is &lt;a href="http://blog.tfnico.com/search/label/git"&gt;obvious of this blog&lt;/a&gt;, I lean towards Git as a favorite SCM, but through this talk I feel I really *got* Mercurial. With &lt;a href="http://mercurial.selenic.com/wiki/BookmarksExtension"&gt;bookmarks&lt;/a&gt; and &lt;a href="http://mercurial.selenic.com/wiki/MqExtension"&gt;queues&lt;/a&gt;, it's basically has the same firepower as Git. The only aber aber about Mercurial I find to be the GPL licensing. I reckon this will make it trickier for 3rd parties to implement tool support (example: &lt;a href="http://kiln.stackexchange.com/questions/811/how-does-kiln-handle-the-mercurial-gpl-license"&gt;FogBug's Kiln uses Mercurial&lt;/a&gt;).&lt;br /&gt;
&lt;br /&gt;
Onwards to a double talk with &lt;a href="http://twitter.com/#!/hans_d"&gt;Hans Dockter&lt;/a&gt;, the &lt;a href="http://www.gradle.org/"&gt;Gradle&lt;/a&gt; chief. This was another eye-opener. I always thought Gradle was something of a Maven clone in Groovy, but turns out the Gradle philosophy is a bit different: Bend and adapt to the requirements of the build, rather than imposing standards and conventions.&lt;br /&gt;
&lt;br /&gt;
Now, &lt;a href="http://blog.tfnico.com/search/label/maven"&gt;I'm a big Maven fan&lt;/a&gt;, and I know the old "You're doing it wrong!" argument used facing people with Maven issues. The way I see it:&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Many projects try to do stuff wrong because they don't know any better.&lt;/li&gt;
&lt;li&gt;Some projects try to do stuff wrong because they have to.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;&lt;div&gt;The problem with the Maven fundamentalists, is that they put everyone in the first category. I suspect Gradle honors all users by putting them in the first. While this is very nice, it gives validation to a lot of sub-optimal builds out there.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;At the end of the day, I think most Java projects (components might be a better word) out there are very simple: Java files go in, JAR-file comes out. For these projects, Maven works great. Even for the average webapp, Maven will work fine. However, for our main product, with all its special packaging, shrink-fitting and so on, I might consider Gradle a better tool for the job.&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
So quickly now the last two talks:&lt;br /&gt;
&lt;br /&gt;
&lt;a href="https://twitter.com/#!/caseaplace"&gt;Stefan Glase&lt;/a&gt; present &lt;a href="http://codenarc.sourceforge.net/"&gt;CodeNarc&lt;/a&gt;, static code analysis for Groovy. I might be going a lot deeper into Groovy soon, so this was a nice tip on a tool to use for keeping my code in check.&lt;br /&gt;
&lt;br /&gt;
Last presentation was &lt;a href="http://www.koch.ro/"&gt;Thomas Koch&lt;/a&gt; presenting &lt;a href="http://code.google.com/p/gerrit/"&gt;Gerrit&lt;/a&gt;. I've played around with Gerrit a lot the last weeks, and it's a great tool - it deserves a lot of presentations. &amp;nbsp;However, in this talk I would have liked to see less screenshots of Gerrit, and more demoing of the software itself. Thomas did have a running Gerrit on his machine where he showed one thing and the other, so why not use through the whole presentation? Cut down on the slides, folks!&lt;br /&gt;
&lt;br /&gt;
In conclusion, I really enjoyed the conference. I think it is probably a bit too small (60 attendees I reckon) for the organizers, but the content is great. Some innovation into the shape of the conference would be nice though: How bout doing a bit less of the 45 minute presentations, and more stuff like lightning talks and panel debates? Also, get active on Twitter and social websites (like &lt;a href="http://speakerrate.com/"&gt;SpeakerRate&lt;/a&gt; and &lt;a href="http://lanyrd.com/"&gt;Lanyrd&lt;/a&gt;).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11485756-1874873321973214914?l=blog.tfnico.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/tfnico?a=hENcyUo2AkY:QAsQiQ9N_ck:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/tfnico?i=hENcyUo2AkY:QAsQiQ9N_ck:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/tfnico/~4/hENcyUo2AkY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.tfnico.com/feeds/1874873321973214914/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.tfnico.com/2011/06/2nd-day-at-gearconf.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/11485756/posts/default/1874873321973214914?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/11485756/posts/default/1874873321973214914?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/tfnico/~3/hENcyUo2AkY/2nd-day-at-gearconf.html" title="2nd day at GearConf" /><author><name>Thomas Ferris Nicolaisen</name><uri>https://profiles.google.com/101470099289717563604</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-MH85nZaMLeo/AAAAAAAAAAI/AAAAAAAABO8/cZT0o_8utuc/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.tfnico.com/2011/06/2nd-day-at-gearconf.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkYER3Y6fCp7ImA9WhZUFkg.&quot;"><id>tag:blogger.com,1999:blog-11485756.post-53505695650449003</id><published>2011-06-09T23:15:00.000+02:00</published><updated>2011-06-09T23:15:06.814+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-06-09T23:15:06.814+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="stuff" /><category scheme="http://www.blogger.com/atom/ns#" term="git-svn" /><title>Git-SVN talk at GearConf 2011 done!</title><content type="html">So, just a quick post to announce that I did my &lt;a href="http://www.tfnico.com/presentations/git-and-subversion"&gt;Git+SVN&lt;/a&gt; talk today at &lt;a href="http://gearconf.de/"&gt;GearConf&lt;/a&gt;. I feel that the talk went pretty well. There were only 45 minutes at hand, so I focused on setting up &lt;a href="http://blog.tfnico.com/2010/11/git-svn-mirror-for-multiple-branches.html"&gt;a Git-SVN mirror with branches and tags&lt;/a&gt;. I also set up &lt;a href="http://jenkins-ci.org/"&gt;Jenkins&lt;/a&gt; to drive the &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;git svn fetch+git push&lt;/span&gt; in the fetching repo, and in the end put the bare repo on &lt;a href="http://github.com/"&gt;GitHub&lt;/a&gt; (for full buzzword compliance).&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;If you attended the talk, I would really appreciate to hear any kind of feedback! Either comment here, or rate my talk at &lt;a href="http://speakerrate.com/talks/7745-git-and-subversion"&gt;SpeakerRate.com&lt;/a&gt;.&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Otherwise, 1st day of the conference was great! I got an introduction to &lt;a href="http://www.opscode.com/chef/"&gt;Chef&lt;/a&gt; from &lt;a href="http://twitter.com/#!/Eigenbrodtm"&gt;Martin Eigenbrodt&lt;/a&gt;, heard an eloquent Maven rant from&amp;nbsp;&lt;a href="http://twitter.com/#!/hgutwit"&gt;Halil-Cem Gürsoy&lt;/a&gt;, and&amp;nbsp;&lt;a href="http://twitter.com/#!/MichLeibfried"&gt;Michael Leibfried&lt;/a&gt; talked about how to introduce Scrum in hostile environments. All really interesting talks.&lt;br /&gt;
&lt;br /&gt;
Also speaking in the revision control department was &lt;a href="http://twitter.com/#!/stefanlay"&gt;Stefan Lay&lt;/a&gt; presenting the awesome upcoming &lt;a href="http://www.eclipse.org/egit/"&gt;EGit 1.0 release&lt;/a&gt;, and &lt;a href="http://mgeisler.net/"&gt;Martin Geisler&lt;/a&gt;, a fellow Scandinavian, presented Mercurial, where he's one of the core committers. Tomorrow Martin is doing a talk on some more Mercurial stuff, so I'm really looking forward to that, and maybe some more interesting Git vs. Mercurial discussion ;)&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-TK4b24wMO3E/TfE2-ULSVnI/AAAAAAAABMA/TcEUZrQY7TY/s1600/git-shell.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="255" src="http://2.bp.blogspot.com/-TK4b24wMO3E/TfE2-ULSVnI/AAAAAAAABMA/TcEUZrQY7TY/s400/git-shell.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
PS: For those who liked my Git shell thingie in the screenshot above, &lt;a href="http://www.codethatmatters.com/2010/01/git-autocomplete-in-mac-os-x/"&gt;the receipe is here&lt;/a&gt;, and you can see my PS1 variable (with the git branch name) in &lt;a href="https://gitorious.org/testing-git/prefs/blobs/master/profile"&gt;my .profile here&lt;/a&gt;. And again, if you want to learn more about Git+SVN, &lt;a href="http://www.tfnico.com/presentations/git-and-subversion"&gt;my resources are all collected neatly here&lt;/a&gt;. All feedback is welcome!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11485756-53505695650449003?l=blog.tfnico.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/tfnico?a=2y6nfCGi6SQ:luhVhjkSuyg:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/tfnico?i=2y6nfCGi6SQ:luhVhjkSuyg:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/tfnico/~4/2y6nfCGi6SQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.tfnico.com/feeds/53505695650449003/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.tfnico.com/2011/06/git-svn-talk-at-gearconf-2011-done.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/11485756/posts/default/53505695650449003?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/11485756/posts/default/53505695650449003?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/tfnico/~3/2y6nfCGi6SQ/git-svn-talk-at-gearconf-2011-done.html" title="Git-SVN talk at GearConf 2011 done!" /><author><name>Thomas Ferris Nicolaisen</name><uri>https://profiles.google.com/101470099289717563604</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-MH85nZaMLeo/AAAAAAAAAAI/AAAAAAAABO8/cZT0o_8utuc/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-TK4b24wMO3E/TfE2-ULSVnI/AAAAAAAABMA/TcEUZrQY7TY/s72-c/git-shell.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://blog.tfnico.com/2011/06/git-svn-talk-at-gearconf-2011-done.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CU8AQXY8cSp7ImA9WhZUFEk.&quot;"><id>tag:blogger.com,1999:blog-11485756.post-210497090053864797</id><published>2011-06-07T12:50:00.000+02:00</published><updated>2011-06-07T12:50:40.879+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-06-07T12:50:40.879+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="agile" /><category scheme="http://www.blogger.com/atom/ns#" term="stuff" /><title>English Talks from the ROOTS 2011 Conference</title><content type="html">Great news! The recordings from the &lt;a href="http://rootsconf.no/"&gt;recent ROOTS conference&lt;/a&gt; are now available online!&lt;br /&gt;
&lt;br /&gt;
Apart from the keynote speakers (including Jurgen Appelo and Dan North), there were a myriad of more local speakers doing lightning talks. Now, in spite of speaker "quality" on average being a bit below the keynote-level, I find these lightning talks are particularly refreshing. There something very real, and honest about them. Most of them are just regular developers sharing their good and bad experiences from &amp;nbsp;stuff they've tried out.&lt;br /&gt;
&lt;br /&gt;
Unfortunately, it's a right mix of Norwegian and English talks, and the good ROOTS folks haven't done any particular tagging in regards to language.&lt;br /&gt;
&lt;br /&gt;
I therefore had a quick skim through all the talks noting down which ones are English. Here they are:&lt;br /&gt;
&lt;br /&gt;
&lt;div&gt;Keynotes:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://vimeo.com/24681032"&gt;Patterns of Effective Delivery - Dan North&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://vimeo.com/24723942"&gt;The 7 Duties of Great Software Professionals - Jurgen Appelo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;Lightning talks (in the order I found them on vimeo):&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://vimeo.com/24735626"&gt;Too busy sharpening the saw - Anders Norås&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://vimeo.com/24733733"&gt;Scrum, Bridging cultures - Chandimal Wickramaratne&lt;/a&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://vimeo.com/24733684"&gt;Responsible Me - Thommy Bommen&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://vimeo.com/24727710"&gt;I don't believe in Agile Methods - Jason Baragry&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://vimeo.com/24727672"&gt;Get people talking, Introducing Lightning Talks in an organization - Eirik Bjørsnøs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://vimeo.com/24727622"&gt;Double Loop Learning - Erling Linde&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://vimeo.com/24727584"&gt;Agile transparency, From blame game to cooperation - Tore Vestues&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://vimeo.com/24706839"&gt;Virtualize and automate your development environment for fun and profit - Andreas Heim&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://vimeo.com/24706816"&gt;Version control for Continuous Delivery - Stein Inge Morisbak&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://vimeo.com/24706789"&gt;Three simple techniques for Continuous Delivery - Ole Christian Rynning&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://vimeo.com/24706656"&gt;There is no holy code - Rudolf Brunner&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://vimeo.com/24706626"&gt;Significance of metrics - David Karlsen&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://vimeo.com/24706568"&gt;Plug-and-play service locator with load balancing - Morten Kjetland&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://vimeo.com/24706295"&gt;Outsource your self-discipline to your best buddy, the computer - Filip van Laenen&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://vimeo.com/24705631"&gt;Facts and speculation about noSQL - Mario Aparicio&amp;nbsp;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://vimeo.com/24691568"&gt;Cranking CI up to 11, Deployment pipelines - Knut Haugen&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://vimeo.com/24688791"&gt;We need to stop repeating the sins of our 'fathers' - Espen Dalløkken&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://vimeo.com/24688014"&gt;The browser - your best friend and worst enemy - André N. Klingsheim&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://vimeo.com/24686400"&gt;How to maintain a robust development process for JavaScript - Trygve Lie&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://vimeo.com/24685982"&gt;Building desktop-like Rich Internet Applications (RIA) using SproutCore and Cappuccino - Joachim Haagen Skeie&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://vimeo.com/24682128"&gt;An agile evolution of functional testing - Rita Nordtug, Eva Vinneng&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;If I left out any English talks, or if any of the ones above switch to Norwegian mid-talk, leave a comment and I'll update the list.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11485756-210497090053864797?l=blog.tfnico.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/tfnico?a=WvvxhWwk6X4:1XsfnAk2-Y8:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/tfnico?i=WvvxhWwk6X4:1XsfnAk2-Y8:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/tfnico/~4/WvvxhWwk6X4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.tfnico.com/feeds/210497090053864797/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.tfnico.com/2011/06/english-talks-from-roots-2011.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/11485756/posts/default/210497090053864797?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/11485756/posts/default/210497090053864797?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/tfnico/~3/WvvxhWwk6X4/english-talks-from-roots-2011.html" title="English Talks from the ROOTS 2011 Conference" /><author><name>Thomas Ferris Nicolaisen</name><uri>https://profiles.google.com/101470099289717563604</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-MH85nZaMLeo/AAAAAAAAAAI/AAAAAAAABO8/cZT0o_8utuc/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.tfnico.com/2011/06/english-talks-from-roots-2011.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEcCR349fip7ImA9WhZVGEo.&quot;"><id>tag:blogger.com,1999:blog-11485756.post-8736163382737845478</id><published>2011-05-31T22:01:00.000+02:00</published><updated>2011-05-31T22:01:06.066+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-05-31T22:01:06.066+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="blogger" /><category scheme="http://www.blogger.com/atom/ns#" term="stuff" /><title>Added some ads..</title><content type="html">I've just added some ads to this blog as well as &lt;a href="http://www.tfnico.com/"&gt;my homepage&lt;/a&gt;. This is more out of curiosity than it is for making money, but maybe it'll be enough to pay for the domain ;)&lt;br /&gt;
&lt;br /&gt;
I'll keep them for a few weeks, and then take them away if there are any complaints. Please give me a tweet or a comment if you think they have a detrimental effect on the content.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11485756-8736163382737845478?l=blog.tfnico.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/tfnico?a=RVGkPg33IDo:YeGZttZkypk:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/tfnico?i=RVGkPg33IDo:YeGZttZkypk:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/tfnico/~4/RVGkPg33IDo" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.tfnico.com/feeds/8736163382737845478/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.tfnico.com/2011/05/added-some-ads.html#comment-form" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/11485756/posts/default/8736163382737845478?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/11485756/posts/default/8736163382737845478?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/tfnico/~3/RVGkPg33IDo/added-some-ads.html" title="Added some ads.." /><author><name>Thomas Ferris Nicolaisen</name><uri>https://profiles.google.com/101470099289717563604</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-MH85nZaMLeo/AAAAAAAAAAI/AAAAAAAABO8/cZT0o_8utuc/s512-c/photo.jpg" /></author><thr:total>2</thr:total><feedburner:origLink>http://blog.tfnico.com/2011/05/added-some-ads.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkYMRHszeSp7ImA9WhZVFUQ.&quot;"><id>tag:blogger.com,1999:blog-11485756.post-8999640921592149115</id><published>2011-05-28T16:49:00.000+02:00</published><updated>2011-05-28T16:49:45.581+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-05-28T16:49:45.581+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="agile" /><title>AgileCoachCamp: Germany</title><content type="html">In a few weeks I'm driving down to the &lt;a href="http://accde11.pbworks.com/"&gt;AgileCoachCamp: Germany&lt;/a&gt; (&lt;a href="http://twitter.com/#!/search/accde11"&gt;#accde11&lt;/a&gt;). It's taking place in a place called Johannesberg, near Frankfurt am Main, from 17th till 19th of June.&lt;br /&gt;
&lt;br /&gt;
I'm not sure what to expect, but I'm sure there'll be a lot of eye openers on how to help agile adoption.&lt;br /&gt;
&lt;br /&gt;
My personal pain-point is how to avoid &lt;i&gt;agile saturation&lt;/i&gt;, meaning where an organization comes to the point where they have "enough agile", or too many non-movable obstacles are in the way of further change.&lt;br /&gt;
&lt;br /&gt;
I'm really looking forward to finally interact in-person with other people on the German agile scene, as well as some from other countries. It's been a while since my last agile gathering/conference (apart from the &lt;a href="http://sites.google.com/site/bonnxp/"&gt;Bonn XP meetups&lt;/a&gt;), so this will be a blast!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11485756-8999640921592149115?l=blog.tfnico.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/tfnico?a=j6DuCYdrXZ0:9drmXF0A-V0:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/tfnico?i=j6DuCYdrXZ0:9drmXF0A-V0:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/tfnico/~4/j6DuCYdrXZ0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.tfnico.com/feeds/8999640921592149115/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.tfnico.com/2011/05/agilecoachcamp-germany.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/11485756/posts/default/8999640921592149115?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/11485756/posts/default/8999640921592149115?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/tfnico/~3/j6DuCYdrXZ0/agilecoachcamp-germany.html" title="AgileCoachCamp: Germany" /><author><name>Thomas Ferris Nicolaisen</name><uri>https://profiles.google.com/101470099289717563604</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-MH85nZaMLeo/AAAAAAAAAAI/AAAAAAAABO8/cZT0o_8utuc/s512-c/photo.jpg" /></author><thr:total>1</thr:total><feedburner:origLink>http://blog.tfnico.com/2011/05/agilecoachcamp-germany.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUEDRXs9fCp7ImA9WhZVFEk.&quot;"><id>tag:blogger.com,1999:blog-11485756.post-3984247889079138993</id><published>2011-05-26T23:00:00.001+02:00</published><updated>2011-05-26T23:01:14.564+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-05-26T23:01:14.564+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="stuff" /><category scheme="http://www.blogger.com/atom/ns#" term="git-svn" /><title>Git-SVN at GearConf 2011</title><content type="html">It's that time of the year again! Well, actually last year &lt;a href="http://blog.tfnico.com/2010/10/gearconf-2010-impressions.html"&gt;GearConf took place in October&lt;/a&gt;, and this year it's June 9-10th. Well, anyhow.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://gearconf.com/" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="60" id=":current_picnik_image" src="http://4.bp.blogspot.com/-k1KtgBIOqVE/Td6-HMpPW-I/AAAAAAAABLk/YddW_n3zTxw/s1600/14258219450_XwNPX.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Again I've gathered up some premium octane &lt;a href="http://www.tfnico.com/presentations/git-and-subversion"&gt;Git-SVN knowledge&lt;/a&gt;, a bit like &lt;a href="http://ruhrjug.de/component/content/article/36-bericht/142-bericht-living-with-git-and-subversion-in-parallel-mit-thomas-nicolaisen-am-144"&gt;the stuff I did at the RuhrJUG in Essen&lt;/a&gt;, but this time I have to fit it into a slot smaller than one hour. At least I hope to fit in the interaction with Jenkins and GitHub this time, and do a bit less of the git-svn basics.&lt;br /&gt;
&lt;br /&gt;
So, if you live around the &lt;a href="http://en.wikipedia.org/wiki/Ruhr"&gt;Ruhr&lt;/a&gt;&amp;nbsp;area, in&amp;nbsp;&lt;a href="http://en.wikipedia.org/wiki/North_Rhine-Westphalia"&gt;NRW&lt;/a&gt;, or otherwise nearby, get &lt;a href="http://gearconf.com/"&gt;your GearConf ticket&lt;/a&gt;&amp;nbsp;now!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11485756-3984247889079138993?l=blog.tfnico.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/tfnico?a=9hpbX0XU_o8:BnVUTyhRqds:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/tfnico?i=9hpbX0XU_o8:BnVUTyhRqds:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/tfnico/~4/9hpbX0XU_o8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.tfnico.com/feeds/3984247889079138993/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.tfnico.com/2011/05/git-svn-at-gearconf-2011.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/11485756/posts/default/3984247889079138993?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/11485756/posts/default/3984247889079138993?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/tfnico/~3/9hpbX0XU_o8/git-svn-at-gearconf-2011.html" title="Git-SVN at GearConf 2011" /><author><name>Thomas Ferris Nicolaisen</name><uri>https://profiles.google.com/101470099289717563604</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-MH85nZaMLeo/AAAAAAAAAAI/AAAAAAAABO8/cZT0o_8utuc/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-k1KtgBIOqVE/Td6-HMpPW-I/AAAAAAAABLk/YddW_n3zTxw/s72-c/14258219450_XwNPX.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://blog.tfnico.com/2011/05/git-svn-at-gearconf-2011.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0QFQH08cSp7ImA9WhZXGUg.&quot;"><id>tag:blogger.com,1999:blog-11485756.post-967803421322867903</id><published>2011-04-30T00:19:00.001+02:00</published><updated>2011-05-09T17:35:11.379+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-05-09T17:35:11.379+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="agile" /><title>Agile Game Development: Magicka</title><content type="html">&lt;b&gt;Update 2011.05.09:&lt;/b&gt;&amp;nbsp;Arrowhead &lt;a href="http://pilestedt.tumblr.com/post/5334896526/on-magicka-agile-development"&gt;posted a reply to this post&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
This post is a tribute to a company which, judging by the looks of it, is kicking ass, agile style.&lt;br /&gt;
&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-LtZ7E-QPiuo/Tbsb1WkW7II/AAAAAAAABKo/Mgdee7d6CdU/s1600/magicka-scrum.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="213" src="http://3.bp.blogspot.com/-LtZ7E-QPiuo/Tbsb1WkW7II/AAAAAAAABKo/Mgdee7d6CdU/s400/magicka-scrum.jpg" width="400" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;"This sprint is really going down the drain" from the first scene&lt;br /&gt;
of Magicka in adventure mode.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;What's this about&lt;/span&gt;&lt;br /&gt;
The company is called &lt;a href="http://arrowheadgamestudios.com/"&gt;Arrowhead Game Studios&lt;/a&gt;, and they've made a game called &lt;a href="http://www.magickagame.com/"&gt;Magicka&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Now, I'm not going to write so much about the game itself, but it's awesome. I used to play a lot of computer games growing up, all the way through my studies. Since then, it's been pretty sporadic. Until I tried out Magicka. I've been playing it for over 50 hours, which is pretty good value-for-money, considering it cost 10€ (plus DLC's, which are a point I'll come back to later).&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: large;"&gt;How successful is it?&lt;/span&gt;&lt;br /&gt;
In the first 17 days it was for sale, it &lt;a href="http://news.bigdownload.com/2011/02/11/interview-magickas-producer-talks-about-reaching-the-200-000-s/"&gt;sold over 200.000 copies&lt;/a&gt;. At times it topped the stats for most-selling game on &lt;a href="http://store.steampowered.com/news/?appids=42910"&gt;Steam&lt;/a&gt;, at one point selling 30.000 copies in 24 hours. Its gotten pretty good reviews all round, and some &lt;a href="http://www.cynicalbrit.com/videos/magicka-developer-commentary-with-totalbiscuit-part-3-2/"&gt;rather high ranking game reviewers&lt;/a&gt; have completely fallen for the game.&lt;br /&gt;
&lt;br /&gt;
Take into account that this is an &lt;i&gt;indie game&lt;/i&gt;&amp;nbsp;which was/is developed by &lt;a href="http://en.wikipedia.org/wiki/Magicka"&gt;eight Swedish students&lt;/a&gt; turned game developers. The only other game I've heard of that comes close to this phenomenon is &lt;a href="http://en.wikipedia.org/wiki/Minecraft"&gt;Minecraft&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: large;"&gt;Why is it agile?&lt;/span&gt;&lt;br /&gt;
&lt;b&gt;They ship early and they ship often.&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Early &lt;/b&gt;because they launched the game while it was still early alpha and &lt;a href="http://store.steampowered.com/news/externalpost/rps/1191402208733335565"&gt;crap-full of bugs&lt;/a&gt;. &lt;b&gt;Often, &lt;/b&gt;cause after they went live on Steam&amp;nbsp;they were patching on &lt;b&gt;a daily basis&lt;/b&gt; (the Steam automatically upgrades the game, a bit like the Windows update). Since then they've eased down to more of a weekly release cycle.&lt;br /&gt;
&lt;br /&gt;
Now for those of you who haven't been playing a lot of computer games lately, to me this is pretty radical. A big "Hollywood" game usually takes weeks to produce their first (well needed) patches, some times even months.&lt;br /&gt;
&lt;br /&gt;
&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Lots of people have been complaining about the instability of the game and the bugs from early on. Then again, so do many big budget games. For a small company of eight developers, it's hard to keep coverage of all possible hardware drivers and configurations, so this is understandable.&amp;nbsp;&lt;/div&gt;&lt;br /&gt;
But they fix the problems continuously.&lt;b&gt;&amp;nbsp;These releases are pumped out so regularly that I hardly notice them anymore&lt;/b&gt;. They've gotten really good at not letting new bugs slip through. This is continuous delivery.&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: large;"&gt;Humble, Open and Honest&lt;/span&gt;&lt;br /&gt;
The developers seem incredibly involved with their users.&amp;nbsp;As an apology for the early buggy releases of the game, they released a new avatar in: The &lt;a href="http://en.wikipedia.org/wiki/Mea_culpa"&gt;Mea Culpa&lt;/a&gt; Wizard (granted some new magical powers: summon bugs, and the spell &lt;i&gt;Crash To Desktop&lt;/i&gt;). By now you can probably guess that there's a lot of geek humor in there.&lt;br /&gt;
&lt;br /&gt;
They communicate frequently with the world through&amp;nbsp;&lt;a href="http://twitter.com/Magickagame"&gt;twitter&lt;/a&gt;&amp;nbsp;and &lt;a href="http://forum.paradoxplaza.com/forum/forumdisplay.php?496-Magicka"&gt;forums&lt;/a&gt;. They often take in suggestions from players into patches and new changes.&amp;nbsp;They post release notes and weekly community updates.&lt;br /&gt;
&lt;br /&gt;
They are honest, continuously maintaining &lt;a href="http://forum.paradoxplaza.com/forum/showthread.php?523275-The-state-of-the-game"&gt;a list of things they know are still buggy&lt;/a&gt;. They admit it when they mess up&amp;nbsp;and they&amp;nbsp;&lt;i&gt;apologize&lt;/i&gt;. They say thanks when they get feedback&lt;i&gt;.&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
Even though I've never met them, it feels like the developers are practically my buddies, eager to understand and help me have the best possible gaming experience.&lt;br /&gt;
&lt;br /&gt;
&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;I really had to smile when I saw the Scrum board from the first scene in the game (see screenshot in the top of this post). I mean, how many gamers out there know what Scrum is? That is clearly a wink to other devs out there :)&lt;/div&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: large;"&gt;Pay per use&lt;/span&gt;&lt;br /&gt;
Its important for the developers to keep the players happy, and keeping them playing, also after that they bought the game. They've shipped some&amp;nbsp;&lt;a href="http://en.wikipedia.org/wiki/Downloadable_content"&gt;downloadable content&lt;/a&gt;, some of it is free, others cost a few euros.&lt;br /&gt;
&lt;br /&gt;
I bought the game for&amp;nbsp;10€. I then bought the Vietnam extension for 5€, and then I *had* to get the latest level as well for a meager 2€. Later on they are going to release Player-vs-player mode (PvP) for free, due to heavy demand among the fans.&lt;br /&gt;
&lt;br /&gt;
They are tip-toeing the fine line of keeping players paying for more, while not giving the impression that they are exploiting (like some other games have tried).&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: large;"&gt;Courage&lt;/span&gt;&lt;br /&gt;
Arrowhead have really challenged a lot of the existing conventions in the gaming industry. They heavily under-priced (games are usually 30-50€). They launched the game without a 6 month QA period. They did no traditional marketing (apart from getting on Steam, which was probably a big part of the lift-off). They sit down to play and discuss the game, while&amp;nbsp;&lt;a href="http://www.youtube.com/watch?v=B2mOfo-Y9fI&amp;amp;feature=autoplay&amp;amp;list=SP295A49D9210D37C9&amp;amp;index=2&amp;amp;playnext=1"&gt;streaming it online&lt;/a&gt;. It's a spelled-based game where there is &lt;i&gt;no mana-bar&lt;/i&gt;, for crying out loud!&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: large;"&gt;Rounding off..&lt;/span&gt;&lt;br /&gt;
The XP values are Communication, Feedback, Simplicity, Courage and Respect. I think these really ring through every time I have read on the forums. Just to paste some quotes from their change log announcements:&lt;br /&gt;
&lt;br /&gt;
From &lt;a href="http://forum.paradoxplaza.com/forum/showthread.php?517616-Official-Magicka-Status-Report-(Jan-26th)&amp;amp;highlight=changelog"&gt;early on&lt;/a&gt;:&lt;br /&gt;
&lt;blockquote&gt;Right now we've got so many players posting on the steam forums we're having a hard time keeping up answering posts. But we're reading all of them and are adding stuff to our "to-do"-list. [...]&amp;nbsp;We'll monitor your response closely and keep patching the game as often as possible.&amp;nbsp;Please let us know if the patch helped!&lt;/blockquote&gt;&lt;a href="http://forum.paradoxplaza.com/forum/showthread.php?517893-Changelog-for-Patch-3-January-27th&amp;amp;highlight=changelog"&gt;Later on&lt;/a&gt;:&lt;br /&gt;
&lt;blockquote&gt;We (devs and publisher) are still super committed to fix stuff that's broken and make sure you guys can have a great time with the game.&amp;nbsp;Additionally we've also have a bunch of improvements planned and will be patched in as soon as the major issues are out of the way! These are based directly off your input.&lt;/blockquote&gt;&lt;a href="http://forum.paradoxplaza.com/forum/showthread.php?518819-Changelog-for-Patch-5-January-31st&amp;amp;highlight=changelog"&gt;Later&lt;/a&gt;:&lt;br /&gt;
&lt;blockquote&gt;As we've released new patches we're seeing much fewer reports of the game malfunctioning. More and more players are reporting that the game is working nicely for them. We're also noticing that the problems that exist are A) known and being worked on and B) centered around fewer different things.&amp;nbsp;&lt;/blockquote&gt;And then things &lt;a href="http://forum.paradoxplaza.com/forum/showthread.php?519080-Changelog-for-Patch-6-1.3.3.5-February-1st&amp;amp;highlight=changelog"&gt;are really becoming stable&lt;/a&gt;:&lt;br /&gt;
&lt;blockquote&gt;So the last patch squashed a lot of bugs and we're glad to report that we're getting fewer error reports and the reports we're getting are about a smaller number of problems.&lt;br /&gt;
So we're definitely getting where we want to go! BUT that doesn't mean we're done. We'll keep updating the game and improve it as we go along. We will also try to add additional features that you guys are requesting.&amp;nbsp;&lt;/blockquote&gt;And since then they've done another ten patches. This is agile straight out of the book (or into it, depending on how you look at it). Really inspiring to see how successful they are.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Update 2011.05.09:&lt;/b&gt;&amp;nbsp;Arrowhead&amp;nbsp;&lt;a href="http://pilestedt.tumblr.com/post/5334896526/on-magicka-agile-development"&gt;posted a reply to this post&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11485756-967803421322867903?l=blog.tfnico.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/tfnico?a=8pwS3o4ksms:dB1iIKu44Jw:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/tfnico?i=8pwS3o4ksms:dB1iIKu44Jw:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/tfnico/~4/8pwS3o4ksms" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.tfnico.com/feeds/967803421322867903/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.tfnico.com/2011/04/agile-game-development-magicka.html#comment-form" title="4 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/11485756/posts/default/967803421322867903?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/11485756/posts/default/967803421322867903?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/tfnico/~3/8pwS3o4ksms/agile-game-development-magicka.html" title="Agile Game Development: Magicka" /><author><name>Thomas Ferris Nicolaisen</name><uri>https://profiles.google.com/101470099289717563604</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-MH85nZaMLeo/AAAAAAAAAAI/AAAAAAAABO8/cZT0o_8utuc/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-LtZ7E-QPiuo/Tbsb1WkW7II/AAAAAAAABKo/Mgdee7d6CdU/s72-c/magicka-scrum.jpg" height="72" width="72" /><thr:total>4</thr:total><feedburner:origLink>http://blog.tfnico.com/2011/04/agile-game-development-magicka.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUYGRH07fyp7ImA9WhZQFUU.&quot;"><id>tag:blogger.com,1999:blog-11485756.post-5338511679771577199</id><published>2011-04-23T20:25:00.000+02:00</published><updated>2011-04-23T20:25:25.307+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-04-23T20:25:25.307+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="agile" /><title>Agile Lean Europe: Some thoughts</title><content type="html">Just jotting down some thoughts..&lt;br /&gt;
&lt;br /&gt;
A couple of weeks ago, I drove up to Düsseldorf to attend the &lt;a href="https://www.xing.com/net/scrumtischrheinruhr/"&gt;Scrumtisch Rhein/Ruhr&lt;/a&gt; meeting, because the topic was this new &lt;a href="http://alenetwork.eu/"&gt;Agile/Lean Europe (ALE) Network&lt;/a&gt;. &lt;a href="http://hhgttg.de/"&gt;Olaf Lewitz&lt;/a&gt; facilitated the discussion ( credits to &lt;a href="http://www.codecentric.de/"&gt;CodeCentric&lt;/a&gt; for the free beverages/food).&lt;br /&gt;
&lt;br /&gt;
I first heard about this network in &lt;a href="http://forum.smidig.no/forums/6/topics/622"&gt;this discussion in the Norwegian agile forum&lt;/a&gt;, initiated by&amp;nbsp;&lt;a href="http://www.agilecoach.no/"&gt;Sergey Dmitriev&lt;/a&gt;&amp;nbsp;and followed up on by &lt;a href="http://johannesbrodwall.com/"&gt;Johannes Brodwall&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Olaf and &lt;a href="http://www.deborahpreuss.com/"&gt;Deborah Preuss&lt;/a&gt; were both involved in the &lt;a href="http://www.agilecoachcamp.no/st/people"&gt;Agile Coach Camp in Norway&lt;/a&gt; earlier this year, and I suspect that they already discussed some of these things there. This makes for a firm connection between the German and Norwegian agile scene, and I hope to be able to support this bridge somehow.&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: large;"&gt;Now, why does this European interconnection matter anyway?&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
I'll give you three reasons why it matters to me personally:&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;1) It's no fun doing it alone&lt;/b&gt;Agile is deeply nested with social drive.&amp;nbsp;While it's perfectly fine to drive on the social forces within a closed community (say, the German agile scene), it gets a lot more interesting if we know that this is an international effort. Knowing that other countries are interested adds motivation.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;2) A mirror for our culture&lt;/b&gt;&lt;br /&gt;
We make changes based on feedback and inspection. For the sake of&amp;nbsp;fresh perspectives, we often use externals (consultants, coaches) for gaining insight. Agile depends heavily on, and influences, culture. Ergo, for a fresh perspective, we might benefit from using externals from other cultures/countries.&lt;br /&gt;
&lt;br /&gt;
(One thing is organizations of business, another thing is getting feedback on how our &lt;i&gt;communities&lt;/i&gt; are operating.)&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;3) Synergy, or re-using knowledge and experience in other countries&lt;/b&gt;&lt;br /&gt;
If I spent hundreds of hours creating some crystallized knowledge on how to deal with some particular problem (like introducing agile in public sector), it would be an awful shame if it only came to the benefit of the few thousand potentially interested in my country. Letting other countries benefit from the same knowledge is win/win.&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: large;"&gt;A few thoughts on Germany/Norway in particular&lt;/span&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://upload.wikimedia.org/wikipedia/commons/thumb/d/d9/Flag_of_Norway.svg/125px-Flag_of_Norway.svg.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;span class="Apple-style-span" style="-webkit-text-decorations-in-effect: none; color: black;"&gt;&lt;/span&gt;&lt;/a&gt;&lt;a href="http://upload.wikimedia.org/wikipedia/commons/thumb/b/ba/Flag_of_Germany.svg/125px-Flag_of_Germany.svg.png" imageanchor="1" style="clear: left; display: inline !important; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://upload.wikimedia.org/wikipedia/commons/thumb/b/ba/Flag_of_Germany.svg/125px-Flag_of_Germany.svg.png" /&gt;&lt;/a&gt;&lt;span class="Apple-style-span" style="-webkit-text-decorations-in-effect: none; color: black;"&gt;&lt;a href="http://upload.wikimedia.org/wikipedia/commons/thumb/d/d9/Flag_of_Norway.svg/125px-Flag_of_Norway.svg.png" imageanchor="1" style="clear: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" src="http://upload.wikimedia.org/wikipedia/commons/thumb/d/d9/Flag_of_Norway.svg/125px-Flag_of_Norway.svg.png" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;
There are limits to how much we can absorb from American (and even British) experience reports. Germany and Norway are both social-security oriented economies, with conservative innovation habits, well on the way into privatizing a bunch of former national institutions (rail, telecom, post/logistics, health).&lt;br /&gt;
&lt;br /&gt;
So we have a lot of things in common. And if I may say, people are very similar in regards to personality and behavior (the way we eat, drink, talk, politeness, etc.). But Norway is tiny and Germany is huge, which makes Norway a bit like a miniature test-lab for Germany. What works on in Norway could work in Germany on a larger scale.&lt;br /&gt;
&lt;br /&gt;
To name one example: The traditional rejection of agile projects in Norway's public sector projects was overcome some few years ago by (among other things) the creation of an agile contract&amp;nbsp;standard, &lt;a href="http://www.dataforeningen.no/it-contract-standards.146223.no.html"&gt;the PS2000 agile&lt;/a&gt;. Since then, several successful projects have made use of this contract, both in public and private sector.&lt;br /&gt;
&lt;br /&gt;
Is this a lesson we could port to Germany somehow?&lt;br /&gt;
&lt;br /&gt;
Also check out&amp;nbsp;&lt;a href="http://kurthaeusler.wordpress.com/2011/04/09/agile-lean-europe/"&gt;Kurt Häusler's thoughts in this post&lt;/a&gt;&amp;nbsp;and&amp;nbsp;&lt;a href="http://hhgttg.de/blog/?p=315"&gt;Olaf Lewitz's summary from the Düsseldorf meeting&lt;/a&gt;. Both of them, as well as Johannes Brodwall are attending the ALE Network events at the &lt;a href="http://xp2011.org/"&gt;XP Madrid conference&lt;/a&gt;&amp;nbsp;in a couple of weeks.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11485756-5338511679771577199?l=blog.tfnico.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/tfnico?a=rZFqO4ZrX54:_FrwzFyAmJM:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/tfnico?i=rZFqO4ZrX54:_FrwzFyAmJM:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/tfnico/~4/rZFqO4ZrX54" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.tfnico.com/feeds/5338511679771577199/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.tfnico.com/2011/04/agile-lean-europe-some-thoughts.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/11485756/posts/default/5338511679771577199?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/11485756/posts/default/5338511679771577199?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/tfnico/~3/rZFqO4ZrX54/agile-lean-europe-some-thoughts.html" title="Agile Lean Europe: Some thoughts" /><author><name>Thomas Ferris Nicolaisen</name><uri>https://profiles.google.com/101470099289717563604</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-MH85nZaMLeo/AAAAAAAAAAI/AAAAAAAABO8/cZT0o_8utuc/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.tfnico.com/2011/04/agile-lean-europe-some-thoughts.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0QMSX88fCp7ImA9WhZSGEk.&quot;"><id>tag:blogger.com,1999:blog-11485756.post-9130908619896127231</id><published>2011-04-03T18:49:00.000+02:00</published><updated>2011-04-03T18:49:48.174+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-04-03T18:49:48.174+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="stuff" /><title>The Dreaded Service Locator Pattern</title><content type="html">&lt;a href="http://blog.kjempekjekt.com/2011/03/30/nnug-bergen-mars-2011-dependency-injection/"&gt;Torbjørn Marø recently blogged&lt;/a&gt; about Dependency Injection, due to&amp;nbsp;&lt;a href="http://blog.ploeh.dk/"&gt;Mark Seeman&lt;/a&gt; visiting the Norwegian .Net User Group in Bergen. This triggered my thinking about the dreaded Service Locator.&lt;br /&gt;
&lt;br /&gt;
I have worked with several teams that favored a home-made ServiceLocator class, a static component referencing a set of&amp;nbsp;&lt;i&gt;services&lt;/i&gt;, typically chunks of functionality that are singletons that interact with something external like database, filesystem, or web-service.&lt;br /&gt;
&lt;br /&gt;
My beef with the Service Locator is that you can put it in, and use it from anywhere: It can be used to grab services in a controller/action component, inside a service, in a domain object, inside a for-loop, anywhere. This sounds pretty powerful, but ends up bringing in a lot of maintenance problems.&lt;br /&gt;
&lt;br /&gt;
Now, in spite of my troublesome experiences with it, I keep finding myself being pretty lousy at explaining the disadvantages of a ServiceLocator to my peers.&lt;br /&gt;
&lt;br /&gt;
I therefore hunted through Seeman's blog for some better explanations, and here's what I found:&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://blog.ploeh.dk/2010/02/03/ServiceLocatorIsAnAntiPattern.aspx"&gt;Service Locator is an Anti-Pattern&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.ploeh.dk/2010/02/03/ServiceLocatorIsAnAntiPattern.aspx"&gt;Pattern Recognition: Abstract Factory or Service Locator?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.ploeh.dk/2010/11/01/RefactoringFromServiceLocatorToAbstractFactory.aspx"&gt;Refactoring from Service Locator to Abstract Factory&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;div&gt;He totally nails it in the first post:&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Tahoma, Lucida, Geneva, Helvetica, Arial, sans-serif; font-size: x-small; line-height: 19px;"&gt;&lt;blockquote&gt;Service Locator is a well-known pattern, and since it was&amp;nbsp;&lt;a href="http://blog.ploeh.dk/ct.ashx?id=89bf0c61-5cf2-4e92-8b53-fa0a10d06945&amp;amp;url=http%3a%2f%2fmartinfowler.com%2farticles%2finjection.html" style="color: #355ea0; font-weight: bold; text-decoration: none;"&gt;described by Martin Fowler&lt;/a&gt;, it must be good, right?&lt;br /&gt;
No, it’s actually an&amp;nbsp;&lt;strong&gt;anti-pattern&lt;/strong&gt;&amp;nbsp;and should be avoided.&lt;br /&gt;
Let’s examine why this is so. In short, the problem with Service Locator is that it hides a class’ dependencies, causing run-time errors instead of compile-time errors, as well as making the code more difficult to maintain because it becomes unclear when you would be introducing a breaking change.&lt;/blockquote&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;Also have a look at the comments for some more discussion and affirmation.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;Seeman has also written a &lt;a href="http://manning.com/seemann/"&gt;book on the subject of DI&lt;/a&gt;, and Service Locator is discussed within. I haven't read it, but it sounds pretty good, especially if you work with .Net.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;In case you got a little lost in his C# examples, here's my own take on it:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;Let's say you want to test a &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;CustomerRepository&lt;/span&gt;&amp;nbsp;(an already initialized field in this test class):&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;@Test customerRepositoryHasCustomers {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;assertTrue(customerRepository.hasCustomers());&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;Bang! This explodes in a null-pointer because you haven't injected the proper services that are used inside the &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;hasCustomers&lt;/span&gt; method (via ServiceLocator). So you try again:&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;@Test customerRepositoryHasCustomers {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;ServiceLocator.setRemoteCustomerService(new MockCustomerService());&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;assertTrue(customerRepository.hasCustomers());&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;Bang again! This is because there is another service which is used inside the &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;hasCustomers&lt;/span&gt; method a little later.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;As you can see, once you know what you need, the ServiceLocator is pretty straight forward to use. &amp;nbsp;And you don't notice this need during runtime, because the ServiceLocator is fully populated during startup. &amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;(This explains why the Service Locator being a perfectly fine pattern for those who don't enjoy writing tests.)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;Then there's the maintenance issue: If you change the &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;hasCustomers&lt;/span&gt; method to make use of even more services, you won't discover that the tests are broken until you run them again. Also the other way around: If you remove use of services in the method, you aren't reminded to remove this superflous setup from your tests.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;In total, Service Locator removes a whole lot of compile-time verification that would be nice to have. Again, this doesn't matter much for those who don't write tests.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;But, it does matter for the over all drive towards good code and architecture. Quoting Mark Seeman again (from the end of the third post):&lt;/div&gt;&lt;blockquote&gt;&lt;span class="Apple-style-span" style="font-family: Tahoma, Lucida, Geneva, Helvetica, Arial, sans-serif; font-size: x-small; line-height: 19px;"&gt;Refactoring from Service Locator to Abstract Factories make it more painful to violate the &lt;a href="http://en.wikipedia.org/wiki/Single_responsibility_principle"&gt;SRP&lt;/a&gt;.&lt;/span&gt;&lt;/blockquote&gt;&lt;div&gt;Using Service Locators breaks the window that usually stops you from giving a class too much responsibility. Usually, when you see the number of constructor, or method arguments are towering past a handful, you start thinking "refactor?". But with the Service Locator in use, you don't get this reaction.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11485756-9130908619896127231?l=blog.tfnico.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/tfnico?a=Cs5PV27B81M:iYK6iofSllM:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/tfnico?i=Cs5PV27B81M:iYK6iofSllM:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/tfnico/~4/Cs5PV27B81M" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.tfnico.com/feeds/9130908619896127231/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.tfnico.com/2011/04/dreaded-service-locator-pattern.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/11485756/posts/default/9130908619896127231?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/11485756/posts/default/9130908619896127231?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/tfnico/~3/Cs5PV27B81M/dreaded-service-locator-pattern.html" title="The Dreaded Service Locator Pattern" /><author><name>Thomas Ferris Nicolaisen</name><uri>https://profiles.google.com/101470099289717563604</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-MH85nZaMLeo/AAAAAAAAAAI/AAAAAAAABO8/cZT0o_8utuc/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.tfnico.com/2011/04/dreaded-service-locator-pattern.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEUDRXszfSp7ImA9WhZSGU4.&quot;"><id>tag:blogger.com,1999:blog-11485756.post-4027264458595074025</id><published>2011-03-26T14:36:00.001+01:00</published><updated>2011-04-04T17:51:14.585+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-04-04T17:51:14.585+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="stuff" /><category scheme="http://www.blogger.com/atom/ns#" term="git-svn" /><title>Git+SVN at the Java User Group in Essen (ruhrjug)</title><content type="html">&lt;b&gt;Update: There's now a Xing signup for the event:&amp;nbsp;&lt;a href="https://www.xing.com/events/living-with-git-and-subversion-parallel-710010"&gt;https://www.xing.com/events/living-with-git-and-subversion-parallel-710010&lt;/a&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
I will be heading up to Essen next month to present Git+SVN at the &lt;a href="http://ruhrjug.de/vorschau/details/25-livin-with-git-and-subversion-in-parallel-mit-thomas-nicolaisen"&gt;&lt;b&gt;ruhrjug &lt;/b&gt;event&lt;/a&gt;. The arrangers (&lt;a href="http://infaktum.de/"&gt;Infaktum&lt;/a&gt;) are also behind &lt;a href="http://gearconf.com/"&gt;GearConf&lt;/a&gt;, where I &lt;a href="http://blog.tfnico.com/2010/10/gearconf-2010-impressions.html"&gt;presented on the same topic last year&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
The event takes place on 14th of April, and starts at 18:00 in the Glaspavillon Campus Essen:&lt;br /&gt;
&lt;br /&gt;
&lt;iframe frameborder="0" height="450" marginheight="0" marginwidth="0" scrolling="no" src="http://maps.google.com/maps?q=Universit%C3%A4tsstr.+12,+45127+Essen,+DE&amp;amp;ie=UTF8&amp;amp;hq=&amp;amp;hnear=Universit%C3%A4tsstra%C3%9Fe+12,+Essen+45141+Essen,+Nordrhein-Westfalen,+Germany&amp;amp;z=14&amp;amp;ll=51.46323,7.00949&amp;amp;output=embed" width="425"&gt;&lt;/iframe&gt;&lt;br /&gt;
&lt;small&gt;&lt;a href="http://maps.google.com/maps?q=Universit%C3%A4tsstr.+12,+45127+Essen,+DE&amp;amp;ie=UTF8&amp;amp;hq=&amp;amp;hnear=Universit%C3%A4tsstra%C3%9Fe+12,+Essen+45141+Essen,+Nordrhein-Westfalen,+Germany&amp;amp;z=14&amp;amp;ll=51.46323,7.00949&amp;amp;source=embed" style="color: blue; text-align: left;"&gt;View Larger Map&lt;/a&gt;&lt;/small&gt;&lt;br /&gt;
&lt;br /&gt;
If you want to know the tricks of living with &lt;a href="http://www.tfnico.com/presentations/git-and-subversion"&gt;Git and Subversion in parallel&lt;/a&gt;, be there!&lt;br /&gt;
&lt;br /&gt;
I'll be showing off all the steps, from getting started with git-svn, through the obligatory Git-Subversion mirror, to the final-migration-away-from-SVN. Hopefully there'll be&amp;nbsp;time for showing off stuff I didn't get to at GearConf, as well as some good discussion.&lt;br /&gt;
&lt;br /&gt;
Oh, by the way, if you've got any reference cases where you are also using git-svn, I would love to hear about it. I recently noticed that &lt;a href="http://wiki.gnucash.org/wiki/Git"&gt;Gnu Cash&lt;/a&gt;&amp;nbsp;are using it, and it would make me happy to hear if others have had success with it (or if you had troubles, drop by the &lt;a href="http://groups.google.com/group/git-users/"&gt;Git-for-human-beings mailing list&lt;/a&gt; and ask there).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11485756-4027264458595074025?l=blog.tfnico.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/tfnico?a=1B74Ciz_t_U:qpClDigaURw:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/tfnico?i=1B74Ciz_t_U:qpClDigaURw:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/tfnico/~4/1B74Ciz_t_U" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.tfnico.com/feeds/4027264458595074025/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.tfnico.com/2011/03/gitsvn-at-java-user-group-in-essen.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/11485756/posts/default/4027264458595074025?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/11485756/posts/default/4027264458595074025?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/tfnico/~3/1B74Ciz_t_U/gitsvn-at-java-user-group-in-essen.html" title="Git+SVN at the Java User Group in Essen (ruhrjug)" /><author><name>Thomas Ferris Nicolaisen</name><uri>https://profiles.google.com/101470099289717563604</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-MH85nZaMLeo/AAAAAAAAAAI/AAAAAAAABO8/cZT0o_8utuc/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.tfnico.com/2011/03/gitsvn-at-java-user-group-in-essen.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Dk8HQXgzeyp7ImA9WhZTFEo.&quot;"><id>tag:blogger.com,1999:blog-11485756.post-737575105299784023</id><published>2011-03-18T20:00:00.000+01:00</published><updated>2011-03-18T20:00:30.683+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-03-18T20:00:30.683+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="git-svn" /><title>The Dream of a Bi-directional Git-SVN mirror</title><content type="html">&lt;span class="Apple-style-span" style="color: #444444; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 13px; line-height: 18px;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="background-color: yellow;"&gt;This post is part of&amp;nbsp;&lt;a href="http://www.tfnico.com/presentations/git-and-subversion" style="color: #3778cd; text-decoration: none;"&gt;a series on Git and Subversion&lt;/a&gt;. To see all the related posts, screencasts and other resources, please&amp;nbsp;&lt;a href="http://www.tfnico.com/presentations/git-and-subversion" style="color: #3778cd; text-decoration: none;"&gt;click here&lt;/a&gt;.&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
I just got an email asking me how one can set up a bi-directional Git-SVN mirror. It ended up being quite a long answer, so I'll post it here for the benefit of other Git-SVN readers with the same idea.&lt;br /&gt;
&lt;br /&gt;
As you may know, I'm a proponent of &lt;a href="http://www.tfnico.com/presentations/git-and-subversion"&gt;my own Git-SVN setup&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
I remember trying to go down the path of a bi-directional repository, but always ran into problems. Here is how it could work:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://lh5.googleusercontent.com/-K5-TESB7_1M/TYOny7f6jNI/AAAAAAAABJs/c5sPuBgipU0/s1600/git-svn-bi-directional.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="https://lh5.googleusercontent.com/-K5-TESB7_1M/TYOny7f6jNI/AAAAAAAABJs/c5sPuBgipU0/s400/git-svn-bi-directional.png" width="360" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
However nice this would be to have, it can be very hard to achieve in practice:&lt;br /&gt;
&lt;br /&gt;
Git-svn requires working in a non-bare repository, so pushing to it is&amp;nbsp;by default refused. You can work around this by doing this&amp;nbsp;in the target sync repo:&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;git config receive.denyCurrentBranch ignore&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
You also&amp;nbsp;have to automatically perform a &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;git reset --hard&lt;/span&gt; in the syncing repo&amp;nbsp;after each push (by some git hook?), because the work-dir is considered&amp;nbsp;dirty when it is out of sync with the repository (a consequence of the&amp;nbsp;previous workaround).&lt;br /&gt;
&lt;br /&gt;
And now comes the really tricky part. Consider the following example:&lt;br /&gt;
&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;Bob commits change &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;A&lt;/span&gt; in his local git repository, and pushes this&amp;nbsp;to the sync repo.&lt;/li&gt;
&lt;li&gt;The sync repo does a &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;git svn fetch&lt;/span&gt; (automatically to retain linear history).&lt;/li&gt;
&lt;li&gt;It then performs a &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;dcommit&lt;/span&gt;, but in doing so, Bob's commit is&amp;nbsp;re-written (with SVN meta data), therefore the commit changes into&amp;nbsp;being &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;A´&lt;/span&gt;.&lt;/li&gt;
&lt;li&gt;The central git repo dcommits the change &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;A´&lt;/span&gt; to the SVN repo.&lt;/li&gt;
&lt;/ol&gt;&lt;br /&gt;
You see what has happened now? Bob's history has diverged from that of the&amp;nbsp;sync repo:&lt;br /&gt;
&lt;br /&gt;
Bob's history: &amp;nbsp; &amp;nbsp;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;X &amp;lt;- Y &amp;lt;- Z &amp;lt;- A&lt;/span&gt;&lt;br /&gt;
Central history: &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;X &amp;lt;- Y &amp;lt;- Z &amp;lt;- A´&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
So the next time Bob does a pull, Git will see that history has&amp;nbsp;diverged, and automatically create a merge commit so Bob's history&amp;nbsp;looks like this:&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; A&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Bob's history: X &amp;lt;- Y &amp;lt;- Z &amp;lt;- / &amp;nbsp;\ &amp;lt;- merge commit&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;\ &amp;nbsp;/&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; A´&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
You don't want this to happen, because next time Bob pushes, the merge&amp;nbsp;commit will be dcommited, and so an evil circle is created.&lt;br /&gt;
&lt;br /&gt;
You can avoid this by getting Bob to do a &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;git pull --rebase&lt;/span&gt;, as Git&amp;nbsp;(at least now when I tried it out) automagically figures out that &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;A&lt;/span&gt;&amp;nbsp;and &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;A´&lt;/span&gt; are actually the same commit, and discards the former of them&amp;nbsp;appropriately.&lt;br /&gt;
&lt;br /&gt;
You still will have to deal with some other problems:&lt;br /&gt;
&lt;br /&gt;
* Concurrency between commits - basically if somebody commits to SVN&amp;nbsp;before the git repository has a time to sync a push from a git user,&amp;nbsp;your syncing-repo gets messed up and needs to be manually reset (and&amp;nbsp;probably the git pusher will have to repeat his push). This can get&amp;nbsp;ugly, and it would happen relatively often in a busy repository.&lt;br /&gt;
&lt;br /&gt;
* In case you have set up a physically split bare-repo and fetching-repo (like I've recommended on numerous occasions), the&amp;nbsp;concurrency issues get slightly worsened, as you need to implement&amp;nbsp;some locking mechanism across both repositories. Perhaps the best&amp;nbsp;thing to do here is to go back to one single git/svn syncing-repo&amp;nbsp;instead.&lt;br /&gt;
&lt;br /&gt;
In summary:&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Your developers will have to always do pull --rebase before and&amp;nbsp;after pushing.&lt;/li&gt;
&lt;li&gt;It has to be a low-traffic subversion repository, preferably all&amp;nbsp;committers sitting co-located.&lt;/li&gt;
&lt;li&gt;You have to be ready to dive in and fix any problems quickly (or&amp;nbsp;have several people who can).&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
So, I hope you have enough information to properly consider whether&amp;nbsp;this is worth going for. If you do, I would love to hear how it works&amp;nbsp;out.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;For the record: I do not recommend the bi-directional syncing repo approach.&lt;/b&gt; I still prefer &lt;a href="http://www.tfnico.com/presentations/git-and-subversion"&gt;my original setup&lt;/a&gt; where each developer is responsible for dcommitting back to Subversion. It's not so much more complicated for the Git users, and it is much safer, concurrency-wise.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11485756-737575105299784023?l=blog.tfnico.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/tfnico?a=Ky2em2HhAK4:sHPzJ95EKQU:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/tfnico?i=Ky2em2HhAK4:sHPzJ95EKQU:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/tfnico/~4/Ky2em2HhAK4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.tfnico.com/feeds/737575105299784023/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.tfnico.com/2011/03/dream-of-bi-directional-git-svn-mirror.html#comment-form" title="4 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/11485756/posts/default/737575105299784023?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/11485756/posts/default/737575105299784023?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/tfnico/~3/Ky2em2HhAK4/dream-of-bi-directional-git-svn-mirror.html" title="The Dream of a Bi-directional Git-SVN mirror" /><author><name>Thomas Ferris Nicolaisen</name><uri>https://profiles.google.com/101470099289717563604</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-MH85nZaMLeo/AAAAAAAAAAI/AAAAAAAABO8/cZT0o_8utuc/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://lh5.googleusercontent.com/-K5-TESB7_1M/TYOny7f6jNI/AAAAAAAABJs/c5sPuBgipU0/s72-c/git-svn-bi-directional.png" height="72" width="72" /><thr:total>4</thr:total><feedburner:origLink>http://blog.tfnico.com/2011/03/dream-of-bi-directional-git-svn-mirror.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEcMRX45eSp7ImA9Wx9UFUs.&quot;"><id>tag:blogger.com,1999:blog-11485756.post-320065669650855584</id><published>2011-02-13T02:54:00.000+01:00</published><updated>2011-02-13T02:54:44.021+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-02-13T02:54:44.021+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="git" /><category scheme="http://www.blogger.com/atom/ns#" term="git-svn" /><title>A small Subversion guide for Git users</title><content type="html">A recurring problem for us Git users is that we tend to forget the good old Subversion tricks. We want to do some patch on some old code in a Subversion repo, and suddenly we've got no idea how to work around.&lt;br /&gt;
&lt;br /&gt;
Here's a quick guide:&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;gt; git pull&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;b&gt;&amp;gt; svn update&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;gt; git add new_file&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;b&gt;svn add new_file&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;gt; git add changed_file&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;N/A: SVN automatically adds all modifications to the index. If you don't want to commit it, don't change it.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;gt; git commit; git push&lt;/span&gt; (you always have to do these together):&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;b&gt;&amp;gt; svn commit&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;gt; git revert [SHA]&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;b&gt;&amp;gt; svn merge -c -[R] .&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;gt; git branch branch_name&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;b&gt;&amp;gt; svn copy url_to_project/trunk url_to_project/branches/branch_name&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;gt; git tag tag_name&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;b&gt;&amp;gt; svn copy url_to_project/trunk url_to_project/tags/tag_name&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;gt; git checkout branch_name&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;b&gt;&amp;gt; svn switch url_to_project/branches/branch_name/&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;b&gt;&lt;br /&gt;
&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;gt; git merge branch&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;b&gt;svn merge -r[start]:[end] url_to_project/branches/branch_name .&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
(Note that you have to keep track of at which revision you made the branch, and that the result will always be squashed. Renames and moves will create conflicts).&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;b&gt;&lt;br /&gt;
&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;gt; git rebase ...&lt;/span&gt;&lt;div&gt;Forget about it :)&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;b&gt;&lt;br /&gt;
&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
Please add other neat SVN tricks to the comments if you can think of any good ones ;)&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11485756-320065669650855584?l=blog.tfnico.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/tfnico?a=xeHb9_QXTqg:oG-ZSoKmuos:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/tfnico?i=xeHb9_QXTqg:oG-ZSoKmuos:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/tfnico/~4/xeHb9_QXTqg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.tfnico.com/feeds/320065669650855584/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.tfnico.com/2011/02/small-subversion-guide-for-git-users.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/11485756/posts/default/320065669650855584?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/11485756/posts/default/320065669650855584?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/tfnico/~3/xeHb9_QXTqg/small-subversion-guide-for-git-users.html" title="A small Subversion guide for Git users" /><author><name>Thomas Ferris Nicolaisen</name><uri>https://profiles.google.com/101470099289717563604</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-MH85nZaMLeo/AAAAAAAAAAI/AAAAAAAABO8/cZT0o_8utuc/s512-c/photo.jpg" /></author><thr:total>1</thr:total><feedburner:origLink>http://blog.tfnico.com/2011/02/small-subversion-guide-for-git-users.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0YMRH85eyp7ImA9WhdTE00.&quot;"><id>tag:blogger.com,1999:blog-11485756.post-3750956365517839170</id><published>2011-02-12T17:43:00.001+01:00</published><updated>2011-07-10T15:39:45.123+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-07-10T15:39:45.123+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="agile" /><title>XP-Meetups</title><content type="html">Kent Beck wrote a small chapter about &lt;i&gt;Communities&lt;/i&gt;&amp;nbsp;in his book &lt;a href="http://www.amazon.com/Extreme-Programming-Explained-Embrace-Change/dp/0321278658/ref=dp_ob_title_bk"&gt;Extreme Programming Explained: Embrace Change (2nd ed)&lt;/a&gt;:&lt;br /&gt;
&lt;blockquote&gt;
&lt;i&gt;Participate in communities, local and global. Look for communities that encourage you to be your best self. If you can't find such a community, start one yourself. If you are wrestling with difficult questions, you are not alone. As a community we can accomplish more than we ever could in isolation.&lt;/i&gt;&lt;/blockquote&gt;
When I lived in Oslo, I was a member of the local XP-meetup group. It was awesome. In the beginning, I was still a CS student, and I felt privileged I could attend these meetings. These experienced people were dropping serious knowledge about how to work and develop software in practice.&lt;br /&gt;
&lt;br /&gt;
It was so refreshing compared to the artificial subjects at university, and it just &lt;i&gt;made more sense&lt;/i&gt;. At the same time, the speakers were so humble, you could ask them anything, and they would try to identify with you, draw parallells based on experience, tell stories..&lt;br /&gt;
&lt;br /&gt;
Over the years, the meetup grew into being the largest XP-meetup &lt;a href="http://xp.meetup.com/"&gt;in the world&lt;/a&gt;, and they&amp;nbsp;attracted big jolt speakers like Tom Gilb, Michael Feathers, Jeff Sutherland, the Poppendiecks, Kent Beck and Uncle Bob. The organizers&amp;nbsp;started doing an annual &lt;a href="http://smidig.no/"&gt;conference&lt;/a&gt;, now gathering 500 participants.&amp;nbsp;&lt;a href="https://wiki.cantara.no/display/PE/Communities"&gt;Other meetups&lt;/a&gt; popped up as well, about Lean, Coding-Dojos, Agile Offshoring and more.&lt;br /&gt;
&lt;br /&gt;
I think these communities have made Oslo a vibrant city for software developers. There are numerous advantages to this:&lt;br /&gt;
&lt;br /&gt;
* Knowledge is shared, which benefits the community as a whole. People become more happier and better at their jobs. Projects become more successful. Old inefficient companies die out, and new companies that provide value to society are the ones that thrive.&lt;br /&gt;
&lt;br /&gt;
* There is synergy between communities. Oslo's Java User Group, javaBin, got more traction thanks to the XP-meetup, and vice versa. &lt;a href="http://javazone.no/"&gt;JavaZone&lt;/a&gt; is&amp;nbsp;arguably&amp;nbsp;the best Java conference in the world, and every year it's sold out. There even is an &lt;a href="http://cantara.no/"&gt;umbrella organization&lt;/a&gt; for the communities in the city, and they're talking about raising a &lt;a href="https://wiki.cantara.no/display/PE/utviklerhuset"&gt;building for hosting communities&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
* Networks between software developers are extended. I think this actually sharpens the competition for creating the best place to work for the developers. Communities give a lot of insight on how it is to work for another company, which in turn makes it more tempting to switch ships. The companies who want the best people have to make themselves more attractive, which again means more budget for salary, conferences and courses.&lt;br /&gt;
&lt;br /&gt;
In the end, developers get better treatment, become better at what they do, and enjoy life more. Society gets more value from the software produced. Everybody wins.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Bonn, with a population of 320.000, is not as big as Oslo, but it's certainly big enough to maintain its own community of XP-practitioners (aka Extreme Programmers). We'll do &lt;a href="http://bonnagile.blogspot.com/2011/02/meetup-february-21st-at-quiet-man.html"&gt;our first XP-meetup&lt;/a&gt; on the 21st of February, in an a bar 5 minutes from the central station. I hope you'll join too!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11485756-3750956365517839170?l=blog.tfnico.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/tfnico?a=53WCTeb_HOM:bCiQSCi8vXE:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/tfnico?i=53WCTeb_HOM:bCiQSCi8vXE:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/tfnico/~4/53WCTeb_HOM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.tfnico.com/feeds/3750956365517839170/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.tfnico.com/2011/02/xp-meetups.html#comment-form" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/11485756/posts/default/3750956365517839170?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/11485756/posts/default/3750956365517839170?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/tfnico/~3/53WCTeb_HOM/xp-meetups.html" title="XP-Meetups" /><author><name>Thomas Ferris Nicolaisen</name><uri>https://profiles.google.com/101470099289717563604</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-MH85nZaMLeo/AAAAAAAAAAI/AAAAAAAABO8/cZT0o_8utuc/s512-c/photo.jpg" /></author><thr:total>2</thr:total><feedburner:origLink>http://blog.tfnico.com/2011/02/xp-meetups.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUENRnszeyp7ImA9Wx9UFkU.&quot;"><id>tag:blogger.com,1999:blog-11485756.post-2833318218554378538</id><published>2011-02-11T21:40:00.001+01:00</published><updated>2011-02-14T13:48:17.583+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-02-14T13:48:17.583+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="stuff" /><category scheme="http://www.blogger.com/atom/ns#" term="maven" /><title>Sonatype and Hudson/Jenkins: An Analysis</title><content type="html">I'm dare say I'm a seasoned Hudson user (admin) and proponent. For over five years I've been introducing different kinds of &lt;a href="http://en.wikipedia.org/wiki/Continuous_integration"&gt;CI&lt;/a&gt; at whichever place I worked at. When Hudson entered my radar, this work became a lot easier. I'm also a heavy &lt;a href="http://blog.tfnico.com/search/label/maven"&gt;Maven&lt;/a&gt; user, and &lt;a href="http://nexus.sonatype.org/"&gt;Nexus&lt;/a&gt; did for Maven repositories what Hudson did for CI.&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: large;"&gt;The Plot&lt;/span&gt;&lt;br /&gt;
Over recent weeks, the community around Hudson has been shaken by a fork: The main developers (&lt;a href="http://kohsuke.org/"&gt;Koshuke&lt;/a&gt; and crew) have renamed &lt;a href="http://hudson-ci.org/"&gt;Hudson&lt;/a&gt; to &lt;a href="http://jenkins-ci.org/"&gt;Jenkins&lt;/a&gt;, while Oracle have &lt;a href="http://java.net/projects/hudson/lists/announce/archive/2011-02/message/0"&gt;kept on&lt;/a&gt; developing Hudson in partnership with &lt;a href="http://sonatype.com/"&gt;Sonatype&lt;/a&gt;. Here's a simple illustration of what happened:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-ovR4h6P3Vak/TVU-TtF63AI/AAAAAAAABIs/UFomzTrdJ8Q/s1600/hudson-vs-jenkins.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="http://1.bp.blogspot.com/-ovR4h6P3Vak/TVU-TtF63AI/AAAAAAAABIs/UFomzTrdJ8Q/s400/hudson-vs-jenkins.png" width="282" /&gt;&lt;/a&gt;&lt;/div&gt;These are my pure external speculations about what has happened recently in the forking process, with regards to Sonatype's involvement in particular.&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: large;"&gt;So who is running this show?&lt;/span&gt;&lt;br /&gt;
I noticed that Sonatype (usually personified by Jason) have gotten their fingers pretty deeply into the Hudson infrastructure already:&lt;br /&gt;
&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Like&amp;nbsp;&lt;a href="http://twitter.com/#!/aheritier/status/34564875199979520"&gt;this tweet&lt;/a&gt;&amp;nbsp;noted, it appears they are controlling Hudson's Twitter account. The &lt;a href="http://twitter.com/#!/hudsonci"&gt;@hudsonci&lt;/a&gt; account tweeted about something Maven-related, and it appeared it it was indeed meant for a Sonatype account.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;And &lt;a href="http://java.net/projects/hudson/lists/dev/archive/2011-02/message/28"&gt;here&lt;/a&gt; it appears Jason is administering some of the Hudson infrastructure.&amp;nbsp;&lt;/div&gt;&lt;br /&gt;
It's no secret that Sonatype and Oracle are tightly partnered on this. But I think the relationship is more like one of a smart trickster sitting on the shoulders of a dumb giant.&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: large;"&gt;Backstabbers and Benson&lt;/span&gt;&lt;br /&gt;
A lot of people felt betrayed when Sonatype chose to side with Hudson/Oracle in the fork. Heck, even I was disgruntled that my Maven heroes were going with the big evil anti-open source Oracle..&lt;br /&gt;
&lt;br /&gt;
I've been pondering on why they did this unpopular move, and here's my rough guess:&lt;br /&gt;
&lt;br /&gt;
The reason is &lt;b&gt;Benson&lt;/b&gt;:&lt;br /&gt;
&lt;blockquote&gt;&lt;i&gt;Benson is Sonatype's Maven-focused distribution of Hudson taking into account everything that we've learned about Maven 3.0 during its development and how Maven should operate optimally within a CI environment: there will be no better way to work with Maven and Hudson. Benson is Hudson's brother from another mother. (&lt;a href="http://webcache.googleusercontent.com/search?q=cache:baq-NoIG41cJ:www.sonatype.com/~jvanzyl/javazone-2010.html+sonatype+benson&amp;amp;cd=1&amp;amp;hl=en&amp;amp;ct=clnk&amp;amp;gl=de&amp;amp;source=www.google.de"&gt;source&lt;/a&gt;)&lt;/i&gt;&lt;/blockquote&gt;As with any fork, maintaining it is expensive. I think Sonatype found it hard to keep Benson up to date with Hudson and all its plugins. Or maybe they wanted more changes in direction Nexus/Maven than the Koshuke crew were willing to go with.&lt;br /&gt;
&lt;br /&gt;
&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;See more about Benson in &lt;a href="http://streaming.java.no/tcs/?id=0FF55F2E-CC69-4FF8-B28F-6BC3A08B9665"&gt;Jason's presentation from JavaZone 2010&lt;/a&gt;&amp;nbsp;(time 39:20).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: large;"&gt;A Genius Take-over&lt;/span&gt;&lt;/div&gt;Had Hudson stayed under Koshuke's rapid development, Sonatype would've had to keep on maintaining Benson, merging in conflicting Hudson changes as they grew ever more distant from the fork.&lt;br /&gt;
&lt;br /&gt;
Now, they can achieve the same with Hudson itself, and in the process they gain a huge brand by sticking to the Hudson name, and they also stay under Oracle's wing (this has its own con's, of course), with infrastructure and paid coding&amp;nbsp;contributors.&lt;br /&gt;
&lt;br /&gt;
So in a way, &lt;i&gt;Hudson is the new Benson&lt;/i&gt;.&lt;br /&gt;
&lt;br /&gt;
You can actually see this manifestation taking place &lt;a href="http://java.net/projects/hudson/lists/dev/archive/2011-02/message/72"&gt;right now&lt;/a&gt;. I guess you could simplify this to mean that Sonatype are now merging back the development they made in Benson. What the community is wondering, is &lt;a href="http://www.sonatype.com/people/2011/02/hudsons-bright-future/"&gt;why they didn't offer to do so before the fork&lt;/a&gt;&amp;nbsp;(see the discussion in the comments), but that doesn't really matter anymore. Sonatype came in at exactly the right time, and did what was best for their company and customers. Nothing wrong with that.&lt;br /&gt;
&lt;br /&gt;
My two biggest questions of this are:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Will Oracle put up with Sonatype's strategy over time?&lt;/li&gt;
&lt;li&gt;Will Sonatype put up with Oracle's inherent&amp;nbsp;bureaucratic&amp;nbsp;inertia?&lt;/li&gt;
&lt;/ul&gt;Over time there's nothing stopping Sonatype from forking out Benson again, if it turns out Oracle's wheels are winding too slow. Another possibility is that&amp;nbsp;Oracle takes a liking to Sonatype's infrastructure tools and proposes a buy-up.&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: large;"&gt;This is a Good Thing&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;I think Sonatype is one of those rare companies that are able to work the open-source ecosystem, making a profit while at the same time donating a huge amount of great tooling back to the community. Some times they have to make unpopular compromises in order to stay profitable, and this is what happened with Hudson/Jenkins.&lt;/div&gt;&lt;br /&gt;
Nexus is an awesome product. It&amp;nbsp;shares many of Hudson's qualities: It *just works*, it looks nice, it's easy to upgrade and maintain. I hope Hudson will retain these qualities. I'm sure Jenkins will.&lt;br /&gt;
&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-size: large;"&gt;What path will you take?&lt;/span&gt;&lt;br /&gt;
&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Personally, I think I'll go with Jenkins for now. I'm tempted to go with Sonatype/Hudson because we extensively use Nexus and Maven, and we're not paying Sonatype-customers. At the same time, I have only moderate needs for stability, and from experience I'm very happy with the features vs stability rating of the Koshuke crew.&lt;br /&gt;
&lt;br /&gt;
I think (but might be wrong), that Jenkins will outrace Hudson in terms of features and usability.&lt;br /&gt;
&lt;br /&gt;
I fear, that Hudson will get tangled down with Oracle stuff (register here to download, etc).&lt;br /&gt;
&lt;br /&gt;
I hope both will continue to exist and fulfill two different needs in the market. Best of luck to both of them!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11485756-2833318218554378538?l=blog.tfnico.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/tfnico?a=rC16CQMygb0:TOSb2D1UtgE:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/tfnico?i=rC16CQMygb0:TOSb2D1UtgE:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/tfnico/~4/rC16CQMygb0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.tfnico.com/feeds/2833318218554378538/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.tfnico.com/2011/02/sonatype-and-hudsonjenkins-analysis.html#comment-form" title="8 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/11485756/posts/default/2833318218554378538?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/11485756/posts/default/2833318218554378538?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/tfnico/~3/rC16CQMygb0/sonatype-and-hudsonjenkins-analysis.html" title="Sonatype and Hudson/Jenkins: An Analysis" /><author><name>Thomas Ferris Nicolaisen</name><uri>https://profiles.google.com/101470099289717563604</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-MH85nZaMLeo/AAAAAAAAAAI/AAAAAAAABO8/cZT0o_8utuc/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-ovR4h6P3Vak/TVU-TtF63AI/AAAAAAAABIs/UFomzTrdJ8Q/s72-c/hudson-vs-jenkins.png" height="72" width="72" /><thr:total>8</thr:total><feedburner:origLink>http://blog.tfnico.com/2011/02/sonatype-and-hudsonjenkins-analysis.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUANRng9eSp7ImA9Wx9UEE4.&quot;"><id>tag:blogger.com,1999:blog-11485756.post-4823261428545215700</id><published>2011-02-07T00:09:00.000+01:00</published><updated>2011-02-07T00:09:57.661+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-02-07T00:09:57.661+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="stuff" /><title>Google Guava r08 is released</title><content type="html">A few days ago, &lt;a href="http://code.google.com/p/guava-libraries/wiki/Release08"&gt;Google Guava r08 was released&lt;/a&gt;.&lt;br /&gt;
&lt;blockquote&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; font-family: arial, sans-serif; font-size: 13px;"&gt;"This project contains several of Google's core libraries that we rely on in our Java-based projects: collections, caching, primitives support, concurrency libraries, common annotations, basic string processing, I/O, etc."&lt;/span&gt;&lt;/blockquote&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://upload.wikimedia.org/wikipedia/commons/4/44/Psidium_guajava_fruit2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="150" src="http://upload.wikimedia.org/wikipedia/commons/4/44/Psidium_guajava_fruit2.jpg" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
I had a little look through the API changes to find some neat new details, and put together a couple of JUnit tests that show them &lt;a href="https://github.com/tfnico/guava-examples/blob/9382a34a042ecbf2d0586041b14d4985c05eef2c/src/test/java/com/tfnico/examples/guava/NewStuffInR08Test.java"&gt;by example here&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
That whole GitHub project is a Guava showcase, so if you can think of some more examples that should be in there, &lt;a href="https://github.com/tfnico/guava-examples"&gt;please fork&lt;/a&gt;! Especially the IO, Net, &amp;nbsp;and Concurrency bits could need some examples.&lt;br /&gt;
&lt;br /&gt;
I've also taken my old blogposts about Google Guava and ported them to &lt;a href="http://tfnico.com/presentations/guava"&gt;tfnico.com/presentations/guava&lt;/a&gt;. After noting this, the Guava guys honored the effort by linking the page from &lt;a href="http://code.google.com/p/guava-libraries/"&gt;the Guava homepage&lt;/a&gt;, which gave me quite the traffic bump! Luckily, my pages are all hosted on Google servers, so it's their own bandwidth bill ;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11485756-4823261428545215700?l=blog.tfnico.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/tfnico?a=H3_qDhFHYBg:-cn_SFKKS-0:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/tfnico?i=H3_qDhFHYBg:-cn_SFKKS-0:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/tfnico/~4/H3_qDhFHYBg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.tfnico.com/feeds/4823261428545215700/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://blog.tfnico.com/2011/02/google-guava-r08-is-released.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/11485756/posts/default/4823261428545215700?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/11485756/posts/default/4823261428545215700?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/tfnico/~3/H3_qDhFHYBg/google-guava-r08-is-released.html" title="Google Guava r08 is released" /><author><name>Thomas Ferris Nicolaisen</name><uri>https://profiles.google.com/101470099289717563604</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-MH85nZaMLeo/AAAAAAAAAAI/AAAAAAAABO8/cZT0o_8utuc/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.tfnico.com/2011/02/google-guava-r08-is-released.html</feedburner:origLink></entry></feed>

