string variable interpolation from file in ruby
posted by alexis reigel on december 17, 2012
Sometimes you want to interpolate your variables from a dynamic string, e.g. some settings from a yaml file. The top three options are:
- use
eval()to interpolate the variables in the form of#{foo} - use some templating engine like erb or mustache or whatever
- use the string format operator
I’ll show the third option here as:
eval()is dangerous for externally read sources and the yaml needs to be aware of the variables and scopes where the string is interpolated in the source code- a templating engine is overkill for this purpose
Ruby has string formatting support and a very handy % operator. This enables us to replace certain parts of our config at runtime with the actual value, like this:
"foo = %{foo}" % { :foo => 'bar' }
Metaflop serves once again as a sample application. The following shows the perl command to generate some parts of our fonts (simplified):
config.yml:
font_otf: perl mf2pt1.pl --family=%{fontface} --nofixedpitch --fullname="%{fontface} %{font_hash}" font.mf
Assuming we have a “config” variable that holds all the values defined in yaml we can do:
config.font_otf % {
:fontface => 'Bespoke',
:font_hash => '234sdof23nsf'}
# => perl mf2pt1.pl --family=Bespoke --nofixedpitch --fullname="Bespoke 234sdof23nsf" font.mf
The operator accepts literals and arrays as arguments as well, but I like the named parameters style best. This way, there is an obvious connection between the placeholder and its value.
how to generate a webfont kit with open source tools
posted by alexis reigel on august 06, 2012
There are some web based services that convert fonts to a webfont package, the most popular of which is the fontsquirrel font-face generator. For our metaflop project I was looking for a service api that i could call from within our application. Since i didn’t find one I was attempting to build the whole webfont generation by collecting tools that could do the job.
Font types
To create a webfont kit that works on all browsers we need to generate several different font types:
Tool chain
The following tools are required to generate all the needed font types. I assume that you have your font as otf. If you have a ttf, just switch ttf with otf in the following statements:
- FontForge
FontForge is primarily a visual outline font editor, but the tool can also be scripted and used on the command line.
Purpose: generates ttf, svg
Open($1) Generate($1:r + ".ttf") Generate($1:r + ".svg")
# outputs font.ttf, font.svg $ fontforge -script ttf-svg.pe font.otf
- sfnt2woff
Purpose: converts an otf to woff
# outputs font.woff $ sfnt2woff font.otf
- ttf2eot
Purpose: converts a ttf to eog
$ ttf2eot font.ttf > font.eot
CSS
The css declaration is based on Fontspring’s bulletproof @font-face syntax and is the same syntax as used by fontsquirrel.
@font-face {
font-family: 'YourFont';
src: url('YourFont.eot'); /* IE 9 Compatibility Mode */
src: url('YourFont.eot?#iefix') format('embedded-opentype'), /* IE < 9 */
url('YourFont.woff') format('woff'), /* Firefox >= 3.6, any other modern browser */
url('YourFont.ttf') format('truetype'), /* Safari, Android, iOS */
url('YourFont.svg#YourFont') format('svg'); /* Chrome < 4, Legacy iOS */
}
That’s it. Remember though that you should only convert fonts are legally eligible for web embedding.
reminder. git. awesome.
posted by alexis reigel on july 19, 2012
This is just a quick reminder of how awesome git actually is. The story is short:
My disk crashed and I lost a couple of local commits that I hadn’t pushed (to github) yet. Luckily, I deployed them to the staging server already (actually, this is a reminder of how awesome git and capistrano actually are). Because capistrano is awesome and deploys the git repo to the server, and git is awesome too, I could restore my local repo from the staging server:
local: $ ssh staging_server server: $ # some `cd` action server: $ tar czf asdf.tgz www_folder server: $ # ctrl + D local: $ cd /tmp local: $ scp user@staging_server:/tmp/asdf.tgz . local: $ tar xf asdf.tgz local: $ cd my_local_repo local: $ git pull /tmp/asdf dev
A simple git pull from the copied repo and I’m all set again.
How awesome is your dev stack?
sinatra with bourbon
posted by alexis reigel on march 24, 2012
If you search the web for “bourbon sinatra” you get a whole lot about Frank Sinatra and his drinking habits. But that’s not what this post is about.
How to use bourbon scss mixins with sinatra is not documented on their project page. So here’s my short setup.
The following is standard, from their documentation.
$ gem install bourbon # or better, add to use Gemfile and use bundler $ cd views/scss $ bourbon install
Next, import bourbon in your main scss file (as first statement).
@import 'bourbon/bourbon';
The following is the important and the undocumented part, specifically for sinatra. You need to require the ruby libraries in your scss route.
get '/assets/css/:name.scss' do |name| require './views/scss/bourbon/lib/bourbon.rb' content_type :css scss name.to_sym, :layout => false end
static vs dynamic vs strong vs weak vs duck typing
posted by alexis reigel on march 19, 2012
Here’s my take at clearing up the confusion about the most common type systems used in programming.
I often hear how static and strong typing are used as synonyms. These two are however quite different systems. The same applies to dynamic and weak typing. For instance, a programming language can be both dynamically and strongly typed, but not dynamically and statically. Ruby is an example of a dynamically and strongly typed language.
Ok, I guess now it’s the time to elaborate.
static vs dynamic
- static: types are checked at compile time
// example in c# string s = "asdf";
- dynamic: types are checked at runtime
# example in ruby s = "asdf"
strong vs weak
- strong: types must match, only explicit conversion
# example in ruby "1" + 1 # TypeError
- weak: implicit type conversion
// example in javascript "1" + 1 // "11"
duck typing
Duck typing is a style of dynamic typing.With duck typing, the set of methods and properties determine the valid semantics of a class, instead of inheritance from a specific class or implementation of an interface.
“When I see a bird that walks like a duck and swims like a duck and quacks like a duck, I call that bird a duck.”
This means that we actually don’t care if the class we’re using is actually of a certain type, as long as it provides the methods or properties we’re interested in.
The term duck typing comes from python, but ruby is also very known for this behaviour.
sinatra on capistrano
posted by alexis reigel on january 31, 2012
Capistrano is really great for deployment. The documentation however is somewhat scattered. The capistrano wiki has a more or less useful From The Beginning instruction and a Getting Started that doesn’t quite get you started.
However, the instructions on github are actually a very good starting point. Neverthelesse I want to show my sample here that has two additions to the one in the github help.
- Multistage support (i.e. staging and production server)
- Custom task to upload a config file
For further reading I recommend the Capistrano Handbook.
I assume that you’ve setup capistrano as described in the github help. The one thing I suggest is to ignore the part where the password is stored in the file. I highly advise to use ssh agent forwarding instead.
ssh_options[:forward_agent] = true # use local ssh key set :user, "deployer"
Let’s setup multistage:
require 'capistrano/ext/multistage' set :stages, %w(production staging) set :default_stage, "staging"
Also, on most deployment server you may not have rights to sudo:
set :use_sudo, false
As I’m assuming you’re using passenger mod_rails:
namespace :deploy do
task :start do ; end
task :stop do ; end
task :restart, :roles => :app, :except => { :no_release => true } do
run "#{try_sudo} touch #{File.join(current_path,'tmp','restart.txt')}"
end
end
The last part uploads our configuration file to the server. This configuration contains user and password for the database login. We don’t store that in the source code repository.
namespace :config do
task :db do
upload('db.yml', "#{deploy_to}/current/db.yml")
end
end
before "deploy:restart", "config:db"
The whole capistrano configuration file is on github.
swimming in zurich: "züribad"
posted by alexis reigel on april 25, 2011
My first android application is a utility app about all public swimming baths in Zurich. It shows the current water temperature for each bath and additional information is available too, such as address and routing info (how to get there by public transportation). Google map integration provides a geographical overview of the baths.
The app is freely available in the android market. The source code is hosted on Bitbucket.
share on minus from windows explorer context menu
posted by alexis reigel on february 19, 2011
There’s a new tool for the file sharing service minus.com that makes it really easy to share files. The tool provides a context menu entry in the windows explorer and a simple user interface to upload the files and provide you with the share url.
The tool is on github.
windows console: spawn new process
posted by alexis reigel on january 19, 2011
Under linux spawning a new process is as easy as appending an & to the command. In windows it’s not (obviously). I pretty quickly found out about the start command. Not as elegant as the linux version, but still pretty intuitive. Or, wait, not? It took me half a decade to find out how to use it properly.
First i had a look at the help output, which can be invoked by the switch /?. I’m not 100% sure, but i have in mind that this switch isn’t really standardized, i think I also had to use /h or /help in the past. Anyway, that’s not the sad part yet.

