<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0"><channel><title>amix.dk blog</title><link>http://amix.dk/Main/</link><description /><lastBuildDate>Sat, 05 May 2012 17:04:16 GMT</lastBuildDate><generator>PyRSS2Gen-1.0.0</generator><docs>http://blogs.law.harvard.edu/tech/rss</docs><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/amixdk" /><feedburner:info uri="amixdk" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:emailServiceId>amixdk</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><item><title>Displaying timezones better in Python</title><link>http://feedproxy.google.com/~r/amixdk/~3/fP7u1MZbr4Y/19688</link><description>&lt;p&gt;
I have released &lt;a href="https://github.com/amix/python-timezones" target="_blank"&gt;timezones&lt;/a&gt; for Python, it makes timezones more user-friendly for the users by formatting timezones better and auto-guessing timezone based on the user's IP address.
&lt;/p&gt;

&lt;p&gt;
You can:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
Install the library via &lt;span class="hl"&gt;sudo pip install timezones&lt;/span&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://amix.github.com/python-timezones/" target="_blank"&gt;Read the documentation&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/amix/python-timezones" target="_blank"&gt;Fork the code on github&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
The library provides:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
User friendly rendering of common timezones. &lt;a href="http://pytz.sourceforge.net/" target="_blank"&gt;pytz.common_timezones&lt;/a&gt; includes &lt;b&gt;430 common timezones&lt;/b&gt;, without any smart sorting or display of useful information such as timezone offsets. This provides an awful experience if you just present this to the users - - like &lt;a href="https://docs.djangoproject.com/en/dev/topics/i18n/timezones/" target="_blank"&gt;it's done in Django&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
Auto-guessing a user's timezone based on the user's IP. This is done via &lt;a href="http://code.google.com/p/pygeoip/" target="_blank"&gt;pygeoip&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
Supporting fixed offsets timezones, such as "GMT +1:00"
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
Example usage of the library:
&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;timezones.tz_rendering&lt;/span&gt; &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="n"&gt;html_render_timezones&lt;/span&gt;

&lt;span class="n"&gt;html_timezones&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;html_render_timezones&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;select_name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;timezone&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;,&lt;/span&gt;
                                       &lt;span class="n"&gt;current_selected&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;current_timezone&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                                       &lt;span class="n"&gt;user_ip&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;get_current_ip&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
                                       &lt;span class="n"&gt;first_entry&lt;/span&gt;&lt;span class="o"&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;Select your timezone&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;
A screenshot of the library in use [in &lt;a href="https://wedoist.com/" target="_blank"&gt;Wedoist&lt;/a&gt;]:
&lt;/p&gt;

&lt;p&gt;
&lt;img src="http://amix.dk/uploads/python-timezones.jpg" alt="python-timezones screenshot" /&gt;
&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/amixdk/~4/fP7u1MZbr4Y" height="1" width="1"/&gt;</description><guid isPermaLink="false">http://amix.dk/blog/post/19688</guid><pubDate>Sat, 05 May 2012 17:04:16 GMT</pubDate><feedburner:origLink>http://amix.dk/blog/post/19688</feedburner:origLink></item><item><title>Updating caching headers for Amazon S3 and CloudFront</title><link>http://feedproxy.google.com/~r/amixdk/~3/FuQBrXnc4y0/19687</link><description>&lt;p&gt;
I made a major blunder when setting caching headers for &lt;a href="http://aws.amazon.com/s3/" target="_blank"&gt;Amazon S3&lt;/a&gt; and &lt;a href="http://aws.amazon.com/cloudfront/" target="_blank"&gt;CloudFront&lt;/a&gt;. Making such a blunder makes my sites slower and costs more in bandwidth. In this little blog post I will detail how to fix this and make sure you use correct caching headers.
&lt;/p&gt;
&lt;h3&gt;Use the correct syntax&lt;/h3&gt;

