<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>webgarbage.de</title><link href="/" rel="alternate"></link><link href="/feeds/all.atom.xml" rel="self"></link><id>/</id><updated>2012-12-18T00:00:00+01:00</updated><entry><title>RhodeCode - Developer Porn.</title><link href="/rhodecode-developer-porn.html" rel="alternate"></link><updated>2012-12-18T00:00:00+01:00</updated><author><name>Jochen Breuer</name></author><id>tag:,2012-12-18:rhodecode-developer-porn.html</id><summary type="html">&lt;p&gt;It's not secret, that I &lt;a href="../mercurial-rocks.html"&gt;tend to use mercurial&lt;/a&gt;. It really is the &lt;a href="http://importantshock.wordpress.com/2008/08/07/git-vs-mercurial/"&gt;James Bond&lt;/a&gt; of DVCS and you get far without using any third party suff. One really cool and easy to set up feature is hgwebdir. With &lt;a href="http://mercurial.selenic.com/wiki/HgWebDirStepByStep"&gt;hgwebdir&lt;/a&gt; you can setup up a central repository in your company or team to easily collaborate on projects. But there is a downside to hgwebdir. With a growing number of projects hgwebdir gets really really slow. Even with the apache mod_wsgi setup this becomes an issue at some point of time. Using &lt;a href="http://mercurial.selenic.com/wiki/SharedSSH"&gt;SSH&lt;/a&gt; would be a solution to this problem, but we have commiters that have to use https, since they can't be allowed to ssh onto the machine or VPN into our network for security reasons. Also this would compliate the setup a lot since you would have to deal with file permissions and ssh certs.&lt;/p&gt;
&lt;p&gt;After digging in the dirt I found &lt;a href="http://rhodecode.org/"&gt;RhodeCode&lt;/a&gt; that seems to solve this problem and gives us some more really cool features.&lt;/p&gt;
&lt;p&gt;First of it all it's really damn fast. Cloning and committing in huge projects just takes a few seconds where hgwebdir had to think about it for a minute. It has a nice web interface where you can create new projects, add users, set the permissions for the projects, monitor projects, clone projects, browse the change logs, comment on commits or lines in the code, fork projects and manage pull requests. And did I mention that it is super fast? ;)&lt;br /&gt;
&lt;/p&gt;</summary><category term="mercurial"></category><category term="git"></category><category term="SCM"></category><category term="Python"></category></entry><entry><title>Nokia - FUD'ing their developers and killing the N9</title><link href="/nokia-fuding-their-developers-and-killing-the-n9.html" rel="alternate"></link><updated>2011-06-27T00:00:00+02:00</updated><author><name>Jochen Breuer</name></author><id>tag:,2011-06-27:nokia-fuding-their-developers-and-killing-the-n9.html</id><summary type="html">&lt;p&gt;Who believed that Nokia would release a &lt;a href="http://swipe.nokia.com/" title="Nokia N9 - swipe.nokia.com"&gt;decent MeeGo based phone&lt;/a&gt; right after they announced their &lt;a href="http://www.osnews.com/story/24399/Nokia_Microsoft_Announce_Deep_Partnership" title="Nokia, Microsoft Announce Deep Partnership - osnews.com"&gt;deal with Microsoft&lt;/a&gt; and started FUD'ing their developer community? I certainly wasn't expecting this. Although the N9 looks pretty good, with both - hard- and software, and the &lt;a href="http://www.youtube.com/watch?v=BSZssHGR-Qg" title="Nokia N9 UI hands-on demo - YouTube"&gt;Swipe interface&lt;/a&gt; seems to be compelling, Nokia didn't stop FUD'ing. &lt;a href="[http://en.wikipedia.org/wiki/Stephen_Elop]" title="Stephen Elop - wikipedia"&gt;Stephen Elop&lt;/a&gt; himself &lt;a href="http://www.engadget.com/2011/06/25/nokias-stephen-elop-is-still-over-meego-even-if-the-n9-is-a-hi/?a_dgi=aolshare_twitter" title="Nokia's Stephen Elop is still over MeeGo, even if the N9 is a hit"&gt;announced&lt;/a&gt; that there will be no second MeeGo based phone from Nokia. &lt;/p&gt;
&lt;p&gt;This is an entirely new marketing technique to me. I always thought it would be very harmful to a plattform to announce its death before even one phone was delived to a customer. Why should any developer bother even looking at the N9 - even if she or he already is a MeeGo developer? At the moment it is really hard to understand the intentions of Nokia and why to bear their indecisiveness.&lt;/p&gt;</summary><category term="Nokia"></category><category term="MeeGo"></category><category term="Mobile"></category></entry><entry><title>Set permission 'WRITE_EXTERNAL_STORAGE' to trace in Android</title><link href="/set-permission-write_external_storage-to-trace-in-android.html" rel="alternate"></link><updated>2011-06-07T00:00:00+02:00</updated><author><name>Jochen Breuer</name></author><id>tag:,2011-06-07:set-permission-write_external_storage-to-trace-in-android.html</id><summary type="html">&lt;p&gt;This is more or less a reminder for myself. If you haven't set the permission 'WRITE_EXTERNAL_STORAGE' in the AndroidManifest.xml tracing will fail with a permission denied. &lt;/p&gt;
&lt;p&gt;Instead of complaining about permissions a hint from the ADT would have been nice.&lt;/p&gt;</summary><category term="Android"></category><category term="Java"></category></entry><entry><title>My first question on Stack Overflow</title><link href="/my-first-question-on-stack-overflow.html" rel="alternate"></link><updated>2011-06-06T00:00:00+02:00</updated><author><name>Jochen Breuer</name></author><id>tag:,2011-06-06:my-first-question-on-stack-overflow.html</id><summary type="html">&lt;p&gt;Yesterday I've been posting my &lt;a href="http://stackoverflow.com/questions/6245756/identical-views-in-viewflipper-with-diffrent-click-listeners/6245834#6245834"&gt;first question&lt;/a&gt; on Stack Overflow. Just about 15 minutes later I got the correct answer from &lt;a href="http://stackoverflow.com/users/691688/femi"&gt;Femi&lt;/a&gt;. Really impressive. Thanks a bunch Femi and Stack Overflow!&lt;/p&gt;</summary><category term="Android"></category><category term="Java"></category></entry><entry><title>Splash Screen on Android</title><link href="/splash-screen-on-android.html" rel="alternate"></link><updated>2011-04-26T00:00:00+02:00</updated><author><name>Jochen Breuer</name></author><id>tag:,2011-04-26:splash-screen-on-android.html</id><summary type="html">&lt;p&gt;Splash Screens are not exactly common (or really wanted) on Android. But occasionally there are customers that want that kind of thing. When I took a look around, I found a lot of solutions with different approaches.  One of the more sophisticated  ones used a thread to count the remaining seconds until it would fire an Intent to the actual start screen. That reminded me of &lt;a href="http://developer.android.com/reference/android/os/AsyncTask.html"&gt;AsyncTask&lt;/a&gt; aka "threads for the rest of us". ;)&lt;/p&gt;
&lt;p&gt;So I came up with this solution:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="n"&gt;private&lt;/span&gt; &lt;span class="n"&gt;class&lt;/span&gt; &lt;span class="n"&gt;SplashScreenDelay&lt;/span&gt; &lt;span class="n"&gt;extends&lt;/span&gt;
        &lt;span class="n"&gt;AsyncTask&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Integer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Integer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Integer&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="n"&gt;private&lt;/span&gt; &lt;span class="n"&gt;static&lt;/span&gt; &lt;span class="n"&gt;final&lt;/span&gt; &lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;TAG&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;SplashScreenTask&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="nv"&gt;@Override&lt;/span&gt;
    &lt;span class="n"&gt;protected&lt;/span&gt; &lt;span class="n"&gt;Integer&lt;/span&gt; &lt;span class="n"&gt;doInBackground&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Integer&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt; &lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nb"&gt;int&lt;/span&gt; &lt;span class="n"&gt;count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;count&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;count&lt;/span&gt; &lt;span class="nv"&gt;%&lt;/span&gt; &lt;span class="nv"&gt;10&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;Log&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;TAG&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;Sleeping... &amp;quot;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;count&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
                &lt;span class="n"&gt;Thread&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
                &lt;span class="n"&gt;count&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="n"&gt;catch&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;InterruptedException&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;printStackTrace&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Integer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="nv"&gt;@Override&lt;/span&gt;
    &lt;span class="n"&gt;protected&lt;/span&gt; &lt;span class="n"&gt;void&lt;/span&gt; &lt;span class="n"&gt;onPostExecute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Integer&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;startActivity&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Intent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;getApplicationContext&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;FirstStart&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;class&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;protected&lt;/span&gt; &lt;span class="n"&gt;void&lt;/span&gt; &lt;span class="n"&gt;onCancelled&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;startActivity&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Intent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;getApplicationContext&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;FirstStart&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;class&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;You can implement SplashScreenDelay as nested class within your activity. In "onCreate" you would start your new asynchronous timer with:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="n"&gt;splashDelay&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;SplashScreenDelay&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;I like the idea, that a user can skip the splash screen by just touching the screen. Therefore we need this in our activity:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="nv"&gt;@Override&lt;/span&gt;
