<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Tigraine &#187; Tools</title>
	<atom:link href="http://www.tigraine.at/category/tools/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.tigraine.at</link>
	<description>Daniel Hoelbling talks about programming</description>
	<lastBuildDate>Fri, 03 Feb 2012 00:02:43 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=</generator>
		<item>
		<title>Make GNU screen xterm-256color work on OSX</title>
		<link>http://www.tigraine.at/2012/01/25/make-gnu-screen-xterm-256color-work-on-osx/</link>
		<comments>http://www.tigraine.at/2012/01/25/make-gnu-screen-xterm-256color-work-on-osx/#comments</comments>
		<pubDate>Wed, 25 Jan 2012 20:26:03 +0000</pubDate>
		<dc:creator>Daniel Hölbling</dc:creator>
				<category><![CDATA[Tools]]></category>

		<guid isPermaLink="false">http://www.tigraine.at/?p=1218</guid>
		<description><![CDATA[I just ran into this and spend like 2 hours with Linux genius Jam trying to figure out why in the heck I could run Vim in 256 colors mode on my server while once I started screen it didn&#8217;t work any more. The issue was two fold. a) My local Terminal.app was reporting itself [...]]]></description>
			<content:encoded><![CDATA[<p>I just ran into this and spend like 2 hours with Linux genius Jam trying to figure out why in the heck I could run Vim in 256 colors mode on my server while once I started screen it didn&#8217;t work any more.</p>
<p>The issue was two fold. a) My local Terminal.app was reporting itself as xterm-color instead of xterm-256color. You have to update this setting in your Terminal app here:</p>
<p><img class="aligncenter size-full wp-image-1219" title="Einstellungen" src="http://www.tigraine.at/wp-content/uploads/2012/01/Einstellungen.png" alt="" width="571" height="83" /></p>
<p>&nbsp;</p>
<p>Once done you only need to edit your <code>.screenrc</code> to include the following 3 lines:</p>
<p>&nbsp;</p>
<pre name="code"># terminfo and termcap for nice 256 color terminal
# allow bold colors - necessary for some reason
attrcolor b ".I"
# tell screen how to set colors. AB = background, AF=foreground
termcapinfo xterm 'Co#256:AB=\E[48;5;%dm:AF=\E[38;5;%dm'
# erase background with current bg color
defbce "on"
# set TERM
term screen-256color-bce</pre>
<p>Problem is: Even if you set your .screenrc correctly, it won&#8217;t matter if your terminal is not reporting the correct version string in the first place.. </p>
]]></content:encoded>
			<wfw:commentRss>http://www.tigraine.at/2012/01/25/make-gnu-screen-xterm-256color-work-on-osx/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Securely managing database.yml when deploying with Capistrano</title>
		<link>http://www.tigraine.at/2011/09/25/securely-managing-database-yml-when-deploying-with-capistrano/</link>
		<comments>http://www.tigraine.at/2011/09/25/securely-managing-database-yml-when-deploying-with-capistrano/#comments</comments>
		<pubDate>Sun, 25 Sep 2011 12:13:53 +0000</pubDate>
		<dc:creator>Daniel Hölbling</dc:creator>
				<category><![CDATA[Rails]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Tools]]></category>

		<guid isPermaLink="false">http://www.tigraine.at/?p=1139</guid>
		<description><![CDATA[The more I venture into Ruby land the more magic Unicorns I find on the way. The wonders of SSH still seem totally outlandish to someone used to do deployments by RDPing into a server and xcopying a directory structure into your IIS folder. But here I am and learning the ways of Capistrano and [...]]]></description>
			<content:encoded><![CDATA[<p>The more I venture into Ruby land the more magic <a href="http://unicorn.bogomips.org/">Unicorns</a> I find on the way. The wonders of SSH still seem totally outlandish to someone used to do deployments by RDPing into a server and xcopying a directory structure into your IIS folder. </p>
<p>But here I am and learning the ways of Capistrano and how deployments to multiple servers really should work.</p>
<p>Naturally I ran into issues I&#8217;ll detail a bit later, but one of my major problems with my Rails deployment was the different database.yml between my production and my dev environment.<br />
Since the repository is in a shared location I could not put the production server mysql password into the config as it would be available to anyone with read access to the repository.<br />
This may be something you can get away with in a corporate environment, but if you plan on ever open-sourcing your project you should make sure you don&#8217;t put production passwords into your repository <img src='http://www.tigraine.at/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .</p>
<p>My solution to that problem is quite simple: I ssh&#8217;d into my server and put a &#8220;production&#8221; database.yml into the home directory of my deployment user and added the following task to my <code>Capfile</code>:</p>
<pre class="ruby" name="code">
namespace :db do
  task :db_config, :except => { :no_release => true }, :role => :app do
    run "cp -f ~/database.yml #{release_path}/config/database.yml"
  end
end

after "deploy:finalize_update", "db:db_config"
</pre>
<p>The after statement tells Capistrano to run the db_config task right before finishing the code update, but before running any migrations in case you run <code>cap deploy:migrations</code> (<a href="https://github.com/mpasternacki/capistrano-documentation-support-files/raw/master/default-execution-path/Capistrano%20Execution%20Path.jpg">capistrano process</a>).<br />
And during every deployment I overwrite the database.yml from the repo with the one on the server.</p>
<p>I also added a assets:precompile task since Capistrano won&#8217;t run the precompilation of Rails assets out of the box (<a href="http://beginrescueend.com/integration/capistrano/">you need RVM integration for this though</a>):</p>
<pre name="code" class="ruby">
  task :precompile, :role => :app do
    run "cd #{release_path}/ &#038;&#038; rake assets:precompile"
  end
after "deploy:finalize_update", "deploy:precompile"
</pre>
<p>Et voilá: I can now run <code>cap deploy:migrations</code> from my dev machine and it will automatically connect to my release server, pull the code out of the git repository, compile the assets and migrate the database to a new version.<br />
And it will even roll-back to the old version if something goes wrong along the way.</p>
<p>Ps: I also struggled at one point with the SSH keys for the git repository. Since the deployment user on the server has no own private key I was inclined to generate one and add it to my git server&#8217;s allowed keys list.<br />
But that&#8217;s apparently the wrong way to go about things. The right thing to do here is to simply enable agent forwarding so the server will forward any questions about keys to your dev machine that should have the appropriate set of keys available.</p>
<p><code>ssh_options[:forward_agent] = true</code></p>
]]></content:encoded>
			<wfw:commentRss>http://www.tigraine.at/2011/09/25/securely-managing-database-yml-when-deploying-with-capistrano/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>SSH address book</title>
		<link>http://www.tigraine.at/2011/09/14/ssh-address-book/</link>
		<comments>http://www.tigraine.at/2011/09/14/ssh-address-book/#comments</comments>
		<pubDate>Wed, 14 Sep 2011 09:59:53 +0000</pubDate>
		<dc:creator>Daniel Hölbling</dc:creator>
				<category><![CDATA[Tools]]></category>

		<guid isPermaLink="false">http://www.tigraine.at/?p=1070</guid>
		<description><![CDATA[This may be old news to anyone somewhat used to Linux server administration, but Jammm just enlightened me so I thought I&#8217;d share. Say you don&#8217;t have a hostname associated with your server (yet), you may get bored of writing ssh root@192.168.0.1 all the time. Assuming you are using public key authentication anyways (and you [...]]]></description>
			<content:encoded><![CDATA[<p>This may be old news to anyone somewhat used to Linux server administration, but <a href="https://jammm.eu.org/blog/">Jammm</a> just enlightened me so I thought I&#8217;d share.</p>
<p>Say you don&#8217;t have a hostname associated with your server (yet), you may get bored of writing <code>ssh root@192.168.0.1</code> all the time. Assuming you are using public key authentication anyways (and you should!) writing <code>ssh myserver</code> would be far more convenient.</p>
<p>Turns out you can do that by modifying the <code>~/.ssh/config</code> file like this:</p>
<blockquote>
<pre>Host myserver
  HostName 192.168.0.1
  Port 22
  User root</pre>
</blockquote>
]]></content:encoded>
			<wfw:commentRss>http://www.tigraine.at/2011/09/14/ssh-address-book/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Measure execution time in PowerShell</title>
		<link>http://www.tigraine.at/2010/10/13/measure-execution-time-in-powershell/</link>
		<comments>http://www.tigraine.at/2010/10/13/measure-execution-time-in-powershell/#comments</comments>
		<pubDate>Wed, 13 Oct 2010 21:55:43 +0000</pubDate>
		<dc:creator>Daniel Hölbling</dc:creator>
				<category><![CDATA[Tools]]></category>

		<guid isPermaLink="false">http://www.tigraine.at/?p=964</guid>
		<description><![CDATA[I have no idea why, but although having been a Windows user for most of my career, I know the unix commandline pretty well. In fact, one of the best things in Powershell was the ls alias to the Get-ChildItem command. Naturally, Microsoft could not include an alias for every unix command out there, so [...]]]></description>
			<content:encoded><![CDATA[<p>I have no idea why, but although having been a Windows user for most of my career, I know the unix commandline pretty well. In fact, one of the best things in Powershell was the <code>ls</code> alias to the <code>Get-ChildItem</code> command.</p>
<p>Naturally, Microsoft could not include an alias for every unix command out there, so I spend a fair amount of time hunting down the Powershell equivalents to Unix commands whenever I need one.</p>
<p>This time it’s the <code>time</code> command that allows you to measure how long the execution of a particular command took. The Powershell equivalent is called <code>Measure-Command</code> and does exactly the same thing, returning a System.TimeSpan.</p>
<p>For example, to measure the execution time of a <code>git checkout</code>:</p>
<blockquote><p>Measure-Command { git checkout gh-pages }</p>
<p>Switched to branch ‘gh-pages’</p>
<p>Days              : 0</p>
<p>Hours             : 0</p>
<p>Minutes           : 0</p>
<p>Seconds           : 0</p>
<p>Milliseconds      : 344</p>
<p>Ticks             : 3448544</p>
<p>TotalDays         : 3,99137037037037E-06</p>
<p>TotalHours        : 9,57928888888889E-05</p>
<p>TotalMinutes      : 0,00574757333333333</p>
<p>TotalSeconds      : 0,3448544</p>
<p>TotalMilliseconds : 344,8544</p></blockquote>
<p>I considered creating an alias for <code>Mesaure-Command</code> to just <code>time</code>, but the usages are so rare that it’s not really necessary.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.tigraine.at/2010/10/13/measure-execution-time-in-powershell/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Using Readability on the iPhone</title>
		<link>http://www.tigraine.at/2010/09/11/using-readability-on-the-iphone/</link>
		<comments>http://www.tigraine.at/2010/09/11/using-readability-on-the-iphone/#comments</comments>
		<pubDate>Sat, 11 Sep 2010 21:37:00 +0000</pubDate>
		<dc:creator>Daniel Hölbling</dc:creator>
				<category><![CDATA[Internet]]></category>
		<category><![CDATA[Personal]]></category>
		<category><![CDATA[Tools]]></category>

		<guid isPermaLink="false">http://www.tigraine.at/2010/09/11/using-readability-on-the-iphone/</guid>
		<description><![CDATA[Disclaimer: This is not a post about programming. No code was harmed during the creation of this blogpost. As you may have guessed from the title, I got myself an iPhone4 some weeks ago and love it ever since. The browser in particular is great, yet sometimes even the best browser can’t change that a [...]]]></description>
			<content:encoded><![CDATA[<p>Disclaimer: This is not a post about programming. No code was harmed during the creation of this blogpost.</p>
<p>As you may have guessed from the title, I got myself an iPhone4 some weeks ago and love it ever since. The browser in particular is great, yet sometimes even the best browser can’t change that a website is badly designed. Too often you can’t make the content out in between all the Google Adwords, the fonts are hideous or it’s a fixed width layout that’s way too wide. </p>
<p>On my PC I just hit the <a href="http://lab.arc90.com/experiments/readability/">Readability</a> bookmarklet and through magic all the ugly stuff goes away and only the content remains. Well, since Readability is just JavaScript you can do the same thing on the iPhone too, it’s just a bit trickier to install.</p>
<p>Here is how a badly readable site looks with Readability (note that it does not remove images that belong to the post!):</p>
<p>Before – After Readability</p>
<p><a href="http://www.tigraine.at/wp-content/uploads/2010/09/IMG_0119.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px 10px 3px 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="IMG_0119" border="0" alt="IMG_0119" src="http://www.tigraine.at/wp-content/uploads/2010/09/IMG_0119_thumb.png" width="320" height="480" /></a><a href="http://www.tigraine.at/wp-content/uploads/2010/09/IMG_0121.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px 10px 3px 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="IMG_0121" border="0" alt="IMG_0121" src="http://www.tigraine.at/wp-content/uploads/2010/09/IMG_0121_thumb.png" width="320" height="480" /></a></p>
<p>As you can see, the width of the layout is too wide to be easily readable in portrait orientation. </p>
<p>Step 1: Go to <a href="http://lab.arc90.com/experiments/readability/">http://lab.arc90.com/experiments/readability/</a> on your iPhone</p>
<p>Select all the text from the textbox on the right and copy it:</p>
<p><a href="http://www.tigraine.at/wp-content/uploads/2010/09/IMG_0114.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px 10px 3px 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="IMG_0114" border="0" alt="IMG_0114" src="http://www.tigraine.at/wp-content/uploads/2010/09/IMG_0114_thumb.png" width="320" height="480" /></a></p>
<p>Next, just hit add bookmark on the site and save the Readability site.    <br />Now go into your bookmarks and edit the readability bookmark. </p>
<p>Delete the previous address and paste the code we copied earlier. </p>
<p><a href="http://www.tigraine.at/wp-content/uploads/2010/09/IMG_0117.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px 10px 3px 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="IMG_0117" border="0" alt="IMG_0117" src="http://www.tigraine.at/wp-content/uploads/2010/09/IMG_0117_thumb.png" width="324" height="484" /></a></p>
<p>Et voila, whenever you want to see a page clearer, just open that bookmark and it will convert any ugly site into a rather pleasant read. </p>
]]></content:encoded>
			<wfw:commentRss>http://www.tigraine.at/2010/09/11/using-readability-on-the-iphone/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Using git from Powershell just got easier: Posh-git</title>
		<link>http://www.tigraine.at/2010/09/01/using-git-from-powershell-just-got-easier-posh-git/</link>
		<comments>http://www.tigraine.at/2010/09/01/using-git-from-powershell-just-got-easier-posh-git/#comments</comments>
		<pubDate>Wed, 01 Sep 2010 15:23:09 +0000</pubDate>
		<dc:creator>Daniel Hölbling</dc:creator>
				<category><![CDATA[Git]]></category>
		<category><![CDATA[Tools]]></category>

		<guid isPermaLink="false">http://www.tigraine.at/2010/09/01/using-git-from-powershell-just-got-easier-posh-git/</guid>
		<description><![CDATA[Whenever someone asks me at the end of my git presentation about what tools to use with git my answer was always be the same: Learn to use the commandline. It’s by far the most convenient way to get stuff done. That’s the way git was intended to be used, and with msysgit and Powershell [...]]]></description>
			<content:encoded><![CDATA[<p>Whenever someone asks me at the end of my <a href="http://docs.com/17U1">git presentation</a> about what tools to use with git my answer was always be the same:</p>
<p>Learn to use the commandline. It’s by far the most convenient way to get stuff done. That’s the way git was intended to be used, and with msysgit and Powershell you get a pretty powerful shell to do your stuff. I work exclusively from the commandline, rarely using gitk to take a look at the history.    <br />Unfortunately the basic Windows commandline (cmd) is just awful and outdated. And while some people swear by the MinGW stuff, I loathe the Unix commandline. So Powershell was the only good way for me on Windows to use git. </p>
<p>Now, thanks to some great work from <a href="http://solutionizing.net/">Keith Dahlby</a>, <a href="http://www.markembling.info/">Jeremy Skinner</a> and <a href="http://www.jeremyskinner.co.uk/">Mark Embling</a> using git from Powershell just got a whole lot more comfortable with <a href="http://github.com/dahlbyk/posh-git">Posh-Git</a>.</p>
<p>Documentation is still a bit sparse, but Posh-Git at it’s core gives you two things: It modifies your Powershell prompt to display relevant git information (branch name and staged/unstaged changes) and adds tab-completion to all git commands. Tab completion also works on branches so you can even hit tab on a git checkout and it will auto-complete to a branch. Really really nice I have to say.</p>
<p>Here is how my git shell looks like now with Posh-Git:</p>
<p><a href="http://www.tigraine.at/wp-content/uploads/2010/09/image.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://www.tigraine.at/wp-content/uploads/2010/09/image_thumb.png" width="498" height="81" /></a></p>
<p>Once you have changes it will display them also on the prompt:</p>
<p><a href="http://www.tigraine.at/wp-content/uploads/2010/09/image1.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://www.tigraine.at/wp-content/uploads/2010/09/image_thumb1.png" width="569" height="69" /></a></p>
<p>(Meaning: 1 new file, 1 deleted and 0 old ones changed)</p>
<p><strong>Installing</strong></p>
<p>Unfortunately not everyone is a Powershell buff like Keith and friends, so I had a bit of trouble finding out how to set up Posh-Git. Actually, it’s dead simple, but nobody told me: Just put all files from the <a href="http://github.com/dahlbyk/posh-git">Posh-Git repository</a> into the folder:</p>
<blockquote><p><em>C:\Users\&lt;username&gt;\Documents\WindowsPowerShell\</em></p>
</blockquote>
<p>And rename the file <em>profile.example.ps1</em> to <em>Microsoft.PowerShell_profile.ps1</em>. If you already had a PowerShell_profile.ps1 file set up with some custom settings, you can just add the code from profile.example.ps1 to your existing profile (assuming you didn’t change your prompt before).</p>
<p>After that, restart your Powershell prompt and enjoy!</p>
<p><strong>Important: </strong></p>
<p>The latest Posh-Git is only working with git 1.7.1 and higher, so if you are still running the 1.7.0.2 release you have to use the <a href="http://github.com/dahlbyk/posh-git/zipball/v0.2">v0.2 Posh-Git</a> release.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.tigraine.at/2010/09/01/using-git-from-powershell-just-got-easier-posh-git/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Removing .svn folders with Powershell</title>
		<link>http://www.tigraine.at/2009/11/24/removing-svn-folders-with-powershell/</link>
		<comments>http://www.tigraine.at/2009/11/24/removing-svn-folders-with-powershell/#comments</comments>
		<pubDate>Tue, 24 Nov 2009 19:38:40 +0000</pubDate>
		<dc:creator>Daniel Hölbling</dc:creator>
				<category><![CDATA[Coding]]></category>
		<category><![CDATA[Tools]]></category>

		<guid isPermaLink="false">http://www.tigraine.at/2009/11/24/removing-svn-folders-with-powershell/</guid>
		<description><![CDATA[I needed one simple thing: Delete all .svn folders from a repository so I can send it to my customer. While searching most of the results I got where either wrong, or completely besides the point, so I decided it may be worth sharing: get-childitem -Include .svn -Recurse -force &#124; Remove-Item -Force –Recurse]]></description>
			<content:encoded><![CDATA[<p>I needed one simple thing: Delete all .svn folders from a repository so I can send it to my customer. While searching most of the results I got where either wrong, or completely besides the point, so I decided it may be worth sharing:</p>
<blockquote><p><tt>get-childitem -Include .svn -Recurse -force | Remove-Item -Force –Recurse</tt></p>
</blockquote>
]]></content:encoded>
			<wfw:commentRss>http://www.tigraine.at/2009/11/24/removing-svn-folders-with-powershell/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Wasted innovation: Google Wave</title>
		<link>http://www.tigraine.at/2009/10/31/wasted-innovation-google-wave/</link>
		<comments>http://www.tigraine.at/2009/10/31/wasted-innovation-google-wave/#comments</comments>
		<pubDate>Sat, 31 Oct 2009 21:03:08 +0000</pubDate>
		<dc:creator>Daniel Hölbling</dc:creator>
				<category><![CDATA[Internet]]></category>
		<category><![CDATA[Personal]]></category>
		<category><![CDATA[Tools]]></category>

		<guid isPermaLink="false">http://www.tigraine.at/?p=792</guid>
		<description><![CDATA[It was pretty inevitable that Google Wave would fail after being hailed as the solution to all our problems. Still, looking at a defeat gives me a feeling of malicious joy. Let’s start at the beginning: I got my invite almost 3 weeks ago, and after an initial: wow cool. I found out that nobody [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://wave.google.com/" target="_blank"><img style="border-right-width: 0px; display: inline; float: left; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="wavelogo[1]" border="0" alt="wavelogo[1]" src="http://www.tigraine.at/wp-content/uploads/2009/10/wavelogo1.png" width="256" height="256" /></a> </p>
<p>It was pretty inevitable that Google Wave would fail after being hailed as the <em>solution to all our problems</em>. Still, looking at a defeat gives me a feeling of malicious joy.</p>
<p>Let’s start at the beginning: I got my invite almost 3 weeks ago, and after an initial: wow cool. I found out that nobody I care about had Wave. </p>
<p>After another week or so I finally got 20 invites to give out (if you want one send me an email, I’ve got 13 left) and finally managed to get the most important people I communicate to into Wave. </p>
<p>And, we had a lot of fun watching each other’s cursor spit out text live on the screen. Unfortunately, that was the only thing we found useful, and it was only funny for about 20 minutes. After that, we went back to our lives and that’s it. I’m still waiting for a reply to a Wave I sent Kristof almost 2 weeks ago. </p>
<p>So, what’s the problem? Wave technology is revolutionary, the idea is just not. It’s at heart:</p>
<p><strong>Awesome technology looking for a problem to solve</strong></p>
<p>Wave fails in most/all of it’s goals:</p>
<p><u>Replace Email</u>: Ok, so Email is everywhere and it works (thanks to GMail). I get mails pushed to my <a href="http://www.tigraine.at/2009/09/02/im-in-love-with-android/">Android phone</a>, and all in all: It does everything I want flawlessly and most importantly: EVERYWHERE.     <br />Wave on the other hand: Only inside my browser, no notification tool whatsoever. Pretty much equally useless as Facebook Messaging.</p>
<p><u>Replace Chat</u>: Instant typing is funny, but using the tool for IM just does not cut it usability wise. Live and Skype are great at that too, and even ICQ had that instant typing thing going some versions back (nobody wanted it). Wave once again misses all the major points here: No mobile client, no notifications, no desktop client. </p>
<p><u>Replace Message Boards</u>: Try running a public community off Wave: It’s impossible. Since you have to add people to the wave one by one, there is no way to spawn a new thread unless your community is really really small. Public viewing (the main purpose of most messaging boards) is impossible, thus the whole thing is not suited to replace a message board.</p>
<p><u>Replace Wiki</u>: Again, who cares about a wiki if it’s not publicly available? I know really few people who have a wiki for &lt;5 people, and even those few won’t care for Wave’s wacky and really laggy Playback feature. </p>
<p><u>Be a collaboration tool</u>: Well, Wave does that pretty well. Only that I don’t really see any online collaboration happening anytime soon, since most people are just too used to sending Word documents or Excel sheets around, they won’t dumb down to using a Wave just because they see each other’s cursors. </p>
<p>Well, and that’s about it. Wave tries to do a thousand things, and succeeds at not one of them. It’s totally useless without having any sort of desktop integration and mobile device integration. And once it has all of that, I still see myself sending more “Hey check your wave” emails than receiving a answer through wave.</p>
<p>What I want now? I want Google to use the awesome technology they created with Wave and bring it over to GMail. I want to be able to drag&amp;drop files to my GMail and have them be attached to my mails. I want this incredible spellchecker inside GMail and I want it now. That’s all. I don’t care for your revolutionary shiny thingy that does everything but nothing. </p>
]]></content:encoded>
			<wfw:commentRss>http://www.tigraine.at/2009/10/31/wasted-innovation-google-wave/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>Setting up TeamCity + git + psake for dotless</title>
		<link>http://www.tigraine.at/2009/10/27/setting-up-teamcity-git-psake-for-dotless/</link>
		<comments>http://www.tigraine.at/2009/10/27/setting-up-teamcity-git-psake-for-dotless/#comments</comments>
		<pubDate>Tue, 27 Oct 2009 16:08:40 +0000</pubDate>
		<dc:creator>Daniel Hölbling</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Coding]]></category>
		<category><![CDATA[dotless]]></category>
		<category><![CDATA[Projects]]></category>
		<category><![CDATA[Tools]]></category>

		<guid isPermaLink="false">http://www.tigraine.at/2009/10/27/setting-up-teamcity-git-psake-for-dotless/</guid>
		<description><![CDATA[Let me say one thing upfront: Setting this up has been a HUGE pain in the ass (PITA for short), and I really hope this gets fixed sometime in the future, because those 3 hours I just spent getting this done are never coming back.. Ok, just to make sure everybody understands: dotless is built [...]]]></description>
			<content:encoded><![CDATA[<p>Let me say one thing upfront: Setting this up has been a HUGE pain in the ass (PITA for short), and I really hope this gets fixed sometime in the future, because those 3 hours I just spent getting this done are never coming back.. </p>
<p>Ok, just to make sure everybody understands: dotless is built using a PSake build script that has to be run through Powershell. The script itself calls out to git and therefore relies on git being installed into the PATH. </p>
<p><strong>First: Git-Teamcity</strong></p>
<p>Since our build relies on executing a git command during build the official JetBrains plugin doesn’t cut it (it only copies the sources, not the .git folder). So I downloaded <a href="http://github.com/chrisortman/git-teamcity">git-teamcity from GitHub</a> and built it using maven (at least something worked). </p>
<p>After that <a href="http://www.knowledgetree.com/blog/continuous-integration-with-teamcity-git">I followed this tutorial</a> on how to install the plugin on TeamCity:</p>
<blockquote><ul>
<li>package the plugin by following the steps outlined in file pkg in the Git plugin folder: create a folder<strong>gitAgent/lib</strong> in the folder <strong>target</strong>, copy all the .jar files (should only be <strong>Git-vcs.jar</strong>) to this folder, and then zip <strong>gitAgent</strong> to <strong>gitAgent.zip</strong> </li>
<li>deploy the plugin by following the steps outlined in file deploy in the Git plugin folder: copy<strong>gitAgent.zip to</strong> <strong>\webapps\ROOT\update\plugins</strong>, and copy <strong>Git-vcs.jar</strong> to<strong>\webapps\ROOT\WEB-INF\lib</strong> </li>
</ul>
</blockquote>
<p>Well, after setting up a new VCS Root inside TeamCity the most important part is to set the VCS checkout mode to <strong>“Automatically on agent (if supported by VCS roots)”</strong></p>
<p><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://www.tigraine.at/wp-content/uploads/2009/10/image2.png" width="577" height="159" /> </p>
<p>Warning: Also make sure that you have git installed at C:\Program Files\git, because that is <a href="http://github.com/jlewallen/git-teamcity/blob/b714bafe7bd8e41444b320fd7f3d9350f1d3008b/src/main/java/org/hivedb/teamcity/plugin/GitConfiguration.java#L76">the only place git-teamcity will look</a> for the bin (unless you change the code).</p>
</p>
<p><strong>Second: Execute Powershell</strong></p>
<p>Apparently there is some major bug with the ConsoleRunner inside TeamCity so all attempts to simply run the Powershell didn’t work. Directly invoking Powershell led to the build timing out. After some digging I found this thread that explained the problem and hinted at a possible solution: <a href="http://www.jetbrains.net/devnet/thread/275854">Touble with Powershell and NAnt during build</a></p>
<p>So, I created a .bat file called TeamCity.bat that calls Powershell directly from it’s full path (C:\Windows\System32\…) like this:</p>
<blockquote><p><tt>
<p>C:\WINDOWS\system32\windowspowershell\v1.0\Powershell.exe .\psake.ps1</p>
<p>   </tt></p></blockquote>
<p>But this doesn’t work due to the above bug in TeamCity. The build kept hanging and eventually got terminated due to an timeout. So I had to change it to something like this:</p>
<blockquote><p><tt>
<p>echo abc | C:\WINDOWS\system32\windowspowershell\v1.0\powershell.exe .\psake.ps1</p>
<p>   </tt></p></blockquote>
<p>Putting echo in front of it made it work, I have no idea why, but id worked.    <br />Now the next problem came up: although I explicitly ran Set-Executionpolicy on the box the runner’s executionpolicy was not set. So I added the Set-Executionpolicy to the .bat file:</p>
<blockquote><p><tt>
<p>echo abc | C:\WINDOWS\system32\windowspowershell\v1.0\powershell.exe Set-ExecutionPolicy remotesigned        <br />echo abc | C:\WINDOWS\system32\windowspowershell\v1.0\powershell.exe .\psake.ps1</p>
<p>   </tt></p></blockquote>
<p>Now, finally the script was executing, but due to no environment variables, my buildscript could not locate git (due to the ConsoleRunner not having ANY environment variables present). </p>
<p>The final version of my TeamCity.bat then included a change to the PATH variable and it finally worked:</p>
<blockquote style="margin-right: 0px" dir="ltr"><p><tt>Set &quot;path=%path%;C:\Program Files\git\bin&quot;&#160; <br />echo abc | C:\WINDOWS\system32\windowspowershell\v1.0\powershell.exe Set-ExecutionPolicy remotesigned         <br />echo abc | C:\WINDOWS\system32\windowspowershell\v1.0\powershell.exe .\psake.ps1</tt></p>
</blockquote>
<p>At that point the build was finally executing and I then only had to tell TeamCity where to find the build artifacts and I was done. </p>
<p><strong>Conclusion</strong></p>
<p>Now that it works, I’m glad I took the time to set it up. But the process could have gone smoother.    <br />Anyway, the good news is:</p>
<p>You can now get a release version from every future commit to the dotless repository right from <a href="http://dotlesscss.com:8081/viewType.html?buildTypeId=bt3&amp;tab=buildTypeStatusDiv">our dotless TeamCity server</a>!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.tigraine.at/2009/10/27/setting-up-teamcity-git-psake-for-dotless/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Using ILMerge to hide your dependencies</title>
		<link>http://www.tigraine.at/2009/10/01/using-ilmerge-to-hide-your-dependencies/</link>
		<comments>http://www.tigraine.at/2009/10/01/using-ilmerge-to-hide-your-dependencies/#comments</comments>
		<pubDate>Thu, 01 Oct 2009 13:10:54 +0000</pubDate>
		<dc:creator>Daniel Hölbling</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Coding]]></category>
		<category><![CDATA[Tools]]></category>

		<guid isPermaLink="false">http://www.tigraine.at/2009/10/01/using-ilmerge-to-hide-your-dependencies/</guid>
		<description><![CDATA[When developing a library that should be used by 3rd parties one major concern is dependency versioning. Meaning, if your code uses a common library like Castle.Windsor, things will get ugly if your users also use Castle.Windsor in another version. Especially with very popular infrastructure libraries like Castle you can’t expect all your users not [...]]]></description>
			<content:encoded><![CDATA[<p>When developing a library that should be used by 3rd parties one major concern is dependency versioning. Meaning, if your code uses a common library like Castle.Windsor, things will get ugly if your users also use Castle.Windsor in another version. </p>
<p>Especially with very popular infrastructure libraries like Castle you can’t expect all your users not to use it, after all you’re probably using it for the same reason they do: Best of breed solution to a common problem.    <br />To avoid trouble, many library authors decide not to take external dependencies so they won’t see versioning issues, while having to re-implement some infrastructure themselves.</p>
<p>Coming up with something simple usually isn’t that hard. If you just need a very limited feature set you can <a href="http://www.tigraine.at/2009/05/21/my-very-own-inversion-of-control-container/">build your own Inversion of Control container</a> quite easily without relying on external libraries. Yet, if you do you still have to spend time building, maintaining and extending the thing over time. </p>
<p>The other option is to use the fabulous tool <a href="http://research.microsoft.com/en-us/people/mbarnett/ilmerge.aspx">ILMerge</a> by Microsoft that allows you to munch multiple assemblies into one DLL. This is also handy if your product consists of many assemblies that you want to bundle, but in this case there is one cool thing ILMerge does: /internalize</p>
<p>ILMerge usually is called from the command line and works like this:</p>
<blockquote><p>ILMerge.exe &lt;main-assembly.dll&gt; [&lt;library1.dll&gt; &lt;library2.dll&gt;] /out:&lt;output-file.dll&gt; /t:library</p>
</blockquote>
<p>Now if you add the magic parameter <u>/internalize</u> ILmerge will hide all type names inside &lt;library1.dll&gt; and &lt;library2.dll&gt; from assemblies that reference the output assembly.</p>
<p>So in <a href="http://www.tigraine.at/2009/09/29/introducing-elms-connector-v-1-beta/">ElmsConnector’s</a> case where Windsor is used internally the ILMerge call looks like this:</p>
<p><a href="http://www.tigraine.at/wp-content/uploads/2009/10/image.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://www.tigraine.at/wp-content/uploads/2009/10/image_thumb.png" width="441" height="149" /></a> </p>
<p>ElmsConnector-partial.dll is the original output dll from my msbuild process while ILMerge will merge all of these Castle assemblies into the output ElmsConnector.dll.    <br />Now the real magic here is that if I open the resulting assembly in Reflector it still lists all Castle assemblies:</p>
<p><a href="http://www.tigraine.at/wp-content/uploads/2009/10/image1.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://www.tigraine.at/wp-content/uploads/2009/10/image_thumb1.png" width="341" height="219" /></a> </p>
<p>But inside Visual Studio none of the Castle.* namespaces exists because they are hidden. </p>
<p>This technique allows us to use our favorite tools in libraries without having to think too hard about versioning.</p>
<p>Now, obviously there are also some things to consider here:    <br />If you want to expose any class that is inside one of the internalized assemblies, you have to tell ILMerge so through the exclude file (<a href="http://github.com/ayende/rhino-mocks/blob/master/ilmerge.exclude">an example of this</a> can be seen with Rhino.Mocks). Once you exclude one type and your users try to use that type they will see a “ambiguous type” compile-time error. That’s why Rhino.Mocks also comes in a unmerged flavor </p>
<p>Another thing to remember is (especially with web-apps) that your users can’t see any internalized assemblies, so any configuration you put into your web.config for them won’t work. Best example may be the PerWebRequest lifesyle for Windsor: It relies on a httpModule to be registered through the web.config, you can’t make that happen with the externalized assembly (and it leads to versioning problems once you exclude it).</p>
]]></content:encoded>
			<wfw:commentRss>http://www.tigraine.at/2009/10/01/using-ilmerge-to-hide-your-dependencies/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

