/images/bio-photo-small.jpg

Shallow and Pedantic

A person/tech/code blog of a coder/techie/person. Like calculus in a kiddie pool, the author of this blog is known to be quite shallow and pedantic.

Quick time tracking hack

Gnome 2.24 adds a new Time Tracking feature, which I would have found useful. I don’t have Gnome 2.24 at work, but I do have a Unix-based operating system… Here’s my new ~/bin/track:

1
2
3
#!/bin/bash
date >> ~/time_tracking
vim ~/time_tracking +

Now, if I could only get vim to automatically hit “A” and space for me afterwards… (I’m betting there’s a way to do it, but AFAIK vim can only receive ex-mode commands as parameters).

Delegating methods in Ruby

Sometimes, when constructing a compound object, we are interested in exporting functionality while retaining encapsulation. For example, suppose we have a Secretary class:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
class Secretary
  def send_fax(destination, fax_contents)
    puts 'Sending fax "%s" to %s' % [fax_contents, destination]
  end

  def answer_call(call)
    # ...
  end

  # ...
end

Our Secretary provides a lot of useful functionality, that our Boss class would like to have. Boss would like to be able to say that he can send a fax, without having the user explicitly request his Secretary beforehand. The same goes for a lot of other methods Secretary provides. Instead of writing a stub function for each of these methods, it would be nice to do the following:

Three things I didn't know Ruby does

Edit: I was misled!

Illustrated here. Hints below.

>> def inspect_x_and_y(x,y); puts "x: %p, y: %p" % [x, y]; end
=> nil
>> inspect_x_and_y(y={"hello" => "world"},x=[1,2,3])
x: {"hello"=>"world"}, y: [1, 2, 3]

The bits I didn’t know about:

  1. "Format strings using a %% sign, %s, %s!" % [ "just like in python", "but with arrays" ]
  2. The %p formatting character is the same as inspect.
  3. You can call methods with method_name(param2=val2, param1=val1), also like in python. No you can’t! This code sets external variables called y and x.

How embarassing… :(

Gettext oddities with Ruby

I was having a lot of trouble with gettext in Ruby, mostly due to lacking documentation. Here are some useful things I figured out while writing TTime. I ended up having a single gettext_settings.rb, included from every file which uses gettext. Here it is (with some extra notes)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#!/usr/bin/ruby
begin
  require 'gettext'
  require 'pathname'

  include GetText

  # This fixes a swarm of problems on Windows
  GetText.locale.charset = "UTF-8"

  # Ruby's gettext acts in a sane
  # method - add a path to the set of paths
  # scanned.
  locale_in_data_path = Pathname.new($0).dirname + \
    "../data/locale/%{locale}/LC_MESSAGES/%{name}.mo"
  add_default_locale_path(locale_in_data_path.to_s)
  bound_text_domain = bindtextdomain("ttime")

  # For Glade, however, it only seems to
  # be possible to specify one path at a
  # time. Fortunately, gettext already
  # found it for us.
  my_current_mo = bound_text_domain.entries[0].current_mo
  if my_current_mo
    ENV["GETTEXT_PATH"] = my_current_mo.filename.gsub(
      /locale\/[^\/]+\/LC_MESSAGES.*/,
      "locale/")
  end
rescue LoadError
  def _ s #:nodoc:
    # No gettext? No problem.
    s
  end
end

One note for context: I use setup.rb (and ruby-pkg-tools) to package TTime. So my localizations go in data/locale.