&lt;span class="n"&gt;public&lt;/span&gt; &lt;span class="n"&gt;boolean&lt;/span&gt; &lt;span class="n"&gt;onTouchEvent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;MotionEvent&lt;/span&gt; &lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;getAction&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;MotionEvent&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ACTION_DOWN&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;splashDelay&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cancel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Almost done! Now we just need to make sure, that the splash screen won't be in the history stack. The easiest way to do this is in your AndroidManifest.xml. Just add &lt;strong&gt;&lt;em&gt;android:noHistory="true"&lt;/em&gt;&lt;/strong&gt; to your activity.&lt;/p&gt;
&lt;p&gt;Have fun!&lt;/p&gt;</summary><category term="Android"></category><category term="Java"></category></entry><entry><title>How to json serialize form errors</title><link href="/how-to-json-serialize-form-errors.html" rel="alternate"></link><updated>2010-02-18T00:00:00+01:00</updated><author><name>Jochen Breuer</name></author><id>tag:,2010-02-18:how-to-json-serialize-form-errors.html</id><summary type="html">&lt;p&gt;This is really ugly and you will absolutely need it if you'd like to json serialize form errors in Django. Why? Because you'd like to reply to an AJAX request and just pass trough the errors your form has generated.&lt;/p&gt;
&lt;p&gt;simplejson itself is not able to serialize the ErrorDict. But not the ErrorDict itself is the problem - the proxy objects within the ErrorDict are the problem. Those proxy objects represent a string (unicode here) and will be casted whenever needed. This ensures that you won't run into problems with internationalization.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://groups.google.com/groups/profile?enc_user=7AIm5BYAAADbiNrce-eQOAMY0y8OQGJ5o4cocwWvDVg2RHsu8f1bCg"&gt;Russell Keith-Magee&lt;/a&gt; posted an excellent &lt;a href="http://groups.google.com/group/django-users/msg/43054cb5449ea08f"&gt;explanation&lt;/a&gt; on &lt;a href="http://groups.google.com/group/django-users/browse_thread/thread/d60e8d6d591f8eed#"&gt;a topic dealing with this in 'django users' group&lt;/a&gt;.&lt;br /&gt;
Also the solution can be found there. I just had to stuff it into a function and now my forms generate error messages that can be understood by e.g. a GWT client.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="n"&gt;def&lt;/span&gt; &lt;span class="n"&gt;error_form_serialization&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;error_dict&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;  
    &lt;span class="s"&gt;&amp;quot;&amp;quot;&amp;quot;  &lt;/span&gt;