&lt;p&gt;
The first rule, make sure that the syntax is correct. Correct syntax looks like this:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
Cache-Control: max-age=155520000, public
&lt;/li&gt;
&lt;li&gt;
Expires: Sat, 29 Apr 2017 13:31:45-0000 GMT
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
For me, I used following syntax (it's wrong and wont be understood by browsers!):
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
Cache-Control: max-age 155520000
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
Read more in &lt;a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html" target="_blank"&gt;RFC 2616&lt;/a&gt; for all the details sounding headers.
&lt;/p&gt;
&lt;h3&gt;Be greedy and use file versioning&lt;/h3&gt;

&lt;p&gt;
Use file versioning (for example make md5 hash a part of the name). You are forced to do this anyway since CloudFront does not support invalidations that well.
&lt;/p&gt;

&lt;p&gt;
Already using file versioning? Great, then set your expires a lot of years in the future, since the filename will change when the files changes (i.e. you don't have to worry about invalidating old files).
&lt;/p&gt;
&lt;h3&gt;Made a blunder? Use my script to update all S3 files in a bucket&lt;/h3&gt;

&lt;p&gt;
Before you update headers to every S3 object make sure that the code works by testing it on dummy objects. I had a lot of issues getting it to work, since it will replace older metadata and not just update it. You can use my script (but it's not bulletproof, so be sure that any missing headers that you use are copied over to the updated metadata).
&lt;/p&gt;

&lt;p&gt;
You will need to do following:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
Using the script below test it out on dummy S3 objects
&lt;/li&gt;
&lt;li&gt;
Update headers for every S3 object 
&lt;/li&gt;
&lt;li&gt;
Create new Amazon CloudFront distributions after the S3 objects are updated. Can be done via aws.amazon.com
&lt;/li&gt;
&lt;li&gt;
Update DNS records to use the new distributions
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="c"&gt;#!/usr/bin/env python&lt;/span&gt;
&lt;span class="sd"&gt;&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
&lt;span class="sd"&gt;    fix_s3_cache_headers&lt;/span&gt;
&lt;span class="sd"&gt;    ~~~~~~~~&lt;/span&gt;

&lt;span class="sd"&gt;    Updates S3 objects with new cache-control headers.&lt;/span&gt;

&lt;span class="sd"&gt;    Usage::&lt;/span&gt;
&lt;span class="sd"&gt;        python fix_cloudfront.py &amp;lt;bucket_name&amp;gt; &amp;lt;keys&amp;gt;*&lt;/span&gt;

&lt;span class="sd"&gt;    Examples::&lt;/span&gt;
&lt;span class="sd"&gt;        Updates all keys of avatars.wedoist.com bucket::&lt;/span&gt;
&lt;span class="sd"&gt;            python fix_cloudfront.py avatars.wedoist.com&lt;/span&gt;

&lt;span class="sd"&gt;        Updates only one key::&lt;/span&gt;
&lt;span class="sd"&gt;            python fix_cloudfront.py avatars.w.com d39c2.gif&lt;/span&gt;

&lt;span class="sd"&gt;    Read more here::&lt;/span&gt;
&lt;span class="sd"&gt;        http://amix.dk/blog/post/19687&lt;/span&gt;

&lt;span class="sd"&gt;    :copyright: by Amir Salihefendic ( http://amix.dk/ )&lt;/span&gt;
&lt;span class="sd"&gt;    :license: MIT&lt;/span&gt;
&lt;span class="sd"&gt;&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;sys&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;mimetypes&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;email&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;time&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;types&lt;/span&gt;
&lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;datetime&lt;/span&gt; &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;timedelta&lt;/span&gt;

&lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;boto.s3.connection&lt;/span&gt; &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="n"&gt;S3Connection&lt;/span&gt;
&lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;boto.cloudfront&lt;/span&gt; &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="n"&gt;CloudFrontConnection&lt;/span&gt;


&lt;span class="c"&gt;#--- AWS credentials ----------------------------------------------&lt;/span&gt;
&lt;span class="n"&gt;AWS_KEY&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;...&amp;#39;&lt;/span&gt;
&lt;span class="n"&gt;AWS_SECRET&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;...&amp;#39;&lt;/span&gt;


&lt;span class="c"&gt;#--- Main function ----------------------------------------------&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s3_bucket_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;keys&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;s3_conn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;S3Connection&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;AWS_KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;AWS_SECRET&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;bucket&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;s3_conn&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_bucket&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s3_bucket_name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;keys&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;keys&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;bucket&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;list&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;key&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;keys&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;types&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;StringType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;key_name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;
            &lt;span class="n"&gt;key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;bucket&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_key&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;Key not found &lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;key_name&lt;/span&gt;
                &lt;span class="k"&gt;continue&lt;/span&gt;

        &lt;span class="c"&gt;# Force a fetch to get metadata&lt;/span&gt;
        &lt;span class="c"&gt;# see this why: http://goo.gl/nLWt9&lt;/span&gt;
        &lt;span class="n"&gt;key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;bucket&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_key&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="n"&gt;aggressive_headers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;_get_aggressive_cache_headers&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;copy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s3_bucket_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;metadata&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;aggressive_headers&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;preserve_acl&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;Updated headers for &lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;


&lt;span class="c"&gt;#--- Helpers ----------------------------------------------&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;_get_aggressive_cache_headers&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;metadata&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;metadata&lt;/span&gt;

    &lt;span class="n"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Content-Type&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content_type&lt;/span&gt;

    &lt;span class="c"&gt;# HTTP/1.0 (5 years)&lt;/span&gt;
    &lt;span class="n"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Expires&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;&lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s"&gt; GMT&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;\
        &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Utils&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;formatdate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mktime&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;
            &lt;span class="n"&gt;timedelta&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;days&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;365&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;timetuple&lt;/span&gt;&lt;span class="p"&gt;())))&lt;/span&gt;

    &lt;span class="c"&gt;# HTTP/1.1 (5 years)&lt;/span&gt;
    &lt;span class="n"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Cache-Control&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;max-age=&lt;/span&gt;&lt;span class="si"&gt;%d&lt;/span&gt;&lt;span class="s"&gt;, public&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3600&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;24&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;360&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;5&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;metadata&lt;/span&gt;


&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;__main__&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&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;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&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;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&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;img src="http://feeds.feedburner.com/~r/amixdk/~4/FuQBrXnc4y0" height="1" width="1"/&gt;</description><guid isPermaLink="false">http://amix.dk/blog/post/19687</guid><pubDate>Wed, 02 May 2012 17:20:29 GMT</pubDate><feedburner:origLink>http://amix.dk/blog/post/19687</feedburner:origLink></item><item><title>Product features vs. UI elements on the screen</title><link>http://feedproxy.google.com/~r/amixdk/~3/nYoeTx7kQKk/19686</link><description>&lt;p&gt;
Like noted in &lt;a href="http://amix.dk/blog/post/19555#The-essence-of-minimal-product-design"&gt;The essence of minimal product design&lt;/a&gt; successful products hide complexity from the users. &lt;a href="http://www.balsamiq.com/" target="_blank"&gt;Balsamiq&lt;/a&gt; has a great graph illustrating this as well.
&lt;/p&gt;

&lt;p&gt;
&lt;img src="http://amix.dk/uploads/featuresVsButtons.png" alt=" features vs. buttons" /&gt;
&lt;/p&gt;

&lt;p&gt;
from &lt;a href="http://www.balsamiq.com/products/mockups/manifesto" target="_blank"&gt;The Balsamiq Mockups Manifesto&lt;/a&gt;
&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/amixdk/~4/nYoeTx7kQKk" height="1" width="1"/&gt;</description><guid isPermaLink="false">http://amix.dk/blog/post/19686</guid><pubDate>Sat, 28 Apr 2012 20:17:53 GMT</pubDate><feedburner:origLink>http://amix.dk/blog/post/19686</feedburner:origLink></item><item><title>A man is a success</title><link>http://feedproxy.google.com/~r/amixdk/~3/wM5zo4FCmfQ/19685</link><description>&lt;p&gt;
&lt;img src="http://amix.dk/uploads/bob_dylan.jpg" alt="A man is a success if he gets up in the morning and goes to bed at night and in between does what he wants to do" /&gt;
&lt;/p&gt;

&lt;p&gt;
&lt;a href="http://zzeeee.deviantart.com/art/Bob-Dylan-142732764" target="_blank"&gt;Original image&lt;/a&gt;
&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/amixdk/~4/wM5zo4FCmfQ" height="1" width="1"/&gt;</description><guid isPermaLink="false">http://amix.dk/blog/post/19685</guid><pubDate>Mon, 23 Apr 2012 15:44:48 GMT</pubDate><feedburner:origLink>http://amix.dk/blog/post/19685</feedburner:origLink></item><item><title>Hiring talented iOS and Android developers</title><link>http://feedproxy.google.com/~r/amixdk/~3/FBSWh34gqTc/19684</link><description>&lt;p&gt;
We are expanding the team at &lt;a href="http://todoist.com/" target="_blank"&gt;Todoist&lt;/a&gt; and &lt;a href="https://wedoist.com/" target="_blank"&gt;Wedoist&lt;/a&gt; with iOS and Android programmers.
&lt;/p&gt;

&lt;p&gt;
Some of our stats:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
Over 300.000 users
&lt;/li&gt;
&lt;li&gt;
Rapid growth
&lt;/li&gt;
&lt;li&gt;
Our business is profitable
&lt;/li&gt;
&lt;li&gt;
We started fulltime with the company just 8 months ago. Imagine the future :-)
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
Join us either freelance or full-time and work on something that makes the world more productive.
&lt;/p&gt;

