Onze dagmethode #3: Hash.multi

Geplaatst door Remco van 't Veer do, 07 feb 2008 08:00:00 GMT

Je hebt hem vast wel eens gebruikt Hash.new met een block om een twee-dimensionale hash te maken;


map = Hash.new{|h,k| h[k] = {}}
map[:dragon][:strength] = 9

Maar soms wil je een multi-dimensionale hash;


def Hash.multi
  Hash.new{|h,k| h[k] = Hash.multi}
end

Zelf gebruik ik hem in een applicatie als simpele cache waarvoor ik complexe sleutels heb;


CACHE = Hash.multi

def expensive_query(key)
  cache = CACHE[:query][auth_level][current_channel]
  unless cache.has_key?(key)
    cache[key] = Server.query(auth_level, current_channel, key) 
  else
    cache[key]
  end
end

Geplaatst in ,  | 1 reactie

Onze dagmethode #2: Numeric#in

Geplaatst door Michiel de Mare wo, 06 feb 2008 06:27:00 GMT

De meeste web-applicaties lijken niet veel met random getallen van doen te hebben, online-pokersites natuurlijk uitgezonderd (hoop ik), maar toch komen ze verbazend veel van pas. Daarom introduceer ik vandaag een nieuwe notatie voor kans.


# het kan natuurlijk zo:
redirect_to home_url if rand < 0.2222

# dit is al beter
redirect_to home_url if rand(9) < 2

# maar niet zo mooi als dit
redirect_to home_url if 2.in 9

# de code
class Numeric 
  def in(other)
    rand(other) < self
  end
end

Recommend Michiel de Mare

Geplaatst in ,  | 5 reacties

Dit Is Git

Geplaatst door Michiel de Mare di, 05 feb 2008 22:42:00 GMT

Het lijkt wel alsof je de laatste tijd niet anders meer hoort dan verhalen over hoe geweldig gedistribueerd versiebeheer is, en dan het gaat het vooral over “git”, het nieuwe kindje van Linus Torvalds.

En niet voor niks. Er zijn een aantal problemen met subversion. Branchen is verwarrend (een branch is een cheap copy?) dus bijna niemand doet het, gewoon mergen is vervelend, veranderingen bijhouden in twee of meer branches is zo lastig dat je iemand in je team de rol van versiebeheerder moet geven (en ja, dat was ik meestal) en bij open-source projecten moet je kiezen tussen of iemand volledige commitrechten geven, of ze patches laten opsturen via email of een bugtracker. Tenslotte heb je altijd één centrale repository, en heb je dus een verbinding nodig voor de meeste acties.

Git werkt totaal anders. Er zijn enorme tutorials voor, en tegen de honderd commando’s, maar ik beperk me hier tot de kern:

Een repository bestaat uit vier soorten objecten:
  • blobs (bestandsfragmenten)
  • trees (de directorystructuur met de bestandsnamen, met per bestand uit welke blobs het bestaat)
  • commits (een tree plus een lijst met parent commits)
  • tags (metadata)

Er is geen centrale repository, maar iedereen bewaart de hele repository lokaal. Niet iedereen heeft dus persé dezelfde repository. Maar dat geeft niet, want synchroniseren betekent alleen de ontbrekende blobs, trees en commits uitwisselen.

Een repository is onveranderlijk – dat wil zeggen, er komt alleen data bij. Bestaande data verandert nooit. Als je een branch wilt maken, gebruikt git daar hard links voor. Dat maakt het een goedkope operatie.

Omdat elke commit een parent heeft, heb je dus een boom met commits. En dat blijkt noodzakelijk te zijn voor het automatisch verwerken van patches.

Een van de consequenties is dat omdat branches zo goedkoop zijn, je voor elk idee dat je hebt een branch kunt maken. Dat kan een enorm voordeel zijn.

Ik ben nu bezig om mijn subversion repository te converteren naar git. Over een paar weken vertel ik over mijn ervaringen.

De beste resource die ik heb gevonden is trouwens een screencast. Van harte aanbevolen!

Geplaatst in  | 2 reacties

Onze dagmethode #1: Range#coerce

Geplaatst door Michiel de Mare di, 05 feb 2008 08:00:00 GMT

We introduceren een nieuwe feature: de methode van de dag. Hierin demonstreren we een korte, algemeen toepasbare methode. We doen aan verzoekjes!

Vandaag beginnen we met Range#coerce. Het probleem: je hebt een waarde, en je wilt garanderen dat deze binnen een bepaald interval ligt. Klinkt ideaal voor een Range. Een Range heeft wel een methode om te testen of een waarde erbinnen ligt (include?) maar niet om de waarde te forceren.

Vandaar het volgende:

class Range
  def coerce(x)
    x < first ? first : x > last ? last : x
  end
end

(1..12).coerce(999)   # => 12

Recommend Michiel de Mare

Geplaatst in ,  | Tags  | 5 reacties

Een Hash is een Functie

Geplaatst door Michiel de Mare ma, 04 feb 2008 03:46:00 GMT

Tijdens het staren naar de volgende code, kreeg ik opeens een lumineus idee.

specialism_codes.map {|code| SPECIALISMS[code] }

Waarom moet ik een block maken om te mappen van een lijst codes naar een lijst beschrijvingen, als die codes en beschrijvingen allemaal netjes in een constante zitten? Is dat niet juist wat een Hash is, een mapping van een domein naar een bereik? Is dat niet precies de definitie van een functie in de wiskunde? Waarom dan toch dat block?

Enfin, dat was snel opgelost:

class Hash
  def to_proc
    lambda {|x| self[x] }
  end
end

specialism_codes.map &SPECIALISMS

Recommend Michiel de Mare

Geplaatst in  | geen reacties

28 januari: amsterdam.rb

Geplaatst door Michiel de Mare do, 17 jan 2008 14:34:00 GMT

Op maandag 28 januari vindt de eerste bijeenkomst van amsterdam.rb plaats! Amsterdam.rb moet een gezelschap worden van Rubyisten die elke laatste maandag van de maand ergens in Amsterdam samenkomen en onder het genot van een biertje de ontwikkelingen in Rubyland bespreken.

Laptops zijn ook welkom – wie weet komt er nog wat creatiefs uit voort ook!

Voorlopig gebruiken we een Google Group ter coördinatie: amsterdam-rb

De eerste ontmoeting vindt plaats in de Bekeerde Suster aan de Nieuwmarkt. Vanaf een uur of acht kunnen jullie ons daar aantreffen.

Wij hopen jullie snel te zien!

Geplaatst in  | 3 reacties

Ruby 1.9 is uit!

Geplaatst door Remco van 't Veer di, 25 dec 2007 22:20:00 GMT

Hoera! Wat een prachtig kerstkado! Er is heel veel nieuws te ontdekken!

Geplaatst in  | 2 reacties

Oudere artikelen: 1 ... 6 7 8 9 10 ... 20