&lt;span class="s"&gt;    This method strips the proxy objects from the error dict and casts  &lt;/span&gt;
&lt;span class="s"&gt;    them to unicode. After that the error dict can and will be  &lt;/span&gt;
&lt;span class="s"&gt;    json-serialized.  &lt;/span&gt;
&lt;span class="s"&gt;    &amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;  
    &lt;span class="n"&gt;plain_dict&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;([(&lt;/span&gt;&lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;unicode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="n"&gt;in&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="n"&gt;in&lt;/span&gt; &lt;span class="n"&gt;error_dict&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;()])&lt;/span&gt;   
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;simplejson&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dumps&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;plain_dict&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;</summary><category term="Django"></category><category term="Python"></category><category term="Web"></category></entry><entry><title>RAM-alarm-adingdong / How to memtest on a Mac</title><link href="/ram-alarm-adingdong-how-to-memtest-on-a-mac.html" rel="alternate"></link><updated>2010-02-14T00:00:00+01:00</updated><author><name>Jochen Breuer</name></author><id>tag:,2010-02-14:ram-alarm-adingdong-how-to-memtest-on-a-mac.html</id><summary type="html">&lt;h2&gt;Update: This blog post is so absolutely outdated, that you shouldn't waste your time to read it. Just grab your newest Linux distro, feed your Mac with it and you will (in most of the cases) get a memtest option.&lt;/h2&gt;
&lt;p&gt;If your Mac occasionally starts crashing with nice kernel panics and no fancy new kernel extensions are loaded, your RAM might have gone bad. But how to find out?&lt;/p&gt;
&lt;p&gt;On a PC you can just grab the next Linux distro CD/DVD and boot it. The bootloader will then ask you what to boot. Normally one of the options will be memtest. But not with a Mac.&lt;/p&gt;
&lt;p&gt;So what are the options? There is a tool called &lt;a href="http://www.memtestosx.org"&gt;Memtest OS X&lt;/a&gt;. Although it is licensed under the GPL the developers want to have money before you can decrypt the DMG image. I didn't have the time to wait for someone to send me a key, so I looked around and found &lt;a href="http://www.kelleycomputing.net/rember/"&gt;Rember&lt;/a&gt;. Rember is a GUI for Memtest OS X and has the same memtest included ... for free. So why not use the included memtest in Rember instead!?&lt;/p&gt;
&lt;p&gt;But with a full blown Mac OS X started a fair amount of RAM is already consumed. So it would be better to start the Mac in single user mode. To do that you will have to press and hold Cmd + S when you hear the start chime. When the screen goes black you can let go. Now you will have to wait until you will get the shell and enter the following lines:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="sr"&gt;/sbin/&lt;/span&gt;&lt;span class="n"&gt;fsck&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;fy&lt;/span&gt;  
&lt;span class="sr"&gt;/sbin/mo&lt;/span&gt;&lt;span class="n"&gt;unt&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;uw&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;  
&lt;span class="sr"&gt;/Applications/&lt;/span&gt;&lt;span class="n"&gt;Rember&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="sr"&gt;/Contents/&lt;/span&gt;&lt;span class="n"&gt;Resources&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;memtest&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;L&lt;/span&gt; &lt;span class="n"&gt;auto&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;The option -L will create a logfile for you, auto tells memtest to use all the memory available and 3 is the amount of loops memtest will perform.&lt;/p&gt;
&lt;p&gt;If anything goes wrong memtest will tell you.&lt;/p&gt;
&lt;p&gt;Good luck!&lt;/p&gt;
&lt;p&gt;PS: There is also a tool called &lt;a href="http://pyropus.ca/software/memtester/"&gt;memtester&lt;/a&gt; in the &lt;a href="http://www.macports.org"&gt;MacPorts&lt;/a&gt; that will do the job.&lt;/p&gt;</summary><category term="Mac"></category></entry><entry><title>Cloud Solution ;)</title><link href="/cloud-solution.html" rel="alternate"></link><updated>2010-01-03T00:00:00+01:00</updated><author><name>Jochen Breuer</name></author><id>tag:,2010-01-03:cloud-solution.html</id><summary type="html">&lt;p&gt;A while ago I was forced to create my own cloud solution, since nothing quite satisfied me. Here it is! :)&lt;/p&gt;
&lt;p&gt;&lt;img alt="Network Cloud" src="/static/images/Network-Cloud.png" title="Network Cloud" /&gt;&lt;/p&gt;
&lt;p&gt;The image is licensed under the &lt;a href="http://creativecommons.org/licenses/by-sa/3.0/"&gt;Creative Commons Attribution-Share Alike 3.0 Unported&lt;/a&gt;. You can &lt;a href="http://webgarbage.de/static/images/Network-Cloud.svg"&gt;download the SVG version here&lt;/a&gt;. It would be nice if you would &lt;a href="brejoc@gmail.com"&gt;drop me a note&lt;/a&gt; if you use it somewhere in the public. Have fun!&lt;/p&gt;
&lt;p&gt;Oh, btw - Happy new year! :)&lt;/p&gt;</summary><category term="Cloud"></category></entry><entry><title>No more gksu?</title><link href="/no-more-gksu.html" rel="alternate"></link><updated>2009-12-28T00:00:00+01:00</updated><author><name>Jochen Breuer</name></author><id>tag:,2009-12-28:no-more-gksu.html</id><summary type="html">&lt;p&gt;At least in OpenSuse gksu seems to be no more. After hitting a few pages and looking around I think some of you know the problem. I needed to execute a program with root privileges in gnome. No big deal if you can just fire up a console. But I needed this for my father, so I was looking for the good old gksu. But gksu is no longer part of the official repositories in OpenSuse. So I had to search the big old junkyard and found gnomesu.&lt;/p&gt;
&lt;p&gt;The little bash script I created looked something like this:&lt;/p&gt;
&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;1
2&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="c"&gt;#! /bin/bash  &lt;/span&gt;
gnomesu the_app ...
&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;

