Viser arkivet for stikkord ruby19

Ruby 1.9.1 og bytekode-magi

Jeg gleder meg til Ruby 1.9.1 er ferdig og jeg kan gjøre ting som dette:

  code = RubyVM::InstructionSequence.compile("2+2").to_a
  HTTPClient.new.post("http://example.com/run_code", 
    code.to_json)

og deretter i den andre enden, i f.eks. Rails:

  def run_code
    code = RubyVM::InstructionSequence.load(
      JSON.load(params[:code]))
    code.eval
  end

Denne koden fungerer i dag om du patcher iseq.c litt, ved å slå på load, som har blitt kommentert ut da det foreløpig ikke finnes logikk for å verifisere at bytekoden er korrekt. (Jeg har faktisk lagt inn en bugrapport om at dette er teit.)

Bytekode-funksjonaliteten er helt nødvendig for å legge Ruby-støtte til map-reduce-rammeverket Disco. Disco lar deg uttrykke map-reduce-oppgaver i ren Python, ved at selve bytekoden til oppgavene disassembles og sendes til en Erlang-demon som deretter utfører koden på mange maskiner. Her er et eksempel med Python som lager en tabell over ord-frekvenser fra en inputfil:

  import disco

  def fun_map(e, params):
          return [(w, 1) for w in re.sub("\W", " ", e).lower().split()]

  def fun_reduce(iter, out, params):
          s = {}
          for k, v in iter:
                  if k in s:
                          s[k] += int(v)
                  else:
                          s[k] = int(v)
          for k, v in s.iteritems():
                  out.add(k, v)

  results = disco.job("disco://localhost:5000", "wordcount",
              ["http://localhost/text-block-1", "http://localhost/text-block-2"],
              fun_map, reduce = fun_reduce, nr_maps = 100, sort = False)

  for key, value in disco.result_iterator(results):
          print key, value

Med Ruby 1.9 vil vi kunne gjøre det samme.

Denne bytekodefunksjonaliteten burde også åpne for å enklere kunne uttrykke map-reduce-jobber med CouchDB, for eksempel. Den vil også potensielt kunne brukes til å lage penere asynkron-jobb-kø-prosessering á la Starling. Jeg kan tenke meg noe slikt:

  JobQueue.run_later do
    require "#{RAILS_ROOT}/config/environment"
    ComplexProcessing.execute
  end

Her kan run_later disassemble blokken, lagre den i en kø, som så utføres av jobb-systemet.

Ruby 1.9 og Rails?

Er det noen her som kjører Ruby 1.9 og Rails på produksjonsservere og har noen erfaringer å dele? Jeg mener å ha hørt at Rails nå kjører fint på 1.9, men jeg finner ingen oppdaterte artikler som bekrefter dette, og jeg vil gjerne få et bedre inntrykk av hvorvidt det overhodet er noen vits i å prøve.

Migrating to Ruby 1.9

Here’s the slides for the other talk I gave at Scotland on Rails, going over the syntax and language feature changes between Ruby 1.8 and Ruby 1.9.