favoriete nieuwtje in rails edge

Gepubliceerd op: 20.III.2006 19:08 CET
Categorieën: rails, ruby

In de volgende versie van rails (1.1) worden veel nieuwe dingen geïntroduceerd. Zie voor een continue groeiende lijst het blog bericht van Scott Raymond. Er zitten waanzinnige dingen bij en ik hoop snel weer tijd te hebben (ik zit nu in een verhuizing) om met al dat moois te spelen.

M’n favoriet is delegate. Het is zo’n juweeltje, dat zó voor de hand ligt dat ik me meteen af vroeg waarom dat niet gewoon in ruby zit. Voorbeeldje:

Address = Struct.new(:city, :country)
class Person < Struct.new(:name, :address)
  delegate :city, :to => :address
end

remco = Person.new('remco', Address.new('Amsterdam', 'Nederland'))
p remco.city # => "Amsterdam"

Dus; definieer twee classes Address en Person waar Person een Address bevat en geef in Person direct toegang tot het city attribuut.

Lees verder ››

RAD raced

Gepubliceerd op: 27.II.2006 14:35 CET
Categorieën: rails, ruby

Vorige week donderdag en vrijdag heb ik met Michiel de Mare aan de RAD race meegedaan met Ruby on Rails. Lees er meer over op de RubyEnRails.nl.

afkortingen voor methoden namen

Gepubliceerd op: 26.I.2006 17:42 CET
Categorie: ruby

Commandline utilities hebben vaak korte namen; ls, rm, grep, svn etc. De subversion client svn heeft (sub-)commando’s welke allemaal afkortingen hebben; svn status kan je schrijven als svn st e.d. Toen ik een ruby wrapper class had geschreven om het svn commando, miste ik metteen de svn st variant. Natuurlijk kan je gewoon wat aliases aanmaken voor commando’s maar ik zag een kans voor een experimentje in een verloren uurtje.

Bladerend door de appendix van pickaxe 2 ben ik ooit tegen abbrev aangelopen. Gegeven een lijst termen geeft deze een hash van mogelijke afkortingen terug:

require 'abbrev'
require 'pp'
pp %w{bla die foo bar}.abbrev

levert:

{"die"=>"die",
 "bla"=>"bla",
 "d"=>"die",
 "di"=>"die",
 "foo"=>"foo",
 "f"=>"foo",
 "bar"=>"bar",
 "ba"=>"bar",
 "fo"=>"foo",
 "bl"=>"bla"}

Mooi om automagische afkortingen te leveren. We kunnen aan de slag!

Lees verder ››

DRY blijven door meta programmeren

Gepubliceerd op: 10.I.2006 18:51 CET
Categorie: ruby

In een poging DRY te blijven, ben ik in de wondere wereld van ruby meta programmeren terecht gekomen. Het was er mooi en dat wil ik graag delen.

Ik was bezig met het maken van een subclass van String, Html. Mijn variant kan wat specifieke manipulaties uitvoeren: absolutize(url) om alle links absolute te maken, escape om speciale tekens te vervangen en sanitize(tags = nil) om tags, welke niet toegestaan zijn, te verwijderen. Na de methoden geschreven te hebben en een TestCase aangemaakt, bedacht ik me dat ik ook een !- (past het daadwerkelijk object aan) en self.-variant (class methode waar een String object ingaat en gemodificeerde versie uitkomt) wil hebben.

Ik heb eerst alles omgeschreven naar een !-variant, m’n code werd hier eigenlijk veel duidelijker van; geen value.gsub!(.. meer maar gsub!(... En ik ben m’n varianten gaan toevoegen:

  def escape
    result = dup
    result.escape!
    result
  end

  def self.escape(value)
    result = Html.new(value)
    result.escape!
    result.to_s
  end

Ho wacht! Moet ik die nu voor alle drie de methoden doen?! Maar dat is niet DRY! Ik wil kunnen schrijven:

  def_variants :escape
Lees verder ››

Refactoring Ruby code

Gepubliceerd op: 10.XII.2005 12:07 CET
Categorieën: java, ruby

Als Java professional ben ik verknocht aan de refactoring mogelijkheden van Eclipse. Sterker nog de reden waarom ik van Vim en commandline CVS overgestapt ben, is refactoring. M’n grootste zorg bij de stap naar Ruby is het missen van dergelijk tools. Ik heb ze nog niet gemist maar dat is ook niet zo gek als je pas een half jaar over Ruby obsedeerd en nog geen honderden kilobytes code hebt die eigenlijk anders moeten.

Gelukkig ben ik niet de enige die zich daar zorgen over maakt en zijn er veel slimmere mensen die allang oplossingen hebben gevonden. Via een blog bericht van Curt Hibbs kwam ik op een uitgebreid verhaal van ene Murphee en daar vandaan op een waanzinnig Ruby-eske oplossing van Mike Williams. M’n hartje sprong!

Lees verder ››

hoogte en breedte van een JPEG

Gepubliceerd op: 2.XII.2005 10:02 CET
Categorie: ruby
Reacties: 2 stuks

Als je bezig bent met web applicaties loop je vaak tegen het probleem dat het lastig is om de grootte van een afbeelding te bepalen. Voor GIF’s en PNG’s is dat triviaal maar JPEG’s zijn lastig. Ik heb wat oude code geport naar Ruby en kan nu zonder afhankelijk te zijn van een of andere library JPEG’s lezen.

Lees verder ››

!Ruby.kind_of? Java

Published at: 25.XI.2005 12:52 CET
Categories: english, java, ruby

Fueled by a post by Danny. My take on the Java versus Ruby hype.

I am growing more and more tired of the comparison between Java and Ruby. They just don’t match.

Read more ››

nog meer roman numerals

Gepubliceerd op: 17.XI.2005 13:29 CET
Categorie: ruby
Reacties: 2 stuks

Oh, we willen natuurlijk ook de andere kant op kunnen! Voeg het volgende toe aan de uitgebreide Fixnum:

class Fixnum

  @@ROMAN_HASH = Hash[*@@ROMAN_DIGITS.map{|a,b|[b,a]}.flatten]

  def self.from_roman(txt)
    result, last = 0, 0
    txt.upcase.reverse.each_byte do |c|
      n = @@ROMAN_HASH[c.chr] or raise "'#{c.chr}' is not a valid roman digit"
      result += n < last ? -n : n
      last = n
    end
    result
  end
end

En nu kan je met Fixnum.from_roman('MCMLXXII') weer terug naar 1972!

roman numerals

Gepubliceerd op: 9.XI.2005 16:13 CET
Categorie: ruby
class Fixnum
  @@ROMAN_DIGITS = [
      [1000, 'M'], [900, 'CM'], [500, 'D'], [400, 'CD'],
      [100, 'C'], [90, 'XC'], [50, 'L'], [40, 'XL'],
      [10, 'X'], [9, 'IX'], [5, 'V'], [4, 'IV'],
      [1, 'I']
  ]

  def to_roman
    raise "#{self} out of range (1 - 3999)" if self <= 0 || self >= 4000

    result, rest = '', self
    @@ROMAN_DIGITS.each { |n,t| result << t and rest -= n while rest >= n }
    result
  end
end

En nu kan je 1972.to_roman gebruiken in je code! Yay! Ik hou van ruby en ruby houdt van mij!