<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:gb="http://gitblog.se/ns/atom/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" xml:lang="en" xml:base="http://blog.hunch.se/">
	<id>http://blog.hunch.se/feed</id>
	<title>Hunch</title>
	<link rel="alternate" type="text/html" href="http://blog.hunch.se/" />
	<updated>2010-02-03T23:54:52+01:00</updated>
	<generator uri="http://gitblog.se/" version="0.1.6">Gitblog</generator>
	<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/hunch" /><feedburner:info uri="hunch" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry>
		<title type="html">Beautiful packaging from ChocoLate Orgániko</title>
		<author>
			<name>Rasmus Andersson</name>
			<uri>http://blog.hunch.se/</uri>
		</author>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/hunch/~3/KebFovlgdp4/beautiful-packaging-from-chocolate-organiko" />
		<id>http://blog.hunch.se/2010/02/beautiful-packaging-from-chocolate-organiko</id>
		<published>2010-02-03T15:01:21+01:00</published>
		<updated>2010-02-03T23:54:52+01:00</updated>
		<category scheme="http://blog.hunch.se/tags/" term="packaging" />
		<category scheme="http://blog.hunch.se/tags/" term="design" />
		<category scheme="http://blog.hunch.se/tags/" term="food" />
				<comments>0</comments>
		<gb:version>31cad32040dae66afdcc7116339f0929f657ea4b</gb:version>
				<content type="html" xml:base="http://blog.hunch.se/2010/02/beautiful-packaging-from-chocolate-organiko"><![CDATA[
<p>Came by a set of beautifully designed chocolate bars today at <a href="http://www.betsychoklad.se/">Betsy Sandberg</a> while strolling through 
Östermalmshallen in Stockholm. These delicious creations are made by 
<a href="http://www.chocolateorganiko.es/">ChocoLate Orgániko</a> in Madrid, Spain.</p>

<p><a href="http://www.chocolateorganiko.es/"><img src="http://farm3.static.flickr.com/2779/4327987302_49d09cf315_o.jpg" width="600" height="399" alt="choco-late-600" /></a></p>]]></content>
		<link rel="replies" type="text/html" href="http://blog.hunch.se/2010/02/beautiful-packaging-from-chocolate-organiko#comments" thr:count="0" />
		<thr:total>0</thr:total>
	<feedburner:origLink>http://blog.hunch.se/2010/02/beautiful-packaging-from-chocolate-organiko</feedburner:origLink></entry>
	<entry>
		<title type="html">Large-scale distributed processing on the web</title>
		<author>
			<name>Rasmus Andersson</name>
			<uri>http://blog.hunch.se/</uri>
		</author>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/hunch/~3/D5NUWtTICKY/large-scale-distributed-processing-using-javascript" />
		<id>http://blog.hunch.se/2009/12/large-scale-distributed-processing-using-javascript</id>
		<published>2009-12-16T23:02:14+01:00</published>
		<updated>2009-12-17T02:37:59+01:00</updated>
		<category scheme="http://blog.hunch.se/tags/" term="javascript" />
		<category scheme="http://blog.hunch.se/tags/" term="html5" />
		<category scheme="http://blog.hunch.se/tags/" term="web" />
		<category scheme="http://blog.hunch.se/tags/" term="dropular" />
		<category scheme="http://blog.hunch.se/tags/" term="essay" />
		<category scheme="http://blog.hunch.se/category/" term="software" />
		<comments>7</comments>
		<gb:version>6649a2df55a442d1e8c4965c36b57295d3583ce2</gb:version>
				<content type="html" xml:base="http://blog.hunch.se/2009/12/large-scale-distributed-processing-using-javascript"><![CDATA[
<p><img src="http://farm3.static.flickr.com/2539/4190869543_28ea74d5bd_m.jpg" width="233" height="240" alt="Silly drawing illustrating the awesomeness of people and the internets" align="right" /> The title probably gives you goose bumps. No? It doesn’t? Maybe it should.</p>

<p>Imagine you have a lot of work to do, a lot of image processing work, like rescaling and cropping large amounts of pictures. Now think about the web as we know it, with web sites where people hang around for a few seconds now and then. Imagine each visitor would be given a task to complete while reading your web site. Like for instance download, rescale and crop a picture from somewhere on the web. It’s possible my friend.</p>

<h2 id="applied"><a href="#applied">Applied</a></h2>

<p>For the upcoming new version of <a href="http://dropular.net/">Dropular</a> we are going to make good use of this technology.</p>

<p>The basic concept of Dropular can be explained with this use-case:</p>

<ol>

<li>
<p>A user called <code>kate</code> <em>drops</em> a picture she just found somewhere on the web (sending its URL to the Dropular service).</p>

</li>

<li>
<p><code>kate</code>s <em>dropped</em> image appears on the Dropular front page, or in the <em>global stream</em> of pictures as well as appears in other places throughout dropular.net.</p>

</li>

<li>
<p>Another user — let’s call him <code>john</code> — visits Dropular and sees the picture dropped by <code>kate</code>.</p>

</li>

</ol>

<p>At <em>step 3</em> we display a smaller version of the original image along with some metadata like a title, link to the original source, and so on. The smaller version of the image will be created by our imaginary user <code>john</code>s web browser. It only takes a split second and <code>john</code> will probably not notice anything.</p>

<h2 id="methods-of-processing"><a href="#methods-of-processing">Methods of processing</a></h2>

<p>When it comes to image processing on the web at large, there are basically two (or three) types of methods one can employ:</p>

<ul>

<li>Host-based processing</li>

<li>Client-based processing</li>

<li>A combination of A and B</li>

</ul>

<p>The <strong>host-based processing</strong> method has the upside of being performed in a controlled environment, thus we can assure a certain level of quality and there are few — if any — trust issues. On the other hand, processing imagery can be a very resource-intensive task requiring loads of hardware and/or time + in most cases bandwidth (sending and receiving the source and output images).</p>

<p><strong>Client-based processing</strong> methods are employed by most desktop applications, but until today no web applications, basically because the technology is not yet mature enough or even available.</p>

<p>Moreover desktop applications in general does only perform processing on trusted data, data available in your local computer, and only uses the output of the processing itself. My Photoshop program does not email you my cropped version of <code>crazy-cat.png</code> — if you want to crop that picture you do it yourself.</p>

<p>What we are trying to do is to <strong>marry the two methods</strong>, effectively performing processing only when needed and sharing the results among visitors.</p>

<p><a href="http://hunch.se/stuff/distributed-image-processing-web.pdf"><img src="http://farm3.static.flickr.com/2672/4190761739_a481949c00_o.png" width="600" height="593" alt="Flow diagram" /></a></p>

<h2 id="trust"><a href="#trust">The problem with trust</a></h2>

<p>So you’ve figured: the real problem with this shared distributed method is trust. What happens if a rogue user submits a <a href="http://images.google.com/images?q=nasty">bad picture</a>? How can we trust the submitted outcome?</p>

<p>Ways to “work around” the trust problem:</p>

<ol>

<li>Only logged in users can submit.</li>

<li>Race for Nth submission.</li>

<li>Compare many with similarity threshold.</li>

</ol>

<h3 id="trust-1"><a href="#trust-1">Method 1</a></h3>

<p>Method 1 requires the submitting client to be verified (e.g. by means of username and password). The downside being a less powerful “grid” of clients performing passive processing.</p>

<p>A product with the majority of users being logged in, or where the logged in users are probable to activate task requests of most images, would probably benefit most from this solution.</p>

<p><em>Method 1 is probably the solution we will employ for Dropular.</em></p>

<h3 id="trust-2"><a href="#trust-2">Method 2</a></h3>

<p>Many clients are given the same task and the Nth submission is picked. “Nth” might refer to a fixed, pre-defined number like “first response received” or “4th response received”, or it might be a random arbitrary number which changes between task contexts.</p>

<p>Using this method it would require a great effort from a rogue users perspective, drastically lowering the probability of success (of messing up things). However, it comes with the cost of increased latency (N number of submissions must be sent in before we can start utilising the results, i.e. a pre-processed image). It also requires more complex and foremost <em>stateful</em> backend (host) software.</p>

<h3 id="trust-3"><a href="#trust-3">Method 3</a></h3>

<p>This method works similar to <em>Method 2</em> in that we need to keep some kind of state in the host software. We request multiple submissions and compare the “outcomes” using some sort of similarity algorithm<sup id="fnref:1"><a href="#fn:1" rel="footnote">1</a></sup> and identify the biggest cluster of commonality, pick one of the “outcomes” in that cluster and forget all other “outcomes”.</p>

<p>Here, we require a even more complex software running at the host. The upside being that rogue submissions will have a hard time making it (assuming only one submission per internet origin is allowed to participate in each session, and that the comparison algorithm is sufficient).</p>

<h2 id="in-practice"><a href="#in-practice">In practice</a></h2>

<p>As of last week, my <a href="http://hunch.se/stuff/">Hunch stuff</a> — aka “box of interesting stuff” — uses this technique of distributed image processing. It currently works by using a <a href="http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html">canvas</a> element to perform the actual processing with, then sending the resulting image data using a temporary hidden <code>form</code>. This currently works in Safari, Chrome and Firefox (possibly also Opera, but untested) — for sad people with Internet Explorer (or other browsers), no processing or submission will be attempted.</p>

<h2 id="future"><a href="#future">In the future</a></h2>

<p>What more than image processing will we be able to distribute in the future? Already today we could hand out simple number-crunching tasks to clients in the same way, but what’s more alluring is the potential of distributing otherwise very expensive — or sometimes impossible — working sets. Data mining vast quantities of resources on the internet, anyone?</p>

<div class="footnotes">

<hr />

<ol>

<li id="fn:1">

<p>In the case of image processing, each outcome might have totally different data (bits) since most image compression algorithms (e.g. JPEG and PNG) introduce some level of randomness, thus we can not use basic data comparison like checksums. <a href="#fnref:1" rev="footnote">↩</a></p>

</li>

</ol>

</div>]]></content>
		<link rel="replies" type="text/html" href="http://blog.hunch.se/2009/12/large-scale-distributed-processing-using-javascript#comments" thr:count="7" />
		<thr:total>7</thr:total>
	<feedburner:origLink>http://blog.hunch.se/2009/12/large-scale-distributed-processing-using-javascript</feedburner:origLink></entry>
	<entry>
		<title type="html">Easy data visualization with WebKit</title>
		<author>
			<name>Rasmus Andersson</name>
			<uri>http://blog.hunch.se/</uri>
		</author>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/hunch/~3/jlKWBobwShQ/easy-data-visualization-with-webkit" />
		<id>http://blog.hunch.se/2009/11/easy-data-visualization-with-webkit</id>
		<published>2009-11-26T00:21:39+01:00</published>
		<updated>2009-11-27T02:29:17+01:00</updated>
		<category scheme="http://blog.hunch.se/tags/" term="cocui" />
		<category scheme="http://blog.hunch.se/tags/" term="spotify" />
		<category scheme="http://blog.hunch.se/tags/" term="visualization" />
		<category scheme="http://blog.hunch.se/tags/" term="real-time" />
		<category scheme="http://blog.hunch.se/category/" term="software" />
		<comments>22</comments>
		<gb:version>158fd0177e0b75a0a07287847620c93cf6b71a38</gb:version>
				<content type="html" xml:base="http://blog.hunch.se/2009/11/easy-data-visualization-with-webkit"><![CDATA[
<p>At Spotify, we recently put up two large TV screens on the walls of our Stockholm office (most R&#38;D is done there). The idea is to visualize &#38; communicate that <em>“stuff is happening”</em> without actually revealing any critical data (since a lot of external people are visiting the office).</p>

<p>Today me, <a href="http://www.lonelycoder.com/">Andreas Öman</a> and <a href="http://hesslow.se/">Emil Hesslow</a> — fellow Spotifiers — kicked off a cozy little Hack Night at the office, trying to create something simple yet impressive to have running on one of the TV screens.</p>

<p>We ended up writing a real-time search query visualization in just about a few hours. It looks like this and is smoothly animated:</p>

<p><a href="http://hunch.se/tmp/091126-sptv1demo/"><img src="http://farm3.static.flickr.com/2683/4134842328_5f28afb5c9_b.jpg" width="600" alt="Screen shot" /></a></p>

<p><em><a href="http://hunch.se/tmp/091126-sptv1demo/">Try a demo version here…</a></em> (Tested in Safari, iPhone, Firefox and Chrome).</p>

<p>How did we manage to build a real-time scalable system and high-performance viz in such an awfully short time?!</p>

<p><img src="http://farm3.static.flickr.com/2509/4134104571_69eda37643_m.jpg" width="240" height="180" alt="Hack night" align="right" title="Hacking in style with lit candles and beer" />Well, for starters we used WebKit through <a href="http://blog.hunch.se/2009/09/introduction-to-cocui">Cocui</a> which instantly gave us full screen high-performance hardware-accelerated drawing (yes, it’s a long sentence with cool words but those things shouldn’t be taken for granted).</p>

<p><em>But… where does the data come from? From the internets?</em> — Not really, but it sure travels in internets-style. We use a <a href="http://blog.hunch.se/2009/10/comethttp-push-with-nginx">dumb pub/sub message queue</a>. In one end a client (the WebKit/<a href="http://blog.hunch.se/2009/09/introduction-to-cocui">Cocui</a> app in HTML/JavaScript) is listening (subscribing). In the other end one of our search servers are pushing messages into the queue in batches.</p>

<div class="codeblock">
<pre>[batch of search queries during last minute]
                   ||
                   ||
                   \/
             [message queue]
              ||        ||
              ||        ||
              \/        \/
           [client]  [client]</pre>

</div>

<p>The client simply enqueues these search queries when they are delivered while at the same time dequeueing search queries. We do it this way (batches and a queue) because we simply have too high rate of searches. It would be almost impossible to read anything if we actually sent every single message. To give the feeling of real time we use a random delay when dequeueing queries.</p>

<p>When a query is dequeued it’s formatted into a chunk of HTML (a <code>div</code> and an <code>a</code> tag) and then prepended to the body using <a href="http://jquery.com/">jQuery</a> with animated effects.</p>

<p>Don’t forget to <a href="http://hunch.se/tmp/091126-sptv1demo/">try the demo version</a> (Does not work in Internet Explorer) which is simply the client without any real-time data. <small>Note that this demo uses <em>static data</em> for demonstration purposes, not an actual real-time stream. The real-time data stream is only available within our office and thus not available for public use.</small></p>

<p><em>Update:</em> Successfully tested with iPhone, Firefox and Chrome — thank you readers!</p>

<p>Here’s the full <a href="http://blog.hunch.se/2009/09/introduction-to-cocui">Cocui</a> demo application: <a href="http://hunch.se/tmp/091126-sptv1demo/sptv1-demo-cocui-app.zip">sptv1-demo-cocui-app.zip</a> (for Mac OS X 10.5 and newer).</p>]]></content>
		<link rel="replies" type="text/html" href="http://blog.hunch.se/2009/11/easy-data-visualization-with-webkit#comments" thr:count="22" />
		<thr:total>22</thr:total>
	<feedburner:origLink>http://blog.hunch.se/2009/11/easy-data-visualization-with-webkit</feedburner:origLink></entry>
	<entry>
		<title type="html">Comic Sans</title>
		<author>
			<name>Rasmus Andersson</name>
			<uri>http://blog.hunch.se/</uri>
		</author>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/hunch/~3/hHn0yIu7KlU/comic-sans" />
		<id>http://blog.hunch.se/2009/11/comic-sans</id>
		<published>2009-11-22T03:13:20+01:00</published>
		<updated>2009-11-22T03:27:08+01:00</updated>
		<category scheme="http://blog.hunch.se/tags/" term="typography" />
		<category scheme="http://blog.hunch.se/tags/" term="comic sans" />
		<category scheme="http://blog.hunch.se/tags/" term="pop" />
				<comments>0</comments>
		<gb:version>206324e224cbf63f2b81c44ace420aa969e262bb</gb:version>
				<content type="html" xml:base="http://blog.hunch.se/2009/11/comic-sans"><![CDATA[
<p><img src="http://farm3.static.flickr.com/2540/4123730882_8eb3caeb35_o.png" width="600" height="600" alt="Comic Sans" /></p>

<p><a href="http://en.wikipedia.org/wiki/Comic_Sans">Comic Sans</a> is becoming popular &#38; hip.</p>]]></content>
		<link rel="replies" type="text/html" href="http://blog.hunch.se/2009/11/comic-sans#comments" thr:count="0" />
		<thr:total>0</thr:total>
	<feedburner:origLink>http://blog.hunch.se/2009/11/comic-sans</feedburner:origLink></entry>
	<entry>
		<title type="html">Take a screenshot, paste the URL</title>
		<author>
			<name>Rasmus Andersson</name>
			<uri>http://blog.hunch.se/</uri>
		</author>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/hunch/~3/wknmHFuQa0I/take-a-screenshot-paste-the-url" />
		<id>http://blog.hunch.se/2009/11/take-a-screenshot-paste-the-url</id>
		<published>2009-11-21T12:39:49+01:00</published>
		<updated>2010-03-05T10:27:37+01:00</updated>
		<category scheme="http://blog.hunch.se/tags/" term="scrup" />
		<category scheme="http://blog.hunch.se/tags/" term="osx" />
		<category scheme="http://blog.hunch.se/tags/" term="application" />
		<category scheme="http://blog.hunch.se/tags/" term="open source" />
		<category scheme="http://blog.hunch.se/category/" term="software" />
		<comments>26</comments>
		<gb:version>a3471757e97a05c0c6d21bf7b225fe7b9efb474d</gb:version>
				<summary type="html"><![CDATA[1]]></summary>
				<content type="html" xml:base="http://blog.hunch.se/2009/11/take-a-screenshot-paste-the-url"><![CDATA[
<p><a href="http://github.com/rsms/scrup"><img src="http://farm3.static.flickr.com/2567/4121191747_3002198bb5_o.png" width="251" height="192" alt="Scrup icon" align="right" /></a></p>

<p>I’m a big fan of integrated non-intrusive, productivity-enhanching applications. One category which is especially useful for me is the automatic publishing of screenshots, making conversations about looks and state so much easier.</p>

<blockquote>
  
<p><strong>Mr Bulgur:</strong> The label of the “More” button looks totally skewed.<br />
  <strong>Jean-Claude</strong> Which button?! You mean the home one? Looks good for me on Windows.<br />
  <strong>Mr Bulgur</strong> See, it looks like the v-centering algo is broken on OS X: <a href="http://hunch.se/s/8y/9sd0h2fcow8gs.png">http://hunch.se/s/8y/9sd0h2fcow8gs.png</a><br />
  <strong>Jean-Claude</strong> Ah! Yes, I’ll fix it in a blink of an eye.</p>

</blockquote>

<p>I once purchased a license for <a href="http://images.google.com/images?q=grabup">Grab Up</a> but the team bailed on us when the software broke. Moved on to <a href="http://tinygrab.com/">TinyGrab</a> but it’s too slow and often not working.</p>

<p>Since this functionality is rather trivial I looked around if someone had written an open source version, which I could simply adjust to my needs. None found. So I wrote one myself — <a href="http://github.com/rsms/scrup">Scrup</a>.</p>

<p><a href="http://github.com/rsms/scrup">Scrup</a> is a simple little OS X application, or system plug-in, which sits in your menu bar:</p>

<p><a href="http://farm3.static.flickr.com/2522/4122092624_b2a9450bfe_o.png"><img src="http://farm3.static.flickr.com/2522/4122092624_b2a9450bfe_o.png" width="220" alt="Scrup in the menu bar" align="right" /></a></p>

<p>When you take a screenshot, Scrup sends it to a web server of your choice. The web server then do something with the image (saves it, doh!) and returns a URL to the new image. That URL is then placed in your pasteboard, ready to be pasted somewhere. Scrup also keeps a list of the most recent scrups in it’s menu, for easy access at a later date.</p>			<p><a href="http://blog.hunch.se/2009/11/take-a-screenshot-paste-the-url#post-2009-11-21-take-a-screenshot-paste-the-url-more">Read more...</a></p>
		]]></content>
		<link rel="replies" type="text/html" href="http://blog.hunch.se/2009/11/take-a-screenshot-paste-the-url#comments" thr:count="26" />
		<thr:total>26</thr:total>
	<feedburner:origLink>http://blog.hunch.se/2009/11/take-a-screenshot-paste-the-url</feedburner:origLink></entry>
	<entry>
		<title type="html">Don't push the button</title>
		<author>
			<name>Rasmus Andersson</name>
			<uri>http://blog.hunch.se/</uri>
		</author>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/hunch/~3/79HBRNzNzEM/dont-push-the-button" />
		<id>http://blog.hunch.se/2009/10/dont-push-the-button</id>
		<published>2009-10-26T14:48:01+01:00</published>
		<updated>2009-10-28T20:08:40+01:00</updated>
		<category scheme="http://blog.hunch.se/tags/" term="advertising" />
		<category scheme="http://blog.hunch.se/tags/" term="project" />
		<category scheme="http://blog.hunch.se/tags/" term="commissioned" />
		<category scheme="http://blog.hunch.se/tags/" term="work" />
				<comments>3</comments>
		<gb:version>6b7d22e4da890658f087f8f9448393163fa107bb</gb:version>
				<summary type="html"><![CDATA[1]]></summary>
				<content type="html" xml:base="http://blog.hunch.se/2009/10/dont-push-the-button"><![CDATA[
<p>A fun and inspiring advertising/art project I’ve been involved in (wrote the server and client software) is currently running (Mon 26 – Tue 27, 2009) at Stockholm Central station.</p>

<p><a href="http://www.flickr.com/photos/rsms/4046717256/" title="Don't push the button by Rsms, on Flickr"><img src="http://farm3.static.flickr.com/2445/4046717256_09dc6405c9_b.jpg" width="600" alt="Don't push the button" /></a></p>

<p>You push a button, the huge Satio phone replica snaps a photo and publishes it instantly <a href="http://tre.se/templates/FullSizePage.aspx?id=39296">on the web</a>, also displaying it on a huge screen in the main hall.</p>

<p><a href="http://www.flickr.com/photos/rsms/4045973759/" title="Don't push the button by Rsms, on Flickr"><img src="http://farm4.static.flickr.com/3531/4045973759_e51a39114d_m.jpg" width="240" height="161" alt="Don't push the button" /></a> <a href="http://www.flickr.com/photos/rsms/4045973419/" title="Don't push the button by Rsms, on Flickr"><img src="http://farm3.static.flickr.com/2707/4045973419_997ac30942_m.jpg" width="240" height="161" alt="Don't push the button" /></a> <a href="http://www.flickr.com/photos/rsms/4046716908/" title="Don't push the button by Rsms, on Flickr"><img src="http://farm4.static.flickr.com/3480/4046716908_39b70f1a4b_t.jpg" width="100" height="67" alt="Don't push the button" /></a></p>

<p>The server is based on the <a href="http://blog.hunch.se/2009/10/comethttp-push-with-nginx">Nginx HTTP push module</a> and the client (the huge phone) is comprised of a Mac Mini, a standard USB camera, some wiring done by <a href="http://andreasfabbe.se/">my brother</a> and a simple Cocoa application I wrote which simply takes a photo from the camera, compresses it and publishes it to the server. <a href="http://loveniclas.com/">Niclas Bergström</a> wrote the front-end (HTML &#38; Javascript).</p>

<p>A <a href="http://theviralcompany.com/">The Viral Company</a> production.</p>			<p><a href="http://blog.hunch.se/2009/10/dont-push-the-button#post-2009-10-26-dont-push-the-button-more">Read more...</a></p>
		]]></content>
		<link rel="replies" type="text/html" href="http://blog.hunch.se/2009/10/dont-push-the-button#comments" thr:count="3" />
		<thr:total>3</thr:total>
	<feedburner:origLink>http://blog.hunch.se/2009/10/dont-push-the-button</feedburner:origLink></entry>
	<entry>
		<title type="html">First ever Spotify commercial TV ad</title>
		<author>
			<name>Rasmus Andersson</name>
			<uri>http://blog.hunch.se/</uri>
		</author>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/hunch/~3/0RNbwduYGfs/first-ever-spotify-commercial-tv-ad" />
		<id>http://blog.hunch.se/2009/10/first-ever-spotify-commercial-tv-ad</id>
		<published>2009-10-26T14:04:11+01:00</published>
		<updated>2009-10-26T14:13:59+01:00</updated>
		<category scheme="http://blog.hunch.se/tags/" term="spotify" />
		<category scheme="http://blog.hunch.se/tags/" term="advertising" />
		<category scheme="http://blog.hunch.se/tags/" term="video" />
		<category scheme="http://blog.hunch.se/tags/" term="tv" />
				<comments>3</comments>
		<gb:version>2249e3916a19635e39dab8a6dea80e56881461ff</gb:version>
				<content type="html" xml:base="http://blog.hunch.se/2009/10/first-ever-spotify-commercial-tv-ad"><![CDATA[
<p>Our/Spotify’s first ever commercial television advert premieres today on <a href="http://kanal5.se/">Kanal 5</a> in Sweden.</p>

<p><object width="600" height="365"><param name="movie" value="http://www.youtube.com/v/-H33tFGP0iA&#038;hl=en&#038;fs=1&#038;rel=0"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/-H33tFGP0iA&#038;hl=en&#038;fs=1&#038;rel=0" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="600" height="365"></embed></object></p>

<p>Production by the amazing guys at <a href="http://www.identityworks.se/">Identity Works</a> (including Carl &#38; Kaj formerly known as <a href="http://superstrikers.se/">Superstrikers</a>).</p>

<p>Here you also get a sneak peek of our upcoming new typeface <em>Spotify Akkurat</em> ;)</p>]]></content>
		<link rel="replies" type="text/html" href="http://blog.hunch.se/2009/10/first-ever-spotify-commercial-tv-ad#comments" thr:count="3" />
		<thr:total>3</thr:total>
	<feedburner:origLink>http://blog.hunch.se/2009/10/first-ever-spotify-commercial-tv-ad</feedburner:origLink></entry>
	<entry>
		<title type="html">Improving the Spotify installation experience</title>
		<author>
			<name>Rasmus Andersson</name>
			<uri>http://blog.hunch.se/</uri>
		</author>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/hunch/~3/ZvLuawgDwXE/improving-spotify-installation-experience" />
		<id>http://blog.hunch.se/2009/10/improving-spotify-installation-experience</id>
		<published>2009-10-24T14:10:44+02:00</published>
		<updated>2009-10-24T19:33:27+01:00</updated>
		<category scheme="http://blog.hunch.se/tags/" term="spotify" />
		<category scheme="http://blog.hunch.se/tags/" term="mac" />
		<category scheme="http://blog.hunch.se/tags/" term="ux" />
		<category scheme="http://blog.hunch.se/category/" term="software" />
		<comments>4</comments>
		<gb:version>98340116cc931b2c56172699c310bfbb2dc7700a</gb:version>
				<summary type="html"><![CDATA[1]]></summary>
				<content type="html" xml:base="http://blog.hunch.se/2009/10/improving-spotify-installation-experience"><![CDATA[
<p>At the time of writing this, we distribute <a href="http://www.spotify.com/download/mac/">Spotify for Mac OS X</a> as a regular DMG (disk image). The user experience is not really what I would call smooth:</p>

<ul>

<li>Download the DMG file.</li>

<li>Open the DMG (implicitly mounting the disk image. Safari does this for you, BTW).</li>

<li>Move Spotify to the Applications folder.</li>

</ul>

<p>Now, for a unexperienced user double clicking the app icon inside the DMG feels like a natural action. It’s there, I’ll just open it then. Later, she restarts her computer, the DMG gets unmounted and <em>“Hey, where’s Spotify?”</em>.</p>

<p>Our solution is to use an <em><a href="http://developer.apple.com/mac/library/documentation/DeveloperTools/Conceptual/SoftwareDistribution/Containers/Containers.html#//apple_ref/doc/uid/10000145i-CH4-SW4">internet-enabled</a> disk image</em> which automatically unpacks Spotify upon download. We then <a href="http://github.com/rsms/lets-move-cocoa">use some magic</a> in the app to check if it was launched from another place than the Applications folder.</p>			<p><a href="http://blog.hunch.se/2009/10/improving-spotify-installation-experience#post-2009-10-24-improving-spotify-installation-experience-more">Read more...</a></p>
		]]></content>
		<link rel="replies" type="text/html" href="http://blog.hunch.se/2009/10/improving-spotify-installation-experience#comments" thr:count="4" />
		<thr:total>4</thr:total>
	<feedburner:origLink>http://blog.hunch.se/2009/10/improving-spotify-installation-experience</feedburner:origLink></entry>
	<entry>
		<title type="html">Manage posts in Gitblog web admin UI</title>
		<author>
			<name>Rasmus Andersson</name>
			<uri>http://blog.hunch.se/</uri>
		</author>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/hunch/~3/bfA3e1XgxRo/post-manager-in-gitblog" />
		<id>http://blog.hunch.se/2009/10/post-manager-in-gitblog</id>
		<published>2009-10-12T02:11:46+02:00</published>
		<updated>2009-10-12T02:28:04+02:00</updated>
		<category scheme="http://blog.hunch.se/tags/" term="gitblog" />
		<category scheme="http://blog.hunch.se/tags/" term="ui" />
		<category scheme="http://blog.hunch.se/tags/" term="ux" />
		<category scheme="http://blog.hunch.se/category/" term="software" />
		<comments>0</comments>
		<gb:version>52dd6ce7d0628f84b335a8e6951c41df51c158ca</gb:version>
				<content type="html" xml:base="http://blog.hunch.se/2009/10/post-manager-in-gitblog"><![CDATA[<p>The latest version of Gitblog got a new posts manager, which has been inspired by the inbox of Google Mail.</p>
<p><a href="http://farm3.static.flickr.com/2445/4002358763_550724f3de_o.png"><img src="http://farm3.static.flickr.com/2657/4002358777_4e642cfce1_o_d.png" width="600" /></a></p>
<p>As a post can be in several states (and versions) at the same time, I had to use multiple dimensions of visual cues — row colors, labels (”Draft”, the “scheduled” clock) and hierarchical rows in the case when there is a work version alongside a cached version.</p>
<ul>
<li><span style="background-color:#fffb91">Yellow</span> marks a modified, uncommitted (but tracked) working copy with an older cached version live.</li>
<li><span style="background-color:#cfd">Green</span> marks a scheduled, tracked post (which will appear live once it’s future publish date is reached).</li>
<li><span style="background-color:#fcc">Red</span> marks a post which has been removed in the working stage, but is still tracked (previous version is still live).</li>
<li><span style="background-color:#ddd">Grey</span> marks a uncommitted (untracked) post, a post which does not have a record in the repository.</li>
</ul>
<p>To get this feature, simply perform a git pull in your gitblog directory:</p>
<div class="codeblock">
<pre>cd path/to/my/blog/gitblog
git pull</pre>
</div>]]></content>
		<link rel="replies" type="text/html" href="http://blog.hunch.se/2009/10/post-manager-in-gitblog#comments" thr:count="0" />
		<thr:total>0</thr:total>
	<feedburner:origLink>http://blog.hunch.se/2009/10/post-manager-in-gitblog</feedburner:origLink></entry>
	<entry>
		<title type="html">Happy birthday, Spotify.app!</title>
		<author>
			<name>Rasmus Andersson</name>
			<uri>http://blog.hunch.se/</uri>
		</author>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/hunch/~3/ZqVuUDDrriw/happy-birthday-spotify-app" />
		<id>http://blog.hunch.se/2009/10/happy-birthday-spotify-app</id>
		<published>2009-10-07T23:59:00+02:00</published>
		<updated>2009-10-07T23:23:02+01:00</updated>
		<category scheme="http://blog.hunch.se/tags/" term="spotify" />
		<category scheme="http://blog.hunch.se/tags/" term="anniversary" />
				<comments>2</comments>
		<gb:version>521fad0e9f950d0ae064063d903e63ffd1fb7c2b</gb:version>
				<content type="html" xml:base="http://blog.hunch.se/2009/10/happy-birthday-spotify-app"><![CDATA[
<p>Today (Oct 7th, 2009) was the 1 year anniversary of the <a href="http://www.spotify.com/">Spotify</a> desktop client. We celebrated with cake, of course.</p>

<p><img src="http://farm4.static.flickr.com/3522/3990674101_f402eecfd5_o.jpg" width="600" alt="Spotify birthday cake" /></p>

<p><a href="http://blog.hunch.se/2008/10/07-spotify-official-release">One year ago we pushed the button</a>, releasing <a href="http://www.spotify.com/">www.spotify.com</a> and the first public, official desktop client application.</p>

<p><a href="http://www.flickr.com/photos/rsms/sets/72157607825941639/" title="Pushing the button"><img src="http://farm4.static.flickr.com/3109/2921943136_ee275f44fd_b.jpg" width="600" alt="Pushing The Button" /></a></p>

<p>It was a big day for all of us at Spotify — after two years of hard work and a lot of coffee we could finally offer our creation to the world.</p>

<p>This is what the first version looked like:</p>

<p><img src="http://farm3.static.flickr.com/2521/3991445028_fb36417c55_o.png" width="600" alt="spotify-desktop-client-oct-2008" /></p>]]></content>
		<link rel="replies" type="text/html" href="http://blog.hunch.se/2009/10/happy-birthday-spotify-app#comments" thr:count="2" />
		<thr:total>2</thr:total>
	<feedburner:origLink>http://blog.hunch.se/2009/10/happy-birthday-spotify-app</feedburner:origLink></entry>
</feed>