&lt;p&gt;
Send your resume to &lt;a href="mailto: amix@amix.dk"&gt;amix@amix.dk&lt;/a&gt;, be sure to include some code you are proud of (or a link to your GitHub/BitBucket profile).
&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/amixdk/~4/FBSWh34gqTc" height="1" width="1"/&gt;</description><guid isPermaLink="false">http://amix.dk/blog/post/19684</guid><pubDate>Thu, 15 Mar 2012 12:20:52 GMT</pubDate><feedburner:origLink>http://amix.dk/blog/post/19684</feedburner:origLink></item><item><title>Open sourced coffee-watcher, less-watcher and watcher_lib</title><link>http://feedproxy.google.com/~r/amixdk/~3/Azr1b4ezYVk/19683</link><description>&lt;p&gt;
I have updated/published following libraries today: 
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/amix/coffee-watcher" target="_blank"&gt;coffee-watcher&lt;/a&gt;: a script that can watch a directory and recompile your .coffee scripts if they change
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/amix/less-watcher" target="_blank"&gt;less-watcher&lt;/a&gt;: a script that can watch a directory and recompile your .less scripts if they change
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/amix/watcher_lib" target="_blank"&gt;watcher_lib&lt;/a&gt;: A library that can watch a directory and recompile files if they change. Can be used to build watcher scripts
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
Basically these scripts are useful for development as you don't need to think about recompiling your files. You can also use watcher_lib to implement custom watchers.
&lt;/p&gt;
&lt;h3&gt;coffee-watcher&lt;/h3&gt;