&lt;p&gt;But it gets even better. At home my PC-Desktop is running &lt;a href="http://fedoraproject.org/"&gt;Fedora&lt;/a&gt; and there you don't have gksu and neither you have gnomesu. But there seems to be something to replace them called &lt;a href="http://www.honeybeenet.altervista.org/beesu/"&gt;beesu&lt;/a&gt;. Sometimes I really ask myself if there is really freedom in choice... but only sometimes.&lt;/p&gt;</summary><category term="Linux"></category></entry><entry><title>Juno with WSGI</title><link href="/juno-with-wsgi.html" rel="alternate"></link><updated>2009-10-11T00:00:00+02:00</updated><author><name>Jochen Breuer</name></author><id>tag:,2009-10-11:juno-with-wsgi.html</id><summary type="html">&lt;p&gt;Just a quick note on the wonderful &lt;a href="http://github.com/breily/juno"&gt;Juno&lt;/a&gt; framework, which I've been using for a small project. Sadly the documentation isn't quite clear when it comes to deployment with mod_wsgi. At least I had some head scratching while reading through the documentation and just had to figure out how to do it.&lt;/p&gt;
&lt;p&gt;This is what you will find in the docu:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="o"&gt;**&lt;/span&gt; &lt;span class="n"&gt;WSGI&lt;/span&gt; &lt;span class="n"&gt;Notes&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;

