<?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>Good Design always wins</title>
	<atom:link href="http://www.gewinnt-immer.de/?feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://www.gewinnt-immer.de</link>
	<description>Code Design Has To Be Slick</description>
	<lastBuildDate>Fri, 21 May 2010 10:39:19 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Subclass this</title>
		<link>http://www.gewinnt-immer.de/?p=21</link>
		<comments>http://www.gewinnt-immer.de/?p=21#comments</comments>
		<pubDate>Fri, 21 May 2010 10:35:25 +0000</pubDate>
		<dc:creator>daniel</dc:creator>
				<category><![CDATA[Architecture]]></category>
		<category><![CDATA[Design]]></category>
		<category><![CDATA[Engineering]]></category>
		<category><![CDATA[Philosophy]]></category>

		<guid isPermaLink="false">http://www.gewinnt-immer.de/?p=21</guid>
		<description><![CDATA[In object-oriented languages there&#8217;s a nifty feature called code inheritance. People tend to think that this is a really cool &#8482; thing, since it allows you to quickly slab some new features onto a class whenever the need arises. In fact, there still seems to be a lot of folks who think that the whole [...]]]></description>
			<content:encoded><![CDATA[<p>In object-oriented languages there&#8217;s a nifty feature called code inheritance. People tend to think that this is a really cool &#8482; thing, since it allows you to quickly slab some new features onto a class whenever the need arises. In fact, there still seems to be a lot of folks who think that the whole point of object-orientation is to subclass a lot.</p>
<p>I&#8217;ve previously worked with Microsoft MFC, which was designed that way (but remember, that was back 1992) &#8211; as was the class hierarchy that makes your Unreal Tournament tick. I&#8217;ve seen object hierarchies spreading over 15 levels, and more.</p>
<p>The only problem with code written that way is that it sucks. A lot. </p>
<p><span id="more-21"></span></p>
<p>The point is that while subclassing makes it easy to re-use code in multiple places, but it isn&#8217;t very modular. One of my first jobs involved moving one class from a branch in a convoluted inheritance tree to another branch. This meant changing some of the superclasses and &#8211; you guess it &#8211; it exploded in all the wrong places. Speak about pain.</p>
<p>The problem with subclassing is that each subclass depends on all its superclasses. You can&#8217;t take the code out and re-use it elsewhere, especially since most sane languages don&#8217;t allow true multiple inheritance. The larger your subclass tree grows, the bigger the dependencies grow and the less flexible it gets. Stuff from the lower rungs of the hierarchy cannot be re-used in any useful way, and the whole hierarchy may not fit easily into other projects either.</p>
<p>So, if you want to be extra nice to your fellow developers, including your future self, try building your application out of simple, independent blocks. The architecture astronauts have made up lots of names for that, but the concept is actually refreshingly simple.</p>
<p>What you can do depends on which environment you&#8217;re in: In Java (and Java-like languages, say, C#) you can make small components and tie them together using <a href="http://java.sun.com/docs/books/tutorial/java/concepts/interface.html">Interfaces</a>, which describe how you can interact with an object. Which allows you to replace one component for another that uses the same interface.</p>
<p>In Ruby, you don&#8217;t need the interfaces since the communication between objects is pretty much free-form already. However, you get a nifty feature called &#8220;<a href="http://juixe.com/techknow/index.php/2006/06/15/mixins-in-ruby/">Mixin</a>&#8220;, which allows you to write some methods in one place and then re-use same code in different places.</p>
<p>In any case, watch out that you keep things simple, stupid. And remember that sometimes plain old inheritance may be the simplest thing.</p>
<p>Photo: <a href="http://www.flickr.com/photos/mendhak/3666488194/">flickr/mendhak</a> licensed under <a href="http://creativecommons.org/licenses/by-sa/2.0/deed.de">Creative Commons</a></p>
 <img src="http://www.gewinnt-immer.de/wp-content/plugins/feed-statistics.php?view=1&post_id=21" width="1" height="1" style="display: none;" />]]></content:encoded>
			<wfw:commentRss>http://www.gewinnt-immer.de/?feed=rss2&amp;p=21</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Rails forms and params</title>
		<link>http://www.gewinnt-immer.de/?p=317</link>
		<comments>http://www.gewinnt-immer.de/?p=317#comments</comments>
		<pubDate>Fri, 21 May 2010 10:07:45 +0000</pubDate>
		<dc:creator>daniel</dc:creator>
				<category><![CDATA[Note to self]]></category>
		<category><![CDATA[Tricks]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://www.gewinnt-immer.de/?p=317</guid>
		<description><![CDATA[Another not to self: Rails has the cool feature that you it will map all the values from your submitted forms into the params hash. And, if you create input fields that are named &#8220;something[bla]&#8220;, it will automatically create a nested hash so that you will be able to access params[:thingyform][:something].
But what if you just [...]]]></description>
			<content:encoded><![CDATA[<p>Another not to self: Rails has the cool feature that you it will map all the values from your submitted forms into the <code>params</code> hash. And, if you create input fields that are named &#8220;<code>something[bla]</code>&#8220;, it will automatically create a nested hash so that you will be able to access <code>params[:thingyform][:something]</code>.</p>
<p>But what if you just have a list of things that you need to submit? In this case, just name multiple form fields <code>something[]</code>, and the <code>params</code> will contain an array.</p>
 <img src="http://www.gewinnt-immer.de/wp-content/plugins/feed-statistics.php?view=1&post_id=317" width="1" height="1" style="display: none;" />]]></content:encoded>
			<wfw:commentRss>http://www.gewinnt-immer.de/?feed=rss2&amp;p=317</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Rails course in Paris &#8211; Documents</title>
		<link>http://www.gewinnt-immer.de/?p=289</link>
		<comments>http://www.gewinnt-immer.de/?p=289#comments</comments>
		<pubDate>Wed, 17 Mar 2010 18:25:11 +0000</pubDate>
		<dc:creator>daniel</dc:creator>
				<category><![CDATA[Engineering]]></category>

		<guid isPermaLink="false">http://www.gewinnt-immer.de/?p=289</guid>
		<description><![CDATA[Here&#8217;s some material for the Ruby on Rails course I gave at the University in Paris this week, on invitation of Prof. Fouquere. You can download the presentations slides (also the ones for the second day) if you like. There&#8217;s also a git repository for the tutorial application that I built, and another one for [...]]]></description>
			<content:encoded><![CDATA[<p>Here&#8217;s some material for the Ruby on Rails course I gave at the <a href="http://www.univ-paris13.fr/">University in Paris</a> this week, on invitation of <a href="http://www-lipn.univ-paris13.fr/~fouquere/">Prof. Fouquere</a>. You can <a href="http://www.limitedcreativity.org/downloads/rails_paris.pdf">download the presentations</a> slides (also the <a href="http://www.limitedcreativity.org/downloads/second_day_paris.pdf">ones for the second day</a>) if you like. There&#8217;s also a <a href="http://github.com/averell23/rails_course">git repository for the tutorial application</a> that I built, and <a href="http://github.com/averell23/simple_tutorial">another one for the simpler tutorial</a> application that the students created.</p>
<p><span id="more-289"></span></p>
<h3>Quick Tutorial</h3>
<p>To use Rails, you will have to have the <a href="http://www.ruby-lang.org/">Ruby programming</a> language installed. You can either use the native version for your environment or <a href="http://jruby.org/">JRuby</a>. <a href="http://wiki.rubyonrails.org/getting-started/installation/windows">For Windows</a> there&#8217;s the <a href="http://rubyforge.org/frs/?group_id=167">one-click installer</a>; JRuby should run everywhere, follow the instruction installations on their homepage. You will also need the &#8220;gems&#8221; program which is included in most systems, but an optional download for some Linuses (There was a git repository for the course,<strong> I deleted it because it was too large</strong>)</p>
<p>To follow through the tutorials, clone the git repositories and follow through. Each step is explained in the checkin message.</p>
<p>Once you have got Ruby installed, you should be able to just call</p>
<pre><code>gem install rails</code></pre>
<p>to download and install <a href="http://rubyonrails.org/">Rails</a>. For further instructions follow the pointers on the Rails homepage.</p>
<h3>Getting Started with your first rails App</h3>
<p>To get started with your very first, very simple app you&#8217;ll just need to do this (the commands in [brackets] may be needed for jruby users):</p>
<pre><code>[jruby -S] rails my_first_app
cd my_first_app
[jruby] script/generate scaffold User name:string birthday:date
[jruby -S] rake db:migrate
[jruby] script/server</code></pre>
<p>Your application will now be available at http://localhost:3000/users<br />
(If you use JRuby, you may also need to install a Java database and configure the database through database.yml)</p>
<h3>Pointers to what happened:</h3>
<ul>
<li><a href="http://wiki.rubyonrails.org/rails/pages/availablegenerators">generators</a> are used by Rails to create the templaes and files that are the starting point of your application</li>
<li><a href="http://rake.rubyforge.org/">rake</a> is a &#8220;make&#8221;-like program that you can use to run maintenance tasks from the command line</li>
<li><strong>scripts</strong> are some Ruby programs/scripts that come with Ruby</li>
<li><a href="http://dizzy.co.uk/ruby_on_rails/cheatsheets/rails-migrations">migrations</a> are define the schema of the &#8220;database&#8221;. Migrating will create your database tables and fields</li>
</ul>
<h3>On the Ruby language</h3>
<p>You can have a look at the introductory book (<a href="http://ruby-doc.org/docs/ProgrammingRuby/">available online</a>), or have a look at why&#8217;s more anarchistic<a href="http://mislav.uniqpath.com/poignant-guide/"> &#8220;poignant&#8221; guide</a>. There&#8217;s also a number of books available in print form</p>
<h3>On Rails</h3>
<p>Many resoures on Rails can be found through <a href="http://rubyonrails.org/">the home page</a>, and there are tutorials and video instructions available on the web. It also pays to follow the <a href="http://ryandaigle.com/">Rails Edge blog</a> and the <a href="http://railscasts.com/">Railscast</a> if you want to stay up to date on new techniques. Mailing lists exist in almost any country or language, and are a good point to ask questions.</p>
<p>A good introduction is the book &#8220;<a href="http://www.pragprog.com/titles/rails3/agile-web-development-with-rails-third-edition">Agile Web Development with Rails</a>&#8220;, and there are also others.</p>
<h3>Other</h3>
<p>If you&#8217;ve got any more questions you may also leave a comment her.</p>
<div xmlns:cc="http://creativecommons.org/ns#" about="http://www.flickr.com/photos/waldenpond/4082198915/">Article Image: <a rel="cc:attributionURL" href="http://www.flickr.com/photos/waldenpond/">http://www.flickr.com/photos/waldenpond/</a> / <a rel="license" href="http://creativecommons.org/licenses/by-sa/2.0/">CC BY-SA 2.0</a></div>
 <img src="http://www.gewinnt-immer.de/wp-content/plugins/feed-statistics.php?view=1&post_id=289" width="1" height="1" style="display: none;" />]]></content:encoded>
			<wfw:commentRss>http://www.gewinnt-immer.de/?feed=rss2&amp;p=289</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>gitcrap again</title>
		<link>http://www.gewinnt-immer.de/?p=280</link>
		<comments>http://www.gewinnt-immer.de/?p=280#comments</comments>
		<pubDate>Wed, 14 Oct 2009 07:56:23 +0000</pubDate>
		<dc:creator>daniel</dc:creator>
				<category><![CDATA[Engineering]]></category>

		<guid isPermaLink="false">http://www.gewinnt-immer.de/?p=280</guid>
		<description><![CDATA[Didn&#8217;t I talk about GitHub already? Didn&#8217;t I mention how it breaks down in the most obscure places and how they think being cool is a license to mess with their clients? Well, it just got better: They cut the gem building service. Not only that, but they didn&#8217;t know in advance&#8230; I&#8217;m not impressed.

If [...]]]></description>
			<content:encoded><![CDATA[<p>Didn&#8217;t I <a href="http://www.gewinnt-immer.de/?p=181">talk about GitHub already</a>? Didn&#8217;t I mention how it breaks down in the most obscure places and how they think being cool is a license to mess with their clients? Well, it just got better: They <a href="http://github.com/blog/515-gem-building-is-defunct">cut the gem building service</a>. Not only that, but they <em>didn&#8217;t know in advance</em>&#8230; I&#8217;m not impressed.<br />
<span id="more-280"></span><br />
If they feel something isn&#8217;t worth the effort to maintain, phase it out. But these guys obviously cut the services off on a whim, and <em>after the fact</em> they discovered that it&#8217;d be too bothersome to bring back. Which means their planning sucks big time, as otherwise someone would have noticed the problem beforehand so they could inform their customers. Even if they make it sound like a fun side project now, the feature was actually used by 8000 people.</p>
<p>And then, there&#8217;s the business of &#8220;informing&#8221; people with a weenie blog post. It wouldn&#8217;t have been so hard to send a single email to all users of that service that, um, it had been discontinued? Or am I obliged to follow their blog to be on top of all the newest stunts? On the blog post also note the &#8220;we broke it, but you can help someone else fix it&#8221; punchline.</p>
<p>In any case, my own gems will be available from github for the while being and when I push a new version they&#8217;ll probably go to <a href="http://gemcutter.org/">gemcutter</a>. Follow this blog to be on top of my stunts <img src='http://www.gewinnt-immer.de/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<div xmlns:cc="http://creativecommons.org/ns#" about="http://www.flickr.com/photos/leeco/955641655/">Photo: <a rel="cc:attributionURL" href="http://www.flickr.com/photos/leeco/">http://www.flickr.com/photos/leeco/</a> / <a rel="license" href="http://creativecommons.org/licenses/by/2.0/">CC BY 2.0</a></div>
 <img src="http://www.gewinnt-immer.de/wp-content/plugins/feed-statistics.php?view=1&post_id=280" width="1" height="1" style="display: none;" />]]></content:encoded>
			<wfw:commentRss>http://www.gewinnt-immer.de/?feed=rss2&amp;p=280</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>git submodules</title>
		<link>http://www.gewinnt-immer.de/?p=268</link>
		<comments>http://www.gewinnt-immer.de/?p=268#comments</comments>
		<pubDate>Wed, 16 Sep 2009 08:53:44 +0000</pubDate>
		<dc:creator>daniel</dc:creator>
				<category><![CDATA[Engineering]]></category>
		<category><![CDATA[Process]]></category>
		<category><![CDATA[Tricks]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[hack]]></category>
		<category><![CDATA[howto]]></category>
		<category><![CDATA[submodule]]></category>

		<guid isPermaLink="false">http://www.gewinnt-immer.de/?p=268</guid>
		<description><![CDATA[Today&#8217;s lesson is mainly for the people who want to use the Talia source code, but it could be useful for many git users, so I&#8217;m putting it here. In our code we use git submodules a lot; they are a bit like the good old svn externals but have different quirks that are not [...]]]></description>
			<content:encoded><![CDATA[<p>Today&#8217;s lesson is mainly for the people who want to use the <a href="http://trac.talia.discovery-project.eu/">Talia</a> source code, but it could be useful for many git users, so I&#8217;m putting it here. In our code we use git submodules a lot; they are a bit like the good old <a href="http://svnbook.red-bean.com/en/1.0/ch07s03.html">svn externals</a> but have different quirks that are not that easy to understand. And of course neither the <a href="http://www.kernel.org/pub/software/scm/git/docs/git-submodule.html">official documentation</a> nor the <a href="http://git.or.cz/gitwiki/GitSubmoduleTutorial">tutorial</a> explain it in more detail. (I&#8217;ll assume that you&#8217;re already familiar with the general concept):</p>
<p><span id="more-268"></span></p>
<p>Adding another git repository as a submodule couldn&#8217;t be more easy:</p>
<pre><code>git submodule add &lt;other_repo&gt; &lt;local_path&gt;</code></pre>
<p>This will clone the &#8220;other_repo&#8221; and put it at the given path. The first thing to note is, that this is a completely independent repository. It will <strong>not</strong> be pushed, pulled or commited automatically when the &#8220;parent&#8221; repository is modified. </p>
<p>Unlike a svn external, the submodule is a &#8220;pointer&#8221; to a specific revision instead of a URL. This means that, even if development on the submodule repository continues, your project will always use the <em>exact same version of</em> that module until you change that version.</p>
<p>But how does it work?</p>
<p>When creating the submodule, git creates two new things: A file called &#8220;.gitmodules&#8221; and a &#8220;fake&#8221; entry in the repository, which represents the submodule in the file system. Just think of that as a symbolic link to a specific revision.</p>
<p>When someone clones the project, they will get the &#8220;.gitmodules&#8221; file and will have to do the following drill:</p>
<pre>
<code>git submodule init
git submodule update</code>
</pre>
<p><strong>First catch:</strong> The &#8220;init&#8221; command will read the &#8220;.gitmodules&#8221; file and simply add it&#8217;s content to .git/config&#8221;. That&#8217;s right, it will copy the configuration, and the &#8220;.gitmodules&#8221; file will <strong>not be used any more</strong>. Changes to the &#8220;.gitmodules&#8221; file will have no effect after you called &#8220;init&#8221;. The only way to re-update your configuration is:</p>
<pre><code>git submodule sync</code></pre>
<p><strong>Second catch:</strong> The submodule is a full-blown git repository. Its contents are completely invisible to the parent repository, but the parent repository tracks the &#8220;pointer&#8221; to a specific version. When you do a &#8220;submodule update&#8221;, the system will always fetch that particular version.</p>
<p>But if you modifications to the submodule, by checking out another version/branch (or something like that) and then commit the parent repository, you will modify the &#8220;pointer&#8221; in the parent directory (assume the submodule is in ./submodule):</p>
<pre><code>git submodule init
git submodule update
# -&gt; ./submodule now points to revision ABCE
cd submodule
git checkout XYZ
# or hack, push, whathever ;-)
cd ..
git commit 
# -&gt; ./submodule now to points to revision XYZ
# Once you push, all other users will get XYZ when they
# do a "git submodule update"</code></pre>
<p><strong>Third catch:</strong> Updating submodules is not automatic. When you do a pull or merge, the &#8220;pointer&#8221; might be updated &#8211; but the submodule repository is <strong>not</strong>. </p>
<pre><code># submodule is currently at ABCE
git fetch
# submodule now points to XYZ, but the repository is unchanged:
cd submodule
git status
&gt; ... repository is at ABCE
cd ..
git submodule update
# submodule repository is updated to XYZ</code></pre>
<p>(Disclaimer: I compiled this to the best of my knowledge, but I didn&#8217;t have time to verify that it works as I promised&#8230;)</p>
<div xmlns:cc="http://creativecommons.org/ns#" about="http://www.flickr.com/photos/h34dy/3184222245/">Article Image: <a rel="cc:attributionURL" href="http://www.flickr.com/photos/h34dy/">http://www.flickr.com/photos/h34dy/</a> / <a rel="license" href="http://creativecommons.org/licenses/by-sa/2.0/">CC BY-SA 2.0</a></div>
 <img src="http://www.gewinnt-immer.de/wp-content/plugins/feed-statistics.php?view=1&post_id=268" width="1" height="1" style="display: none;" />]]></content:encoded>
			<wfw:commentRss>http://www.gewinnt-immer.de/?feed=rss2&amp;p=268</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>It&#8217;s so 1999 again&#8230;</title>
		<link>http://www.gewinnt-immer.de/?p=181</link>
		<comments>http://www.gewinnt-immer.de/?p=181#comments</comments>
		<pubDate>Mon, 20 Jul 2009 23:23:51 +0000</pubDate>
		<dc:creator>daniel</dc:creator>
				<category><![CDATA[Design]]></category>
		<category><![CDATA[Philosophy]]></category>
		<category><![CDATA[github]]></category>
		<category><![CDATA[new economy]]></category>
		<category><![CDATA[people]]></category>
		<category><![CDATA[ui]]></category>

		<guid isPermaLink="false">http://www.gewinnt-immer.de/?p=181</guid>
		<description><![CDATA[I just went over to GitHub to comment on a ticket. I wanted to put an URL in the comment. No problem, usually all those comment boxes have a help function nearby, that explains you how the markup works.
GitHub has a link next to the comment box that says &#8220;Parsed with GitHub Flavored Markdown&#8220;. When [...]]]></description>
			<content:encoded><![CDATA[<p>I just went over to GitHub to <a href="http://github.com/technicalpickles/jeweler/issues/#issue/13">comment on a ticket</a>. I wanted to put an URL in the comment. No problem, usually all those comment boxes have a help function nearby, that explains you how the markup works.</p>
<p>GitHub has a link next to the comment box that says &#8220;<em>Parsed with GitHub Flavored Markdown</em>&#8220;. When you click it, you end up on a page that tells you how their flavour is different from the standard one and then&#8230;</p>
<p><span id="more-181"></span></p>
<blockquote><p>If you&#8217;re not already familiar with Markdown, you should spend 15 minutes and go over the excellent Markdown Syntax Guide at Daring Fireball.</p></blockquote>
<p>They&#8217;ve got to be kidding me. Not only had I to follow a link with a totally unhelpful label. But then they have the balls to tell me &#8220;<em>please waste 15 minutes of your time reading some external documentation before posting a comment. Thank you very much.</em>&#8221;</p>
<p>I tell you what I&#8217;d have expected: A link called &#8220;<em>Help</em>&#8221; that shows you a <em>popup</em> with a <em>summary</em> of the most important markup tags. Even the most retarded forum software can do that.</p>
<p>It shows in other places, too. Their <a href="http://github.com/guides/home">help pages</a> consist of a kind of wiki with a semi-random collection of help articles. You&#8217;ll only reach them if you figure out the difference between &#8220;Help&#8221; and &#8220;Support&#8221; in their ever-changing footer. Once you get there, the only way to go back to to home is to click their logo in the header. Unless you accidentally went to &#8220;Support&#8221;, where you have to use the &#8220;Back to github&#8221; link. I usually rather use Google to find something on their site, wondering how you can violate such basic rules on a commercial, professionally designed page.</p>
<p>But my problem isn&#8217;t really with GitHub or with a new product having some teething problems. I guess my problem is with the attitude of that blogosphering, Twitter-following, Web 2.0-hyped geeks that are around at the moment. </p>
<p>It dawned on me that it&#8217;s 1999 all over again again. The &#8220;Web 2.0&#8243; really <em>is</em> the new economy with the new kids thinking that the old rules don&#8217;t apply to them any more. The hubris is the same, just with less funding: We will make the old world obsolete. We&#8217;re the avant-garde of the how the future will look like. Our software is opinionated, and we&#8217;re proud of it.</p>
<p>And, above all, the new kids want to <em>look cool</em>, and I suppose that reflects in the interface: &#8220;Help&#8221; is boring. But look, Ma, I can parse my own flavour of Markdown &#8211; how cool is that? And I&#8217;ve even have a page showing you how it works! Supercool! With source code! </p>
<p>That&#8217;s how things like <a href="http://github.com/technoweenie/restful-authentication/tree/master">RESTful authentication</a> are born. There&#8217;s no actual reason why <em>authentication</em> should have a REST interface. There are no resources involved, unless you subscribe to the mind-boggling notion that a user session is a &#8220;resource&#8221;. Still, all the other cool kids have REST interfaces in all the wrong places, so you want one too. Totally cool.</p>
<p>You may even get away with it &#8211; people don&#8217;t care what&#8217;s inside, as long as it works. Still, you&#8217;re walking a dangerous path. Although it&#8217;s possible to make a living by creating cool stuff that make people look cool &#8211; just look at Apple &#8211; it doesn&#8217;t happen that often. If you can pull it off, more power to you. Otherwise beware.</p>
<p>Guess what: The old rules still apply. Those of us old enough to remember the world 10 years ago have seen it before.  Your bosses, customers and financiers give a flying fart about whether you look cool. They just care if your stuff is <em>useful</em> to them. And if it&#8217;s not, they&#8217;ll probably get annoyed and blog about it.</p>
<p>Or they just walk off to work with those boring people who actually care.</p>
<div xmlns:cc="http://creativecommons.org/ns#" about="http://www.flickr.com/photos/themarque/1801820171/">Photo: <a rel="cc:attributionURL" href="http://www.flickr.com/photos/themarque/">http://www.flickr.com/photos/themarque/</a> / <a rel="license" href="http://creativecommons.org/licenses/by/2.0/">CC BY 2.0</a></div>
 <img src="http://www.gewinnt-immer.de/wp-content/plugins/feed-statistics.php?view=1&post_id=181" width="1" height="1" style="display: none;" />]]></content:encoded>
			<wfw:commentRss>http://www.gewinnt-immer.de/?feed=rss2&amp;p=181</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Put your rdoc on github, monitor your sever</title>
		<link>http://www.gewinnt-immer.de/?p=178</link>
		<comments>http://www.gewinnt-immer.de/?p=178#comments</comments>
		<pubDate>Mon, 20 Jul 2009 18:02:16 +0000</pubDate>
		<dc:creator>daniel</dc:creator>
				<category><![CDATA[Engineering]]></category>
		<category><![CDATA[documentatio]]></category>
		<category><![CDATA[github]]></category>
		<category><![CDATA[gokdok]]></category>
		<category><![CDATA[monitoring]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[tool]]></category>
		<category><![CDATA[watchdogger]]></category>

		<guid isPermaLink="false">http://www.gewinnt-immer.de/?p=178</guid>
		<description><![CDATA[Last week I needed a quick way to monitor our server, and also updated our code documentation. I&#8217;ve come up with some small tools that some people out there may find useful:

gokdok &#8211; automatically upload your rdoc documentation as github-pages
watchdogger &#8211; a little watchdog daemon that&#8217;s quite configurable


The gokdok thing addresses fact that github offers [...]]]></description>
			<content:encoded><![CDATA[<p>Last week I needed a quick way to monitor our server, and also updated our code documentation. I&#8217;ve come up with some small tools that some people out there may find useful:</p>
<ul>
<li><a href="http://github.com/averell23/gokdok">gokdok</a> &#8211; automatically upload your rdoc documentation as <a href="http://github.com/blog/272-github-pages">github-pages</a></li>
<li><a href="http://wiki.github.com/averell23/watchdogger">watchdogger</a> &#8211; a little watchdog daemon that&#8217;s quite configurable</li>
</ul>
<p><span id="more-178"></span></p>
<p>The gokdok thing addresses fact that github offers you a space for project pages, but in no way helps you to build your documentation or upload it. It&#8217;s just a small rake task, but it works fine for me (and we finally have fresh rdocs online again&#8230;)</p>
<p>The watchdog was made to monitor our instance of Tomcat. At the moment it does exactly what I need it to do, which is monitoring some web pages and the log file and killing the server process in case of trouble. It should be very easy to extend. </p>
 <img src="http://www.gewinnt-immer.de/wp-content/plugins/feed-statistics.php?view=1&post_id=178" width="1" height="1" style="display: none;" />]]></content:encoded>
			<wfw:commentRss>http://www.gewinnt-immer.de/?feed=rss2&amp;p=178</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>New Design Again</title>
		<link>http://www.gewinnt-immer.de/?p=149</link>
		<comments>http://www.gewinnt-immer.de/?p=149#comments</comments>
		<pubDate>Wed, 15 Jul 2009 18:48:54 +0000</pubDate>
		<dc:creator>daniel</dc:creator>
				<category><![CDATA[Site News]]></category>
		<category><![CDATA[Design]]></category>
		<category><![CDATA[News]]></category>
		<category><![CDATA[ui]]></category>

		<guid isPermaLink="false">http://www.gewinnt-immer.de/?p=149</guid>
		<description><![CDATA[As I found out that my old WP template broke in all places, even killing the comment function. I spent some of my lunch break searching for a clean one &#8211; thanks for ThemeShift for making this one available for free.
Image Rights: http://www.flickr.com/photos/pleeker/ / CC BY-ND 2.0
 ]]></description>
			<content:encoded><![CDATA[<p>As I found out that my old WP template broke in all places, even killing the comment function. I spent some of my lunch break searching for a clean one &#8211; thanks for <a href="http://themeshift.com/">ThemeShift</a> for making this one available for free.</p>
<p>Image Rights: <span xmlns:cc="http://creativecommons.org/ns#" about="http://www.flickr.com/photos/pleeker/442402068/"><a rel="cc:attributionURL" href="http://www.flickr.com/photos/pleeker/">http://www.flickr.com/photos/pleeker/</a> / <a rel="license" href="http://creativecommons.org/licenses/by-nd/2.0/">CC BY-ND 2.0</a></span></p>
 <img src="http://www.gewinnt-immer.de/wp-content/plugins/feed-statistics.php?view=1&post_id=149" width="1" height="1" style="display: none;" />]]></content:encoded>
			<wfw:commentRss>http://www.gewinnt-immer.de/?feed=rss2&amp;p=149</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Assit on GitHub &#8211; the gem is back</title>
		<link>http://www.gewinnt-immer.de/?p=128</link>
		<comments>http://www.gewinnt-immer.de/?p=128#comments</comments>
		<pubDate>Tue, 14 Jul 2009 15:04:03 +0000</pubDate>
		<dc:creator>daniel</dc:creator>
				<category><![CDATA[Engineering]]></category>
		<category><![CDATA[News]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[assertions]]></category>
		<category><![CDATA[assit]]></category>
		<category><![CDATA[github]]></category>

		<guid isPermaLink="false">http://www.gewinnt-immer.de/?p=128</guid>
		<description><![CDATA[I while ago I wrote a small ruby library for runtime assertions to use in our projects. While I didn&#8217;t use it as heavily as expected, it has been useful in debugging in the beginning. It offers the possibility to include extra runtime checks &#8211; even expensive ones &#8211; to the code, which can be [...]]]></description>
			<content:encoded><![CDATA[<p>I while ago I wrote a small ruby library for runtime assertions to use in our projects. While I didn&#8217;t use it as heavily as expected, it has been useful in debugging in the beginning. It offers the possibility to include extra runtime checks &#8211; even expensive ones &#8211; to the code, which can be disabled in production code. </p>
<p>I&#8217;ve <a href="http://github.com/averell23/assit/">moved the project to github</a> now, and the gem is not broken anymore. This means that you can</p>
<blockquote><p>
sudo gem install averell23-assit
</p></blockquote>
<p>from <a href="http://gems.github.com/">gems.github.com</a>. The old gem (assit) is still around on rubyforge for some reason, but it&#8217;ll remain on 0.0.3 forever. If you use this, better get the github version (averell23-assit) now.</p>
 <img src="http://www.gewinnt-immer.de/wp-content/plugins/feed-statistics.php?view=1&post_id=128" width="1" height="1" style="display: none;" />]]></content:encoded>
			<wfw:commentRss>http://www.gewinnt-immer.de/?feed=rss2&amp;p=128</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The Source is online</title>
		<link>http://www.gewinnt-immer.de/?p=125</link>
		<comments>http://www.gewinnt-immer.de/?p=125#comments</comments>
		<pubDate>Thu, 09 Jul 2009 13:41:17 +0000</pubDate>
		<dc:creator>daniel</dc:creator>
				<category><![CDATA[Engineering]]></category>
		<category><![CDATA[discovery]]></category>
		<category><![CDATA[News]]></category>
		<category><![CDATA[nietzsche]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://www.gewinnt-immer.de/?p=125</guid>
		<description><![CDATA[Last week, rather quietly, we put the NietzscheSource site online.  While we&#8217;re still don&#8217;t use all the cool features we built into the backend, and need to fight of some teething problems, you can finally see some philosophical content from the Discovery project. 
 ]]></description>
			<content:encoded><![CDATA[<p>Last week, rather quietly, we put the <a href="http://www.nietzschesource.org/">NietzscheSource</a> site online.  While we&#8217;re still don&#8217;t use all the cool features we built into the backend, and need to fight of some teething problems, you can finally see some philosophical content from the Discovery project. </p>
 <img src="http://www.gewinnt-immer.de/wp-content/plugins/feed-statistics.php?view=1&post_id=125" width="1" height="1" style="display: none;" />]]></content:encoded>
			<wfw:commentRss>http://www.gewinnt-immer.de/?feed=rss2&amp;p=125</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Firefox caches</title>
		<link>http://www.gewinnt-immer.de/?p=123</link>
		<comments>http://www.gewinnt-immer.de/?p=123#comments</comments>
		<pubDate>Tue, 07 Jul 2009 15:36:32 +0000</pubDate>
		<dc:creator>daniel</dc:creator>
				<category><![CDATA[Note to self]]></category>
		<category><![CDATA[browser]]></category>
		<category><![CDATA[caching]]></category>
		<category><![CDATA[firefox]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://www.gewinnt-immer.de/?p=123</guid>
		<description><![CDATA[Note to self: Pressing the reload button in Firefox causes the browser to always connect to the server, even for cached items that are still valid. It will, however, only check if the resource is still valid, accepting the &#8220;304 not changed&#8221; response.
Clicking normally will not connect to the server, while shift+reload will force a [...]]]></description>
			<content:encoded><![CDATA[<p>Note to self: Pressing the reload button in Firefox causes the browser to <em>always</em> connect to the server, even for cached items that are still valid. It will, however, only check if the resource is still valid, accepting the &#8220;304 not changed&#8221; response.</p>
<p>Clicking normally will not connect to the server, while shift+reload will force a re-download in all cases. </p>
 <img src="http://www.gewinnt-immer.de/wp-content/plugins/feed-statistics.php?view=1&post_id=123" width="1" height="1" style="display: none;" />]]></content:encoded>
			<wfw:commentRss>http://www.gewinnt-immer.de/?feed=rss2&amp;p=123</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The Cryptosomething</title>
		<link>http://www.gewinnt-immer.de/?p=118</link>
		<comments>http://www.gewinnt-immer.de/?p=118#comments</comments>
		<pubDate>Wed, 17 Jun 2009 12:24:41 +0000</pubDate>
		<dc:creator>daniel</dc:creator>
				<category><![CDATA[Engineering]]></category>
		<category><![CDATA[authentication]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[cryptography]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[security]]></category>

		<guid isPermaLink="false">http://www.gewinnt-immer.de/?p=118</guid>
		<description><![CDATA[When I stumbled over yet another article on how you get your cryptography wrong, I remember that I did something similiar myself.
No, not the broken scheme from that article, but I had needed to use some crypto functions to verify some data that had been handed to the user before.

The problem was similar to the [...]]]></description>
			<content:encoded><![CDATA[<p>When I stumbled over <a href="http://www.matasano.com/log/1749/typing-the-letters-a-e-s-into-your-code-youre-doing-it-wrong/">yet another article</a> on how you get your cryptography wrong, I remember that I did something similiar myself.</p>
<p>No, not the broken scheme from that article, but I had needed to use some crypto functions to verify some data that had been handed to the user before.</p>
<p><span id="more-118"></span></p>
<p>The problem was similar to the one above: I had to stuff some session data into a hidden field on the page. When it was re-submitted, I needed to make sure that the incoming data blob had been tampered with by the user. Meaning that I needed to verify if a given piece of data actually came from a trusted source.</p>
<p>Reviewing my code, it doesn&#8217;t look too bad:  I didn&#8217;t use some strange shared-key encryption scheme. In fact, I didn&#8217;t use encryption at all &#8211; if your data is &#8220;secret&#8221;, you probably shouldn&#8217;t send it out to the user in the first place. Instead, I&#8217;m just encoding and zipping the data and then slab a <a href="http://en.wikipedia.org/wiki/Message_authentication_code">MAC (Message Authentication Code)</a> on it. I&#8217;m passing the whole stuff of to OpenSSL, so the implementation should be reputable enough. </p>
<p>It&#8217;s more or less the same mechanism that Rails uses for it&#8217;s session cookies. I even added a nifty little feature that the secret key is automatically generated on the first startup, so there&#8217;s no default value that you have to change.</p>
<p>Still there could very well be a bug, and the evil thing about crypto bugs is that you never notice them, and you can&#8217;t test for them either. So I&#8217;m posting the code below &#8211; have a go and see if you find an exploit.</p>
<p>The weaknesses I&#8217;ve seen so far:</p>
<ul>
<li>I&#8217;m still using MD5, as it is the most portable at this time. While it has been successfully cryptanalysed, cracking it will still take more effort than it&#8217;s worth for the sites I&#8217;m working on. Plus there, are probably more promising angles of attack. Nonetheless, it&#8217;s a no-brainer replacing the algorithm when needed.</li>
<li>There&#8217;s no protection against replay attacks, as I simply didn&#8217;t consider it important for the application.</li>
</ul>
<p><script src="http://gist.github.com/131213.js"></script></p>
 <img src="http://www.gewinnt-immer.de/wp-content/plugins/feed-statistics.php?view=1&post_id=118" width="1" height="1" style="display: none;" />]]></content:encoded>
			<wfw:commentRss>http://www.gewinnt-immer.de/?feed=rss2&amp;p=118</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Getting rid of Google Update</title>
		<link>http://www.gewinnt-immer.de/?p=116</link>
		<comments>http://www.gewinnt-immer.de/?p=116#comments</comments>
		<pubDate>Tue, 16 Jun 2009 07:55:11 +0000</pubDate>
		<dc:creator>daniel</dc:creator>
				<category><![CDATA[Note to self]]></category>
		<category><![CDATA[google earth]]></category>
		<category><![CDATA[hack]]></category>
		<category><![CDATA[ownership]]></category>
		<category><![CDATA[update]]></category>

		<guid isPermaLink="false">http://www.gewinnt-immer.de/?p=116</guid>
		<description><![CDATA[I wanted to use Google Earth again, after a while and accidentally installed a new version. Unfortunately, Google had this bright idea of forcing you to install a permanent background task (as root) for it&#8217;s &#8220;update engine&#8221;. That is for a software that I use like 1 time a year.
Luckily, someone already posted on how [...]]]></description>
			<content:encoded><![CDATA[<p>I wanted to use Google Earth again, after a while and accidentally installed a new version. Unfortunately, Google had this bright idea of forcing you to install a permanent background task (as root) for it&#8217;s &#8220;update engine&#8221;. That is for a software that I use like 1 time a year.</p>
<p>Luckily, someone already posted on how to <a href="http://blog.raamdev.com/2008/12/19/howto-remove-google-software-update-on-mac-os-x">weed out this crap</a>, and prevent Google Earth from ever reinstalling it&#8230;</p>
 <img src="http://www.gewinnt-immer.de/wp-content/plugins/feed-statistics.php?view=1&post_id=116" width="1" height="1" style="display: none;" />]]></content:encoded>
			<wfw:commentRss>http://www.gewinnt-immer.de/?feed=rss2&amp;p=116</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The Browser Yawn</title>
		<link>http://www.gewinnt-immer.de/?p=114</link>
		<comments>http://www.gewinnt-immer.de/?p=114#comments</comments>
		<pubDate>Mon, 15 Jun 2009 13:30:44 +0000</pubDate>
		<dc:creator>daniel</dc:creator>
				<category><![CDATA[Engineering]]></category>

		<guid isPermaLink="false">http://www.gewinnt-immer.de/?p=114</guid>
		<description><![CDATA[The European Union has come around and forced Microsoft do something about the &#8220;browser monopoly&#8221;. Microsoft is pulling the IE out of Windows in Europe. Opera complains.

Obviously, Microsoft did this to avoid actively offering competing products on their platform. And I honestly wonder if Opera is really expecting MS to do the marketing for them. [...]]]></description>
			<content:encoded><![CDATA[<p>The European Union has come around and forced Microsoft do something about the &#8220;browser monopoly&#8221;. Microsoft is pulling the IE out of Windows in Europe. <a href="http://news.cnet.com/8301-13860_3-10262913-56.html?tag=mncol;txt">Opera complains</a>.</p>
<p><span id="more-114"></span></p>
<p>Obviously, Microsoft did this to avoid actively offering competing products on their platform. And I honestly wonder if Opera is really expecting MS to do the marketing for them. But in the end, even if the this move makes a bit more sense than previous ones, not much is going to change in the grand scheme of things.</p>
<p>It&#8217;s funny how everybody is speaking about the browser &#8220;market&#8221; and &#8220;vendors&#8221; &#8211; as if it existed. There is no market for browsers, and never has been, because no one is paying for them. The browser has become a piece of infrastructure, that people expect for free. As infrastructure is important, everyone wants to be a player &#8211; but that doesn&#8217;t change the fact that it&#8217;s near impossible to make money on (desktop) browsers. I&#8217;d guess that&#8217;s even true for Opera &#8211; they probably live of their embedded products, for which they can charge.</p>
<p>This basic setup is not going to change, no matter if Microsoft pulls IE from Windows, offers a choice or whatnot. And it means that if you make a browser, you&#8217;ll have to put in money that you got from somewhere else. That&#8217;s how Microsoft won the first browser war: They could afford to sink shitloads of money in IE, even after the first crappy versions didn&#8217;t swim. Netscape just dropped the ball once (but then, did they drop it <em>hard</em>), and they were out. Once the competition was done for, Microsoft ceased development.</p>
<p>Once Firefox rose from the ashes, they gained real market share (in spite of all &#8220;monopoly&#8221;), because they could offer a superior product once again. Interestingly enough, they also overtook Opera easily.</p>
<p>So from the consumer point of view, things don&#8217;t look so grim. Enough competition is around now to keep Microsoft on their toes, and ensure that browser technology continues to develop. Browsers are also pretty standardized by now, preventing a vendor lock-in. As far as I can see, the time for a useful intervention has passed.</p>
<p>Of course Microsoft (and pretty much every other player) would still like to lock us in. But I doubt they&#8217;re still playing the browser game &#8211; rather they&#8217;re already starting to push new technologies (like Silverlight) to that end.</p>
 <img src="http://www.gewinnt-immer.de/wp-content/plugins/feed-statistics.php?view=1&post_id=114" width="1" height="1" style="display: none;" />]]></content:encoded>
			<wfw:commentRss>http://www.gewinnt-immer.de/?feed=rss2&amp;p=114</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ebay (and your brain)</title>
		<link>http://www.gewinnt-immer.de/?p=109</link>
		<comments>http://www.gewinnt-immer.de/?p=109#comments</comments>
		<pubDate>Tue, 13 Jan 2009 12:02:02 +0000</pubDate>
		<dc:creator>daniel</dc:creator>
				<category><![CDATA[Engineering]]></category>

		<guid isPermaLink="false">http://www.gewinnt-immer.de/?p=109</guid>
		<description><![CDATA[I admit that I&#8217;m still reading strange stuff on the internet, like blogs. Some days ago I&#8217;ve come across the description of a devilish auction system to rip people off &#8211; the article is fun and I guess at least some of my evil readers will wonder why they didn&#8217;t think of it first.
But one [...]]]></description>
			<content:encoded><![CDATA[<p>I admit that I&#8217;m still reading strange stuff on the internet, like blogs. Some days ago I&#8217;ve come across the description of a <a href="http://www.codinghorror.com/blog/archives/001196.html">devilish auction system</a> to rip people off &#8211; the article is fun and I guess at least some of my evil readers will wonder why they didn&#8217;t think of it first.</p>
<p>But one statement caught my eye (unrelated to any evil plan):</p>
<blockquote><p>I&#8217;ve often wondered if eBay would implement this [random feature], as it would effectively end last second sniping, a huge problem for auction sites.</p></blockquote>
<p>This is utterly untrue. Sniping isn&#8217;t a huge problem for eBay. It isn&#8217;t even unfair in any meaningful way.</p>
<p>But the really interesting fact is that, although eBay&#8217;s system is dead easy, even reasonably intelligent people like Jeff Atwood only get it when thinking it through. I didn&#8217;t do any research, but I guess that around 80% or 90% of the eBay users don&#8217;t know how the auction system really works. And although they may be aware of &#8220;sniping&#8221;, they don&#8217;t know how it works (or doesn&#8217;t work), either.</p>
<p>I suppose this is because it&#8217;s really hard to rewire our intuitive understanding of &#8220;auction&#8221;.</p>
<p><span id="more-109"></span></p>
<p>Even people who haven&#8217;t been to an actual auction will know how it works: You call out bids, each one higher than the previous, and the last one wins. Say we&#8217;re bidding for those old Chinese vase: I&#8217;ll call out €20, Jeff raises to €25, I raise to €30. And so on, until Jeff gives up and I win. <em>The last bid wins</em>.</p>
<p>Everyone knows this scheme, it became hardwired in our brains to the word &#8220;auction&#8221;. And then eBay comes along and makes a slight (but crucial) change to the game: Instead of entering a straight bit, I put the maximum amount I want to spend.</p>
<p>Let&#8217;s take that vase again, with a minimum bid of €20. I enter my &#8220;bid&#8221; first, at €300 &#8211; but the price will now stand at $20. Jeff comes along and bids $250. Since that&#8217;s less then my €300, eBay will increase my &#8220;bid&#8221; to €251. If Jeff raises to €1000, the system will raise his bid to €301 &#8211; just high enough to beat me. And so on, until the auction expires.</p>
<p>In theory, each user should place exactly one bid with the maximum amount he wants to spend. The &#8220;bidding agent&#8221; figures it all out and the person who wants to spend the most wins. Sniping is not a problem.</p>
<p>In reality, there are these psychological things happening: First off, many people aren&#8217;t aware of how bids work. They won&#8217;t read the instructions either &#8211; &#8220;I already know what an auction is, thank you very much&#8221;. These people bid like they would in a traditional auction &#8211; if they see a bit for €20, they go to €22 and watch the page to see if someone goes higher. </p>
<p>Other people will actually know the scheme and will bid their &#8220;maximum&#8221; amount. But when they see that they are loosing, they decide that maybe one could go up to €450 instead of €400. And in the heat of the auction, they go higher than they actually planned to.</p>
<p>People don&#8217;t act rationally on eBay. They interact with each other, based on how they think the system works. </p>
<p>This is nice if you play eBay as a game. It&#8217;s also nice for sellers, because the only possible interaction in this game is &#8220;raise the price&#8221;. But the eBay psychology doesn&#8217;t help the people who just want to buy things. That&#8217;s why they use sniping.</p>
<p>The only thing sniping does is to remove the interaction. If you bid ten seconds before the timeout, no one will be able to react any more. But it&#8217;s not important that you enter the last bid &#8211; just that no one can react any more.</p>
<p>Example: Joe bids €20 initiall, Jeff bids €300. If I snipe ten seconds before the end for $300, I&#8217;ll get the thing for $22. If Zed also snipes, 5 seconds before the end, for $200, I still get the thing for $201. Jeff can&#8217;t react (and decide that he&#8217;d go up to $500  &#8211; but if he had bid that initially, he would still win. And so on&#8230;</p>
<p>Morale: If you design software, deal with people&#8217;s preconceptions.</p>
 <img src="http://www.gewinnt-immer.de/wp-content/plugins/feed-statistics.php?view=1&post_id=109" width="1" height="1" style="display: none;" />]]></content:encoded>
			<wfw:commentRss>http://www.gewinnt-immer.de/?feed=rss2&amp;p=109</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Evil Apple contd.</title>
		<link>http://www.gewinnt-immer.de/?p=103</link>
		<comments>http://www.gewinnt-immer.de/?p=103#comments</comments>
		<pubDate>Tue, 16 Sep 2008 08:56:28 +0000</pubDate>
		<dc:creator>daniel</dc:creator>
				<category><![CDATA[Engineering]]></category>
		<category><![CDATA[News]]></category>
		<category><![CDATA[Politics]]></category>

		<guid isPermaLink="false">http://www.gewinnt-immer.de/?p=103</guid>
		<description><![CDATA[As a follow-up on this, Nullriver has now officially declared that Apple banned their application from the App store. The disturbing thing is this part:

We are seeing a lot of similar reports from various developers who&#8217;s applications were abruptly removed and banned from the AppStore without any violations of the terms of service.

This behaviour (on [...]]]></description>
			<content:encoded><![CDATA[<p>As a follow-up on <a href="http://www.gewinnt-immer.de/?p=84">this</a>, Nullriver has now <a href="http://www.nullriver.com/">officially declared</a> that Apple banned their application from the App store. The disturbing thing is this part:</p>
<blockquote><p>
We are seeing a lot of similar reports from various developers who&#8217;s applications were abruptly removed and banned from the AppStore without any violations of the terms of service.
</p></blockquote>
<p>This behaviour (on part of Apple) is incredibly arrogant and unprofessional, and it discredits the platform for developers. Would you invest in the development of an app if you knew that someone else could later pull it off the market on a whim? </p>
<p>The most amazing thing is how they manage to pull this off &#8211; obviously the Mac fanboys are willing to go through anything&#8230;</p>
<p><strong>Edit: It continues:</strong> Apple also refuses applications for no other reason than <a href="http://www.podcastingnews.com/2008/09/12/apple-bans-podcasting-app-from-app-store/">that they compete with iTunes</a>. It even stirred up some bad press. Apples solution: <a href="http://www.macrumors.com/2008/09/23/apple-extends-non-disclosure-to-app-store-rejection-letters/">Make the rejection letters confidential.</a></p>
<p><strong>And even more:</strong> Seems that <a href="http://angelo.dinardi.name/2008/09/20/mailwrangler-and-the-apple-app-store/">email clients aren&#8217;t allowed either</a>. Oh, and not only do they want to have the last word on the App Store, but they&#8217;ll also rescind your <a href="http://www.phonenews.com/apple-blocks-developers-from-bypassing-app-store-4695/">ability to distribute your application by other means</a>.</p>
 <img src="http://www.gewinnt-immer.de/wp-content/plugins/feed-statistics.php?view=1&post_id=103" width="1" height="1" style="display: none;" />]]></content:encoded>
			<wfw:commentRss>http://www.gewinnt-immer.de/?feed=rss2&amp;p=103</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Building Mac Packages</title>
		<link>http://www.gewinnt-immer.de/?p=100</link>
		<comments>http://www.gewinnt-immer.de/?p=100#comments</comments>
		<pubDate>Tue, 16 Sep 2008 08:26:34 +0000</pubDate>
		<dc:creator>daniel</dc:creator>
				<category><![CDATA[Engineering]]></category>
		<category><![CDATA[Note to self]]></category>
		<category><![CDATA[Tricks]]></category>
		<category><![CDATA[configuration]]></category>
		<category><![CDATA[installer]]></category>
		<category><![CDATA[mac]]></category>
		<category><![CDATA[package]]></category>

		<guid isPermaLink="false">http://www.gewinnt-immer.de/?p=100</guid>
		<description><![CDATA[Since we&#8217;ll need to deploy our application soon in a Mac environment, I&#8217;m in the process of building an installer package that our partner&#8217;s local staff will be able to handle.
Usually the preferred installation (and deinstallation) method on the Mac is drag-and-drop, which is really the best method I&#8217;ve ever encountered on any operating system. [...]]]></description>
			<content:encoded><![CDATA[<p>Since we&#8217;ll need to deploy our application soon in a Mac environment, I&#8217;m in the process of building an installer package that our partner&#8217;s local staff will be able to handle.</p>
<p>Usually the preferred installation (and deinstallation) method on the Mac is drag-and-drop, which is really the best method I&#8217;ve ever encountered on any operating system. But for packages that need to be integrated into the system, such as ours, Apple has a built-in-installer package mechanism.</p>
<p>The installer itself is not too bad, although it doesn&#8217;t even consider that you might want to <em>uninstall</em> anything. But the worst part is definitively the &#8220;PackageMaker&#8221; application that comes with Apples developers&#8217; tools. </p>
<p>I&#8217;ve seldom seen such a sorry excuse for a tool &#8211; it will actually <em>loose settings</em> if you uncheck a certain box in the UI, and more fun like that.</p>
<p>Fortunately, I found a nifty tool called <a href="http://s.sudre.free.fr/Software/Iceberg.html">Iceberg</a>, which let&#8217;s you build Apple-compatible installer packages. Though it&#8217;s still a bit rough in some places, it&#8217;s already richer in features and works much better than the default Apple solution. Check it out if you need to create any Mac installer package.</p>
 <img src="http://www.gewinnt-immer.de/wp-content/plugins/feed-statistics.php?view=1&post_id=100" width="1" height="1" style="display: none;" />]]></content:encoded>
			<wfw:commentRss>http://www.gewinnt-immer.de/?feed=rss2&amp;p=100</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>New style</title>
		<link>http://www.gewinnt-immer.de/?p=91</link>
		<comments>http://www.gewinnt-immer.de/?p=91#comments</comments>
		<pubDate>Thu, 07 Aug 2008 10:21:36 +0000</pubDate>
		<dc:creator>daniel</dc:creator>
				<category><![CDATA[Site News]]></category>
		<category><![CDATA[News]]></category>
		<category><![CDATA[style]]></category>
		<category><![CDATA[ui]]></category>

		<guid isPermaLink="false">http://www.gewinnt-immer.de/?p=91</guid>
		<description><![CDATA[Thought it would be time for a new style &#8211; the old template was not maintained any more in any case. So this seems clean enough, though a bit magenta in some places  
 ]]></description>
			<content:encoded><![CDATA[<p>Thought it would be time for a new style &#8211; the old template was not maintained any more in any case. So this seems clean enough, though a bit magenta in some places <img src='http://www.gewinnt-immer.de/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
 <img src="http://www.gewinnt-immer.de/wp-content/plugins/feed-statistics.php?view=1&post_id=91" width="1" height="1" style="display: none;" />]]></content:encoded>
			<wfw:commentRss>http://www.gewinnt-immer.de/?feed=rss2&amp;p=91</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Between Freedom and Coolness</title>
		<link>http://www.gewinnt-immer.de/?p=84</link>
		<comments>http://www.gewinnt-immer.de/?p=84#comments</comments>
		<pubDate>Mon, 04 Aug 2008 08:05:26 +0000</pubDate>
		<dc:creator>daniel</dc:creator>
				<category><![CDATA[Design]]></category>
		<category><![CDATA[Engineering]]></category>
		<category><![CDATA[News]]></category>
		<category><![CDATA[Politics]]></category>
		<category><![CDATA[apple]]></category>
		<category><![CDATA[appstore]]></category>
		<category><![CDATA[evilness]]></category>
		<category><![CDATA[lock in]]></category>
		<category><![CDATA[mac]]></category>

		<guid isPermaLink="false">http://www.gewinnt-immer.de/?p=84</guid>
		<description><![CDATA[I love my Mac. It&#8217;s slick. I&#8217;m almost in line to buy an iPhone (here in Italy it almost makes sense). 
Still I admit that Apple, as a company, is probably one of the most evil there is.
This post from Coding Horror sums up some of it: People give up control over their devices, trading [...]]]></description>
			<content:encoded><![CDATA[<p>I love my Mac. It&#8217;s <em>slick</em>. I&#8217;m almost in line to buy an iPhone (here in Italy it almost makes sense). </p>
<p>Still I admit that Apple, as a company, is probably one of the most evil there is.</p>
<p>This <a href="http://www.codinghorror.com/blog/archives/001044.html">post from Coding Horror</a> sums up some of it: People give up control over their devices, trading it in for a good user experience.</p>
<p>But even if people will flock on the side of coolness instead of freedom: Locking down your customers&#8217; devices is an unacceptable practice and ought to be outlawed.</p>
<p><strong>Update:</strong> It seems they can even <a href="http://www.macrumors.com/2008/08/06/apples-ability-to-deactivate-malicious-app-store-apps/">remotely kill applications</a> from your device. In the, it&#8217;s much preferable to have a solution like <a href="https://www.symbiansigned.com/app/page">Nokia/Symbian</a> that is based on technical criteria. It also asks for confirmations of sensitive operations. Apple goes the path of &#8220;give us full control, we take care&#8221; &#8211; after you go through their &#8220;review&#8221; you can do things like accessing the address book without the user ever noticing.</p>
<p><span id="more-84"></span></p>
<p>This problem is hardly limited to Apple, but the new iPhone sets a new trend. Although it&#8217;s finally &#8220;open&#8221; to 3rd party software, you can only install it through <a href="http://www.apple.com/iphone/features/appstore.html">Apple&#8217;s App Store</a>. Which is convenient for developers and users &#8211; except that each application has to be &#8220;approved&#8221; by Apple.</p>
<p>Read again: Your ability to run a certain program is subject to the approval of Jobs&#8217; company. </p>
<p>And there is a first victim: <a href="http://www.nullriver.com/products/netshare">NetShare</a>, a great little software that lets you use your iPhone as a modem. It got on and off the App Store for a while, currently it seems to be down. It seems that it didn&#8217;t even violate any of the outrageous terms of Apple&#8217;s &#8220;agreements&#8221; &#8211; they just provided a basic functionality that is built into most &#8220;normal&#8221; smartphones in the first place.</p>
<p>Rumor has it that this is because AT&#038;T got pissed &#8211; they don&#8217;t allow people to use their iPhone plans  for tethering. Which would basically mean that Apple randomly fucked over their customers and cheated an independent vendor out of their investment. Just so. It&#8217;d make perfect sense to them, and they&#8217;ll probably get away with it.</p>
<p>And Apple aren&#8217;t the only ones doing it. There is a <a href="http://en.wikipedia.org/wiki/Wii">Wii</a> game console on my shelf. Nintendo went to a lot of trouble to make sure it only runs games that they approved; they even <em>charge</em> developers to be able to use that platform. </p>
<p>The common point about all these &#8220;solutions&#8221; is that their are driven solely by business interests and have nothing to do with customer needs. They protect business plans.</p>
<p>So when the Free Software Foundation gives you <a href="http://www.fsf.org/blogs/community/5-reasons-to-avoid-iphone-3g">five reasons to avoid the iPhone</a>, they are surprisingly right. </p>
<p>Their alternative will, unsurprisingly, fail: Yes, I could get a <a href="http://www.openmoko.com/">Neo FreeRunner</a> &#8211; a cool little toy that gives me all the freedom I want, even looks cool, and probably only requires an hour of yak shaving in order to place a call. This is the problem of open-source &#8220;alternatives&#8221;: They give freedom, but only to those that are able to grasp the system and are willing to go through all the pain.</p>
<p>The sad thing, however, is that people seem to take this state of affairs as a given fact &#8211; even if they are aware of it. They don&#8217;t challenge the very idea that companies have the right to do evil to protect their business plans.</p>
<p>I think that this behaviour should be simply outlawed, just as other harmful practices. The European Union actually did some good steps in that direction &#8211; interoperability is protected by law, and they even made Microsoft publish lots of their specs as a result.</p>
<p>And as much as I appreciate &#8220;hacker&#8221; efforts to open those devices I&#8217;d rather see the concept itself torn to pieces. The companies should be forced to grant their customers full access to the devices that they paid for in the first place. </p>
 <img src="http://www.gewinnt-immer.de/wp-content/plugins/feed-statistics.php?view=1&post_id=84" width="1" height="1" style="display: none;" />]]></content:encoded>
			<wfw:commentRss>http://www.gewinnt-immer.de/?feed=rss2&amp;p=84</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Checking rails routes</title>
		<link>http://www.gewinnt-immer.de/?p=79</link>
		<comments>http://www.gewinnt-immer.de/?p=79#comments</comments>
		<pubDate>Thu, 15 May 2008 10:06:33 +0000</pubDate>
		<dc:creator>daniel</dc:creator>
				<category><![CDATA[Debugging]]></category>
		<category><![CDATA[Note to self]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[routes]]></category>

		<guid isPermaLink="false">http://www.gewinnt-immer.de/?p=79</guid>
		<description><![CDATA[I just had to debug a strange problem with the Routing in JRuby. So in case you need to test the routing mechanism &#8220;by hand&#8221; go
&#62; jruby script/console
&#62;&#62; ActionController::Routing::Routes.recognize_path('/my/path', {:method =&#62; :get})
 ]]></description>
			<content:encoded><![CDATA[<p>I just had to debug a strange problem with the Routing in JRuby. So in case you need to test the routing mechanism &#8220;by hand&#8221; go</p>
<pre><code>&gt; jruby script/console
&gt;&gt; ActionController::Routing::Routes.recognize_path('/my/path', {:method =&gt; :get})</code></pre>
 <img src="http://www.gewinnt-immer.de/wp-content/plugins/feed-statistics.php?view=1&post_id=79" width="1" height="1" style="display: none;" />]]></content:encoded>
			<wfw:commentRss>http://www.gewinnt-immer.de/?feed=rss2&amp;p=79</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