&lt;p&gt;
&lt;a href="http://amix.github.com/coffee-watcher/" target="_blank"&gt;Documentation&lt;/a&gt;
&lt;/p&gt;

&lt;pre&gt;
sudo npm install coffee-watcher
&lt;/pre&gt;

&lt;pre&gt;
coffee-watcher -p [prefix] -d [directory]

Options:
  -d  Specify which directory to scan.
  -p  Which prefix should the compiled files have?
      Default is style.coffee will be compiled to .coffee.style.css
  -h  Prints help
&lt;/pre&gt;
&lt;h3&gt;less-watcher&lt;/h3&gt;

&lt;p&gt;
&lt;a href="http://amix.github.com/less-watcher/" target="_blank"&gt;Documentation&lt;/a&gt;
&lt;/p&gt;

&lt;pre&gt;
sudo npm install less-watcher
&lt;/pre&gt;

&lt;pre&gt;
less-watcher -p [prefix] -d [directory]

Options:
  -d  Specify which directory to scan.
  -p  Which prefix should the compiled files have?
      Default is style.less will be compiled to .less.style.css
  -h  Prints help
&lt;/pre&gt;
&lt;h3&gt;watcher_lib&lt;/h3&gt;

&lt;p&gt;
&lt;a href="http://amix.github.com/watcher_lib/" target="_blank"&gt;Documentation&lt;/a&gt;
&lt;/p&gt;