&lt;span class="n"&gt;Since&lt;/span&gt; &lt;span class="n"&gt;mod_wsgi&lt;/span&gt; &lt;span class="n"&gt;requires&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;function&lt;/span&gt; &lt;span class="n"&gt;named&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;application&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;you&lt;/span&gt; &lt;span class="n"&gt;would&lt;/span&gt; &lt;span class="n"&gt;need&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;put&lt;/span&gt; &lt;span class="n"&gt;Juno&lt;/span&gt;
&lt;span class="n"&gt;in&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;wsgi&amp;#39;&lt;/span&gt; &lt;span class="n"&gt;mode&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;call&lt;/span&gt; &lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="n"&gt;like&lt;/span&gt; &lt;span class="n"&gt;so:&lt;/span&gt;

&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;mode&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;wsgi&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  
&lt;span class="n"&gt;application&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="n"&gt;Those&lt;/span&gt; &lt;span class="n"&gt;functions&lt;/span&gt; &lt;span class="n"&gt;will&lt;/span&gt; &lt;span class="n"&gt;make&lt;/span&gt; &lt;span class="n"&gt;more&lt;/span&gt; &lt;span class="n"&gt;sense&lt;/span&gt; &lt;span class="n"&gt;later&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Perhaps it's just me, but it didn't make much more sense to me later. So I basically tried some stuff, until I had a working version. I'm using the config scripts from &lt;a href="http://bitbucket.org/brejoc/django_hoster/"&gt;django_hoster&lt;/a&gt; as a basis. You might want to take a look at the &lt;a href="http://bitbucket.org/brejoc/django_hoster/src/tip/templates/"&gt;templates&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Basically the only thing you will have to change in comparison to a Django WSGI deployment is the app.wsgi. From here you will have to start the Juno app for the WSGI:&lt;/p&gt;
&lt;table class="highlighttable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;1
2
3
4
5
6
7
8&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="c"&gt;#!/usr/bin/python  &lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nn"&gt;os&lt;/span&gt;  
&lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stdout&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stderr&lt;/span&gt;  
&lt;span class="c"&gt;# Here my Juno script is located&lt;/span&gt;
&lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;insert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dirname&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;\&lt;span class="n"&gt;_&lt;/span&gt;\&lt;span class="n"&gt;_file&lt;/span&gt;\&lt;span class="n"&gt;_&lt;/span&gt;\&lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;..\/lib\/&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;web&lt;/span&gt;                   &lt;span class="c"&gt;# This is my juno script  &lt;/span&gt;
&lt;span class="n"&gt;application&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;web&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;      &lt;span class="c"&gt;# Start the Juno app&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;

