News flash: Absolute CSS positioning on opposite sides is not a problem

Back in the old days, we couldn't do something like that:

.foo {
  position: absolute;
  bottom: 0;
  /* This was bad: */
  left: 10px;
  right: 10px;

Why? Because IE5 and IE6 (which a majority of people used back then) failed horribly trying to render it.

I've now checked if this is still an issue with any browser that's not from the stone age. \
Turns out all is well – except if you have to support IE6 and below, but then you're in some other kinds of trouble.

It works in all sane browsers, and Internet Explorer 7, 8…

How to: Build a "generic observer" widget for the awesome window manager

If you want a widget for awesome that runs a command regularly (every X seconds) and puts the output into your awesome panel, this is for you.

Put the code below into your ~/.config/awesome/rc.lua. It supplies two methods:

  • execute_command will run a command and return its output. Multiple lines will be joined into one line. The code is from the awesome wiki.
  • widget_with_timeout is a method that takes a command to run and a timeout in secon…

Duplicate a git repository with all branches and tags

In order to clone a git repository including all branches and tags you need to use two parameters when cloning the old and pushing to the new repository respectively:

git clone --bare
cd old-repo
git push --mirror

Of course, the URLs to your repository might look different depending on the protocol used, username required, etc.
For a user git using the git protocol, it could be

Howto: Create a self-signed certificate

As igalic commented on this gist.

openssl req -new -newkey rsa:2048 -sha1 -days 365 -nodes -x509 -keyout server.key -out server.crt


req -new
Create a new request …
… using a new key …
… of type RSA, 2048 bits long.
Make sure to use SHA1 as this certificate's hashing algorithm,
don't encrypt the key and
make it an X.509 certificate, not a Certificate Signing Request.

Mac OS: Remove app from Launchpad

Issue this command:

sqlite3 ~/Library/Application\ Support/Dock/*.db "DELETE from apps WHERE title='APP_NAME';" && killall Dock

This tells sqlite3 to remove the app called APP_NAME from the Launchpad database and then kill the process called Dock, thereby restarting it.

LibreOffice Calc: Reset positions of split dividers

To reset the position of split dividers, drag all the dividers out of the screen. Then turn off splitting and turn it on again.

How to find out which type of Spec you are

When you need to find out in which kind of spec you are during run-time, it's definitely possible. It's a lot easier in RSpec2.

For example, consider this global before block where you'd want to run some code for specific specs only:

config.before do
  # stuff
  # more stuff

RSpec 2

If you want to run such a block for a specific type of specs, you can use filters:

config.before do
  # stuff
  # more stuff  ...

Quick git contributors list

git shortlog -s -n
-n, –numbered
Sort output according to the number of commits per author
-s, –summary
Suppress commit descriptions, only provide commit count

Example output for spreewald:

60  Tobias Kraze
12  Henning Koch
 7  Dominik Schöler
 6  Thomas Eisenbarth
 5  Martin Straub
 3  Minh Hemmer
 2  Alex McHale
 1  Manuel Kallenbach
 1  Andreas Robecke

Use the same translations for ActiveRecord and ActiveModel

ActiveRecord translations live in locale.activerecord. ActiveModel translations live in locale.activemodel. To use the same translations for both, use YAML references with & and *:


models: &models
user: 'Benutzer'

attributes: &attributes
email: 'E-Mail'

errors: &errors
format: ! '%{attribute} %{message}'
accepted: muss akzeptiert werden
blank: muss ausgefüllt werden
# …

errors: *errors
models: *models
attributes: *attr…

AngularJS: Access the scope for a rendered DOM element

This trick might be useful to implement more complicated directives in AngularJS. I needed it to do drag'n'drop in a hierarchical tree.

Let's say you have this $scope in your Angular controller:

$scope.tasks = [
  { 'text': 'Task 1' },
  { 'text': 'Task 2' }

And you have this template:

<ul ng-repeat="task in tasks">

Which renders this HTML:

  <li>Task 1</li>
  <li>Task 2</li>

If you'd like to access the scope bound to the second <li> you can say this in jQ…

How to clear cookies in Capybara tests (both Selenium and Rack::Test)

Capybara drivers will usually delete all cookies after each scenario. If you need to lose cookie data in the middle of a scenario, you can do this:

browser = Capybara.current_session.driver.browser
if browser.respond_to?(:clear_cookies)
  # Rack::MockSession
elsif browser.respond_to?(:manage) and browser.manage.respond_to?(:delete_all_cookies)
  # Selenium::WebDriver
  raise "Don't know how to clear cookies. Weird driver?"

Inherit without Single-Table-Inheritance (STI) in ActiveRecord

You have multiple options:

  1. Just don't have a type column. All STI magic will be disabled automatically.
  2. If you have a type column but want to use it for something else (WAT?), you can set self.inheritance_column = :_non_existing_column in the class definition
  3. (Untested) In the parent class, set self.abstract_class = true

This technique is useful to implement form models / presenters, where you want all the goodness of Ac…

How to find out if you are in Cucumber or in RSpec

Sometimes you need a piece of code to do something different for specs than for features. If you don't have separate environments, you can't check your Rails.env.

I managed to distinguish between specs and features by asking Capybara:

if defined?(Capybara) and Capybara.respond_to?(:current_driver)
  # you're in a Cucumber scenario
  # you're probably in a spec

You could omit the defined?(Capybara) condition, if you are sure that Capybara is always defined when that code is being called.

Using Thin for development (with SSL)

Note: These instructions are for a quick per-project setup and may require you to change code. If you generally need SSL for development, you probably want to use Passenger.

  1. Create a directory .ssl in your home directory. Go there and create a self-signed certificate. It is important to enter localhost.ssl as Common Name when asked. This is to mak…

JavaScript: How to generate a regular expression from a string

Getting a regular expression from a string in JavaScript is quite simple:

new RegExp('Hello Universe');
# => /Hello Universe/

You can also use special characters:

new RegExp('^(\\d+) users')
# => /^(\d+) users/

Our expression above now works only at the beginning of the matched string, looks for a number (\d+ [1]) and also captures that. Sweet.

However, mind that your input will not be magically escaped because of that:

new RegExp('')
# => /

The above expression would match "`…

How to not die with ActionView::MissingTemplate when clients request weird formats

When HTTP clients make an request they can define which response formats they can process. They do it by adding a header to the HTTP request like this:

Accept: application/json

This means the client will only understand JSON responses.

When a Rails action is done, it will try to render a template for a format that the client understand. This means when all you are HTML templates, a request that only accepts application/json will raise an error:

An ActionView::MissingTemplate occurred in pages#foo:
  Missing templa...
3409 cards