&lt;pre&gt;
sudo npm install watcher_lib
&lt;/pre&gt;

&lt;p&gt;
How to build a generic watcher (here is less-watcher's implementation):
&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="c"&gt;# Use `watcher-lib`, a library that abstracts away most of the implementation details.&lt;/span&gt;
&lt;span class="n"&gt;watcher_lib&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;require&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;watcher_lib&amp;#39;&lt;/span&gt;

&lt;span class="c"&gt;# Searches through a directory structure for *.less files using `find`.&lt;/span&gt;
&lt;span class="c"&gt;# For each .less file it runs `compileIfNeeded` to compile the file if it&amp;#39;s modified.&lt;/span&gt;
&lt;span class="n"&gt;findLessFiles&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;dir&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
    &lt;span class="n"&gt;watcher_lib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;findFiles&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;*.less&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;dir&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;compileIfNeeded&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c"&gt;# Keeps a track of modified times for .less files in a in-memory object,&lt;/span&gt;
&lt;span class="c"&gt;# if a .less file is modified it recompiles it using compileLessScript.&lt;/span&gt;
&lt;span class="c"&gt;#&lt;/span&gt;
&lt;span class="c"&gt;# When starting the script all files will be recompiled.&lt;/span&gt;
&lt;span class="n"&gt;WATCHED_FILES&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
&lt;span class="n"&gt;compileIfNeeded&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;file&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
    &lt;span class="n"&gt;watcher_lib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;compileIfNeeded&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;WATCHED_FILES&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;file&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;compileLessScript&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c"&gt;# Compiles a file using `lessc`. Compilation errors are printed out to stdout.&lt;/span&gt;
&lt;span class="n"&gt;compileLessScript&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;file&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
    &lt;span class="n"&gt;fnGetOutputFile&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;file&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;file&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="o"&gt;^&lt;/span&gt;\&lt;span class="o"&gt;/&lt;/span&gt;\\&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;\&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;less&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;#{argv.p}$1.css&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;watcher_lib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;compileFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;lessc #{ file }&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;file&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fnGetOutputFile&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c"&gt;# Starts a poller that polls each second in a directory that&amp;#39;s&lt;/span&gt;
&lt;span class="c"&gt;# either by default the current working directory &lt;/span&gt;
&lt;span class="c"&gt;# or a directory that&amp;#39;s passed through process arguments.&lt;/span&gt;
&lt;span class="n"&gt;watcher_lib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;startDirectoryPoll&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;findLessFiles&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/amixdk/~4/Azr1b4ezYVk" height="1" width="1"/&gt;</description><guid isPermaLink="false">http://amix.dk/blog/post/19683</guid><pubDate>Wed, 22 Feb 2012 15:25:19 GMT</pubDate><feedburner:origLink>http://amix.dk/blog/post/19683</feedburner:origLink></item><item><title>css_image_concat: Improve performance by concating your images</title><link>http://feedproxy.google.com/~r/amixdk/~3/0Z_6n0tEvJQ/19682</link><description>&lt;p&gt;
I have updated my &lt;a href="http://amix.dk/blog/post/19170"&gt;CSS image contact script&lt;/a&gt; from 2007. This script can concat images into one image and create a CSS file with classes.  This is a super useful optimization when you want decrease issuing a lot of HTTP requests due to a lot of small images (like icons).
&lt;/p&gt;
&lt;h3&gt;What is the idea behind this?&lt;/h3&gt;

&lt;p&gt;
The idea is to take all separated images and concat them to one image file:
&lt;/p&gt;

&lt;p&gt;
&lt;img src="http://amix.dk/uploads/image_concat.png" alt="Concat images" /&gt;
&lt;/p&gt;

&lt;p&gt;
This means that only one HTTP request is made to fetch all the images.
&lt;/p&gt;

&lt;p&gt;
CSS is then used to display an image (by using background offsets):
&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="nc"&gt;.cmp_email_icon&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;background&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;transparent&lt;/span&gt; &lt;span class="sx"&gt;url(all_images.gif)&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;-48px&lt;/span&gt; &lt;span class="k"&gt;no-repeat&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;width&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="m"&gt;21px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;height&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="m"&gt;16px&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;h3&gt;Installing it&lt;/h3&gt;

&lt;pre&gt;
sudo pip install css_image_concat
&lt;/pre&gt;

&lt;p&gt;
This script also requires &lt;a href="http://www.imagemagick.org/script/index.php" target="_blank"&gt;ImageMagick&lt;/a&gt;.
&lt;/p&gt;
&lt;h3&gt;Using it&lt;/h3&gt;

&lt;pre&gt;
$ css_image_concat static/icons static/all_icons.png static/all_icons.css
Parsed 18 in static/icons
Written CSS file: static/all_icons.css
Written image file: static/all_icons.png
----
&lt;/pre&gt;
&lt;h3&gt;GitHub and PyPi&lt;/h3&gt;

&lt;p&gt;
You can checkout the code from here:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/amix/css_image_concat" target="_blank"&gt;https://github.com/amix/css_image_concat&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://pypi.python.org/pypi/css_image_concat" target="_blank"&gt;http://pypi.python.org/pypi/css_image_concat&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;img src="http://feeds.feedburner.com/~r/amixdk/~4/0Z_6n0tEvJQ" height="1" width="1"/&gt;</description><guid isPermaLink="false">http://amix.dk/blog/post/19682</guid><pubDate>Mon, 20 Feb 2012 15:58:32 GMT</pubDate><feedburner:origLink>http://amix.dk/blog/post/19682</feedburner:origLink></item><item><title>Focusing is about saying no - Steve Jobs (WWDC'97)</title><link>http://feedproxy.google.com/~r/amixdk/~3/TsfyNgrJm7g/19681</link><description>&lt;p&gt;
When Steve Jobs returned back to Apple in 1997 he fired thousands of people and discontinued lots of projects. In WWDC'97 he explained why:
&lt;/p&gt;

&lt;p&gt;
&lt;blockquote&gt;

&lt;p&gt;
Apple suffered for several years from lousy engineering management. There were people that were going off in 18 different directions... What happened was that you looked at the farm that's been created with all these different animals going in all different directions, and it doesn't add up - the total is less than the sum of the parts. We had to decide: What are the fundamental directions we are going in? What makes sense and what doesn't? And there were a bunch of things that didn't.
&lt;/p&gt;

&lt;/blockquote&gt;
&lt;/p&gt;

&lt;p&gt;
&lt;blockquote&gt;

&lt;p&gt;
Focusing is saying yes, right? No. Focusing is about saying no. You've got to say, no, no, no. The result of that focus is going to be some really great products where the total is much greater than the sum of the parts.
&lt;/p&gt;

&lt;/blockquote&gt;
&lt;/p&gt;

&lt;p&gt;
&lt;iframe width="640" height="480" src="http://www.youtube.com/embed/H8eP99neOVs" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;
&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/amixdk/~4/TsfyNgrJm7g" height="1" width="1"/&gt;</description><guid isPermaLink="false">http://amix.dk/blog/post/19681</guid><pubDate>Mon, 20 Feb 2012 14:02:23 GMT</pubDate><feedburner:origLink>http://amix.dk/blog/post/19681</feedburner:origLink></item><item><title>Niall Ferguson: The 6 killer apps of prosperity</title><link>http://feedproxy.google.com/~r/amixdk/~3/beUW46FMBTw/19680</link><description>&lt;p&gt;
I would recommend watching this TED talk: &lt;a href="http://www.ted.com/talks/niall_ferguson_the_6_killer_apps_of_prosperity.html" target="_blank"&gt;Niall Ferguson: The 6 killer apps of prosperity&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
&lt;blockquote&gt;

&lt;p&gt;
Over the past few centuries, Western cultures have been very good at creating general prosperity for themselves. Historian Niall Ferguson asks: Why the West, and less so the rest? He suggests half a dozen big ideas from Western culture -- call them the 6 killer apps -- that promote wealth, stability and innovation. And in this new century, he says, these apps are all shareable.
&lt;/p&gt;

&lt;/blockquote&gt;
&lt;/p&gt;

&lt;p&gt;
&lt;img src="http://amix.dk/uploads/the_course_of_empire1.jpg" alt="The Course of the Empire 1" /&gt;
&lt;/p&gt;

&lt;p&gt;
&lt;img src="http://amix.dk/uploads/the_course_of_empire2.jpg" alt="The Course of the Empire 2" /&gt;
&lt;/p&gt;

&lt;p&gt;
&lt;img src="http://amix.dk/uploads/the_course_of_empire3.jpg" alt="The Course of the Empire 3" /&gt;
&lt;/p&gt;

&lt;p&gt;
&lt;img src="http://amix.dk/uploads/the_course_of_empire4.jpg" alt="The Course of the Empire 4" /&gt;
&lt;/p&gt;

&lt;p&gt;
&lt;img src="http://amix.dk/uploads/the_course_of_empire5.jpg" alt="The Course of the Empire 5" /&gt;
&lt;/p&gt;

&lt;p&gt;
&lt;a href="http://en.wikipedia.org/wiki/The_Course_of_Empire" target="_blank"&gt;The course of the Empire&lt;/a&gt;
&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/amixdk/~4/beUW46FMBTw" height="1" width="1"/&gt;</description><guid isPermaLink="false">http://amix.dk/blog/post/19680</guid><pubDate>Tue, 14 Feb 2012 08:47:10 GMT</pubDate><feedburner:origLink>http://amix.dk/blog/post/19680</feedburner:origLink></item><item><title>Interview with DoesWhat.com</title><link>http://feedproxy.google.com/~r/amixdk/~3/816RBZ6B6qg/19679</link><description>&lt;p&gt;
I gave a short interview to &lt;a href="http://DoesWhat.com/" target="_blank"&gt;DoesWhat.com&lt;/a&gt;. You can read it here:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;a href="http://doeswhat.com/2012/02/08/interview-with-amir-salihefendic-todoist/" target="_blank"&gt;Interview with Amir Salihefendic&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
&lt;blockquote&gt;

&lt;p&gt;
What are you most excited about at the moment?&lt;br /&gt;
I want to make the world more productive. I wake up each morning and I am excited to work towards this goal.
&lt;/p&gt;

&lt;/blockquote&gt;
&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/amixdk/~4/816RBZ6B6qg" height="1" width="1"/&gt;</description><guid isPermaLink="false">http://amix.dk/blog/post/19679</guid><pubDate>Fri, 10 Feb 2012 08:42:50 GMT</pubDate><feedburner:origLink>http://amix.dk/blog/post/19679</feedburner:origLink></item></channel></rss>