&lt;p&gt;And that's basically all the magic you need to deploy your Juno web app with WSGI. Have fun!&lt;/p&gt;</summary><category term="Python"></category><category term="Web"></category></entry><entry><title>1Password just isn't enough: SuperGenPass</title><link href="/1password-just-isnt-enough-supergenpass.html" rel="alternate"></link><updated>2009-09-25T00:00:00+02:00</updated><author><name>Jochen Breuer</name></author><id>tag:,2009-09-25:1password-just-isnt-enough-supergenpass.html</id><summary type="html">&lt;p&gt;&lt;strong&gt; IMPORTANT UPDATE: Don't use SuperGenPass! &lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;As Ximo pointed out in his comment SuperGenPass is insecure! I should have realized that immediately but that's life. Due to the fact that SuperGenPass (as a Bookmarklet) hooks to the DOM of the current website the input field you enter your master password can be spoofed rather easily. And with the master password in the hands of someone else you are pretty screwed! Try the &lt;a href="http://akibjorklund.com/files/2009/10/supergenpass-vulnerability-demo.html"&gt;Demo&lt;/a&gt;. &lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Like everyone else I have an enormous amount of passwords, because every website you register expects you to create a new pair of login credentials (since most websites don't support some sort of &lt;a href="http://en.wikipedia.org/wiki/Single_sign-on"&gt;SSO&lt;/a&gt; or &lt;a href="http://openid.net/"&gt;OpenID&lt;/a&gt;). It is no paranoia to choose a new password for every website, because you never know how they store the password and whether you can trust the website owner. So choosing the same password for your Gmail account and your XY blog is not very wise.&lt;/p&gt;
&lt;p&gt;But that generates a problem. Beyond a certain amount of passwords it gets very hard to remember them. I have something around 200 passwords and I just remember 10 passwords for the most common websites I use. I solved this problem with &lt;a href="http://agilewebsolutions.com/products/1Password"&gt;1Password&lt;/a&gt; from &lt;a href="http://agilewebsolutions.com/"&gt;Agile Web Solutions&lt;/a&gt;. This worked rather well, because I mostly use a Mac for work and at home. But recently I started doing some more stuff at my Linux box again. I think I don't have to tell you that I had to look up the passwords more than once at my Mac to login to a certain website and that was annoying. So I looked around and found a very nice solution to my problem: &lt;a href="http://supergenpass.com/"&gt;SuperGenPass&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;SuperGenPass is a &lt;a href="http://en.wikipedia.org/wiki/Bookmarklet"&gt;Bookmarklet&lt;/a&gt; that takes a master password and the domain name to generate a hash that you use as the login password. Its fairly simple. You enter the username and then proceed to the password field. There you enter the master password and click on the SuperGenPass bookmarklet. SuperGenPass will then inject the generated hash into the field and even mark it, so that you can see which input fields have been changed. It also shows a popup where you see the password SuperGenPass has generated - if you wish. Since this is bookmarklet everything is local. Your master password won't be submitted to generate the hash. Nice, isn't it? And it works with Firefox, Safari, Opera and even Internet Explorer (don't use IE, btw).&lt;/p&gt;
&lt;p&gt;So there is no more problem with having hundreds of (fairly save) passwords without using a password manager. But for me SuperGenPass is something like a backup. I still use 1Password, because it automates the login procedure and reduces it to just one click. The only thing that has changed it the way to come up with a password. And if I'm at an other computer I won't have to walk over to my Mac to look up every password.&lt;/p&gt;</summary><category term="Linux"></category><category term="Mac"></category><category term="Web"></category></entry><entry><title>Google Wave is cool!</title><link href="/google-wave-is-cool.html" rel="alternate"></link><updated>2009-09-22T00:00:00+02:00</updated><author><name>Jochen Breuer</name></author><id>tag:,2009-09-22:google-wave-is-cool.html</id><summary type="html">&lt;p&gt;A few days ago I found a really good &lt;a href="http://www.jasonkolb.com/weblog/2009/09/why-google-wave-is-the-coolest-thing-since-sliced-bread.html"&gt;blog post&lt;/a&gt; about &lt;a href="http://wave.google.com/"&gt;Google Wave&lt;/a&gt; from Jason Kalb.&lt;/p&gt;
&lt;p&gt;I didn't know that Google Wave is based on &lt;a href="http://xmpp.org/"&gt;XMPP&lt;/a&gt;. XMPP is a really cool, scalable and multi-purpose technology, which I am a little fan of myself.&lt;br /&gt;
Right now most of the people think of &lt;a href="http://de.wikipedia.org/wiki/Jabber"&gt;Jabber&lt;/a&gt; when they hear XMPP, but - and there Jason Kolb is absolutely right when he says - &lt;em&gt;communication can take many forms, and XMPP accommodates many of them&lt;/em&gt;.&lt;/p&gt;</summary><category term="Web"></category><category term="XMPP"></category></entry><entry><title>Mercurial Rocks!</title><link href="/mercurial-rocks.html" rel="alternate"></link><updated>2009-09-07T00:00:00+02:00</updated><author><name>Jochen Breuer</name></author><id>tag:,2009-09-07:mercurial-rocks.html</id><summary type="html">&lt;p&gt;I'm using &lt;a href="http://mercurial.selenic.com/wiki/"&gt;mercurial&lt;/a&gt; as my SCM of choice. It's really easy to use and I love the possibility of branching with clones, because it just suites my workflow perfectly. But cloning is not the only way to coders branching heaven. You can also branch with bookmarks, create named branches and branch anonymously.&lt;/p&gt;
&lt;p&gt;Recently &lt;a href="http://stevelosh.com"&gt;Steve Losh&lt;/a&gt; published an excellent article to dig into branching with mercurial: &lt;a href="http://stevelosh.com/blog/entry/2009/8/30/a-guide-to-branching-in-mercurial/"&gt;A Guide to Branching in Mercurial&lt;/a&gt;&lt;/p&gt;</summary><category term="Python"></category><category term="mercurial"></category><category term="SCM"></category></entry><entry><title>Mail Comments or How Comments Suck Less</title><link href="/mail-comments-or-how-comments-suck-less.html" rel="alternate"></link><updated>2009-08-12T00:00:00+02:00</updated><author><name>Jochen Breuer</name></author><id>tag:,2009-08-12:mail-comments-or-how-comments-suck-less.html</id><summary type="html">&lt;p&gt;Recently I've been thinking about an alternative for the widespread way of commenting to blogs or websites in general. Nowadays nearly everyone (including me) has a blog and writes uberimportant stuff to the world. That's nice and fine, but since we have web 2.0 we need to let others comment the stuff we write. This way we get a communication where everyone can participate - and I think that is the really important thing here. But can really everyone participate?&lt;/p&gt;
&lt;p&gt;Theoretically the answer would be yes. But let's be honest: Most of the times you read something and you would like to write a comment you press the commenting button and a sign in form pops up. Great - now this is the point where I close the tab and no real communication happened. Just a monologue from the guy with the website. The barrier was just too high. I am not willing to register at every blog or website just to leave a comment. That's nonsense! I bet you know what I am talking about.&lt;/p&gt;
&lt;p&gt;I thought about this a little while and realized it could be much easier, because there is something everybody has, everybody knows how to use it and, most importantly, it works nearly everywhere. What is it? An email account! Yes, that's it. How easy would it be if the blog post would have a unique email address - something like vebadisi34@webgargabe.de and every mail I would write to this address would be added to the list of comments for this blog post. Nice and easy - eh? And with a little magic you could also be informed if someone posts further comments to yours.&lt;/p&gt;
&lt;p&gt;But not only the guy that writes tons of comments would be pleased. Also the website owner would have benefits from that system. There are some very good and effective spam filters for mails. Would be a waste not to use such a mature infrastructure. Also you wouldn't have to log the IP address to identify the person behind the comment, you have their email addresses. If someone posts evil stuff you could just write them a mail and remove the comment. Ultimately you could just blacklist the address and no further comment would come through... at least not with that mail address.&lt;/p&gt;
&lt;p&gt;Someone willing to code this for me? ;)&lt;/p&gt;</summary><category term="Email"></category><category term="Comments"></category></entry><entry><title>Two things you really want to do when using Netbeans on a Mac</title><link href="/two-things-you-really-want-to-do-when-using-netbeans-on-a-mac.html" rel="alternate"></link><updated>2009-07-06T00:00:00+02:00</updated><author><name>Jochen Breuer</name></author><id>tag:,2009-07-06:two-things-you-really-want-to-do-when-using-netbeans-on-a-mac.html</id><summary type="html">&lt;p&gt;Back when I was coding with Ruby I mostly used Netbeans. It is a very nice IDE with lots of useful features. Code completion, VCS support, script debugging, aso. But the support for Python wasn't very good. This changed around Version. 6.7 of Netbeans and there is an &lt;a href="http://download.netbeans.org/netbeans/6.7/python/ea2/"&gt;"Early Access" version&lt;/a&gt; out with Python support.&lt;/p&gt;
&lt;p&gt;But there a two things you really want to change if you use Netbeans on a Mac.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;UTF-8 as default charset&lt;/li&gt;
&lt;li&gt;Using Java 1.6 instead of 1.5 for running Netbeans&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Both of this can be changed in the netbeans.conf, which can be found in your app package. So open the shell and change to /Applications/NetBeans/NetBeans 6.7.app/Contents/Resources/NetBeans/etc&lt;/p&gt;
&lt;p&gt;There you will find "netbeans_default_options" and "netbeans_jdkhome". To "netbeans_default_options" you will have to add the parameter "-J-Dfile.encoding=UTF-8" (without quote). And "netbeans_jdkhome" needs this path as parameter: "/System/Library/Frameworks/JavaVM.framework/Versions/1.6/Home/" (with quote).&lt;/p&gt;
&lt;p&gt;Now you only need to restart Netbeans. Have fun coding!&lt;/p&gt;</summary><category term="IDE"></category><category term="Python"></category><category term="Ruby"></category><category term="Mac"></category></entry><entry><title>First post with Firefox 3.5</title><link href="/first-post-with-firefox-35.html" rel="alternate"></link><updated>2009-07-02T00:00:00+02:00</updated><author><name>Jochen Breuer</name></author><id>tag:,2009-07-02:first-post-with-firefox-35.html</id><summary type="html">&lt;p&gt;So this is the first real post and it is done with the new Firefox 3.5. Looks really good. But still it tends to suck my battery dry. With the x-th Tab open there will be one Website, that has some f**king JavaScript running in the background over and over again and the CPU load will be permanently between 10 and 20 %. Okay, this is not really the fault of Firefox but Safari consumes a little less. Perhaps their JS-Engine is a bit more efficient.&lt;/p&gt;
&lt;p&gt;Something I would really love to see in Firefox too is the "New Window" option in the dock icon context menu (btw, Mac problem - with Linux you won't have that problem). Safari has that and it is really a bless. Just right click the icon, choose "New Window" and here we go. The new window pops up, no switching the screens, pressing APPLE-n and moving the window back from where i came. Wouldn't that be nice?&lt;/p&gt;
&lt;p&gt;Besides that Firefox is really great. It is fast and very stable. Nice job!&lt;/p&gt;</summary></entry><entry><title>Nothing Yet</title><link href="/nothing-yet.html" rel="alternate"></link><updated>2009-05-24T00:00:00+02:00</updated><author><name>Jochen Breuer</name></author><id>tag:,2009-05-24:nothing-yet.html</id><summary type="html">&lt;p&gt;Come back soon. This site will grow.&lt;/p&gt;</summary></entry></feed>