<?xml version="1.0"?>
<rss version="2.0">
<channel>
  <title>geekomatic</title>
  <link>http://geekomatic.ch/</link>
  <description>Stu Thompson&#039;s Digital Meanderings Exposed</description>
  <language>en</language>
  <copyright>Stu Thompson</copyright>
  <lastBuildDate>Fri, 04 May 2012 09:31:00 GMT</lastBuildDate>
  <generator>Pebble (http://pebble.sourceforge.net)</generator>
  <docs>http://backend.userland.com/rss</docs>
  
  
  <item>
    <title>TCP client hangs intermitantly in SYN_SENT for 10 seconds</title>
    <link>http://geekomatic.ch/2012/05/04/1336123860000.html</link>
    
      
        <description>
          &lt;p&gt;We have some high volume media servers that have benefitted from some selective TCP parameter tuning.  These Debian Linux machines have stageful firewalling on the box (netconn_track), a moderate number of actively communicating connections (hundreds to thousands of clients) and high bandwidth (hundreds of megabits per second to multiple gigabits per second.)  
&lt;/p&gt;

&lt;p&gt;Some years ago when ran into a problem with the number of TCP connections consuming too much memory, both for the stack and netconn_track table.  Some of the suggested solutions we implemented included...

&lt;ul&gt;
&lt;li&gt;Enabling &lt;code&gt;tcp_tw_recycle&lt;/code&gt;: &lt;em&gt;&#034;It enables fast recycling of &lt;code&gt;TIME_WAIT&lt;/code&gt; sockets. The default value is 0 (disabled). The sysctl documentation incorrectly states the default as enabled. It can be changed to 1 (enabled) in many cases. Known to cause some issues with hoststated (load balancing and fail over) if enabled, should be used with caution.&#034;&lt;/em&gt; *&lt;/li&gt;
&lt;li&gt;Enabling &lt;code&gt;tcp_tw_reuse&lt;/code&gt;: &lt;em&gt;&#034;This allows reusing sockets in &lt;code&gt;TIME_WAIT&lt;/code&gt; state for new connections when it is safe from protocol viewpoint. Default value is 0 (disabled). It is generally a safer alternative to &lt;code&gt;tcp_tw_recycle&lt;/code&gt;&#034;&lt;/em&gt; *&lt;/li&gt;
&lt;/ul&gt;
(* from SpeedGuid.net&#039;s &lt;/a href=&#034;http://www.speedguide.net/articles/linux-tweaking-121&#034;&gt;Linux Tweaking&lt;/a&gt; page.)
&lt;/p&gt;

&lt;p&gt;While we were loath to tune the TCP kernel parameters (modern kernels tune themselves very well, non-TCP-experts tend to screw it up), there was a notable improvement in the systems.  Later on, when we had problems with the netconn_track table filling up, we tweaked two more parameters:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Setting &lt;code&gt;ip_conntrack_max&lt;/code&gt; to 64k to 128k &lt;/li&gt;
&lt;li&gt;Setting &lt;code&gt;ip_conntrack_tcp_timeout_established&lt;/code&gt; to 5 minutes, from the default of 5 &lt;em&gt;days&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/p&gt;

&lt;p&gt;Things have been working very well for some time.  Until this week, that is.  On Monday I started getting reports of sluggishness in our application.  As the app is under heavy development our first debugging was occurring there.  Once I realized the app was fine I had a look at the TCP connections with a simple script checking the connection states on both client and server.

&lt;code&gt;&lt;pre&gt;
while [ 1 ] 
do
  date
  netstat -n | grep 195.49.105.149
  echo
  sleep 1 
done&lt;/pre&gt;&lt;/code&gt;
&lt;/p&gt;

&lt;p&gt;Below is the output from the client.  Immediately the problem jumped out: the client TCP connection was hanging in the &lt;code&gt;SYN_SENT&lt;/code&gt; state for ~10s!


&lt;code&gt;&lt;pre&gt;Thu May  3 15:58:14 CEST 2012

Thu May  3 15:58:15 CEST 2012
tcp4       0      0  192.168.1.69.63583     195.49.105.158.443     SYN_SENT
tcp4       0      0  192.168.1.69.63582     195.49.105.158.443     SYN_SENT

Thu May  3 15:58:16 CEST 2012
tcp4       0      0  192.168.1.69.63583     195.49.105.158.443     SYN_SENT
tcp4       0      0  192.168.1.69.63582     195.49.105.158.443     SYN_SENT

  -- snip -- 
Thu May  3 15:58:25 CEST 2012
tcp4       0      0  192.168.1.69.63583     195.49.105.158.443     SYN_SENT
tcp4       0      0  192.168.1.69.63582     195.49.105.158.443     SYN_SENT

Thu May  3 15:58:26 CEST 2012
tcp4       0      0  192.168.1.69.63583     195.49.105.158.443     ESTABLISHED
tcp4       0      0  192.168.1.69.63582     195.49.105.158.443     ESTABLISHED

  -- snip -- 

Thu May  3 15:58:36 CEST 2012
tcp4       0      0  192.168.1.69.63583     195.49.105.158.443     ESTABLISHED
tcp4       0      0  192.168.1.69.63582     195.49.105.158.443     ESTABLISHED

Thu May  3 15:53:53 CEST 2012&lt;/pre&gt;&lt;/code&gt;

Note that this problem was occurring not only with HTTPS (as in the above output) but also HTTP and SSH/SCP.  The problem was definitely in the TCP layer.

&lt;/p&gt;

&lt;p&gt;Some research around the Interwebs left me nowhere.  The best suggestion was to reboot and hope.  That&#039;s not the kind of engineered remedy that I was in search of.  Instead we walked back the first to TCP stack tuning parameters, and turn off &lt;code&gt;tcp_tw_recycle&lt;/code&gt; and &lt;code&gt;tcp_tw_reuse&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;That did the trick!  I&#039;m fairly certain that things will be OK now, and that the later tuning parameters will protect us from the problems our &lt;code&gt;tcp_tw_recycle&lt;/code&gt; and &lt;code&gt;tcp_tw_reuse&lt;/code&gt; tweaks were intended to help with.  If problems do creep up again with the volume of unused sockets we&#039;ll try tweaking only &lt;code&gt;tcp_tw_reuse&lt;/code&gt;, as that is deemed safer.&lt;/p&gt;






        </description>
      
      
    
    
    
    <comments>http://geekomatic.ch/2012/05/04/1336123860000.html#comments</comments>
    <guid isPermaLink="true">http://geekomatic.ch/2012/05/04/1336123860000.html</guid>
    <pubDate>Fri, 04 May 2012 09:31:00 GMT</pubDate>
  </item>
  
  <item>
    <title>How to write a custom Tomcat logging valve</title>
    <link>http://geekomatic.ch/2012/04/26/1335417780000.html</link>
    
      
        <description>
          &lt;p&gt;&lt;img src=&#034;/stuff/tomcat.gif&#034; align=&#034;right&#034; /&gt;In an attempt to aid a regular log analysis task of mine, I decided to write my own customer Tomcat valve.  The idea was to pre-filter what I was after and log that to a file.  &lt;/p&gt;

&lt;p&gt;The result of my custom valve was an access log that rolled over monthly that contained:
&lt;ul&gt;
&lt;li&gt;Only PUT requests&lt;/li&gt;
&lt;li&gt;A segment of the URI&lt;/li&gt;
&lt;li&gt;The User-Agent of the client&lt;/li&gt;
&lt;/ul&gt;
&lt;/p&gt;

&lt;p&gt;Unfortunately, the task of coding a custom valve is not as simple as implementing a &lt;a href=&#034;http://docs.oracle.com/javaee/6/api/javax/servlet/Filter.html&#034;&gt;Filter&lt;/a&gt; or extending &lt;a href=&#034;http://docs.oracle.com/javaee/6/api/javax/servlet/ServletRequestWrapper.html&#034;&gt;ServletRequestWrapper&lt;/a&gt;.  Fortunately, the scope of what I was trying to accomplish was limited.  Below is my code for extending &lt;a href=&#034;http://tomcat.apache.org/tomcat-6.0-doc/api/org/apache/catalina/valves/AccessLogValve.html&#034;&gt;AccessLogValve&lt;/a&gt; and a couple of tips for anyone venturing into the world of custom logging valves.&lt;/p&gt;

&lt;p&gt;Notes on extending AccessLogValve:
&lt;ul&gt;
&lt;li&gt;AccessLogValve.invoke(request, response) always needs to be called.  If you override it and do not call super.invoke() then the request stops there.&lt;/li&gt;
&lt;li&gt;AccessLogValve is not scoped to the request.  It is not thread safe. Do not attempt to keep state unless you have a specific reason to have one request impact another requests&#039; valve behavior.&lt;/li&gt;
&lt;li&gt;Make any the log/no-log decision in &lt;a href=&#034;http://tomcat.apache.org/tomcat-6.0-doc/api/org/apache/catalina/valves/AccessLogValve.html#log(org.apache.catalina.connector.Request, org.apache.catalina.connector.Response, long)&#034;&gt;.log(Request request, Response response, long time)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;To trim the URI, and filter out the method and protocol from the log,I overrode &lt;a href=&#034;http://tomcat.apache.org/tomcat-6.0-doc/api/org/apache/catalina/connector/Request.html&#034;&gt;org.apache.catalina.connector.Request&lt;/a&gt;.  This was a little trickier than expected as, like AccessLogValve, there is no corresponding wrapper.  In the below extension of Request, the code overrides only the methods that are called by the logging patter.  If the logging pattern contains anything that might calla property that is not set, then an NPE very well be thrown.&lt;/li&gt;
&lt;/ul&gt;
&lt;/p&gt;


&lt;p&gt;The code: LogAbreviatedPutValve.java

&lt;code&gt;&lt;pre&gt;

package ch.geekomatic.catalina;

import java.util.Enumeration;

import org.apache.catalina.connector.Request;
import org.apache.catalina.connector.Response;
import org.apache.catalina.valves.AccessLogValve;

/**
 * This log valve filters out non-PUT requests and trims the logged URI. This is only useful for providing an easy to parse access log 
 * to generate statistics on the clients that upload via PUT. The
 * correct way to use this value is to set the logger pattern to:
 * 
 * %r %{User-Agent}i
 * 
 * Other patterns either will not work or may generate an exception.
 * 
 * @author Stu Thompson
 * 
 */
public class LogAbreviatedPutValve extends AccessLogValve {

    @Override
    public void log(Request request, Response response, long time) {
        if (request.getMethod() != null &amp;&amp; request.getMethod().equals(&#034;PUT&#034;)) 
            super.log(new AbreviatedRequest(request), response, time);
        
        
        super.invoke(arg0, arg1)
    }

}

/**
 * This class provides a trimmed down request URI which is only useful for providing an easy to parse access log
 *  to generate statistics on the clients that upload via PUT
 * 
 * @author Stu Thompson
 * @since v2.12.5
 */
class AbreviatedRequest extends Request {
    private final Request _request;

    AbreviatedRequest(Request request) {
        _request = request;
    }

    /**
     * Returns a trimemd RequestURI that does not contain any characters from the position of the last /, and hence the file name.
     * 
     * @see org.apache.catalina.connector.Request#getProtocol()
     */
    @Override
    public String getRequestURI() {
        String uri = _request.getRequestURI();
        if (uri != null &amp;&amp; uri.contains(&#034;/&#034;)) {
            int pos;

            // remove file
            pos = uri.lastIndexOf(&#034;/&#034;);
            uri = uri.substring(0, pos);
            return uri;
            }
        } 
        
        return _request.getRequestURI();
    }

    /**
     * The logged URI includes the method. Since we are already filtering only for PUT, return an empty string.
     * 
     * @see org.apache.catalina.connector.Request#getMethod()
     * @returns empty string
     */
    @Override
    public String getMethod() {
        return &#034;&#034;;
    }

    /**
     * The logged URI includes the HTTP protocol. We have no interest in this for our special log. Return an empty string.
     * 
     * @see org.apache.catalina.connector.Request#getProtocol()
     * @returns empty string
     */
    @Override
    public String getProtocol() {
        return &#034;&#034;;
    }

    /**
     * The logged URI includes the query string. We have no interest in this for our special log. Return null no matter what.
     * 
     * @see org.apache.catalina.connector.Request#getQueryString()
     * @returns null
     */
    @Override
    public String getQueryString() {
        return null;
    }

    @Override
    public String getHeader(String name) {
        return _request.getHeader(name);
    }

    @Override
    public Enumeration&lt;String&gt; getHeaderNames() {
        return _request.getHeaderNames();
    }

    @Override
    public Enumeration&lt;String&gt; getHeaders(String name) {
        return _request.getHeaders(name);
    }
}&lt;/pre&gt;&lt;/code&gt;
&lt;/p&gt;



&lt;p&gt;The code: server.xml snippet
&lt;br/&gt;
&lt;code&gt;
&lt;br/&gt;&amp;lt;Valve className=&#034;ch.geekomatic.catalina.LogAbreviatedPutValve&#034; 
&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;directory=&#034;logs/access&#034;
&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;prefix=&#034;put_log.&#034; suffix=&#034;.txt&#034; pattern=&#034;%r %{User-Agent}i&#034;
&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;fileDateFormat=&#034;yyyy-MM&#034; resolveHosts=&#034;false&#034;/&amp;gt;

&lt;/code&gt;

&lt;/p&gt;
        </description>
      
      
    
    
    
    <comments>http://geekomatic.ch/2012/04/26/1335417780000.html#comments</comments>
    <guid isPermaLink="true">http://geekomatic.ch/2012/04/26/1335417780000.html</guid>
    <pubDate>Thu, 26 Apr 2012 05:23:00 GMT</pubDate>
  </item>
  
  <item>
    <title>Duplicate Session Errors on BlazeDS</title>
    <link>http://geekomatic.ch/2012/04/20/1334939760000.html</link>
    
      
        <description>
          &lt;p&gt;&lt;img src=&#034;/stuff/blazeds.jpg&#034; align=&#034;right&#034;&gt;A while back we discovered a reason behind &#034;duplicate session errors&#034; in BlazeDS, and I &lt;a href=&#034;http://geekomatic.ch/2012/03/03/1330758120000.html&#034;&gt;posted what fixed it for us&lt;/a&gt;.  But the pesky little problem remained on a single server.  Until recently, the cause eluded us.  What, prey tell, was the culprit?&lt;/p&gt;

&lt;p&gt;The problem server had only one significant difference from the happily running servers: Apache Tomcat 7.0.0, from two years ago.  Once we rolled the Tomcat version back to the most recent Tomcat 6 version, 6.0.35, everything worked perfectly.&lt;/p&gt;

&lt;p&gt;That&#039;s not the first bizarre problem I&#039;ve had with Tomcat 7 that was solved by staying with Tomcat 6.  It might be a while longer before trying Tomcat 7 again.&lt;/p&gt;
        </description>
      
      
    
    
    
    <comments>http://geekomatic.ch/2012/04/20/1334939760000.html#comments</comments>
    <guid isPermaLink="true">http://geekomatic.ch/2012/04/20/1334939760000.html</guid>
    <pubDate>Fri, 20 Apr 2012 16:36:00 GMT</pubDate>
  </item>
  
  <item>
    <title>Duplicate Session Errors on BlazeDS</title>
    <link>http://geekomatic.ch/2012/03/03/1330758120000.html</link>
    
      
        <description>
          &lt;p&gt;&lt;img src=&#034;/stuff/blazeds.jpg&#034; align=&#034;right&#034;&gt;For the past week I&#039;ve been coding with the BlazeDS 4 framework, in conjunction with my Flex-coding counterpart.  Things were moving along quickly...until we brought in another Flex coder, Alex, who works on Windows.  (My other colleague, Andy, and I work on OSX.)  Alex was unable to get the app to work because he was receiving a strange error message:

&lt;pre&gt;Detected duplicate HTTP-based FlexSessions, generally due to the remote
host disabling session cookies. Session cookies must be enabled to manage
the client connection correctly.&lt;/pre&gt;

Very quickly on Teh Google we found other people experiencing the error two.  (E.g.: &#034;&lt;a href=&#034;http://meteatamel.wordpress.com/2011/01/26/duplicate-session-errors-in-lcdsblazeds/&#034; target=&#034;_blank&#034;&gt;Duplicate session errors in LCDS/BlazeDS&lt;/a&gt;&#034;)  But those solutions were either not helpful (&lt;em&gt;&#034;ensure a session is established from the start by a single call&#034;&lt;/em&gt;) or outright destructive hackiness, like &lt;em&gt;&#034;patch BlazeDS and remove the duplicate session detection.&#034;&lt;/em&gt;  That last suggestion breaks any session-based functionality, like authorization.
&lt;/p&gt;

&lt;p&gt;In order to debug what was happening with the sessions a small tweak to the &lt;a href=&#034;http://tomcat.apache.org/tomcat-6.0-doc/config/valve.html&#034; target=&#034;_blank&#034;&gt;Apache Tomcat log valve&lt;/a&gt; was in order.&lt;/p&gt;

&lt;code&gt;&lt;pre&gt;     &amp;lt;Valve className=&#034;org.apache.catalina.valves.AccessLogValve&#034; directory=&#034;logs/access&#034;  
             prefix=&#034;access_m15_berea_log.&#034; suffix=&#034;.txt&#034; pattern=&#034;%h %S %t &#039;%r&#039; %s %B %D  %{Cookie}i %{Set-Cookie}o&#034;
             fileDateFormat=&#034;yyyy-MM&#034; resolveHosts=&#034;false&#034; /&amp;gt;
&lt;/pre&gt;&lt;/code&gt;

&lt;p&gt;This specialized logs records:&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;%h:&lt;/strong&gt; client IP address&lt;/string&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;%S:&lt;/strong&gt; Tomcat&#039;s session ID for the request&lt;/string&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;%t:&lt;/strong&gt; time&lt;/string&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;%r:&lt;/strong&gt; first like of the HTTP request; verb, URI and version&lt;/string&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;%s:&lt;/strong&gt; HTTP status code&lt;/string&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;%B:&lt;/strong&gt; number of non-header bytes&lt;/string&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;%D:&lt;/strong&gt; time taken to process request, in milliseconds &lt;/string&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;%{Cookie}i:&lt;/strong&gt; The value of the &#034;Cookie&#034; header in the request&lt;/string&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;%{Set-Cookie}o:&lt;/strong&gt; The value of the &#034;Set-Cooking&#034; header in the request&lt;/string&gt;&lt;/li&gt;


&lt;/ul&gt;
Why the cookie values, you ask?  That&#039;s how client and server communicate session IDs to each other.  The client can also communicate them via the URI.
&lt;/p&gt;

&lt;p&gt;After restarting Tomcat so that the log changes could take effect, we had our client hit the server.  The client, on start, does a couple of things.  It subscribes to three topics on the messaging service and makes two &#034;shared object&#034; RPC calls.  We can see this activity in the logs files below.  (Edited for readability.)

&lt;code&gt;&lt;pre&gt;

3.2.5.1 C7E0E [12:19:24] &#039;POST /ws/amf3/amf HTTP/1.1&#039;                             200 245 89   -     C7E0E
3.2.5.1 C7E0E [12:19:24] &#039;POST /ws/amf3/amf;jsessionid=C7E0E HTTP/1.1&#039;            200 138 205  C7E0E -
3.2.5.1 A6B02 [12:19:24] &#039;POST /ws/amf3/streamingamf HTTP/1.1&#039;                    200 969 40   -     A6B02
3.2.5.1 A6B02 [12:19:24] &#039;POST /ws/amf3/streamingamf;jsessionid=A6B02 HTTP/1.1&#039;   200 539 6    A6B02 
3.2.5.1 A6B02 [12:19:25] &#039;POST /ws/amf3/streamingamf;jsessionid=A6B02 HTTP/1.1&#039;   200 468 99   A6B02 
3.2.5.1 A6B02 [12:19:25] &#039;POST /ws/amf3/streamingamf;jsessionid=A6B02 HTTP/1.1&#039;   200 468 98   A6B02 
3.2.5.1 A6B02 [12:19:25] &#039;POST /ws/amf3/streamingamf;jsessionid=A6B02 HTTP/1.1&#039;   200 468 10   A6B02 
3.2.5.1 D2E25 [12:19:25] &#039;POST /ws/amf3/amf;jsessionid=C7E0E HTTP/1.1&#039;            200 1331 39  -     D2E25
3.2.5.1 -     [12:19:24] &#039;POST /ws/amf3/streamingamf;jsessionid=A6B02?command=open&amp;version=1 HTTP/1.1&#039;
                                                                                  200 916 444  -     -
3.2.5.1 EC695 [12:19:25] &#039;POST /ws/amf3/streamingamf;jsessionid=A6B02?command=close&amp;streamId=6877DFC8-030A&amp;version=1 HTTP/1.1&#039; 
                                                                                  200 0 3      -     EC695


&lt;/pre&gt;&lt;/code&gt;

&lt;em&gt;&#034;Five different sessions, for ten requests, over 2 seconds?  That&#039;s crazy!&#034;  
&lt;/em&gt; I thought.  And then I noticed that the session IDs &lt;em&gt;a)&lt;/em&gt; seemed to have an affinity for the channel (streamingamf or amf), and &lt;em&gt;b)&lt;/em&gt; that the session seemed to change after a switch from one channel to the other.  Andy and I were stumped.  How on earth could we work around this?


&lt;/p&gt;

&lt;p&gt;And that&#039;s when I had a Eureka! moment.  &#034;What if we used the streaming AMF channel to make the shared object calls?  And hence use only one channel?&#034;  It worked.&lt;/p&gt;


&lt;p&gt;We, like I suspect a lot of BlazeDS users made some assumptions based upon the standard BlazeDS examples, like:

&lt;ul&gt;
&lt;li&gt;&lt;em&gt;&#034;shared object calls are only made to the my-amf end point&#034;&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&#034;messaging must be done separately via the my-streaming-amf end point&#034;&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&#034;clients then maintain session affinity by using only one NetConnection object, even if they have multiple endpoints&#034;&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;strong&gt;All of these together are false.&lt;/strong&gt;  Our resolution to the &#034;duplicate session&#034; problems were to use only the Streaming AMF channel.  It&#039;s even cleaned up our code and configuration file.

&lt;/p&gt;
&lt;p&gt;To that end, here is my &lt;a href=&#034;/stuff/blazeds.xml.sample&#034;&gt;simple sample BlazeDS configuration&lt;/a&gt; file.  It replaces the &lt;em&gt;four&lt;/em&gt; configuration files that come with BlazeDS.  I&#039;ve also added important notes on key properties so one doesn&#039;t need to run off to Adobe&#039;s documentation site.&lt;/p&gt;

&lt;p&gt;If you&#039;ve gotten this far you are probably thinking either &lt;em&gt;&#034;OMG, what a fucking idiot.  Of course it works this way.&#034;&lt;/em&gt;  But I bet quite a few of you are thinking &lt;em&gt;&#034;OMG, thanks for saving my ass.&#034;&lt;/em&gt;  Either way I&#039;d love to hear about it in the comments.&lt;/p&gt;
        </description>
      
      
    
    
    
    <comments>http://geekomatic.ch/2012/03/03/1330758120000.html#comments</comments>
    <guid isPermaLink="true">http://geekomatic.ch/2012/03/03/1330758120000.html</guid>
    <pubDate>Sat, 03 Mar 2012 07:02:00 GMT</pubDate>
  </item>
  
  <item>
    <title>Raspberry Pi Image Download Page</title>
    <link>http://geekomatic.ch/2012/02/18/1329550620000.html</link>
    
      
      
        <description>
          &lt;p&gt;&lt;img src=&#034;http://geekomatic.ch/images/pilogo.png&#034; align=&#034;left&#034;&gt;I&#039;ve got access to mad bandwidth, thanks to my employer xtendx AG.  We&#039;d like to be using Raspberry PI for some projects, so hosting this site is a great way to share the love.&lt;/p&gt;
&lt;br/&gt;
&lt;br/&gt;
&lt;a href=&#034;http://geekomatic.ch/pages/raspberrypi.html&#034; &gt;Raspberry Pi Image Download Page&lt;/a&gt;&lt;p&gt;&lt;a href=&#034;http://geekomatic.ch/2012/02/18/1329550620000.html&#034;&gt;Read more...&lt;/a&gt;&lt;/p&gt;
        </description>
      
    
    
    
    <comments>http://geekomatic.ch/2012/02/18/1329550620000.html#comments</comments>
    <guid isPermaLink="true">http://geekomatic.ch/2012/02/18/1329550620000.html</guid>
    <pubDate>Sat, 18 Feb 2012 07:37:00 GMT</pubDate>
  </item>
  
  </channel>
</rss>