Reading through that, all you have to do is call start my_command. Easy huh? No. It’s not.
After digging around this article lead me to the solution: “title: Text for the CMD window title bar (required)”. Title! Required!
Let me say that again. Title! Required!
First thought: Why? Why is a title required? A title is clearly something optional, especially when you’re starting a GUI application.
Second thought: Why? Why is that “required” not stated as such in the help output? Not the slightest hint in the help output. And furthermore, isn’t it a convention that required parameters are NOT surrounded by brackets? Don’t brackets mean “optional”? Apparently, in the windows tooling environment all this does not apply.
I know, windows is a GUI centered OS, and therefore the console didn’t evolve as nicely as it did in other OS’s. Nevertheless, every time I have to work on a console or write a batch file it gives me the creeps. Everything is so unbelievably clumsy. At least I found out about the Console project, which is a pretty decent replacement for the windows console. Copy/paste works as desired with keyboard shortcuts and you can resize the window. Resize the window! How cool is that! But that’s a different story…
DataGridView with an object data source
posted by alexis reigel on september 04, 2010
For my Batch Replacer I am using a DataGridView with an object data source, meaning that I have a collection class that holds the data to be displayed. At first that class inherited from a usual List<T>, which led to the problem that the data binding wasn’t two-way. As soon as I bound data to the DataGridView, it wasn’t possible to add any new rows to it in my user interface. After some research I found out that instead of using a normal List<T> I was supposed to use a BindingList<T>. Using that the binding is two-way, and the user interface is normally editable and new rows can be added. Also, of course, all modifications done in the user interface are reflected in the object (meaning e.g. that when a new row is added, the object data source contains a corresponding entry).
replace as in batch replace
posted by alexis reigel on september 03, 2010
So I once again needed to replace several patterns in multiple files with something new… Windows lacks a nice terminal with all the pipeable tools. Instead of doing this all in my favorite text editor by using repeatedly find/replace, I decided that something more handy was needed. Of course I could have done all that replace stuff with xslt too, for even more awesomeness (you can’t see my face, that what sarcasm).
The result of my disapproval of the above mentioned options is the Batch Replacer. As always it is released under the gpl. I also used git:" for the first time and published the source code on github".
navigate to those... out of the box with firefox
posted by alexis reigel on march 30, 2010
Ok well, this doesn’ seem to be new at all, but nevertheless I missed that. Firefox has the great functionality to assign shortcuts to certain bookmarks and supply a parameter to the URL. This leads to really great quick searches (aka. the art of bookmarking="http://lifehacker.com/196779/hack-attack-firefox-and-the-art-of-keyword-bookmarking).
What I have now are shortcuts to all my often used search sites. To search in wikipedia e.g. I type CTRL + L (shortcut for placing the cursor in the URL bar in firefox), then type wp asdf and there I go.
I guess this fact renders my previously posted quick link access tool obsolete…
navigate to those urls over and over again...
posted by alexis reigel on may 15, 2009
I’ve written a tool that allows to define commonly used URLs for repeated access, varying only by a defined parameter-part. When you call one of those URLs, you just need to pass a parameter and it opens in the browser. That way you get quick access to often used URLs, e.g. your preferred search engine, your ticketing system or whatever. For even faster access the URLs are bound to predefined global hotkeys.
More infos can be found on github.

nullable average in linq
posted by alexis reigel on october 12, 2008
The following code is one possibility (there may be more elegant solutions to this) to handle a nullable average from a linq query. The problem arises when the linq query does not return a result, thus the average being null. If you don’t use a nullable type, you’ll get an exception. To get a nullable average from an integer value you’ll need to provide a transform function to the Average funtion.
double? nullableAverage =
(from m in dataContext.Moods
join g in dataContext.Groups on m.GroupGUID equals g.GUID
where g.GUID == groupGUID
select m.Level)
.Average<int>(x => new double?(x));
int average = (int)Math.Round(nullableAverage.HasValue ? nullableAverage.Value : 0, 0);
// ...
ruby blood through your .net veins with a vengeance
posted by alexis reigel on june 28, 2008
In my last blog entry i totally neglected the fact that there are lamda expressions. This nice little C# 3.0 feature makes anonymous methods much more readable. With that in mind, we can make our Times method much nicer.
Example 1: Ruby style iterator with lambda expression
2.Times( number => { Console.WriteLine("> " + number); } );
Compared to the former syntax, it increases readability considerably.
Example 2: Ruby style iterator with bare delegate
2.Times(
delegate(int number)
{
Console.WriteLine("> " + number);
}
);