<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<feed xmlns="http://www.w3.org/2005/Atom">

	<title>rubyonrails-ug.de Planet</title>
	<link rel="self" href="http://planet.rubyonrails-ug.de/atom.xml"/>
	<link href="http://planet.rubyonrails-ug.de"/>
	<id>http://planet.rubyonrails-ug.de/atom.xml</id>
	<updated>2010-09-07T02:00:20+00:00</updated>
	<generator uri="http://www.planetplanet.org/">Planet/2.0 +http://www.planetplanet.org</generator>

	<entry xml:lang="en">
		<title type="html">DevHouseFriday is back! (Update)</title>
		<link href="http://feedproxy.google.com/~r/railslabs/~3/SXEBjF78sDM/"/>
		<id>http://railslove.com/weblog/?p=635</id>
		<updated>2010-09-06T21:25:09+00:00</updated>
		<content type="html">&lt;p&gt;As &lt;a href=&quot;http://railslove.com/weblog/2010/08/27/devhousefriday-is-back/&quot;&gt;mentioned a few days ago&lt;/a&gt; the next &lt;a href=&quot;https://twitter.com/devhousefriday&quot;&gt;DevHouseFriday&lt;/a&gt; is coming up. We have our first speakers! &lt;a href=&quot;http://galaxycats.com/&quot;&gt;Galaxy Cats&lt;/a&gt;, &lt;a href=&quot;http://9elements.com/&quot;&gt;9elements&lt;/a&gt; and &lt;a href=&quot;https://www.salesking.eu/&quot;&gt;SalesKing&lt;/a&gt; are going to talk about the future of web technologies! We&amp;#8217;re searching for a few more speakers. If you want to talk about something you&amp;#8217;re thinking it is the future of web technologies, just drop us a line to team@railslove.com.&lt;/p&gt;
&lt;p&gt;Stay tuned! More updates and a full session table are comming this week.&lt;/p&gt;
&lt;p&gt;
&lt;img src=&quot;http://railslove.com/weblog/wp-content/uploads/2010/09/galaxycats.jpg&quot; alt=&quot;galaxycats&quot; title=&quot;galaxycats&quot; width=&quot;400&quot; /&gt;&lt;br /&gt;
&lt;img src=&quot;http://railslove.com/weblog/wp-content/uploads/2010/09/9elements_logo.jpg&quot; alt=&quot;9elements_logo&quot; title=&quot;9elements_logo&quot; width=&quot;400&quot; /&gt;
&lt;/p&gt;
&lt;div&gt;&lt;/div&gt;
&lt;p&gt;P.S. und alles findet natürlich im sehr gemütlichen &lt;a href=&quot;http://www.coworkingcologne.de/&quot;&gt;Kölner Coworking Space &amp;#8220;Gasmotoren Fabrik&amp;#8221;&lt;/a&gt; statt.&lt;/p&gt;
&lt;div class=&quot;feedflare&quot;&gt;
&lt;a href=&quot;http://feeds.feedburner.com/~ff/railslabs?a=SXEBjF78sDM:H7Xr_qLStRU:yIl2AUoC8zA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/railslabs?d=yIl2AUoC8zA&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/railslabs?a=SXEBjF78sDM:H7Xr_qLStRU:7Q72WNTAKBA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/railslabs?d=7Q72WNTAKBA&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/railslabs?a=SXEBjF78sDM:H7Xr_qLStRU:V_sGLiPBpWU&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/railslabs?i=SXEBjF78sDM:H7Xr_qLStRU:V_sGLiPBpWU&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;
&lt;/div&gt;</content>
		<author>
			<name>Railslove</name>
			<uri>http://railslove.com/weblog</uri>
		</author>
		<source>
			<title type="html">Railslove</title>
			<subtitle type="html">we love building web applications</subtitle>
			<link rel="self" href="http://feeds.feedburner.com/railslabs"/>
			<id>tag:railslabs.com,2007:mephisto/</id>
			<updated>2010-09-06T22:00:11+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="de-de">
		<title type="html">My nodeJS deployment approach</title>
		<link href="http://feedproxy.google.com/~r/dopefreshtightblog/~3/yQattH8a0eM/"/>
		<id>http://dennisbloete.de/?p=759</id>
		<updated>2010-09-04T13:05:14+00:00</updated>
		<content type="html">&lt;p&gt;A &lt;a href=&quot;http://dennisbloete.de/blog/codeshelver-tag-github-repositories/&quot;&gt;while back&lt;/a&gt; I said I wasn&amp;#8217;t really satisfied with how I was deploying node applications, in this case &lt;a href=&quot;http://codeshelver.com&quot;&gt;Codeshelver&lt;/a&gt;. After dealing with the problem for some more time I&amp;#8217;ve now arrived at a more general solution that I&amp;#8217;d like to share with you. Having a strong Ruby background some of this will seem familiar to you Ruby developers: I&amp;#8217;m deploying to a nginx server, the node process gets monitored with monit and the basic deployment stack includes &lt;a href=&quot;http://rubyhitsquad.com/Vlad_the_Deployer.html&quot;&gt;Vlad&lt;/a&gt; as a deployment tool, a &lt;a href=&quot;http://github.com/visionmedia/ndistro&quot;&gt;ndistro&lt;/a&gt; file that contains the app dependencies (think of it as a &lt;a href=&quot;http://gembundler.com&quot;&gt;Gemfile&lt;/a&gt;) and a self-written start/stop script for my node applications (with a little &lt;a href=&quot;http://expressjs.com/&quot;&gt;Express&lt;/a&gt; flavor).&lt;span id=&quot;more-759&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h4&gt;Rakefile&lt;/h4&gt;
&lt;p&gt;This is a standard Rakefile that just loads Vlad and sets it to use git for source control.&lt;/p&gt;

&lt;div class=&quot;wp_syntax&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre class=&quot;ruby&quot;&gt;&lt;span&gt;require&lt;/span&gt; &lt;span&gt;'rake'&lt;/span&gt;
&amp;nbsp;
&lt;span&gt;begin&lt;/span&gt;
  &lt;span&gt;require&lt;/span&gt; &lt;span&gt;'vlad'&lt;/span&gt;
  Vlad.&lt;span&gt;load&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;:app&lt;/span&gt; &lt;span&gt;=&amp;gt;&lt;/span&gt; &lt;span&gt;nil&lt;/span&gt;, &lt;span&gt;:type&lt;/span&gt; &lt;span&gt;=&amp;gt;&lt;/span&gt; &lt;span&gt;nil&lt;/span&gt;, &lt;span&gt;:scm&lt;/span&gt; &lt;span&gt;=&amp;gt;&lt;/span&gt; &lt;span&gt;'git'&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;
&lt;span&gt;rescue&lt;/span&gt; &lt;span&gt;LoadError&lt;/span&gt;
  &lt;span&gt;puts&lt;/span&gt; &lt;span&gt;&amp;quot;Could not load Vlad - please run 'gem install vlad vlad-git'&amp;quot;&lt;/span&gt;
&lt;span&gt;end&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h4&gt;deploy.rb&lt;/h4&gt;
&lt;p&gt;This is Vlad&amp;#8217;s config file that contains some configuration as well as some recipes I wrote for ndistro and the deployment process:&lt;/p&gt;

&lt;div class=&quot;wp_syntax&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre class=&quot;ruby&quot;&gt;set &lt;span&gt;:user&lt;/span&gt;, &lt;span&gt;&amp;quot;deploy&amp;quot;&lt;/span&gt;
set &lt;span&gt;:application&lt;/span&gt;, &lt;span&gt;&amp;quot;myapp&amp;quot;&lt;/span&gt;
set &lt;span&gt;:domain&lt;/span&gt;, &lt;span&gt;&amp;quot;myapp.com&amp;quot;&lt;/span&gt;
set &lt;span&gt;:deploy_to&lt;/span&gt;, &lt;span&gt;&amp;quot;/var/www/#{application}&amp;quot;&lt;/span&gt;
set &lt;span&gt;:repository&lt;/span&gt;, &lt;span&gt;&amp;quot;git@github.com:myuser/#{application}.git&amp;quot;&lt;/span&gt;
&amp;nbsp;
namespace &lt;span&gt;:vlad&lt;/span&gt; &lt;span&gt;do&lt;/span&gt;
  &lt;span&gt;# overrides&lt;/span&gt;
  set &lt;span&gt;:shared_paths&lt;/span&gt;, &lt;span&gt;&amp;#123;&lt;/span&gt; &lt;span&gt;&amp;#125;&lt;/span&gt;
  set &lt;span&gt;:mkdirs&lt;/span&gt;, &lt;span&gt;&amp;#91;&lt;/span&gt;&lt;span&gt;&amp;#93;&lt;/span&gt;
&amp;nbsp;
  namespace &lt;span&gt;:ndistro&lt;/span&gt; &lt;span&gt;do&lt;/span&gt;
    desc &lt;span&gt;&amp;quot;Install ndistro&amp;quot;&lt;/span&gt;
    remote_task &lt;span&gt;:setup&lt;/span&gt;, &lt;span&gt;:roles&lt;/span&gt; &lt;span&gt;=&amp;gt;&lt;/span&gt; &lt;span&gt;:web&lt;/span&gt; &lt;span&gt;do&lt;/span&gt;
      set &lt;span&gt;:use_sudo&lt;/span&gt;, &lt;span&gt;true&lt;/span&gt;
      run &lt;span&gt;&amp;quot;cd /usr/local/bin &amp;amp;&amp;amp; curl http://github.com/visionmedia/ndistro/raw/master/install | sh&amp;quot;&lt;/span&gt;
    &lt;span&gt;end&lt;/span&gt;
&amp;nbsp;
    desc &lt;span&gt;&amp;quot;Install dependencies&amp;quot;&lt;/span&gt;
    remote_task &lt;span&gt;:install_deps&lt;/span&gt;, &lt;span&gt;:roles&lt;/span&gt; &lt;span&gt;=&amp;gt;&lt;/span&gt; &lt;span&gt;:web&lt;/span&gt; &lt;span&gt;do&lt;/span&gt;
      &lt;span&gt;%&lt;/span&gt;w&lt;span&gt;&amp;#40;&lt;/span&gt;bin lib modules&lt;span&gt;&amp;#41;&lt;/span&gt;.&lt;span&gt;each&lt;/span&gt; &lt;span&gt;do&lt;/span&gt; &lt;span&gt;|&lt;/span&gt;dir&lt;span&gt;|&lt;/span&gt;
        shared_dir_path = &lt;span&gt;File&lt;/span&gt;.&lt;span&gt;join&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;shared_path, dir&lt;span&gt;&amp;#41;&lt;/span&gt;
        release_dir_path = &lt;span&gt;File&lt;/span&gt;.&lt;span&gt;join&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;current_release, dir&lt;span&gt;&amp;#41;&lt;/span&gt;
        run &lt;span&gt;&amp;quot;mkdir -p #{shared_dir_path}&amp;quot;&lt;/span&gt;
        run &lt;span&gt;&amp;quot;ln -s #{shared_dir_path} #{release_dir_path}&amp;quot;&lt;/span&gt;
      &lt;span&gt;end&lt;/span&gt;
      run &lt;span&gt;&amp;quot;cd #{current_release} &amp;amp;&amp;amp; ndistro&amp;quot;&lt;/span&gt;
    &lt;span&gt;end&lt;/span&gt;
&amp;nbsp;
    desc &lt;span&gt;&amp;quot;Clean dependencies&amp;quot;&lt;/span&gt;
    remote_task &lt;span&gt;:clean_deps&lt;/span&gt;, &lt;span&gt;:roles&lt;/span&gt; &lt;span&gt;=&amp;gt;&lt;/span&gt; &lt;span&gt;:web&lt;/span&gt; &lt;span&gt;do&lt;/span&gt;
      &lt;span&gt;%&lt;/span&gt;w&lt;span&gt;&amp;#40;&lt;/span&gt;bin lib modules&lt;span&gt;&amp;#41;&lt;/span&gt;.&lt;span&gt;each&lt;/span&gt; &lt;span&gt;do&lt;/span&gt; &lt;span&gt;|&lt;/span&gt;dir&lt;span&gt;|&lt;/span&gt;
        shared_dir_path = Filec.&lt;span&gt;join&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;shared_path, dir&lt;span&gt;&amp;#41;&lt;/span&gt;
        run &lt;span&gt;&amp;quot;rm -r #{shared_dir_path}&amp;quot;&lt;/span&gt;
      &lt;span&gt;end&lt;/span&gt;
    &lt;span&gt;end&lt;/span&gt;
  &lt;span&gt;end&lt;/span&gt;
&amp;nbsp;
  desc &lt;span&gt;'Start the app'&lt;/span&gt;
  remote_task &lt;span&gt;:start_app&lt;/span&gt;, &lt;span&gt;:roles&lt;/span&gt; &lt;span&gt;=&amp;gt;&lt;/span&gt; &lt;span&gt;:app&lt;/span&gt; &lt;span&gt;do&lt;/span&gt;
    run &lt;span&gt;&amp;quot;/etc/init.d/express_app #{application} start&amp;quot;&lt;/span&gt;
  &lt;span&gt;end&lt;/span&gt;
&amp;nbsp;
  desc &lt;span&gt;'Stop the app'&lt;/span&gt;
  remote_task &lt;span&gt;:stop_app&lt;/span&gt;, &lt;span&gt;:roles&lt;/span&gt; &lt;span&gt;=&amp;gt;&lt;/span&gt; &lt;span&gt;:app&lt;/span&gt; &lt;span&gt;do&lt;/span&gt;
    run &lt;span&gt;&amp;quot;/etc/init.d/express_app #{application} stop&amp;quot;&lt;/span&gt;
  &lt;span&gt;end&lt;/span&gt;
&amp;nbsp;
  desc &lt;span&gt;'Restart the app'&lt;/span&gt;
  remote_task &lt;span&gt;:restart_app&lt;/span&gt;, &lt;span&gt;:roles&lt;/span&gt; &lt;span&gt;=&amp;gt;&lt;/span&gt; &lt;span&gt;:app&lt;/span&gt; &lt;span&gt;do&lt;/span&gt;
    &lt;span&gt;%&lt;/span&gt;w&lt;span&gt;&amp;#40;&lt;/span&gt;stop_app start_app&lt;span&gt;&amp;#41;&lt;/span&gt;.&lt;span&gt;each&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt; &lt;span&gt;|&lt;/span&gt;task&lt;span&gt;|&lt;/span&gt; &lt;span&gt;Rake::Task&lt;/span&gt;&lt;span&gt;&amp;#91;&lt;/span&gt;&lt;span&gt;&amp;quot;vlad:#{task}&amp;quot;&lt;/span&gt;&lt;span&gt;&amp;#93;&lt;/span&gt;.&lt;span&gt;invoke&lt;/span&gt; &lt;span&gt;&amp;#125;&lt;/span&gt;
  &lt;span&gt;end&lt;/span&gt;
&amp;nbsp;
  desc &lt;span&gt;&amp;quot;Full deployment cycle: Update, ndistro:install_deps, restart, cleanup&amp;quot;&lt;/span&gt;
  remote_task &lt;span&gt;:deploy&lt;/span&gt;, &lt;span&gt;:roles&lt;/span&gt; &lt;span&gt;=&amp;gt;&lt;/span&gt; &lt;span&gt;:app&lt;/span&gt; &lt;span&gt;do&lt;/span&gt;
    &lt;span&gt;%&lt;/span&gt;w&lt;span&gt;&amp;#40;&lt;/span&gt;update ndistro:install_deps restart_app cleanup&lt;span&gt;&amp;#41;&lt;/span&gt;.&lt;span&gt;each&lt;/span&gt; &lt;span&gt;do&lt;/span&gt; &lt;span&gt;|&lt;/span&gt;task&lt;span&gt;|&lt;/span&gt;
      &lt;span&gt;Rake::Task&lt;/span&gt;&lt;span&gt;&amp;#91;&lt;/span&gt;&lt;span&gt;&amp;quot;vlad:#{task}&amp;quot;&lt;/span&gt;&lt;span&gt;&amp;#93;&lt;/span&gt;.&lt;span&gt;invoke&lt;/span&gt;
    &lt;span&gt;end&lt;/span&gt;
  &lt;span&gt;end&lt;/span&gt;
&lt;span&gt;end&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h4&gt;.ndistro&lt;/h4&gt;
&lt;p&gt;The &lt;a href=&quot;http://github.com/visionmedia/ndistro&quot;&gt;ndistro&lt;/a&gt; file contains the module and node dependencies of your app. This one is pretty simple &amp;#8211; here you can read up &lt;a href=&quot;http://tjholowaychuk.com/post/864064044/ndistro-node-distribution-toolkit&quot;&gt;more on ndistro&lt;/a&gt; and there also is a short &lt;a href=&quot;http://screenr.com/sV0&quot;&gt;screencast&lt;/a&gt; about it.&lt;/p&gt;
&lt;pre&gt;module senchalabs connect
module visionmedia express
module visionmedia expresso
module visionmedia haml.js
module visionmedia sass.js&lt;/pre&gt;
&lt;h4&gt;express_app&lt;/h4&gt;
&lt;p&gt;This is the script I use to start/stop the server, I keep it under &lt;code&gt;/etc/init.d/&lt;/code&gt; so that I can use it like any other system script. You use it like this: &lt;code&gt;/etc/init.d/express_app {app_name} {start|stop}&lt;/code&gt;&lt;/p&gt;

&lt;div class=&quot;wp_syntax&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre class=&quot;bash&quot;&gt;&lt;span&gt;#!/bin/bash&lt;/span&gt;
&lt;span&gt;user&lt;/span&gt;=deploy
&lt;span&gt;&lt;span&gt;dir&lt;/span&gt;&lt;/span&gt;=&lt;span&gt;/&lt;/span&gt;var&lt;span&gt;/&lt;/span&gt;www&lt;span&gt;/&lt;/span&gt;$&lt;span&gt;1&lt;/span&gt;&lt;span&gt;/&lt;/span&gt;current
&lt;span&gt;srv_file&lt;/span&gt;=&lt;span&gt;$dir&lt;/span&gt;&lt;span&gt;/&lt;/span&gt;server.js
&lt;span&gt;pid_file&lt;/span&gt;=&lt;span&gt;$dir&lt;/span&gt;&lt;span&gt;/&lt;/span&gt;log&lt;span&gt;/&lt;/span&gt;server.pid
&lt;span&gt;log_file&lt;/span&gt;=&lt;span&gt;$dir&lt;/span&gt;&lt;span&gt;/&lt;/span&gt;log&lt;span&gt;/&lt;/span&gt;server.log
&amp;nbsp;
&lt;span&gt;case&lt;/span&gt; $&lt;span&gt;2&lt;/span&gt; &lt;span&gt;in&lt;/span&gt;
  start&lt;span&gt;&amp;#41;&lt;/span&gt;
    &lt;span&gt;sudo&lt;/span&gt; &lt;span&gt;-u&lt;/span&gt; &lt;span&gt;&amp;quot;&lt;span&gt;$user&lt;/span&gt;&amp;quot;&lt;/span&gt; &lt;span&gt;EXPRESS_ENV&lt;/span&gt;=production node &lt;span&gt;&amp;quot;&lt;span&gt;$srv_file&lt;/span&gt;&amp;quot;&lt;/span&gt; &lt;span&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span&gt;&amp;quot;&lt;span&gt;$log_file&lt;/span&gt;&amp;quot;&lt;/span&gt; &lt;span&gt;2&lt;/span&gt;&lt;span&gt;&amp;gt;&amp;amp;&lt;/span&gt;&lt;span&gt;1&lt;/span&gt; &lt;span&gt;&amp;amp;&lt;/span&gt;
    &lt;span&gt;echo&lt;/span&gt; &lt;span&gt;`&lt;/span&gt;&lt;span&gt;ps&lt;/span&gt; ax &lt;span&gt;|&lt;/span&gt; &lt;span&gt;grep&lt;/span&gt; &lt;span&gt;$srv_file&lt;/span&gt; &lt;span&gt;|&lt;/span&gt; &lt;span&gt;grep&lt;/span&gt; &lt;span&gt;-v&lt;/span&gt; &lt;span&gt;grep&lt;/span&gt; &lt;span&gt;|&lt;/span&gt; &lt;span&gt;awk&lt;/span&gt; &lt;span&gt;'{print $1}'&lt;/span&gt;&lt;span&gt;`&lt;/span&gt; &lt;span&gt;&amp;gt;&lt;/span&gt; &lt;span&gt;&amp;quot;&lt;span&gt;$pid_file&lt;/span&gt;&amp;quot;&lt;/span&gt;
    &lt;span&gt;chown&lt;/span&gt; &lt;span&gt;&amp;quot;&lt;span&gt;$user&lt;/span&gt;&amp;quot;&lt;/span&gt;:&lt;span&gt;&amp;quot;&lt;span&gt;$user&lt;/span&gt;&amp;quot;&lt;/span&gt; &lt;span&gt;&amp;quot;&lt;span&gt;$log_file&lt;/span&gt;&amp;quot;&lt;/span&gt;
    &lt;span&gt;chown&lt;/span&gt; &lt;span&gt;&amp;quot;&lt;span&gt;$user&lt;/span&gt;&amp;quot;&lt;/span&gt;:&lt;span&gt;&amp;quot;&lt;span&gt;$user&lt;/span&gt;&amp;quot;&lt;/span&gt; &lt;span&gt;&amp;quot;&lt;span&gt;$pid_file&lt;/span&gt;&amp;quot;&lt;/span&gt; &lt;span&gt;;;&lt;/span&gt;
  stop&lt;span&gt;&amp;#41;&lt;/span&gt;
    &lt;span&gt;kill&lt;/span&gt; &lt;span&gt;`&lt;/span&gt;&lt;span&gt;cat&lt;/span&gt; &lt;span&gt;&amp;quot;&lt;span&gt;$pid_file&lt;/span&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;`&lt;/span&gt;
    &lt;span&gt;rm&lt;/span&gt; &lt;span&gt;&amp;quot;&lt;span&gt;$pid_file&lt;/span&gt;&amp;quot;&lt;/span&gt; &lt;span&gt;;;&lt;/span&gt;
  &lt;span&gt;*&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;  
    &lt;span&gt;echo&lt;/span&gt; &lt;span&gt;&amp;quot;usage: /etc/init.d/express_app {app_name} {start|stop}&amp;quot;&lt;/span&gt; &lt;span&gt;;;&lt;/span&gt;
&lt;span&gt;esac&lt;/span&gt;
&lt;span&gt;exit&lt;/span&gt; &lt;span&gt;0&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h4&gt;monit&lt;/h4&gt;
&lt;p&gt;This is pretty simple as it just keeps an eye on the server pid file and utilizes the start/stop script to keep the app running.&lt;/p&gt;

&lt;div class=&quot;wp_syntax&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre class=&quot;bash&quot;&gt;check process myapp with pidfile &lt;span&gt;/&lt;/span&gt;var&lt;span&gt;/&lt;/span&gt;www&lt;span&gt;/&lt;/span&gt;myapp&lt;span&gt;/&lt;/span&gt;current&lt;span&gt;/&lt;/span&gt;log&lt;span&gt;/&lt;/span&gt;server.pid
  start program = &lt;span&gt;&amp;quot;/etc/init.d/express_app myapp start&amp;quot;&lt;/span&gt;
  stop program  = &lt;span&gt;&amp;quot;/etc/init.d/express_app myapp stop&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h4&gt;nginx.conf&lt;/h4&gt;
&lt;p&gt;Last but not least here&amp;#8217;s an excerpt from the nginx config file:&lt;/p&gt;

&lt;div class=&quot;wp_syntax&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre class=&quot;bash&quot;&gt;http &lt;span&gt;&amp;#123;&lt;/span&gt;
  upstream myapp_cluster &lt;span&gt;&amp;#123;&lt;/span&gt;
    server localhost:&lt;span&gt;3000&lt;/span&gt;;
  &lt;span&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
  server &lt;span&gt;&amp;#123;&lt;/span&gt;
    listen &lt;span&gt;80&lt;/span&gt;;
    server_name myapp.com;
    root &lt;span&gt;/&lt;/span&gt;var&lt;span&gt;/&lt;/span&gt;www&lt;span&gt;/&lt;/span&gt;myapp&lt;span&gt;/&lt;/span&gt;current;
&amp;nbsp;
    location &lt;span&gt;/&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;
      proxy_set_header X-Real-IP &lt;span&gt;$remote_addr&lt;/span&gt;;
      proxy_set_header X-Forwarded-For &lt;span&gt;$proxy_add_x_forwarded_for&lt;/span&gt;;
      proxy_set_header Host &lt;span&gt;$http_host&lt;/span&gt;;
      proxy_pass http:&lt;span&gt;//&lt;/span&gt;myapp_cluster&lt;span&gt;/&lt;/span&gt;;
      proxy_redirect off;
    &lt;span&gt;&amp;#125;&lt;/span&gt;
  &lt;span&gt;&amp;#125;&lt;/span&gt;
&lt;span&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;I hope this helps you figuring out your deployment and maybe you got some tips for me on how to enhance this. Of course there are many other valid approaches like &lt;a href=&quot;http://howtonode.org/deploying-node-upstart-monit&quot;&gt;using upstart&lt;/a&gt; or &lt;a href=&quot;http://depold.com/wordpress/124/deploying-a-node-js-web-application-with-express-and-ndistro&quot;&gt;with an Apache as webserver&lt;/a&gt;.&lt;/p&gt;</content>
		<author>
			<name>Dennis Bloete</name>
			<email>mail@dennisbloete.de</email>
			<uri>http://dennisbloete.de</uri>
		</author>
		<source>
			<title type="html">//dennisbloete</title>
			<subtitle type="html">Arbeit und Alltag eines Software-Entwicklers aus Bremen</subtitle>
			<link rel="self" href="http://feeds.feedburner.com/dopefreshtightblog/"/>
			<id>http://feeds.feedburner.com/dopefreshtightblog/</id>
			<updated>2010-09-06T07:40:13+00:00</updated>
			<rights type="html">©</rights>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Why I Love and Hate Distributed Systems</title>
		<link href="http://www.paperplanes.de/2010/9/3/why_i_love_and_hate_distributed_systems.html"/>
		<id>http://www.paperplanes.de/archives/2010/9/3/why_i_love_and_hate_distributed_systems/</id>
		<updated>2010-09-03T00:00:00+00:00</updated>
		<content type="html">&lt;p&gt;Let me go ahead and say it: I love distributed systems. Why? Simply because they bend my brain. Yesterday I tweeted
&quot;Distributed databases are my happy place.&quot; One response I got was along the lines of: &quot;then you're probably not running
a distributed database in production.&quot; Busted! But does it matter? We all love distributed stuff, we love thinking about
scaling. They seem like problems everyone wants to have and solve.&lt;/p&gt;

&lt;p&gt;But the truth is, I don't, and I can assure you, you don't want to either, sometimes I doubt my brain is even capable
properly solving these problems, but that doesn't prevent me from trying. I prefer to work on as small a scale as
possible, you could even say I hate distributed systems. Scaling and distribution is a problem most of us don't have,
and are probably better of not having.&lt;/p&gt;

&lt;p&gt;Truth be told, I'm not highly interested in running highly distributed systems in production, quite the opposite. I prefer
maxing out what I have as far up as possible. Sometimes I do take the plunge and just try something new in production,
but I'm happy prepared to replace it with something different, even something simpler, if that seems like the better
option in the end. Everyone should experiment at some point, but not all the time.&lt;/p&gt;

&lt;p&gt;But why then do I love distributed systems? Simply because they make me think about how they could be put to use,
what algorithms and the problems involved are, and what implications they would have on a production system, both from
an operations and developer perspective. That's where the value is for me, it allows me to simply make informed
decisions when the time comes.&lt;/p&gt;

&lt;p&gt;Take Riak, for example, on which &lt;a href=&quot;http://riak-rugb.heroku.com&quot;&gt;I gave a shortish talk&lt;/a&gt; at yesterday's meet-up of the
local Ruby brigade. Riak's distribution model is based on Amazon's Dynamo implementation, with some neat features
sprinkled on top. Riak is built by a bunch of really, really smart guys at &lt;a href=&quot;http://basho.com&quot;&gt;Basho&lt;/a&gt;, whose work I have
nothing but respect for, but who also are sane and open enough to tell people when their database may or may not be a
good fit (something a certain other database is severly lacking).&lt;/p&gt;

&lt;p&gt;Riak is exciting for me because it was the first database that really made me dive into Amazon's Dynamo, and once I
started grokking it, it blew my mind. If you haven't read it, &lt;a href=&quot;http://www.allthingsdistributed.com/2007/10/amazons_dynamo.html&quot;&gt;please
do&lt;/a&gt;. It blew my mind simply because it introduced me to
a whole new thinking, to heavily distributed storage, with all the potential hot spots, downsides and business use cases
for specifics parts of it thrown in. The same is true for &lt;a href=&quot;http://labs.google.com/papers/bigtable.html&quot;&gt;Google's BigTable&lt;/a&gt;.
The technologies involved with both are true mind-benders.&lt;/p&gt;

&lt;p&gt;And there's my bottom line. Distributed systems aren't necessarily awesome just because they allow scaling to infinite
heights (exaggeration intended), but because they broaden your personal horizon. It's like learning new programming
languages. It's about getting new ideas in your head, ideas outside of your everyday working realm. Ideas you can maybe
even take back to what you're working on and start applying them where it makes sense, and only if it makes sense.
Learning about distributed systems is not just about learning how to use them, but when. Knowing is half the battle.&lt;/p&gt;

&lt;p&gt;While you're at it, check out Evan Weaver's &lt;a href=&quot;http://blog.evanweaver.com/articles/2009/05/04/distributed-systems-primer/&quot;&gt;&quot;Distributed Systems
Primer&quot;&lt;/a&gt;, a collection of papers on
distributed systems, or the &lt;a href=&quot;http://nosqlsummer.org/papers&quot;&gt;papers collection over at NoSQL Summer&lt;/a&gt;. Get ready to have
your mind blown in whole new ways. Say what you will, that stuff is just fascinating. It appeals to the distributed
database lover in me.&lt;/p&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/Paperplanes/~4/huQReTZr60Q&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</content>
		<author>
			<name>paperplanes</name>
			<uri>http://www.paperplanes.de</uri>
		</author>
		<source>
			<title type="html">paperplanes</title>
			<subtitle type="html">software development that flies</subtitle>
			<link rel="self" href="http://feeds.feedburner.com/Paperplanes"/>
			<id>http://feeds.feedburner.com/Paperplanes</id>
			<updated>2010-09-03T16:40:18+00:00</updated>
			<rights type="html">Copyright 2007-2009</rights>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Am Montag wieder ein Webmontag</title>
		<link href="http://feedproxy.google.com/~r/railslabs/~3/3L7c-GdaK00/"/>
		<id>http://railslove.com/weblog/?p=633</id>
		<updated>2010-08-30T11:02:56+00:00</updated>
		<content type="html">&lt;p&gt;Am Montag, dem 13.09.2010 ist es wieder so weit: der &lt;a href=&quot;http://webmontag.de/location/koeln/2010-09-13&quot;&gt;23. Kölner Webmontag&lt;/a&gt; läd wieder ein. Da in dieser Woche auch &lt;a href=&quot;http://iwcgn.koeln.de/&quot;&gt;die Internetwoche Köln stattfindet&lt;/a&gt; (13.09 - 19.09.), &lt;a href=&quot;http://www.popula.de/veranstaltung/486353_-23-webmontag-in-koeln-spielplatz-koeln&quot;&gt;passt der Webmontag hier ganz gut in die Reihe&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Wir treffen uns wie gewohnt um 19:00 Uhr im Spielplatz und freuen uns auf zahlreiche Besucher!&lt;/p&gt;
&lt;p&gt;Mehr Informationen findet ihr unter:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://webmontag.de/location/koeln/2010-09-13&quot;&gt;Der Webmontag im Wiki&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://upcoming.yahoo.com/event/6682661/NRW/Kln/23-Webmontag/Spielplatz/?ps=5&quot;&gt;Webmontag auf Upcoming&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://venteria.com/events/143468-23-Webmontag&quot;&gt;Webmotag auf Venteria&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://webmontag.de/&quot;&gt;webmontag.de&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://iwcgn.koeln.de/&quot;&gt;Internetwoche Köln&lt;/a&gt;&lt;/p&gt;
&lt;div class=&quot;feedflare&quot;&gt;
&lt;a href=&quot;http://feeds.feedburner.com/~ff/railslabs?a=3L7c-GdaK00:G8Iz7ixNUP8:yIl2AUoC8zA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/railslabs?d=yIl2AUoC8zA&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/railslabs?a=3L7c-GdaK00:G8Iz7ixNUP8:7Q72WNTAKBA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/railslabs?d=7Q72WNTAKBA&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/railslabs?a=3L7c-GdaK00:G8Iz7ixNUP8:V_sGLiPBpWU&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/railslabs?i=3L7c-GdaK00:G8Iz7ixNUP8:V_sGLiPBpWU&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;
&lt;/div&gt;</content>
		<author>
			<name>Railslove</name>
			<uri>http://railslove.com/weblog</uri>
		</author>
		<source>
			<title type="html">Railslove</title>
			<subtitle type="html">we love building web applications</subtitle>
			<link rel="self" href="http://feeds.feedburner.com/railslabs"/>
			<id>tag:railslabs.com,2007:mephisto/</id>
			<updated>2010-09-06T22:00:11+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">DevHouseFriday is back!</title>
		<link href="http://feedproxy.google.com/~r/railslabs/~3/hlRN2VqBwM8/"/>
		<id>http://railslove.com/weblog/?p=629</id>
		<updated>2010-08-27T14:31:50+00:00</updated>
		<content type="html">&lt;p&gt;Während der Internetwoche Köln gibt es wieder ein DevHouseFriday. Nach der Sommerpause dieses Jahr, treffen wir uns am 17.09.2010 um 19:00 wieder. Dieses mal im Coworking Cologne Space - der Gasmotorenfabrik.&lt;br /&gt;
Unser Thema dieses mal ist: &lt;strong&gt;The future of Web Technologies.&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Alle Hacker und Thinker aus Köln und Umgebung sind herzlich wilkommen!&lt;br /&gt;
Mehr Informationen gibt es unter:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://iwcgn.koeln.de/2010/08/27/railslove/&quot;&gt;http://iwcgn.koeln.de/2010/08/27/railslove/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://devhouse.railslove.com/events/4&quot;&gt;http://devhouse.railslove.com/events/4&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;http://iwcgn.koeln.de/2010/08/27/railslove/&quot;&gt;&lt;img src=&quot;http://u1.ipernity.com/16/36/14/8863614.88429d88.500.jpg&quot; width=&quot;500&quot; height=&quot;390&quot; alt=&quot;IWCGN &amp; Railslove&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Wir freuen uns sehr auf euren Besuch!&lt;/p&gt;
&lt;div class=&quot;feedflare&quot;&gt;
&lt;a href=&quot;http://feeds.feedburner.com/~ff/railslabs?a=hlRN2VqBwM8:3fLqWA1aLuI:yIl2AUoC8zA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/railslabs?d=yIl2AUoC8zA&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/railslabs?a=hlRN2VqBwM8:3fLqWA1aLuI:7Q72WNTAKBA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/railslabs?d=7Q72WNTAKBA&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/railslabs?a=hlRN2VqBwM8:3fLqWA1aLuI:V_sGLiPBpWU&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/railslabs?i=hlRN2VqBwM8:3fLqWA1aLuI:V_sGLiPBpWU&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;
&lt;/div&gt;</content>
		<author>
			<name>Railslove</name>
			<uri>http://railslove.com/weblog</uri>
		</author>
		<source>
			<title type="html">Railslove</title>
			<subtitle type="html">we love building web applications</subtitle>
			<link rel="self" href="http://feeds.feedburner.com/railslabs"/>
			<id>tag:railslabs.com,2007:mephisto/</id>
			<updated>2010-09-06T22:00:11+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Celebrating Whyday!</title>
		<link href="http://feedproxy.google.com/~r/railslabs/~3/8mCGG5mz0jQ/"/>
		<id>http://railslove.com/weblog/?p=626</id>
		<updated>2010-08-19T09:12:30+00:00</updated>
		<content type="html">&lt;p&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Why_the_lucky_stiff&quot;&gt;why the lucky stiff&lt;/a&gt; was the persona of an anonymous and prolific writer, cartoonist, musician, artist, and computer programmer.(wikipedia) He was one of the key figures in the &lt;a href=&quot;http://en.wikipedia.org/wiki/Ruby_(programming_language)&quot;&gt;Ruby&lt;/a&gt; community and helped to build what the Ruby community is today. He gave the &lt;a href=&quot;http://en.wikipedia.org/wiki/Ruby_(programming_language)&quot;&gt;Ruby&lt;/a&gt; community the spirit of freedom, whimsy and most notably creativity.&lt;br /&gt;
On August 19, 2009 he withdrew from the online community. He shut down all his online presence including his Github, Twitter Accounts, the sites he maintained, etc. Since then his work has been collected at the &lt;a href=&quot;http://whymirror.github.com/&quot;&gt;whymirror on Github&lt;/a&gt;. &lt;/p&gt;
&lt;p&gt;The Ruby community wishes him well and celebrates Whyday today to remember Why&amp;#8217;s contributions to the community and culture.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The Ruby hackers here at cowoco join the celebration&lt;/strong&gt;. So put away your best practices and create something wonderful! Head over to &lt;a href=&quot;http://whyday.org/&quot;&gt;the whyday page&lt;/a&gt; to get some ideas:  Try that wild idea you&amp;#8217;ve been sitting on because it&amp;#8217;s too crazy, teach programming to a child, see how far you can push some weird corner of ruby, &amp;#8230;&lt;/p&gt;
&lt;p&gt;Happy whyday!&lt;/p&gt;
&lt;p&gt;
&lt;p&gt;&lt;a href=&quot;http://vimeo.com/5047563&quot;&gt;ART &amp;#038;&amp;#038; CODE Symposium: Hackety Hack, why the lucky stiff&lt;/a&gt; from &lt;a href=&quot;http://vimeo.com/sfci&quot;&gt;STUDIO for Creative Inquiry&lt;/a&gt; on &lt;a href=&quot;http://vimeo.com&quot;&gt;Vimeo&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://vimeo.com/5047563&quot;&gt;One of why&amp;#8217;s talks: ART &amp;#038;&amp;#038; CODE Symposium: Hackety Hack, why the lucky stiff&lt;/a&gt; from &lt;a href=&quot;http://vimeo.com/sfci&quot;&gt;STUDIO for Creative Inquiry&lt;/a&gt; on &lt;a href=&quot;http://vimeo.com/&quot;&gt;Vimeo&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;via &lt;a href=&quot;http://coworkingcologne.posterous.com/celebrating-whyday&quot;&gt;Coworking Cologne&lt;/a&gt;&lt;/p&gt;
&lt;div class=&quot;feedflare&quot;&gt;
&lt;a href=&quot;http://feeds.feedburner.com/~ff/railslabs?a=8mCGG5mz0jQ:kXGYNncyUx4:yIl2AUoC8zA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/railslabs?d=yIl2AUoC8zA&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/railslabs?a=8mCGG5mz0jQ:kXGYNncyUx4:7Q72WNTAKBA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/railslabs?d=7Q72WNTAKBA&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/railslabs?a=8mCGG5mz0jQ:kXGYNncyUx4:V_sGLiPBpWU&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/railslabs?i=8mCGG5mz0jQ:kXGYNncyUx4:V_sGLiPBpWU&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;
&lt;/div&gt;&lt;/p&gt;</content>
		<author>
			<name>Railslove</name>
			<uri>http://railslove.com/weblog</uri>
		</author>
		<source>
			<title type="html">Railslove</title>
			<subtitle type="html">we love building web applications</subtitle>
			<link rel="self" href="http://feeds.feedburner.com/railslabs"/>
			<id>tag:railslabs.com,2007:mephisto/</id>
			<updated>2010-09-06T22:00:11+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">What we are really doing after our working hours</title>
		<link href="http://feedproxy.google.com/~r/railslabs/~3/chwHbAplpe0/"/>
		<id>http://railslove.com/weblog/?p=620</id>
		<updated>2010-08-19T00:50:04+00:00</updated>
		<content type="html">&lt;p&gt;This is a very short post about what is railslove doing after working hours. Yes, we&amp;#8217;re drinking beer, playing urban terror or somking cigars and thinking about &amp;#8220;how we do spend our next million&amp;#8221;&amp;#8230;.&lt;/p&gt;
&lt;p&gt;Yeah.. and what is railslove really doing? The short answer is: coding, thinking about really hot applications and having a lot of fun to work with our team.&lt;/p&gt;
&lt;p&gt;But now we&amp;#8217;re trying something new: Railslove Research (short: RR). So we started a small independent blog, where we want to find out, how to do apis more usable and flexible for developers. Just visit our blog: &lt;a href=&quot;http://arrrpi.posterous.com/&quot;&gt;http://arrrpi.posterous.com&lt;/a&gt; (and of course we&amp;#8217;re building a sexy application around that&amp;#8230;)&lt;/p&gt;
&lt;div class=&quot;feedflare&quot;&gt;
&lt;a href=&quot;http://feeds.feedburner.com/~ff/railslabs?a=chwHbAplpe0:1kFFUUS2TIM:yIl2AUoC8zA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/railslabs?d=yIl2AUoC8zA&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/railslabs?a=chwHbAplpe0:1kFFUUS2TIM:7Q72WNTAKBA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/railslabs?d=7Q72WNTAKBA&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/railslabs?a=chwHbAplpe0:1kFFUUS2TIM:V_sGLiPBpWU&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/railslabs?i=chwHbAplpe0:1kFFUUS2TIM:V_sGLiPBpWU&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;
&lt;/div&gt;</content>
		<author>
			<name>Railslove</name>
			<uri>http://railslove.com/weblog</uri>
		</author>
		<source>
			<title type="html">Railslove</title>
			<subtitle type="html">we love building web applications</subtitle>
			<link rel="self" href="http://feeds.feedburner.com/railslabs"/>
			<id>tag:railslabs.com,2007:mephisto/</id>
			<updated>2010-09-06T22:00:11+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">AWS User Group Köln Meetup am 18.08, 19:00 Uhr</title>
		<link href="http://feedproxy.google.com/~r/railslabs/~3/YQXzkm3jqek/"/>
		<id>http://railslove.com/weblog/?p=618</id>
		<updated>2010-08-18T13:28:39+00:00</updated>
		<content type="html">&lt;p&gt;Heute (18.08.) trifft sich die AWS User Group Köln im &lt;a href=&quot;http://coworkingcologne.posterous.com/&quot;&gt;Coworking Space der Gasmotorenfabrik&lt;/a&gt;. Schwerpunktthema während der Veranstaltung werden die Cloud Services von Amazon sein. Startzeit ist 19:00 Uhr.&lt;/p&gt;
&lt;p&gt;Es wird sich zu der Nutzung von Amazons Web Services wie EC2, S3 und anderen gemeinsam ausgetauscht. Nach zwei, drei kurzen Vorträgen zu Beginn des Treffens ist dann im Anschluss viel Platz zur regen Diskussion und fürs Networking.&lt;/p&gt;
&lt;p&gt;Mehr Informationen findet man bei &lt;a href=&quot;https://www.xing.com/events/aws-user-group-koln-545053/description&quot;&gt;Xing&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Via &lt;a href=&quot;http://coworkingcologne.posterous.com/aws-user-group-koln-meetup&quot;&gt;Coworking Cologne&lt;/a&gt;&lt;/p&gt;
&lt;div class=&quot;feedflare&quot;&gt;
&lt;a href=&quot;http://feeds.feedburner.com/~ff/railslabs?a=YQXzkm3jqek:YmknILBvSbI:yIl2AUoC8zA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/railslabs?d=yIl2AUoC8zA&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/railslabs?a=YQXzkm3jqek:YmknILBvSbI:7Q72WNTAKBA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/railslabs?d=7Q72WNTAKBA&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/railslabs?a=YQXzkm3jqek:YmknILBvSbI:V_sGLiPBpWU&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/railslabs?i=YQXzkm3jqek:YmknILBvSbI:V_sGLiPBpWU&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;
&lt;/div&gt;</content>
		<author>
			<name>Railslove</name>
			<uri>http://railslove.com/weblog</uri>
		</author>
		<source>
			<title type="html">Railslove</title>
			<subtitle type="html">we love building web applications</subtitle>
			<link rel="self" href="http://feeds.feedburner.com/railslabs"/>
			<id>tag:railslabs.com,2007:mephisto/</id>
			<updated>2010-09-06T22:00:11+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">An Inconvenient Caveat about MongoDB's Replica Sets (updated)</title>
		<link href="http://www.paperplanes.de/2010/8/12/inconvenient_caveat_about_mongodbs_replica_sets.html"/>
		<id>http://www.paperplanes.de/archives/2010/8/12/inconvenient_caveat_about_mongodbs_replica_sets/</id>
		<updated>2010-08-12T00:00:00+00:00</updated>
		<content type="html">&lt;p&gt;Update: Read the comments and below. The issue is not as bad as it used to be in the documentation and the original
design, thankfully.&lt;/p&gt;

&lt;p&gt;A lot has happened since I've first &lt;a href=&quot;http://feeds.feedburner.com/2010/2/25/notes_on_mongodb.html&quot;&gt;written about MongoDB back in
February&lt;/a&gt;. Replica Pairs are going to be deprecated, being
replaced by Replica Sets, a working Auto-Sharding implementation, including rebalancing shards, and lots more, all
neatly wrapped into the &lt;a href=&quot;http://blog.mongodb.org/post/908172564/mongodb-1-6-released&quot;&gt;1.6 release&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The initial draft on how they'd turn out sounded good, but something struck me as odd, and it is once again one of these
things that tend to be overlooked in all the excitement about the new features. Before we dive any deeper, make sure
you've read the &lt;a href=&quot;http://www.mongodb.org/display/DOCS/Replica+Sets&quot;&gt;documentation&lt;/a&gt;, or check out this rather short
&lt;a href=&quot;http://www.coffeepowered.net/2010/08/06/setting-up-replica-sets-with-mongodb-1-6/&quot;&gt;introduction on setting up a Replica
Set&lt;/a&gt;, I won't go into much detail on
Replica Sets in general, I just want to point out one major issue I've found with them. Part of the &lt;a href=&quot;http://www.mongodb.org/display/DOCS/Replica+Set+Internals&quot;&gt;documentation sheds
some light on the inner workings of Replica Sets&lt;/a&gt;. It's not
exhaustive, but to me more interesting than the rest of the documentation.&lt;/p&gt;

&lt;p&gt;One part struck me as odd, the paragraph on &lt;a href=&quot;http://www.mongodb.org/display/DOCS/Replica+Set+Internals#ReplicaSetInternals-Resync%28ConnectingtoaNewPrimary%29&quot;&gt;resyncing data from a new
primary&lt;/a&gt;
(as in master). It's two parts actually, but they pretty much describe the same caveat:&lt;/p&gt;

&lt;blockquote&gt;
    &lt;p&gt;When a secondary connects to a new primary, it must resynchronize its position. It is possible the secondary has
    operations that were never committed at the primary. In this case, we roll those operations back.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Also:&lt;/p&gt;

&lt;blockquote&gt;
    &lt;p&gt;When we become primary, we assume we have the latest data. Any data newer than the new primary's will be discarded.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Did you notice something? MongoDB rolls operations back that were never committed to the primary, discarding the updated
data, which is just a fancy term for &lt;a href=&quot;http://www.mongodb.org/display/DOCS/Replica+Set+Internals#ReplicaSetInternals-AssumptionofPrimary&quot;&gt;silently deleting data without further
notice&lt;/a&gt;. Imagine a
situation where you just threw a bunch of new or updated data at your current master, and the data has not yet fully
replicated to all slaves, when suddenly your master crashes. According to &lt;a href=&quot;http://www.mongodb.org/display/DOCS/Replica+Set+Internals#ReplicaSetInternals-PickingPrimary&quot;&gt;the
protocol&lt;/a&gt; the node with
the most recent opslog entries takes over the primary's role automatically.&lt;/p&gt;

&lt;p&gt;When the old master comes back up, it needs to resynchronize the changes from the current master, before it can play any
role in the set again, no matter if it becomes the new primary, or sticks to being a secondary, leaving the new master
in place. During that resync it discards data that has not been synchronized to the new master yet. If the opslog on the
new master was behind a couple of dozen entries before the old one went down, all that data is lost. I repeat: lost.
Think about that.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.mongodb.org/display/DOCS/Replica+Set+Internals#ReplicaSetInternals-IncreasingDurability&quot;&gt;There's ways to reduce the
pain&lt;/a&gt;, and I
appreciate that they're mentioned appropriately in the documentation. You can tell MongoDB to consider a write
successful when it replicated to a certain number of secondaries. But you have to wait until that happened, &lt;a href=&quot;http://www.mongodb.org/display/DOCS/Verifying+Propagation+of+Writes+with+getLastError&quot;&gt;polling
&lt;code&gt;getLastError()&lt;/code&gt; for the state of the last
operation&lt;/a&gt;. Or you could set
&lt;code&gt;maxLag&lt;/code&gt; accordingly, so that the master will fail or block a write until the secondaries catch up with the replication,
though I couldn't for the life of me figure out (using the Googles) where and how to set it.&lt;/p&gt;

&lt;p&gt;But I don't approve of this behavior as a default, and the fact that you need to go through the internals to find out
about it. &lt;a href=&quot;http://www.mongodb.org/display/DOCS/Sharding+and+Failover&quot;&gt;Everything else suggests&lt;/a&gt; that there's no point of
failure in a MongoDB setup using sharding and Replica Sets, even comparing it to the Dynamo way of guaranteeing
consistency, which it simply isn't when the client has to poll for a successful write.&lt;/p&gt;

&lt;p&gt;It's one of those things that make me reconsider my (already improved) opinions on MongoDB all over again, just when I
started to warm up with it. Yes, it's wicked fast, but I simply disagree with their take on durability and consistency.
The tradeoff (as in: losing data) is simply too big for me. You could argue that these situations will be quite rare,
and I would not disagree with you, but I'm not fond of potentially losing data when they do happen. If this works for
you, cool! Just thought you should know.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Update&lt;/em&gt;: There's been some helpful comments by the MongoDB folks, and there's good news. Data is not silently discarded
in 1.6 anymore, apparently it's stored in some flat file, fixed with &lt;a href=&quot;http://jira.mongodb.org/browse/SERVER-1512&quot;&gt;this
issue&lt;/a&gt;, though it's hard for me to say from the commits what exactly
happens. The documentation does not at all reflect these changes, but improvements are on the way. I'm still not happy
about some of the design decision, but they're rooted in the way MongoDB currently works, and changing that is unlikely
to happen, but at least losing data doesn't seem to be an option anymore. If making a bit of a fool out of myself helped
to improve on the documentation front, so be it. I can live with that.&lt;/p&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/Paperplanes/~4/FNnMIz-ssAo&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</content>
		<author>
			<name>paperplanes</name>
			<uri>http://www.paperplanes.de</uri>
		</author>
		<source>
			<title type="html">paperplanes</title>
			<subtitle type="html">software development that flies</subtitle>
			<link rel="self" href="http://feeds.feedburner.com/Paperplanes"/>
			<id>http://feeds.feedburner.com/Paperplanes</id>
			<updated>2010-09-03T16:40:18+00:00</updated>
			<rights type="html">Copyright 2007-2009</rights>
		</source>
	</entry>

	<entry xml:lang="en-US">
		<title type="html">Ferret 0.11.8</title>
		<link href="http://feeds.jkraemer.net/~r/jkraemer/~3/lZ8cZ8heQH8/ferret-0-11-8"/>
		<id>tag:www.jkraemer.net,2010-08-06:288</id>
		<updated>2010-08-06T11:22:32+00:00</updated>
		<content type="html">&lt;p&gt;Just in case you didn’t notice - Ferret development has &lt;a href=&quot;http://github.com/dbalmain/ferret/commits/master&quot;&gt;continued during the last year&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Unfortunately no new gem has been released for a while, so in case you want to give it a try here’s how to build and install your very own Ferret 0.11.8.1:&lt;/p&gt;

&lt;p&gt;For me the new version fixed some rare crashes occuring when running Ferret along with acts_as_ferret under Ruby Enterprise Edition 1.8.7. Reading the commit messages it also looks like this version is ready to compile and run with Ruby 1.9.&lt;/p&gt;

&lt;p&gt;If you’re feeling lazy you can also &lt;a href=&quot;http://www.jkraemer.net/assets/2010/8/6/ferret-0.11.8.1.gem&quot;&gt;download the Ferret 0.11.8.1 gem&lt;/a&gt; from this blog.&lt;/p&gt;
          &lt;img src=&quot;http://feeds.feedburner.com/~r/jkraemer/~4/lZ8cZ8heQH8&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</content>
		<author>
			<name>jk</name>
			<uri>http://www.jkraemer.net/</uri>
		</author>
		<source>
			<title type="html">jkraemer.net - Blog</title>
			<subtitle type="html">&lt;div id=&quot;site_container&quot;&gt;
		&lt;div id=&quot;site_header&quot;&gt;
			&lt;ul class=&quot;corporate_identity &quot;&gt;
				&lt;li class=&quot;logo&quot;&gt;&lt;a href=&quot;http://www.modrails.com&quot;&gt;&lt;span&gt;Phusion Passenger&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
			&lt;/ul&gt;
		&lt;/div&gt;
		&lt;div id=&quot;site_body&quot;&gt;
			
&lt;h1 class=&quot;error_title&quot;&gt;Internal server error&lt;/h1&gt;
&lt;div id=&quot;content&quot;&gt;
	
	Passenger encountered the following error:
	
	&lt;p&gt;
		The application spawner server exited unexpectedly
	&lt;/p&gt;
	
	&lt;dl&gt;
	&lt;dt&gt;Exception class:&lt;/dt&gt;
	&lt;dd&gt;Passenger::Railz::ApplicationSpawner::Error&lt;/dd&gt;
	
	&lt;dt&gt;Backtrace:&lt;/dt&gt;
	&lt;dd&gt;
		
			&lt;table class=&quot;backtrace&quot;&gt;
			&lt;tr class=&quot;headers&quot;&gt;
				&lt;th&gt;#&lt;/th&gt;
				&lt;th&gt;File&lt;/th&gt;
				&lt;th&gt;Line&lt;/th&gt;
				&lt;th&gt;Location&lt;/th&gt;
			&lt;/tr&gt;
		
				&lt;tr class=&quot;backtrace_line passenger uneven&quot;&gt;
					&lt;td class=&quot;index&quot;&gt;0&lt;/td&gt;
					&lt;td class=&quot;filename&quot;&gt;/opt/ruby-enterprise-1.8.6-20080810/lib/ruby/gems/1.8/gems/passenger-2.0.3/lib/passenger/railz/application_spawner.rb&lt;/td&gt;
					&lt;td class=&quot;line&quot;&gt;109&lt;/td&gt;
					&lt;td class=&quot;location&quot;&gt;in `spawn_application'&lt;/td&gt;
				&lt;/tr&gt;
			
				&lt;tr class=&quot;backtrace_line passenger even&quot;&gt;
					&lt;td class=&quot;index&quot;&gt;1&lt;/td&gt;
					&lt;td class=&quot;filename&quot;&gt;/opt/ruby-enterprise-1.8.6-20080810/lib/ruby/gems/1.8/gems/passenger-2.0.3/lib/passenger/spawn_manager.rb&lt;/td&gt;
					&lt;td class=&quot;line&quot;&gt;228&lt;/td&gt;
					&lt;td class=&quot;location&quot;&gt;in `spawn_rails_application'&lt;/td&gt;
				&lt;/tr&gt;
			
				&lt;tr class=&quot;backtrace_line passenger uneven&quot;&gt;
					&lt;td class=&quot;index&quot;&gt;2&lt;/td&gt;
					&lt;td class=&quot;filename&quot;&gt;/opt/ruby-enterprise-1.8.6-20080810/lib/ruby/gems/1.8/gems/passenger-2.0.3/lib/passenger/spawn_manager.rb&lt;/td&gt;
					&lt;td class=&quot;line&quot;&gt;213&lt;/td&gt;
					&lt;td class=&quot;location&quot;&gt;in `synchronize'&lt;/td&gt;
				&lt;/tr&gt;
			
				&lt;tr class=&quot;backtrace_line passenger even&quot;&gt;
					&lt;td class=&quot;index&quot;&gt;3&lt;/td&gt;
					&lt;td class=&quot;filename&quot;&gt;/opt/ruby-enterprise-1.8.6-20080810/lib/ruby/gems/1.8/gems/passenger-2.0.3/lib/passenger/spawn_manager.rb&lt;/td&gt;
					&lt;td class=&quot;line&quot;&gt;213&lt;/td&gt;
					&lt;td class=&quot;location&quot;&gt;in `spawn_rails_application'&lt;/td&gt;
				&lt;/tr&gt;
			
				&lt;tr class=&quot;backtrace_line passenger uneven&quot;&gt;
					&lt;td class=&quot;index&quot;&gt;4&lt;/td&gt;
					&lt;td class=&quot;filename&quot;&gt;/opt/ruby-enterprise-1.8.6-20080810/lib/ruby/gems/1.8/gems/passenger-2.0.3/lib/passenger/spawn_manager.rb&lt;/td&gt;
					&lt;td class=&quot;line&quot;&gt;122&lt;/td&gt;
					&lt;td class=&quot;location&quot;&gt;in `spawn_application'&lt;/td&gt;
				&lt;/tr&gt;
			
				&lt;tr class=&quot;backtrace_line passenger even&quot;&gt;
					&lt;td class=&quot;index&quot;&gt;5&lt;/td&gt;
					&lt;td class=&quot;filename&quot;&gt;/opt/ruby-enterprise-1.8.6-20080810/lib/ruby/gems/1.8/gems/passenger-2.0.3/lib/passenger/spawn_manager.rb&lt;/td&gt;
					&lt;td class=&quot;line&quot;&gt;247&lt;/td&gt;
					&lt;td class=&quot;location&quot;&gt;in `handle_spawn_application'&lt;/td&gt;
				&lt;/tr&gt;
			
				&lt;tr class=&quot;backtrace_line passenger uneven&quot;&gt;
					&lt;td class=&quot;index&quot;&gt;6&lt;/td&gt;
					&lt;td class=&quot;filename&quot;&gt;/opt/ruby-enterprise-1.8.6-20080810/lib/ruby/gems/1.8/gems/passenger-2.0.3/lib/passenger/abstract_server.rb&lt;/td&gt;
					&lt;td class=&quot;line&quot;&gt;317&lt;/td&gt;
					&lt;td class=&quot;location&quot;&gt;in `__send__'&lt;/td&gt;
				&lt;/tr&gt;
			
				&lt;tr class=&quot;backtrace_line passenger even&quot;&gt;
					&lt;td class=&quot;index&quot;&gt;7&lt;/td&gt;
					&lt;td class=&quot;filename&quot;&gt;/opt/ruby-enterprise-1.8.6-20080810/lib/ruby/gems/1.8/gems/passenger-2.0.3/lib/passenger/abstract_server.rb&lt;/td&gt;
					&lt;td class=&quot;line&quot;&gt;317&lt;/td&gt;
					&lt;td class=&quot;location&quot;&gt;in `main_loop'&lt;/td&gt;
				&lt;/tr&gt;
			
				&lt;tr class=&quot;backtrace_line passenger uneven&quot;&gt;
					&lt;td class=&quot;index&quot;&gt;8&lt;/td&gt;
					&lt;td class=&quot;filename&quot;&gt;/opt/ruby-enterprise-1.8.6-20080810/lib/ruby/gems/1.8/gems/passenger-2.0.3/lib/passenger/abstract_server.rb&lt;/td&gt;
					&lt;td class=&quot;line&quot;&gt;168&lt;/td&gt;
					&lt;td class=&quot;location&quot;&gt;in `start_synchronously'&lt;/td&gt;
				&lt;/tr&gt;
			
				&lt;tr class=&quot;backtrace_line passenger even&quot;&gt;
					&lt;td class=&quot;index&quot;&gt;9&lt;/td&gt;
					&lt;td class=&quot;filename&quot;&gt;/opt/ruby-enterprise-1.8.6-20080810/lib/ruby/gems/1.8/gems/passenger-2.0.3/bin/passenger-spawn-server&lt;/td&gt;
					&lt;td class=&quot;line&quot;&gt;46&lt;/td&gt;
					&lt;td class=&quot;location&quot;&gt;&lt;/td&gt;
				&lt;/tr&gt;
			&lt;/table&gt;

	&lt;/dd&gt;
	&lt;/dl&gt;

&lt;/div&gt;

		&lt;/div&gt;
		&lt;div id=&quot;site_footer&quot;&gt;
			
			&lt;div class=&quot;container&quot;&gt;
				Powered by &lt;a href=&quot;http://www.modrails.com/&quot;&gt;Phusion Passenger&lt;/a&gt;,
				&lt;tt&gt;mod_rails&lt;/tt&gt; / &lt;tt&gt;mod_rack&lt;/tt&gt; for Apache.
			&lt;/div&gt;
		&lt;/div&gt;
	&lt;/div&gt;</subtitle>
			<link rel="self" href="http://www.jkraemer.net/feed/atom.xml"/>
			<id>tag:www.jkraemer.net,2010:mephisto/</id>
			<updated>2010-08-30T22:40:03+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="de-de">
		<title type="html">GitHub, I like…</title>
		<link href="http://feedproxy.google.com/~r/dopefreshtightblog/~3/jE6O5LBp69A/"/>
		<id>http://dennisbloete.de/?p=739</id>
		<updated>2010-07-30T16:20:53+00:00</updated>
		<content type="html">&lt;p&gt;Toying around with GreaseMonkey I wrote a &lt;a href=&quot;http://github.com/dbloete/I-like-GitHub&quot;&gt;little userscript&lt;/a&gt; that integrates the Facebook Like button into GitHub repository pages (&lt;a href=&quot;http://github.com/dbloete/I-like-GitHub/blob/master/i-like-github.user.js&quot;&gt;click here to install it&lt;/a&gt;). Nothing special, but maybe you like it too &lt;img src=&quot;http://dennisbloete.de/wp-includes/images/smilies/icon_smile.gif&quot; alt=&quot;:)&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/p&gt;
&lt;p&gt;Next up: Stop messing around with GreaseMonkey and learn how to write &lt;a href=&quot;http://extensions.apple.com/&quot;&gt;Safari Extensions&lt;/a&gt;.&lt;/p&gt;</content>
		<author>
			<name>Dennis Bloete</name>
			<email>mail@dennisbloete.de</email>
			<uri>http://dennisbloete.de</uri>
		</author>
		<source>
			<title type="html">//dennisbloete</title>
			<subtitle type="html">Arbeit und Alltag eines Software-Entwicklers aus Bremen</subtitle>
			<link rel="self" href="http://feeds.feedburner.com/dopefreshtightblog/"/>
			<id>http://feeds.feedburner.com/dopefreshtightblog/</id>
			<updated>2010-09-06T07:40:13+00:00</updated>
			<rights type="html">©</rights>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">10 Annoying Things About CouchDB</title>
		<link href="http://www.paperplanes.de/2010/7/26/10_annoying_things_about_couchdb.html"/>
		<id>http://www.paperplanes.de/archives/2010/7/26/10_annoying_things_about_couchdb/</id>
		<updated>2010-07-26T00:00:00+00:00</updated>
		<content type="html">&lt;p&gt;Hi, I'm Mathias, and I'm a &lt;a href=&quot;http://couchdb.apache.org/&quot;&gt;CouchDB&lt;/a&gt; user. I've been using it for almost a year now, and we
have a &lt;a href=&quot;http://scalarium.com&quot;&gt;project using it in production&lt;/a&gt;, with a side of Redis. I think it's an awesome database,
some of its features are simply unrivaled. &lt;a href=&quot;http://wiki.apache.org/couchdb/Replication&quot;&gt;Offline replication&lt;/a&gt;,
&lt;a href=&quot;http://couchapp.org/&quot;&gt;CouchApps&lt;/a&gt;, to name a few. CouchDB just hit version 1.0.  It's been a long time coming, with
CouchDB having probably one of the longest histories in the non-relational database space. I've heard about it first
back in September 2008, when Jan Lehnardt talked about it at a local co-working space.  I still blame him for getting me
all excited about this whole NoSQL thing. Fun fact: I bookmarked the CouchDB website back in February 2008.&lt;/p&gt;

&lt;p&gt;The features being added to it with every release are nothing short of exciting. CouchDB 0.11 got &lt;a href=&quot;http://blog.couch.io/post/446015664/whats-new-in-apache-couchdb-0-11-part-two-views&quot;&gt;filtered
replication&lt;/a&gt;, support for &lt;a href=&quot;http://blog.couch.io/post/443028592/whats-new-in-apache-couchdb-0-11-part-one-nice-urls&quot;&gt;URL
rewriting and vhosts&lt;/a&gt;, amongst
other things. But there's still some things that annoy me, that somewhat bug me in my daily work with it.&lt;/p&gt;

&lt;p&gt;The following things are not incredible pet-peeves I have with CouchDB. I think CouchDB is pretty awesome, and I really
like using it. However, it doesn't come without the occasional odditity that will leave you scratching your head. These
probably aren't the only things to be aware of, they're just the most annoying to me. Your mileage may vary. They may or
may not be annoying to you, but they're things that are good to know working with CouchDB. Whether CouchDB should or
should not have what I'm listing here is a whole different story. It's my wishlist of improvements, if you will.&lt;/p&gt;

&lt;p&gt;It's also stuff you're buying into when you move off the beaten path of relational databases. As always, some of these
are not hard to find out, some of them do only get really annoying once you're moving into production, or when you get a
deeper knowledge of the tool at hand. Nothing specific to CouchDB here, but some of the issues listed below stem from
actively using it. Take them with a grain of salt. While they may seem annoying at first, they're things you can live
with. Believe me, you can.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Views are updated on read access&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You can dump in as many documents as you want, and you can create as many map/reduce views as you want. The truth is,
they'll only come all together to slow down your application when you're querying the view. Assume you have a good stash
of documents in your database, and you decide you need a new view on your data. Throw in the JavaScript functions and go
ahead and query the view. Calling it a slow-down may be a stretch at times though, it really depends on how often your
data is updated.&lt;/p&gt;

&lt;p&gt;CouchDB will notice that the B-tree for the view doesn't exist yet, so it goes ahead and builds it on the first read.
Depending on how many documents you have in your database, that can take a while, putting a good work load on your
database.&lt;/p&gt;

&lt;p&gt;On every subsequent read, CouchDB will check if documents have changed since the last write, and throw the changed
documents at the map and reduce function. So if you only query some views from time to time, but have lots of changes in
between, expect some delays on the next read. A way around this would of course be to keep your views warm by reading
them regularly, e.g. through a cron job.&lt;/p&gt;

&lt;p&gt;When you add new views, be sure to &lt;a href=&quot;http://wiki.apache.org/couchdb/Regenerating_views_on_update&quot;&gt;pre-warm&lt;/a&gt; them before
you first access them in your application. One way would be to add the views at a time where you database isn't accessed
as much. It doesn't block all access to the documents, but it sure has a certain impact on your database's performance,
and of course the first requests that may time out because CouchDB is building the requested views in the background.&lt;/p&gt;

&lt;p&gt;When it comes to just updating a view, and it might take too long, you can set the parameter &lt;code&gt;stale=ok&lt;/code&gt;. That way, even
if the view data needs to be updated, CouchDB won't update it and just return the last known state of the view's B-tree.&lt;/p&gt;

&lt;p&gt;That's all fun and giggles, but when on earth are you supposed to actually update your view? Always reading stale data
is not great? I've gotten some odd suggestions when I complained about this elsewhere, but in the end I just want to
tell the database that I'm okay with stale data, but that it should update the view in the background.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No automatic compaction&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;As your database grows and data gets updated, CouchDB leaves old and stale data untouched, appending new data (inserted
and updated documents are considered new data) to the end of its database files, a fact that's also true for view files.
That has the neat advantage that you can still access old revisions of your documents, but it will also leave your
database files growing constantly. Now, depending on the number of documents and updates on them, that might not be a
big deal, but it's a good idea to start regular compaction earlier than later.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://downloads.basho.com/papers/bitcask-intro.pdf&quot;&gt;Riak's Bitcask file backend&lt;/a&gt; has a neat way of automatically
compacting its files. It appends data in a similar manner as CouchDB, but can determine if a node in the cluster can run
compaction on its data, and do so automatically, without much need for human intervention. It'd be nice to have
something similar as part of CouchDB without having to run cron jobs to do that.&lt;/p&gt;

&lt;p&gt;The append-only mechanism makes CouchDB bullet-proof, no doubt, you'll always have consistent data files on your hard
disk, backups are as simple as copying the files elsewhere, or take an EBS volume snapshot at any time. But that level
of data consistency comes with a price, and that's an ever-growing data file.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No partial updates&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Whenever you update a document in CouchDB, you update it as a whole, there's nothing in between. That kind of makes
sense with the way CouchDB works, but as a user it annoys me from time to time. It seems so pointless fetching and
sending a whole document when I'm just updating one attribute. There's a &lt;a href=&quot;http://tools.ietf.org/html/rfc5789&quot;&gt;neat RFC for the PATCH command in
HTTP&lt;/a&gt; making the rounds, I'd love to see that end up in CouchDB at some point. No
idea how likely that is, the makers of CouchDB have a weird aversion to using diffs to update data.&lt;/p&gt;

&lt;p&gt;Note that I'm not talking about the MongoDB way of setting attributes atomically. I don't need that, because it simply
doesn't scale well, especially not with the CouchDB storage model, and you're not updating data in-place like MongoDB.
It's more about just being able to send a diff or a minor update than a whole document.&lt;/p&gt;

&lt;p&gt;You can somewhat fake this using &lt;a href=&quot;http://wiki.apache.org/couchdb/Document_Update_Handlers&quot;&gt;update handlers&lt;/a&gt; (look at the
view called &quot;in-place&quot;) from CouchDB 0.10 on. It's pretty neat, but it's just not the same.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No built-in way to scale up&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;CouchDB's replication is unrivaled, no doubt. Being able to replicate any database with any other database at any point
in time makes CouchDB unique, some say it's the killer feature, and I concur. There's lot of argueing whether or not
that defines CouchDB as being distributed. In the most traditional sense, at least to me, it sure does, but I'm not here
to nitpick about that. It's easy to scale out by adding more nodes and setting them up to constantly replicate with
each other, make anyone a master or slave as you like. But there's no way to distribute write and read access across a
cluster of nodes.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://tilgovi.github.com/couchdb-lounge/&quot;&gt;CouchDB-lounge&lt;/a&gt; has been the traditional way to approaching that, but I
never really liked it, because it added more components to the infrastructure. Something like that should really be
built in.  The good news is that &lt;a href=&quot;http://cloudant&quot;&gt;Cloudant&lt;/a&gt; is planning on open-sourcing their clustering solution Open
Cloudant, which will then hopefully become part of CouchDB. A quorum based system for CouchDB would be neat, and it
doesn't seem too far away.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pagination is awkward&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;CouchDB's B-tree is a leaky abstraction, that's the conclusion I came to at some point. It has a pretty big impact on
your application's code, and that's not necessarily a bad thing. Suddenly you deal with things like conflicts, or simply
updating views on reads. But no other part of your web application will make that as obvious as pagination, a pretty
common and natural part of a web application.&lt;/p&gt;

&lt;p&gt;The path of least resistence to get pagination is to use the &lt;a href=&quot;http://books.couchdb.org/relax/reference/recipes#Pagination&quot;&gt;skip and limit
parameters&lt;/a&gt;, but it's not recommended, as you'll still be
walking the whole B-tree to determine the number of documents that must be skipped before it can collect the ones you're
interested in.&lt;/p&gt;

&lt;p&gt;The recommended way to do pagination is a bit awkward if you ask me. There's a good explanation in the &lt;a href=&quot;http://roidi.us/d6f6&quot;&gt;CouchDB
book&lt;/a&gt;, so I'll spare you repeating it here. But be sure to read it, because understanding that
takes you half way to understanding the B-tree. It may be awkward, and very different from what you're used to, but
that's how the B-tree works. It's not always unicorns and rainbows, sometimes it kinda gets in your way. Trade-offs,
meh.&lt;/p&gt;

&lt;p&gt;The simpler alternative would of course be to just use endless pagination, where you let the users just click a more
button instead of clicking through the pages, because you know the last document displayed in your list, and the key
that was used to fetch it. You simply use that key and the last document's id to step directly into the B-tree where you
left off. You need to remember to fetch one additional document, as CouchDB will return the last document too, or you
can just skip one document, which is acceptable, as skipping just one leaf in a tree is an operation of predictable
performance.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Range queries are awkward&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;To do a range, you have to specify a start and an end key. That's the simple part. It starts getting awkward when your
keys get slightly more complex, e.g. when your map function emits arrays. Assume you want to fetch all elements where
the first part of the array matches a particular key, and the second part doesn't matter, e.g. when you emitted a
timestamp as the second part to keep a natural (in terms of last update for example) order.&lt;/p&gt;

&lt;p&gt;Assume your keys look like this: &lt;code&gt;['123', '2010/07/21']&lt;/code&gt;, that's the key format
&lt;a href=&quot;http://github.com/peritor/simply_stored&quot;&gt;SimplyStored&lt;/a&gt; uses to manage associations between documents. To get the range that
only matches the first part of the key, your startkey has to look like this: &lt;code&gt;['123']&lt;/code&gt;. This will match all documents
having the above key. If you don't specify an endkey, CouchDB will simply return all documents following that key, so
you need to specify an endkey. The recommended way to do that is to use the following format: &lt;code&gt;['123', {}]&lt;/code&gt;. That way
you'll get all documents matching the first part of the key, because &lt;code&gt;{}&lt;/code&gt; is considered to be greater than any string
you may have emitted. See the CouchDB wiki on more details on this technique called &lt;a href=&quot;http://wiki.apache.org/couchdb/View_collation&quot;&gt;view
collation&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Obviously it's not impossible to do range queries in CouchDB, but it's slightly awkward. It all goes
&lt;a href=&quot;https://issues.apache.org/jira/browse/COUCHDB-834&quot;&gt;downhill&lt;/a&gt; as soon as you want to fetch only a particular subrange of
the original one, using startkey&lt;em&gt;docid or endkey&lt;/em&gt;docid, say for pagination. With the above ranges, they simply don't
work. Both need a startkey and endkey that is an exact match. The whole point of the above range query is not to care
about the exact start and end key, isn't it?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No CommonJS available in MapReduce functions&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;With CouchDB 0.11, CommonJS and all its awesomeness became &lt;a href=&quot;http://wiki.apache.org/couchdb/CommonJS_Modules&quot;&gt;available in view
functions&lt;/a&gt;. I was pretty excited about it, and I still am. However, map
and reduce functions were left out in the cold. Every time I have to write the same piece of JavaScript in a map or reduce
function that I've used elsewhere already, I get bitter about that. Sometimes it's just very basic stuff that I could
easily solve by throwing an existing library at it, but instead I'm cluttering my view code with it over and over again.
And yes, there's the &lt;code&gt;!code&lt;/code&gt; placeholder, but it's not about throwing an undebuggable mess of code into my view
function, it's about not repeating myself. &lt;code&gt;!code&lt;/code&gt; doesn't really solve that problem good enough for me.&lt;/p&gt;

&lt;p&gt;Word is that it's got something to do with determining whether files have updated or not, but hey CouchDB, why don't you
let me worry about that and let me tell you when I think a file I've included through CommonJS has been updated? I would
very much appreciate that.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No link-walking between documents&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;With CouchDB 0.11, map functions got a way to &lt;a href=&quot;http://blog.couch.io/post/446015664/whats-new-in-apache-couchdb-0-11-part-two-views&quot;&gt;emit other
documents&lt;/a&gt; using &lt;code&gt;{_id:
doc.other_id}&lt;/code&gt;, but that still doesn't allow full access to e.g. attributes of said documents. Sometimes that'd just be
handy to have. Sure, you could use embedded documents, but in that case it'd just be a dumb workaround, where I could
just have a way to fetch a document by its identifier and throw some of its attributes at the map function.&lt;/p&gt;

&lt;p&gt;Say what you will though, just being able to emit other documents is still pretty cool. Makes querying and fetching
associated documents a bit easier.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;All reads go to disk&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;CouchDB doesn't cache anything. It does delay commits if you want it to, so that it doesn't hit the disk on every
document update, but it sure as heck doesn't cache anything in memory. This is both curse and blessing. It keeps the
memory footprint of CouchDB incredibly small, no doubt. Considering they're targeting mobile devices it makes a lot of
sense, plus, accessing flash-based storage is a lot cheaper than spinning disks.&lt;/p&gt;

&lt;p&gt;But, on the other hand, when I have the memory available, why not use it? I know caching is a hard problem to solve.
CouchDB is also made for high concurrency, no doubt, but my disks aren't necessarily. Sure, I could buy faster disks,
but if you really think about it, memory is the new disk, plus, tell Amazon to offer faster network storage for EC2,
please do, maybe that'd already help. CouchDB somewhat relies on the file system cache doing its magic to speed up
things, but I really don't want to rely on magic. You could put an HTTP-level reverse proxy like Varnish in front of
CouchDB though, that'd be a feasable option, but that adds another layer to your infrastructure.&lt;/p&gt;

&lt;p&gt;In all seriousness, I'd love to see some caching introduced in CouchDB. I won't say it's an easy feature to implement,
because it sure isn't, but it doesn't need to be something fancy, I just would like to see CouchDB use some of my memory
for data that's read more often than it's written. But until then, Varnish to the rescue!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Error messages are not helping&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I'm just gonna post the following snippet from my CouchDB log file, and leave you to it. You tell me how useful it is.
Suffice it to say, I just wish CouchDB would not dump all that Erlang trace into my log, but maybe a useful error
message for a change. It works in some cases, but a lot of times, when the problem usually is as simple as a permissions
problem, you're left scratching your head.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;{&amp;lt;0.84.0&amp;gt;,supervisor_report,
 [{supervisor,{local,couch_secondary_services}},
  {errorContext,start_error},
  {reason,
      {'EXIT',
          {undef,
              [{couch_auth_cache,start_link,[]},
               {supervisor,do_start_child,2},
               {supervisor,start_children,3},
               {supervisor,init_children,2},
               {gen_server,init_it,6},
               {proc_lib,init_p_do_apply,3}]}}},
  {offender,
      [{pid,undefined},
       {name,auth_cache},
       {mfa,{couch_auth_cache,start_link,[]}},
       {restart_type,permanent},
       {shutdown,brutal_kill},
       {child_type,worker}]}]}}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;The End&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;There you go, some annoying things about CouchDB. They're annoying, but I still like CouchDB a lot. It's stuff I can
live it, it's stuff I can work around, it's stuff that doesn't have as big an effect in production as it may seem. The
bottom line is, as always, evaluate your tools. The above list is not to be taken as a list of arguments purely against
using CouchDB. Consider them a list of things you need to be aware of, that may or may not be acceptable compared to
what you gain.&lt;/p&gt;

&lt;p&gt;In the end, and any way you look at it, CouchDB still kicks butt.&lt;/p&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/Paperplanes/~4/EeU6IrSpaxE&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</content>
		<author>
			<name>paperplanes</name>
			<uri>http://www.paperplanes.de</uri>
		</author>
		<source>
			<title type="html">paperplanes</title>
			<subtitle type="html">software development that flies</subtitle>
			<link rel="self" href="http://feeds.feedburner.com/Paperplanes"/>
			<id>http://feeds.feedburner.com/Paperplanes</id>
			<updated>2010-09-03T16:40:18+00:00</updated>
			<rights type="html">Copyright 2007-2009</rights>
		</source>
	</entry>

	<entry xml:lang="de-de">
		<title type="html">Loading GreaseMonkey userscripts from a server</title>
		<link href="http://feedproxy.google.com/~r/dopefreshtightblog/~3/a82ul7efmmg/"/>
		<id>http://dennisbloete.de/?p=740</id>
		<updated>2010-07-21T07:11:34+00:00</updated>
		<content type="html">&lt;p&gt;&lt;a href=&quot;http://feeds.feedburner.com/blog/codeshelver-tag-github-repositories/&quot;&gt;Codeshelver&lt;/a&gt; relies heavily on the GreaseMonkey/GreaseKit userscript to customize the GitHub dashboard and repository pages. As I have got some more ideas for extending these functionalities (i.e. adding a list of recently shelved repositories to the dashboard) I was searching for a way to load the userscript from my server so that the users do not have to update the userscript manually everytime I add new features.&lt;/p&gt;
&lt;p&gt;It turns out to be fairly simple, because you just have to split your userscript into two parts: The first one is the userscript that the user adds to his browser and which just loads the second part, namely a javascript file that gets integrated into the webpage and which contains the real functionality.&lt;/p&gt;
&lt;h4&gt;myapp.user.js&lt;/h4&gt;
&lt;p&gt;This is the userscript that you offer to download/add to the browser: It just integrates the real userscript from the server, so that the users do not have to update their userscripts and it also disables the userscript functionality in case your server is not available. The latter can be seen as a bug or a feature (depends on your use case), but for &lt;a href=&quot;http://codeshelver.com&quot;&gt;codeshelver.com&lt;/a&gt; this is a feature, because if the server is down you are not able to shelve repositories anyway &lt;img src=&quot;http://dennisbloete.de/wp-includes/images/smilies/icon_wink.gif&quot; alt=&quot;;)&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/p&gt;

&lt;div class=&quot;wp_syntax&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre class=&quot;javascript&quot;&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;function&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;
  &lt;span&gt;//&lt;/span&gt;
  &lt;span&gt;var&lt;/span&gt; script &lt;span&gt;=&lt;/span&gt; document.&lt;span&gt;createElement&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;'script'&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
  script.&lt;span&gt;src&lt;/span&gt; &lt;span&gt;=&lt;/span&gt; &lt;span&gt;'http://myapp.com/userscript.js'&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
  script.&lt;span&gt;type&lt;/span&gt; &lt;span&gt;=&lt;/span&gt; &lt;span&gt;'text/javascript'&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
  document.&lt;span&gt;getElementsByTagName&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;'head'&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;&amp;#91;&lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;&amp;#93;&lt;/span&gt;.&lt;span&gt;appendChild&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;script&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&lt;span&gt;&amp;#125;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h4&gt;userscript.js&lt;/h4&gt;
&lt;p&gt;Here goes the real functionality &lt;img src=&quot;http://dennisbloete.de/wp-includes/images/smilies/icon_smile.gif&quot; alt=&quot;:)&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/p&gt;

&lt;div class=&quot;wp_syntax&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre class=&quot;javascript&quot;&gt;&lt;span&gt;var&lt;/span&gt; Userscript &lt;span&gt;=&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;
  init&lt;span&gt;:&lt;/span&gt; &lt;span&gt;function&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; &lt;span&gt;&amp;#123;&lt;/span&gt;
    &lt;span&gt;alert&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;quot;Hello :)&amp;quot;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
  &lt;span&gt;&amp;#125;&lt;/span&gt;
&lt;span&gt;&amp;#125;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
Userscript.&lt;span&gt;init&lt;/span&gt;&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;As I said this is pretty straight forward, so go ahead and enhance the web!&lt;br /&gt;
&lt;br /&gt;
&lt;/p&gt;</content>
		<author>
			<name>Dennis Bloete</name>
			<email>mail@dennisbloete.de</email>
			<uri>http://dennisbloete.de</uri>
		</author>
		<source>
			<title type="html">//dennisbloete</title>
			<subtitle type="html">Arbeit und Alltag eines Software-Entwicklers aus Bremen</subtitle>
			<link rel="self" href="http://feeds.feedburner.com/dopefreshtightblog/"/>
			<id>http://feeds.feedburner.com/dopefreshtightblog/</id>
			<updated>2010-09-06T07:40:13+00:00</updated>
			<rights type="html">©</rights>
		</source>
	</entry>

	<entry xml:lang="de-de">
		<title type="html">Codeshelver: Tagging GitHub repositories</title>
		<link href="http://feedproxy.google.com/~r/dopefreshtightblog/~3/3AIDl4low1E/"/>
		<id>http://dennisbloete.de/?p=727</id>
		<updated>2010-07-18T12:37:28+00:00</updated>
		<content type="html">&lt;p&gt;&lt;a href=&quot;http://codeshelver.com&quot;&gt;&lt;img class=&quot;align-right size-medium wp-image-728&quot; title=&quot;Codeshelver&quot; src=&quot;http://dennisbloete.de/wp-content/uploads/codeshelver-300x162.png&quot; alt=&quot;Codeshelver lets you clean up your GitHub watchlist by storing repositories you would like to remember on your shelf.&quot; width=&quot;218&quot; height=&quot;118&quot; /&gt;&lt;/a&gt;Last week I polished my latest spare time project so that I could release it into the wild: &lt;a href=&quot;http://codeshelver.com/&quot;&gt;Codeshelver&lt;/a&gt; lets you clean up your &lt;a href=&quot;http://github.com/&quot;&gt;GitHub&lt;/a&gt; watchlist by tagging repositories you would like to remember. If you are a GitHub fanboy like me you probably know the problem: Almost daily an interesting project appears in your timeline and you want to remember it, because you might need something like that in the future. You hit the &lt;em&gt;watch&lt;/em&gt; button and from now on you are notified about every single commit, issue and wiki change of that project- This is great for code you are using on a daily basis but doesn&amp;#8217;t make sense for repositories you would just like to remember, because it practically spams your dashboard timeline with things you are not really interested in.&lt;/p&gt;
&lt;p&gt;I had the idea for this project on my mind for some time, but didn&amp;#8217;t get around to realizing it because I lacked the motivation to build it with the common stack of technologies. A few weeks ago I started to play with &lt;a href=&quot;http://nodejs.org/&quot;&gt;NodeJS&lt;/a&gt; and tried to come up with something that was beyond the Hello World examples so I stumbled upon &lt;a href=&quot;http://expressjs.com/&quot;&gt;ExpressJS&lt;/a&gt;, which could be described as the &lt;a href=&quot;http://www.sinatrarb.com/&quot;&gt;Sinatra&lt;/a&gt; of NodeJS. And so I had my use case for trying out some new technologies to which I also added &lt;a href=&quot;http://www.greasespot.net/&quot;&gt;GreaseMonkey&lt;/a&gt; and &lt;a href=&quot;http://couchdb.apache.org/&quot;&gt;CouchDB&lt;/a&gt; to make it more buzzwordy.&lt;/p&gt;
&lt;p&gt;All in all it was fairly easy to develop the app as I just had to knit some good libraries together like &lt;a href=&quot;http://github.com/visionmedia/express&quot;&gt;express&lt;/a&gt;, &lt;a href=&quot;http://github.com/felixge/node-couchdb&quot;&gt;node-couchdb&lt;/a&gt; and &lt;a href=&quot;http://github.com/shimondoodkin/nodejs-autorestart&quot;&gt;nodejs-autorestart&lt;/a&gt; which I&amp;#8217;m currently using to make the deployment a little easier. Talking about deployment: I had some problems figuring out how to do it the best way, everyone seems to be using Ubuntu&amp;#8217;s &lt;a href=&quot;http://howtonode.org/deploying-node-upstart-monit&quot;&gt;Upstart and Monit for deploying NodeJS apps&lt;/a&gt;. I&amp;#8217;d prefer a more generic solution, but I haven&amp;#8217;t found a really satisfying way yet, so I&amp;#8217;m just killing and restarting the processes.&lt;/p&gt;
&lt;p&gt;There are some features in the pipeline that I&amp;#8217;d like to add once some more people are using the service and I gather more data, which would offer the possibility to evaluate things like &lt;a href=&quot;http://github.com/explore&quot;&gt;trending&lt;/a&gt; and &lt;a href=&quot;http://github.com/repositories&quot;&gt;interesting repositories&lt;/a&gt;. Now that ExpressJS 1.0 is around the corner I&amp;#8217;ll migrate the app and will most likely use &lt;a href=&quot;http://www.slideshare.net/tim.lossen.de/coffeescript-7-reasons-you-are-gonna-hate-it&quot;&gt;CoffeeScript&lt;/a&gt; for that, because it looks very promising and &lt;a href=&quot;http://geekiriki.blogspot.com/2010/07/getting-started-with-nodejs-and.html&quot;&gt;easy to integrate&lt;/a&gt; &amp;#8211; it will also give me one more buzzword up my sleeve &lt;img src=&quot;http://dennisbloete.de/wp-includes/images/smilies/icon_wink.gif&quot; alt=&quot;;)&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/p&gt;
&lt;p&gt;Please go ahead and try &lt;a href=&quot;http://codeshelver.com&quot;&gt;Codeshelver&lt;/a&gt;, let me know what you think and leave comments and feedback here!&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;
&lt;/p&gt;</content>
		<author>
			<name>Dennis Bloete</name>
			<email>mail@dennisbloete.de</email>
			<uri>http://dennisbloete.de</uri>
		</author>
		<source>
			<title type="html">//dennisbloete</title>
			<subtitle type="html">Arbeit und Alltag eines Software-Entwicklers aus Bremen</subtitle>
			<link rel="self" href="http://feeds.feedburner.com/dopefreshtightblog/"/>
			<id>http://feeds.feedburner.com/dopefreshtightblog/</id>
			<updated>2010-09-06T07:40:13+00:00</updated>
			<rights type="html">©</rights>
		</source>
	</entry>

	<entry xml:lang="de-de">
		<title type="html">Installing a current CouchDB (and Erlang) from source on Ubuntu 8.04 LTS</title>
		<link href="http://feedproxy.google.com/~r/dopefreshtightblog/~3/Ug2k-ilPptk/"/>
		<id>http://dennisbloete.de/?p=693</id>
		<updated>2010-07-14T20:13:30+00:00</updated>
		<content type="html">&lt;p&gt;Two weeks ago I had quite a hard time getting CouchDB up and running on my VPS, but with some help from &lt;a href=&quot;http://twitter.com/jweiss&quot;&gt;Jonathan&lt;/a&gt; and &lt;a href=&quot;http://twitter.com/kangguru&quot;&gt;Lars&lt;/a&gt; it finally worked. My main problem was that Erlang wasn&amp;#8217;t configured with SSL support and that the CouchDB version I was using (0.11.0) did not play nice with the latest Erland (R14A), so that I had to get CouchDB from the SVN repository. Now that &lt;a href=&quot;http://www.couch.io/&quot;&gt;CouchDB 1.0&lt;/a&gt; is here, I thought it might be a good opportunity  to summarize the steps I had to take to install the latest Erlang and CouchDB 1.0 on my Ubuntu Hardy system…&lt;/p&gt;
&lt;p&gt;&lt;span id=&quot;more-693&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;UPDATE:&lt;/strong&gt; Here is a &lt;a href=&quot;http://gist.github.com/501039&quot;&gt;gist&lt;/a&gt; that looks like there is a more hassle-free way to do the installation, please try it first and see the rest of this tutorial as a reference point if the gist does not work out for you.&lt;/p&gt;
&lt;p&gt;I usually keep my source installs at &lt;code&gt;/usr/local/src/&lt;/code&gt;, your milage may vary, adjust the steps accordingly.&lt;/p&gt;
&lt;h4&gt;Installing the dependencies&lt;/h4&gt;
&lt;p&gt;First of we got to install the dependencies for Erland and CouchDB:&lt;/p&gt;

&lt;div class=&quot;wp_syntax&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre class=&quot;bash&quot;&gt;$ &lt;span&gt;sudo&lt;/span&gt; &lt;span&gt;apt-get&lt;/span&gt; &lt;span&gt;install&lt;/span&gt; &lt;span&gt;-y&lt;/span&gt; &lt;span&gt;automake&lt;/span&gt; &lt;span&gt;autoconf&lt;/span&gt; libtool help2man
$ &lt;span&gt;sudo&lt;/span&gt; &lt;span&gt;apt-get&lt;/span&gt; &lt;span&gt;install&lt;/span&gt; &lt;span&gt;-y&lt;/span&gt; build-essential erlang libicu-dev
$ &lt;span&gt;sudo&lt;/span&gt; &lt;span&gt;apt-get&lt;/span&gt; &lt;span&gt;install&lt;/span&gt; &lt;span&gt;-y&lt;/span&gt; libmozjs-dev libcurl4-openssl-dev
$ &lt;span&gt;sudo&lt;/span&gt; &lt;span&gt;apt-get&lt;/span&gt; &lt;span&gt;install&lt;/span&gt; &lt;span&gt;-y&lt;/span&gt; openssl libssl-dev&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h4&gt;Installing Erlang&lt;/h4&gt;
&lt;p&gt;&lt;a href=&quot;http://www.erlang.org/download.html&quot;&gt;Download&lt;/a&gt; and unpack the current Erlang version, in my case it&amp;#8217;s R14A:&lt;/p&gt;

&lt;div class=&quot;wp_syntax&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre class=&quot;bash&quot;&gt;$ &lt;span&gt;cd&lt;/span&gt; &lt;span&gt;/&lt;/span&gt;usr&lt;span&gt;/&lt;/span&gt;local&lt;span&gt;/&lt;/span&gt;src
$ &lt;span&gt;wget&lt;/span&gt; http:&lt;span&gt;//&lt;/span&gt;www.erlang.org&lt;span&gt;/&lt;/span&gt;download&lt;span&gt;/&lt;/span&gt;otp_src_R14A.tar.gz
$ &lt;span&gt;tar&lt;/span&gt; xzf otp_src_R14A.tar.gz
$ &lt;span&gt;cd&lt;/span&gt; otp_src_R14A&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Maybe you would like to see the config options and need to checkout which openssl should be used:&lt;/p&gt;

&lt;div class=&quot;wp_syntax&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre class=&quot;bash&quot;&gt;$ .&lt;span&gt;/&lt;/span&gt;configure &lt;span&gt;-h&lt;/span&gt;
$ &lt;span&gt;which&lt;/span&gt; openssl
&lt;span&gt;/&lt;/span&gt;usr&lt;span&gt;/&lt;/span&gt;bin&lt;span&gt;/&lt;/span&gt;openssl
$ .&lt;span&gt;/&lt;/span&gt;configure &lt;span&gt;--with-ssl&lt;/span&gt;=&lt;span&gt;/&lt;/span&gt;usr&lt;span&gt;/&lt;/span&gt;include&lt;span&gt;/&lt;/span&gt;openssl&lt;span&gt;/&lt;/span&gt;
$ &lt;span&gt;make&lt;/span&gt;
$ &lt;span&gt;sudo&lt;/span&gt; &lt;span&gt;make&lt;/span&gt; &lt;span&gt;install&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Once you installed Erlang, check whether its cryptography library (OpenSSL) are functioning correctly.&lt;/p&gt;

&lt;div class=&quot;wp_syntax&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre class=&quot;bash&quot;&gt;$ erl
Erlang R14A &lt;span&gt;&amp;#40;&lt;/span&gt;erts-&lt;span&gt;5.8&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt; …
&amp;nbsp;
Eshell V5.8  &lt;span&gt;&amp;#40;&lt;/span&gt;abort with ^G&lt;span&gt;&amp;#41;&lt;/span&gt;
&lt;span&gt;1&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt; crypto:start&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;.
ok
&lt;span&gt;2&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt; q&lt;span&gt;&amp;#40;&lt;/span&gt;&lt;span&gt;&amp;#41;&lt;/span&gt;.
ok&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h4&gt;Installing CouchDB&lt;/h4&gt;
&lt;p&gt;&lt;a href=&quot;http://couchdb.apache.org/downloads.html&quot;&gt;Download&lt;/a&gt; and unpack the current CouchDB version, in my case it&amp;#8217;s 1.0:&lt;/p&gt;

&lt;div class=&quot;wp_syntax&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre class=&quot;bash&quot;&gt;$ &lt;span&gt;cd&lt;/span&gt; &lt;span&gt;/&lt;/span&gt;usr&lt;span&gt;/&lt;/span&gt;local&lt;span&gt;/&lt;/span&gt;src
$ &lt;span&gt;wget&lt;/span&gt; http:&lt;span&gt;//&lt;/span&gt;apache.linux-mirror.org&lt;span&gt;/&lt;/span&gt;couchdb&lt;span&gt;/&lt;/span&gt;1.0.0&lt;span&gt;/&lt;/span&gt;apache-couchdb-1.0.0.tar.gz
$ &lt;span&gt;tar&lt;/span&gt; xzf apache-couchdb-1.0.0.tar.gz
$ &lt;span&gt;cd&lt;/span&gt; apache-couchdb-1.0.0&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Here you might like to see the config options to and export some of the variables:&lt;/p&gt;

&lt;div class=&quot;wp_syntax&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre class=&quot;bash&quot;&gt;$ .&lt;span&gt;/&lt;/span&gt;configure &lt;span&gt;-h&lt;/span&gt;
$ &lt;span&gt;export&lt;/span&gt; &lt;span&gt;ERL&lt;/span&gt;=&lt;span&gt;/&lt;/span&gt;usr&lt;span&gt;/&lt;/span&gt;local&lt;span&gt;/&lt;/span&gt;bin&lt;span&gt;/&lt;/span&gt;erl
$ &lt;span&gt;export&lt;/span&gt; &lt;span&gt;ERLC&lt;/span&gt;=&lt;span&gt;/&lt;/span&gt;usr&lt;span&gt;/&lt;/span&gt;local&lt;span&gt;/&lt;/span&gt;bin&lt;span&gt;/&lt;/span&gt;erlc
$ .&lt;span&gt;/&lt;/span&gt;configure &lt;span&gt;--with-erlang&lt;/span&gt;=&lt;span&gt;/&lt;/span&gt;usr&lt;span&gt;/&lt;/span&gt;local&lt;span&gt;/&lt;/span&gt;lib&lt;span&gt;/&lt;/span&gt;erlang&lt;span&gt;/&lt;/span&gt;usr&lt;span&gt;/&lt;/span&gt;include&lt;span&gt;/&lt;/span&gt; 
$ &lt;span&gt;make&lt;/span&gt;
$ &lt;span&gt;sudo&lt;/span&gt; &lt;span&gt;make&lt;/span&gt; &lt;span&gt;install&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;For security reasons it makes sense to have a separate &lt;code&gt;couchdb&lt;/code&gt; user that runs the process, go ahead and create it:&lt;/p&gt;

&lt;div class=&quot;wp_syntax&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre class=&quot;bash&quot;&gt;$ &lt;span&gt;sudo&lt;/span&gt; adduser &lt;span&gt;--system&lt;/span&gt; \
        &lt;span&gt;--home&lt;/span&gt; &lt;span&gt;/&lt;/span&gt;usr&lt;span&gt;/&lt;/span&gt;local&lt;span&gt;/&lt;/span&gt;var&lt;span&gt;/&lt;/span&gt;lib&lt;span&gt;/&lt;/span&gt;couchdb &lt;span&gt;--no-create-home&lt;/span&gt; \
        &lt;span&gt;--shell&lt;/span&gt; &lt;span&gt;/&lt;/span&gt;bin&lt;span&gt;/&lt;/span&gt;&lt;span&gt;bash&lt;/span&gt; \
        &lt;span&gt;--group&lt;/span&gt; &lt;span&gt;--gecos&lt;/span&gt; &lt;span&gt;&amp;quot;CouchDB&amp;quot;&lt;/span&gt; couchdb&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;You will also have to give this user access to some directories:&lt;/p&gt;

&lt;div class=&quot;wp_syntax&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre class=&quot;bash&quot;&gt;$ &lt;span&gt;sudo&lt;/span&gt; &lt;span&gt;chown&lt;/span&gt; &lt;span&gt;-R&lt;/span&gt; couchdb:couchdb &lt;span&gt;/&lt;/span&gt;usr&lt;span&gt;/&lt;/span&gt;local&lt;span&gt;/&lt;/span&gt;etc&lt;span&gt;/&lt;/span&gt;couchdb
$ &lt;span&gt;sudo&lt;/span&gt; &lt;span&gt;chown&lt;/span&gt; &lt;span&gt;-R&lt;/span&gt; couchdb:couchdb &lt;span&gt;/&lt;/span&gt;usr&lt;span&gt;/&lt;/span&gt;local&lt;span&gt;/&lt;/span&gt;var&lt;span&gt;/&lt;/span&gt;lib&lt;span&gt;/&lt;/span&gt;couchdb
$ &lt;span&gt;sudo&lt;/span&gt; &lt;span&gt;chown&lt;/span&gt; &lt;span&gt;-R&lt;/span&gt; couchdb:couchdb &lt;span&gt;/&lt;/span&gt;usr&lt;span&gt;/&lt;/span&gt;local&lt;span&gt;/&lt;/span&gt;var&lt;span&gt;/&lt;/span&gt;log&lt;span&gt;/&lt;/span&gt;couchdb
$ &lt;span&gt;sudo&lt;/span&gt; &lt;span&gt;chown&lt;/span&gt; &lt;span&gt;-R&lt;/span&gt; couchdb:couchdb &lt;span&gt;/&lt;/span&gt;usr&lt;span&gt;/&lt;/span&gt;local&lt;span&gt;/&lt;/span&gt;var&lt;span&gt;/&lt;/span&gt;run&lt;span&gt;/&lt;/span&gt;couchdb&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;… and change the permissions for the directories:&lt;/p&gt;

&lt;div class=&quot;wp_syntax&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre class=&quot;bash&quot;&gt;$ &lt;span&gt;chmod&lt;/span&gt; &lt;span&gt;-R&lt;/span&gt; 0770 &lt;span&gt;/&lt;/span&gt;usr&lt;span&gt;/&lt;/span&gt;local&lt;span&gt;/&lt;/span&gt;etc&lt;span&gt;/&lt;/span&gt;couchdb
$ &lt;span&gt;chmod&lt;/span&gt; &lt;span&gt;-R&lt;/span&gt; 0770 &lt;span&gt;/&lt;/span&gt;usr&lt;span&gt;/&lt;/span&gt;local&lt;span&gt;/&lt;/span&gt;var&lt;span&gt;/&lt;/span&gt;lib&lt;span&gt;/&lt;/span&gt;couchdb
$ &lt;span&gt;chmod&lt;/span&gt; &lt;span&gt;-R&lt;/span&gt; 0770 &lt;span&gt;/&lt;/span&gt;usr&lt;span&gt;/&lt;/span&gt;local&lt;span&gt;/&lt;/span&gt;var&lt;span&gt;/&lt;/span&gt;log&lt;span&gt;/&lt;/span&gt;couchdb
$ &lt;span&gt;chmod&lt;/span&gt; &lt;span&gt;-R&lt;/span&gt; 0770 &lt;span&gt;/&lt;/span&gt;usr&lt;span&gt;/&lt;/span&gt;local&lt;span&gt;/&lt;/span&gt;var&lt;span&gt;/&lt;/span&gt;run&lt;span&gt;/&lt;/span&gt;couchdb&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;After that, verify that it finally works:&lt;/p&gt;

&lt;div class=&quot;wp_syntax&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre class=&quot;bash&quot;&gt;$ couchdb
Apache CouchDB is running &lt;span&gt;as&lt;/span&gt; process …, &lt;span&gt;time&lt;/span&gt; to relax.
$ curl &lt;span&gt;-X&lt;/span&gt; GET http:&lt;span&gt;//&lt;/span&gt;127.0.0.1:&lt;span&gt;5984&lt;/span&gt;&lt;span&gt;/&lt;/span&gt;
&lt;span&gt;&amp;#123;&lt;/span&gt;&lt;span&gt;&amp;quot;couchdb&amp;quot;&lt;/span&gt;:&lt;span&gt;&amp;quot;Welcome&amp;quot;&lt;/span&gt;,&lt;span&gt;&amp;quot;version&amp;quot;&lt;/span&gt;:&lt;span&gt;&amp;quot;1.0.0&amp;quot;&lt;/span&gt;&lt;span&gt;&amp;#125;&lt;/span&gt;
$ &lt;span&gt;/&lt;/span&gt;usr&lt;span&gt;/&lt;/span&gt;local&lt;span&gt;/&lt;/span&gt;etc&lt;span&gt;/&lt;/span&gt;init.d&lt;span&gt;/&lt;/span&gt;couchdb start
 &lt;span&gt;*&lt;/span&gt; Starting database server couchdb
   ...done.&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h4&gt;Caveats&lt;/h4&gt;
&lt;p&gt;If CouchDB does not work and it does not write into the log it is likely a permission problem, see if the couchdb directories belong to the &lt;code&gt;couchdb&lt;/code&gt; user and that the permissions are set correctly.&lt;/p&gt;
&lt;p&gt;Another thing that occured to me was an error that resulted from still having leftovers from previous installations at &lt;code&gt;/usr/lib/couchdb/erlang/lib&lt;/code&gt;. Older version, especially of &lt;code&gt;mochiweb-r97&lt;/code&gt; or couchdb can lead to &amp;#8220;Bad Request&amp;#8221; errors, so clean up the erlang lib directory.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;
&lt;/p&gt;</content>
		<author>
			<name>Dennis Bloete</name>
			<email>mail@dennisbloete.de</email>
			<uri>http://dennisbloete.de</uri>
		</author>
		<source>
			<title type="html">//dennisbloete</title>
			<subtitle type="html">Arbeit und Alltag eines Software-Entwicklers aus Bremen</subtitle>
			<link rel="self" href="http://feeds.feedburner.com/dopefreshtightblog/"/>
			<id>http://feeds.feedburner.com/dopefreshtightblog/</id>
			<updated>2010-09-06T07:40:13+00:00</updated>
			<rights type="html">©</rights>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Relational Data, Document Databases and Schema Design</title>
		<link href="http://www.paperplanes.de/2010/7/5/relational_data_document_databases_schema_design.html"/>
		<id>http://www.paperplanes.de/archives/2010/7/5/relational_data_document_databases_schema_design/</id>
		<updated>2010-07-05T00:00:00+00:00</updated>
		<content type="html">&lt;p&gt;By now it should be obvious that I'm quite fond of alternatives data stores (call them NoSQL if you must). I've given
quite a &lt;a href=&quot;http://www.paperplanes.de/2010/6/22/june_a_month_of_conferences.html&quot;&gt;few talks&lt;/a&gt; on the subjects recently, and
had the honor of being a guest on the (German) &lt;a href=&quot;http://www.heise.de/developer/artikel/Episode-22-NoSQL-Alternative-zu-relationalen-Datenbanken-1027769.html&quot;&gt;heise Developer Podcast on
NoSQL&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;There's some comments and questions that pop up every time alternative databases are being talked about, especially by
people deeply rooted in relational thinking. I've been there, and I know it requires some rethinking, and also am quite
aware that there are some controversial things that basically are the exact opposite of everything you learned in
university.&lt;/p&gt;

&lt;p&gt;I'd like to address a couple of those with some commentary and my personal experience (Disclaimer: my experience is not
the universal truth, it's simply that: my experience, your mileage may vary). When I speak of things done in practice,
I'm talking about how I witnessed things getting done in Real Life™, and how I've done them myself, both good and bad.
I'm focussing on document databases, but in general everything below holds true for any other kind of non-relational
database.&lt;/p&gt;

&lt;p&gt;It's easy to say that all the nice features document databases offer are just aiming for one thing, to scale up. While
that may or may not be true, it just doesn't matter for a lot of people. Scaling is awesome, and it's a problem everyone
wants to solve, but in reality it's not the main issue, at least not for most people. Also, it's not an impossible thing
to do even with MySQL, I've had my fun doing so, and it sure was an experience, but it can be done.&lt;/p&gt;

&lt;p&gt;It's about getting stuff done. There's a lot more to alternative databases in general, and document databases in
particular, that I like, not just the ability to scale up. They simply can make my life easier, if I let them. If I can
gain productivity while still being aware of the potential risks and pitfalls, it's a big win in my book.&lt;/p&gt;

&lt;p&gt;What you'll find, when you really think about it, is that everything below holds true no matter what database you're
using. Depending on your use case, it can even apply to relational databases.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Relational Databases are all about the Data&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Yes, they are. They are about trying to fit your data into a constrained schema, constrained in length, type, and other
things if you see fit. They're about building relationships between your data in a strongly coupled way, think foreign
key constraints. Whenever you need to add data, you need to migrate your schema. That's what they do. They're good at
enforcing a set of ground rules on your data.&lt;/p&gt;

&lt;p&gt;See where I'm going with this? Even though relational databases tried to be a perfect fit for data, they ended up being
a pain once that data needed to evolve. If you haven't felt that pain yet, good for you. I certainly have. Tabular data
sounds nice in theory, and is pretty easy to handle in Excel, but in practice, it causes some pain. A lot of that pain
stemmed from people using MySQL, yes, but take that argument to the guy who wrote it and sold it to people as the nicest
and simplest SQL database out there.&lt;/p&gt;

&lt;p&gt;It's easy to get your data into a schema once, but it gets a lot harder to change the schema and the data into a
different schema at a later point in time. While data sticks around, the schema evolves constantly. Something relational
databases aren't very good at supporting.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Relational Databases Enforce Data Consistency&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;They sure do, that's what they were built for. Constraints, foreign keys, all the magic tricks. Take Rails as a
counter-example. It fostered the idea that all that stuff is supposed to be part of the application, not the database.
Does it have trade-offs? Sure, but it's part of your application. In practice, that was correct, for the most part,
although I can hear a thousand Postgres users scream. There's always an area that requires constraints on the database
level, otherwise they wouldn't have been created in the first place.&lt;/p&gt;

&lt;p&gt;But most web applications can live fine without it, they benefit from being free about their data, to shape it in
whichever way they like, adding consistency on the application level. The consistency suddenly lies in your hands, a
responsibility not everyone is comfortable with. You're suddenly forced to think more about edge cases. But you sure as
hell don't have to live without consistent data, quite the opposite. The difference is that you're taking care of the
consistency yourself, in terms of your use case, not using a generic one-fits-all solution.&lt;/p&gt;

&lt;p&gt;Relationships between data aren't always strict. They can be loosely linked, what's the point of enforcing consistency
when you don't care if a piece of data still exists or not? You handle it gracefully in your application code if you do.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SQL is a Standard&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The basics of SQL are similar, if not the same, but under the hood, there's subtle differences. Why? Because under
the hood, every relational database works differently. Which is exactly what document databases acknowledge. Every
database is different, trying to put a common language on top will only get you so far. If you want to get the best out
of it, you're going to specialize.&lt;/p&gt;

&lt;p&gt;Thinking in Map/Reduce as CouchDB or Riak force you to is no piece of cake. It takes a while to get used to the ideas
around it and what implications it has for you and your data. It's worth it either way, but sometimes SQL is just a
must, no question. Business reporting can be a big issue, if your company relies on supporting standard tools, you're
out of luck.&lt;/p&gt;

&lt;p&gt;While standards are important, in the end it's important what you need to do with your data. If a standard gets in your
way, how is that helpful? Don't expect a standard query language for document databases any time soon. They all solve
different types of problems in different ways, and they don't intend to hide that from you with a standard query
language. If on the other hand, all you need is a dynamic language for doing ad-hoc queries, check out
&lt;a href=&quot;http://www.mongodb.org&quot;&gt;MongoDB&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Normalized Data is a Myth&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I learned a lot in uni about all the different kinds of normalization. It just sounded so nice in theory. Model your
data upfront, then normalize the hell out of it, until it's as DRY as the desert.&lt;/p&gt;

&lt;p&gt;So far so good. I noticed one thing in practice: Normalized data almost never worked out. Why? Because you need to
duplicate data, even in e-commerce applications, an area that's traditionally mentioned as an example where relational
databases are going strong.&lt;/p&gt;

&lt;p&gt;Denormalizing data is simply a natural step. Going back to the e-commerce example, you need to store a lot of things
separately when someone places an order: Shipping and billing address, payment data used, product price and taxes, and
so on.  Should you do it all over the place? Of course not, not even in a document database. Even they encourage storing
similar data to a certain extent, and with some of them, it's simply a must. But you're free to make these decisions on
your own. They're not implying you need to stop normalizing, it still makes sense, even in a document database.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Schemaless is not Schemaless&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;But there's one important thing denormalization is not about, something that's being brought up quite frequently and
misunderstood easily. Denormalization doesn't mean you're not thinking about any kind of schema. While the word
schemaless is brought up regularly, schemaless is simply not schemaless.&lt;/p&gt;

&lt;p&gt;Of course you'll end up with having documents of the same type, with a similar set of attributes. Some tools, for
instance MongoDB, even encourage (if not force) you to store different types of documents in different collections. But
here's the kicker, I deliberately used the word similar. They don't need to be all the same across all documents. One
document can have a specific attribute, the other doesn't. If it doesn't, just assume it's empty, it's that easy. If it
needs to be filled at some point, write data lazily, so that your schema eventually is complete again. It's evolving
naturally, which does sound easy, but in practice requires more logic in your application to catch these corner cases.&lt;/p&gt;

&lt;p&gt;So instead of running migrations that add new tables and columns, and in the end pushing around your data, you migrate
the data on the next access, whether that's a read or a write is up to your particular use case. In the end you simply
migrate data, not your schema. The schema will evolve eventually, but first and foremost, it's about the data, not the
constraints they live in. The funny thing: In larger projects, I ended up doing the same thing with a relational
database. It's just easier to do and gentler on the load than running a huge batch job on a production database.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No Joins, No Dice&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No document database supports joins, simple like that. If you need joins, you have two options: Use a database that
supports joins, or adapt your documents so that they remove the need for joins.&lt;/p&gt;

&lt;p&gt;Documents have one powerful advantage: It's easy to embed other documents. If there's data you'd usually fetch using a
join, and that'd be suitable for embedding (and therefore oftentimes: denormalizing), there's your second option. Going
back to the e-commerce example: Whereas in a relational database you'd need a lot of extra tables to keep that data
around (unless you're serializing it into single column), in a document database you just add it as embedded data to the
order document. You have all the important data one in place, and you're able to fetch it in one go. Someone said that
relational databases are a perfect fit for e-commerce. Funny, I've worked on a market platform, and I've found that to be
a ludicrous statement. I'd have benefited from a loser data storage several times, joins be damned.&lt;/p&gt;

&lt;p&gt;It's not always viable, sure, and it'd be foolish to stick with a document database if that's an important criterion for
your particular use case, then no dice. It's relational data storage or bust.&lt;/p&gt;

&lt;p&gt;Of course there's secret option number three, which is to just ignore the problem until it's a problem, just by going
with a document database and see how you go, but obviously that doesn't come without risks. It's worth noticing though
that &lt;a href=&quot;https://wiki.basho.com/display/RIAK/Riak&quot;&gt;Riak&lt;/a&gt; supports &lt;a href=&quot;https://wiki.basho.com/display/RIAK/Links&quot;&gt;links between
documents&lt;/a&gt;, and even fetching linked documents together with the parent in
one request. In CouchDB on the other hand, you can emit &lt;a href=&quot;http://wiki.apache.org/couchdb/Introduction_to_CouchDB_views#Keys_and_values&quot;&gt;linked
documents&lt;/a&gt; in views. You can't be fully
selective about the document data you're interested in, but if all you want is fetch linked documents, there is one or
two ways to do that. Also, graph databases have made it their main focus to make traversal of associated documents an
incredibly cheap operation. Something your relational database is pretty bad at.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Documents killed my Model&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;There's this myth that you just stop thinking about how to model your data with document databases or key-value storage.
That myth is downright wrong. Just because you're using schemaless storage doesn't mean you stop thinking about your
data, quite the opposite, you think even more about it, and in different ways, because you simply have more options to
model and store it. Embedding documents is a nice luxury to have, but isn't always the right way to go, just like
normalizing the crap out of a schema isn't always the way to go.&lt;/p&gt;

&lt;p&gt;It's a matter of discipline, but so is relational modelling. You can make a mess of a document database just like you
can make a mess of a relational database. When you migrate data on the fly in a document database, there's more
responsibility in your hands, and it requires good care with regards to testing. The same is true for keeping track of
data consistency. It's been moved from the database into your application's code. Is that a bad thing? No, it's a sign
of the times. You're in charge of your data, it's not your database's task anymore to ensure it's correct and valid,
it's yours. With great power comes great responsibility, but I sure like that fact about document databases. It's
something I've been missing a lot when working with relational databases: The freedom to do whatever the heck I want
with my data.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Read vs. Write Patterns&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I just like including this simply because it always holds true, no matter what kind of database you're using. If you're
not thinking about how you're going to access your data with both reads and writes, you should do something about that.
In the end, your schema should reflect your business use case, but what good is that when it's awkward to access the
data, when it takes joins across several tables to fetch the data you're interested in?&lt;/p&gt;

&lt;p&gt;If you need to denormalize to improve read access, go for it, but be aware of the consequences. A schema is easy to
build up, migrating on the go, but if document databases force you to do one thing, and one thing only, it's to think
about how you're reading and writing your data. It's safe to say that you're not going to figure it all out upfront, but
you're encouraged to put as much effort into it as you can. When you find out you're wrong down the line, you might be
surprised to find that they make it even easier to change paths.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Do your Homework&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Someone recently wrote a blog post on why he went back to MySQL from MongoDB, and one of his reasons was that it doesn't
support transactions. While this is a stupid argument to bring up in hindsight, it makes one thing clear: You need to do
research yourself, noone's going to do it for you. If you don't want to live up to that, use the tools you're familiar
with, no harm done.&lt;/p&gt;

&lt;p&gt;It should be pretty clear up front what your business use case requires, and what tools may or may not support you in
fulfilling these requirements. Not all tool providers are upfront about all the downsides, but hey, neither was MySQL.
Read up, try and learn. That's the only thing you can do, and noone will do it for you. Nothing has changed here, it's
simply becoming more obvious, because you suddenly have a lot more options to work with.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Polyglot Data Storage&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Which brings me to the most important part of them all: Document databases (and alternative, non-relational data stores
in general) are not here to replace relational databases. They're living alongside of them, with both sides hopefully
somewhat learning from each other. Your projects won't be about just one database any more, it's not unlikely you're
going to end up using two or more, for different use cases.&lt;/p&gt;

&lt;p&gt;Polyglot persistence is the future. If there's one thing I'm certain of, this is it. Don't let anyone fool you into
thinking that their database is the only one you'll need, they all have their place.  The hard part is to figure out
what place that is. Again, that's up to you to find out. People ask me for particular use cases for non-relational
databases, but honestly, there is no real distinction. Without knowing the tools, you'll never find out what the use
cases are. Other people can just give you ideas, or talk about how they're using the tools, they can't draw the line
for you.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Back to the Future&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You shouldn't think of it as something totally new, document databases just don't hide these things from you. Lots of
the things I mentioned here are things you should be doing anyway, no matter if you're using a relational or a
non-relational data store. They should be common sense really. We're not trying to repeat what went wrong in history,
we're learning from it.&lt;/p&gt;

&lt;p&gt;If there's one thing you should do, it's to start playing with one of the new tools immediately. I shouldn't even be
telling you this, since you should hone your craft all the time, and that includes playing the field and broadening your
personal and professional horizon. Only then will you be able to judge what use case is a good fit for e.g. a document
database. I'd highly suggest starting to play with e.g. &lt;a href=&quot;http://couchdb.org&quot;&gt;CouchDB&lt;/a&gt;,
&lt;a href=&quot;http://www.mongodb.org&quot;&gt;MongoDB&lt;/a&gt;, &lt;a href=&quot;https://wiki.basho.com/display/RIAK/Riak&quot;&gt;Riak&lt;/a&gt; or
&lt;a href=&quot;http://code.google.com/p/redis&quot;&gt;Redis&lt;/a&gt;.&lt;/p&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/Paperplanes/~4/jJ9p4KlY-c4&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</content>
		<author>
			<name>paperplanes</name>
			<uri>http://www.paperplanes.de</uri>
		</author>
		<source>
			<title type="html">paperplanes</title>
			<subtitle type="html">software development that flies</subtitle>
			<link rel="self" href="http://feeds.feedburner.com/Paperplanes"/>
			<id>http://feeds.feedburner.com/Paperplanes</id>
			<updated>2010-09-03T16:40:18+00:00</updated>
			<rights type="html">Copyright 2007-2009</rights>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Vim - A Never-ending Love Story</title>
		<link href="http://www.paperplanes.de/2010/6/29/vim_a_neverending_love_story.html"/>
		<id>http://www.paperplanes.de/archives/2010/6/29/vim_a_neverending_love_story/</id>
		<updated>2010-06-29T00:00:00+00:00</updated>
		<content type="html">&lt;p&gt;About eighteen months ago &lt;a href=&quot;http://feeds.feedburner.com/2008/11/4/vim_my_college_sweetheart.html&quot;&gt;I wrote about going back to Vim as my daily text
editor&lt;/a&gt;. It was a bust, and I went back to TextMate after about a week.&lt;/p&gt;

&lt;p&gt;Suddenly it's the year 2010, and I'm typing this in &lt;a href=&quot;http://www.vim.org&quot;&gt;Vim&lt;/a&gt;. What happened? My itch was re-scratched
if you will. I was wary of some of TextMate's perceived shortcomings, and honestly I missed having a command and insert
mode. It may sound stupid, but I really prefer that way of working with text and code. TextMate is still a nice
editor, but seeing its development coming to a perceived halt made me realize that Vim is simply forever, not being
developed by just one guy, but a community.&lt;/p&gt;

&lt;p&gt;It's also worth mentioning that I simply started from scratch. Last time I built upon a configuration that grew over the
years, and that included things about whose purpose I just had no idea. I watched the &lt;a href=&quot;http://peepcode.com/products/smash-into-vim-i&quot;&gt;Smash Into Vim
PeepCode&lt;/a&gt; too, and started with the clean slate configuration set that
comes with it. If you're thinking of getting (back) into Vim, it's highly recommended, it's sure to wet your appetite.
There's also a &lt;a href=&quot;http://vimcasts.org/&quot;&gt;collection of screencasts&lt;/a&gt; and a &lt;a href=&quot;http://www.swaroopch.com/notes/Vim&quot;&gt;free book on Vim
7&lt;/a&gt; available on the interwebs. I have some useful links in &lt;a href=&quot;http://delicious.com/pombsd/vim&quot;&gt;my bookmark collection
too&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;There's been a lot of developments around scripts for Vim that bring TextMate-like functionality, or that support things
like Cucumber, smart quotes and &lt;a href=&quot;http://townk.github.com/vim-autoclose/&quot;&gt;auto-closing braces&lt;/a&gt;, or even the most awesome
&lt;a href=&quot;http://www.vim.org/scripts/script.php?script_id=2975&quot;&gt;Git integration&lt;/a&gt; you'll find. But the nicest of them all is
&lt;a href=&quot;http://www.vim.org/scripts/script.php?script_id=2332&quot;&gt;Pathogen&lt;/a&gt;, a script that allows you to keep all your other
scripts in separate places, not losing overview of what's installed where, and in which version.&lt;/p&gt;

&lt;p&gt;Coming from TextMate, you're gonna miss the &quot;Go To File&quot; dialog, I'm sure. Check out
&lt;a href=&quot;http://www.vim.org/scripts/script.php?script_id=3025&quot;&gt;Command-T&lt;/a&gt;, which does exactly that, only with path-matching
sprinkled on top. It's not as fast unfortunately, but a lot faster to use than the annoying fuzzy thing I used the last
time I tried to live on Vim. There's also &lt;a href=&quot;http://peepcode.com/products/peepopen&quot;&gt;PeepOpen&lt;/a&gt;, but it always opens files
in new tabs, and that can get quite annoying, as new Vim tabs are quite different from Vim buffers. For project views I
use &lt;a href=&quot;http://www.vim.org/scripts/script.php?script_id=1658&quot;&gt;NERDtree&lt;/a&gt;, though
&lt;a href=&quot;http://www.vim.org/scripts/script.php?script_id=1890&quot;&gt;LustyExplorer&lt;/a&gt; also seems acceptable.&lt;/p&gt;

&lt;p&gt;As I said, I started from scratch, with a clean slate. So the decent thing to do was to put all my &lt;a href=&quot;http://github.com/mattmatt/dotvim&quot;&gt;Vim configuration
files on GitHub&lt;/a&gt;. They include all the scripts I'm using, and my configuration, all
neatly separated into different bundles thanks to Pathogen. There's a couple of things that are still a bit wonky.
&lt;a href=&quot;http://www.vim.org/scripts/script.php?script_id=2050&quot;&gt;Lusty Juggler&lt;/a&gt; doesn't work as advertised all the time, though
it's a neat tool, allowing you to quickly select one of a list of the latest open buffers. RubyTest is quite weird, and
I'm thinking of dumping it completely, and simply rolling my own commands to run tests based on it. The
&lt;a href=&quot;http://rails.vim.tpope.net/&quot;&gt;rails.vim&lt;/a&gt; script package does include some support to run tests too, but not to execute a
single test case.&lt;/p&gt;

&lt;p&gt;In general, I haven't found anything that works in TextMate that you can't somehow get to work in Vim. Yes, I've used
the word somehow. It's not easy as pie all of the time, and it can be different, heck it's a different editor. But I
willingly accept that, because as a text editor, I find Vim to be a lot better than TextMate.&lt;/p&gt;

&lt;p&gt;I've been back on Vim for a month now, and I'm not looking back at all. It's like coming back to an old friend and
learning what awesome things he's been up to. It's pretty much as exciting as playing with new technologies at the
moment. Learning new things can be pretty exciting, even if it's just another text editor. But it's not all fun and
giggles. I have some annoyances still, but no editor is perfect. I'm more willing to accept Vim's for the increased text
surgeon skills than TextMate's, to be frank. TextMate is still a nice editor, don't get me wrong, my heart just always
belonged to Vim.&lt;/p&gt;

&lt;p&gt;Honestly, I'm more willing to invest my learning time in an editor that I know I can use everywhere than one I can only
use on the Mac with a running user interface. I'm using Vim on every server I'm managing, so why not on my local
machine? Vim makes me think about how I can edit text in the most efficient way possible, and I like that very much. It
even made me map my caps-lock key to control, finally!&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Update&lt;/em&gt;: Was just &lt;a href=&quot;http://twitter.com/mutle/status/17356649155&quot;&gt;tipped off&lt;/a&gt; that PeepOpen can be made to behave
properly and open files in the current MacVim tab.  When you set your MacVim options like in the picture below (notice
the part &quot;Open files from applications&quot;), it works a treat. Thanks, Mutwin!&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://img.skitch.com/20100629-p871pr9ky2fjb7xiubxtt2i2np.jpg&quot; alt=&quot;MacVim Options&quot; /&gt;&lt;/p&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/Paperplanes/~4/_Ab22fdiTA8&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</content>
		<author>
			<name>paperplanes</name>
			<uri>http://www.paperplanes.de</uri>
		</author>
		<source>
			<title type="html">paperplanes</title>
			<subtitle type="html">software development that flies</subtitle>
			<link rel="self" href="http://feeds.feedburner.com/Paperplanes"/>
			<id>http://feeds.feedburner.com/Paperplanes</id>
			<updated>2010-09-03T16:40:18+00:00</updated>
			<rights type="html">Copyright 2007-2009</rights>
		</source>
	</entry>

	<entry xml:lang="en-US">
		<title type="html">Multitouch Inspector for iPad</title>
		<link href="http://feedproxy.google.com/~r/synatic_net/~3/cQAKnJDSI7M/multitouch-inspector-for-ipad"/>
		<id>tag:blog.synatic.net,2010-06-24:5376</id>
		<updated>2010-06-24T20:23:48+00:00</updated>
		<content type="html">&lt;p&gt;&lt;img src=&quot;http://blog.synatic.net/assets/2010/6/24/icon.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;


	&lt;p&gt;During the last couple weeks I’ve been playing around with the iPad and Mobile Safari. I built a little tool to familiarize myself with the Multitouch JavaScript &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt; provided by Mobile Safari as well as web applications for the iPad in general. I named the result &lt;a href=&quot;http://blog.synatic.net/assets/2010/6/24/index.html&quot;&gt;Multitouch Inspector&lt;/a&gt; because that’s what it does: Inspect the TouchEvents fired by the JavaScript &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt;. ;-) Today I decided to rewrite the tool to drop the dependency on &lt;a href=&quot;http://prototypejs.org&quot;&gt;Prototype.js&lt;/a&gt; and I published it on &lt;a href=&quot;http://github.com/benedikt/multitouch-inspector&quot;&gt;GitHub&lt;/a&gt;.&lt;/p&gt;


	&lt;h3&gt;Using Multitouch Events from JavaScript&lt;/h3&gt;


	&lt;p&gt;There are four events that are related to touch: TouchStart, TouchMove, TouchEnd and TouchCancel. I’m not sure about what situation would trigger TouchCancel so I decided to skip it for now. Working with the touch events is straight forward:&lt;/p&gt;


&lt;pre class=&quot;twilight&quot;&gt;&lt;span class=&quot;line-numbers&quot;&gt;   1 &lt;/span&gt; &lt;span class=&quot;Support&quot;&gt;document&lt;/span&gt;.addEventListener(&lt;span class=&quot;String&quot;&gt;&lt;span class=&quot;String&quot;&gt;'&lt;/span&gt;touchstart&lt;span class=&quot;String&quot;&gt;'&lt;/span&gt;&lt;/span&gt;, &lt;span class=&quot;Storage&quot;&gt;function&lt;/span&gt;(&lt;span class=&quot;Support&quot;&gt;event&lt;/span&gt;) {
&lt;span class=&quot;line-numbers&quot;&gt;   2 &lt;/span&gt;   &lt;span class=&quot;Comment&quot;&gt;&lt;span class=&quot;Comment&quot;&gt;/*&lt;/span&gt; Do whatever you'd like to do with the event &lt;span class=&quot;Comment&quot;&gt;*/&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line-numbers&quot;&gt;   3 &lt;/span&gt; }, &lt;span class=&quot;Constant&quot;&gt;false&lt;/span&gt;);
&lt;/pre&gt;

	&lt;p&gt;Of course you can add the listener to any element just like you would with &lt;em&gt;Click&lt;/em&gt; or &lt;em&gt;MouseOver&lt;/em&gt; events. The function gets passed an object of type &lt;em&gt;TouchEvent&lt;/em&gt;. There are several properties on this object, but the most interesting ones are &lt;em&gt;touches&lt;/em&gt;, &lt;em&gt;changedTouches&lt;/em&gt; and &lt;em&gt;targetTouches&lt;/em&gt;. They all are of type &lt;em&gt;TouchList&lt;/em&gt; and contain several &lt;em&gt;Touch&lt;/em&gt; objects. The &lt;em&gt;touches&lt;/em&gt; property lists all touches currently on the screen. The &lt;em&gt;changedTouches&lt;/em&gt; list contains the touches that changed and caused the event to fire. The touches in the &lt;em&gt;targetTouches&lt;/em&gt; list are those that are currently within the target element.&lt;/p&gt;


	&lt;p&gt;Every Touch has an &lt;em&gt;identifier&lt;/em&gt; property as well as &lt;em&gt;pageX&lt;/em&gt; and &lt;em&gt;pageY&lt;/em&gt; properties. As you might have guessed already, the pageX and pageY properties include the touch’s position on the screen. The identifier property provides an unique integer for this touch. It stays the the same for this touch as long it is on the screen. This is particularly useful as removing one finger will trigger a TouchEnd event that implies that all fingers were removed, immediately followed by a TouchStart event including the remaining fingers. Luckily the identifier property stays the same for those fingers that weren’t removed from the screen.&lt;/p&gt;


	&lt;h3&gt;Offline Application Caching&lt;/h3&gt;


	&lt;p&gt;In order to use the application without having an active internet connection or simply while the development server isn’t running I’m using &lt;a href=&quot;http://www.w3.org/TR/offline-webapps/#offline&quot;&gt;&lt;span class=&quot;caps&quot;&gt;HTML5&lt;/span&gt; Offline Application Caching&lt;/a&gt;. It works by defining a manifest file and referencing it in the html-tag:&lt;/p&gt;


&lt;pre class=&quot;twilight&quot;&gt;&lt;span class=&quot;line-numbers&quot;&gt;   1 &lt;/span&gt; &lt;span class=&quot;MetaTagAll&quot;&gt;&lt;span class=&quot;MetaTagAll&quot;&gt;&amp;lt;!&lt;/span&gt;&lt;span class=&quot;DoctypeXmlProcessing&quot;&gt;&lt;span class=&quot;DoctypeXmlProcessing&quot;&gt;DOCTYPE&lt;/span&gt; html&lt;/span&gt;&lt;span class=&quot;MetaTagAll&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line-numbers&quot;&gt;   2 &lt;/span&gt; &lt;span class=&quot;MetaTagAll&quot;&gt;&lt;span class=&quot;MetaTagAll&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;MetaTagAll&quot;&gt;html&lt;/span&gt; &lt;span class=&quot;MetaTagAll&quot;&gt;manifest&lt;/span&gt;=&lt;span class=&quot;String&quot;&gt;&lt;span class=&quot;String&quot;&gt;&amp;quot;&lt;/span&gt;application.manifest&lt;span class=&quot;String&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;MetaTagAll&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;/pre&gt;

	&lt;p&gt;The manifest file itself looks like this and defines what files are required to view the application while offline:&lt;/p&gt;


&lt;pre class=&quot;twilight&quot;&gt;&lt;span class=&quot;line-numbers&quot;&gt;   1 &lt;/span&gt; CACHE MANIFEST
&lt;span class=&quot;line-numbers&quot;&gt;   2 &lt;/span&gt; 
&lt;span class=&quot;line-numbers&quot;&gt;   3 &lt;/span&gt; # c94640e9114e05f16e189605e5b65ba2357117712c949cae92cc29bc1bbd3c47
&lt;span class=&quot;line-numbers&quot;&gt;   4 &lt;/span&gt; /images/background.png
&lt;span class=&quot;line-numbers&quot;&gt;   5 &lt;/span&gt; /images/icon.png
&lt;span class=&quot;line-numbers&quot;&gt;   6 &lt;/span&gt; /index.html
&lt;span class=&quot;line-numbers&quot;&gt;   7 &lt;/span&gt; /javascripts/application.js
&lt;span class=&quot;line-numbers&quot;&gt;   8 &lt;/span&gt; /stylesheets/application.css
&lt;/pre&gt;

	&lt;p&gt;You might wonder about the random string at the top. As the browser will reload everything when it can’t find one file in it’s cache, I’m using this string to force a reload during development. I built a small Sinatra app (see the listing below this paragraph) that generates the manifest and resets this string for every request. As a result, the browser reloads everything while online but falls back to the cached files when offline.&lt;/p&gt;


&lt;pre class=&quot;twilight&quot;&gt;&lt;span class=&quot;line-numbers&quot;&gt;   1 &lt;/span&gt; &lt;span class=&quot;Keyword&quot;&gt;require&lt;/span&gt; &lt;span class=&quot;String&quot;&gt;&lt;span class=&quot;String&quot;&gt;'&lt;/span&gt;sinatra&lt;span class=&quot;String&quot;&gt;'&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line-numbers&quot;&gt;   2 &lt;/span&gt; &lt;span class=&quot;Keyword&quot;&gt;require&lt;/span&gt; &lt;span class=&quot;String&quot;&gt;&lt;span class=&quot;String&quot;&gt;'&lt;/span&gt;digest/sha2&lt;span class=&quot;String&quot;&gt;'&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line-numbers&quot;&gt;   3 &lt;/span&gt; &lt;span class=&quot;Keyword&quot;&gt;require&lt;/span&gt; &lt;span class=&quot;String&quot;&gt;&lt;span class=&quot;String&quot;&gt;'&lt;/span&gt;pathname&lt;span class=&quot;String&quot;&gt;'&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line-numbers&quot;&gt;   4 &lt;/span&gt; 
&lt;span class=&quot;line-numbers&quot;&gt;   5 &lt;/span&gt; &lt;span class=&quot;Comment&quot;&gt;&lt;span class=&quot;Comment&quot;&gt;#&lt;/span&gt; ...&lt;/span&gt;
&lt;span class=&quot;line-numbers&quot;&gt;   6 &lt;/span&gt; 
&lt;span class=&quot;line-numbers&quot;&gt;   7 &lt;/span&gt; get &lt;span class=&quot;String&quot;&gt;&lt;span class=&quot;String&quot;&gt;'&lt;/span&gt;/application.manifest&lt;span class=&quot;String&quot;&gt;'&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;Keyword&quot;&gt;do&lt;/span&gt;
&lt;span class=&quot;line-numbers&quot;&gt;   8 &lt;/span&gt;   content_type &lt;span class=&quot;String&quot;&gt;&lt;span class=&quot;String&quot;&gt;'&lt;/span&gt;text/cache-manifest&lt;span class=&quot;String&quot;&gt;'&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line-numbers&quot;&gt;   9 &lt;/span&gt; 
&lt;span class=&quot;line-numbers&quot;&gt;  10 &lt;/span&gt;   manifest &lt;span class=&quot;Keyword&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;String&quot;&gt;&lt;span class=&quot;String&quot;&gt;&amp;quot;&lt;/span&gt;CACHE MANIFEST&lt;span class=&quot;StringConstant&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;StringConstant&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;String&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line-numbers&quot;&gt;  11 &lt;/span&gt;   manifest &lt;span class=&quot;Keyword&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;String&quot;&gt;&lt;span class=&quot;String&quot;&gt;&amp;quot;&lt;/span&gt;# &lt;span class=&quot;String&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;Keyword&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;Support&quot;&gt;Digest&lt;/span&gt;::&lt;span class=&quot;Entity&quot;&gt;SHA2&lt;/span&gt;.&lt;span class=&quot;Entity&quot;&gt;hexdigest&lt;/span&gt;(&lt;span class=&quot;Support&quot;&gt;Time&lt;/span&gt;.&lt;span class=&quot;Entity&quot;&gt;now&lt;/span&gt;.&lt;span class=&quot;Entity&quot;&gt;to_s&lt;/span&gt; &lt;span class=&quot;Keyword&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;Support&quot;&gt;Time&lt;/span&gt;.&lt;span class=&quot;Entity&quot;&gt;now&lt;/span&gt;.&lt;span class=&quot;Entity&quot;&gt;usec&lt;/span&gt;.&lt;span class=&quot;Entity&quot;&gt;to_s&lt;/span&gt;) &lt;span class=&quot;Keyword&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;String&quot;&gt;&lt;span class=&quot;String&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;StringConstant&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;String&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line-numbers&quot;&gt;  12 &lt;/span&gt; 
&lt;span class=&quot;line-numbers&quot;&gt;  13 &lt;/span&gt;   root &lt;span class=&quot;Keyword&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;Support&quot;&gt;Pathname&lt;/span&gt;.&lt;span class=&quot;Entity&quot;&gt;new&lt;/span&gt;(settings.&lt;span class=&quot;Entity&quot;&gt;public&lt;/span&gt;)
&lt;span class=&quot;line-numbers&quot;&gt;  14 &lt;/span&gt;   &lt;span class=&quot;Support&quot;&gt;Pathname&lt;/span&gt;.&lt;span class=&quot;Entity&quot;&gt;glob&lt;/span&gt;(&lt;span class=&quot;Support&quot;&gt;File&lt;/span&gt;.&lt;span class=&quot;Entity&quot;&gt;join&lt;/span&gt;(root, &lt;span class=&quot;String&quot;&gt;&lt;span class=&quot;String&quot;&gt;&amp;quot;&lt;/span&gt;**&lt;span class=&quot;String&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;, &lt;span class=&quot;String&quot;&gt;&lt;span class=&quot;String&quot;&gt;&amp;quot;&lt;/span&gt;*&lt;span class=&quot;String&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;)).&lt;span class=&quot;Entity&quot;&gt;each&lt;/span&gt; &lt;span class=&quot;Keyword&quot;&gt;do &lt;/span&gt;|&lt;span class=&quot;Variable&quot;&gt;p&lt;/span&gt;|
&lt;span class=&quot;line-numbers&quot;&gt;  15 &lt;/span&gt;     manifest &lt;span class=&quot;Keyword&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;String&quot;&gt;&lt;span class=&quot;String&quot;&gt;&amp;quot;&lt;/span&gt;/&lt;span class=&quot;String&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;Keyword&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; p.&lt;span class=&quot;Entity&quot;&gt;relative_path_from&lt;/span&gt;(root) &lt;span class=&quot;Keyword&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;String&quot;&gt;&lt;span class=&quot;String&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;StringConstant&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;String&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;Keyword&quot;&gt;if&lt;/span&gt; p.&lt;span class=&quot;Entity&quot;&gt;file?&lt;/span&gt;
&lt;span class=&quot;line-numbers&quot;&gt;  16 &lt;/span&gt;   &lt;span class=&quot;Keyword&quot;&gt;end&lt;/span&gt;
&lt;span class=&quot;line-numbers&quot;&gt;  17 &lt;/span&gt; 
&lt;span class=&quot;line-numbers&quot;&gt;  18 &lt;/span&gt;   manifest
&lt;span class=&quot;line-numbers&quot;&gt;  19 &lt;/span&gt; &lt;span class=&quot;Keyword&quot;&gt;end&lt;/span&gt;
&lt;/pre&gt;

	&lt;h3&gt;Issues&lt;/h3&gt;


	&lt;p&gt;There are some issues that I couldn’t resolve while building the application. The startup image will only work while in portrait orientation and its dimension has to be exactly 1004×768. Currently there isn’t a way to define a startup image for horizontal orientation.&lt;/p&gt;


	&lt;p&gt;While the tracking of the touches works on the iPhone (with iOS 4.0) as well for some reason it isn’t possible to press the buttons in the toolbar. At the moment I have no explanation for this rather strange behavior, but I might take another look at it in the future.&lt;/p&gt;


	&lt;h3&gt;Screenshot &amp;amp; Demo&lt;/h3&gt;


	&lt;p&gt;Now that you have some insights on the internals of the application, here’s a screenshot as well as a link on it to a demo:&lt;/p&gt;


	&lt;p&gt;&lt;a href=&quot;http://blog.synatic.net/assets/2010/6/24/index.html&quot;&gt;&lt;img src=&quot;http://blog.synatic.net/assets/2010/6/24/multitouch-inspector_medium.png&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;


	&lt;h3&gt;Fork it on GitHub&lt;/h3&gt;


	&lt;p&gt;I published the source code on &lt;a href=&quot;http://github.com/benedikt/multitouch-inspector&quot;&gt;GitHub&lt;/a&gt;. Feel free to fork it!&lt;/p&gt;


	&lt;h3&gt;Further reading&lt;/h3&gt;


	&lt;ol&gt;
	&lt;li&gt;&lt;a href=&quot;http://developer.apple.com/safari/library/documentation/appleapplications/reference/safariwebcontent/handlingevents/handlingevents.html#//apple_ref/doc/uid/TP40006511-SW22&quot;&gt;Safari Web Content Guide: Handling Events&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href=&quot;http://mir.aculo.us/2010/06/04/making-an-ipad-html5-app-making-it-really-fast/&quot;&gt;Making an iPad &lt;span class=&quot;caps&quot;&gt;HTML5&lt;/span&gt; App &amp;amp; making it really fast&lt;/a&gt;&lt;/li&gt;
	&lt;/ol&gt;
          &lt;div class=&quot;feedflare&quot;&gt;
&lt;a href=&quot;http://feeds.feedburner.com/~ff/synatic_net?a=cQAKnJDSI7M:G44BiYRbFaI:yIl2AUoC8zA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/synatic_net?d=yIl2AUoC8zA&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/synatic_net?a=cQAKnJDSI7M:G44BiYRbFaI:V_sGLiPBpWU&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/synatic_net?i=cQAKnJDSI7M:G44BiYRbFaI:V_sGLiPBpWU&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/synatic_net?a=cQAKnJDSI7M:G44BiYRbFaI:F7zBnMyn0Lo&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/synatic_net?i=cQAKnJDSI7M:G44BiYRbFaI:F7zBnMyn0Lo&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/synatic_net/~4/cQAKnJDSI7M&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</content>
		<author>
			<name>benedikt</name>
			<uri>http://blog.synatic.net/</uri>
		</author>
		<source>
			<title type="html">synatic|blog - Home</title>
			<link rel="self" href="http://blog.synatic.net/feed/atom.xml"/>
			<id>tag:blog.synatic.net,2010:mephisto/</id>
			<updated>2010-09-04T06:00:20+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Presentation Fu</title>
		<link href="http://www.paperplanes.de/2010/6/24/presentation_fu.html"/>
		<id>http://www.paperplanes.de/archives/2010/6/24/presentation_fu/</id>
		<updated>2010-06-24T00:00:00+00:00</updated>
		<content type="html">&lt;p&gt;I've attended my fair &lt;a href=&quot;http://feeds.feedburner.com/2010/6/22/june_a_month_of_conferences.html&quot;&gt;share of conferences this month alone&lt;/a&gt;, plus a
&lt;a href=&quot;http://blog.seedcamp.com/2010/06/yesterdays-mini-seedcamp-berlin-was.html&quot;&gt;Seedcamp&lt;/a&gt;, and I can safely say that in any
way, I learned a lot about how to build slides, how to keep the audience engaged and things one just shouldn't do in a
talk or in slides. While I certainly don't claim to be an expert on the topic now, I just wanted to put all of my
impressions and lessons learned into a post.&lt;/p&gt;

&lt;p&gt;I'm definitely not the first person to write about this kind of stuff, a year ago Geoffrey Grosenbach &lt;a href=&quot;http://nubyonrails.com/articles/improve-your-technical-slides&quot;&gt;wrote on
presenting&lt;/a&gt;, and just recently John Nunemaker &lt;a href=&quot;http://railstips.org/blog/archives/2010/05/05/improve-your-presentations-in-under-50/&quot;&gt;wrote a
post&lt;/a&gt; on improving your
presentations for less then $50. Both are well worth reading, but they don't cover everything I find annoying in
presentations, so there you go.&lt;/p&gt;

&lt;h3&gt;Slides&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Keep them small&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Seven bullet points per slide is bullshit, that's way too much. One phrase per slide is a decent rule, though I'm not
  dogmatic about it. One phrase and a couple of short bullet points (not more than four) work from time to time, but not
  all the time. I usually go for a bigger slide set these days, with less content on each slide.&lt;/p&gt;

&lt;p&gt;I can run through 80 slides in 45 minutes. I know that sounds like a lot, and I certainly go through them fast, but
  I'd rather give people something to think about than bore them to death. Slides with too much text on it also have the
  negative effect of distracting the audience. They shouldn't read the slide text, they should be listening to what you
  have to say. Even if you do talk slow, less text on slides is always a good idea. The people should listen to you, not
  try to understand what your slides are saying.&lt;/p&gt;

&lt;p&gt;What I usually do is just crank out slides with any text that I'd like to say, and then I go through them one or two
  times to refine and shorten the prases I used to be no more than four or five words for the most part. I also throw
  out slides when I realize they're disrupting the flow or contain things I'm likely to talk about when I'm on a
  different slide.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use a large font&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Just do it. Not only does it make your slides more readable for everyone in the audience, it forces you to keep the
  information on a single slide short. My headlines are usually 60pt, my subheadings and bullet points around 45pt. The
  bigger the better.&lt;/p&gt;

&lt;p&gt;While we're talking about fonts, avoid italic. It's a lot harder to read, especially when you mix it with a regular
  font. If you need to emphasize something, just make it bold. Italic fonts disrupt your slides' flow.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Avoid full sentences&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Except when you're quoting someone. Short phrases or even just a single word are much easier to grasp for the
  audience, and they give you a better sense of flow.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Dark text on a bright background&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A dark background only works for Steve Jobs, because his team does everything they can to adjust the lighting on
  location for his talk. You on the other end, have to assume the worst. If there's just a little too much light coming
  into the room, your slides will be unreadable, when you use a dark background. I've even seen slides where people
  chose a dark background and just a slightly dark font.&lt;/p&gt;

&lt;p&gt;You have no influence on the lighting in the room, and you'll pretty much just embarrass yourself when your slides are
  unreadable. There's just no excuse why you shouldn't just use a light background and a dark font.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Avoid dark photos&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Photos are at a similar risk. The more contrast you have in photos you're using in your preso, the less likely people
  will be able to see them. I tend to not use a lot of photos in my slides anyway, but I just hate having to say: &quot;Geee,
  that's a bit hard to see, isn't it?&quot;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Slides are for the people attending the talk&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Your slide set should not be focussed on being fully understandable by people who have not attended your talk. You end
  up with so called slideuments, presentations that read like a document. You're talking for the people attending your
  talk, they probably paid to hear you speak, so focus your energy on giving them a good talk. If you want the rest
  of the world to know about details of your preso, write a blog post or put it into the presenter notes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Video killed the conference star&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I've seen video in presentations quite a few times, and honestly, it bores me to death, especially when there's a
  voiceover on the video. If you must include video, at least talk yourself, taking the audience through whatever
  happens on the screen, especially because you don't know how the audio is going to be at the venue. I'm well aware
  that live demos are a finnicky thing, but so is video. Not always do you have the luxury of using your own computer to
  do the presentation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Avoid long code snippets&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Code is simply hard to grasp within just a couple of seconds, and it's awkward trying to explain larger chunks of it.
  Use short snippets instead. If you must include some longer examples, split it up in smaller bits, explaining them one
  by one. I tend to avoid overly complex code snippets. Trying to explain them properly just takes too much time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Avoid flashy animations&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;They simply take up valueable time and distract the audience. Even though they're nice to look at in theory, in
  practice they're the bane of a well-built presentation. This is true for both transitions between slides and elements
  of a single slide appearing later. Just make them appear, not sparkle or fade in.&lt;/p&gt;

&lt;h3&gt;The Talk&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Practice, practice, practice&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I find practicing a talk by speaking to myself awkward, not because it's embarrassing, but simply because of the
  butterflies in my stomach I always end up saying different things in the actual talk. Now, that's not to say you
  shouldn't think about what you want to say. I tend to go through my slides several times, going through the things I
  associate with every single one of them, giving me a rough idea and a line of thought on what I want to say. This
  definitely is a lot easier to do when it's a topic you've talked about before, but in general the above has worked
  much better for me.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Drink, drink, drink&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It's a simple fact that talking a lot lets your mouth run dry. I need about half a liter of water to get through a
  talk. Or at least I make sure I have that amount ready. Before you run dry and faint in the midst of your talk, drink,
  it's not a shameful thing to do, it simply keeps you going. Shame on conference organizers not thinking about having
  drinks ready for their speakers. When in doubt, scout the talks before you and make sure you have a bottle ready
  should it not being taken care of.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Look at the audience, not the big screen&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It should be so obvious, yet I've just seen people do it again at Cloud Expo. One of the guy's slides had 14 bullet
  points on it, and the font probably was too small for him to be able to read it from the laptop screen. Another reason
  why I keep my slides short, they're purpose is to keep me in a flow, to give me short reminders of what I want to talk
  about.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Don't read your presenter notes&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you need presenter notes to run your talk, you need to practice more. They're surely useful for people just looking
  at your slides, but if it takes full sentences to keep your talk running, you'll end up wasting a lot of time trying
  to read what your notes say. Talking freely is a challenge, but the earlier you take it on, the faster you'll get used
  to it. I've seen people use index cards with their presenter notes on them, handwritten, trying to decipher what
  they've written on them.&lt;/p&gt;

&lt;p&gt;If you know what you're talking about (at least the slightest bit), you'll be fine without them, trust me.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Two's not a company&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Having more than one speaker is awkward, especially when one of them is just standing there for most of the time,
  waiting for his turn. Have one up in front at any one time, bring in the next person when it's his turn. Simple like
  that.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Don't ask questions&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The audience simply won't answer. If you ask anything, make the audience raise their hands on a topic, but don't
  expect anyone to answer a specific question. That's your task. Involving the audience sounds like a good idea, but
  they're lazy, they want to learn something.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Jokes, tiny bits and stories&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Stories and jokes can really lighten up a presentation. Sure, you shouldn't tell jokes all the time, but something
  sarcastic thrown in from time to time sure can help to wake up the audience. Stories are even better, people love
  benefitting from real life experiences in any way. If it has a happy ending, even better.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Talking slowly is for wimps&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The rule of spending two minutes on a slide is bullshit. It would only mean you'd have seven bullet points on a
  particular slide. You shouldn't rush through anything, and I certainly try to avoid doing that, and it definitely
  depends on the topic you're talking about, but when I talk about technical things I expect the audience to be curious
  about it and try to keep up. If they can't, they can always come back to my slides or ask questions. But as always, it
  depends.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Talking fast is for the impatient&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If it's on more generic things that involve higher level topics, or some sort of longer-running workshop, it's only
  appropriate to walk the people through it and take your time doing so. Usually in these situations it's a lot easier
  to focus on a single topic. It just depends on how broad your talks topic is.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Take tiny breaks&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Should you realize you're sort of losing track, simply bring yourself back on the rails. Take a tiny break or just
  stop talking. You don't need to apologize for that. It's easy to start blabbering on about a certain topic which you
  didn't even intend to cover in your talk.
  On the other hand, that's what makes every talk unique, and is exactly why shorter phrases on slides are so much
  better. They keep your brain engaged, making up associations with certain things as you go, and they help keeping a
  talk interesting.&lt;/p&gt;

&lt;p&gt;Avoid longer breaks though as people end up being bored, and you're losing precious time. Longer breaks are usually a
  sign that you're not as prepared as you should be. If you need to switch in between e.g. slides and a live demo, make
  sure that everything is prepared before the talk.&lt;/p&gt;

&lt;p&gt;Talking in front of others is a challenge, no doubt about it, but there's really no point trying to avoid it, because
the only way to improve your skills is to simply talk in front of people. This is my view of the talking world. I
constantly try to improve on my slides and think about what I'm doing wrong during talks to improve on that. I'll never
loose the excitement right before a talk, and that's a good thing. When it becomes routine, you tend to bore people
instead of engaging them. It's about constantly improving yourself to simply become better at talking in front of
others.&lt;/p&gt;

&lt;p&gt;This is my view of giving presentations. Feel free to throw in your ideas, or even to disagree. These guidelines
probably aren't for everyone, and they might even change for me within just a couple of months, but most of them simply
make sense to me.  I do need to get me a good remote though, since with my larger slide sets, I find myself hitting the
space bar a lot.&lt;/p&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/Paperplanes/~4/5LrwHY7FIT4&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</content>
		<author>
			<name>paperplanes</name>
			<uri>http://www.paperplanes.de</uri>
		</author>
		<source>
			<title type="html">paperplanes</title>
			<subtitle type="html">software development that flies</subtitle>
			<link rel="self" href="http://feeds.feedburner.com/Paperplanes"/>
			<id>http://feeds.feedburner.com/Paperplanes</id>
			<updated>2010-09-03T16:40:18+00:00</updated>
			<rights type="html">Copyright 2007-2009</rights>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">June - A Month of Conferences</title>
		<link href="http://www.paperplanes.de/2010/6/22/june_a_month_of_conferences.html"/>
		<id>http://www.paperplanes.de/archives/2010/6/22/june_a_month_of_conferences/</id>
		<updated>2010-06-22T00:00:00+00:00</updated>
		<content type="html">&lt;p&gt;June was an exhausting month for me. I spoke at four different conferences, two of which were not in Berlin. I finished
the last talk today, so time to reciprocate on conferences and talks. In all I had good fun. It was a lot of work to get
the presentations done (around 400 single slides altogether), but in all I would dare say that it was all more than good
practice to work on my presentation skills and to loose a bit of the fear of talking in front of people. But I'll follow
up on that stuff in particular in a later post.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;RailsWayCon in Berlin&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I have to admit that I didn't see much of the conference, I mainly hung around, talked to people, and gave a talk on
Redis and how to use it with Ruby. Like last year the conference was mingled in with the International PHP Conference
and the German Webinale, a somewhat web-related conference. I made a pretty comprehensive set of slides for Redis,
&lt;a href=&quot;http://redis-railswaycon2010.heroku.com/&quot;&gt;available for your viewing pleasure&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Berlin Buzzwords in Berlin&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Hadoop, Lucene, NoSQL, Berlin Buzzwords had it all. I spent most of my time in the talks on the topics around NoSQL,
having been given the honor of opening the track with a general introduction on the topic. I can't remember having given
a talk in front of this many people. The room took about 250, and it seemed pretty full. Not tooting my own horn here,
I've never been more anxious before a talk of how it would go. Obviously there were heaps of people in the room who have
only heard of the term, and people who work with or on the tools on a daily basis. Feedback was quite positive, so I
guess it turned out pretty okay. Rusty Klophaus wrote two very good recaps of the whole event, read on about &lt;a href=&quot;http://rklophaus.com/articles/20100607-BerlinBuzzwordsRecap.html&quot;&gt;day
one&lt;/a&gt; and &lt;a href=&quot;http://rklophaus.com/articles/20100608-BerlinBuzzwordsRecap.html&quot;&gt;day
two&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The slide set for my talk has some 120 slides in all, trying to give a no-fuss overview of the NoSQL ecosystem and the
ideas and inspirations. There's some historical references in the talk, because in general the technologies aren't
revolutionary, they use ideas that've been around for a while and combine them with some newer ones. Do check out &lt;a href=&quot;http://nosql-berlinbuzzwords2010.heroku.com/&quot;&gt;the
slides for some more details&lt;/a&gt; on that.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MongoUK in London&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;10gen is running MongoDB related conferences in a couple of cities, one of them in London, where I was asked to speak on
something related to MongoDB. Since I'm all about diversity, that's pretty much what I ended up talking about, with a
hint of MongoDB sprinkled on top of it. Document databases, the web, the universe, all the philosophical foundation
knowledge you could ask for. I talked about CouchDB, Riak, and about what makes MongoDB stand out from the rest.&lt;/p&gt;

&lt;p&gt;Most enjoyable about MongoUK was to hear about real life experiences of MongoDB users, what kind of problems they had
and such. Also, I finally got to see some of London and meet friends, but I'll write more about that (and coffee) on &lt;a href=&quot;http://holgarific.net&quot;&gt;my personal
blog&lt;/a&gt;. Again, the slide set is available for your &lt;a href=&quot;http://document-databases-mongouk2010.heroku.com/&quot;&gt;document database comparison pleasure&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cloud Expo Europe in Prague&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Just two 36 hours after I got back from London I jumped on the train to Prague to speak about MongoDB at Cloud Expo
Europe. Cloud is something I can get on board with (hint: &lt;a href=&quot;http://scalarium.com&quot;&gt;Scalarium&lt;/a&gt;), so why the hell not? It
turned out to be a pretty enterprisey conference, but still, got some new food for thought on cloud computing in
general.&lt;/p&gt;

&lt;p&gt;I already gave a talk on MongoDB at Berlin's Ruby brigade, but I built a different slide set this time, improving on the
details I found to be a bit confusing at first. Do check out &lt;a href=&quot;http://mongodb-cloud-expo-prague2010.heroku.com/&quot;&gt;the
slides&lt;/a&gt;, if you don't know anything about MongoDB yet, it should give
you a good idea.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Showing off&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;As you'll surely notice, my slides are all websites, and not on Slideshare. Two months ago I looked into &lt;a href=&quot;http://twitter.com/chacon&quot;&gt;Scott
Chacon's&lt;/a&gt; &lt;a href=&quot;http://github.com/schacon/showoff&quot;&gt;Showoff&lt;/a&gt;, a tool to build web-based
presentations that simply run as tiny JavaScript apps in the browser. I very much like that idea, because even though
Keynote is still the king of the crop, it's still awful. Using Markdown, CSs and JavaScript appeals much more to the
geek in my. It's so easy to crank out slides as simple text, and worry about the styling later. Plus, I can easily keep
my slides in Git, and who doesn't enjoy that? I'd very much recommend giving it a go. If you want to look at some
sources, all my talks and their sources are available on the GitHubs,
&lt;a href=&quot;http://github.com/mattmatt/rugb_mongodb&quot;&gt;MongoDB&lt;/a&gt;, &lt;a href=&quot;http://github.com/mattmatt/redis-railswaycon2010&quot;&gt;Redis&lt;/a&gt;,
&lt;a href=&quot;http://github.com/mattmatt/nosql-berlinbuzzwords2010&quot;&gt;NoSQL&lt;/a&gt;, &lt;a href=&quot;http://github.com/mattmatt/document-databases-mongouk2010&quot;&gt;document
databases&lt;/a&gt; and again
&lt;a href=&quot;http://github.com/mattmatt/mongodb-cloud-expo-prague2010&quot;&gt;MongoDB&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;It's a pleasure to build slides with Showoff, and it has helped me focus my slides on very short phrases and as few
bullet points as possible. Sure, it's not Keynote and doesn't have all the fancy features, but I noticed that it forced
me to focus more, and that keeping slides short helped me stay focussed, but again, more on that in a follow-up post.&lt;/p&gt;

&lt;p&gt;Feel free to use my slides as inspiration to play with Showoff, there's surprisingly little magic involved. Also, if you
think I should speak at a conference you know of or that you're organising, do &lt;a href=&quot;mailto:meyer@paperplanes.de&quot;&gt;get in
touch&lt;/a&gt;.&lt;/p&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/Paperplanes/~4/BDirVCd1zdU&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</content>
		<author>
			<name>paperplanes</name>
			<uri>http://www.paperplanes.de</uri>
		</author>
		<source>
			<title type="html">paperplanes</title>
			<subtitle type="html">software development that flies</subtitle>
			<link rel="self" href="http://feeds.feedburner.com/Paperplanes"/>
			<id>http://feeds.feedburner.com/Paperplanes</id>
			<updated>2010-09-03T16:40:18+00:00</updated>
			<rights type="html">Copyright 2007-2009</rights>
		</source>
	</entry>

	<entry xml:lang="de-de">
		<title type="html">Was macht eigentlich… ?</title>
		<link href="http://feedproxy.google.com/~r/dopefreshtightblog/~3/v8peZUCZivA/"/>
		<id>http://dennisbloete.de/?p=678</id>
		<updated>2010-06-10T20:48:36+00:00</updated>
		<content type="html">&lt;p&gt;Half a year ago &lt;a href=&quot;http://dennisbloete.de/blog/going-solo/&quot;&gt;I promised to let you know&lt;/a&gt; about my experiences becoming a freelancer. Not having written more than a few &lt;a href=&quot;http://feeds.feedburner.com/blog/disser-app-iphone/&quot;&gt;project&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/blog/zendome-iphone-app/&quot;&gt;announcements&lt;/a&gt; since then is actually a good thing, because it means I&amp;#8217;m too busy to blog &lt;img src=&quot;http://dennisbloete.de/wp-includes/images/smilies/icon_wink.gif&quot; alt=&quot;;)&quot; class=&quot;wp-smiley&quot; /&gt;  Nevertheless: Here is an update of what I have been doing the last months and about what I plan to do for the rest of the year &lt;img src=&quot;http://dennisbloete.de/wp-includes/images/smilies/icon_smile.gif&quot; alt=&quot;:)&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/p&gt;
&lt;p&gt;&lt;span id=&quot;more-678&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;After spending the first months completely involved in some iPhone projects and consulting and not doing anything web development related I decided to not take on new iPhone/iPad client projects. There are some reasons for that &amp;#8211; first and foremost: Right now the web and mobile market are moving really fast and I just can&amp;#8217;t (and don&amp;#8217;t want to) find the time to stay up to date with both worlds (it&amp;#8217;s appeasing that I&amp;#8217;m not the only one who &lt;a href=&quot;http://tammofreese.de/2009/09/03/goodbye-rails-hello-os-x-iphone-mac&quot;&gt;thinks like that&lt;/a&gt; &lt;img src=&quot;http://dennisbloete.de/wp-includes/images/smilies/icon_smile.gif&quot; alt=&quot;:)&quot; class=&quot;wp-smiley&quot; /&gt; ) There is so much exciting stuff happening in the Rails, JavaScript and HTML5 realm that I don&amp;#8217;t want to miss and I really missed working in teams, because most of the iPhone gigs were just me on the development side. Another point is that I don&amp;#8217;t like the lock in way Apple seems to be pursuing, but this is more of a personal issue. I&amp;#8217;d really like to get the personal impression from those of you who are also doing iOS development, maybe it&amp;#8217;s just me but I talked to some people who seamed to have similar opinions.&lt;/p&gt;
&lt;p&gt;So what happened after making this decision? Something that seems logical looking at it retrospectively: I joined the guys over at &lt;a href=&quot;http://railslove.com/&quot;&gt;&lt;strong&gt;&lt;/strong&gt;Railslove&lt;/a&gt; and worked with them on a World Cup prediction game (I&amp;#8217;m sorry but I just don&amp;#8217;t know how to translate &amp;#8220;Tippspiel&amp;#8221; &amp;#8211; btw: why not join the &lt;a href=&quot;http://cowocup2010.coworking.de/&quot;&gt;Coworking Cup&lt;/a&gt;? Invitation token is &amp;#8220;weworkunited&amp;#8221;). We had a very productive time and lots of fun together so we concluded it might be a good idea to work on some more projects and this assumption did not fail to deliver. We are working on some pretty exciting projects and if you are interested in joining Railslove just &lt;a href=&quot;http://railslove.com/about-us&quot;&gt;contact them&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Okay, that&amp;#8217;s the past and the present &amp;#8211; what about the future? I don&amp;#8217;t know, but if it turns out to be as exciting, informative and funny as the first six month it will be awesome! Two weeks ago I&amp;#8217;ve been at the &lt;a href=&quot;http://it-republik.de/conferences/railswaycon2010/&quot;&gt;RailsWayCon&lt;/a&gt; (you might want to read &lt;a href=&quot;http://jan.krutisch.de/en/2010/06/04/railswaycon-recap.html&quot;&gt;Jan&amp;#8217;s recap&lt;/a&gt;) and met a lot of the nice folks from the European Ruby/Rails Community. I&amp;#8217;m also really looking forward for some more conferences and events this year, like &lt;a href=&quot;http://railscamp.de/&quot;&gt;RailsCamp&lt;/a&gt;, &lt;a href=&quot;http://jsconf.eu/2010/&quot;&gt;JSConf EU&lt;/a&gt; and &lt;a href=&quot;http://www.railsrumble.com/&quot;&gt;RailsRumble&lt;/a&gt; to name a few &amp;#8211; I hope we&amp;#8217;ll see each other there!&lt;/p&gt;</content>
		<author>
			<name>Dennis Bloete</name>
			<email>mail@dennisbloete.de</email>
			<uri>http://dennisbloete.de</uri>
		</author>
		<source>
			<title type="html">//dennisbloete</title>
			<subtitle type="html">Arbeit und Alltag eines Software-Entwicklers aus Bremen</subtitle>
			<link rel="self" href="http://feeds.feedburner.com/dopefreshtightblog/"/>
			<id>http://feeds.feedburner.com/dopefreshtightblog/</id>
			<updated>2010-09-06T07:40:13+00:00</updated>
			<rights type="html">©</rights>
		</source>
	</entry>

	<entry>
		<title type="html">Ruby on Rails 3 Security Updated</title>
		<link href="http://www.rorsecurity.info/journal/2010/6/8/ruby-on-rails-3-security-updated.html"/>
		<id>http://www.rorsecurity.info/journal/2010/6/8/ruby-on-rails-3-security-updated.html</id>
		<updated>2010-06-08T12:13:13+00:00</updated>
		<content type="html" xml:lang="en-US">&lt;p&gt;I hold a talk about Rails 3 Security at the &lt;a href=&quot;http://it-republik.de/conferences/railswaycon2010/&quot;&gt;RailsWayCon10&lt;/a&gt;. It is about the new Cross-Site Scription protection in Rails 3, what is going to change in ActiveRecord and other Rails Security topics. You can find the presentation &lt;a href=&quot;http://www.slideshare.net/heikowebers/ruby-on-rails-security-updated-rails-3-at-railswaycon&quot;&gt;at Slideshare&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;div id=&quot;__ss_4438876&quot;&gt;&lt;strong&gt;&lt;a href=&quot;http://www.slideshare.net/heikowebers/ruby-on-rails-security-updated-rails-3-at-railswaycon&quot; title=&quot;Ruby on Rails Security Updated (Rails 3) at RailsWayCon&quot;&gt;Ruby on Rails Security Updated (Rails 3) at RailsWayCon&lt;/a&gt;&lt;/strong&gt;&lt;div&gt;View more &lt;a href=&quot;http://www.slideshare.net/&quot;&gt;presentations&lt;/a&gt; from &lt;a href=&quot;http://www.slideshare.net/heikowebers&quot;&gt;heikowebers&lt;/a&gt;.&lt;/div&gt;&lt;/div&gt;&lt;/p&gt;</content>
		<author>
			<name>Heiko</name>
			<uri>http://www.rorsecurity.info/journal/</uri>
		</author>
		<source>
			<title type="html">Ruby on Rails Security Project</title>
			<subtitle type="html">Journal</subtitle>
			<link rel="self" href="http://www.rorsecurity.info/journal/atom.xml"/>
			<id>http://www.rorsecurity.info/journal/</id>
			<updated>2010-06-10T17:40:07+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Upcoming Conference Talks</title>
		<link href="http://www.paperplanes.de/2010/6/1/upcoming_conference_talks.html"/>
		<id>http://www.paperplanes.de/archives/2010/6/1/upcoming_conference_talks/</id>
		<updated>2010-06-01T00:00:00+00:00</updated>
		<content type="html">&lt;p&gt;June is a busy month when it comes to me speaking at conferences, you should drop by at least one of my talks, if you're
in the area.&lt;/p&gt;

&lt;p&gt;This week is &lt;a href=&quot;http://www.railswaycon.de&quot;&gt;RailsWayCon&lt;/a&gt; in Berlin, and I'll be talking about Redis. Don't tell anyone, but
&lt;a href=&quot;http://redis-railswaycon2010.heroku.com/&quot;&gt;my slides&lt;/a&gt; are already up, in case you can't make it.&lt;/p&gt;

&lt;p&gt;Next up is &lt;a href=&quot;http://www.berlinbuzzwords.de&quot;&gt;Berlin Buzzwords&lt;/a&gt;, on June 7th and 8th in Berlin, where I'll be giving a
general introduction on NoSQL databases, their history and the current state of affairs. The conference is all about
scale, search and data, a definite must.&lt;/p&gt;

&lt;p&gt;On June 18th I'll be speaking at &lt;a href=&quot;http://www.10gen.com/conferences/event_mongouk_18june10&quot;&gt;MongoUK&lt;/a&gt;, about MongoDB and
document databases in general. If you want to come, use the coupon code paper_planes for 20% off the full ticket price.&lt;/p&gt;

&lt;p&gt;Then, last but no least, Ill be talking about MongoDB in general at &lt;a href=&quot;http://www.cloudexpo-europe.com/&quot;&gt;Cloud Expo Europe&lt;/a&gt; in Prague. &lt;/p&gt;

&lt;p&gt;Hope to see you at one of these conferences. Happy to chat about anything from databases to clouds, and to give you a
tour of &lt;a href=&quot;http://scalarium.com&quot;&gt;Scalarium&lt;/a&gt;.&lt;/p&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/Paperplanes/~4/gyMK3FGA_L8&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</content>
		<author>
			<name>paperplanes</name>
			<uri>http://www.paperplanes.de</uri>
		</author>
		<source>
			<title type="html">paperplanes</title>
			<subtitle type="html">software development that flies</subtitle>
			<link rel="self" href="http://feeds.feedburner.com/Paperplanes"/>
			<id>http://feeds.feedburner.com/Paperplanes</id>
			<updated>2010-09-03T16:40:18+00:00</updated>
			<rights type="html">Copyright 2007-2009</rights>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Conference Talks You Should Be Watching</title>
		<link href="http://www.paperplanes.de/2010/5/24/talks_you_should_be_watching.html"/>
		<id>http://www.paperplanes.de/archives/2010/5/24/talks_you_should_be_watching/</id>
		<updated>2010-05-24T00:00:00+00:00</updated>
		<content type="html">&lt;p&gt;Thanks to the guys from Confreaks, there's a whole bunch of video material from
conferences for the rest of us to enjoy. I've been watching quite a few recently, so
here's some recommendations of talks I found interesting.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href=&quot;http://rubyconf2009.confreaks.com/19-nov-2009-10-25-bert-and-ernie-scaling-your-ruby-site-with-erlang-tom-preston-werner.html&quot;&gt;BERT and Ernie: Scaling your Ruby site with Erlang&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Talk on the BERT protocol created by Tom Preston-Werner of GitHub.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href=&quot;http://rubyconf2009.confreaks.com/19-nov-2009-11-15-bits-bytes-and-blobs-brian-mitchell.html&quot;&gt;Bits, Bytes, and BLOBs&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Everything on bit shifting, binary protocols and whathaveyou. I'm a big fan of text-based
protocols, but it's nice to get some perspective on the world of binary things as well.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href=&quot;http://rubyconf2009.confreaks.com/20-nov-2009-09-30-nosql-death-to-relational-databases-ben-scofield.html&quot;&gt;NoSQL - Death to Relational Databases&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The title is to be taken with a grain of salt obviously, but nonetheless, nice introduction to the
most important players of the NoSQL world.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href=&quot;http://rubyconf2009.confreaks.com/20-nov-2009-15-05-solid-ruby-jim-weirich.html&quot;&gt;SOLID Ruby&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Jim Weirich on applying the SOLID principles to Ruby coding, though it's more of an introduction
to the principles in general with a hint of Ruby.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href=&quot;http://rubyconf2009.confreaks.com/21-nov-2009-10-25-clojure-for-ruby-programmers-stuart-halloway.html&quot;&gt;Clojure for Ruby Programmers&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The title says it all.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href=&quot;http://rubyconf2009.confreaks.com/20-nov-2009-16-20-rippin-off-python-chris-wanstrath.html&quot;&gt;Rippin' off Python&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Nice talk on how Python solves some problems compared to Ruby.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href=&quot;http://mwrc2010.confreaks.com/2010-03-11-10-00-james-golick-cooking-with-chef-your-servers-will-thank-you.html&quot;&gt;Cooking with Chef - Your Servers will thank you&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Great introduction to the essence of Chef and how easy it is to write your own
cookbooks and recipes. I agree with lots of the things James talks about here, and the
their way of using Chef comes pretty close to how we're using it on
&lt;a href=&quot;http://scalarium.com&quot;&gt;Scalarium&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The gist of all of them for me: They're a lot less about Ruby or even Rails. Personally
I'm pretty bored of hearing yet another talk on these topics, or stuff like Cucumber.
Talks that expand my horizon beyond what people do with Rails have become a lot more
interesting to me.&lt;/p&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/Paperplanes/~4/Oh_Bb8hADgk&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</content>
		<author>
			<name>paperplanes</name>
			<uri>http://www.paperplanes.de</uri>
		</author>
		<source>
			<title type="html">paperplanes</title>
			<subtitle type="html">software development that flies</subtitle>
			<link rel="self" href="http://feeds.feedburner.com/Paperplanes"/>
			<id>http://feeds.feedburner.com/Paperplanes</id>
			<updated>2010-09-03T16:40:18+00:00</updated>
			<rights type="html">Copyright 2007-2009</rights>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">ActiveRecord's Callbacks Ruined My Life</title>
		<link href="http://www.paperplanes.de/2010/5/7/activerecord_callbacks_ruined_my_life.html"/>
		<id>http://www.paperplanes.de/archives/2010/5/7/activerecord_callbacks_ruined_my_life/</id>
		<updated>2010-05-07T00:00:00+00:00</updated>
		<content type="html">&lt;p&gt;Recently I've been having a foul taste in my mouth, or just a bad feeling, if you will. Whenever I started adding validations and callbacks
to a model in a Rails application. It just felt wrong. It felt like I'm adding code that shouldn't be there, that makes everything a lot
more complicated, and turns explicit into implicit code. Code that is only being run depending on the persistence state of an object. Code
that is being hard to test, because you need to save an object to test parts of your business logic. Don't get me started on observers, I
never was a fan of them. Putting stuff that should be run when an object was saved elsewhere is the worst kind of hiding business logic.&lt;/p&gt;

&lt;p&gt;The two are somewhat bound together: Create an object, run a callback and validations. Update an object, check if an attribute is set, run a
different callback. I started to loathe the lack of implicitness that callbacks gave my code, and I started to loathe that libraries
everywhere copied that behaviour from ActiveRecord, and that you involve testing your database in your unit tests, though implicitly, and
that noone had a better answer for how that stuff should work. Sure, it's not big news that involving your database in your unit tests is
not a recommended practice, hence the overuse of mocking and stubbing fostered by RSpec, but it took a while for me to really feel the pain.&lt;/p&gt;

&lt;h3&gt;Ingredients: REST, Rails, Resources&lt;/h3&gt;

&lt;p&gt;The root problem (in a very philosophical way and in my very own opinion) lies in Rails' understanding of RESTful resources. The path to a
resource is supposed to be thin, and a resource is mostly represented by something that's stored in a database. So far, so good. That thin
layer however, the controller, implies that running any logic on a resource somehow ends up in simply updating the resource, setting some
attribute signaling that an action needs to be taken. That's how tools like resource_controller, make_resourceful and inherited_resources
came about, to get rid of the thin-layered controller tier, the boiler plate code. And I loved them, because I hated writing the same code
over and over again.&lt;/p&gt;

&lt;p&gt;But over time I realized that controllers aren't the problem, it's the way Rails treats resources that lead us to this mess where
everything's declared in a model's class body, where you have to look at callbacks to find out what's going on when you create a new object,
and where you clutter your models with code that just doesn't need to be there (sending mails, for example, or doing custom validations that
are bound to specific state). It all started to lack explicitness for me. There's no clear path of entry, no list of method calls you can
follow along.&lt;/p&gt;

&lt;p&gt;I'm not sure how other people see this, obviously a lot of people don't realize it's a problem, or they're simply fine with how things work,
I was for a long time too, almost five years now, to be exact. I know I'm not alone in this though, talking to others made me realize
they're on a similar page, but given that it's the way Rails works, what can you do?&lt;/p&gt;

&lt;h3&gt;Validations&lt;/h3&gt;

&lt;p&gt;What about validations? I can live with validations being part of the model, but they're still part of the problem generated by callbacks,
simply because validations are callbacks themselves. I always found myself ending up writing custom validations in before_validation et.
al. hooks, and it just felt wrong, because the list of callbacks grew noticably. Validations are not always the same depending on your
object's state. They can even be quite useless when you're handling a lot of backend code that's asynchronous and decoupled from the web
interface.&lt;/p&gt;

&lt;p&gt;What do we do to work around it? We resort to using &lt;code&gt;save(false)&lt;/code&gt;, whose lack of explicitness I cannot even begin to
fully explain in a peaceful manner. Validations tend to depend on the object's state, at least more complex ones. They're not universal,
they can be different when creating and saving objects. Yes, I know that in ActiveRecord you can say &lt;code&gt;:on =&amp;gt; :create&lt;/code&gt;, but for me that just
emphasizes my point. Persistent state determines callbacks and therefore business logic, decreasing expressiveness.&lt;/p&gt;

&lt;h3&gt;Forms? Presenters?&lt;/h3&gt;

&lt;p&gt;I've looked into how &lt;a href=&quot;http://docs.djangoproject.com/en/dev/topics/forms/&quot;&gt;Django is dealing with this&lt;/a&gt;, and it sort of struck a chord with me. Their approach is to define form objects that do the
validations for you. They're somewhat decoupled from your business logic and are your intermediate layer between the web interface and the
business model. Good lord, did I just recommend we all use presenter objects, even though Jay Fields said they don't work? I think I did, Bob!&lt;/p&gt;

&lt;p&gt;It's not &lt;em&gt;the&lt;/em&gt; way, but it's one way, and there's been work on bringing this to Rails, have a look at
&lt;a href=&quot;http://github.com/tizoc/bureaucrat&quot;&gt;Bureaucrat&lt;/a&gt; for example. Again, it's one way to try solving the problem, it doesn't come without any
downsides too. Tying the idea of explicit services to form data may or may not make unit testing harder, or at least mix two different
concerns (forms and creating/manipulating objects). What I like about it though is that it decouples validation from the business logic, and
ties it to the layer it's really necessary, the view.&lt;/p&gt;

&lt;p&gt;Not without irony, I've started using something similar to handle embedded objects on a project using &lt;a href=&quot;http://couchdb.org&quot;&gt;CouchDB&lt;/a&gt;. I
wanted to extract out the stuff handling with embedded objects, because I was simply to lazy to add support for that to
&lt;a href=&quot;http://github.com/langalex/couch_potato&quot;&gt;CouchPotato&lt;/a&gt;. The result felt amazingly good, almost like the above forms mixed with a
&lt;strong&gt;*gasp*&lt;/strong&gt; service.&lt;/p&gt;

&lt;h3&gt;Services?&lt;/h3&gt;

&lt;p&gt;I'm still seeking for the answer to that one. &lt;a href=&quot;http://www.patmaddox.com/stuff/domain_driven_rails.pdf&quot;&gt;Pat Maddox&lt;/a&gt; and &lt;a href=&quot;http://jamesgolick.com/2010/3/14/crazy-heretical-and-awesome-the-way-i-write-rails-apps.html&quot;&gt;James
Golick&lt;/a&gt; suggest services as one way to make
callbacks explicit, be sure to read through the comments on James' post. Now, I don't know about your history, but coming from a Java
background that struck a bad cord with me. I laughed off the idea, to be frank.&lt;/p&gt;

&lt;p&gt;One thing still bugs me about the approach James is laying out in his post, it's the extensive use of mocking. It sure does make for fast
unit tests, and I'm starting to see the sense in it when using a service model, but I've grown fond of the &lt;a href=&quot;http://xunitpatterns.com/Mocks,%20Fakes,%20Stubs%20and%20Dummies.html&quot;&gt;fakes
approach&lt;/a&gt;, which is why we wrote &lt;a href=&quot;http://github.com/jweiss/rocking_chair&quot;&gt;Rocking
Chair&lt;/a&gt;, and why people came up with things like &lt;a href=&quot;http://github.com/maccman/supermodel&quot;&gt;SuperModel&lt;/a&gt;,
in-memory database implementations you can easily switch on and off, not exactly decoupling your unit tests from the persistence layer, but
decoupling them from having a database running, making it easier to e.g. split batches of tests across several cores and processors, and
simply making them faster.&lt;/p&gt;

&lt;p&gt;However, the more I thought about it, the more sense the services approach made. You don't have to necessarily make it a separate class,
depending on how much you like having all of your business logic in the model. I'm not sure which approach I'd prefer, because honestly, I
haven't tried it yet, but I'm willing to give in. I'm willing to try things that let me ditch callbacks and validations, because I simply
loathe them, they just don't feel right to me anymore when used in the way ActiveRecord does.&lt;/p&gt;

&lt;p&gt;With Rails 3 for example, you can put your validations anywhere, they're not just bound to ActiveRecord anymore, they leave a lot more room
for you to use them in different ways. I'm not suggesting you should get rid of validations, they're just a part of the callbacks madness,
and they tend to not always be the same depending on what you're doing in a particular use case. Using save(false) just started to feel like
a bad workaround to me to avoid having callbacks run. I want to save an object no matter what, and run whatever code I require in that
course of action, in an explicit fashion.&lt;/p&gt;

&lt;h3&gt;Are Fine-grained Resources the Future?&lt;/h3&gt;

&lt;p&gt;The question that's left for me, and this is where I'm starting to &lt;em&gt;gasp&lt;/em&gt; question Rails' approach to resources. I'm starting to think
they're wrong, and that for the service or the forms model to work, the idea of a single resource you update whenever you want your model to
do something needs to change. Having very specific services and their methods would mean a switch to more lightweight and finer-grained
resources, specific resources where you e.g. accept an invitation not by PUTting to &lt;code&gt;/invitation/12345&lt;/code&gt;, but instead to
&lt;code&gt;/invitation/12345/accept&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;But, and here's the kicker, to me this leaves the question of how RESTful that approach is. This is where I'd like to get input. How do
people using services already solve this problem? Have lots of tiny methods in your controllers? Maybe it's time to work more with Sinatra
to get different ideas in my head, to rethink resources. I'm still not certain what a good and RESTful way to approach this would be.
Whatever it is, it'd leave my business logic in a way that's a lot more approachable both for people reading it, and for my tests. That's
something pretty dear to me, and more important than fully conforming to a REST model. There must be something better, because the
current status quo of handling business logic with Rails' resources just doesn't work for me anymore, it doesn't make me a happy programmer.&lt;/p&gt;

&lt;p&gt;The answers have yet to be found. My intention is not to rant, but rather to start a discussion around it. In my opinion the way Rails
recommends handling resources doesn't have a future, if only for me, and even if that means using other frameworks in the future. I don't
think we wasted time with Rails' current way, instead we're going to see an evolution, and I find that pretty exciting, because the future
has yet to be written in this regard, and we can be a part of that.&lt;/p&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/Paperplanes/~4/kNsUIc1nNvY&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</content>
		<author>
			<name>paperplanes</name>
			<uri>http://www.paperplanes.de</uri>
		</author>
		<source>
			<title type="html">paperplanes</title>
			<subtitle type="html">software development that flies</subtitle>
			<link rel="self" href="http://feeds.feedburner.com/Paperplanes"/>
			<id>http://feeds.feedburner.com/Paperplanes</id>
			<updated>2010-09-03T16:40:18+00:00</updated>
			<rights type="html">Copyright 2007-2009</rights>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Coworking Cologne offen ab 03.05.2010</title>
		<link href="http://feedproxy.google.com/~r/railslabs/~3/jXQ1TP-oe4s/"/>
		<id>http://railslove.com/weblog/?p=613</id>
		<updated>2010-04-16T13:16:56+00:00</updated>
		<content type="html">&lt;p&gt;Es freut uns zu verkünden, dass die Türen vom Coworking Cologne Space offen sind. Wir sitzen schon seit einigen Wochen hier im Space und arbeiten zusammen mit anderen Coworkern am Aufbau vom Space hier in Köln-Deutz.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.ipernity.com/doc/koos/7806241&quot;&gt;&lt;img src=&quot;http://u1.ipernity.com/14/62/41/7806241.b2929b69.500.jpg&quot; width=&quot;500&quot; height=&quot;335&quot; alt=&quot;Hardworking&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Wir freuen uns auch auf zahlreichen Besuch ab Anfang Mai.&lt;/p&gt;
&lt;div class=&quot;feedflare&quot;&gt;
&lt;a href=&quot;http://feeds.feedburner.com/~ff/railslabs?a=jXQ1TP-oe4s:lWylCkQ3p58:yIl2AUoC8zA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/railslabs?d=yIl2AUoC8zA&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/railslabs?a=jXQ1TP-oe4s:lWylCkQ3p58:7Q72WNTAKBA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/railslabs?d=7Q72WNTAKBA&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/railslabs?a=jXQ1TP-oe4s:lWylCkQ3p58:V_sGLiPBpWU&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/railslabs?i=jXQ1TP-oe4s:lWylCkQ3p58:V_sGLiPBpWU&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;
&lt;/div&gt;</content>
		<author>
			<name>Railslove</name>
			<uri>http://railslove.com/weblog</uri>
		</author>
		<source>
			<title type="html">Railslove</title>
			<subtitle type="html">we love building web applications</subtitle>
			<link rel="self" href="http://feeds.feedburner.com/railslabs"/>
			<id>tag:railslabs.com,2007:mephisto/</id>
			<updated>2010-09-06T22:00:11+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Testing CSV Download With Cucumber</title>
		<link href="http://feedproxy.google.com/~r/railslabs/~3/-rusHPHK2BM/"/>
		<id>http://railslove.com/weblog/?p=607</id>
		<updated>2010-03-17T17:18:11+00:00</updated>
		<content type="html">&lt;p&gt;Thanks to Upstream for their blog post on &lt;a href=&quot;http://upstre.am/2009/02/14/testing-pdfs-with-cucumber-and-rails&quot;&gt;testing pdfs with cucumber&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Testing CSV download is exactly the same apart from that we do not need to turn the PDF to text, simply because&amp;#8230;it isn&amp;#8217;t a PDF&amp;#8230;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;(From &lt;a href=&quot;http://redwriteshere.com&quot;&gt;RedWritesHere&lt;/a&gt;)&lt;/p&gt;
&lt;div class=&quot;feedflare&quot;&gt;
&lt;a href=&quot;http://feeds.feedburner.com/~ff/railslabs?a=-rusHPHK2BM:n3IwEVSBpV8:yIl2AUoC8zA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/railslabs?d=yIl2AUoC8zA&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/railslabs?a=-rusHPHK2BM:n3IwEVSBpV8:7Q72WNTAKBA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/railslabs?d=7Q72WNTAKBA&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/railslabs?a=-rusHPHK2BM:n3IwEVSBpV8:V_sGLiPBpWU&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/railslabs?i=-rusHPHK2BM:n3IwEVSBpV8:V_sGLiPBpWU&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;
&lt;/div&gt;</content>
		<author>
			<name>Railslove</name>
			<uri>http://railslove.com/weblog</uri>
		</author>
		<source>
			<title type="html">Railslove</title>
			<subtitle type="html">we love building web applications</subtitle>
			<link rel="self" href="http://feeds.feedburner.com/railslabs"/>
			<id>tag:railslabs.com,2007:mephisto/</id>
			<updated>2010-09-06T22:00:11+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="de-de">
		<title type="html">“Digitaler Schimpfweltmeister”: DISSER für’s iPhone</title>
		<link href="http://feedproxy.google.com/~r/dopefreshtightblog/~3/GPTIH-uLqew/"/>
		<id>http://dennisbloete.de/?p=667</id>
		<updated>2010-03-07T13:42:46+00:00</updated>
		<content type="html">&lt;p&gt;Als &lt;a href=&quot;https://www.xing.com/profile/Stephan_Griesenbrock2&quot;&gt;Stephan Griesenbrock&lt;/a&gt; und &lt;a href=&quot;https://www.xing.com/profile/Daniel_Knobloch4&quot;&gt;Daniel Knobloch&lt;/a&gt; mir Ende letzten Jahres die Idee für ihre &lt;a href=&quot;http://disser-app.de/&quot;&gt;DISSER App&lt;/a&gt; für&amp;#8217;s iPhone (und iPod Touch) vorstellten war mir schon klar, dass die App ein sehr großes Potential hat: Ein schlüßiges Konzept um eine witzige und bislang so nicht umgesetzte Idee, eine gut zu erreichende Zielgruppe und angebrachte Sharing-Funktionen für soziale Netzwerke, so dass auch der Grundstein für eine virale Verbreitung gelegt ist. Aber damit, dass die App direkt so einschlagen würde, hat von &lt;a href=&quot;http://disser-app.de/team.php&quot;&gt;uns dreien&lt;/a&gt; selbst bei dem guten Feedback das wir von Freunden bekommen haben keiner gerechnet.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.disser-app.de/appstore/&quot;&gt;&lt;img class=&quot;align-right size-full wp-image-670&quot; title=&quot;disser_platz_1_itunes&quot; src=&quot;http://dennisbloete.de/wp-content/uploads/disser_platz_1_itunes.png&quot; alt=&quot;&quot; width=&quot;245&quot; height=&quot;187&quot; /&gt;&lt;/a&gt;Wir schreiben heute Tag 4 nach Livegang &lt;a href=&quot;http://www.disser-app.de/appstore/&quot;&gt;im App Store&lt;/a&gt; und der Disser hat sich bis ganz nach oben an Position 1 der meistverkauften Apps in Deutschland gepöbelt. Der helle Wahnsinn, vor allem weil es so schnell ging &amp;#8211; was aber wiederum der sehr Marketingarbeit der zwei Jungs aus Köln zu verdanken ist: Rund um den Disser wurde vor dem Livegang ein umfassendes Gesamtpaket inklusive &lt;a href=&quot;http://disser-app.de/&quot;&gt;Website&lt;/a&gt;, &lt;a href=&quot;http://disser-app.de/blog/&quot;&gt;Projektblog&lt;/a&gt;, &lt;a href=&quot;http://www.facebook.com/pages/Disser/241996562531&quot;&gt;Facebook Fan-Page&lt;/a&gt;, &lt;a href=&quot;http://disser-app.de/demovideo.php&quot;&gt;Marketing-Video&lt;/a&gt; und &lt;a href=&quot;http://disser-app.de/presse.php&quot;&gt;Pressematerial&lt;/a&gt; geschnürt, so dass die App nicht nur auf dem iPhone stattfindet. Schnell trudelten die ersten sehr guten Rezensionen und &lt;a href=&quot;http://www.youtube.com/watch?v=V1VVHAKDz3Y&amp;feature=related&quot;&gt;Video-Reviews&lt;/a&gt; ein: So schreibt beispielsweise iPhone-Junkie Carsten Scheibe im &lt;a href=&quot;http://www.stern.de/blog/95_iphone-junkie/archive/3579_disser_10_runzelige_speckbratze_.html&quot;&gt;Stern.de Blog&lt;/a&gt;: &amp;#8220;Der Disser ist eine überaus professionell umgesetzte Fun-App, die auf jedes iPhone und auf jeden iPod touch gehört.&amp;#8221;&lt;/p&gt;
&lt;p&gt;Auch das Feedback der Nutzer im App Store und auf der Website sind super: Viele wollen den Wortschatz des Dissers erweitert sehen und schlagen selbst &lt;a href=&quot;http://disser-app.de/diss-vorschlagen.php&quot;&gt;neue Wörter&lt;/a&gt; vor, so dass sich ein sehr kuriose und amüsante Liste von Vorschlägen ansammelt, die wir möglichst schnell mit einem neuen Update herausgeben werden. Wir sind gespannt auf die nächsten Tage, freuen uns über weitere Reviews und Vorschläge und bedanken uns bei allen Nutzern für&amp;#8217;s Herunterladen der App &amp;#8211; sowas macht echt Spaß! &lt;img src=&quot;http://dennisbloete.de/wp-includes/images/smilies/icon_smile.gif&quot; alt=&quot;:)&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/p&gt;</content>
		<author>
			<name>Dennis Bloete</name>
			<email>mail@dennisbloete.de</email>
			<uri>http://dennisbloete.de</uri>
		</author>
		<source>
			<title type="html">//dennisbloete</title>
			<subtitle type="html">Arbeit und Alltag eines Software-Entwicklers aus Bremen</subtitle>
			<link rel="self" href="http://feeds.feedburner.com/dopefreshtightblog/"/>
			<id>http://feeds.feedburner.com/dopefreshtightblog/</id>
			<updated>2010-09-06T07:40:13+00:00</updated>
			<rights type="html">©</rights>
		</source>
	</entry>

	<entry xml:lang="en-US">
		<title type="html">SimplyStored and CouchDB</title>
		<link href="http://blog.innerewut.de/2010/3/5/simplystored-and-couchdb"/>
		<id>tag:blog.innerewut.de,2010-03-05:856</id>
		<updated>2010-03-05T09:10:39+00:00</updated>
		<content type="html">&lt;p&gt;
  Yesterday I gave a presentation about CouchDB and &lt;a href=&quot;http://github.com/peritor/simply_stored&quot;&gt;SimplyStored&lt;/a&gt;, our convenience Ruby library, at the &lt;a href=&quot;http://www.rug-b.com&quot;&gt;Ruby User Group Berlin&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
There is a recording of the presentation at &lt;a href=&quot;http://www.ustream.tv/recorded/5184537&quot;&gt;ustream.tv&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;

&lt;/p&gt;
&lt;p&gt;
  &lt;a href=&quot;http://twitter.com/roidrage&quot;&gt;Mathias&lt;/a&gt; and I wrote SimplyStored in order to easily interact with Ruby objects serialized in CouchDB. We use CouchDB as the main data store for &lt;a href=&quot;http://scalarium.com&quot;&gt;Scalarium&lt;/a&gt; and so far it has been great. But it is a bit cumbersome to write all those map and reduce functions yourself.
&lt;/p&gt;
&lt;p&gt;
  SimplyStored generates the JavaScript map&amp;amp;reduce functions for handling associations or dynamic finders for you. 
&lt;/p&gt;
&lt;p&gt;
SimplyStored offers:
&lt;/p&gt;
&lt;p&gt;
  &lt;ul&gt;
    &lt;li&gt;Models&lt;/li&gt;
    &lt;li&gt;Associations&lt;/li&gt;
    &lt;li&gt;Callbacks&lt;/li&gt;
    &lt;li&gt;Validations&lt;/li&gt;
    &lt;li&gt;Dynamic finder&lt;/li&gt;
    &lt;li&gt;S3 attachments&lt;/li&gt;
    &lt;li&gt;Paranoid delete&lt;/li&gt;
  &lt;/ul&gt;
&lt;/p&gt;
&lt;p&gt;
  &lt;pre&gt;
    class User
      include SimplyStored::Couch

      property :login
      property :age
      property :accepted_terms_of_service, :type =&gt; :boolean
      property :last_login, :type =&gt; Time
    end

    user = User.new(:login =&gt; 'Bert', 
                    :age =&gt; 12, 
                    :accepted_terms_of_service =&gt; true, 
                    :last_login = Time.now)
    user.save

    User.find_by_age(12).login
    # =&gt; 'Bert'

    User.all
    # =&gt; [user]

    class Post
      include SimplyStored::Couch

      property :title
      property :body

      belongs_to :user
    end

    class User
      has_many :posts
    end

    post = Post.create(:title =&gt; 'My first post', 
                       :body =&gt; 'SimplyStored is so nice!', 
                       :user =&gt; user)

    user.posts
    # =&gt; [post]

    Post.find_all_by_title_and_user_id('My first post', user.id).first.body
    # =&gt; 'SimplyStored is so nice!'

    post.destroy

    user.posts(:force_reload =&gt; true)
    # =&gt; []
  &lt;/pre&gt;
&lt;/p&gt;
&lt;p&gt;
  The code is on github and OpenSource: &lt;a href=&quot;http://github.com/peritor/simply_stored&quot;&gt;SimplyStored&lt;/a&gt; &lt;a href=&quot;http://github.com/jweiss/simply_stored_examples&quot;&gt;example code&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
  Another thing I talked about is &lt;a href=&quot;http://github.com/jweiss/rocking_chair&quot;&gt;RockingChair&lt;/a&gt;. RockingChair is an in-memory CouchDB implementation that understands all of SimplyStored's functionality. We use it to speed up our tests and be able to run them in parallel.
&lt;/p&gt;
&lt;p&gt;
&lt;div&gt;&lt;strong&gt;&lt;a href=&quot;http://www.slideshare.net/jweiss/ruby-on-couchdb-simplystored-and-rockingchair&quot; title=&quot;Ruby on CouchDB - SimplyStored and RockingChair&quot;&gt;Ruby on CouchDB - SimplyStored and RockingChair&lt;/a&gt;&lt;/strong&gt;&lt;div&gt;View more &lt;a href=&quot;http://www.slideshare.net/&quot;&gt;presentations&lt;/a&gt; from &lt;a href=&quot;http://www.slideshare.net/jweiss&quot;&gt;Jonathan Weiss&lt;/a&gt;.&lt;/div&gt;&lt;/div&gt;
&lt;/p&gt;</content>
		<author>
			<name>Jonathan</name>
			<uri>http://blog.innerewut.de/</uri>
		</author>
		<source>
			<title type="html">BlogFish - Blog</title>
			<subtitle type="html">&lt;h1&gt;Application error (Apache)&lt;/h1&gt;
  &lt;p&gt;Change this error message for exceptions thrown outside of an action (like in Dispatcher setups or broken Ruby code) in public/500.html&lt;/p&gt;</subtitle>
			<link rel="self" href="http://blog.innerewut.de/feed/atom.xml"/>
			<id>tag:blog.innerewut.de,2010:mephisto/</id>
			<updated>2010-03-05T09:20:12+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en-US">
		<title type="html">Frozen Rails 2010</title>
		<link href="http://blog.innerewut.de/2010/2/13/frozen-rails-2010"/>
		<id>tag:blog.innerewut.de,2010-02-13:845</id>
		<updated>2010-03-05T08:54:23+00:00</updated>
		<content type="html">&lt;p&gt;
  Although Berlin looks a bit like Antarctica right now, I'm really looking forward to travel to Helsinki, Finland for &lt;a href=&quot;http://frozenrails.eu/&quot;&gt;Frozen Rails&lt;/a&gt; on May 7th.
&lt;/p&gt;
&lt;table&gt;
&lt;tr&gt;
  &lt;td&gt;
    &lt;a href=&quot;http://frozenrails.eu/&quot;&gt;
      
    &lt;/a&gt;
  &lt;/td&gt;
  &lt;td&gt;
    &lt;p&gt;
  Forzen Rails is organized by the guys from the &lt;a href=&quot;http://www.hhlinuxclub.org/&quot;&gt;HHLinuxCliub&lt;/a&gt; and &lt;a href=&quot;http://www.kiskolabs.com/&quot;&gt;Kisko Labs&lt;/a&gt;. I've met them in Amsterdam back in October and we had a great time. I'm sure Frozen Rails will be too.
&lt;/p&gt;
&lt;p&gt;
  They have a great line-up organized with speakers like Yehuda Katz, Chris Wanstrath, Joseph Wilk, Jarkko Laine, Mike Dirolf, or Nizar Jouini. The ticket prices are reasonable, starting with 99 Euro for the early bird tickets. They even have a &lt;a href=&quot;http://frozenrails.eu/news/4-how-to-get-a-free-ticket&quot;&gt;discount scheme&lt;/a&gt; that will give you a free ticket if you get 5 friends to sign-up.
&lt;/p&gt;
&lt;p&gt;
  Regional conferences like this are always a lot of fun as you meet a lot of local developers and the organizers are very passionate.
&lt;/p&gt;
&lt;p&gt;
  I hope to meet you at &lt;a href=&quot;http://frozenrails.eu/&quot;&gt;Frozen Rails 2010&lt;/a&gt; in Helsinki.
&lt;/p&gt;
  &lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;br /&gt;</content>
		<author>
			<name>Jonathan</name>
			<uri>http://blog.innerewut.de/</uri>
		</author>
		<source>
			<title type="html">BlogFish - Blog</title>
			<subtitle type="html">&lt;h1&gt;Application error (Apache)&lt;/h1&gt;
  &lt;p&gt;Change this error message for exceptions thrown outside of an action (like in Dispatcher setups or broken Ruby code) in public/500.html&lt;/p&gt;</subtitle>
			<link rel="self" href="http://blog.innerewut.de/feed/atom.xml"/>
			<id>tag:blog.innerewut.de,2010:mephisto/</id>
			<updated>2010-03-05T09:20:12+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Duplicate entries in resultset of a hibernate query</title>
		<link href="http://ruby.jazzanowak.de/duplicate-entries-in-resultset-of-a-hibernate-query/"/>
		<id>http://ruby.jazzanowak.de/duplicate-entries-in-resultset-of-a-hibernate-query/</id>
		<updated>2010-02-25T10:43:49+00:00</updated>
		<content type="html">&lt;p&gt;If you have duplicate entries in a resultset of a hibernate query, then this could be caused by a eager fetchmode. A result is to add a ResulTransformer to your query.&lt;/p&gt;
&lt;p&gt;Example:&lt;/p&gt;
&lt;pre&gt;Criteria criteria = getSession().createCriteria(Order.class);
criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);&lt;/pre&gt;
&lt;p&gt;More Infos here: &lt;a href=&quot;https://www.hibernate.org/117.html#A12&quot;&gt;https://www.hibernate.org/117.html#A12&lt;/a&gt;&lt;/p&gt;</content>
		<author>
			<name>Jazzanowak on Rails</name>
			<uri>http://ruby.jazzanowak.de</uri>
		</author>
		<source>
			<title type="html">Jazzanowak on Rails</title>
			<subtitle type="html">Daniel Nowak about Software Developing</subtitle>
			<link rel="self" href="http://feeds.feedburner.com/JazzanowakOnRails"/>
			<id>http://feeds.feedburner.com/JazzanowakOnRails</id>
			<updated>2010-02-25T11:00:07+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Notes on MongoDB</title>
		<link href="http://www.paperplanes.de/2010/2/25/notes_on_mongodb.html"/>
		<id>http://www.paperplanes.de/archives/2010/2/25/notes_on_mongodb/</id>
		<updated>2010-02-25T00:00:00+00:00</updated>
		<content type="html">&lt;p&gt;For an article in a German magazine I've been researching &lt;a href=&quot;http://mongodb.org&quot;&gt;MongoDB&lt;/a&gt; over the last week or so. While I didn't need a lot of the information I came across I collected some nicely distilled notes on some of its inner workings. You won't find information on how to get data out of or into MongoDB. The notes deal with the way MongoDB treats and handles your data, a high-low-level view if you will. I tried to keep them as objective as possible, but I added some commentary below.&lt;/p&gt;

&lt;p&gt;Most of this is distilled knowledge I gathered from the &lt;a href=&quot;http://www.mongodb.org/display/DOCS/Home&quot;&gt;MongoDB documentation&lt;/a&gt;, credit for making such a good resource available for us to read goes to the Mongo team. I added some of my own conclusion where it made sense. They're doing a great job documenting it, and I can highly recommend spending time to go through as much of it as possible to get a good overview of the whys and hows of MongoDB. Also, thanks to Mathias Stearn for hooking me up with some more details on future plans and inner workings in general. If you want to know more about its inner workings, there's a &lt;a href=&quot;http://blog.mongodb.org/post/404909201/mongodb-how-it-works-webinar&quot;&gt;webcast coming up&lt;/a&gt; where they're gonna explain how it works.&lt;/p&gt;

&lt;p&gt;Basics&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Name stems from humongous, though (fun fact) mongo has some unfortunate meanings in other languages than English (German for example)&lt;/li&gt;
&lt;li&gt;Written in C++.&lt;/li&gt;
&lt;li&gt;Lots of language drivers available, pushed and backed by the MongoDB team. Good momentum here.&lt;/li&gt;
&lt;li&gt;According to The Changelog Show (&lt;a href=&quot;http://thechangelog.com/post/287597162&quot;&gt;[1]&lt;/a&gt;) MongoDB was originally part of a cloud web development platform, and at some point was extracted from the rest, open sourced and turned into what it is today.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Collections&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Data in MongoDB is stored in collections, which in turn is stored in databases. Collections are a way of storing related data (think relational tables, but sans the schema). Collections contain documents which have in turn keys, another name for attributes.&lt;/li&gt;
&lt;li&gt;Data is limited to around 2 GB on 32-bit systems, because MongoDB uses memory-mapped files, as they're tied to the available memory addressing. (see &lt;a href=&quot;http://blog.mongodb.org/post/137788967/32-bit-limitations&quot;&gt;[2]&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Documents in collections usually have a similar data structure, but any arbitrary kind of document could be stored, similarity is recommended for index efficiency. Document's can have a maximum size of 4MB.&lt;/li&gt;
&lt;li&gt;Collections can be namespaced, i.e. logically nested: db.blog.posts, but the collection is still flat as far as MongoDB is concerned, purely an organizational means. Indexes created on a namespaced collection only seem to apply to the namespace they were created on though.&lt;/li&gt;
&lt;li&gt;A collection is physically created as soon as the first document is created in it.&lt;/li&gt;
&lt;li&gt;Default limit on number of namespaces per database is 24000 (includes all collections as they're practically the top level namespace in a database), which also includes indexes, so with the maximum of 40 indexes applied to each collection you could have 585 collections in a database. The default can be changed of course, but requires repairing the database if changed on an active instance.&lt;/li&gt;
&lt;li&gt;While you can put all your data into one single collection, from a performance point of view, it seems to make sense to separate them into different collections, because it allows MongoDB to keep its indexes clean, as they won't index attributes for totally unrelated documents.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Capped Collections&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Capped collections are fixed-size collections that automatically remove aged entries by LRU. Sounds fancier than it probably is, I'm thinking that documents are just appended at the last writing index, which is reset to 0 when limit of the collection is reached. Preferrable for insert-only use cases, updates of existing documents fail when the data size is larger than before the update. This makes sense because moving an object would destroy the natural insertion order. Limited to ~1GB on 32-bit systems, sky's the limit on 64-bit.&lt;/li&gt;
&lt;li&gt;Capped collections seem like a good tool for logging data, well knowing that old data is purged automatically, being replaced with new data when the limit is reached. Documents can't be deleted, only the entire collection can be dropped. Capped collections have no indexes on the _id by default, ensuring good write performance. Indexes generally not recommended to ensure high write performance. No index on _id means that walking the collection is preferred over looking up by a key.&lt;/li&gt;
&lt;li&gt;Documents fetched from a capped collection are returned in the order of their insertion, newest first, think log tailing.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Data Format&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Data is stored and queried in BSON, think binary-serialized JSON-like data. Features are a superset of JSON, adding support for regular expressions, date, binary data, and their own object id type. All strings are stored in UTF-8 in BSON, sorting on the other hand does not (yet), it uses strcmp, so the order might be different from what you'd expect. There's a sort of specification for BSON, if you're into that kind of stuff: &lt;a href=&quot;http://www.mongodb.org/display/DOCS/BSON&quot;&gt;[3]&lt;/a&gt; and &lt;a href=&quot;http://bsonspec.org&quot;&gt;[4]&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Documents are not identified by a simple ID, but by an object identifier type, optimized for storage and indexing. Uses machine identifier, timestamp and process id to be reasonably unique. That's the default, and the user is free to assign any value he wishes as a document's ID.&lt;/li&gt;
&lt;li&gt;MongoDB has a &quot;standard&quot; way of storing references to other documents using the DBRef type, but it doesn't seem to have any advantages (e.g. fetch associated objects with parent) just yet. Some language drivers can take the DBRef object and dereference it.&lt;/li&gt;
&lt;li&gt;Binary data is serialized in little-endian.&lt;/li&gt;
&lt;li&gt;Being a binary format, MongoDB doesn't have to parse documents like with JSON, they're a valid in-memory presentation already when coming across the wire.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;References&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Documents can embed a tree of associated data, e.g. tags, comments and the like instead of storing them in different MongoDB documents. This is not specific to MongoDB, but document databases in general (see &lt;a href=&quot;http://seancribbs.com/tech/2009/09/28/modeling-a-tree-in-a-document-database/&quot;&gt;[5]&lt;/a&gt;), but when using find you can dereference nested objects with the dot, e.g. blog.posts.comments.body, and index them with the same notation.&lt;/li&gt;
&lt;li&gt;It's mostly left to the language drivers to implement automatic dereferencing of associated documents.&lt;/li&gt;
&lt;li&gt;It's possible to reference documents in other databases.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Indexes&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Every document gets a default index on the _id attribute, which also enforces uniqueness. It's recommended to index any attribute that's being queried or sorted on.&lt;/li&gt;
&lt;li&gt;Indexes can be set on any attribute or embedded attributes and documents. Indexes can also be created on multiple attributes, additionally specifying a sort order.&lt;/li&gt;
&lt;li&gt;If an array attribute is indexed, MongoDB will indexed all the values in it (Multikeys).&lt;/li&gt;
&lt;li&gt;Unique keys are possible, missing attributes are set to null to ensure a document with the same missing attribute can only be stored once.&lt;/li&gt;
&lt;li&gt;If it can, MongoDB will only update indexes on keys that changed when updating a document, only if the document hasn't changed in size so much that it must be moved.&lt;/li&gt;
&lt;li&gt;MongoDB up to 1.2 creates and updates synchronously, 1.3 has support to update indexes in the background&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Updates&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Updates to documents are in-place, allowing for partial updates and atomic operations on attributes (set for all attributes, incr, decr on numbers, push, pop, pull et. al on arrays), also known as modifier operations. If an object grows out of the space originally allocated for it, it'll be moved, which is obviously a lot slower than updating in-place, since indexes need to be updated as well. MongoDB tries to adapt by allocating based on update history (see &lt;a href=&quot;http://blog.mongodb.org/post/248614779/fast-updates-with-mongodb-update-in-place&quot;&gt;[6]&lt;/a&gt;). Writes are lazy.&lt;/li&gt;
&lt;li&gt;Not using any modifier operation will result in the full document being updated.&lt;/li&gt;
&lt;li&gt;Updated can be done with criteria, so a whole bunch of matching documents. Think &quot;update ... where&quot; in SQL. This allows for updating objects based on a particular snapshot, i.e. update based on id and some value in the criteria will only update when the document still has that value. This kind of update is atomic. Reliably updating multiple documents atomically (think transaction) is not possible. There's also findAndModify in 1.3 (see &lt;a href=&quot;http://www.mongodb.org/display/DOCS/findandmodify+Command&quot;&gt;[7]&lt;/a&gt;) which allows atomically updating and returning a document.&lt;/li&gt;
&lt;li&gt;Upserts insert when a record with the given criteria doesn't exist, otherwise updates the found record. They're executed on the collection. A normal save() will do that automatically for any given document. Think find_or_create_by in ActiveRecord.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Querying&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Results are returned as cursors, walking a collection as it advances. Which explains why you potentially get records that needed to be moved, it pops up in a space that's potentially after its current position, if there's space even in a spot before the current cursor's position. Cursors are fetched in batches of 100 documents or 4 MB of data, whichever's reached first.&lt;/li&gt;
&lt;li&gt;That's also why it's better to store similar data in a separate collection. Traversing similar data is cheaper than traversing over totally unrelated data, the bigger the size of documents compared to the documents that match your find, the more data will have to be fetched from the database and skipped if it doesn't match your criteria.&lt;/li&gt;
&lt;li&gt;Data is returned in natural order which doesn't necessarily relate to insertion order, as data can be moved if it doesn't fit into its old spot anymore when updated. For capped collections, natural order is always insertion order.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Durability&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;By default, data in MongoDB is flushed to disk every 60 seconds. Writes to MongoDB (i.e. document creates, updates and deletes) are not stored on disk until the next sync. Tradeoff high write performance vs. durability. Need more durability, reduce sync delay. Closest comparison to the durability behaviour is MySQL's MyISAM.&lt;/li&gt;
&lt;li&gt;Data is not written transactional, so if the server is killed during a write operation, the data is likely to be inconsistent or even corrupted and needs repair. Think classic file systems like ext2 or MyISAM.&lt;/li&gt;
&lt;li&gt;In MongoDB 1.3 a database flush to disk can be enforced by sending the fsync command to the server.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Replication&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Replication is the recommended way of ensuring data durability and failover in MongoDB. A new (i.e. bare and dataless) instance can be hooked onto another at any time, doing an initial cloning of all data, fetching only updates after that.&lt;/li&gt;
&lt;li&gt;Replica pairs offers an auto-failover mechanism. Initially both settle on which is master and which is slave, the slave taking over should the master go down. Can be used e.g. in the Ruby driver using :left and :right options. There's an algorithm to handle changes when master and slave get out of sync, but it's not fully obvious to me (see &lt;a href=&quot;http://www.mongodb.org/display/DOCS/Pairing+Internals&quot;&gt;[8]&lt;/a&gt;). Replica Pairs will be replaced by Replica Sets, allowing for more than one slave. The slave with the most recent data will be promoted master in case of the master going down. The slaves agree which one of them is the new master, so a client could ask any one server in the set which one of them is the master.&lt;/li&gt;
&lt;li&gt;Replication is asynchronous, so updates won't propagate immediately to the slaves. There's ideas to require the right to be propagated to at least N slaves before returning the write to the client successfully (similar to the feature in MySQL 5.4). (see &lt;a href=&quot;http://blog.mongodb.org/post/381927266/what-about-durability&quot;&gt;[9]&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;A master collects its writes in an opslog on which the slaves simply poll for changes. The opslog is a capped collection and therefore not a fully usable transaction log (not written to disk?) as old data is purged automatically, hence not reliable for restoring the database after a crash.&lt;/li&gt;
&lt;li&gt;After initial clone, slaves poll once on the full opslog, subsequent polls remember the position where the previous poll ended.&lt;/li&gt;
&lt;li&gt;Replication is not transactional, so the durability of the data on the slave is prone to the same durability conditions as the master, just in a different and still durability-increasing manner, since having a slave allows to decrease sync times on it, and therefore shortening the timespan of data not being written to disk across the setup.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Caching&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;With the default storage engine, caching is basically handled by the operating system's virtual memory manager, since it uses memory-mapped files. File cache == Database cache&lt;/li&gt;
&lt;li&gt;Caching behaviour relies on the operating system, and can vary, not necessarily the same on every operating system.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Backup&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If you can live with a temporary write lock on your database, MongoDB 1.3 offers fsync with lock to take a reliable snapshot of the database's files.&lt;/li&gt;
&lt;li&gt;Otherwise, take the old school way of dumping the data using mongodump, or snapshotting/dumping from a slave database.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Storage&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Data is stored in subsequently numbered data files, each new one being larger than the former, 2GB being the maximum size a data file can have.&lt;/li&gt;
&lt;li&gt;Allocation of new datafiles doesn't seem to be exactly related to the amount of data currently being stored. E.g. storage size returned by MongoDB for a collection was 2874825392 bytes, but it had already created almost six gigabytes worth of database files. Maybe that's the result of padding space for records. I haven't found a clear documentation on this behaviour.&lt;/li&gt;
&lt;li&gt;When MongoDB moves data into a different spot or deletes documents, it keeps track of the free space to reuse in the future. The command repairDatabase() can be use to compact it, but that's a slow and blocking operation.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Concurrency&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;MongoDB refrains from using any kind of locking on data, it has no notion of a transaction or isolation levels. Concurrent writes will simply overwrite each other's data, as they go straight to memory. Exceptions are modifier operations that are guaranteed to be atomic. As there is no way to update multiple records in some sort of transaction, optimistic locking is not possible, at least in a fully reliable way. Since writes are in-place and in-memory first, they're wicked fast.&lt;/li&gt;
&lt;li&gt;Reads from the database are usually done in cursors, fetching a batch of documents lazily while iterating through it. If records in the cursors are updated while the cursor is being read from, the updated data may or may not show up. There's no kind of isolation level (as there are no locks or snapshotting). Deleted records will be skipped. If a record is updated from another process so that the size increases and the object has to be moved to another spot there's a chance it's returned twice.&lt;/li&gt;
&lt;li&gt;There's snapshot queries, but even they may or may not return inserted and deleted records. They do ensure that even updated records will be returned only once, but are slower than normal queries.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Memory&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;New data is allocated in memory first, increments seem to be fully related to the amount of data saved.&lt;/li&gt;
&lt;li&gt;MongoDB seems to be happy to hold on to whatever memory it can get, but at least during fsync it frees as much as possible. Sometimes it just went back to consuming about 512 MB real memory, other times it went down to just a couple of megs, I couldn't for the life of me make out a pattern.&lt;/li&gt;
&lt;li&gt;When a new database file needs to be created, it looks like MongoDB is forcing all data to be flushed to disk, freeing a dramatic amount of memory. On normal fsyncs, there's no real pattern as to how MongoDB frees memory.&lt;/li&gt;
&lt;li&gt;It's not obvious how a user can configure how much memory MongoDB can or should use, I guess it's not possible as of now. Memory-mapped files probably just use whatever's available, and be cleaned up automatically by the operating system's virtual memory system.&lt;/li&gt;
&lt;li&gt;The need to add an additional caching layer is reduced, as object and database representation is the same, and file system and memory cache can work together to speed up access, there's no data conversion involved, at least not on MongoDB's side, data will just be sent serialized and unparsed across the wire. Obviously it depends on the use case if this is really an advantage or a secondary caching layer is still needed.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;GridFS&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Overcomes the 4MB limit on documents by chunking larger binary objects into smaller bits.&lt;/li&gt;
&lt;li&gt;Can store metadata alongside file data. Metadata can be specified by the user and be arbitrary, e.g. contain access control information, tags, etc.&lt;/li&gt;
&lt;li&gt;Chunks can be randomly access, so it's possible to fetch data easily whose position in the file is well-known. If random access is required, makes sense to keep chunks small. Default size is 256K.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Protocol Access&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;MongoDB's protocol is binary and in its own right proprietary, hence they offer a lot of language drivers to take that pain away from developers, but also offer a full specification on both BSON and the protocol.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Sharding&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;MongoDB has alpha support for sharding. Its functionality shouldn't be confused with Riak's way of partitioning, it's a whole different story. The current functionality is far from what is planned for production, so take everything listed here with a grain of salt, it merely presents the current state. The final sharding feature is supposed to be free of the restrictions listed here.&lt;/li&gt;
&lt;li&gt;A shard ideally (but not necessarily) consists of two servers which form a replica pair, or a replica set in the future.&lt;/li&gt;
&lt;li&gt;All shards are known to a number of config server instances that also know how and where data is partitioned to.&lt;/li&gt;
&lt;li&gt;Data can be sharded by a specific key. That key can't be changed afterwards, neither can the key's value.&lt;/li&gt;
&lt;li&gt;Keys chosen should be granular enough so that there's the potential of having too many records with the same key. Data is split into chunks of 50 MB so with big documents, it's probably better to store them in GridFS, as a chunk can contain a minimum of ~12 documents when all take up the available space of 4 MB.&lt;/li&gt;
&lt;li&gt;Sharding is handled by a number of mongos instances which are connected to the shards which in turn are all known to a number of mongod config server instances. These can run on the same machines as the data-handling mongod instances, with the risk that when the servers go down they also disappear. Having backup services seems to be appropriate in this scenario.&lt;/li&gt;
&lt;li&gt;Sharding is still in alpha, e.g. currently replicated shards aren't supported in alpha 2, so a reliable sharding setup is currently not possible. If a shard goes down, the data on it is simply unavailable until it's brought back up. Until that happens, all reads will raise an error, even when looking up data that's known to be on the still available shards.&lt;/li&gt;
&lt;li&gt;There's no auto-balancing to move chunks to new shards, but that can be done manually.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There you go. If you have something to add or to correct, feel free to leave a comment. I'm happy to stand corrected should I have drawn wrong conclusions anywhere.&lt;/p&gt;

&lt;p&gt;As a user of CouchDB I gotta say, I was quite sceptical about some of MongoDB's approaches of handling data. Especially durability is something that I was worried about. But while I read through the documentation and played with MongoDB I realized that it's the same story as always: It depends. It's a problem when it's a problem. CouchDB and MongoDB don't necessarily cover the same set of use cases. There's enough use cases where the durability approach of MongoDB is acceptable compared to what you gain, e.g. in development speed, or speed when accessing data, because holy crap, that stuff is fast. There's a good reason for that, as I hope you'll agree after going through these notes. I'm glad I took the time to get to know it better, because the use cases kept popping up in my head where I would prefer it over CouchDB, which isn't always a sweet treat either.&lt;/p&gt;

&lt;p&gt;If you haven't already, do give MongoDB a spin, go through their documentation, throw data at it. It's a fun database, and the entrance barrier couldn't be lower. It's a good combination of relational database technologies, with schemaless and JavaScript sprinkled on top.&lt;/p&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/Paperplanes/~4/FVioVYp1N7E&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</content>
		<author>
			<name>paperplanes</name>
			<uri>http://www.paperplanes.de</uri>
		</author>
		<source>
			<title type="html">paperplanes</title>
			<subtitle type="html">software development that flies</subtitle>
			<link rel="self" href="http://feeds.feedburner.com/Paperplanes"/>
			<id>http://feeds.feedburner.com/Paperplanes</id>
			<updated>2010-09-03T16:40:18+00:00</updated>
			<rights type="html">Copyright 2007-2009</rights>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">CoworkingCologne startet am 1.März 2010</title>
		<link href="http://feedproxy.google.com/~r/railslabs/~3/d8d2vEFAnNo/"/>
		<id>http://railslove.com/weblog/?p=604</id>
		<updated>2010-02-22T19:48:15+00:00</updated>
		<content type="html">&lt;p&gt;Wie schon bei &lt;a href=&quot;http://zusammenarbeiten.wordpress.com/2010/02/22/coworkingcologne-startet-am-1-marz-2010/&quot;&gt;Peter angekündigt&lt;/a&gt;. Ab dem 01. März startet das erste in der Praxis umgesetzte CoworkingCologne Projekt. Details folgen in kürze.&lt;br /&gt;
&lt;img src=&quot;http://railslove.com/weblog/wp-content/uploads/2010/02/coworkingcologne1.gif&quot; alt=&quot;coworkingcologne1&quot; title=&quot;coworkingcologne1&quot; width=&quot;500px&quot; class=&quot;alignnone size-full wp-image-605&quot; /&gt;&lt;/p&gt;
&lt;div class=&quot;feedflare&quot;&gt;
&lt;a href=&quot;http://feeds.feedburner.com/~ff/railslabs?a=d8d2vEFAnNo:mhDt9N7eQBw:yIl2AUoC8zA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/railslabs?d=yIl2AUoC8zA&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/railslabs?a=d8d2vEFAnNo:mhDt9N7eQBw:7Q72WNTAKBA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/railslabs?d=7Q72WNTAKBA&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/railslabs?a=d8d2vEFAnNo:mhDt9N7eQBw:V_sGLiPBpWU&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/railslabs?i=d8d2vEFAnNo:mhDt9N7eQBw:V_sGLiPBpWU&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;
&lt;/div&gt;</content>
		<author>
			<name>Railslove</name>
			<uri>http://railslove.com/weblog</uri>
		</author>
		<source>
			<title type="html">Railslove</title>
			<subtitle type="html">we love building web applications</subtitle>
			<link rel="self" href="http://feeds.feedburner.com/railslabs"/>
			<id>tag:railslabs.com,2007:mephisto/</id>
			<updated>2010-09-06T22:00:11+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en-US">
		<title type="html">Just to prove I'm not dead,</title>
		<link href="http://feeds.jkraemer.net/~r/jkraemer/~3/aht7EleBV4M/just-to-prove-i-m-not-dead"/>
		<id>tag:www.jkraemer.net,2010-02-18:285</id>
		<updated>2010-02-19T14:32:30+00:00</updated>
		<content type="html">&lt;p&gt;I moved the ActsAsFerret wiki and issue tracker to &lt;a href=&quot;http://wiki.github.com/jkraemer/acts_as_ferret&quot;&gt;Github&lt;/a&gt; and &lt;a href=&quot;http://j-k.lighthouseapp.com/projects/45560-acts-as-ferret&quot;&gt;Lighthouse&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;It’s not that I don’t like Redmine any more, but unfortunately it caused me trouble bringing the whole server to a halt every few weeks. I think I could have fixed that somehow but I feel that hosting Redmine isn’t one of my core competences…&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Update&lt;/em&gt;:
Here’s &lt;a href=&quot;http://github.com/jkraemer/rm2lighthouse&quot;&gt;the script&lt;/a&gt; I used to import the existing Redmine Tickets into Lighthouse.&lt;/p&gt;
          &lt;img src=&quot;http://feeds.feedburner.com/~r/jkraemer/~4/aht7EleBV4M&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</content>
		<author>
			<name>jk</name>
			<uri>http://www.jkraemer.net/</uri>
		</author>
		<source>
			<title type="html">jkraemer.net - Blog</title>
			<subtitle type="html">&lt;div id=&quot;site_container&quot;&gt;
		&lt;div id=&quot;site_header&quot;&gt;
			&lt;ul class=&quot;corporate_identity &quot;&gt;
				&lt;li class=&quot;logo&quot;&gt;&lt;a href=&quot;http://www.modrails.com&quot;&gt;&lt;span&gt;Phusion Passenger&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
			&lt;/ul&gt;
		&lt;/div&gt;
		&lt;div id=&quot;site_body&quot;&gt;
			
&lt;h1 class=&quot;error_title&quot;&gt;Internal server error&lt;/h1&gt;
&lt;div id=&quot;content&quot;&gt;
	
	Passenger encountered the following error:
	
	&lt;p&gt;
		The application spawner server exited unexpectedly
	&lt;/p&gt;
	
	&lt;dl&gt;
	&lt;dt&gt;Exception class:&lt;/dt&gt;
	&lt;dd&gt;Passenger::Railz::ApplicationSpawner::Error&lt;/dd&gt;
	
	&lt;dt&gt;Backtrace:&lt;/dt&gt;
	&lt;dd&gt;
		
			&lt;table class=&quot;backtrace&quot;&gt;
			&lt;tr class=&quot;headers&quot;&gt;
				&lt;th&gt;#&lt;/th&gt;
				&lt;th&gt;File&lt;/th&gt;
				&lt;th&gt;Line&lt;/th&gt;
				&lt;th&gt;Location&lt;/th&gt;
			&lt;/tr&gt;
		
				&lt;tr class=&quot;backtrace_line passenger uneven&quot;&gt;
					&lt;td class=&quot;index&quot;&gt;0&lt;/td&gt;
					&lt;td class=&quot;filename&quot;&gt;/opt/ruby-enterprise-1.8.6-20080810/lib/ruby/gems/1.8/gems/passenger-2.0.3/lib/passenger/railz/application_spawner.rb&lt;/td&gt;
					&lt;td class=&quot;line&quot;&gt;109&lt;/td&gt;
					&lt;td class=&quot;location&quot;&gt;in `spawn_application'&lt;/td&gt;
				&lt;/tr&gt;
			
				&lt;tr class=&quot;backtrace_line passenger even&quot;&gt;
					&lt;td class=&quot;index&quot;&gt;1&lt;/td&gt;
					&lt;td class=&quot;filename&quot;&gt;/opt/ruby-enterprise-1.8.6-20080810/lib/ruby/gems/1.8/gems/passenger-2.0.3/lib/passenger/spawn_manager.rb&lt;/td&gt;
					&lt;td class=&quot;line&quot;&gt;228&lt;/td&gt;
					&lt;td class=&quot;location&quot;&gt;in `spawn_rails_application'&lt;/td&gt;
				&lt;/tr&gt;
			
				&lt;tr class=&quot;backtrace_line passenger uneven&quot;&gt;
					&lt;td class=&quot;index&quot;&gt;2&lt;/td&gt;
					&lt;td class=&quot;filename&quot;&gt;/opt/ruby-enterprise-1.8.6-20080810/lib/ruby/gems/1.8/gems/passenger-2.0.3/lib/passenger/spawn_manager.rb&lt;/td&gt;
					&lt;td class=&quot;line&quot;&gt;213&lt;/td&gt;
					&lt;td class=&quot;location&quot;&gt;in `synchronize'&lt;/td&gt;
				&lt;/tr&gt;
			
				&lt;tr class=&quot;backtrace_line passenger even&quot;&gt;
					&lt;td class=&quot;index&quot;&gt;3&lt;/td&gt;
					&lt;td class=&quot;filename&quot;&gt;/opt/ruby-enterprise-1.8.6-20080810/lib/ruby/gems/1.8/gems/passenger-2.0.3/lib/passenger/spawn_manager.rb&lt;/td&gt;
					&lt;td class=&quot;line&quot;&gt;213&lt;/td&gt;
					&lt;td class=&quot;location&quot;&gt;in `spawn_rails_application'&lt;/td&gt;
				&lt;/tr&gt;
			
				&lt;tr class=&quot;backtrace_line passenger uneven&quot;&gt;
					&lt;td class=&quot;index&quot;&gt;4&lt;/td&gt;
					&lt;td class=&quot;filename&quot;&gt;/opt/ruby-enterprise-1.8.6-20080810/lib/ruby/gems/1.8/gems/passenger-2.0.3/lib/passenger/spawn_manager.rb&lt;/td&gt;
					&lt;td class=&quot;line&quot;&gt;122&lt;/td&gt;
					&lt;td class=&quot;location&quot;&gt;in `spawn_application'&lt;/td&gt;
				&lt;/tr&gt;
			
				&lt;tr class=&quot;backtrace_line passenger even&quot;&gt;
					&lt;td class=&quot;index&quot;&gt;5&lt;/td&gt;
					&lt;td class=&quot;filename&quot;&gt;/opt/ruby-enterprise-1.8.6-20080810/lib/ruby/gems/1.8/gems/passenger-2.0.3/lib/passenger/spawn_manager.rb&lt;/td&gt;
					&lt;td class=&quot;line&quot;&gt;247&lt;/td&gt;
					&lt;td class=&quot;location&quot;&gt;in `handle_spawn_application'&lt;/td&gt;
				&lt;/tr&gt;
			
				&lt;tr class=&quot;backtrace_line passenger uneven&quot;&gt;
					&lt;td class=&quot;index&quot;&gt;6&lt;/td&gt;
					&lt;td class=&quot;filename&quot;&gt;/opt/ruby-enterprise-1.8.6-20080810/lib/ruby/gems/1.8/gems/passenger-2.0.3/lib/passenger/abstract_server.rb&lt;/td&gt;
					&lt;td class=&quot;line&quot;&gt;317&lt;/td&gt;
					&lt;td class=&quot;location&quot;&gt;in `__send__'&lt;/td&gt;
				&lt;/tr&gt;
			
				&lt;tr class=&quot;backtrace_line passenger even&quot;&gt;
					&lt;td class=&quot;index&quot;&gt;7&lt;/td&gt;
					&lt;td class=&quot;filename&quot;&gt;/opt/ruby-enterprise-1.8.6-20080810/lib/ruby/gems/1.8/gems/passenger-2.0.3/lib/passenger/abstract_server.rb&lt;/td&gt;
					&lt;td class=&quot;line&quot;&gt;317&lt;/td&gt;
					&lt;td class=&quot;location&quot;&gt;in `main_loop'&lt;/td&gt;
				&lt;/tr&gt;
			
				&lt;tr class=&quot;backtrace_line passenger uneven&quot;&gt;
					&lt;td class=&quot;index&quot;&gt;8&lt;/td&gt;
					&lt;td class=&quot;filename&quot;&gt;/opt/ruby-enterprise-1.8.6-20080810/lib/ruby/gems/1.8/gems/passenger-2.0.3/lib/passenger/abstract_server.rb&lt;/td&gt;
					&lt;td class=&quot;line&quot;&gt;168&lt;/td&gt;
					&lt;td class=&quot;location&quot;&gt;in `start_synchronously'&lt;/td&gt;
				&lt;/tr&gt;
			
				&lt;tr class=&quot;backtrace_line passenger even&quot;&gt;
					&lt;td class=&quot;index&quot;&gt;9&lt;/td&gt;
					&lt;td class=&quot;filename&quot;&gt;/opt/ruby-enterprise-1.8.6-20080810/lib/ruby/gems/1.8/gems/passenger-2.0.3/bin/passenger-spawn-server&lt;/td&gt;
					&lt;td class=&quot;line&quot;&gt;46&lt;/td&gt;
					&lt;td class=&quot;location&quot;&gt;&lt;/td&gt;
				&lt;/tr&gt;
			&lt;/table&gt;

	&lt;/dd&gt;
	&lt;/dl&gt;

&lt;/div&gt;

		&lt;/div&gt;
		&lt;div id=&quot;site_footer&quot;&gt;
			
			&lt;div class=&quot;container&quot;&gt;
				Powered by &lt;a href=&quot;http://www.modrails.com/&quot;&gt;Phusion Passenger&lt;/a&gt;,
				&lt;tt&gt;mod_rails&lt;/tt&gt; / &lt;tt&gt;mod_rack&lt;/tt&gt; for Apache.
			&lt;/div&gt;
		&lt;/div&gt;
	&lt;/div&gt;</subtitle>
			<link rel="self" href="http://www.jkraemer.net/feed/atom.xml"/>
			<id>tag:www.jkraemer.net,2010:mephisto/</id>
			<updated>2010-08-30T22:40:03+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">5 Tipps für deine nächste Threadless-Bestellung (Zoll, Packstation, Versandkosten)</title>
		<link href="http://feedproxy.google.com/~r/flyingsparks/posts/~3/BqVJExKPwYI/"/>
		<id>http://fly.ingsparks.de/?p=765</id>
		<updated>2010-02-17T20:20:22+00:00</updated>
		<content type="html">&lt;p&gt; 	Ich liebe &lt;a href=&quot;http://www.threadless.com/&quot;&gt;Threadless&lt;/a&gt;. Das Interface, die Feature (zeige mir nur, was mir passt und verf&amp;#252;gbar ist), den Support, die Kultur und nat&amp;#252;rlich allen voran die T-Shirts selbst. Tolle Qualit&amp;#228;t mit den besten Motiven weit und breit.&lt;/p&gt;
&lt;p&gt;Aber wer aus Deutschland bei Theadless bestellt, braucht leider etwas Hintergrundwissen:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Die wichtigsten allgemeinen Regeln:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Nie an Packstation schicken lassen! Warum? &amp;#8212; Kurz gesagt, kommt&amp;#039;s dann nicht an!&lt;/li&gt;
&lt;li&gt;Sammelbestellungen sind nicht wirklich ideal wegen des Zolls!&lt;/li&gt;
&lt;li&gt;Wenn das P&amp;#228;ckchen zu dick aussieht (oder sonst was), wird es einkassiert und ihr m&amp;#252;sst es beim Zoll abholen (Umsatzsteuer + meist nervig weiter Weg).&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Was ihr &amp;#252;ber den Zoll wissen m&amp;#252;sst:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Disclaimer: Diese Angaben basieren auf meiner eigenen Erfahrung beim Zoll in K&amp;#246;ln und d&amp;#252;rfen gerne in den Kommentaren korrigiert werden! Danke!&lt;/p&gt;
&lt;p&gt;Diese Grenzwerte sind wichtig. Und damit es nicht zu einfach ist, gelten f&amp;#252;r Zoll und Umsatzsteuer unterschiedliche Grenzwerte.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Reiner Warenwert &amp;gt;   22 € = 19 % Umsatzsteuer &amp;#8212; basierend auf vollen Wert inkl. Versandkosten &lt;span&gt;(Oder war es genau andersrum exkl. Versandkosten? Wer kann helfen?)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;Reiner Warenwert &amp;lt; 150 € = kein Zoll&lt;/li&gt;
&lt;li&gt;Reiner Warenwert &amp;gt; 150 € = 12 % Zoll da Textilien&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Daraus ergeben sich f&amp;#252;r den Threadless-Besteller  drei Szenarien:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Zoll merk&amp;#039;s nicht = 0 €&lt;/li&gt;
&lt;li&gt;Zoll merk&amp;#039;s aber &amp;lt; 150 € = Umsatzsteuer nachzahlen &lt;span&gt;(Das sind &amp;#252;brigens &lt;a href=&quot;http://www.google.de/search?hl=de&amp;q=150%20%E2%82%AC%20in%20%24&amp;meta=&amp;aq=f&amp;oq=&quot;&gt;205 $&lt;/a&gt;.)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;Zoll merk&amp;#039;s und &amp;gt; 150 € = Umsatzsteuer + Textil-Zoll (nach)zahlen&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Diese Regeln gelten, wenn man Waren von einer Firma bezieht. Die &lt;a href=&quot;http://www.threadless.com/submission/16576/That_s_All_Fox/showmore,designs&quot;&gt;schlauen F&amp;#252;chse&lt;/a&gt; unter euch werden jetzt fragen, wie es denn mit Geschenken aussieht, die sind irgendwie zollfrei. Doch wie auch der verlinkte Fuchs wirst auch du es damit nicht ins Ziel schaffen. Laut der netten Dame im Zoll K&amp;#246;ln lassen Sie P&amp;#228;ckchen nur als Geschenke durchgehen, wenn sie offensichtlich ein Privatgeschenk sind mit Geburtstagskarte drin. Im &amp;#220;brigen gelten dann andere Grenzen von 44 € f&amp;#252;r die Umsatzsteuer und ein reduzierter Satz von 17,5 % oder so. Nagelt mich nicht drauf fest.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Welche ist also das ideale Verh&amp;#228;ltnis von Anzahl Shirts zu Gesamtkosten zu Versandkosten zu Zoll/Umsatzsteuer?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Keine Ahnung :-). &lt;del datetime=&quot;2010-02-20T17:31:48+00:00&quot;&gt;Aber hier d&amp;#252;rfen gern die Formel-Fans unter euch einschreiten und ein paar Rechenbeispiele auff&amp;#252;hren.&lt;/del&gt;&lt;/p&gt;
&lt;p&gt;&lt;del datetime=&quot;2010-02-20T17:31:48+00:00&quot;&gt;Unter den 22 € zu bleiben (im Szenario exkl. Versandkosten, s.o.) lohnt sich meiner Meinung nach nicht, in Relation zu den Versandkosten, weil man f&amp;#252;r 22 € ja selbst von den g&amp;#252;nstigen Shirts nur 2-3 bekommt.&lt;/del&gt;&lt;/p&gt;
&lt;p&gt;&lt;ins datetime=&quot;2010-02-20T17:31:48+00:00&quot;&gt;Aber &lt;a href=&quot;http://twitter.com/AndiH/status/9390966999&quot;&gt;Andreas&lt;/a&gt; hat &lt;a href=&quot;http://bit.ly/cg7PJ1&quot;&gt;ein sehr cooles GoogleSpreadsheed&lt;/a&gt; erstellt. Danach ist das Beste Kostenverh&amp;#228;lnis bei 7 Shirts (15 $ Versand).&lt;/ins&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Tipps f&amp;#252;r euren Zollbesuch:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Wenn eure Bestellung viel l&amp;#228;nger auf sich warten l&amp;#228;sst, als sie sollte, kann das zwei Gr&amp;#252;nde haben: Sie ist zum Zoll umgeleitet worden oder verloren gegangen (beides erlebt). Bei diesen beiden M&amp;#246;glichkeiten ist es dann eine Erleichterung, endlich die kleine Hinweispostkarte zu bekommen, die einen bittet, sein P&amp;#228;ckchen vom Zoll abzuholen.&lt;/p&gt;
&lt;p&gt;Hier, was ich gelernt habe:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Die &amp;#214;ffnungszeiten sind&amp;#8230; eigen (7:30-15 Uhr)&lt;/li&gt;
&lt;li&gt;Wenn man auf die Klingel dr&amp;#252;ckt, kommt wirklich irgendwann jemand zu einem, auch wenn das Geb&amp;#228;ude sonst verlassen wirkt&lt;/li&gt;
&lt;li&gt;Es dauert &amp;#034;nur&amp;#034; 2 Stunden von K&amp;#246;ln Ehrenfeld nach Wahn und zur&amp;#252;ck&amp;#8230;&lt;/li&gt;
&lt;li&gt;Laut Zoll-Infozettel muss man nach 7 Tagen eine Lagerungsgeb&amp;#252;hr zahlen. Mir wurde sie zum Gl&amp;#252;ck nicht berechnet (ein Woche zu sp&amp;#228;t).&lt;/li&gt;
&lt;li&gt;Packstation: Ich werde nicht noch einmal etwas, das potentiell beim Zoll landen k&amp;#246;nnten an eine Packstation schicken. Auf meinem Paket war die Packstationsadresse durchgestrichen und meine richtige Adresse notiert. Ich vermute, dieser Schritt hat zus&amp;#228;tzlich Zeit gekostet&amp;#8230;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Zum Schluss jetzt noch ein wichtiger Tipp f&amp;#252;r Packstations-Nutzer:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Threadless + Packstation = B&amp;#246;se!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Offensichtlich muss man die Formel sogar weiter spannen: Grunds&amp;#228;tzlich scheint es keine gute Idee zu sein, aus dem Ausland an eine Packstation senden zu lassen.&lt;/p&gt;
&lt;p&gt;Meine eigene Erfahrung: Eine gro&amp;#223;e Threadless-Bestellung an die Packstation ist erst ewig sp&amp;#228;ter angekommen. Diese musste ich vom Zoll abholen, habe sie aber bekommen. Danach habe ich noch einmal etwas bestellt mit den gleichen Adressdaten. Das ist nie angekommen. Threadless konnte mir nicht helfen, weil sie keine Trackinginformationen haben f&amp;#252;r Auslandspakete. Sie waren aber sehr zuvorkommend und haben mir sp&amp;#228;ter die Bestellung ersetzt (ich konnte w&amp;#228;hlen: Shirts neu schicken, Geld zur&amp;#252;ck oder Gutschein &amp;#8212; ein toller Service!). In dieser Zeit habe ich auf der Packstationshomepage rumgesucht und @packstation per Twitter gefragt aber nirgendwo Angaben zum Empfang von Paketen aus dem Ausland gefunden. Es sollte also klappen? Nein, die Frau an der Hotline sagte direkt, dass Pakete aus dem Ausland &amp;#034;selbstverst&amp;#228;ndlich&amp;#034; nicht ankommen k&amp;#246;nnen, da sie ja nicht &amp;#252;ber DHL verschickt werden. &amp;#196;tzend! Vor allem die Informationspolitik der Packstation hierzu. Ich hoffe, Threadless nimmt meinen Vorschlag auf und warnt demn&amp;#228;chst bei der Eingabe eine Packstationsadresse im Interface…&lt;/p&gt;
&lt;p&gt;Wer mehr zu Packstation wei&amp;#223;: Bitte nutzt die Kommentare!&lt;/p&gt;
&lt;p&gt;Und jetzt viel Spa&amp;#223; beim Shirtkauf!&lt;/p&gt;</content>
		<author>
			<name>flyingsparks</name>
			<uri>http://fly.ingsparks.de</uri>
		</author>
		<source>
			<title type="html">flyingsparks</title>
			<subtitle type="html">User Experience • User Centered Design • Interfacedesign • Webapplikationen</subtitle>
			<link rel="self" href="http://fly.ingsparks.de/feed/"/>
			<id>http://fly.ingsparks.de/feed/</id>
			<updated>2010-08-02T14:20:13+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Mozilla Labs Design Challenge: 5 of 5 Designs fail</title>
		<link href="http://feedproxy.google.com/~r/flyingsparks/posts/~3/nPpmRI44N1M/"/>
		<id>http://fly.ingsparks.de/?p=761</id>
		<updated>2010-02-17T18:57:32+00:00</updated>
		<content type="html">&lt;p&gt; 	Mozilla Labs &lt;a href=&quot;http://twitter.com/mozconcept/status/9244615819&quot;&gt;just asked everyone&lt;/a&gt; to vote for their favorite concept of the new home tab.&lt;/p&gt;
&lt;p&gt;This is the last step of the Mozilla Labs Design Challenge in which users where asked to illustrate their ideas of the Hometab (&lt;a href=&quot;http://mozillalabs.com/conceptseries/2010/02/17/design_challenge-peoples_choice_voting/&quot;&gt;Read more about it&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;You may &lt;a href=&quot;http://design-challenge.mozillalabs.com/winter09/vote/index.php&quot;&gt;have a look at the 5 results&lt;/a&gt; after you added your eMail-Address to register yourself for voting.&lt;/p&gt;
&lt;p&gt;This is why I am writing about it: I am sorry to say it but in my opinion all five designs fail to show a good, easy, usable concept for the hometab. I am sure everyone who contributed spend some time on their ideas (and the video they created for it) and that is a great contribution to the community (thanks!).&lt;/p&gt;
&lt;p&gt;But from a UX and usability point of view those designs don&amp;#039;t show a solution. Instead they are great examples of how to clutter an interface with tons of features and loose all simplicity in this process.&lt;/p&gt;
&lt;p&gt;At least I dont see my hometab as a dashboard of widgets that show and pull tons of information on a small space, as one contribution suggested. If you want this, make your Netvibes Page or iGoogle Page your homepage. Or add yourself a weather-widget to you operation system. Dont look at the hometab as if there where no OS, Widgets and Apps around your browser. At least not until Chrome OS rules us all.&lt;/p&gt;
&lt;p&gt;And I dont want it to be a copy of my social networks as well. I have my Tweet-App, Newsreader and all the other good apps for that. None of those apps could be as good as the apps that are already out there for years with their own community an user base. Try using Flock &amp;#034;the social browser&amp;#034; that no one uses.&lt;/p&gt;
&lt;p&gt;And I dont want a hometab that changes every time I visit a website. Even Microsoft got it know that formulas that try to adapt to users behavior are much less effective than a UI that reinforces habits. When I am used to seeing my facebook-link at the bottom of the list I will find it there without thinking. Dont move everything around just because I use it.&lt;/p&gt;
&lt;p&gt;That being said I voted with one 1 and four 0 on the challenge and hope, the UI-experts at mozilla will take over from here.&lt;/p&gt;
&lt;p&gt;Its will be interesting to see if this kind of open source design will produce any mentionable results in the future. And how this design challenge will influence the community-process.&lt;/p&gt;</content>
		<author>
			<name>flyingsparks</name>
			<uri>http://fly.ingsparks.de</uri>
		</author>
		<source>
			<title type="html">flyingsparks</title>
			<subtitle type="html">User Experience • User Centered Design • Interfacedesign • Webapplikationen</subtitle>
			<link rel="self" href="http://fly.ingsparks.de/feed/"/>
			<id>http://fly.ingsparks.de/feed/</id>
			<updated>2010-08-02T14:20:13+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">A Collection Of Redis Use Cases</title>
		<link href="http://www.paperplanes.de/2010/2/16/a_collection_of_redis_use_cases.html"/>
		<id>http://www.paperplanes.de/archives/2010/2/16/a_collection_of_redis_use_cases/</id>
		<updated>2010-02-16T00:00:00+00:00</updated>
		<content type="html">&lt;p&gt;I'm gonna eat &lt;a href=&quot;http://www.paperplanes.de/2010/2/15/nosql_and_you_finding_the_right_partner.html&quot;&gt;my own dog food&lt;/a&gt; here, and start you off with a collection of links and ideas of people using &lt;a href=&quot;http://code.google.com/p/redis/&quot;&gt;Redis&lt;/a&gt;. Redis' particular way of treating data requires some rethinking how to store your data to benefit from speed, atomicity and its data types. I've already written about &lt;a href=&quot;http://www.paperplanes.de/2009/10/27/theres_something_about_redis.html&quot;&gt;Redis&lt;/a&gt; &lt;a href=&quot;http://www.paperplanes.de/2009/10/30/how_to_redis.html&quot;&gt;in&lt;/a&gt; &lt;a href=&quot;http://www.paperplanes.de/2009/10/29/when_to_redis.html&quot;&gt;abundance&lt;/a&gt;, this post's purpose is to compliment them with real-world scenarios. Maybe you can gather some ideas on how to deal with things.&lt;/p&gt;

&lt;p&gt;There's a couple of well-known use cases already, the most popular of them being &lt;a href=&quot;http://github.com/defunkt/resque/&quot;&gt;Resque&lt;/a&gt;, a worker queue. &lt;a href=&quot;http://github.com/gleicon/restmq&quot;&gt;RestMQ&lt;/a&gt;, an HTTP-based worker queue using Redis, was just recently released too. Both don't make use yet of the rather new blocking pop commands like &lt;a href=&quot;http://github.com/ezmobius/redactor&quot;&gt;Redactor&lt;/a&gt; does, so there's still room for improvement, and to make them even more reliable.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://ohm.keyvalue.org/&quot;&gt;Ohm&lt;/a&gt; is a library to store objects in Redis. While I'm not sure I'd put this layer of abstraction on top of it, it's well worth looking at the code to get inspiration. Same is true for &lt;a href=&quot;http://github.com/BrianTheCoder/redis-types&quot;&gt;redis-types&lt;/a&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href=&quot;http://code.google.com/p/redis/wiki/TwitterAlikeExample&quot;&gt;A Twitter Clone using Redis&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This should be the first one to check out, very detailed example on how you could implement a Twitter clone using Redis and PHP. Twitter clones using Redis are all the rage these days, there's also a &lt;a href=&quot;http://github.com/danlucraft/retwis-rb&quot;&gt;clone of the original clone written in Ruby&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href=&quot;http://ozmm.org/posts/sort_in_redis.html&quot;&gt;Sort in Redis&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;An instant classic. Some examples on how to use sorting in Redis.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href=&quot;http://www.lukemelia.com/blog/archives/2010/01/17/redis-in-practice-whos-online/&quot;&gt;Redis in Practice: Who's Online?&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Great and distilled example of how to utilize set intersections and unions to find out which people are online at a given minute.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href=&quot;http://www.digitalhobbit.com/2009/11/08/building-a-twitter-filter-with-sinatra-redis-and-tweetstream/&quot;&gt;Building a Twitter Filter with Sinatra, Redis, and Tweetstream&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Exactly what the title says. Examples of using lists to store tweets marshalled using JSON.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href=&quot;http://techno-weenie.net/2010/2/3/where-s-waldo-track-user-locations-with-node-js-and-redis&quot;&gt;Where's Waldo: Track user locations with Node.js and Redis&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Redis and Node.js seem to be a great match, be sure to check out the &lt;a href=&quot;http://github.com/technoweenie/wheres-waldo&quot;&gt;source&lt;/a&gt; too. Similar to the one above, different implementation. Be sure to read the prequel &lt;a href=&quot;http://techno-weenie.net/2010/1/15/node-js-for-my-tiny-ruby-brain&quot;&gt;&quot;Node.js For My Tiny Ruby Brain&quot;&lt;/a&gt; too, some more code in there.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href=&quot;http://www.dorkalev.com/2010/02/sikwamic-simple-key-value-with-comet.html&quot;&gt;Sikwamic: Simple Key-Value With Comet&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Comet and Redis, sitting in a tree.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Redis' simplicity, atomicity and speed make it an excellent tool when tracking things directly from the web, e.g. through WebSockets or Comet. If you can use it asynchronously, all the better.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href=&quot;http://www.mrkris.com/2009/10/28/affiliate-click-tracking-with-rack-and-redis-because-i-care/&quot;&gt;Affiliate Click Tracking with Rack and Redis&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Simple approach to tracking clicks, I probably wouldn't use a list for all clicks, but instead have one for each path, but there's always several ways to get to your goal with Redis. Not exactly the same, but &lt;a href=&quot;http://github.com/jpoz/almaz&quot;&gt;Almaz&lt;/a&gt; can track URLs visited by users in Rails applications.&lt;/p&gt;

&lt;p&gt;Update: Turns out that the affiliate click tracking code above, the list is only used to push clicks into a queue, where they're popped off and handled by a worker, as pointed out by Kris in the comments.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href=&quot;http://streamhacker.com/2009/05/20/building-a-nltk-freqdist-on-redis/&quot;&gt;Building a NLTK FreqDist on Redis&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Calculation of frequency distribution, with data stored in Redis.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href=&quot;http://gist.github.com/296921&quot;&gt;Gemcutter: Download Statistics&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The RubyGems resource par excellence is going to use Redis's sorted sets to track daily download statistics. While just a proposals, the ideas are well applicable to all sorts of statistics being tracked in today's web applications.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href=&quot;http://oxfordrepo.blogspot.com/2010/01/usage-stats-and-redis.html&quot;&gt;Usage stats and Redis&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;More on tracking views statistics with Redis.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href=&quot;http://vanity.labnotes.org/&quot;&gt;Vanity - Experiment Driven Development&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Split testing tool based on Redis to integrate in your Rails application. Another kind of tracking statistics. If you didn't realize it up to now, Redis is an excellent tool for this kind of application. Data that you wouldn't want to load off to your main database, because let's face it, it's got enough crap to do already.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href=&quot;http://www.igvita.com/2010/01/06/flow-analysis-time-based-bloom-filters/&quot;&gt;Flow Analysis &amp;amp; Time-based Bloom Filters&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Streaming data analysis for the masses.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href=&quot;http://simonwillison.net/2009/Dec/20/crowdsourcing/&quot;&gt;Crowdsourced document analysis and MP expenses&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;While being more prose than code, it still shows areas where Redis is a much better choice than e.g. MySQL.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Using Redis to store any suitable kind of statistics is pretty much an immediate use case for a lot of web applications. I could think of several projects I've work on that could gain something from using certain parts of their application to Redis. It's the kind of data you just don't want to clutter your database with. Clicks, view, history and all that stuff puts an unnecessary amount of data and load on it. The more data it accumulates, the harder it will be to get rid off, especially in MySQL.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href=&quot;http://gist.github.com/86714&quot;&gt;Simple Note Keeping with Redis&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A code snippet that's actually a fully working Sinatra app to jot down notes.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href=&quot;http://sunilarora.org/url-shortener-service-using-redis&quot;&gt;URL Shortener Service using Redis&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Personal URL shortening is the new black, that's why I've written &lt;a href=&quot;http://github.com/mattmatt/relink&quot;&gt;my own service&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It's not hard to tell that we're still far from having heaps of inspiration and real-life use cases to choose from, but these should give you an idea. If you want it can get a lot simpler too. When you're using Redis already, it makes sense to use it for storing Rails sessions.&lt;/p&gt;

&lt;p&gt;Redis is a great way to share data between different processes, be it Ruby or something else. The atomic access to lists, strings and sets, together with speedy access ensures that you don't even need to worry about concurrency issues when reading and writing data. On &lt;a href=&quot;http://scalarium.com&quot;&gt;Scalarium&lt;/a&gt;, we're using it mostly for sharing data between processes.&lt;/p&gt;

&lt;p&gt;E.g., all communication between our system and clients on the instances we boot for our users is encrypted and signed. To ensure that all processes have access to the keys, they're stored conveniently in Redis. Even though that means the data is duplicated from our main database (which is CouchDB if you must know), access to Redis is a lot faster. We keep statistics about the instances in Redis too, because CouchDB is just not made for writing heaps and heaps of data quickly. Redis also tracks a request token that is used to authenticate internal requests in our asynchronous messaging system, to make sure that they can't be compromised from some external source. Each request gets assigned a unique token. The token is stored in Redis before the message is published and checked before the message is consumed. That way we turned Redis into a trusted source for shared data between web and worker processes.&lt;/p&gt;

&lt;p&gt;The library &lt;a href=&quot;http://github.com/levicook/memodis&quot;&gt;memodis&lt;/a&gt; makes sharing data incredibly easy, it offers Redis-based memoization. When you assign a memodis'd attribute in your code, it'll be stored in Redis and therefore can be easily read from other processes.&lt;/p&gt;

&lt;p&gt;Redis is incredibly versatile, and if you have a real-life Redis story or usage scenario to share, please do.&lt;/p&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/Paperplanes/~4/SXQVZPkanUQ&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</content>
		<author>
			<name>paperplanes</name>
			<uri>http://www.paperplanes.de</uri>
		</author>
		<source>
			<title type="html">paperplanes</title>
			<subtitle type="html">software development that flies</subtitle>
			<link rel="self" href="http://feeds.feedburner.com/Paperplanes"/>
			<id>http://feeds.feedburner.com/Paperplanes</id>
			<updated>2010-09-03T16:40:18+00:00</updated>
			<rights type="html">Copyright 2007-2009</rights>
		</source>
	</entry>

	<entry xml:lang="de-de">
		<title type="html">Using MongoMapper with Rails 3</title>
		<link href="http://feedproxy.google.com/~r/dopefreshtightblog/~3/TDmzB3Q-_cY/"/>
		<id>http://dennisbloete.de/?p=660</id>
		<updated>2010-02-15T15:31:17+00:00</updated>
		<content type="html">&lt;p&gt;There is a really nice introduction at the MongoDB site on &lt;a href=&quot;http://www.mongodb.org/display/DOCS/Rails+3+-+Getting+Started&quot;&gt;How to get started with MongoDB and Rails 3&lt;/a&gt;. I used this as a starting point but had to do a few more things before I was fully satisfied and got things running with MongoMapper. At the time of writing this &lt;a href=&quot;http://github.com/jnunemaker/mongomapper&quot;&gt;the official repository&lt;/a&gt; is not Rails 3 compatible (because it does not implement the ActiveModel interface, yet), so I had to go with the &lt;a href=&quot;http://github.com/merbjedi/mongomapper/tree/rails3&quot;&gt;rails3 branch of merbjedi&amp;#8217;s repository&lt;/a&gt;. Use the following line to add the dependency to your Gemfile:&lt;/p&gt;

&lt;div class=&quot;wp_syntax&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre class=&quot;rails&quot;&gt;gem &lt;span&gt;&amp;quot;mongo_mapper&amp;quot;&lt;/span&gt;, &lt;span&gt;:git&lt;/span&gt; =&lt;span&gt;&amp;amp;&lt;/span&gt;gt; &lt;span&gt;'http://github.com/merbjedi/mongomapper.git'&lt;/span&gt;, &lt;span&gt;:branch&lt;/span&gt; =&lt;span&gt;&amp;amp;&lt;/span&gt;gt; &lt;span&gt;'rails3'&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;And while you are at it, add this line to include &lt;a href=&quot;http://github.com/indirect/rails3-generators&quot;&gt;some handy generators for Rails 3&lt;/a&gt;, including one for MongoMapper models:&lt;/p&gt;

&lt;div class=&quot;wp_syntax&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre class=&quot;rails&quot;&gt;gem &lt;span&gt;&amp;quot;rails3-generators&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;To use the generator set the orm config in your &lt;code&gt;config/application.rb&lt;/code&gt; to &lt;code&gt;:mongomapper&lt;/code&gt;&lt;/p&gt;

&lt;div class=&quot;wp_syntax&quot;&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre class=&quot;rails&quot;&gt;config.&lt;span&gt;generators&lt;/span&gt; &lt;span&gt;do&lt;/span&gt; &lt;span&gt;|&lt;/span&gt;g&lt;span&gt;|&lt;/span&gt;
      g.&lt;span&gt;orm&lt;/span&gt; &lt;span&gt;:mongomapper&lt;/span&gt;
      …
&lt;span&gt;end&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;… and you are good to go!&lt;/p&gt;
&lt;p&gt;btw: If you are like me and you prefer to have some kind of GUI for quick database lookups, check out &lt;a href=&quot;http://github.com/bububa/MongoHub&quot;&gt;MongoHub&lt;/a&gt;. It is in a very early stage of development, but at least you get to see your databases and documents.&lt;/p&gt;</content>
		<author>
			<name>Dennis Bloete</name>
			<email>mail@dennisbloete.de</email>
			<uri>http://dennisbloete.de</uri>
		</author>
		<source>
			<title type="html">//dennisbloete</title>
			<subtitle type="html">Arbeit und Alltag eines Software-Entwicklers aus Bremen</subtitle>
			<link rel="self" href="http://feeds.feedburner.com/dopefreshtightblog/"/>
			<id>http://feeds.feedburner.com/dopefreshtightblog/</id>
			<updated>2010-09-06T07:40:13+00:00</updated>
			<rights type="html">©</rights>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">NoSQL And You - Thoughts On Finding Right Partner In Chrime</title>
		<link href="http://www.paperplanes.de/2010/2/15/nosql_and_you_finding_the_right_partner.html"/>
		<id>http://www.paperplanes.de/archives/2010/2/15/nosql_and_you_finding_the_right_partner/</id>
		<updated>2010-02-15T00:00:00+00:00</updated>
		<content type="html">&lt;p&gt;The NoSQL landscape is a fickle thing, new tools popping up every week, broadening a spectrum that's already close to being ungraspable, especially when you're totally new to the whole thing. There's a couple of common misconceptions and wrong-doings that people who've been playing with the tools already tend to tell newbies in the landscape.&lt;/p&gt;

&lt;p&gt;I'm guilty as charged too, I tend to tell people about the tools I already know. Being a good thing per se, because the recommendation is based more or less on experience, it leaves out one thing that I find to be the most important philosophy about post-relational (much nicer term than NoSQL) databases: It's all about your data, about its needs and how your application needs to access them. The times of generic, one-size-fits-all tools like MySQL, PostgreSQL and the like are over, it's well worth knowing how they're different, and what tool would be the best partner in chrime to get stuff done.&lt;/p&gt;

&lt;h3&gt;No Size Fits All&lt;/h3&gt;

&lt;p&gt;While you could throw MySQL at a lot of problems, it was far from being the optimal choice in a lot of cases, but you could somehow bend it to your will. The new generation of tools tends to avoid having to be bent, instead they give you a freedom of choice. The freedom to analyse what your data is like, and what the right tool for your specific use case is.&lt;/p&gt;

&lt;p&gt;Does that mean more work on your end? It sure does, but for the love of your data, it will be worth it. If you find the right partner, and it makes your life easier, it's a win on both ends. You'll be a happy developer (well, most of the time), and your data will be able to roam free, running naked across a meadow, hand in hand with the tool you chose.&lt;/p&gt;

&lt;p&gt;Now I'm well aware that this sounds all bloomy, but that's what it boils down to. The choice is now up to you, that's why it's important to know what's out there, to play with the tools available, to know how and why they're different from each other.&lt;/p&gt;

&lt;p&gt;To get you started, have a look at Vineet Gupta's &lt;a href=&quot;http://www.vineetgupta.com/2010/01/nosql-databases-part-1-landscape.html&quot;&gt;excellent overview of the NoSQL landscape&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;Don't Believe Everything You Hear&lt;/h3&gt;

&lt;p&gt;If someone tells you that you should try a specific tool, ask him why. If the answer is speed, or because it's written in Erlang and scales insanely well, it's time to call bullshit on him. MySQL can be fast too, that's not an issue. It's nice to be able to have a database that you can scale up to hundreds of nodes easily, but while the technology behind it is very interesting, and sometimes mind-blowing, it doesn't help if it's a pain to work with, or if there's no library support yet. Sure you could write your own, but if you're totally new to the field, you usually just want to play and learn. Hard thing to do if all you get is just an API and a very limited language support.&lt;/p&gt;

&lt;p&gt;If someone tells you that e.g. MongoDB is fast, then there's reason for that, and it's good to be well aware of it and &lt;a href=&quot;http://blog.mongodb.org/post/381927266/what-about-durability&quot;&gt;what consequences it has for operating your application&lt;/a&gt;. If someone tells you that CouchDB is awesome for building web applications, because it's built of the web, they're leaving out that a common use case like pagination &lt;a href=&quot;http://nosql.mypopescu.com/post/383815292/paginating-with-couchdb&quot;&gt;is still an awful thing to implement with it&lt;/a&gt;. If someone tells you that Cassandra scales easily because it was built at Facebook, they're leaving out that &lt;a href=&quot;http://wiki.apache.org/cassandra/DataModel&quot;&gt;its peculiar way of storing and accessing data&lt;/a&gt; is very specific to how sites like Facebook need to access their data. I could go on and on about it, but there's always two side of a story.&lt;/p&gt;

&lt;p&gt;Before judging a tool based on just the one side, look at the other side too. It might not be as big of a problem as you thought it would, either way, you know why things are the way they are. Look for tools with sites describing particular use cases, or areas where they're just not a good fit. If the tool builders aren't aware of use cases, strengths and weaknesses, how will you be?&lt;/p&gt;

&lt;p&gt;In the end, even though they can be problems for others, they don't necessarily are problems for you. Your particular use case might be just fine with the downsides, but on the other hand gaining high profit from the upsides. If it's not, at least you're more than free to go look somewhere else. At least now you have the (free) options to do so.&lt;/p&gt;

&lt;p&gt;There's misconceptions out there being close to urban myths, and we're only two years or so into working with the new generation of tools. The only way you can avoid falling into a trap is to play with what's out there, to know their weaknesses and strengths. The only thing we can do to avoid having people fall into the trap is to better educate them, to give them real-world examples, use cases other than tagging and blog posts. Just saying that it scales better than xyz is not an argument, it's educating people on the wrong end.&lt;/p&gt;

&lt;h3&gt;It's Not About Speed And Scaling&lt;/h3&gt;

&lt;p&gt;If speed and scaling were our only problems, we'd be left in a big world of pain. As beautiful as these words are, I'm gonna go out on a limb and say that it's not a problem until it's a problem. Unless you're already Facebook or LinkedIn, you don't need to have that as a main factor when choosing the right tool. Sure, it's better if there's an easy way to scale up in the future, but what's the point if you needs days to get a good set up before having written a single line of code?&lt;/p&gt;

&lt;p&gt;Most NoSQL tools were built with some sort of scaling in mind, although people tend to easily confuse scaling, distribution, sharding and partitioning, so you're safe in most cases when it comes to the point where your application needs to handle more traffic.&lt;/p&gt;

&lt;p&gt;I'm gonna go ahead and venture the guess that if you're deciding solely based on speed and scalability, you're doing it wrong. And I rarely use that phrase. You should be deciding based on the core feature set, why it does the things it does, and what consequences it'd have on your life as a developer.&lt;/p&gt;

&lt;h3&gt;Don't Compare Apples And Oranges&lt;/h3&gt;

&lt;p&gt;No tool is like the other. Just comparing e.g. MongoDB, Redis and MySQL is the wrong way to approach your problem, especially if you just look at speed and comparing their feature set. Feature sets and speed are usually different for a reason. Instead you should be comparing every tool with your data. How much do you need to bend the data to store and access it easily. Is it even possible to store it efficiently and or your particular use case? Are potential trade-offs (e.g. data duplication to gain speedier access) worth risking? Is it the right fit in the way it handles updates, associations, writes, reads and queries in terms of your data and application? Then go right ahead and use it.&lt;/p&gt;

&lt;p&gt;But don't just compare tools with each other whose only feature they have in common is the fact that they can store data, or things that are mostly depending on an application's specific needs. To give you an idea, this guy compares &lt;a href=&quot;http://masonoise.wordpress.com/2010/01/30/comparing-mongodb-and-redis-part-1/&quot;&gt;Redis&lt;/a&gt; and &lt;a href=&quot;http://masonoise.wordpress.com/2010/01/30/comparing-mongodb-and-redis-part-1/&quot;&gt;MongoDB&lt;/a&gt; by implementing a particular use case with both of them. That's the way you should be comparing tools.&lt;/p&gt;

&lt;h3&gt;The Heat Is On&lt;/h3&gt;

&lt;p&gt;We're going to see more tools popping up left and right, making it harder to keep up, and to make an informed decision. What I consider the best thing about most of them is that they're free. You can grab the source code, improve it or just look at how it handles your data. That's what makes them so awesome, their incentive is not to constrain your data, they're as open as possible about it, some tools even going as far as building solely on open standards to implement their whole stack (that'd be CouchDB if you're curious).&lt;/p&gt;

&lt;p&gt;The whole point of this post is that it's up to you to find the perfect tool to hand your data to. I don't know about you, but me being able to find the right fit instead of squeezing my data into a database that tries to solve all problems at once, that's the most exciting prospect of post-relational databases for me. Our common goal should be to help people make that decision without getting too passionate about any particular tool. They all exist to fulfill some purpose, and we should be telling people about them.&lt;/p&gt;

&lt;p&gt;There's a couple of sites to keep an eye on, e.g. &lt;a href=&quot;http://nosql.mypopescu.com/&quot;&gt;MyNoSQL&lt;/a&gt; by Alex Popescu, he's keen on keeping up-to-date with what's going on in the NoSQL community. Another site with a growing collection of links to articles is &lt;a href=&quot;http://nosql-database.org/links.html&quot;&gt;nosql-databases.org&lt;/a&gt;. EngineYard published a series of blog posts on &lt;a href=&quot;http://www.engineyard.com/blog/2009/key-value-stores-in-ruby/&quot;&gt;key-value stores&lt;/a&gt; in Ruby, in particular &lt;a href=&quot;http://www.engineyard.com/blog/2009/cassandra-and-ruby-a-love-affair/&quot;&gt;Cassandra&lt;/a&gt;, &lt;a href=&quot;http://www.engineyard.com/blog/2009/key-value-stores-for-ruby-part-4-to-redis-or-not-to-redis/&quot;&gt;Redis&lt;/a&gt;, &lt;a href=&quot;http://www.engineyard.com/blog/2009/mongodb-a-light-in-the-darkness-key-value-stores-part-5/&quot;&gt;MongoDB&lt;/a&gt;, &lt;a href=&quot;http://www.engineyard.com/blog/2009/key-value-stores-in-ruby-the-wrap-up/&quot;&gt;CouchDB&lt;/a&gt;, &lt;a href=&quot;http://www.engineyard.com/blog/2009/ldap-directories-the-forgotten-nosql/&quot;&gt;LDAP&lt;/a&gt; that's well worth checking out to get an idea of what's out there.&lt;/p&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/Paperplanes/~4/h6Y_GI1SX0k&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</content>
		<author>
			<name>paperplanes</name>
			<uri>http://www.paperplanes.de</uri>
		</author>
		<source>
			<title type="html">paperplanes</title>
			<subtitle type="html">software development that flies</subtitle>
			<link rel="self" href="http://feeds.feedburner.com/Paperplanes"/>
			<id>http://feeds.feedburner.com/Paperplanes</id>
			<updated>2010-09-03T16:40:18+00:00</updated>
			<rights type="html">Copyright 2007-2009</rights>
		</source>
	</entry>

	<entry xml:lang="de-de">
		<title type="html">ZENDOME für das iPhone</title>
		<link href="http://feedproxy.google.com/~r/dopefreshtightblog/~3/Ydgbq5erOGE/"/>
		<id>http://dennisbloete.de/?p=651</id>
		<updated>2010-02-12T10:49:44+00:00</updated>
		<content type="html">&lt;p&gt;Es ist soweit und &lt;a href=&quot;http://itunes.com/apps/zendome&quot;&gt;ZENDOME&lt;/a&gt; &amp;#8211; ein Kundenprojekt an dem ich in letzter Zeit gearbeitet habe &amp;#8211; ist nun &lt;a href=&quot;itms://itunes.apple.com/de/app/zendome/id353137169?mt=8&quot;&gt;kostenlos im App Store erhältlich&lt;/a&gt;. Die Applikation wurde im Auftrag der &lt;a href=&quot;http://zendome.de/&quot;&gt;ZENDOME GmbH&lt;/a&gt; entwickelt und ermöglicht die Planung von individuellen Event-Landschaften, die beispielsweise auf Messen oder für Ausstellungen verwendet werden. Der Benutzer hat die Möglichkeit, die verschiedenen geodätischen Dome zur ZENDOME.domescapes zu kombinieren und damit seine Veranstaltung vorzudenken. Ist eine Planung erstellt lässt sich schnell und unkompliziert ein Angebot anfordern.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;itms://itunes.apple.com/de/app/zendome/id353137169?mt=8&quot;&gt;&lt;img class=&quot;align-right size-full wp-image-652&quot; title=&quot;zendome-iphone&quot; src=&quot;http://dennisbloete.de/wp-content/uploads/zendome-iphone.png&quot; alt=&quot;ZENDOME iPhone-Applikation&quot; width=&quot;135&quot; height=&quot;250&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Besonderer Wert wurde auf eine intuitive Benutzung der Anwendung gelegt. Um dies zu erreichen wurde auf die aus dem allgemeinen iPhone-Kontext bekannte Gesten und Aktionen (bspw. Pinch/Zoom, Drag and Drop, Scrolling, etc. ) zurückgegriffen und einfache Interaktionsmuster benutzt. Es gibt bereits Erweiterungspläne für kommende Versionen: So ist insbesondere eine iPad-Variante angedacht, da die größere Bildschirmfläche natürlich mehr Platz für eine komfortable und detailreiche Planung bietet. Noch etwas zum technischen Hintergrund: Das Projekt wurde mit Xcode und CocoaTouch-Standardtechnologien wie UIKit, CoreGraphics und CoreAnimation innerhalb von vier Wochen realisiert und hatte insgesamt einen Arbeitsaufwand von ca. 40 Stunden. Weitere Projektdetails und Informationen plane ich in naher Zukunft in einer kurzen Fallstudie zu veröffentlichen.&lt;/p&gt;</content>
		<author>
			<name>Dennis Bloete</name>
			<email>mail@dennisbloete.de</email>
			<uri>http://dennisbloete.de</uri>
		</author>
		<source>
			<title type="html">//dennisbloete</title>
			<subtitle type="html">Arbeit und Alltag eines Software-Entwicklers aus Bremen</subtitle>
			<link rel="self" href="http://feeds.feedburner.com/dopefreshtightblog/"/>
			<id>http://feeds.feedburner.com/dopefreshtightblog/</id>
			<updated>2010-09-06T07:40:13+00:00</updated>
			<rights type="html">©</rights>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Rails 3 beta is released!!</title>
		<link href="http://feedproxy.google.com/~r/railslabs/~3/f_AxLdUw6zg/"/>
		<id>http://railslove.com/weblog/?p=585</id>
		<updated>2010-02-05T04:11:31+00:00</updated>
		<content type="html">&lt;p&gt;&lt;strong&gt;Yeah! Rails 3 beta just got released. &lt;/strong&gt;&lt;br /&gt;
So grab it while it&amp;#8217;s hot: ;)&lt;/p&gt;
&lt;pre&gt;
gem install rack bundler tzinfo i18n rack rack-test rack-mount erubis mail thor

gem install rails --prerelease
&lt;/pre&gt;
&lt;div class=&quot;feedflare&quot;&gt;
&lt;a href=&quot;http://feeds.feedburner.com/~ff/railslabs?a=f_AxLdUw6zg:CsA5_3tLA70:yIl2AUoC8zA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/railslabs?d=yIl2AUoC8zA&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/railslabs?a=f_AxLdUw6zg:CsA5_3tLA70:7Q72WNTAKBA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/railslabs?d=7Q72WNTAKBA&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/railslabs?a=f_AxLdUw6zg:CsA5_3tLA70:V_sGLiPBpWU&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/railslabs?i=f_AxLdUw6zg:CsA5_3tLA70:V_sGLiPBpWU&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;
&lt;/div&gt;</content>
		<author>
			<name>Railslove</name>
			<uri>http://railslove.com/weblog</uri>
		</author>
		<source>
			<title type="html">Railslove</title>
			<subtitle type="html">we love building web applications</subtitle>
			<link rel="self" href="http://feeds.feedburner.com/railslabs"/>
			<id>tag:railslabs.com,2007:mephisto/</id>
			<updated>2010-09-06T22:00:11+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Railslove around the world</title>
		<link href="http://feedproxy.google.com/~r/railslabs/~3/q4y58SskBVU/"/>
		<id>http://railslove.com/weblog/?p=579</id>
		<updated>2010-02-03T11:01:54+00:00</updated>
		<content type="html">&lt;p&gt;We&amp;#8217;re posting more and more stuff on our tumble blog &lt;a href=&quot;http://tumble.railslove.com&quot;&gt;&amp;#8220;Railslove around the world&amp;#8221;&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;On the tumble we&amp;#8217;re publishing all the good stuff we discover on the web, mostly ruby and web develoment related. So make sure to keep an eye &lt;a href=&quot;http://tumble.railslove.com/&quot;&gt;on it&lt;/a&gt;. ;)&lt;/p&gt;
&lt;div class=&quot;feedflare&quot;&gt;
&lt;a href=&quot;http://feeds.feedburner.com/~ff/railslabs?a=q4y58SskBVU:KLEwwV1-BEg:yIl2AUoC8zA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/railslabs?d=yIl2AUoC8zA&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/railslabs?a=q4y58SskBVU:KLEwwV1-BEg:7Q72WNTAKBA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/railslabs?d=7Q72WNTAKBA&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/railslabs?a=q4y58SskBVU:KLEwwV1-BEg:V_sGLiPBpWU&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/railslabs?i=q4y58SskBVU:KLEwwV1-BEg:V_sGLiPBpWU&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;
&lt;/div&gt;</content>
		<author>
			<name>Railslove</name>
			<uri>http://railslove.com/weblog</uri>
		</author>
		<source>
			<title type="html">Railslove</title>
			<subtitle type="html">we love building web applications</subtitle>
			<link rel="self" href="http://feeds.feedburner.com/railslabs"/>
			<id>tag:railslabs.com,2007:mephisto/</id>
			<updated>2010-09-06T22:00:11+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">On the way to Rails 3  - a link list</title>
		<link href="http://feedproxy.google.com/~r/railslabs/~3/-VWB338EDTE/"/>
		<id>http://railslove.com/weblog/?p=567</id>
		<updated>2010-02-02T13:58:40+00:00</updated>
		<content type="html">&lt;p&gt;Rails 3 is coming! The first beta release of the new version is right around the corner and it should be released today or tomorrow&amp;#8230; the &lt;a href=&quot;http://github.com/rails/rails/commit/428bdb50631ba03847367a15fedb2289269cd789&quot;&gt;release notes&lt;/a&gt; are already in the master branch.&lt;br /&gt;
For me this feels like the release of Rails 1.0 and I&amp;#8217;m so excited about all the new changes and the great new features. &lt;br /&gt;
Rails 3 is a lot about changing your mindset to make use of the all new features and concepts. &lt;br /&gt;&lt;br /&gt;
I&amp;#8217;ve collected some reading material for you about Rails 3 and the upcoming changes. Since the final Rails 3 is not yet released excpect some of the stuff that&amp;#8217;s mentioned to be changed or already have changed in the beta. But this is a good start to catch up with all the Rails awesomeness:&lt;/p&gt;
&lt;h3&gt;Must-reads&lt;/h3&gt;
&lt;p&gt;Actually all of these links are &amp;#8220;must-reads&amp;#8221; but for those of you with little time. Read at least these:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;http://guides.rails.info/3_0_release_notes.html&quot;&gt;official Rails 3 relase notes&lt;/a&gt;&lt;/strong&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://blog.peepcode.com/tutorials/2010/live-coding-rails-3-upgrade&quot;&gt;Live Coding Rails 3 upgrade&lt;/a&gt; a &lt;a href=&quot;http://peepcode.com&quot;&gt;free peepcode&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://en.oreilly.com/railswinter10&quot;&gt;Exploring Rails 3 -  A Free Two Hour Online Conference&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://omgbloglol.com/post/344792822/the-path-to-rails-3-introduction&quot;&gt;The Path to Rails 3 - Intorduction&lt;/a&gt; - A very awesome introduction to the big picture of Rails 3. read it!&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.engineyard.com/blog/2010/rails-and-merb-merge-rails-core-part-4-of-6/&quot;&gt;Rails and Merb Merge: Rails Core (Part 4 of 6)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://omgbloglol.com/post/364624593/rails-upgrade-is-now-an-official-plugin&quot;&gt;Rails 3 Upgrade plugin - checks your code and gives you hints to make it Rails 3 compatible&lt;/a&gt; (&lt;a href=&quot;http://omgbloglol.com/post/359147788/rails-upgrade-automating-a-portion-of-the-rails-3&quot;&gt;first announcment&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://omgbloglol.com/post/371893012/the-path-to-rails-3-greenfielding-new-apps-with-the&quot;&gt;Greenfielding new apps with the Rails 3 beta&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Router&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://yehudakatz.com/2009/12/26/the-rails-3-router-rack-it-up/&quot;&gt;Rails 3 Router: Rack it up!&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://rizwanreza.com/2009/12/20/revamped-routes-in-rails-3&quot;&gt;Revamped routes in Rails 3&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://yehudakatz.com/2009/12/20/generic-actions-in-rails-3/&quot;&gt;Generic Actions in Rails 3&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;ActiveRecord / ActiveModel&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://m.onkey.org/2010/1/22/active-record-query-interface&quot;&gt;Active Record Query Interface 3.0&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.rubyinside.com/rails-3-0s-activemodel-how-to-give-ruby-classes-some-activerecord-magic-2937.html&quot;&gt;Rails 3.0’s ActiveModel: How To Give Ruby Classes Some ActiveRecord Magic&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://yehudakatz.com/2010/01/10/activemodel-make-any-ruby-object-feel-like-activerecord/&quot;&gt;ActiveModel: Make Any Ruby Object Feel Like ActiveRecord&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://github.com/rails/arel&quot;&gt;Arel source code and readme&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://magicscalingsprinkles.wordpress.com/2010/01/28/why-i-wrote-arel/&quot;&gt;Why Arel&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://lindsaar.net/2010/1/31/validates_rails_3_awesome_is_true&quot;&gt;validates :rails_3, :awesome =&gt; true&lt;/a&gt; great post about the new validations in Rails 3&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;ActionMailer&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://lindsaar.net/2010/1/26/new-actionmailer-api-in-rails-3&quot;&gt;New ActionMailer API in Rails 3&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Views / JavaScript&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://rvdh.de/blog/2009/12/14/rails-3-xss-protection-in-erb/&quot;&gt;Rails 3 XSS protection &lt;/a&gt;(german)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://yehudakatz.com/2010/02/01/safebuffers-and-rails-3-0/&quot;&gt;SafeBuffers and Rails 3&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://joshhuckabee.com/jquery-rails-3&quot;&gt;jQuery with Rails 3&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Controller&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.engineyard.com/blog/2010/render-options-in-rails-3/&quot;&gt;Render options in Rails 3&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://weblog.rubyonrails.org/2009/8/31/three-reasons-love-responder&quot;&gt;Three reasons to love ActionController::Responder&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://ryandaigle.com/articles/2009/8/10/what-s-new-in-edge-rails-default-restful-rendering&quot;&gt;Default RESTful Rendering&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://ryandaigle.com/articles/2009/8/6/what-s-new-in-edge-rails-cleaner-restful-controllers-w-respond_with&quot;&gt;Cleaner RESTful Controllers w/ respond_with&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Rack&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://coderack.org/&quot;&gt;The CodeRack Contest&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.rubyinside.com/21-rack-middlewares-2649.html&quot;&gt;21 Rack Middlewares To Turbocharge Your Ruby Webapps&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://guides.rubyonrails.org/rails_on_rack.html&quot;&gt;Rails on Rack&lt;/a&gt;(not Rails 3 specific)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Gem, Plugins, Dependencies&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://yehudakatz.com/2010/02/01/bundler-0-9-heading-toward-1-0/&quot;&gt;Bundler 0.9 - heading towards 1.0&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://alexjsharp.com/2009/12/23/bundler-is-the-new-hotness-deploying-rails-apps-with-bundler-and-capistrano&quot;&gt;Bundler is the new hotness: deploying rails apps with bundler and capistrano&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://railsplugins.org/&quot;&gt;Is your plugin ready for Rails 3?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Generators&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://caffeinedd.com/guides/331-making-generators-for-rails-3-with-thor&quot;&gt;Making generators for Rails 3 with Thor&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://paulbarry.com/articles/2010/01/13/customizing-generators-in-rails-3&quot;&gt;Customizing generators in Rails 3&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://blog.plataformatec.com.br/2010/01/discovering-rails-3-generators/&quot;&gt;Discovering Rails 3 generators&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;I18n&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://blog.plataformatec.com.br/2010/02/rails-3-i18n-changes/&quot;&gt; Rails 3 I18n changes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Other great reading&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://github.com/rails/rails/commit/2ebea1c02d10e0fea26bd98d297a8f4d41dc1aff&quot;&gt;Rails now seems to act like a grown up&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://yehudakatz.com/2009/08/26/how-to-build-sinatra-on-rails-3/&quot;&gt;Build Sinatra on Rails 3&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.engineyard.com/blog/2009/my-five-favorite-things-about-rails-3/&quot;&gt;My five favorite things about Rails 3&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://yehudakatz.com/2009/11/12/better-ruby-idioms/&quot;&gt;Better Ruby idioms&lt;/a&gt;- read this for plugin development&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://wiki.rubyonrails.org/rails/version3/plugins_and_gems&quot;&gt;Rails 3 ready plugins&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://cakebaker.42dh.com/2010/01/17/rails-3-and-passenger/&quot;&gt;Rails 3 and Passenger&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://assets.pivotallabs.com/talks/09-02-2009_Extending-Rails3_Yehuda-Katz.mp4&quot;&gt;Extending Rails 3&lt;/a&gt; Talk by &lt;a href=&quot;http://twitter.com/wycats&quot;&gt;@wycats&lt;/a&gt; at &lt;a href=&quot;http://pivotallabs.com&quot;&gt;pivotallabs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://lindsaar.net/2010/1/23/mail-gem-version-2-released&quot;&gt;Mail gem Version 2&lt;/a&gt; Rails 3 is now using the new mail gem. This is a great writeup about new features in version 2&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;General Rails&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.engineyard.com/blog/2009/my-five-favorite-things-about-rails-3/&quot;&gt;My Five Favorite Things About Rails 3&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://litanyagainstfear.com/blog/2010/02/03/the-rails-module/&quot;&gt;Rails Module in Rails 3&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://lindsaar.net/2010/2/4/is_rails_3_a_game_changer&quot;&gt;Is Rails 3 a game changer?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
I&amp;#8217;ll update this list with upcoming Rails 3 resources.
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;update:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;
1. Added link to I18n changes (thanks @ Carlos)&lt;/p&gt;
&lt;div class=&quot;feedflare&quot;&gt;
&lt;a href=&quot;http://feeds.feedburner.com/~ff/railslabs?a=-VWB338EDTE:WueqqyIYFPQ:yIl2AUoC8zA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/railslabs?d=yIl2AUoC8zA&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/railslabs?a=-VWB338EDTE:WueqqyIYFPQ:7Q72WNTAKBA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/railslabs?d=7Q72WNTAKBA&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/railslabs?a=-VWB338EDTE:WueqqyIYFPQ:V_sGLiPBpWU&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/railslabs?i=-VWB338EDTE:WueqqyIYFPQ:V_sGLiPBpWU&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;
&lt;/div&gt;</content>
		<author>
			<name>Railslove</name>
			<uri>http://railslove.com/weblog</uri>
		</author>
		<source>
			<title type="html">Railslove</title>
			<subtitle type="html">we love building web applications</subtitle>
			<link rel="self" href="http://feeds.feedburner.com/railslabs"/>
			<id>tag:railslabs.com,2007:mephisto/</id>
			<updated>2010-09-06T22:00:11+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">The musichackday that wasn't meant to be</title>
		<link href="http://feedproxy.google.com/~r/jankrutisch/rss/~3/pt-7wjSZzo4/"/>
		<id>http://jan.krutisch.de/en/2010/01/31/the-musichackday-that-wasnt-meant-to-be.html/</id>
		<updated>2010-01-30T23:00:00+00:00</updated>
		<content type="html">&lt;p&gt;As my coworker &lt;a href=&quot;http://floriansiepert.com&quot;&gt;Florian&lt;/a&gt; would put it: Damn the sh*t f**k. For us (us being the hamburgian musichackday tourists Michael, Wolfgang and Jan with a taste for low budget travel plans), the musichackday was over before it even started. We patiently stood in line at the Ryanair dominated airport in Lübeck, but, really, we should have known better. Not a single Plane left or arrived at Lübeck after 15:00 on Friday. It was snowing like hell (a very cold hell, that is) and the snow ploughs tried their best, but, heck, it was almost impossible to drive safely with a car out there, so it probably wasn&amp;#8217;t a too bad decision to not try to land or start there. Safety first, safety first.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://img.skitch.com/20100131-tnnfxqm18csftyrxpkishxtyda.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;But, being a screwed Ryanair customer, it was clear for us that we had no chance to get to &lt;span class=&quot;caps&quot;&gt;STHLM&lt;/span&gt; in time, except for making the travel at maybe 3 times the expense originally planned.&lt;/p&gt;
&lt;p&gt;This obviously being the most awesome hackday evar, I&amp;#8217;m still quite disappointed. But I repeat myself. Wolfgang suggested early on that we should hack on regardless and so all of us met on Saturday, started with a good Breakfast with leftovers from the &lt;a href=&quot;http://porkcamp.com&quot;&gt;porkcamp&lt;/a&gt; and dived into the projects we had originally planned for Stockholm.&lt;/p&gt;
&lt;p&gt;&lt;!--more--&gt;&lt;span id=&quot;more&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span id=&quot;more&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Michael deployed his small lastFM &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt; hack called &lt;a href=&quot;http://rockitbaby.de/projects/mycityvsyourcity/&quot;&gt;my city vs. your city&lt;/a&gt; at the end of Saturday and spent Sunday with optimising the calculation.&lt;/p&gt;
&lt;p&gt;Wolfgang and I started in the Saturday afternoon with a small echonest analyzer mash with parts of my javascript soft synth work. Yes, the output is silly, yes it would need a &lt;strong&gt;lot&lt;/strong&gt; of work to let it output something useful, but &lt;a href=&quot;http://amie.pixelpoke.de/&quot;&gt;anyway&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I then, after we left the mindmatters office, started to integrate the javascript synth into my &lt;a href=&quot;http://webloop.pixelpoke.de/&quot;&gt;webloop&lt;/a&gt; stuff.&lt;/p&gt;
&lt;p&gt;On sunday Wolfgang made the amie pretty and I deployed the stuff to one of my webservers. After that we recorded two screencasts to be able to be part of the presentations. And then we were able to see the videos that we recorded, streamed into the doberman office in the live stream we watched. Ah, the interwebs.&lt;/p&gt;
&lt;p&gt;Now I am sitting here and wondering if Brian Whitman will really ship echonest tracksuits to our office as he suggested in his tweet:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I can&amp;#8217;t believe those &lt;span class=&quot;caps&quot;&gt;AMIE&lt;/span&gt; dudes found @echonest&amp;#8217;s secret plans to drunkuncle.dj. #musichackday #howdoyoushipveloursuitstogermany&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Har har. Here are the screencasts:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Next time I very much would prefer to attend in person, thank you very much, but I think we made the best out of it.&lt;/p&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/Pembffp-yVY&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/bPKLIFcgMds&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/kOHNyg9ggLk&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/r61wNMf-KWE&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/X3SpuPd8qlU&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/vA2G5Y20UzM&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/lQtun0NcZVM&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/lDTEwNX_XqM&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/NqkzEAjgmNQ&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/WtDb5oqeZF4&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/c00VyIK89p0&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/7SHi_qtbywI&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/igkRpZgnNwc&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/74-oi-uc13A&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/iC8zalmCnus&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/OK9un3ggeno&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/82N8P1v46mY&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/Uclf5BLUMhs&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/VzSInUdwDdQ&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/9N2BAfrjilA&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/MMU1TPz5mrs&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/fVWjAnyIdoo&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/6mlzi-EUydA&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/Oti-Z-DyRYk&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/AKmPGP54Fmg&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/6drHOpdHIqA&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/P_uqMaJ7BAY&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/pgruz-vprts&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/yWShOht66bI&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/QwTlfRPUNEk&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/RvF-2qB7WoU&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/Orp_SnumdYc&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/MOy7M6Aqcbo&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/_Iha-fujfuo&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/XAaWUdl896U&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/OGPDsegWO1o&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/vxO03LHEbZ0&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/Jw7Wik_PZNo&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/n2h1ELz5VJk&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/HjL9HC7IMyg&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/BXSsKuaAlW4&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/6gHHuWIv08k&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/hoqllZnkGf0&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/sQwK6S-tNW4&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/q_p7DH5flyU&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/wBY6MlvwHfg&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/CsgniVSQh8w&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/fjAxube6PFQ&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/8nCtVW9FkUk&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/5uY2SToHxuQ&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/tSQ48spUpPg&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/7zIDnCvAhaE&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/_JjFipkvylU&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/-dMcJxt5aTU&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/lVhj2mVxqlw&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/i9s2jAOlHcQ&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/ujl4b2rnKZc&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/oBKKLKuzf00&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/-yPvvTbJSSQ&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/pt-7wjSZzo4&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</content>
		<author>
			<name>jan.krutisch.de</name>
			<uri>http://jan.krutisch.de</uri>
		</author>
		<source>
			<title type="html">jan.krutisch.de</title>
			<subtitle type="html">An ongoing conversation between Jan Krutisch and the Interwebs on nothing in particular.</subtitle>
			<link rel="self" href="http://feeds.feedburner.com/jankrutisch/rss/"/>
			<id>http://feeds.feedburner.com/jankrutisch/rss/</id>
			<updated>2010-07-28T20:20:07+00:00</updated>
			<rights type="html">Copyright 2004-2009</rights>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">iPad it is</title>
		<link href="http://feedproxy.google.com/~r/jankrutisch/rss/~3/3PEM66QfBsk/"/>
		<id>http://jan.krutisch.de/en/2010/01/27/ipad-it-is.html/</id>
		<updated>2010-01-26T23:00:00+00:00</updated>
		<content type="html">&lt;p&gt;&lt;em&gt;this article has been updated on the 28th of January to correct some errors and clarify a few points&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;First off: I think the name is a poor choice. The web, especially the twitters seems to agree. I would have loved all the other names that flew around during the last days, like iBook, Canvas, Palette, whatever.&lt;/p&gt;
&lt;p&gt;With that out of the way, I am pretty baffled by both the product itself but also the reactions to it.&lt;/p&gt;
&lt;p&gt;What can I say. No multitasking feels weird with a device that can run special versions of iWork on it. (Let&amp;#8217;s hope they do a lot of state saving and the apps start fast). Apart from that, the whole thing feels like an extremely solid, well designed piece of hardware/software.&lt;/p&gt;
&lt;p&gt;Now here&amp;#8217;s the real problem: While OS X on my Mac has it&amp;#8217;s proprietary edges, the system is mostly open. iPhone and iPad are, by default, pretty much closed devices. And this leaves a lot of questions unanswered. For example, it restricts your music buying to iTunes, which is good for noone but Apple. This is, for example, not the case for iTunes on my Mac, simply because I can drop any piece of music, on CD or as mp3, into iTunes. But there&amp;#8217;s a glimpse of hope&amp;#8230;there are some changes (yah, &lt;span class=&quot;caps&quot;&gt;NDA&lt;/span&gt; fun at work, so I cannot tell anything specific) in the 3.2 &lt;span class=&quot;caps&quot;&gt;SDK&lt;/span&gt; that might allow Applications to add files to to other Applications. Maybe. We&amp;#8217;ll see.&lt;/p&gt;
&lt;p&gt;And now there&amp;#8217;s iBooks: Will it restrict Book buying to the iBooks store? We don&amp;#8217;t know yet, but at least it is based on a standard (ePub), so it might be possible to add non-&lt;span class=&quot;caps&quot;&gt;DRM&lt;/span&gt; books (like my beloved pragprog series) directly to the iBooks app. But what about the &lt;span class=&quot;caps&quot;&gt;DRM&lt;/span&gt; format? Will it support the defacto standard Adobe &lt;span class=&quot;caps&quot;&gt;DRM&lt;/span&gt; and by that opening your iPad to the hundreds of titles that publishers sell for, e.g. the Sony readers? I somehow doubt that, but we will hopefully get some details on that very soon.&lt;/p&gt;
&lt;p&gt;For me, somehow, the closed nature of the iPad is much worse than the closed nature of the iPhone, probably because it&amp;#8217;s closer to a &amp;#8220;real&amp;#8221; computer and I like those to be as open as possible, thankyouverymuch.&lt;/p&gt;
&lt;p&gt;Still, I do not agree with many commenters that the iPad is an underwhelming supersized iPhone and nothing else. Or that it cannot compete with netbooks. Or that there are no usecases.&lt;/p&gt;
&lt;p&gt;&lt;!--more--&gt;&lt;span id=&quot;more&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span id=&quot;more&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;First of all, I think people underestimate the possibilities of a 10&amp;quot; multitouch screen with a very high resolution. A few apps shown in the demos, especially the photos app, show a bit of the magic that will befall you as soon as you can touch this device. Yes, this will be a completely new dimension on top of what&amp;#8217;s already possible on the iPhone. No, you probably ain&amp;#8217;t seen nothing yet. Yes, you can quote me on that.&lt;/p&gt;
&lt;p&gt;Also I think that people underestimate the value of a simple, thin, relatively light and extremely solid device with virtually no moving parts. This &lt;span class=&quot;caps&quot;&gt;WILL&lt;/span&gt; be georgeous for reading (I hope that they thought of a way to lock orientation, or otherwise it will be impossible for me to read in the bed), this will be fabulous for watching movies or browsing through your music collection, but in the end, it will open up completely new ways of using a computer, simply because it stops being awkward or unfitting. It is not as clumsy as a larger Notebook (which is usually too heavy to lift it comfortably with one hand), it cannot fall over like my netbook when open, it holds natural (everyone complaining about the huge bezel should also complain about the huge margins usually employed in printed books), and, last but not least, it simply looks great. All in all, it will happily replace a &amp;#8220;real&amp;#8221; computer in any environment that&amp;#8217;s not &amp;#8220;computerish&amp;#8221; by default. I am relatively sure that I won&amp;#8217;t be coding web apps on an iPad anytime soon, but for gaming, reading, watching movies and simple browsing, it will be a much better fit than anything else. And maybe, possibly with the help of the keyboard dock, for some people this will be all the computer they&amp;#8217;ll need in their life.&lt;/p&gt;
&lt;p&gt;Am I unhappy about the closed nature of all the Shops that Apple has under their control? You bet. Am I unhappy about the missing Multitasking? For sure. Do I think that the iPad will be a success? Yessir, although I am not sure how fast it will take on at first.&lt;/p&gt;
&lt;p&gt;One additional word on the multitasking: I don&amp;#8217;t actually think that this decision is set in stone. Didn&amp;#8217;t it strike you as odd that the &lt;span class=&quot;caps&quot;&gt;SDK&lt;/span&gt; version for the iPad is not, as I would have expected, 4.0, but instead it&amp;#8217;s just a point release? This should give you a hint that in the summer, when I expect both a new iPhone model &lt;span class=&quot;caps&quot;&gt;AND&lt;/span&gt; a new iPhone OS major release (I would not even rule out an iPad 2), there are some major things to come. Not sure that it will feature complete multitasking, but limited background process support (especially for alternative music apps) seems to make sense for me.&lt;/p&gt;
&lt;p&gt;Many people also complain about the missing camera and I must say that this strikes me as odd as well &amp;#8211; The iPad would otherwise be a kick ass device for video chat. But then again, the initial iPhone didn&amp;#8217;t have a camera either. Do you think that Apple didn&amp;#8217;t include the camera because they didn&amp;#8217;t want to? No, they probably did that because they had enough problems putting the iPhone together as it was, in time, without the camera. And judging from the few images I saw from the iPad, I&amp;#8217;d say that the iPad is a comparable engineering masterpiece with little space inside the device and also with every engineering boundary pushed to the limits. Will we see a camera in iteration two of the iPad? I don&amp;#8217;t know.&lt;/p&gt;
&lt;p&gt;Will I buy the iPad? This largely depends on 1. how the german mobile carrier contracts will look like and 2. how apple will interpret the current dollar to euro conversion rate. But yes, I might buy one, if only to find out if the Appstore coder crowd will finally come up with some descent music apps. (Actually, after the iWork presentation, I was really hoping for a mobile GarageBand version).&lt;/p&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/6Z7uFbAfOqk&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/HP2KPu4Ptig&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/rszNC-R4B_o&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/Ug1fMiX5Jck&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/t56tOVEvI8M&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/_P_26DoBegw&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/XGhXQovzaps&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/AdybHUp9iBQ&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/IXR4x_qHC5E&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/whqYSuEaL6Q&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/c4vdIdYM8zw&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/dVPFk-x6_Vo&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/3KIlk4I4PWg&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/qfp1mLkIrqc&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/Hg_TtEqF00M&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/KfSNyUH3ZgE&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/1KYOV2UfYzY&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/RUVf58RVCRg&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/EOGEW43vXJs&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/UR_VLCy1Kmw&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/HPitpDgrlRU&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/Iwxv3Ztk7HE&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/iN0ZciiiKKU&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/2E8KiBCiLiA&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/fGRzfsc9XTE&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/e0p5Zscqnf8&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/EINoSU3Po4g&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/oz7RbSXxXYU&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/UIvkOfOboK0&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/s2A-l_c0HTY&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/ChxFPYw3cC0&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/cBQ89brGIq8&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/0hdq3p5Zdro&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/L6yl4eXutIA&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/AUs59N_Nmv4&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/Yf5BX9QF5O8&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/JT0d6RHhmW4&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/0TxhFjOUeYg&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/U0HWI6Wh82M&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/4TGNP67ARkk&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/jgCUnya0jJg&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/UThAJMrFKNk&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/PILSkb7TN0Q&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/l-X9dAggnMI&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/0Z18Je_4G58&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/VEzYMnhBKek&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/X-nPv9gQIQs&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/LYeJKg7aAH4&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/fP8cJxG3mHE&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/ozeM_SRxLsg&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/YGCKYOIHXUU&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/yogvhf93vHc&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/C8Dd8fEeoSc&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/sUPa1NPTxlg&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/64Db33kojVY&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/H9D8UV8JI6k&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/gwwO47YWW3w&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/ctmEuTM_hig&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/GUAyVsvSS4s&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/3PEM66QfBsk&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</content>
		<author>
			<name>jan.krutisch.de</name>
			<uri>http://jan.krutisch.de</uri>
		</author>
		<source>
			<title type="html">jan.krutisch.de</title>
			<subtitle type="html">An ongoing conversation between Jan Krutisch and the Interwebs on nothing in particular.</subtitle>
			<link rel="self" href="http://feeds.feedburner.com/jankrutisch/rss/"/>
			<id>http://feeds.feedburner.com/jankrutisch/rss/</id>
			<updated>2010-07-28T20:20:07+00:00</updated>
			<rights type="html">Copyright 2004-2009</rights>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">An update on the web synthesizer</title>
		<link href="http://feedproxy.google.com/~r/jankrutisch/rss/~3/8S9GsVyxDXc/"/>
		<id>http://jan.krutisch.de/en/2010/01/26/an-update-on-the-web-synth.html/</id>
		<updated>2010-01-25T23:00:00+00:00</updated>
		<content type="html">&lt;p&gt;After the &lt;a href=&quot;http://feeds.feedburner.com/en/2010/01/09/a-most-unusual-hack.html&quot;&gt;last post&lt;/a&gt; on my crazy &amp;#8220;synth in a browser&amp;#8221; idea, I tried various other concepts to bring the idea to life. I am not very happy with the current state, but definitely see potential in some of the ideas.&lt;/p&gt;
&lt;p&gt;After the rather brutal failure of the streaming idea (I guess, I could, with some serious hackery and a little more systematic approach, trim down latency to around 10sec which might be still way too much to be anywhere near beeing useful), I tried to explore other possibilities. If generating the sound on a server is out of question, I need to generate it in the client. Well, duh.&lt;/p&gt;
&lt;p&gt;Now, conventional wisdom says that this is probably too much for the obvious client choice: Javascript. Plus, there&amp;#8217;s no interface for &amp;#8220;streaming&amp;#8221; on the fly synthesized audio from javascript.&lt;/p&gt;
&lt;p&gt;But, as it seems, conventional wisdom was invented before Google Chrome, the V8 javascript VM or Safari and the Nitro engine came to life. I personally think that conventional wisdom was invented for a IE 5.0.&lt;/p&gt;
&lt;p&gt;So it should be at least worth a try. But even if it is possible to write a realtime software synthesis system in javascript (and I am only spilling a few beans when I tell you: it IS!), this leaves me with the problem of actually playing the generated sound.&lt;/p&gt;
&lt;p&gt;&lt;!--more--&gt;&lt;span id=&quot;more&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span id=&quot;more&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;My first idea was to write a Java applet. I hear you shake your head in a sad, slow motion, but here&amp;#8217;s why: When the Hobnox guys (You &lt;strong&gt;know&lt;/strong&gt; the Hobnox audio tool, right?) started the &amp;#8220;Adobe, make some noise&amp;#8221; campaign, because Flash 9 basically sucked for self generated audio, they actually used a Java applet to stream the sound.&lt;/p&gt;
&lt;p&gt;Basic sound output in Java is not too complicated (You want to take a look at javax.music.sampled.*), but communicating between Javascript and a Java applet involves a very inefficient, very sucky and also very old interface: The infamous LiveConnect. I don&amp;#8217;t know the details (and I have a vague feeling that I don&amp;#8217;t really want to know) on how the communication actually takes place, but I suspect there is some heavy serialization/deserialization involved. This would explain why it was completely impossible to transfer the sound data as actual arrays of integers (or whatever sample format floats your boat). The only way I could actually bring the communication to life was to use Strings as byte buffers. The remaining encoding issues produce a very subtle, almost analogue sounding noise/hiss, but at least I was able to produce a proof of concept: Yes, it is possible to use Javascript in a very modern browser (Safari in this case) to calculate some basic soft synth algos in realtime. Currently this means a uninterpolated Sawtooth passing through a 4 pole state variable filter with a simple one stage envelope on volume and filter.&lt;/p&gt;
&lt;p&gt;The drawbacks, apart from the (maybe fixable) encoding noise: While Java applets run (on OS X that is) in both Firefox and Safari, only Safari was able to handle the workload of the soft synth, Firefox simply falls flat on it&amp;#8217;s belly, aka &amp;#8220;slow script warning&amp;#8221;. While in theory Google Chrome should be the ideal browser to run the synthesizer, it currently does not support Java applets on the Mac. While in theory, both Java and javascript are garbage collected languages, this obviously doesn&amp;#8217;t mean that much in reality. I cannot rule out complete stupidity of me and my codes completely, but in my Book, browsers should not crash while simply using these two technologies.&lt;/p&gt;
&lt;p&gt;Wanna &lt;a href=&quot;http://github.com/halfbyte/SilentStreamer&quot;&gt;take a look&lt;/a&gt; at my crappy Java and javascript hacks?&lt;/p&gt;
&lt;p&gt;Okay, next try. Using flash was, at first not really an option, because my initial idea was to make the whole thing using mostly open technology. Plus: As written above, writing a realtime soft synth for flash is not a real challenge anymore: It has been done, more than once.&lt;/p&gt;
&lt;p&gt;On the other hand, Flash has a near-to-ideal market penetration. So why not using a hidden flash applet the same way I wanted to use the Java applet: Simply playing the sound, while the heavy lifting is done in javascript.&lt;/p&gt;
&lt;p&gt;At least I was able to use open source technology to try this: I recommend taking a look at &lt;a href=&quot;http://haxe.org&quot;&gt;haXe&lt;/a&gt; for your flash compiling needs.&lt;/p&gt;
&lt;p&gt;To cut a long story short: Ongoing investigations, outlook cloudy with some sun during the night. Communication between Javascript and Flash generally seems to be a magnitude faster than between Javascript and Java, because I really &lt;strong&gt;was&lt;/strong&gt; able to send a huge array of Floating Point numbers (!) from Javascript to flash. But you probably don&amp;#8217;t want to do that. The &lt;span class=&quot;caps&quot;&gt;CPU&lt;/span&gt; indicator in the menu bar looked more like a VU-Meter on the mixer of Paul von Dyk when I ran the example. Next I tried using integers instead of floats, but this only helped a bit. Currently I&amp;#8217;m back to trying to do it with Strings but didn&amp;#8217;t get it to work, again, I suspect some encoding problems.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;ll also push it up to github.com as soon as it is usable and doesn&amp;#8217;t chrash your browser right away.&lt;/p&gt;
&lt;p&gt;So, if I really want to kick some cool javascript synthesizer code on the &lt;a href=&quot;http://stockholm.musichackday.org&quot;&gt;musichackday &lt;span class=&quot;caps&quot;&gt;STHLM&lt;/span&gt;&lt;/a&gt;, I need to do a lot of work.&lt;/p&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/4vE7q97EhhE&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/AZO9L58zW6Q&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/hpn5YYH7aCM&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/TIhI_p_ymAA&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/POZiD4tmT3Q&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/TiAvLg_NdJg&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/w50Y_Bsn0B0&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/gM4CIR56Q9E&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/bZmS8zHArcg&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/axJHdNFbMzc&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/WaiKZ-n84t4&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/ElnCCqnETRk&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/5xq0_AknMTA&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/5C9UO0nweFA&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/1Vd7jLMefTY&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/8eKweTEGRw4&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/Y_NvUOPhIoU&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/d2o6nPdumYc&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/Ig7V4eTLsjM&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/eIqHPozXTDA&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/s6h9bYcPPHs&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/vJhFcxQ_qZo&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/NxjqfJO6w6E&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/pMmLJC4n9kI&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/tRnpAdzCyo8&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/SjlW6TFS3gM&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/jsFIKuC-mBA&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/1NhAC-MtYFA&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/0QuhATfuv0k&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/5KBDNvk29kc&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/-rQTwIKONdY&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/5tKG6b6UP6c&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/fvXJgSf9xBE&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/Em1pWuyA7JE&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/3cEjh8h_mhk&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/hIJvbID54yU&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/cK5KFrMLiVE&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/LKt4q8iyeXU&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/VTjnYMO49xQ&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/eLOndFap4nY&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/m_HLko-lnrw&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/_IliDuQz6ho&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/3QjMymbNekg&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/TN-LRmmBXyk&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/Re3Vlzw1f9I&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/b2ieuiU_7Qo&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/3a2-4l7ueZc&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/XbOVxNWG5Kk&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/K89DZLSuJDs&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/F97dHFHgH6o&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/w56yiZtbTrw&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/JOyGvn7vbWI&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/D93__mEQxLU&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/pLdNnsymlH0&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/OpxHkfyy8L0&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/T4lXm5NbZ60&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/Tuhln6cwC5k&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/o14OfQ1wU1A&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/rT8-BDJCUiU&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/8S9GsVyxDXc&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</content>
		<author>
			<name>jan.krutisch.de</name>
			<uri>http://jan.krutisch.de</uri>
		</author>
		<source>
			<title type="html">jan.krutisch.de</title>
			<subtitle type="html">An ongoing conversation between Jan Krutisch and the Interwebs on nothing in particular.</subtitle>
			<link rel="self" href="http://feeds.feedburner.com/jankrutisch/rss/"/>
			<id>http://feeds.feedburner.com/jankrutisch/rss/</id>
			<updated>2010-07-28T20:20:07+00:00</updated>
			<rights type="html">Copyright 2004-2009</rights>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Google Map Maker TED Talk und Karten Vergleich</title>
		<link href="http://feedproxy.google.com/~r/flyingsparks/posts/~3/DXQqJvoUkF8/"/>
		<id>http://fly.ingsparks.de/?p=745</id>
		<updated>2010-01-24T13:44:58+00:00</updated>
		<content type="html">&lt;p&gt; 	Als Google Mapmaker vor einer Weile ver&amp;#246;ffentlicht wurde, habe ich selbst nicht viel davon mit bekommen. Abgesehen von dem Kommentar aus der Openstreetmap-Community, das Google sich &lt;a href=&quot;http://www.opengeodata.org/2008/06/24/google-want-to-be-teleatlas/&quot;&gt;nicht die Rechte an Daten sichern sollte&lt;/a&gt;, die von Nutzern freiwillig f&amp;#252;r Google erstellt werden. Ein berechtiger Einwand, den Google aber durch &lt;a href=&quot;https://services.google.com/fb/forms/mapmakerdatadownload/&quot;&gt;die M&amp;#246;glichkeit zum Datendownload&lt;/a&gt; zum Teil entkr&amp;#228;ftet.&lt;/p&gt;
&lt;p&gt;Ein TED Talk hat mich jetzt aber noch einmal eine Blick auf Map Maker werfen lassen. In dem &lt;strong&gt;1,5 Minuten kurzen Video&lt;/strong&gt; beschreibt ein Google Mitarbeiter, das &lt;strong&gt;2005 nur 15 % der Erde durch gute Karten erfasst &lt;/strong&gt;waren. Ein Umstand, der die Hilfe in Krisensitutionen wie beim Tsunami oder aktuell in Haiti extrem erschwert. Seit dem Tsunami in 2005 haben in Google Map Maker tausende Freiwillige aus 170 L&amp;#228;ndern Millionen von Informationsschnipseln zusammengetragen.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://feeds.feedburner.com/wp-content/uploads/google-map-maker-daten-entwicklung-visualisiert.jpg&quot;&gt;&lt;img class=&quot;aligncenter&quot; title=&quot;google map maker daten entwicklung visualisiert&quot; src=&quot;http://feeds.feedburner.com/wp-content/uploads/google-map-maker-daten-entwicklung-visualisiert-550x157.jpg&quot; alt=&quot;google map maker daten entwicklung visualisiert&quot; width=&quot;550&quot; height=&quot;157&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
Visualiserung aus dem TED Talk: Entwicklung der Zeichnungen in Map Maker von 2005 bis 2009 (&lt;a href=&quot;http://feeds.feedburner.com/wp-content/uploads/google-map-maker-daten-entwicklung-visualisiert.jpg&quot;&gt;Vergr&amp;#246;&amp;#223;ern&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;In dem &lt;a href=&quot;http://google-latlong.blogspot.com/2008/06/making-your-mark-on-world.html&quot;&gt;Google Map Maker Launch Post&lt;/a&gt; gibt es eine weitere &lt;a href=&quot;http://3.bp.blogspot.com/_zJrVQFqitUA/SGA8f5wd-cI/AAAAAAAADTQ/Oe1KUdlsaTY/s1600-h/mapmaker.png&quot;&gt;sch&amp;#246;ne Grafik, die das Potential visualsiert&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Karten Vergleich Google Map vs. Google Map Maker&lt;/h2&gt;
&lt;p&gt;Laut dem TED Talk war die Ursprungsidee oder -motivation also, in Kriesenregionen gutes Kartenmaterial bereitzustellen. Und tats&amp;#228;chlich wird man, wenn man heute &lt;a href=&quot;http://www.google.com/mapmaker&quot;&gt;die Google Map Maker-Seite&lt;/a&gt; besucht, dort auf Haiti und den &lt;a href=&quot;http://sites.google.com/site/mappinghaiti/&quot;&gt;Aufruf, Haiti sauber zu kartografieren&lt;/a&gt;, hingewiesen.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Das sieht dann so aus:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;So sieht &lt;a href=&quot;http://www.google.com/mapmaker?hl=de&amp;ll=19.418516,-71.087036&amp;spn=0.107823,0.159988&amp;z=13&quot;&gt;die Google Map Maker Karte von einem Ort in Haiti&lt;/a&gt; aus:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://feeds.feedburner.com/wp-content/uploads/haiti-in-google-map-maker.png&quot;&gt;&lt;img class=&quot;alignnone size-medium wp-image-751&quot; title=&quot;haiti in google map maker&quot; src=&quot;http://feeds.feedburner.com/wp-content/uploads/haiti-in-google-map-maker-370x227.png&quot; alt=&quot;haiti in google map maker&quot; width=&quot;370&quot; height=&quot;227&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Und im Vergleich dazu &lt;a href=&quot;http://maps.google.de/maps?f=q&amp;hl=de&amp;q=haiti&amp;ie=UTF8&amp;hq=&amp;hnear=Haiti&amp;ll=19.419326,-71.100426&amp;spn=0.106365,0.15089&amp;z=13&quot;&gt;die Google Maps des gleichen Ortes&lt;/a&gt;. Ich w&amp;#252;sste gerne welche Daten jetzt genauer sind.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://feeds.feedburner.com/wp-content/uploads/haiti-in-google-maps.png&quot;&gt;&lt;img title=&quot;haiti in google maps&quot; src=&quot;http://feeds.feedburner.com/wp-content/uploads/haiti-in-google-maps-370x228.png&quot; alt=&quot;haiti in google maps&quot; width=&quot;370&quot; height=&quot;228&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Besonders sch&amp;#246;n finde ich, dass unten rechts im Map Maker die Personen aufgef&amp;#252;hrt werden, die an diesem Kartenausschnitt beteiligt waren. So kann man sich beispielsweise &lt;a href=&quot;http://www.google.com/mapmaker?gw=66&amp;uid=115269793286245755950&quot;&gt;&lt;strong&gt;das Profil&lt;/strong&gt; von Tony&lt;/a&gt;, einem in New York lebenden Studenten angucken, der unter anderem die Gemeindegrenzen f&amp;#252;r einen der Orte im Kartenausschnitt eingef&amp;#252;gt hat.&lt;/p&gt;
&lt;p&gt;Insgesamt ein wirklich sch&amp;#246;nes Projekt von Google mit beeindruckenden Ergebnissen.&lt;/p&gt;
&lt;p&gt;Und jetzt, hier noch der TED Talk:&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;
&lt;a href=&quot;http://www.ted.com/talks/lalitesh_katragadda_making_maps_to_fight_disaster_build_economies.html&quot;&gt;Lalitesh Katragadda: Making maps to fight disaster, build economies&lt;/a&gt;&lt;/p&gt;</content>
		<author>
			<name>flyingsparks</name>
			<uri>http://fly.ingsparks.de</uri>
		</author>
		<source>
			<title type="html">flyingsparks</title>
			<subtitle type="html">User Experience • User Centered Design • Interfacedesign • Webapplikationen</subtitle>
			<link rel="self" href="http://fly.ingsparks.de/feed/"/>
			<id>http://fly.ingsparks.de/feed/</id>
			<updated>2010-08-02T14:20:13+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Rails 3 @ DevHouseFriday</title>
		<link href="http://feedproxy.google.com/~r/railslabs/~3/G9JXAAWozTY/"/>
		<id>http://railslove.com/weblog/?p=561</id>
		<updated>2010-01-21T01:39:57+00:00</updated>
		<content type="html">&lt;p&gt;Am Freitag ist es wieder soweit - &lt;a href=&quot;http://devhouse.railslove.com/events/2&quot;&gt;das nächste DevHouseFriday steht an&lt;/a&gt;. Dieses mal sehen wir, zusammen mit &lt;a href=&quot;http://twitter.com/bumi&quot;&gt;Michael&lt;/a&gt;, hinter die Kulissen von Rails 3.0.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://railslove.com/weblog/wp-content/uploads/2010/01/rails3-300x254.png&quot; alt=&quot;rails3&quot; title=&quot;rails3&quot; width=&quot;300&quot; height=&quot;254&quot; class=&quot;alignleft size-medium wp-image-560&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Wir treffen uns wie immer in unserem Büro:&lt;/p&gt;
&lt;p&gt;Gothaer Allee 2&lt;br /&gt;
50969 Köln&lt;br /&gt;
&lt;a href=&quot;http://maps.google.com/maps?f=q&amp;source=s_q&amp;hl=en&amp;geocode=&amp;q=Railslove&amp;sll=50.959934,6.949285&amp;sspn=0.00988,0.027959&amp;ie=UTF8&amp;z=13&amp;iwloc=A&quot;&gt;Google Maps&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Wer für die weiteren DevHouses Themenvorschläge hat, oder was präsentieren möchte, der ist jederzeit eingeladen das &lt;a href=&quot;http://devhouse.railslove.com/&quot;&gt;hier&lt;/a&gt; anzukündigen.&lt;/p&gt;
&lt;p&gt;Weitere Infos gibt es natürlich auch auf &lt;a href=&quot;http://feeds.feedburner.com/twitter.com/devhousefriday&quot;&gt;Twitter&lt;/a&gt; und &lt;a href=&quot;http://twitter.com/railslove&quot;&gt;Twitter&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Wir freuen uns auf zahlreichen Besuch!&lt;/p&gt;
&lt;div class=&quot;feedflare&quot;&gt;
&lt;a href=&quot;http://feeds.feedburner.com/~ff/railslabs?a=G9JXAAWozTY:LHapnIXkueY:yIl2AUoC8zA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/railslabs?d=yIl2AUoC8zA&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/railslabs?a=G9JXAAWozTY:LHapnIXkueY:7Q72WNTAKBA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/railslabs?d=7Q72WNTAKBA&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/railslabs?a=G9JXAAWozTY:LHapnIXkueY:V_sGLiPBpWU&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/railslabs?i=G9JXAAWozTY:LHapnIXkueY:V_sGLiPBpWU&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;
&lt;/div&gt;</content>
		<author>
			<name>Railslove</name>
			<uri>http://railslove.com/weblog</uri>
		</author>
		<source>
			<title type="html">Railslove</title>
			<subtitle type="html">we love building web applications</subtitle>
			<link rel="self" href="http://feeds.feedburner.com/railslabs"/>
			<id>tag:railslabs.com,2007:mephisto/</id>
			<updated>2010-09-06T22:00:11+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Get rid off blue highlighting of focussed input fields in safari and google chrome</title>
		<link href="http://ruby.jazzanowak.de/get-rid-off-blue-highlighting-of-focussed-input-fields-in-safari-and-google-chrome/"/>
		<id>http://ruby.jazzanowak.de/get-rid-off-blue-highlighting-of-focussed-input-fields-in-safari-and-google-chrome/</id>
		<updated>2010-01-16T21:16:03+00:00</updated>
		<content type="html">&lt;p&gt;If you want to get rid off the blue highlighting of focussed input fields in safari and google chrome you have to add the following style to your input fields:&lt;/p&gt;
&lt;pre class=&quot;alt2&quot;&gt;
input {
  outline: 0 none;
}
textarea {
  outline: 0 none;
}&lt;/pre&gt;</content>
		<author>
			<name>Jazzanowak on Rails</name>
			<uri>http://ruby.jazzanowak.de</uri>
		</author>
		<source>
			<title type="html">Jazzanowak on Rails</title>
			<subtitle type="html">Daniel Nowak about Software Developing</subtitle>
			<link rel="self" href="http://feeds.feedburner.com/JazzanowakOnRails"/>
			<id>http://feeds.feedburner.com/JazzanowakOnRails</id>
			<updated>2010-02-25T11:00:07+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">The Hudson Siren - Small pieces loosely joined</title>
		<link href="http://feedproxy.google.com/~r/jankrutisch/rss/~3/MLASW70H30w/"/>
		<id>http://jan.krutisch.de/en/2010/01/13/the-hudson-siren-small-pieces-loosely-joined.html/</id>
		<updated>2010-01-12T23:00:00+00:00</updated>
		<content type="html">&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/jankrutisch/4272142306/&quot; title=&quot;hudson-siren by jan_krutisch, on Flickr&quot;&gt;&lt;img src=&quot;http://farm5.static.flickr.com/4057/4272142306_e1074a8ec7_m.jpg&quot; width=&quot;240&quot; height=&quot;160&quot; alt=&quot;hudson-siren&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;A strong, intrusive indicator for continuous integration failures is extremely useful to keep software quality high. People tend to forget the CI stage if nothing seems to go wrong. And while the usual CCTray-Stuff &amp;#8220;kind of&amp;#8221; works, a more physical approach may be in order for larger teams. While large &amp;#8220;information radiator&amp;#8221; screens might be desirable, we chose to go a lot cheaper. One of my colleagues, the recent Rails convert &lt;a href=&quot;http://twitter.com/rumheulen&quot;&gt;Christoph&lt;/a&gt; actually took the first, most important step and implemented the actual notification hardware, using freely available &amp;#8220;police lights&amp;#8221;, a simple &lt;span class=&quot;caps&quot;&gt;USB&lt;/span&gt; driven relais board and a Linksys NSLU2. His work was pretty outstanding: It involved crosscompiling USBLib for the NSLU2 (not to forget installing &lt;a href=&quot;http://www.nslu2-linux.org/wiki/Debian/HomePage&quot;&gt;Debian&lt;/a&gt; on it), wiring it all together and then writing some kind of network protocol for it. Now, the actual protocol is pretty simple: Open a telnet connection (aka &lt;span class=&quot;caps&quot;&gt;TCP&lt;/span&gt;/IP-Socket) to a specific port and send a command like &amp;#8220;&lt;span class=&quot;caps&quot;&gt;BLINK&lt;/span&gt; 3 &lt;span class=&quot;caps&quot;&gt;RED&lt;/span&gt;&amp;#8221;  to it. This is, of course, &amp;#8220;Keep it simple stupid&amp;#8221; aka &lt;span class=&quot;caps&quot;&gt;KISS&lt;/span&gt; at it&amp;#8217;s best.&lt;/p&gt;
&lt;p&gt;Except that now we were faced with a problem: Our CI servers are outside of our office network and you probably don&amp;#8217;t want to expose a relatively insecure protocol (with an implementation that&amp;#8217;s very likely to contain bugs an attacker could exploit). So, portforwarding from our firewall was out of question. In a very KISSy move, my colleague Timo set up some &lt;span class=&quot;caps&quot;&gt;SSH&lt;/span&gt; tunneling and then wrote a simple Hudson-Plugin which would then use the above mentioned protocol via the &lt;span class=&quot;caps&quot;&gt;SSH&lt;/span&gt; tunnel. This worked for some time but then we split up our CI server installations (and after that only Java projects could use the Sirens) and anyway, this was a bad kludge, so when the tunnel went down some day due to a server restart, we never restarted it.&lt;/p&gt;
&lt;p&gt;&lt;!--more--&gt;&lt;span id=&quot;more&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span id=&quot;more&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;So, one day, I simply thought &amp;#8220;what the heck&amp;#8221; and implemented a &lt;a href=&quot;http://github.com/halfbyte/siren-ws&quot;&gt;siren web service&lt;/a&gt; in &lt;a href=&quot;http://www.sinatrarb.com/&quot;&gt;Sinatra&lt;/a&gt;. The web service would simply open the socket and send the command into our own network while it would sit on a server with a public facing Port 80. All in all it took something like 4 hours to implement all of it and deploy it on the server. The hardest problem was how to configure our &lt;span class=&quot;caps&quot;&gt;OSX&lt;/span&gt; server to serve the app via Passenger and the built in Apache and then setting up the web configuration. The app takes &lt;span class=&quot;caps&quot;&gt;POST&lt;/span&gt; requests on URLs like /red and /blue with additional params to specify style and length of the signal, and also has some &lt;span class=&quot;caps&quot;&gt;GET&lt;/span&gt; actions that display help pages and utility forms to enable human endusers to engage the siren for testing purposes (or practical jokes on teams in crunch mode).&lt;/p&gt;
&lt;p&gt;The only thing left to do was now to adapt the Hudson-Plugin from above to use the web service instead of the socket connection. And here, my rarely used generalisation instinct kicked in: Wouldn&amp;#8217;t it be nice if we had a generic webhook plugin for hudson, so that we could trigger all kinds of actions with it? Yeah, probably, but the &lt;a href=&quot;http://github.com/halfbyte/hudson-webhook&quot;&gt;plugin&lt;/a&gt; is not-quite-finished, sorry.&lt;/p&gt;
&lt;p&gt;So now, today, I took Timo&amp;#8217;s source and ripped out the hardcoded socket code and replaced it with some hardcoded http code.&lt;/p&gt;
&lt;p&gt;Which means that the mindmatters siren is back in action. And that&amp;#8217;s a good thing.&lt;/p&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/tvomP1DigvQ&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/-4NOQZ--q-k&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/OY_4jRm7YjY&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/8gUqtSq9x18&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/acEpj4ddXPA&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/f0HxN117AtA&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/JJZeeaDo_S8&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/Xup3QoR8KKY&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/TdmiWb5WsWE&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/kynyCc9hYgo&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/1tp7EvnaQ6I&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/BDJumVEriT0&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/Z21NgeSFkXA&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/8vXv6OBXhRo&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/5TEV9pE6pkw&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/M09sBhORzac&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/OAdfUlzYBUk&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/7yHeCbGV2dU&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/afnBsWKBo0c&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/NUCr6zA-Cgg&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/_SC-J8TXGOc&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/_IXx3aBUxIk&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/qRRncUVDPco&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/TRBt2XusXM0&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/7JxdZBYHgiI&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/VyWq8gDPGzk&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/DB1JEaco9LI&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/6-MexUw_Eek&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/f4BdBfOTRao&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/DbHkfTjq4dI&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/Kro396uezr4&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/m3HjlWzgIGQ&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/QFU8geH2noQ&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/Eu-f_05zjag&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/4h6piniBOKQ&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/o0l_bAgpL5E&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/CdmhkJCXnkM&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/e-Ncxa2d0F8&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/a41rf01SX-I&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/WgtZV-zJ-a0&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/ETDqzTIck4g&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/MzolSrUJIuI&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/afhy1gxIPyI&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/KDLeutwhQFQ&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/U2l35vGVUgw&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/77o5tsLbprI&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/WqLKSLVUE_M&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/JAEwSeJUD8I&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/WDzrET12qK4&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/Bs8qlmjE35k&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/i5FSm7ApYM0&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/wXmSeEON1NU&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/H8sz6mlUEBI&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/ePGeMa2Bwxg&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/A96nT1V-D_I&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/ZIn3vkgAIkc&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/9IsjD9Zp8yA&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/RTl9nD7a4wE&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/ZB0oK5M59vI&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/MLASW70H30w&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</content>
		<author>
			<name>jan.krutisch.de</name>
			<uri>http://jan.krutisch.de</uri>
		</author>
		<source>
			<title type="html">jan.krutisch.de</title>
			<subtitle type="html">An ongoing conversation between Jan Krutisch and the Interwebs on nothing in particular.</subtitle>
			<link rel="self" href="http://feeds.feedburner.com/jankrutisch/rss/"/>
			<id>http://feeds.feedburner.com/jankrutisch/rss/</id>
			<updated>2010-07-28T20:20:07+00:00</updated>
			<rights type="html">Copyright 2004-2009</rights>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Redis and Rails sitting on the Couch</title>
		<link href="http://www.paperplanes.de/2010/1/12/redis_and_rails_sitting_on_the_couch.html"/>
		<id>http://www.paperplanes.de/archives/2010/1/12/redis_and_rails_sitting_on_the_couch/</id>
		<updated>2010-01-12T00:00:00+00:00</updated>
		<content type="html">&lt;p&gt;I've been spending some quality time with two of my new favorite tools lately (&lt;a href=&quot;http://couchdb.apache.org/&quot;&gt;CouchDB&lt;/a&gt; and &lt;a href=&quot;http://code.google.com/p/redis&quot;&gt;Redis&lt;/a&gt;, duh!), and while integrating them into &lt;a href=&quot;http://scalarium.com&quot;&gt;Scalarium&lt;/a&gt; some needs and as a result some smaller hacks emerged. I don't want to deprive the world of their joy, so here they are.&lt;/p&gt;

&lt;p&gt;First one is a tiny gem that will allow you to use Redis as a session store. What's so special about it, there's &lt;a href=&quot;http://github.com/jodosha/redis-store&quot;&gt;redis-store&lt;/a&gt;, right? Sure, but I couldn't for the life of me get to work reliably. Seems that's due to some oddity in Rack or something, at least that's where my interest of further investigating the issues faded, and I decided to just rip the code off MemCacheStore, and there you have it, &lt;a href=&quot;http://github.com/mattmatt/redis-session-store&quot;&gt;redis-session-store&lt;/a&gt;. Rails-only and proud of it.&lt;/p&gt;

&lt;p&gt;While working on it I constantly kept a monitor process open on Redis. Great feature by the way, if not awesome. I used telnet, and somehow I constantly managed to hit Ctrl-C in the terminal I had the telnet session open in. Reconnecting manually is tedious, so I give you my little redis-monitor script:&lt;/p&gt;



&lt;p&gt;Incredibly simple, but saves those precious moments you'd waste typing everything by hand.&lt;/p&gt;

&lt;p&gt;Last but not least, here's a hack-ish patch to make &lt;a href=&quot;http://github.com/langalex/couch_potato/&quot;&gt;CouchPotato&lt;/a&gt; (great CouchDB Ruby library by the way) dump view queries into the log file. The ugly part at the end is me trying to get the log that's output at the end of each request to include the DB time for CouchDB queries.&lt;/p&gt;



&lt;p&gt;It's not great, but works for now. We'll very likely include something decent into CouchPotato without hacking into ActionController like that. Unfortunately to get this far, there's really no other way. I tried faking ActiveRecord, but you open a whole other can of worm doing that, because a lot of code in Rails seems to rely on the existance on the ActiveRecord constant, assuming you're using the full AR stack when the constant is defined. Here's hoping that stuff is out the door in Rails 3. Haven't checked to be honest.&lt;/p&gt;

&lt;p&gt;Dump that file into an initializer, and you're good to go (for the moment). &lt;/p&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/Paperplanes/~4/gD-a80HmZ-c&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</content>
		<author>
			<name>paperplanes</name>
			<uri>http://www.paperplanes.de</uri>
		</author>
		<source>
			<title type="html">paperplanes</title>
			<subtitle type="html">software development that flies</subtitle>
			<link rel="self" href="http://feeds.feedburner.com/Paperplanes"/>
			<id>http://feeds.feedburner.com/Paperplanes</id>
			<updated>2010-09-03T16:40:18+00:00</updated>
			<rights type="html">Copyright 2007-2009</rights>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">A most unusual hack</title>
		<link href="http://feedproxy.google.com/~r/jankrutisch/rss/~3/8zv-nVqEKEo/"/>
		<id>http://jan.krutisch.de/en/2010/01/09/a-most-unusual-hack.html/</id>
		<updated>2010-01-08T23:00:00+00:00</updated>
		<content type="html">&lt;p&gt;Sometimes, you have to take a bath to make things come together. In my case, I was pondering porting the absolutely fabulous &lt;a href=&quot;http://nanoloop.com&quot;&gt;nanoloop&lt;/a&gt; to the iPhone platform. But that was only one piece of the puzzle. The other one was a podcast (&lt;a href=&quot;http://www.bitsundso.de&quot;&gt;Bitsundso&lt;/a&gt;) where one of the regulars (namely &lt;a href=&quot;http://blog.kyri0s.org/post/271121944/deploying-apples-http-live-streaming-in-a-gnu-linux&quot;&gt;Thorsten Philipp&lt;/a&gt;) was explaining the brand new apple flavor of http streaming &amp;#8211; Which is based on delivering a video or audio stream in small chunks (8-10 seconds seems to be a good value) and glueing them together using an extended version of m3u-playlists.&lt;/p&gt;
&lt;p&gt;But first, a bit of background. Nanoloop is a music synthesizer/sequencer for the Gameboy, more specificly for the Gameboy Classic and the Gameboy advance (those are two different versions). I am a proud owner of one of the Nanoloop 2.3 cartridges, wich are handmade by Hamburgian resident and 8Bit-Superstar Oliver Wittchow. Editing music with the not-exactly-rich user interface of a handheld game console (a screen and 10 buttons: Left, Right, Up, Down, Start, Select, A, B, L and R) is challenging. Managable and, as Youtube or even my very own Soundcloud stream testifies, with usable results, but, nevertheless, far from being intuitive. Oliver did his best to streamline the experience and to make everything as consistent as possible, but still.&lt;/p&gt;
&lt;p&gt;Now, my plan was (and still is) to either convince Oliver to port Nanoloop to the iPhone or to do a knock off of it myself. Here&amp;#8217;s the problem: While porting the sound engine should not be a huge problem (both devices are using &lt;span class=&quot;caps&quot;&gt;ARM&lt;/span&gt; architecture, plus the iPhone should be an order of a magnitude faster), the interface has to be completely different. Because the iPhone has no buttons. Well, strictly speaking it has four buttons and a rocker switch, but none of them are usable in your own software. What it has, though, is a touch screen. Multitouch, even.&lt;/p&gt;
&lt;p&gt;&lt;!--more--&gt;&lt;span id=&quot;more&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span id=&quot;more&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;So the real challenge of a nanoloop port would be to convert the user interface from a stricly &amp;#8220;hold button A and use cursor keys to change the value of the current note&amp;#8221; interface to a simple, elegant and intuitive touch interface. Because, you know, as unintuitive the button interface may seem at first, as with every game controller, after a few hours of usage, it all starts to make sense. And in the end, you are pretty fast using the damn thing. Because, there are worlds to rescue. Or songs to write. And you&amp;#8217;d have to be extremely careful not to lose this sense of speed when converting the interface to a touch version.&lt;/p&gt;
&lt;p&gt;Anyway, since I am a much better HTML+Javascript coder than I am an iPhone developer, I thought, well, let&amp;#8217;s prototype the interface in &lt;span class=&quot;caps&quot;&gt;HTML&lt;/span&gt;. I could even build a version that&amp;#8217;s compatible to the iPhone, so one could check the usability on the target device.&lt;/p&gt;
&lt;p&gt;And then I thought: Yeah, well, but why stop there. Why not building a web version of Nanoloop. With a serverside sound generator and with realtime streaming, using this cool new Apple technology.&lt;/p&gt;
&lt;p&gt;So, here we go. In the following, I&amp;#8217;ll describe parts of the puzzle and how I solved them. Please note that this is far from finished, all that&amp;#8217;s there as I speak is a very rough prototype that has enough problems to make a hard man cry. Nevertheless, you can find the code on &lt;a href=&quot;http://github.com/halfbyte/webloop&quot;&gt;github&lt;/a&gt; .&lt;/p&gt;
&lt;h3&gt;The Interface&lt;/h3&gt;
&lt;p&gt;I started off with the interface. This is what the nanoloop interface looks most of the time:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/whaleforset/505954313/&quot; title=&quot;nanoloop by whaleforset, on Flickr&quot;&gt;&lt;img src=&quot;http://farm1.static.flickr.com/222/505954313_b5971e7826_m.jpg&quot; width=&quot;160&quot; height=&quot;144&quot; alt=&quot;nanoloop&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The grey boxes are 16 steps of a simple step sequencer and the black small rectangles are the visualisation of the data you edit (the screen you look at is for editing per step pitch envelopes).&lt;/p&gt;
&lt;p&gt;I decided to use the canvas element for the visualisation. I am still not sure if something like &lt;span class=&quot;caps&quot;&gt;SVG&lt;/span&gt; (and raphael.gs for example) would not be better, but, hey, this is just a first shot. I also decided to use one canvas element per step. So it&amp;#8217;s 16 little canvasses there, neatly aligned and centered on the screen. The rest is just a big fat, query based javascript hack that will need a lot of refactoring, very soon.&lt;/p&gt;
&lt;p&gt;Don&amp;#8217;t expect much of a good interface conversion, too. I just did the first thing that came to mind, namely popping up a bigger version of the step as soon as you click on one and closing it again after you click into this big step window. A real iphone version would most certainly allow such a click action as well as a &amp;#8220;press-down, open big step, adjust values, release, close big step&amp;#8221; variant. But, it&amp;#8217;s a start.&lt;/p&gt;
&lt;h3&gt;The Synth&lt;/h3&gt;
&lt;p&gt;The next thing I tackled was the sound generation. I briefly thought about reusing my cmusic code from &lt;a href=&quot;http://soundbadge.net&quot;&gt;Soundbadge&lt;/a&gt; but I wasn&amp;#8217;t sure if cmusic would be flexible enough for the stuff I had in mind. What I really wanted was using ruby for the sound generation. So I started to look for a way to render sound files from ruby. Remember: The goal was to output small chunks of audio in a format understandable by Quicktime. My thinking was &amp;#8220;naw, encoding mp3 in ruby will probably be a dealbreaker, so simply render out wav files and encode them using a command line utility to something usable.&amp;#8221;. And something great I found. The Ruby Application Archive spat out &lt;a href=&quot;https://ccrma.stanford.edu/software/snd/sndlib/&quot;&gt;sndlib&lt;/a&gt; a library for a lot of sound related stuff written in C with bindings for Ruby and quite some other languages. You only get the source, so it&amp;#8217;s configure&amp;gt;make time, but that was pretty easy. The first pifall was that the usual &amp;#8220;sudo make install&amp;#8221; didn&amp;#8217;t install the ruby extension into the right place. So I had to manually copy the sndlib.bundle file (Yep, I&amp;#8217;m on a mac, under Unix, this probably woulda been sndlib.so) to /usr/lib/ruby/site_ruby/1.8/universal-darwin10.0/ yadda, yadda. Be also prepared for what may very well be the worst documentation for a project, evar.&lt;/p&gt;
&lt;p&gt;But the binding is actually quite nice. There&amp;#8217;s a cool SoundData utility class which will act as a sample buffer which you can use to write to the sound files (or sound hardware, if you must).&lt;/p&gt;
&lt;p&gt;It also contains quite a few utility functions to generate music and currently I&amp;#8217;m using both the sawtooth generator to create the base sound for my synthesizer and the envelope generator.&lt;/p&gt;
&lt;p&gt;Hacking the synth together was pretty easy. Writing the sound files in wav format, using the correct, fixed chunk size was a bit hairy and I also expect some bugs to lurk around there (more on that later). Bringing it all to work with Quicktime was a pretty bad experience. Not that anything in there is complicated (you most probably want to use ffmpeg for encoding the files although in theory lame should be fine), but the level of feedback you can expect from Quicktime if anything is wrong feels like it&amp;#8217;s 1991 all over again. Error -120203 or something like that. Yeah, right, that one. The devil is in the detail, in my case, my playlist had a small syntax error.&lt;/p&gt;
&lt;h3&gt;The Streaming&lt;/h3&gt;
&lt;p&gt;Ah, while we&amp;#8217;re at it. The playlist. To concat all the small bits of sound into a coherent music stream, you&amp;#8217;ll need a playlist. since it is realtime streaming, it&amp;#8217;s a playlist with a sliding window of stream urls in it. Let&amp;#8217;s say you have generated 3 streaming parts up to now. The playlist would look something like this:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;#EXTM3U
#EXT-X-TARGETDURATION:5
#EXT-X-ALLOW-CACHE:yes
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:5,
http://halfmac.local/~jan/webloop/app/test_1.ts
#EXTINF:5,
http://halfmac.local/~jan/webloop/app/test_2.ts
#EXTINF:5,
http://halfmac.local/~jan/webloop/app/test_3.ts
&lt;/pre&gt;
&lt;/div&gt;&lt;p&gt;Now, if you have your 1000th part generated, the playlist would look like this (I left out the unimportant header bits)&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;#EXT-X-MEDIA-SEQUENCE:995
#EXTINF:5,
http://halfmac.local/~jan/webloop/app/test_995.ts
#EXTINF:5,
http://halfmac.local/~jan/webloop/app/test_996.ts
#EXTINF:5,
http://halfmac.local/~jan/webloop/app/test_997.ts
#EXTINF:5,
http://halfmac.local/~jan/webloop/app/test_998.ts
#EXTINF:5,
http://halfmac.local/~jan/webloop/app/test_999.ts
#EXTINF:5,
http://halfmac.local/~jan/webloop/app/test_1000.ts
&lt;/pre&gt;
&lt;/div&gt;&lt;p&gt;So, but how does the streaming work now? Easy. The client (The only client that can do this right now, is quicktime) loads the playlist, fetches the first few stream bits and starts playing them. As soon as it comes to the end of the playlist, it reloads the playlist which now should, ideally, contain links to new streaming bits. To let the client know where exactly he should look, you provide the #&lt;span class=&quot;caps&quot;&gt;EXT&lt;/span&gt;-X-&lt;span class=&quot;caps&quot;&gt;MEDIA&lt;/span&gt;-&lt;span class=&quot;caps&quot;&gt;SEQUENCE&lt;/span&gt; tag.&lt;/p&gt;
&lt;p&gt;Now, to be able to stream the generated sound, sound generation needs to be faster than realtime (because of the additional step of converting the wave to a streamable format). Luckily, this is, at least on my Core II Duo iMac, still the case. I&amp;#8217;m most curious how well this will work on, let&amp;#8217;s say, a vServer where I could deploy this stuff.&lt;/p&gt;
&lt;h3&gt;The Duct Tape&lt;/h3&gt;
&lt;p&gt;So I had the sound generation in place, the last thing to do was to glue the web interface and the sound generation together.&lt;/p&gt;
&lt;p&gt;Sinatra to the rescue: Three actions, one to transmit changes from the frontend to the server, one to poll the data so that the web editor is updated if someone else at the other end of the world changes something in his view (yes, this is a distributed sound editor, please don&amp;#8217;t get too exited&amp;#8230;), one to fetch the playlist (Quicktime is a bit picky on the mime type the playlist has to be delivered in, that&amp;#8217;s why I have to deliver the playlist with an action).&lt;/p&gt;
&lt;p&gt;The last bit is almost boring: Safari, in it&amp;#8217;s current incarnation, supports the html5 audio tag. What&amp;#8217;s even better: It supports quicktime realtime streaming using the audio tag. Here&amp;#8217;s the code:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;audio&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;src=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;/playlist.m3u8&amp;quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;autoplay=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;autoplay&amp;quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;autobuffer=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;autobuffer&amp;quot;&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;&lt;p&gt;yip, that&amp;#8217;s it. It starts playing (most of the time) as soon as you open the page.&lt;/p&gt;
&lt;p&gt;Data storage for the pattern data is currently extremely high tech: A yaml file. A good idea would probably be to change this to an in-mem store (memcached, redis maybe?) and randomly write it to disk to have a backup.&lt;/p&gt;
&lt;h3&gt;The Drawbacks&lt;/h3&gt;
&lt;p&gt;Well, streaming always comes with latency. Since this http streaming doesn&amp;#8217;t involve any kind of QoS control or other forms of stream control I don&amp;#8217;t know shit about, http streaming seems to come with very much latency. I&amp;#8217;m pretty sure you could tweak it by setting different chunk sizes and stuff, but here you go. Having a sound editor with over 20 seconds of latency is probably not very practical (although I must say that the nature of nanoloops editor makes it quite possible to work with it).&lt;/p&gt;
&lt;p&gt;The other problem is that playback is not entirely bug free (as stated above). Sometimes it seems as if the chunks align perfectly, sometimes they don&amp;#8217;t. I am not done debugging this, but maybe there&amp;#8217;s an underlying problem I didn&amp;#8217;t see in the first place.&lt;/p&gt;
&lt;h3&gt;The Future&lt;/h3&gt;
&lt;p&gt;First of all, the user interface code needs some mean refactoring. Then I could add different pattern views to allow editing more than one parameter. I have at least two parameters (Envelope and Sound) that are already present in the synth (and also in the pattern yaml file), so this should be fun and easy.&lt;/p&gt;
&lt;p&gt;Next up: I was thinking a bit more about the synthesizer infrastructure and maybe I should try to aim for a bit more of a flexible infrastructure and a variable backend. The current solution works, but poorly and is extremely low tech. So, why not making the synth entirely realtime and stream based (makes it more fun to debug if you could listen directly to it) and then using the recipe of Thorsten Philipp to take a real stream and slash it into pieces. That way, I could also stream it as an icecast stream if I wanted to.&lt;/p&gt;
&lt;p&gt;Ah, the possibilites. Good to know that there&amp;#8217;s a music hackday coming up :)&lt;/p&gt;
&lt;h3&gt;The Video&lt;/h3&gt;
&lt;p&gt;Last but not least, I give you this:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/2AsSwflXrV4&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/I9MxNVQh614&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/BnCuCIwRBPg&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/nIm6pOAJjcI&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/u8wqWLQhV-c&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/_0D1YBay7xY&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/PE5Fusp-6o4&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/LVTczcBktP8&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/BB9FEEGl_W0&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/aBk2Wc7VWvA&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/QvxbST6S89I&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/_AQKkFQ5r7c&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/18T-Sw2rJsk&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/T-w69X479lU&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/1F15JHw-f8E&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/lnLGcA5ETMI&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/nJpArhlegzM&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/UeFHEe_6jMw&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/gl-Y4R2RGL0&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/NKKXo3htCXs&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/sPBiyVDaOVc&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/8F3--5aVgpg&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/-IkTHXAhoUg&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/yzs0_lX6dEg&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/GrE1fN--owM&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/9_mM-tW2q4I&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/fTNKarYaGAw&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/uXHPpzA3wwA&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/pPzDT3Dpoew&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/bNeWqW_zmsI&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/GIBqFhhLYas&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/NyfGwfp5A_8&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/fYzwcb7waf4&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/PutyRQh0_vU&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/yZZlJjQd6b0&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/5d2VKnMOZgw&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/8nbhKTFt7FM&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/bmjrBhsGFrM&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/zEuG3hmR0OI&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/W3hUbapB1Ok&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/bKrE9Yii1QM&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/BF-6ueaWiqA&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/X6u-doXq4PI&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/1ONMEU4Ej_c&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/0UzNKo5Um9g&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/9hJ2VocSLHU&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/zXeQHVCzGac&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/JOVDk1qmUcg&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/YLilHeeJ-24&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/qfiZWSPLSlw&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/A1_lHh-46f4&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/RVxe-IqPEXo&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/PmjBFIDNKIw&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/DY5uHJpIEU0&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/OJeVTZMQuPs&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/Dt6CR2jxS8g&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/0oeyFS6di7w&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/MKuqQj0BvTM&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/luy7i8U8RNM&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/8zv-nVqEKEo&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</content>
		<author>
			<name>jan.krutisch.de</name>
			<uri>http://jan.krutisch.de</uri>
		</author>
		<source>
			<title type="html">jan.krutisch.de</title>
			<subtitle type="html">An ongoing conversation between Jan Krutisch and the Interwebs on nothing in particular.</subtitle>
			<link rel="self" href="http://feeds.feedburner.com/jankrutisch/rss/"/>
			<id>http://feeds.feedburner.com/jankrutisch/rss/</id>
			<updated>2010-07-28T20:20:07+00:00</updated>
			<rights type="html">Copyright 2004-2009</rights>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Eine kleine schwedische Meiereikunde</title>
		<link href="http://feedproxy.google.com/~r/jankrutisch/rss/~3/mb2zwtCnqqU/"/>
		<id>http://jan.krutisch.de/de/2010/01/07/eine-kleine-schwedische-meiereikunde.html/</id>
		<updated>2010-01-06T23:00:00+00:00</updated>
		<content type="html">&lt;p&gt;Jetzt wo der &lt;a href=&quot;http://www.floriansiepert.com/&quot;&gt;Herr Siepert&lt;/a&gt; nicht mehr nur Foodbloggt, könnte ich doch eigentlich auch mal anfangen, Foodzubloggen. Ich hab da leider nicht so viel kulinarische Sexyness beizutragen wie ebenjeniger, aber jeder hat mal klein angefangen.&lt;/p&gt;
&lt;p&gt;Jeder, der mich ein bisschen besser kennt, weiss, das ich gefühlt ein halber Skandinavier bin. Ich bin fast jeden Sommer in Schweden, nach &amp;#8217;ner Woche da oben radebreche ich sogar ganz passabel Schwedisch. Auch Dänemark ist mir nicht fremd, im Gegensatz zu dem klassischen Dänemark-Urlauber kenne ich mich allerdings auf Seeland, Lolland und Falster wesentlich besser aus als auf dem &amp;#8220;Festland&amp;#8221;.&lt;/p&gt;
&lt;p&gt;Nundenn. Wie es das Schicksal wollte, verbrachte ich den Jahreswechsel auch in Dänemark, und zwar in &lt;a href=&quot;http://www.lalandia.dk/&quot;&gt;Lalandia&lt;/a&gt;, ein Ort, den der geneigte Individual-Reisende vermutlich ganz abscheulich findet (Think: Dänische Version der Center Parcs), der aber den Vorteil hatte, ein ganz hervorragendes Schwimmbad zu besitzen und Ferienhäuser mit freiem &lt;span class=&quot;caps&quot;&gt;WLAN&lt;/span&gt;. Schon sehr Massentouristisch (und über den Jahreswechsel erschreckend voll) und für mich sicher kein Ort, an dem ich drei Wochen Sommerurlaub verbringen möchte. Für unsere spontane Flucht aus dem Großstadt-Sylvester-Wahnsinn war es jedenfalls ideal.&lt;/p&gt;
&lt;p&gt;Aber eigentlich sollte es doch um Milchprodukte gehen, also wo war ich stehen geblieben? Ach ja. In Dänemark muss ich natürlich Ymer kaufen. Und dann kam meine Freundin auch noch mit Dingen aus Schweden (wo sie den ausgewanderten Teil Ihrer Familie besuchte). Und so entstand die Idee, dem geneigten Leser einmal kurz die Vorzüge der skandinavischen Meiereiprodukte nahezubringen. Denn ich stelle immer wieder gerade bei frischgebackenen Skandinavien-Neulingen fest, dass man sich nicht so recht rantraut an all die komischen Dinge, die sich da im Kühlregal stapeln. Was nicht weiter verwunderlich ist, denn erstens sind die Namen nicht selbsterklärend und zweitens ist die Schnittmenge mit den uns Deutschen vertrauten Milchprodukten nicht sonderlich groß.&lt;/p&gt;
&lt;p&gt;&lt;!--more--&gt;&lt;span id=&quot;more&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Wie immer fängt alles mit Milch an. Die heisst in Schweden Mjölk (nicht zu verwechseln mit Mjöl, das ist Mehl, har har), in Dänemark Mælk und in Norwegen Melk. Natürlich gibt es auch in Schweden Fettreduzierte Milch, die heisst dann Lättmjölk (0,5% Fett) oder Mellanmjölk (1,5% Fett). In Norwegen kann man übrigens durchaus etwas derangiert vor dem Milchregal stehen: H-Melk ist dort Vollmilch (Helmelk) und eben nicht länger haltbar. Von allen skandinavischen Milch-Sorten ist die Norwegische übrigens, wie ich finde, die leckerste, was daran liegen könnte, das sie in der Regel bis zu 3.7% Fett hat. Eat that.&lt;/p&gt;
&lt;p&gt;Kurzer Einschub: Die Milch kommt in Dänemark und Schweden überwiegend von Arlafoods. Arlafoods ist ein krasser Großkonzern, den man in Deutschland vor allem als Hersteller vom Frischkäse &amp;#8220;Buko&amp;#8221; kennt oder aber von der Butter &amp;#8220;Kærgarden&amp;#8221;. Arlafoods ist in 2000 aus der Schwedischen &amp;#8220;Arla&amp;#8221; und der Dänischen &amp;#8220;MD Foods&amp;#8221; enstanden. &amp;#8220;MD Foods&amp;#8221; stammt wiederum aus einer Fusion von MD Foods und Kløver Mæelk, den Namen und das Kleeblatt-Logo dürfte einigen langjährigen Dänemarkurlaubern durchaus ein Begriff sein. Die &amp;#8220;Arla&amp;#8221; wiederum hiess bis 1975 Mjölkcentralen.&lt;/p&gt;
&lt;p&gt;Machen wir weiter mit den Gemeinsamkeiten der deutschen und skandinavischen Milchlandschaft: Sahne heisst in Schweden Grädde und in Dänemark Fløde. (Rød Grøte med Fløde anyone?). Schlagsahne kann man tatsächlich relativ direkt übersetzten: Vispgrädde und Piskefløde. Und dann: Gibt es eigentlich in normalen deutschen Supermärkten so etwas wie Kochsahne zu kaufen? Hansano behauptet zumindest, sie hätten sowas im Programm. Im wesentlichen handelt es sich dabei um eine etwas leichtere Sahne (die sich deswegen wohl auch nicht mehr zum aufschlagen eignet) mit ca. 15% Fettgehalt. Im Schwedischen haben wir es hier mit Matlagningsgrädde (oder kurz: Matgrädde) zu tun, im dänischen mit Matlavningsfløde (das musste ich jetzt tatsächlich gerade mal nachsehen).&lt;/p&gt;
&lt;p&gt;Weiter in Richtung Fett: Butter heisst im dänischen Smør und im schwedischen Smör. Butter ist in Skandinavien traditionell gesalzen. Das muss man mögen, ich finde es großartig. In Schweden gibt es zwei Sorten: Normal- und Extragesalzen. (Normalsaltad, Extrasaltad)&lt;/p&gt;
&lt;p&gt;Der interessante Teil kommt jetzt: Sowohl die Dänen, als auch die Schweden haben ihre ganz eigene Interpretation von Joghurt bzw. Dickmilch.&lt;/p&gt;
&lt;p&gt;In Schweden heisst das Fil (ja, das Flachwitzpotential für Deutschsprachige Schwedenurlauber ist enorm) und ist relativ flüssig und recht Sauer (wird im Tetrapack verkauft), hat den selben Fettgehalt wie Milch (und gibt es auch in einer Lätt-Variante) und wird gern mit Früchten (z.B. frisch geflückten Blaubeeren) und Müsli gegessen. Fil gibt es auch mit Früchten. Darüberhinaus gibt es unzählige Fil- und Joghurt-Varianten, die fast alle in Tetrapacks verkauft werden (nur ein paar Joghurt-und-Müsli-Varianten gibts im Becher und Trinkjoghurt in Plastikflasche).&lt;/p&gt;
&lt;p&gt;Eine erwähnenswerte Besonderheit ist die sog. Gräddfil, die mit 12% Fett und einer sehr cremigen Konsistenz gerade danach schreit, als Créme-Fraiche-Ersatz und als Grundlage für Dips herzuhalten (im Chipsregal finden sich in der Regel eine ganze Reihe von interessanten Pülverchen, mit denen man z.B. Gräddfil in Chili-Ananas-Dip verwandeln kann. Fragt nicht, war lecker.)&lt;/p&gt;
&lt;p&gt;Hier mein übliches Frühstücksrezept: 1,2 Esslöffel Müsli, ein Löffel Preiselbeermarmelade und &amp;#8217;nen ordentlichen Schwung (Lätt-)Fil.&lt;/p&gt;
&lt;p&gt;Kurzer Einschub zum Müsli: Das/der wird in Schweden fast ausschließlich in Mehl-ähnlichen Papierverpackungen verkauft. Meine Theorie ist, dass das der Grund ist, warum ich, im Gegensatz zu dem Plastiktüten-Seitenbacher-Krams aus Deutschland noch nie das Gefühl gehabt habe, dass das Müsli muffig schmeckt.&lt;/p&gt;
&lt;p&gt;Die Dänen wiederum haben Ymer. Ymer schmeckt vollkommen anders als Fil, ist wesentlich dickflüssiger und &lt;strong&gt;unglaublich&lt;/strong&gt; cremig, was wohl daher kommt, das zur Zubereitung von Ymer Magermilch vergoren wird und &lt;strong&gt;nach&lt;/strong&gt; dem Reifungsvorgang Sahne zugesetzt wird um auf den Fettgehalt von ca. 3,5% zu kommen. Der Name Ymer kommt von , ich zitiere die Wikipedia, von dem Eisriesen Ýmir aus der nordischen Mythologie, der sich von der Milch der Urkuh Auðhumbla ernährte. Macht also alles Sinn. Ymer wird in Dänemark (und ich muss zugeben, dass ich das noch nie probiert habe) mit dem sog. Ymerdrys gegessen, was im wesentlichen gezuckertes zerkrümeltes Schwarzbrot ist. Aber auch in der Müsli-Marmeladen-Kombi schmeckt Ymer ausgezechnet. Von Ymer gibt es auch eine Light-Variante namens Ylette. Witzisch, die Dänen. Und dann gibt es noch A38, eine Joghurt-Sorte die nun wirklich den Preis für den absurdesten Produktnamen gewinnt. (Ich nehme an, es ist der technische Name der verwendeten Acidophilus-Kulturen).&lt;/p&gt;
&lt;p&gt;Ach ja, in Norwegen gibt es auch so etwas ähnliches wie Fil, das ist jetzt lange her, aber ich habe sie noch etwas flüssiger und etwas saurer als Fil in Erinnerung und sie heisst Kulturmelk.&lt;/p&gt;
&lt;p&gt;Noch erwähnenswert bei den flüssigen Dingen: Kakao. Die Dänen haben Mathilde, deren Maskottchen auch schon mal in einer &lt;a href=&quot;http://ada.untergrund.net/?p=demo&amp;i=340&quot;&gt;älteren Demoscene-Produktion&lt;/a&gt; auftaucht. Für so eine vorgefertigte Schokomilch ist Mathilde wirklich krass gut.&lt;/p&gt;
&lt;p&gt;Und dann: Käse. Die Dänen können da ja so einiges, ein alter Danbo ist schon was feines, oder auch der auch hierzulande recht bekannte Höhlenkäse. Noch besser: Der Blauschimmel. Wobei &lt;span class=&quot;caps&quot;&gt;CASTELLO&lt;/span&gt; da gar nicht mein Favorit ist: Ich empfehle Høng &amp;#8211; Wenn es was besonderes sein soll, gern auch den mit kandierten Birnenstücken. Und dann: Buko halt. Frischkäse. Nunja.&lt;/p&gt;
&lt;p&gt;Die Schweden? Reden wir nicht drüber. Sie haben essbaren Käse, das soll man reichen. Was soll man von einem Land käsemäßig halten, wenn die beliebteste Sorte tatsächlich Haushaltskäse heisst? (Hushållsost). Seltsam ist die Begeisterung der Schweden für Hüttenkäse (Dieser Styropor-Frischkäse), was dazu führt, das es in Schweden Hüttenkäse in zahlreichen, mit Gewürzen und Früchten versetzten Varianten gibt. Ganz lecker, wenn man Hüttenkäse mag.&lt;/p&gt;
&lt;p&gt;Interessanter da schon die Norweger: Die haben mit ihrem Jarlsberg einen ziemlich guten Käse mit &lt;strong&gt;sehr&lt;/strong&gt; großen Löchern am Start (und dem klassischen Emmentaler durchaus nicht unähnlich), den man gottseidank sowohl in Schweden als auch in Deutschland oft bekommt. Aber das eigentlich interessante ist der Gudbrandsdalen, ein Ziegenkäse, bei dem bei der Herstellung die Molke und der Milchzucker karamellisiert wird. Gudbrandsdalen ist sehr schmierig und schmeckt tatsächlich wie eine Mischung aus einem Ziegenfrischkäse und, uhm, Karamellbonbons. Da es den bei uns früher im Urlaub eigentlich immer zu essen gab (wir wohnen in Schweden nur ca. 5 km von der norwegischen Grenze), dachte ich, bis ich ca. 15 war, das Ziegenkäse immer süß schmeckt. Heute bin ich dann doch eher ein Freund eines guten französischen, trocken gereiften Rohmilchkäses, aber ab und an nehme ich dann doch auch mal ein Stück von dem Karamellkäse.&lt;/p&gt;
&lt;p&gt;Und damit wünsche ich guten Appetit auf der nächsten Skandinavienreise!&lt;/p&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/2Go_QibTA48&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/x5qjzu6akEc&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/zcObKA61-Zg&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/jYRrCOafxO8&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/fRdZd98kXQo&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/3N_yNipoMcw&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/MkmB0kgkqVQ&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/PiIMwtoAHhE&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/BLMlt6vcbtQ&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/Gfw_Vu23su0&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/onMgYtdEXew&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/hxP76p0ijT8&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/jaSZK0AO6Ig&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/18DVWZq7oPs&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/hpVVHmFyAVU&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/CNiWUAJBVeo&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/r-InQhlZhO8&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/-zkxreNwkfc&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/DWNGFsvuWm4&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/X-s7fEM6w30&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/GYxNxqKwCTM&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/YBmkChFNlBw&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/TsEqq9ZdA4I&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/I7K4__BpWKE&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/WeDH__uBtIE&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/pXAK5fRqRH0&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/4IFi0jBBgXE&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/JigwtfJ2DgE&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/u3dursiwQSc&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/hoXBe3phCNQ&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/THJUz4O-Xeg&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/ZTazZaOwq2Q&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/YyqGauqFa2c&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/KJ9O7TfhL5g&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/bHrd1PQxF6k&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/WZOHIiPv0Uc&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/5cLJuJkAJLA&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/s3sRWtXno8g&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/gYFzgtzUofU&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/t5h229L9n0c&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/tOpEpq2_UMA&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/4-WIfHCqfk0&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/vIUdnoN07Vc&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/AB-c1RpZbic&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/Ea8Bu_l5dqA&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/olbIJ7gnObU&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/sRtHXEIS3U8&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/H-6ndxxCulQ&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/8b5bY14O2cU&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/D8FArJQU55I&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/FkBN74zDfNQ&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/OpkTB_S6LCo&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/d853ULUtex4&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/EjAI8j1rt-Y&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/hb_f0frnTcw&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/_pngtbZOXOA&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/NLR1sXW0kz4&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/rO-gE5Uoz8w&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/QTpamlWxQkg&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/mb2zwtCnqqU&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</content>
		<author>
			<name>jan.krutisch.de</name>
			<uri>http://jan.krutisch.de</uri>
		</author>
		<source>
			<title type="html">jan.krutisch.de</title>
			<subtitle type="html">An ongoing conversation between Jan Krutisch and the Interwebs on nothing in particular.</subtitle>
			<link rel="self" href="http://feeds.feedburner.com/jankrutisch/rss/"/>
			<id>http://feeds.feedburner.com/jankrutisch/rss/</id>
			<updated>2010-07-28T20:20:07+00:00</updated>
			<rights type="html">Copyright 2004-2009</rights>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">A christmas present: The website of Kuhn, Kammann &amp;amp; Kuhn</title>
		<link href="http://feedproxy.google.com/~r/railslabs/~3/6yBzsCBmdYU/"/>
		<id>http://railslove.com/weblog/?p=546</id>
		<updated>2009-12-30T23:43:48+00:00</updated>
		<content type="html">&lt;p&gt;What did you get for christmas?&lt;/p&gt;
&lt;p&gt;We already made ourselves a first christmas present two weeks ago: the new website of &lt;a href=&quot;http://www.kkk-ag.de/&quot; title=&quot;Kuhn, Kammann &amp; Kuhn - Home&quot;&gt;Kuhn, Kammann &amp;amp; Kuhn&lt;/a&gt; - a Cologne-based business communication agency. Well, more precisely: the guys from Kuhn, Kammann &amp;amp; Kuhn made theirselves a first christmas present, but nevertheless it&amp;#x27;s also a great pleasure for us to see this jewel (ruby!) of a website working and growing in public.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://img.skitch.com/20091230-gktyx3hegx3umieifekdjfrqes.jpg&quot; alt=&quot;the new website of Kuhn, Kammann &amp; Kuhn&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Back in october, when Wendelin from KKK asked us to build their new agency website, we thought &amp;quot;well, usually we&amp;#x27;re building complex web apps, rarely corporate websites&amp;quot;, but then their way to deal with both editorial and aggregated social media content in a constantly changing grid layout foo&amp;sup1; grabbed our attention. And now, after eight days of exciting agile cooperation and several feature iterations, it&amp;#x27;s done - and online.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What&amp;#x27;s so special about this website?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;On the one hand it&amp;#x27;s this mix of a tag-based navigation and a flexible grid of content objects. No more static sitemaps! Tags basically work as content filters, but it&amp;#x27;s not done at this point here: Every content object has its lifetime and is constantly fading until it isn&amp;#x27;t visible anymore. In addition to the tags and visibilities of an object, every collection of content objects is a well prepared composition of different content types, which gets slightly shuffled to look nicer without loosing the chronology of its items. Finally all objects are positioned and animated by a piece of JavaScript, which handles any combination of small and large boxes.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Hands on Superfeedr&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Beside their editorial content, the KKK people want &lt;a href=&quot;http://www.kkk-ag.de/news&quot; title=&quot;Kuhn, Kammann &amp; Kuhn | news&quot;&gt;to aggregate&lt;/a&gt; a bunch of Twitter-Accounts and Weblogs constantly. Because we don&amp;#x27;t like the hassle with grabbing and parsing a growing number of feeds, we&amp;#x27;re using the &lt;a href=&quot;http://superfeedr.com/&quot; title=&quot;Superfeedr : Real-time feed parsing in the cloud for web-developers&quot;&gt;Superfeedr API&lt;/a&gt; for the first time in this project. There&amp;#x27;s a handy (but incomplete) Rails plugin &lt;a href=&quot;http://github.com/empika/Superfeedr-PubSubHubbub-Rails-Plugin/&quot;&gt;on Github&lt;/a&gt; you might want to use to subscribe and unsubscribe to feeds, but the HTTP POST notification parsing part isn&amp;#x27;t covered. So &lt;a href=&quot;http://github.com/pauldix/feedzirra/&quot; title=&quot;pauldix's feedzirra at master - GitHub&quot;&gt;Feedzirra&lt;/a&gt; helped us to get down to the beef. After two weeks of running the app with Superfeedr we&amp;#x27;re not missing one feed entry, but the time period between publishing a tweet and Superfeedr&amp;#x27;s POST notification is often longer than the promised 15 minutes - yet. We&amp;#x27;ll see, seems like a painless feed grabbing solution anyway, if real-time doesn&amp;#x27;t mean instant delivery in your biz.&lt;/p&gt;
&lt;p&gt;Enjoy surfing the new website of &lt;a href=&quot;http://www.kkk-ag.de/&quot; title=&quot;Kuhn, Kammann &amp; Kuhn - Home&quot;&gt;Kuhn, Kammann &amp;amp; Kuhn&lt;/a&gt;!&lt;/p&gt;
&lt;p&gt;&amp;sup1; &lt;small&gt;It&amp;#8217;s hard to find the right words. You have to &lt;del datetime=&quot;2009-12-30T23:36:17+00:00&quot;&gt;see&lt;/del&gt; &lt;em&gt;feel&lt;/em&gt; it&amp;#8230;&lt;/small&gt;&lt;/p&gt;
&lt;div class=&quot;feedflare&quot;&gt;
&lt;a href=&quot;http://feeds.feedburner.com/~ff/railslabs?a=6yBzsCBmdYU:Ql2sg65NdYw:yIl2AUoC8zA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/railslabs?d=yIl2AUoC8zA&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/railslabs?a=6yBzsCBmdYU:Ql2sg65NdYw:7Q72WNTAKBA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/railslabs?d=7Q72WNTAKBA&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/railslabs?a=6yBzsCBmdYU:Ql2sg65NdYw:V_sGLiPBpWU&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/railslabs?i=6yBzsCBmdYU:Ql2sg65NdYw:V_sGLiPBpWU&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;
&lt;/div&gt;</content>
		<author>
			<name>Railslove</name>
			<uri>http://railslove.com/weblog</uri>
		</author>
		<source>
			<title type="html">Railslove</title>
			<subtitle type="html">we love building web applications</subtitle>
			<link rel="self" href="http://feeds.feedburner.com/railslabs"/>
			<id>tag:railslabs.com,2007:mephisto/</id>
			<updated>2010-09-06T22:00:11+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en-US">
		<title type="html">Ruby En Rails 2009 Recap</title>
		<link href="http://blog.innerewut.de/2009/11/3/ruby-en-rails-2009-recap"/>
		<id>tag:blog.innerewut.de,2009-11-03:829</id>
		<updated>2009-12-15T16:01:08+00:00</updated>
		<content type="html">&lt;p&gt;
The last past days in Amsterdam for &lt;a href=&quot;http://2009.rubyenrails.nl/&quot;&gt;Ruby En Rails 2009&lt;/a&gt; were really great.
&lt;/p&gt;
&lt;p&gt;
I arrived on Thursday and had the chance to discuss a possible security vulnerability in Rails I discovered a while back with Yehuda and Mislav during lunch.
&lt;/p&gt;
&lt;p&gt;
Afterwards we went to the conference dinner and met many very nice people and had a long discussion about voting systems, European vs. American culture, gun laws, and political systems. 
&lt;/p&gt;
&lt;p&gt;
Friday was the first conference day and started for us with being 40 minutes late as we headed up to the wrong metro station. Yehuda was supposed to give a keynote as the first session... luckily the organizers swapped the sessions. So unfortunately we missed the first session but were in time for Yehuda to give his keynote.
&lt;/p&gt;
&lt;p&gt;
Yehuda talked about the Rails/Merb merge and dissected what was achieved. It was a very good, in-depth presentation about the new features of Rails 3 and what left to do. I really liked the new router DSL, actions being Rack-apps, and the death of Rails Metal (the new, slicker possibility to build simpler/smaller controllers takes care of this.).
&lt;/p&gt;
&lt;p&gt;
After the coffee break I gave my &lt;a href=&quot;http://www.slideshare.net/jweiss/rails-security&quot;&gt;Rails Security&lt;/a&gt; presentation about common attacks against web applications and how you can protect against them in Rails. Usually this is quite heavy stuff and people tend to sit quiet and listen as this is new to most. In Amsterdam I had some very good questions and discussions on session fixation, JavaScript high-jacking, and app reconnaissance. 
&lt;/p&gt;
&lt;p&gt;
&lt;div&gt;&lt;a href=&quot;http://www.slideshare.net/jweiss/rails-security&quot; title=&quot;Rails Security&quot;&gt;Rails Security&lt;/a&gt;&lt;div&gt;View more &lt;a href=&quot;http://www.slideshare.net/&quot;&gt;documents&lt;/a&gt; from &lt;a href=&quot;http://www.slideshare.net/jweiss&quot;&gt;Jonathan Weiss&lt;/a&gt;.&lt;/div&gt;&lt;/div&gt;
&lt;/p&gt;
&lt;p&gt;
Then we listened to Julio Javier Cicchelli talk about &lt;a href=&quot;http://Rubyists.EU/&quot;&gt;Rubyists.EU&lt;/a&gt;, an effort to make the different European Rails communities easier to find and build a common European community.
&lt;/p&gt;
&lt;p&gt;
We went to lunch with &lt;a href=&quot;http://twitter.com/jamestyj&quot;&gt;James&lt;/a&gt; which gave us some time to catch up. Took us a while to find a decent place around the conference hall but we managed to find a restaurant where we tried to estimate the global financial burden due to Internet Explorer and what will happen to Microsoft if they were charged for the extra work needed done.
&lt;/p&gt;
&lt;p&gt;
After lunch &lt;a href=&quot;http://github.com/alloy&quot;&gt;Eloy&lt;/a&gt; educated us about the current state of MacRuby. I'm really looking forward to spending some time hacking Mac apps in Ruby.
&lt;/p&gt;
&lt;p&gt;
The next session gave an overview about monitoring, performance, and the different tools like request-log-analyzer or Nagios.
&lt;/p&gt;
&lt;p&gt;
The conference was closed by &lt;a href=&quot;http://twitter.com/bitsweat&quot;&gt;Jeremy&lt;/a&gt; giving a keynote about Rails, Ruby, and the current state of things in the community (and a sneak-peak at ActiveRelation and what it will be able to do). It was very well received and a good closing session.
&lt;/p&gt;
&lt;p&gt;
Afterwards a big group headed for dinner. We ended up in a small, very local restaurant. It included very nice food, good discussions with new friends from Finnland, and a waiter/owner who runs the restaurant homepage with Rails and asked Yehuda for help :-)
&lt;/p&gt;
&lt;p&gt;
The next day was titled &lt;i&gt;Geek Day&lt;/i&gt; and included many lightning talks (that ended up being nearly full sessions and had very good content). Parallel to the great sessions about MongoDB, DataMapper, or experience reports there was a Rails Rumble featuring five teams going on.
&lt;/p&gt;
&lt;p&gt;
The most notable session of the second day was &lt;a href=&quot;http://twitter.com/juice10&quot;&gt;Justin Halsall&lt;/a&gt;, dressed for Halloween, talking about BlockHelpers and view DSLs. It was a hilarious show.
&lt;/p&gt;
&lt;p&gt;
The Rumble was a great idea. In contrast to the usual Rumble the teams got a specific challenge. They should build something that improves the situation with Rails dependencies and out-of-date gems laying around in vendor/gems. The winning team would get two tickets to RailsConf 2010.
&lt;/p&gt;
&lt;p&gt;
One team extended builder to &lt;a href=&quot;http://www.fngtps.com/2009/11/apprise&quot;&gt;list outdated gems&lt;/a&gt; and got their changes even merged back to builder by Yehuda on the same day. Another team extended &lt;a href=&quot;http://labs.peritor.com/webistrano&quot;&gt;Webistrano&lt;/a&gt; to accept  projects dependencies and display them on the stage page. Some teams build a command line tool to extract local dependencies like your gems or even the MySQL version and push those definitions to a central place. The winning team had the the most advanced idea regarding update notification and gem-sets for applications. I could really see something like this being integrated into gemcutter. Congratulations Ludo and Michel!
&lt;/p&gt;
&lt;p&gt;
Ruby En Rails day two was celebrated with a big dinner and drinks. After a very nice evening we headed back to the hotel as everybody had an early flight out. Some were &lt;a href=&quot;http://twitter.com/mislav/status/5337037778&quot;&gt;still discussing Rails&lt;/a&gt;, some were lucky to be able to enjoy Amsterdam longer.
&lt;/p&gt;
&lt;p&gt;
I really enjoyed the conference and Amsterdam. Thank you &lt;a href=&quot;http://twitter.com/chrisobdam&quot;&gt;Chris&lt;/a&gt; and &lt;a href=&quot;http://twitter.com/mac4_ever&quot;&gt;Tim Obdam&lt;/a&gt; for organizing the whole event!
&lt;/p&gt;</content>
		<author>
			<name>Jonathan</name>
			<uri>http://blog.innerewut.de/</uri>
		</author>
		<source>
			<title type="html">BlogFish - Blog</title>
			<subtitle type="html">&lt;h1&gt;Application error (Apache)&lt;/h1&gt;
  &lt;p&gt;Change this error message for exceptions thrown outside of an action (like in Dispatcher setups or broken Ruby code) in public/500.html&lt;/p&gt;</subtitle>
			<link rel="self" href="http://blog.innerewut.de/feed/atom.xml"/>
			<id>tag:blog.innerewut.de,2010:mephisto/</id>
			<updated>2010-03-05T09:20:12+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en-US">
		<title type="html">Amazon EC2 HighMemory Instances</title>
		<link href="http://blog.innerewut.de/2009/10/27/amazon-ec2-4xl-instances"/>
		<id>tag:blog.innerewut.de,2009-10-27:827</id>
		<updated>2009-12-15T16:01:02+00:00</updated>
		<content type="html">&lt;p&gt;
Very very nice: &lt;a href=&quot;http://aws.typepad.com/aws/2009/10/two-new-ec2-instance-types-additional-memory.html&quot;&gt;34.2 GB RAM and 68.4 GB RAM instances on EC2 &lt;/a&gt;
&lt;p&gt;
&lt;p&gt;
&lt;pre&gt;
# free -m
             total       used       free     shared    buffers     cached
Mem:         70007       2205      67801          0         28        595
-/+ buffers/cache:       1581      68425
Swap:            0          0          0
&lt;/pre&gt;
&lt;/p&gt;
And
&lt;p&gt;
&lt;pre&gt;
# cat /proc/cpuinfo
processor	: 0
vendor_id	: GenuineIntel
cpu family	: 6
model		: 26
model name	: Intel(R) Xeon(R) CPU           X5550  @ 2.67GHz
stepping	: 5
cpu MHz		: 2666.760
cache size	: 8192 KB
physical id	: 0
siblings	: 1
core id		: 0
cpu cores	: 1
fpu		: yes
fpu_exception	: yes
cpuid level	: 11
wp		: yes
flags		: fpu tsc msr pae mce cx8 apic mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm syscall nx lm constant_tsc pni monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr dca popcnt lahf_lm
bogomips	: 5336.34
clflush size	: 64
cache_alignment	: 64
address sizes	: 40 bits physical, 48 bits virtual
power management:

[..]
&lt;/pre&gt;
&lt;/p&gt;
&lt;p&gt;
We just included support for those machines in &lt;a href=&quot;http://www.scalarium.com&quot;&gt;Scalarium&lt;/a&gt;, our EC2 cluster management plattform.
&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;</content>
		<author>
			<name>Jonathan</name>
			<uri>http://blog.innerewut.de/</uri>
		</author>
		<source>
			<title type="html">BlogFish - Blog</title>
			<subtitle type="html">&lt;h1&gt;Application error (Apache)&lt;/h1&gt;
  &lt;p&gt;Change this error message for exceptions thrown outside of an action (like in Dispatcher setups or broken Ruby code) in public/500.html&lt;/p&gt;</subtitle>
			<link rel="self" href="http://blog.innerewut.de/feed/atom.xml"/>
			<id>tag:blog.innerewut.de,2010:mephisto/</id>
			<updated>2010-03-05T09:20:12+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">We are Railslove</title>
		<link href="http://feedproxy.google.com/~r/railslabs/~3/UGZ4avOUDas/"/>
		<id>http://railslove.com/weblog/?p=519</id>
		<updated>2009-12-12T17:13:31+00:00</updated>
		<content type="html">&lt;p&gt;Since 2008 we have been building web applications for you. We&amp;#8217;ve done some really great projects with our partners and we&amp;#8217;re happy to see our own web service, channelthing, growing. So, we think it is time to introduce ourselves in more than 140 chars.&lt;/p&gt;
&lt;p&gt;As you might know, we three, Tim, Michael and I, started Railslove two years ago. However, in our project we work with many other great web developers who deserve to get mentioned. So, to give you a better insight into our network, we&amp;#8217;re going to reveal the &amp;#8220;Railslove Family&amp;#8221; over the next few weeks.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.ipernity.com/doc/koos/6804956&quot;&gt;&lt;img src=&quot;http://u1.ipernity.com/13/49/56/6804956.00fa2df8.500.jpg&quot; width=&quot;500&quot; height=&quot;333&quot; alt=&quot;We're Railslove&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;Yours,&lt;br /&gt;
Jan, Tim and Michael&lt;/p&gt;
&lt;div class=&quot;feedflare&quot;&gt;
&lt;a href=&quot;http://feeds.feedburner.com/~ff/railslabs?a=UGZ4avOUDas:vJRl78fgaFQ:yIl2AUoC8zA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/railslabs?d=yIl2AUoC8zA&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/railslabs?a=UGZ4avOUDas:vJRl78fgaFQ:7Q72WNTAKBA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/railslabs?d=7Q72WNTAKBA&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/railslabs?a=UGZ4avOUDas:vJRl78fgaFQ:V_sGLiPBpWU&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/railslabs?i=UGZ4avOUDas:vJRl78fgaFQ:V_sGLiPBpWU&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;
&lt;/div&gt;</content>
		<author>
			<name>Railslove</name>
			<uri>http://railslove.com/weblog</uri>
		</author>
		<source>
			<title type="html">Railslove</title>
			<subtitle type="html">we love building web applications</subtitle>
			<link rel="self" href="http://feeds.feedburner.com/railslabs"/>
			<id>tag:railslabs.com,2007:mephisto/</id>
			<updated>2010-09-06T22:00:11+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="de-de">
		<title type="html">Going solo</title>
		<link href="http://feedproxy.google.com/~r/dopefreshtightblog/~3/b8_BpiWHTYc/"/>
		<id>http://dennisbloete.de/?p=576</id>
		<updated>2009-12-10T17:42:46+00:00</updated>
		<content type="html">&lt;p&gt;A few months ago, after the birth of our daugther (&lt;a href=&quot;http://www.flickr.com/photos/dbloete/4025365815/&quot;&gt;yeah, Lotta!&lt;/a&gt;) and during my parental leave, thoughts arose about realizing an idea I&amp;#8217;ve carried around with me since I finished my studies: Going solo, working on my own projects and earning a living as a freelance software developer. A few weeks ago I realized that plan and decided to quit my current job at &lt;a href=&quot;http://neuland-bfi.de/&quot;&gt;neuland&lt;/a&gt;, though it wasn&amp;#8217;t an easy decision: working for neuland has always been fun, especially because of the nice environment and the multitude of different personalities of the people working there &amp;#8211; some of which are now close friends of mine. Nevertheless I felt that deep urge of doing something on my own and having sold &lt;a href=&quot;http://venteria.com/&quot;&gt;venteria&lt;/a&gt; in summer makes taking the plunge a little less risky.&lt;/p&gt;
&lt;p&gt;Alright, so where am I heading? A new focus will be iPhone/Cocoa app development and I&amp;#8217;ll keep on working with Ruby on Rails &amp;#8211; I&amp;#8217;m really looking forward to all the great enhancements planned for Rails 3.0 and I just love doing web development, so that I won&amp;#8217;t &lt;a href=&quot;http://tammofreese.de/2009/09/03/goodbye-rails-hello-os-x-iphone-mac&quot;&gt;burn all the bridges&lt;/a&gt; &lt;img src=&quot;http://dennisbloete.de/wp-includes/images/smilies/icon_wink.gif&quot; alt=&quot;;)&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/p&gt;
&lt;p&gt;The bootstrapping went pretty well so far, I joined a really nice coworking environment and got an office at the infamous &lt;a href=&quot;http://abfertigung.de/&quot;&gt;Abfertigung&lt;/a&gt;. As far as I can tell I&amp;#8217;ll be surrounded by a bunch of very nice, creative and innovative people. Furthermore it&amp;#8217;s good to know that I can, but don&amp;#8217;t have to work from home &amp;#8211; that makes meeting clients and finding quiet hours to get work done (I&amp;#8217;m lookin&amp;#8217; atcha, &lt;a href=&quot;http://www.flickr.com/photos/dbloete/4125102227/&quot;&gt;Lotta&lt;/a&gt;) a lot easier &lt;img src=&quot;http://dennisbloete.de/wp-includes/images/smilies/icon_wink.gif&quot; alt=&quot;;)&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/p&gt;
&lt;p&gt;Hopefully I&amp;#8217;ll find the time during the next weeks to write about some of the aspects of becoming a freelancer as I know some of you are interested in that and I&amp;#8217;d like to take you along on that journey. I think it will be a pretty interesting time and I&amp;#8217;ll learn tons about myself, meet nice and interesting people (including clients &lt;img src=&quot;http://dennisbloete.de/wp-includes/images/smilies/icon_wink.gif&quot; alt=&quot;;)&quot; class=&quot;wp-smiley&quot; /&gt; ) and most important of all: still have the time to enjoy my family… &lt;a href=&quot;http://www.rainbowbody.com/newarticles/farmerson.htm&quot;&gt;we shall see&lt;/a&gt; &lt;img src=&quot;http://dennisbloete.de/wp-includes/images/smilies/icon_smile.gif&quot; alt=&quot;:)&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/p&gt;</content>
		<author>
			<name>Dennis Bloete</name>
			<email>mail@dennisbloete.de</email>
			<uri>http://dennisbloete.de</uri>
		</author>
		<source>
			<title type="html">//dennisbloete</title>
			<subtitle type="html">Arbeit und Alltag eines Software-Entwicklers aus Bremen</subtitle>
			<link rel="self" href="http://feeds.feedburner.com/dopefreshtightblog/"/>
			<id>http://feeds.feedburner.com/dopefreshtightblog/</id>
			<updated>2010-09-06T07:40:13+00:00</updated>
			<rights type="html">©</rights>
		</source>
	</entry>

	<entry xml:lang="de-de">
		<title type="html">Syncing Socialite across multiple Macs (using Dropbox)</title>
		<link href="http://feedproxy.google.com/~r/dopefreshtightblog/~3/TI5DD7fNFLk/"/>
		<id>http://dennisbloete.de/?p=619</id>
		<updated>2009-12-08T17:00:48+00:00</updated>
		<content type="html">&lt;p&gt;If you are working on multiple Macs (i.e. having a personal and one at work) you probably know this problem: You would like to sync some application data between these machines, so that you don&amp;#8217;t have to manage separate todo-lists, items in your inbox that you&amp;#8217;ve already read on one machine but are marked as unread on the other, etc. I&amp;#8217;m using &lt;a href=&quot;https://www.dropbox.com/referrals/NTk4MDU4MDk&quot;&gt;Dropbox&lt;/a&gt; (disclaimer: If you sign up using this link, I&amp;#8217;ll get some more disk space, thank you!) to sync various applications (&lt;a href=&quot;http://culturedcode.com/things/&quot;&gt;Things&lt;/a&gt;, &lt;a href=&quot;http://billingsapp.com/&quot;&gt;Billings&lt;/a&gt; and &lt;a href=&quot;http://www.realmacsoftware.com/socialite/&quot;&gt;Socialite&lt;/a&gt; for example), but you can use any other cloud storage solution if you like.&lt;/p&gt;
&lt;p&gt;In this little tutorial I&amp;#8217;ll explain how to sync the data with Dropbox and I&amp;#8217;m using Socialite as an example. It basically works like this for any app that stores its data in an &lt;em&gt;Application Support&lt;/em&gt; folder, but Socialite requires some extra steps people are &lt;a href=&quot;http://www.realmacsoftware.com/forums/index.php/forums/viewthread/26653/&quot;&gt;frequently&lt;/a&gt; &lt;a href=&quot;http://www.realmacsoftware.com/forums/index.php/forums/viewthread/27518/&quot;&gt;asking&lt;/a&gt; about, so here we go:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Go to your Dropbox folder and create a new folder called &lt;em&gt;Synced Application Support&lt;/em&gt; (or whatever you like)&lt;/li&gt;
&lt;li&gt;Quit any running instance of the application you would like to sync (in this case &lt;em&gt;Socialite&lt;/em&gt;).&lt;/li&gt;
&lt;li&gt;Got to your &lt;em&gt;~/Library/Application Support&lt;/em&gt; and move the &lt;em&gt;Socialite&lt;/em&gt; folder into the Dropbox folder you just created (&lt;em&gt;Synced Application Support&lt;/em&gt;)&lt;/li&gt;
&lt;li&gt;Open your Terminal.app and symlink the moved folder:&lt;br /&gt;
&lt;code&gt;$ ln -s ~/Dropbox/Synced\ Application\ Support/Socialite/ ~/Library/&lt;/code&gt;&lt;code&gt;Application\ Support&lt;/code&gt;&lt;code&gt;/Socialite&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Start the app and see if it worked&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;After this five steps you should be up and running with most of your apps (syncing Things is as easy as that). Unfortunately Socialite requires some extra steps if you are using Twitter (and who isn&amp;#8217;t these days), because it keeps the OAuth authentication tokens in the keychain, so that you need to sync them too. Fortunately this isn&amp;#8217;t a big deal, because now you know how to sync your data, so go ahead and…&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Quit Socialite&lt;/li&gt;
&lt;li&gt;Open your Keychain and create a new keychain called Socialite and save it within your &lt;em&gt;Synced Application Support/Socialite&lt;/em&gt; folder&lt;/li&gt;
&lt;li&gt;Right click the new Socialite keychain, edit the settings and uncheck the checkboxes so that you won&amp;#8217;t be bothered with authentication request every now and then&lt;/li&gt;
&lt;li&gt;Use the search bar at the upper right corner to search for twitter.com and move all items used by Socialite to the new Socialite keychain&lt;/li&gt;
&lt;li&gt;Start Socialite and see if your Twitter services are still working &amp;#8211; if not: Delete all items in your Socialite keychain, remove the Twitter services from Socialite, restart Socialite, add them again and move the freshly created twitter.com items in your Login keychain to the Socialite keychain.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Okay, that&amp;#8217;s it, I hope it&amp;#8217;s helpful to some of you and I also hope that someday syncing will be baked into Socialite, though &lt;a href=&quot;http://www.realmacsoftware.com/forums/index.php/forums/viewthread/26653/#115067&quot;&gt;Realmac Software currenty doesn&amp;#8217;t have any plans for implementing that&lt;/a&gt;.&lt;/p&gt;</content>
		<author>
			<name>Dennis Bloete</name>
			<email>mail@dennisbloete.de</email>
			<uri>http://dennisbloete.de</uri>
		</author>
		<source>
			<title type="html">//dennisbloete</title>
			<subtitle type="html">Arbeit und Alltag eines Software-Entwicklers aus Bremen</subtitle>
			<link rel="self" href="http://feeds.feedburner.com/dopefreshtightblog/"/>
			<id>http://feeds.feedburner.com/dopefreshtightblog/</id>
			<updated>2010-09-06T07:40:13+00:00</updated>
			<rights type="html">©</rights>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Die Revolution wird nicht im Fernsehen...</title>
		<link href="http://feedproxy.google.com/~r/jankrutisch/rss/~3/1cD7OXa-k0o/"/>
		<id>http://jan.krutisch.de/de/2009/12/07/die-revolution-wird-nicht-im-fernsehen.html/</id>
		<updated>2009-12-06T23:00:00+00:00</updated>
		<content type="html">&lt;p&gt;Ich hab mir gestern die Revolution angesehen. Und zwar die, die schon längst &amp;#8220;am passieren iss&amp;#8221;. &lt;br /&gt;
Und zwar war ich gestern beim &amp;#8220;Holy Shit Shopping&amp;#8221; im alten Gaswerk. Das ist der erste Weihnachtsmarkt, für den ich Eintritt bezahlen musste&lt;br /&gt;
und, ich denke auch der erste Weihnachtsmarkt, vor dem ich anstehen musste.&lt;/p&gt;
&lt;p&gt;Der Anspruch der Macher ist, laut Website:&lt;/p&gt;
&lt;blockquote&gt;Die Weihnachts.Shopping.Lounge ist ein Kunst- und Designmarkt und präsentiert seit 6 Jahren ca. 150 handverlesene junge Designer, Kreative und Künstler, sowie eine wilde Mischung an Mode-, Schmuck- und Produktdesign, Kunst, Fotografie, Graphik, Comics und Literatur in besonderer Architektur.&lt;/blockquote&gt;
&lt;p&gt;Ja, Kunst gab es auch, Schmuck &amp;#8217;ne ganze Menge, aber ansonsten vor allem: Kunsthandwerk der modernen Variante. Also das ganze Etsy-/Dawanda-Gelöt. Und das ist schon beeindruckend, wie viel Kreativität dieses &amp;#8220;Neue Kunsthandwerk&amp;#8221; hervorbringt. Klar, es gibt ungefähr 200 Variationen der Handy-Hülle aus Filz, aber zumindest denkt jeder seine Idee mit dazu. Und richtig coole Sachen gabs auch, intelligentes Produktdesign, abgefahrene Ideen, gute und verrückte Mode, und und und. Wenn ich nicht so müde wäre, würde ich mir die Mühe machen und ein paar Sachen verlinken, stattdessen verweise ich auf die Links auf der Seite vom &lt;a href=&quot;http://holyshitshopping.de/&quot;&gt;Holy Shit Shopping&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;!--more--&gt;&lt;span id=&quot;more&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Das ist, für manche mag das anmaßend klingen, gelebte Revolution. Leise, still und heimlich etabliert sich gerade in diesem Bereich eine Kultur des Selbermachens. Des davon-leben-wollens und -könnens. Vorbei an der Offshore-Großindustrie, weil niemand mehr Lust hat, vergängliche Plastikdinge aus China zu kaufen, wenn man statt dessen mit Liebe gemachte, haltbare Dinge aus echten Materialien (t.w. auch hier: Plastik) haben kann. Und vor allem ist niemand da, der den Kleinstproduzenten, die über &lt;a href=&quot;http://www.etsy.com/&quot;&gt;Etsy&lt;/a&gt; und &lt;a href=&quot;http://www.dawanda.de/&quot;&gt;Dawanda&lt;/a&gt; ihre Waren an den Mann bringen, erzählt, dass man nur erfolgreich sein kann, wenn man in Masse fertigt. Weil das, auch durch die fortschreitende Demokratisierung der Produktionsmittel, inzwischen gar nicht mehr so wichtig ist. Und selbst wenn: Viele Kleidungsstücke, die auf dem &lt;span class=&quot;caps&quot;&gt;HSS&lt;/span&gt; verkauft werden, sind vermutlich nicht in Deutschland produziert. Aber auch hier: Der Zugang zu Produktionsmitteln, auch für die Massenfertigung ist auch immer einfacher geworden, durch z.B. das Internet, über das man inzwischen überall auf der Welt Produktionsanlagen mieten kann, aber auch durch den Druck der großen Konzerne an die &amp;#8220;Zulieferindustrie&amp;#8221;, immer flexibler zu werden &amp;#8211; Und somit ihnen die Möglichkeit gegeben haben, auch flexibler in der Auftragsannahme zu werden. Und so scheint sich der Trend, der für Software schon ganz lange gilt, auch im Bereich der Hardware zu bestätigen: Kleinere Firmen sind im Durchschnitt flexibler, schneller, innovativer und damit mächtiger, während die Bereiche, in denen große Unternehmen bisher Vorteile hatten (Marketing-Macht, große Forschungsbudgets, Synergiemöglichkeiten im Unternehmen) immer unwichtiger werden, bzw. der Vorsprung immer kleiner wird.&lt;/p&gt;
&lt;p&gt;Die einzige Macht, die große Unternehmen den kleinen immer noch voraushaben, ist zum einen, massiv Lobbying in der Politik zu betreiben (dazu mehr zu schreiben würde diesen Artikel sprengen) und, leider, Armadas von Anwälten zu bezahlen. Meine Vorhersage ist daher: Es wird weiterhin eine Großunternehmen-freundliche Klientelpolitik betrieben werden, und auf der anderen Seite werden, sobald die Industrie schnallt, was da passiert, anfangen, massivst die Kleinunternehmen wegen irgendwelcher Copyright- und Marktenrechtsverletzungen zu verklagen, wo immer sie können. Die Nummer mit Jack Wolfskin, wenn auch glimpflich ausgegangen, zeigt da ja schon, wie man den Kleinstproduzenten beikommt, wenn man will.&lt;/p&gt;
&lt;p&gt;Wird das was ändern, wird das den Trend zu kleinen Unternehmen aufhalten? Ich denke und hoffe nicht. We&amp;#8217;ll see.&lt;/p&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/KQ1pMi_mq2c&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/wSNDmv1TMl4&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/5Bko11UJGjQ&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/IvvkruDzSW4&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/DFnVLLkf9YQ&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/SU54wuJz39Y&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/QzfE_6nbqiY&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/VX-zc1SXFt0&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/aiXTNYCLmpw&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/MVPMX4-7eC0&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/VMw-MQwAxAQ&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/77h57XDS82k&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/I7jaROwa_nA&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/V0qzY5Y_2QU&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/1_J8n4HczZo&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/ZHwmYvtm9GY&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/XdClaJ12ZE0&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/XV3EmZtG4SM&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/phGjUbzwNTE&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/qvP1Sxxoiao&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/PkzL63Un6y8&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/VN1_QmMgv4w&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/AMXSwxmZYTw&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/Q4xs9GbqaqA&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/WtXhyB-ThxU&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/u2jiECiUaBc&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/pxyfqwkCSnY&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/h_lhVz_ru2Q&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/FSZqvdn4-qE&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/INgV6ytcii4&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/WiQ9g6EkkZ8&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/1wduMs2tJqE&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/YcpzKJLGCIY&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/hvwUOrdjcXA&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/mOR-S6aKQqA&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/-Y00MuPCmEE&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/IMR3KwywUc4&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/YDXphGjvEWc&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/VbvXxrY7MHs&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/W_-6GRup32s&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/-lt9i9rseEk&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/J3V8PxF2kQo&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/Xq9cOvDp9sg&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/Yvh0U2424QM&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/szUFdzqZ4i8&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/M1SH5JX-xCo&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/C9ViAXFtDZ0&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/smZAG_pi7xA&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/-rY9hMKM86I&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/3MjoNrevkzo&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/hZb_nDFymF8&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/8XQBMo8-FJw&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/ng_PZJqSZLk&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/E2ISCysBmJM&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/n7GaiM9vk24&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/80fF0jnfPqs&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/qWwP2yiAZiI&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/DEjtKIy3cl0&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/xUnpus1fkwI&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/jankrutisch/rss/~4/1cD7OXa-k0o&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</content>
		<author>
			<name>jan.krutisch.de</name>
			<uri>http://jan.krutisch.de</uri>
		</author>
		<source>
			<title type="html">jan.krutisch.de</title>
			<subtitle type="html">An ongoing conversation between Jan Krutisch and the Interwebs on nothing in particular.</subtitle>
			<link rel="self" href="http://feeds.feedburner.com/jankrutisch/rss/"/>
			<id>http://feeds.feedburner.com/jankrutisch/rss/</id>
			<updated>2010-07-28T20:20:07+00:00</updated>
			<rights type="html">Copyright 2004-2009</rights>
		</source>
	</entry>

</feed>
