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

  <title><![CDATA[Boy van Amstel]]></title>
  <link href="http://blog.boyvanamstel.nl/atom.xml" rel="self"/>
  <link href="http://blog.boyvanamstel.nl/"/>
  <updated>2011-12-30T11:17:01+01:00</updated>
  <id>http://blog.boyvanamstel.nl/</id>
  <author>
    <name><![CDATA[Boy van Amstel]]></name>
    
  </author>
  <generator uri="http://octopress.org/">Octopress</generator>

  
  <entry>
    <title type="html"><![CDATA[Fiddling with NeXTSTEP]]></title>
    <link href="http://blog.boyvanamstel.nl/2011/12/fiddling-with-nextstep/"/>
    <updated>2011-12-29T22:36:00+01:00</updated>
    <id>http://blog.boyvanamstel.nl/2011/12/fiddling-with-nextstep</id>
    <content type="html"><![CDATA[<p>I bought my first Mac just 3 or 4 years ago. Before that I used to alternate between Windows and Linux, mostly sticking to Linux. The flexibility and complexity was something I liked most about Linux. Compiling a new kernel each time I inserted a new piece of hardware into my computer and fixing errors until a game or application would compile and install successfully used to keep me entertained for days and nights on end. The absence of these exact things is what made me buy an Apple later; it just works.</p>

<p>This week I realised that while I&#8217;m quite familiar with the history of DOS, Windows, Linux, Amiga, C64, BeOS and so on, Mac OSX&#8217;s predecessors are a mystery to me. A few brief experiences with NeXT workstations and iMacs in public places aside, I&#8217;ve never used the system before OSX. Obviously exploring this makes for a perfect spare time project. I managed to install <a href="http://en.wikipedia.org/wiki/NeXTSTEP">NeXTSTEP</a> in <a href="http://en.wikipedia.org/wiki/Parallels,_Inc.">Parallels</a> and tried to get past greyscale graphics, which proved to be difficult. After reading some experiences by others I swithed to <a href="https://www.virtualbox.org/">VirtualBox</a>, which allows you to customize hardware properties, like ethernet cards and sound devices. VirtualBox with <a href="http://en.wikipedia.org/wiki/Openstep">OPENSTEP</a> (NeXTSTEP with OpenStep) and the latest update almost provides a plug and play experience due to much improved driver support. I took some screenshots running OPENSTEP 4.2 at 1024x768 pixels with 32bit colors (a setup that cost about $ 15,000 when it was released).</p>

<p><img src="http://blog.boyvanamstel.nl/images/media/nextstep/openstep-dangercove.png">
A screenshot of <a href="http://dangercove.com">DangerCove.com</a>. <a href="http://www.omnigroup.com/products/omniweb/">OmniWeb</a> (like all browsers at the time) lacked support for stylesheets, or almost any of the features we&#8217;re used to today. Enabling javascript caused every site I tried to crash.</p>

<p><img src="http://blog.boyvanamstel.nl/images/media/nextstep/openstep-facebook-doom.png">
This screenshot shows Facebook, looking rather broken, and DOOM in the front. id Software used NeXT systems to create the famous first person shooter. Relying on the Objective-C based development environment to create most of the tools, like the level editor. Speaking of which..</p>

<p><img src="http://blog.boyvanamstel.nl/images/media/nextstep/openstep-xcode-interfacebuilder.png">
While Xcode 4.2 and InterfaceBuilder 4.2 were released almost two decades apart, they feel strikingly similar; dragging and dropping components and attaching their outlets to &#8216;First Responders&#8217;, it&#8217;s all there.</p>

<p>EDIT: Over at <a href="http://news.ycombinator.com/item?id=3405927">Hacker News</a>, <a href="http://news.ycombinator.com/user?id=Zev">Zev</a> provided <a href="http://cdn.secondconf.com/2010/videos/SecondConf-GeneBacklin-17425.mp4">a link to a video</a> of Gene Backlin giving a talk at <a href="http://www.secondconf.com/videos/">SecondConf</a> last year, titled &#8216;NeXT to X&#8217;. About 21 minutes into the video Gene walks through a screenshot supported comparison of creating the exact same app using development environments that were created 20 years apart.</p>

<p>YouTube has some pretty cool videos that show Steve Jobs demoing NeXTSTEP. Like this one, where Steve talks about what he calls &#8216;interpersonal computing&#8217;:</p>

<iframe width="420" height="315" src="http://www.youtube.com/embed/-1wYy5qvA24" frameborder="0" allowfullscreen></iframe>


<p>Or this &#8216;secret&#8217; video, supposedly only for the eyes of fresh NeXT employees:</p>

<iframe width="420" height="315" src="http://www.youtube.com/embed/p9dmcRbuTMY" frameborder="0" allowfullscreen></iframe>


<p>Fiddling around with NeXTSTEP has been fun. It reminded me that I tried, but never really liked, the Linux window manager called <a href="http://en.wikipedia.org/wiki/Window_Maker">WindowMaker</a>, which I did knew was based on NeXTSTEP. WindowMaker to me felt out of place on Linux and inferior to Gnome, KDE, Enlightenment and other window mangers at the time. Like OSX today, the NeXTSTEP interface feels a lot more comfortable on the system that it&#8217;s been designed for.</p>

<p>Some sites to help install OPENSTEP yourself:</p>

<ul>
<li><a href="http://www.nextcomputers.org/forums/viewtopic.php?t=1663">Screenshot-supported walkthough on nextcomputer.org&#8217;s forums</a></li>
<li><a href="http://www.moldus.org/~laurent/GNUstep/OS42_Install.html">Guide for VMWare and VirtualBox by Laurent Julliard</a></li>
<li><a href="http://www.nextcomputers.org/NeXTfiles/Software/NEXTSTEP/Apps/Games/">Massive list of downloadable NeXTSTEP games and demos at nextcomputer.org</a></li>
</ul>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Apps for the Planet talk]]></title>
    <link href="http://blog.boyvanamstel.nl/2011/08/apps-for-the-planet-talk/"/>
    <updated>2011-08-18T23:47:00+02:00</updated>
    <id>http://blog.boyvanamstel.nl/2011/08/apps-for-the-planet-talk</id>
    <content type="html"><![CDATA[<iframe src="https://docs.google.com/present/embed?id=df9pnzn6_1cptjtchq" frameborder="0" width="410" height="342"></iframe>


<p>I gave a talk a the <a href="http://appsfortheplanet.org/">Apps for the Planet</a> event. It’s about doing rapid creative projects and contains a couple of examples of projects I did, a more extensive walkthrough of a particular project and a rundown of tools and principles I like to use.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Html5-boilerplate gem and no more posting/deleting etc.]]></title>
    <link href="http://blog.boyvanamstel.nl/2011/07/html5-boilerplate-gem-and-no-more-posting-deleting-etc/"/>
    <updated>2011-07-19T23:46:00+02:00</updated>
    <id>http://blog.boyvanamstel.nl/2011/07/html5-boilerplate-gem-and-no-more-posting-deleting-etc</id>
    <content type="html"><![CDATA[<p>For no apparent reason all the post/delete/put requests I was doing in my brand new Rails project where failing… Forms would not create anything. The problem only appeared occurred on my live server running Phussion Passenger. No issues on WEBrick.</p>

<p>After a little searching I found the issue in the .htaccess files. Created by the html5-boilerplate gem in /public/.htaccess.</p>

<p>Comment the following lines on line 348 and the problem goes away:</p>

<pre><code>&lt;IfModule mod_rewrite.c&gt;
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_URI} !(\.[a-zA-Z0-9]{1,5}|/|#(.*))$
  RewriteRule ^(.*)$ /$1/ [R=301,L]
&lt;/IfModule&gt;
</code></pre>

<p>I’m guessing the other rewrite rules are problematic as well. A better fix would be to only rewrite when using GET.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[TTResponds update]]></title>
    <link href="http://blog.boyvanamstel.nl/2011/07/ttresponds-update/"/>
    <updated>2011-07-14T23:44:00+02:00</updated>
    <id>http://blog.boyvanamstel.nl/2011/07/ttresponds-update</id>
    <content type="html"><![CDATA[<p>I’ve updated <a href="http://blog.boyvanamstel.nl/2011/05/google-apps-script-ttresponds/">TTResponds</a> to include some requests people have made.</p>

<ul>
<li>You can now specify if you want to send HTML emails.</li>
<li>You can set the sheet being used for the form (defaults to the first one).</li>
<li>You can limit the amount of emails being sent. Just the first 10 entries for example (-1 is unlimited).</li>
</ul>


<p>The script has been submitted to the Apps Script Gallery, but may take a while to appear. You can grab it right now from <a href="https://github.com/boyvanamstel/TTResponds">Github</a>.</p>

<p>Notice: if you’re already using a previous version of the script. Remove the config sheet. Open the scripts editor, copy-paste the new script over the old one. Run the createMenu method. And then select Create config from the TTResponds menu item. This will make sure the new configuration options appear on your configuration screen.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Omniauth strategy for Google OpenID+OAuth Hybrid Protocol login]]></title>
    <link href="http://blog.boyvanamstel.nl/2011/07/omniauth-strategy-for-google-openidoauth-hybrid-protocol-login/"/>
    <updated>2011-07-12T23:40:00+02:00</updated>
    <id>http://blog.boyvanamstel.nl/2011/07/omniauth-strategy-for-google-openidoauth-hybrid-protocol-login</id>
    <content type="html"><![CDATA[<p>Quite the title and quite cool to use. The Hybrid Protocol combines OpenID and OAuth in such a way that with one flow you can ask for authentication (and get someones account information, like name and email) and authorization (a token) for a set of services specified in a scope</p>

<p>Apart from providing a much cleaner user experience, it’ll save you a bunch of code. Especially via Omniauth.</p>

<p>I’ve created <a href="https://github.com/boyvanamstel/omniauth/tree/google-hybrid"><del>a fork</del></a> (read update) that contains <a href="https://github.com/boyvanamstel/omniauth/blob/google-hybrid/oa-openid/lib/omniauth/strategies/google_hybrid.rb">the google_hybrid strategy</a> and <a href="https://github.com/boyvanamstel/Google-Hybrid-Omniauth-implementation">an example project</a> that implements it.</p>

<p>UPDATE: My strategy just got merged into Omniauth’s master branch. So just use <a href="https://github.com/intridea/omniauth">Omniauth</a> instead of my fork.</p>

<p>To see how it works, <a href="http://googlehybrid.boyvanamstel.nl/auth/google_hybrid">try this demo</a>.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Dropbox Chat]]></title>
    <link href="http://blog.boyvanamstel.nl/2011/06/dropbox-chat/"/>
    <updated>2011-06-23T23:37:00+02:00</updated>
    <id>http://blog.boyvanamstel.nl/2011/06/dropbox-chat</id>
    <content type="html"><![CDATA[<p>Have you ever wondered how well Dropbox would work as a chat application? I did and I finally created a client for it. The concept of having Dropbox handle all the complicated server side stuff is very appealing and actually works quite wel.</p>

<p>The use case I can imagine happening is that you want to share and store quick conversations you have with co-workers/friends while working on a project. Instead of navigating to Basecamp, emailing (which is less direct) or copy-pasting chat logs, you can just open the Dropbox chat client and have a short conversation. The chat log is right there in the same folder and the only thing you have to do to get it to work, is drop the application in the Dropbox project folder you’re working on.</p>

<p>The experiment is really easy to setup. Just clone/download <a href="https://github.com/boyvanamstel/Dropbox-Chat">the repository on GitHub</a>. Put the folder in your Dropbox folder and share the folder with your friends.</p>

<p>To run the application open a terminal window and navigate to the folder you just shared. Like this for instance (don’t type the $ sign):</p>

<pre><code>$ cd ~/Dropbox/Projects/DropboxChat
</code></pre>

<p>Now run the application.</p>

<pre><code>$ ruby chat.rb
</code></pre>

<p>If it throws an error, this means it might need to install some additional libraries called gems.</p>

<pre><code>$ gem install [gem name]
</code></pre>

<p>After it starts it’ll prompt you for a nickname, pick something original and that’s it. Just start typing  .</p>

<p><img src="http://blog.boyvanamstel.nl/images/media/dropboxchat/dropboxchat1.png"></p>

<p><img src="http://blog.boyvanamstel.nl/images/media/dropboxchat/dropboxchat2.png"></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Maintenance page while deploying with Capistrano]]></title>
    <link href="http://blog.boyvanamstel.nl/2011/06/maintenance-page-while-deploying-with-capistrano/"/>
    <updated>2011-06-18T23:35:00+02:00</updated>
    <id>http://blog.boyvanamstel.nl/2011/06/maintenance-page-while-deploying-with-capistrano</id>
    <content type="html"><![CDATA[<p>I got tired pretty fast of staring at Passenger’s 500 errors while Capistrano and Rails are busy setting up a new release of a project.</p>

<p>Of course other people got tired as well and came up with numerous fixes. The one I like best is where you first put up a maintenance page, deploy and after all went well, remove the maintenance page. Kind of like how Apple disables the store when they’re adding new stuff, but less flashy I suppose..</p>

<p>It’s pretty easy to do this and I’m just going to provide two links that explain it very well. One for <a href="http://stackoverflow.com/questions/2244263/capistrano-to-deploy-rails-application-how-to-handle-long-migrations">Apache</a> and one for <a href="https://boxpanel.bluebox.net/public/the_vault/index.php/Custom_Rails_Maintenance_Pages_With_Capistrano">Nginx</a>. They’re both very similar and you can easily pick either of the deploy.rb parts.</p>

<p>That’s about it. It’s very easy to do and probably something a lot of people know already, but definitely something that’ll make you feel more comfortable while deploying.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Instalike]]></title>
    <link href="http://blog.boyvanamstel.nl/2011/05/instalike/"/>
    <updated>2011-05-22T23:32:00+02:00</updated>
    <id>http://blog.boyvanamstel.nl/2011/05/instalike</id>
    <content type="html"><![CDATA[<p>We had a Saturday Night of Awesome this weekend and came up with the idea to create an iPhone and <a href="https://market.android.com/details?id=nl.wednesdaysofawesome.android.instalike">Android app</a> that allows you to share images to Facebook very quickly. A few hours later both apps were done and the Android app is already live.</p>

<p>The iPhone App will be released as soon as Apple approves it.</p>

<p><img src="http://blog.boyvanamstel.nl/images/media/instalike/store.png"></p>

<p>Description:</p>

<p>With InstaLike you can ‘like’ everything you see, instantly!</p>

<p>Just start the app, point your camera and shoot. The image will be uploaded to Facebook directly, for all your friends to see  .</p>

<p>InstaLike allows you to share your pictures as fast and easy as possible.</p>

<p><a href="https://market.android.com/details?id=nl.wednesdaysofawesome.android.instalike&amp;feature=search_result">Download it</a> and let me know what you think!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Google Apps Script: TTResponds]]></title>
    <link href="http://blog.boyvanamstel.nl/2011/05/google-apps-script-ttresponds/"/>
    <updated>2011-05-13T23:25:00+02:00</updated>
    <id>http://blog.boyvanamstel.nl/2011/05/google-apps-script-ttresponds</id>
    <content type="html"><![CDATA[<h2>Introduction</h2>

<p>TTResponds is a Google Apps Script that allows you to automatically send a confirmation to people who’ve filled out a Google Form.</p>

<p>It’s been available for a while in the Script Gallery, but I haven’t gotten around to write about it. The reason I’m doing so right now, is because I’ve received a couple of returning questions that I can probably better answer right here.</p>

<h2>Installing</h2>

<p>First login to your Google Docs environment, <a href="http://docs.google.com">docs.google.com</a> and Google Apps both work fine. After that, choose to create a new Form.</p>

<p><img src="http://blog.boyvanamstel.nl/images/media/ttresponds/newform.png"></p>

<p>This will present you with a pop-up that allows you to customize the fields. For basis functionality it should at least contain a name field first and an email address second. After that you can add anything you want.</p>

<p><img src="http://blog.boyvanamstel.nl/images/media/ttresponds/setupform.png"></p>

<p>Clicking save will send you to the Spreadsheet, setup to receive form submissions. The next step is to add TTResponds. You can do so by clicking ‘Tools’ and then ‘Script gallery…’.</p>

<p><img src="http://blog.boyvanamstel.nl/images/media/ttresponds/scriptgallery.png"></p>

<p>Search for ‘TTResponds’ and click install.</p>

<p><img src="http://blog.boyvanamstel.nl/images/media/ttresponds/findttresponds.png"></p>

<p>Authorize the script to read your Spreadsheet and send out emails.</p>

<p><img src="http://blog.boyvanamstel.nl/images/media/ttresponds/accept.png"></p>

<p>A new menu item called ‘TTResponds’ just appeared. Click it and select ‘Create config’. This should add an extra sheet called ‘TTRespondsConfig’, you can change the properties to provide a more relevant response. After you’re done, make sure all ‘Triggers’ are setup correctly by clicking ‘Tools’ and after that ‘Script editor…’.</p>

<p><img src="http://blog.boyvanamstel.nl/images/media/ttresponds/scripteditor.png"></p>

<p>In the pop-up select ‘Triggers’ and then ‘All your triggers…’.</p>

<p><img src="http://blog.boyvanamstel.nl/images/media/ttresponds/triggers.png"></p>

<p>Make sure your setup looks like the image above. If it doesn’t, click ‘Add a new trigger’ and set it to ‘onFormSubmit’, ‘From spreadsheet’ and ‘On form submit’. That’s it! Fill out your own form and you’ll receive a confirmation automatically!</p>

<h2>HTML Email</h2>

<p>Per default the script sends text-only emails. You can change this to HTML email pretty easily (I’ll probably add it as an option in an update). First open the script editor again and navigate to line 119.</p>

<p><img src="http://blog.boyvanamstel.nl/images/media/ttresponds/htmlemail.png"></p>

<p>You’ll see that is says:</p>

<pre><code>{ name: _config.from }
</code></pre>

<p>Change it to this:</p>

<pre><code>{ name: _config.from, htmlBody: _config.body }
</code></pre>

<p>The script will now send the confirmation as HTML, allowing you to send a fancier response  .</p>

<h2>Collaborating</h2>

<p>I’ve created <a href="https://github.com/boyvanamstel/TTResponds">a GitHub repo for TTResponds</a>. If you’re adding features, or fixing bugs, please fork the project and send me a pull request.</p>

<h2>Let me know</h2>

<p>It would be awesome if you let me know if you use and/or like the script through the comments, thanks!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Omniauth + Facebook = OpenSSL::SSL::SSLError]]></title>
    <link href="http://blog.boyvanamstel.nl/2011/05/omniauth-facebook-opensslsslsslerror/"/>
    <updated>2011-05-05T23:19:00+02:00</updated>
    <id>http://blog.boyvanamstel.nl/2011/05/omniauth-facebook-opensslsslsslerror</id>
    <content type="html"><![CDATA[<p><del>I’ve run into this issue twice and now I’m writing down the solution. When authenticating with Facebook via Omniauth, my server always fails with the following error:</del></p>

<pre><code>OpenSSL::SSL::SSLError (SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed):
</code></pre>

<p><del>This is easily fixed by adding the following to one of the initializers:</del></p>

<pre><code>OpenSSL::SSL::VERIFY_PEER = OpenSSL::SSL::VERIFY_NONE
</code></pre>

<p><del>It’s probably not the best solution, as this turns off SSL peer verification..</del></p>

<p>A better solution:</p>

<p><a href="http://stackoverflow.com/questions/5711190/how-to-get-rid-of-opensslsslsslerror">http://stackoverflow.com/questions/5711190/how-to-get-rid-of-opensslsslsslerror</a></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Hip Like Heroku]]></title>
    <link href="http://blog.boyvanamstel.nl/2011/04/hip-like-heroku/"/>
    <updated>2011-04-30T23:13:00+02:00</updated>
    <id>http://blog.boyvanamstel.nl/2011/04/hip-like-heroku</id>
    <content type="html"><![CDATA[<p>Usually I deploy projects on my physical server, located at the server park called “former bedroom at my parents’”. This allows me to see how a project develops and migrate to a better server (which costs more money) if it’s successful. This is also the case for <a href="http://hiplikejapie.nl/">hiplikejapie.nl</a>.</p>

<p>I’ve been deploying a couple of experiments to Heroku and the platform really appeals to me. Deploying itself is a breeze and the “add-ons” model is pretty cool. Also, it’s free if you can manage with a 5mb database, 1 dyno en 0 workers. Projects in a developing stage usually do. I’ve never launched a project from it though. Primarily because I don’t want the to run into insane hosting costs if something like <a href="http://pleaserobme.com/">Please Rob Me</a> happens. In any case the ability to scale a project and not worrying about server setup and stuff is awesome.</p>

<p>Hip Like Japie hasn’t really took off (yet?), but is doing mildly ok with a bunch of visitors every day. It being a finished product made it interesting for me to see how well it would deploy.</p>

<p>I’ve got Heroku’s command line tool installed, but if you haven’t install it like this:</p>

<pre><code>$ sudo gem install heroku
</code></pre>

<p>Next you need to setup a Git repository for your project if you haven’t already.</p>

<pre><code>$ git init
$ git add .
$ git commit -m 'initial import'
</code></pre>

<p>Let Heroku add it’s remote.</p>

<pre><code>$ heroku create
</code></pre>

<p>Login with your Heroku credentials and you’re done setting up!</p>

<p>This would usually be the point where you start developing your application, but Hip Like Japie being already done allows me to skip directly to deploying.</p>

<pre><code>$ git push heroku master
</code></pre>

<p>Did you see what they did there? They just added a new remote, super nice. Anyway, this should start deploying the app. After it’s done, migrate the database.</p>

<pre><code>$ heroku rake db:migrate
</code></pre>

<p>I thought about looking online for correct settings to Heroku’s database setup, but decided to just run rake and see what happens. Turns out that Heroku just made it work. My production setup was set to use Sqlite3, but Heroku automatically changed it to their PostgreSQL database.</p>

<p>Technically I was done, but opening the website would give me an error. Crap, something went wrong. You can check the server’s log by issuing the following command:</p>

<pre><code>$ heroku logs
</code></pre>

<p>This showed me that a database query failed, due to running on PostgreSQL instead of Sqlite3. I applied a dirty little patch.</p>

<pre><code>if ActiveRecord::Base.connection.instance_values["config"][:adapter] == 'postgresql'
  @comparisons = Comparison.find_by_sql(
      "SELECT * FROM (SELECT DISTINCT ON (username) * FROM comparisons ORDER BY username, id DESC) foo ORDER BY id DESC LIMIT 10"
      )
else
  @comparisons = Comparison.all(
      :order =&gt; "id DESC", :limit =&gt; 10, :group =&gt; 'username'
      )
end
</code></pre>

<p>After that the site worked fine: <a href="http://hiplikejapie.heroku.com">hiplikejapie.heroku.com</a>. There’s an add-on that allows you to hook up your custom domain name to the project. It’s conveniently called “Custom Domains” and can be used via the command line.</p>

<pre><code>$ heroku addons:add custom_domains
</code></pre>

<p>This may prompt you to verify your account, by entering your creditcard details (on Heroku’s website, not the command line). After that you’re ready to add your domain names.</p>

<pre><code>$ heroku domains:add www.hiplikejapie.nl
$ heroku domains:add hiplikejapie.nl
</code></pre>

<p>I added both the domain and the www. sub-domain. To activate this, you need to change your domain’s DNS settings. It comes down to adding three A records and a CNAME.</p>

<pre><code>@ A 75.101.163.44
@ A 75.101.145.87
@ A 174.129.212.2
www CNAME proxy.heroku.com.
</code></pre>

<p>That’s it, <a href="http://hiplikejapie.nl">hiplikejapie.nl</a> points directly to Heroku, awesome!</p>

<p>EDIT:</p>

<p>The website failed if the worker would spin down. The error logs showed that Compass couldn’t compile the Sass files. Which is obvious as Heroku is read-only. This line in config/environments/production.rb fixes it:</p>

<pre><code>Compass.configuration.sass_options={:never_update=&gt;true}
</code></pre>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Improve Javascript code quality with JSLint]]></title>
    <link href="http://blog.boyvanamstel.nl/2011/04/improve-javascript-code-quality-with-jslint/"/>
    <updated>2011-04-24T23:02:00+02:00</updated>
    <id>http://blog.boyvanamstel.nl/2011/04/improve-javascript-code-quality-with-jslint</id>
    <content type="html"><![CDATA[<p>Created <a href="https://github.com/boyvanamstel/JConsole">a tiny project on GitHub</a> with a simple piece of Javascript to see what <a href="http://jslint.com/">JSLint</a> does.</p>

<blockquote><p>“JSLint is a JavaScript program that looks for problems in JavaScript programs. It is a code quality tool.” – JSLint.com</p></blockquote>

<p>Pretty cool and something I’ll definitely incorporate in deploy scripts. Checkout the example website <a href="http://boyvanamstel.github.com/JConsole/">here</a> and the GitHub repo <a href="https://github.com/boyvanamstel/JConsole">here</a>.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[When POSTs suddenly turn into 301 redirects in Rails]]></title>
    <link href="http://blog.boyvanamstel.nl/2011/04/when-posts-suddenly-turn-into-301-redirects-in-rails/"/>
    <updated>2011-04-21T22:34:00+02:00</updated>
    <id>http://blog.boyvanamstel.nl/2011/04/when-posts-suddenly-turn-into-301-redirects-in-rails</id>
    <content type="html"><![CDATA[<p>Everything worked fine in my development environment, but when I ran the application from my server every POST would just show the page it was suppost to POST to via GET. Displaying a 301 redirect in Chrome’s developers tools.</p>

<p>After some fiddling around, I commented line 351 in the .htaccess file:</p>

<pre><code>&lt;IfModule mod_rewrite.c&gt;
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_URI} !(\.[a-zA-Z0-9]{1,5}|/|#(.*))$
  #RewriteRule ^(.*)$ /$1/ [R=301,L] # &lt;-- this one
&lt;/IfModule&gt;
</code></pre>

<p>After that everything worked as expected. Weird..</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Girrst displays your Gists as RSS]]></title>
    <link href="http://blog.boyvanamstel.nl/2011/03/girrst-displays-your-gists-as-rss/"/>
    <updated>2011-03-27T22:31:00+02:00</updated>
    <id>http://blog.boyvanamstel.nl/2011/03/girrst-displays-your-gists-as-rss</id>
    <content type="html"><![CDATA[<p>Do you use GitHub’s Gists? Then you might like this.</p>

<p>Sharing code among co-workers and friends is quite easy using various ‘code snippit’ sharing websites. I personally like GitHub’s Gists. To make sharing even easier and keep everybody up to date of what’s being shared, I wanted to create a feed out of my Gists. Of course I could just use GitHub’s own RSS feeds, but that would screw up my reason to do something with App Engine.</p>

<p><img src="http://blog.boyvanamstel.nl/images/media/girrst/appengine.png"></p>

<p>Using Python and App Engine I threw together a script that will take your GitHub username and turn all your Gists into a convenient RSS feed. You can then use the feed to include it anywhere, like your favorite RSS reader or your blog.</p>

<p>To make things even easier, use the <a href="https://github.com/drnic/github-tmbundle">GitHub bundle for TextMate</a> to be able to create Gists from your favorite editor. Don’t forget to <a href="http://help.github.com/git-email-settings/">setup your GitHub username and token</a>:</p>

<pre><code>$ git config --global github.user username
$ git config --global github.token 0123456789yourf0123456789token
</code></pre>

<p>Try it: <a href="http://girrst.appspot.com">girrst.appspot.com</a></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[The Delicious API access over Yahoo OAuth in Ruby on Rails adventure]]></title>
    <link href="http://blog.boyvanamstel.nl/2011/01/the-delicious-api-access-over-yahoo-oauth-in-ruby-on-rails-adventure/"/>
    <updated>2011-01-20T22:21:00+01:00</updated>
    <id>http://blog.boyvanamstel.nl/2011/01/the-delicious-api-access-over-yahoo-oauth-in-ruby-on-rails-adventure</id>
    <content type="html"><![CDATA[<p>I spent a little time today getting Yahoo’s OAuth implementation to work with <a href="https://github.com/intridea/omniauth">Omniauth</a>. This seems pretty straightforward, but it isn’t.</p>

<p>First, what I tried to accomplish:</p>

<ol>
<li>Have a user sign in with his/her Delicious account</li>
<li>Use the Delicious username to retrieve a bunch of feeds</li>
</ol>


<p>Step 1 might seem unnecessary as Delicious’ API only requires authentication to post/update stuff, but I want to store some user settings and stuff. OAuth allows me to use their existing data, instead of creating my own registration process.</p>

<p>I continued to setup a project in rails, init a Git repo and fill my Gemfile with the gems required for using omniauth plus some extra:</p>

<p><img src="http://blog.boyvanamstel.nl/images/media/yahoodelicious/gems.png"></p>

<p>Touch omniauth.rb in config/initializers and the basics for using the Yahoo OAuth provider. Yahoo isn’t supported by default, so we’ll be creating our own strategy later in lib/oauth-strategies/yahoo.rb.</p>

<pre><code>module OmniAuth
  module Strategies
    autoload :Yahoo, 'lib/oauth-strategies/yahoo'
  end
end

Rails.application.config.middleware.use OmniAuth::Builder do
  provider :yahoo, 'consumer key', 'consumer secret'
end
</code></pre>

<p>Visit <a href="http://developer.apps.yahoo.com/projects">Yahoo’s developer page</a> and create a new project. Choose standard and fill out the rest of the form to match your application. Pay extra attention to Application Domain, enter a url that’s accessible to the outside world. You’ll see why when you’ve completed the form. I’m building a Delicious app so I specified that I require extra user data and choose to have read/write access to Delicious.</p>

<p><img src="http://blog.boyvanamstel.nl/images/media/yahoodelicious/YahooProjects.png"></p>

<p>When you press the Get API Key button, you’re required to upload a file to your server, accessible via the url you’ve just entered under Application Domain. There are three buttons, one of which falsely suggests that you can skip this step. Pressing it will only tell you that you have to do it anyway.. nice. This still gave me the impression that this the whole Application Domain thing was optional, though. Mistake.. I’ll tell you why in a minute.</p>

<p>Alright, so we’ve completed the form and are presented with our consumer key and consumer secret. Add them to the omniauth.rb configuration.</p>

<p>Create the folder lib/oauth-strategies and touch yahoo.rb. I tried the default OAuth implementation, didn’t work. After some research on GitHub. I found that there was already a <a href="http://developer.apps.yahoo.com/projects">pull request</a> waiting with a Yahoo OAuth strategy, neato. Paste <a href="https://github.com/xxx/omniauth/raw/490fb8334c0f45310b669d791925bcd32edb175c/oa-oauth/lib/omniauth/strategies/yahoo.rb">the code</a> into your yahoo.rb strategy file. At this point I was pretty confident that this wouldn’t be a hassle after all. Run bundle install and start your server. Now visit the yahoo auth url at <a href="http://localhost:3000/auth/yahoo">http://localhost:3000/auth/yahoo</a>. The first thing you’ll run into happens when you’re an oldskool Delicious user. This means you’re account is not yet hooked up to your Yahoo account and you’ll get an error saying that you’re login is incorrect. After merging my Delicious and Yahoo accounts, I hoped I had fixed the issue and tried again. Aaaand BAM: “401 Forbidden”. Stumped me at first, but after checking the full response Yahoo told me this: “Custom port is not allowed or the host is not registered with this consumer key”. So I thought I was clever and started the WEBRick server on port 80. No effect, same error.</p>

<p><img src="http://blog.boyvanamstel.nl/images/media/yahoodelicious/Forbidden.png"></p>

<p>This is when I remembered the Application Domain field.. Yahoo apparently does not like you developing on your localhost, while every other OAuth provider works fine, fuck. So, I setup the whole thing on my server and ran the thing again. Success! It redirects to Yahoo and asks for permission. The callback doesn’t go too well, though. Use this guide to add the route to a custom callback, even though it’s not working yet.</p>

<p>I started debugging by overriding the callback_phase method and checking out where things started failing. The standard callback_phase method uses name.to_sym to get the name of the provider (yahoo in this case). This didn’t work, so I hardcoded it. Calling super also caused trouble. Long story short, it needed a lot of tweaking.</p>

<p>Eventually I got it to work, but noticed that the nickname Yahoo OAuth returns is not the one from Delicious.. crap! Luckily Delicious adds the username to it’s authenticated post feeds. Allowing me to grab it and add it to the user profile. The full yahoo.rb now looks like this:</p>

<pre><code>module OmniAuth
  module Strategies
    class Yahoo &gt;; OmniAuth::Strategies::OAuth       
    unloadable       

    def initialize(app, consumer_key, consumer_secret)         
        super(app, :yahoo, consumer_key, consumer_secret,               
              :site               =&gt; "https://api.login.yahoo.com",
              :request_token_path =&gt; "/oauth/v2/get_request_token",
              :authorize_path     =&gt; "/oauth/v2/request_auth",
              :access_token_path  =&gt; "/oauth/v2/get_token"
        )
      end

      def callback_phase
        request_token = ::OAuth::RequestToken.new(consumer, session[:oauth][:yahoo].delete(:request_token), session[:oauth][:yahoo].delete(:request_secret))
        @access_token = request_token.get_access_token(:oauth_verifier =&gt; request.params['oauth_verifier'])

        @env['omniauth.auth'] = auth_hash
        call_app!

      rescue ::OAuth::Unauthorized =&gt; e
        fail!(:invalid_credentials, e)
      end

      def auth_hash
        OmniAuth::Utils.deep_merge(super, {
          'uid' =&gt; @access_token.params[:xoauth_yahoo_guid],
          'user_info' =&gt; user_info,
          'extra' =&gt; {'user_hash' =&gt; user_hash}
        })
      end

      def user_info
        user_hash
        profile = user_hash['profile'] || {}
        username = Nokogiri::XML::parse(@access_token.get("http://api.del.icio.us/v2/posts/recent?count=1").body).root['user']
        {
          'nickname'    =&gt; username,
          'name'        =&gt; "%s %s" % [profile['givenName'], profile['familyName']],
          'location'    =&gt; profile['location'],
          'image'       =&gt; (profile['image'] || {})['imageUrl'],
          'description' =&gt; nil,
          'urls'        =&gt; {'Profile' =&gt; profile['uri']}
        }
      end

      def user_hash
        @user_hash ||= MultiJson.decode(@access_token.get("http://social.yahooapis.com/v1/user/#{@access_token.params[:xoauth_yahoo_guid]}/profile?format=json").body)
      end

   end
  end
end
</code></pre>

<p>Alright, everything is setup to work marvelously with <a href="http://asciicasts.com/episodes/241-simple-omniauth">ASCIIcast’s guide</a>, which explains how to allow users to sign in with OAuth and remain logged in until they decide to sign out. Thanks to Yahoo for adding some pitfalls (some of which I probably forgot to describe) here and there to keep things interesting.</p>

<p>*note to self: install pretty code plugin for WordPress.. EDIT: Done!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[WordPress Project Creator]]></title>
    <link href="http://blog.boyvanamstel.nl/2011/01/wordpress-project-creator/"/>
    <updated>2011-01-13T22:15:00+01:00</updated>
    <id>http://blog.boyvanamstel.nl/2011/01/wordpress-project-creator</id>
    <content type="html"><![CDATA[<p>Working on WordPress projects can be a hassle. Especially if there’s more than one developer. There are a lot of files and chances are huge that you’ll be working on the same files quite often. This slows down development tremendously, not to mention the annoyance it causes.</p>

<p>You can fix the ‘working on the same file’ and ‘working on the live server’ issues quite adequately by using version control. I prefer Git, because of it’s distributed character. WordPress has another issue however, when trying to run the same site on different machines. Among the data it stores are urls, absolute urls.. This means that if you’d load a database dump from a live WordPress site into your local install, nothing will work correctly.</p>

<p><a href="https://github.com/boyvanamstel/Wordpress-Project-Creator">WordPress Project Creator</a> [github] is a tool I created to streamline working on WordPress projects with multiple people. It does a couple of things:</p>

<ul>
<li>Download WordPress</li>
<li>Create a new Git repo out of your wp-content folder
or clone an existing wp-content folder into the WordPress folder</li>
<li>Easily import database dumps by alterering absolute urls</li>
<li>Create wp-config.php file</li>
<li>Create .htaccess file</li>
</ul>


<p>Adding new developers to your project is as easy as allowing them access to the Git repo and running wpprojectcreator. If  you clone an existing project, the only things you’ll have to do is run the python script, import the dump using setup.php and you’re ready to work on the website as if it were live.</p>

<p><img src="http://blog.boyvanamstel.nl/images/media/wpprojectcreator/wpprojectcreator.png"></p>

<p>I released it on GitHub so everyone can give it a go. Or everyone.. at least everyone running OSX, Linux or 32bit Windows. Git on 64bit Windows can’t be installed in such a way that it’s accessible from the command line, which is required by wpprojectcreator. Be sure to read the README  .</p>

<p>Check out <a href="https://github.com/boyvanamstel/Wordpress-Project-Creator">WordPress Project Creator on GitHub</a>.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[New internet technology: use what’s already out there]]></title>
    <link href="http://blog.boyvanamstel.nl/2010/05/new-internet-technology-use-what-s-already-out-there/"/>
    <updated>2010-05-06T22:09:00+02:00</updated>
    <id>http://blog.boyvanamstel.nl/2010/05/new-internet-technology-use-what-s-already-out-there</id>
    <content type="html"><![CDATA[<p>I’ve had this article on my computer for three months now, but never got around to finishing it. Finally found some time to put it up.</p>

<p>It’s interesting to see that the standard process of thinking of something new, trying to figure out how to make money from it, creating it and then releasing it to the public seems to have changed. A business model does not necessarily come first anymore. A new process could be described similar to this: have an idea, create a very basic implementation and provide an extensive platform for people to use what you’ve created, hand it over to the community, now find a way to make money or hope for a takeover by some enterprise (Google). This makes new technology much more accessible than it’s ever been. A lot of effort is put into making it easy for other people to use and mashup what’s been created.</p>

<h2>Detect and use</h2>

<p>Needless to say a skill that’s becoming increasingly useful, is the ability to detect these services and find ways to implement them in your own concepts. YouTube, Twitter and Flickr have all been fully embraced by the community, which means the movies, images and messages they store show up on all kinds of applications. Some with a lot easier business model than the services they’ve incorporated. Twitter clients for instance, have a price tag or use adds to turn a profit, while Twitter is still struggling to find a way to make money.</p>

<h2>Reasons to use public API’s</h2>

<p>Does that mean Twitter is in trouble? Probably not, what they have is data and a lot of people who use that data. Apparently that’s worth <a href="http://mashable.com/2009/10/04/twitter-stats">multi million dollar investments</a>. Money they need to provide a reliable system and store data the client applications are generating. Which is awesome, because you don’t have to worry about that anymore. It means you could create fairly extensive applications with a minimal amount of effort, as the services provide you with a solid backend.</p>

<p>Maybe the biggest benefit is popularity and content. It’s easier to use an existing user base than to create your own. Let’s say you want to create a website about the <a href="http://www.olympisch.nl/">Olympic Games</a>. You want visitors to contribute text, photos and videos. This would require quite a lot of work to create from scratch. Incorporating Twitter, Flickr and YouTube would reduce that dramatically. More importantly however, it would generate a lot more content, as it allows your audience to use the tools they’re already accustomed to.</p>

<p>What you have to take in consideration though, is that you’re not in direct control of the content you’re provided with. This may seem daunting at first and it makes the use of services unsuitable for some applications. It takes a new way of moderating the content you’re provided with. Both YouTube and Flickr allow you to only search through video’s and images that are marked safe. Other than that, it’s always a good idea to think about how you can stay in control of your own application.</p>

<h2>Start your own projects</h2>

<p>The list of services that are available right now seems endless. Some are more successful than others, obviously. Like I said, popularity is a good measure to determine if a service is worth checking out. To get you started, <a href="http://www.programmableweb.com/">Programmable Web</a> keeps an incredible list of <a href="http://www.programmableweb.com/apis">public API’s</a>. I’ve been spending a lot of time with the Google Apps API’s lately, which are pretty awesome and really allow for some cool applications. Especially if you look further than mashing up some of the individual components. For instance, it’s very easy to use Google Spreadsheet as a cloud database. How neat is that :)? Anyway, have fun!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Location spam, annoying and.. risky?]]></title>
    <link href="http://blog.boyvanamstel.nl/2010/02/location-spam-annoying-and-risky/"/>
    <updated>2010-02-16T22:01:00+01:00</updated>
    <id>http://blog.boyvanamstel.nl/2010/02/location-spam-annoying-and-risky</id>
    <content type="html"><![CDATA[<p>Hey, do you have a Twitter account? Have you ever noticed those messages in which people tell you where they are? Pretty annoying, eh. Well, they’re actually also potentially pretty dangerous. I’m about to tell you why.</p>

<p>Don’t get me wrong, I love the whole location-aware thing. The information is very interesting and can be used to create some pretty awesome applications. However, the way in which people are stimulated to participate in sharing this information, is less awesome. Services like Foresquare allow you to fulfill some primeval urge to colonize the planet. A part of that is letting everyone know you own that specific spot. You get to tell where you are and if you’re there first, it’s yours. O, and of course there’s badges..</p>

<p><img src="http://blog.boyvanamstel.nl/images/media/pleaserobme/pleaserobme_foursquare.jpg">
Foursquare</p>

<p>The danger is publicly telling people where you are. This is because it leaves one place you’re definitely not… home. So here we are; on one end we’re leaving lights on when we’re going on a holiday, and on the other  we’re telling everybody on the internet we’re not home. It gets even worse if you have “friends” who want to colonize your house. That means they have to enter your address, to tell everyone where they are. Your address.. on the internet.. Now you know what to do when people reach for their phone as soon as they enter your home. That’s right, slap them across the face.</p>

<p>To raise some awareness on this issue and emphasize how easy it is to retrieve this information let me introduce: <a href="http://www.pleaserobme.com">pleaserobme.com</a>. Have fun and please don’t hook up Foursquare to your Twitter account, okay?</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[How we created a Twitter viral]]></title>
    <link href="http://blog.boyvanamstel.nl/2009/03/how-we-created-a-twitter-viral/"/>
    <updated>2009-03-24T17:11:00+01:00</updated>
    <id>http://blog.boyvanamstel.nl/2009/03/how-we-created-a-twitter-viral</id>
    <content type="html"><![CDATA[<p>A few weeks ago Barry Borsboom and I had funny idea for a twitter mash-up. We would basically measure your Twitter popularity in the form of a giant penis. Better know as the e-Penis. In order to see if we really created something to talk about, Seth Godin would call this the sneeze-factor, we registered an url: <a href="http://www.epenis.nl">www.epenis.nl</a> and we uploaded our e-Penis app with a few &#8216;share-this&#8217; buttons. The first button to post it on Twitter, and the second one to Digg it. Would people share this site with their friends? How fast would it spread? All question a marketer would like to know when creating a viral marketing campaign right?</p>

<p><img src="http://blog.boyvanamstel.nl/images/media/epenis/epenis1.png"></p>

<p>In our first day we managed to reach about 100 of our own friends on Twitter. But to really call it successful, we needed to reach some people on Twitter with a huge amount of followers. We used our own &#8216;Post on Twitter&#8217; button a number of times on all sorts of people. And after a few tries <a href="http://twitter.com/michielveenstra">@michielveenstra</a> (2500 followers), picked up on our message and reposted our website on his own twitter stream on a friday. Overnight we reached 1500 hits. But as it turned out our biggest traffic came from a porn-blog! Apperently a webmaster from this well know porn-blog picked up our site after seeing it at @michealveenstra. In the weekend we managed to get around 8,000 hits, but on monday morning it really took off. Hordes of time wasting desk workers measured their body part. From that point on it really became a trend on Twitter. Our &#8216;Post on Twitter&#8217; button was used a few times every few minutes now. Because people often measured the popularity off some well known people, they eventually couldn&#8217;t help but brag about (cough <a href="http://twitter.com/stephenfry">@stephenfry</a>, 336.599 followers) ;). This caused Great Great Brittian to swarm our website and spread it even more. At this point North and South-America just woke up.</p>

<p>By the way, we were still hosting the website on my server, at my parents&#8217; home. Utilizing almost all of the &#8220;massive&#8221; 1Mbit bandwith. Thank god my little brother didn&#8217;t complain. The reason this was even possible is that epenis.nl has no server-side scripts. It&#8217;s all jQuery, HTML, CSS and (small) images. We actually reduced the size of the website by half, by grabbing jquery.js from google.com.</p>

<p>At monday around 4 pm, CET, we finally managed to get the word Penis into the Twitter trending topics. A huge success, because now people twittered about why the word penis was in this list. Generating even more traffic to our site when they found out we were causing it.</p>

<p><img src="http://blog.boyvanamstel.nl/images/media/epenis/twitter_search1.png"></p>

<p>Some people saw a connection between Spring Break, which probaly helped accepting the fact the word penis was a part of the list. Twitter however didn&#8217;t agree with that. After a few hours we saw some messages from people who were complaining about their twits disappearing, not much later penis wasn&#8217;t trending anymore. Did Twitter screw with us here? We can&#8217;t be sure. But the damage had already been done, we had spread to the American continent. A couple of big American Twitter users like <a href="http://twitter.com/mrskutcher">@MrsKutcher</a>, that&#8217;s Demi Moore (257,150 followers) posted about later in the evening, that really generated lots of traffic and added a large amount of females to our users, who seemed to have smaller e-peni. Which actually contributed to the credibility of the website.</p>

<p>The length of the penis most people we&#8217;re getting seemed to match what they expected.  Which is funny, because we didn&#8217;t use a really complicated algorithm. Average people would get averige sizes (between 10 - 20 cm). While very popular twitterers, like celebrities, are showing extremely large numbers.</p>

<p>The next morning we had almost 40k in hits. We called our viral a success, we expected it to die out rather soon. But we were wrong! To our suprise it kept on going. Around 14:00 there was a huge spike in our traffic. As it appeared, <a href="http://twitter.com/guykawasaki">@Guykawaski</a> (92,399 followers) was giving a keynote during <a href="http://sesconference.com/newyork/">SES New York</a> about &#8216;Twitter As A Tool For Social Media&#8217;. Lots of people posted live messages during his talk&#8230;</p>

<p>&#8216;<a href="http://twitter.com/Searchcowboys/status/1381739278">@Searchcowboys</a>: Guykawasaki shows epenis.nl and says it&#8217;s more powerfull then twittercounter :) #sesny&#8217;</p>

<p>And some stuff that made us laugh:</p>

<p>&#8216;<a href="http://twitter.com/PaulIAm/status/1376139022">@PaulIAm</a>: Darwin just backed the car up to his grave, connected a hose to the tailpipe and took a deep breath&#8230;http://www.epenis.nl/&#8217;</p>

<p>&#8216;<a href="http://retecool.com/linkdump/hoe-groot-is-uw-epenis">@Retecool</a>: There’s lots of stuff out there that figures out your Twitter ranking, value, mojo, etc. But let’s cut the crap it’s all about who’s has the big swinging dick, right?&#8217;</p>

<p>&#8216;<a href="http://twitter.com/Vatikan/statuses/1377525861">@Vatikan</a>: Scheiße, @satan &#8216;s ePenis ist länger als meiner http://www.epenis.nl/&#8217;</p>

<p><img src="http://blog.boyvanamstel.nl/images/media/epenis/epenis_analytics1.png"></p>

<p>At this moment we&#8217;re trying to figure out what the hell we&#8217;re are going to do with it. To conclude, here is a list of the things we learned:</p>

<ul>
<li>Use Sneezers, find Twitter users with respect and high amounts of followers. (Seth Godin&#8217;s Purple Cow)</li>
<li>Post your viral at the right time. We had Spring Break, the SESNY Keynote by Guykawasaki and the usual monday morning boredom going for us.</li>
<li>Maximize sharability. Our &#8216;Post on Twitter&#8221; button was used extremely well.</li>
<li>Make it simple. There are no lists, links, pages. It does only one thing verry well. (KISS: Keep it Simple Stupid)</li>
<li>Sex Sells</li>
</ul>


<p>Thanks for reading,
<a href="http://barryborsboom.nl">Barry Borsboom</a> &amp; <a href="http://boyvanamstel.nl">Boy van Amstel</a></p>
]]></content>
  </entry>
  
</feed>

