Boy van Amstel

Technology, programming and 80's hits.

Apps for the Planet Talk

I gave a talk a the Apps for the Planet 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.

Html5-boilerplate Gem and No More Posting/deleting Etc.

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.

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

Comment the following lines on line 348 and the problem goes away:

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

I’m guessing the other rewrite rules are problematic as well. A better fix would be to only rewrite when using GET.

TTResponds Update

I’ve updated TTResponds to include some requests people have made.

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

The script has been submitted to the Apps Script Gallery, but may take a while to appear. You can grab it right now from Github.

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.

Omniauth Strategy for Google OpenID+OAuth Hybrid Protocol Login

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

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

I’ve created a fork (read update) that contains the google_hybrid strategy and an example project that implements it.

UPDATE: My strategy just got merged into Omniauth’s master branch. So just use Omniauth instead of my fork.

To see how it works, try this demo.

Dropbox Chat

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.

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.

The experiment is really easy to setup. Just clone/download the repository on GitHub. Put the folder in your Dropbox folder and share the folder with your friends.

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):

$ cd ~/Dropbox/Projects/DropboxChat

Now run the application.

$ ruby chat.rb

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

$ gem install [gem name]

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

Maintenance Page While Deploying With Capistrano

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.

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..

It’s pretty easy to do this and I’m just going to provide two links that explain it very well. One for Apache and one for Nginx. They’re both very similar and you can easily pick either of the deploy.rb parts.

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.

Instalike

We had a Saturday Night of Awesome this weekend and came up with the idea to create an iPhone and Android app 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.

The iPhone App will be released as soon as Apple approves it.

Description:

With InstaLike you can ‘like’ everything you see, instantly!

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

InstaLike allows you to share your pictures as fast and easy as possible.

Download it and let me know what you think!

Google Apps Script: TTResponds

Introduction

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

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.

Installing

First login to your Google Docs environment, docs.google.com and Google Apps both work fine. After that, choose to create a new Form.

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.

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…’.

Search for ‘TTResponds’ and click install.

Authorize the script to read your Spreadsheet and send out emails.

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…’.

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

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!

HTML Email

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.

You’ll see that is says:

{ name: _config.from }

Change it to this:

{ name: _config.from, htmlBody: _config.body }

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

Collaborating

I’ve created a GitHub repo for TTResponds. If you’re adding features, or fixing bugs, please fork the project and send me a pull request.

Let me know

It would be awesome if you let me know if you use and/or like the script through the comments, thanks!

Omniauth + Facebook = OpenSSL::SSL::SSLError

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:

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

This is easily fixed by adding the following to one of the initializers:

OpenSSL::SSL::VERIFY_PEER = OpenSSL::SSL::VERIFY_NONE

It’s probably not the best solution, as this turns off SSL peer verification..

A better solution:

http://stackoverflow.com/questions/5711190/how-to-get-rid-of-opensslsslsslerror

Hip Like Heroku

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 hiplikejapie.nl.

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 Please Rob Me happens. In any case the ability to scale a project and not worrying about server setup and stuff is awesome.

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.

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

$ sudo gem install heroku

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

$ git init
$ git add .
$ git commit -m 'initial import'

Let Heroku add it’s remote.

$ heroku create

Login with your Heroku credentials and you’re done setting up!

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.

$ git push heroku master

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.

$ heroku rake db:migrate

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.

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:

$ heroku logs

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

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 => "id DESC", :limit => 10, :group => 'username'
      )
end

After that the site worked fine: hiplikejapie.heroku.com. 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.

$ heroku addons:add custom_domains

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.

$ heroku domains:add www.hiplikejapie.nl
$ heroku domains:add hiplikejapie.nl

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.

@ A 75.101.163.44
@ A 75.101.145.87
@ A 174.129.212.2
www CNAME proxy.heroku.com.

That’s it, hiplikejapie.nl points directly to Heroku, awesome!

EDIT:

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:

Compass.configuration.sass_options={:never_update=>true}