Se også: Bilder på Flickr - Last.fm-profil - Om meg - Personlig side - Planet Snuskete -

Archive for the 'ruby' Category

128-bit programming challenge

Wednesday, May 2nd, 2007

Write a program that produces 128 specific bits of output. In the simplest case, output those 128 bits in a standard numeric form such as sixteen pairs of hexadecimal digits. Your program may not contain the 128 bits in literal form, it must manufacture them in some way.

128-bit programming challenge.

A boring / little imaginative example, but still:

#!/usr/bin/env ruby
[9,240,-232,-15,155,-41,111,-136,125,-151,21,111,-98,-13,50,56].inject(0){|s,i|
  print “%02X “%[s+i];s+i
}

As a bonus, the program is 128 bytes (including the shebang line …)

Avrunding av flyttall …

Friday, April 27th, 2007

Det begynte med at jeg leste at Python kvitter seg med map-funksjonen sin, siden det samme kan oppnås med list comprehensions. Følgende eksempel var gitt:

[str(round(355/113.0, i) for i in range(1,6)]

Selv om jeg likte eksempelet, og ble fascinert av list comprehensions (som jeg ikke har lest nok om tydeligvis), måtte jeg så klart oversette det til Ruby. Første forsøk ble følgende:

(1..6).map {|i| "%.#{i}f" % [355/113.0] }

Bruken av String#% er ikke så veldig opplagt, med mindre du er kjent med printf-style funksjoner fra C og venner. Men det slo meg så at det ikke (så vidt jeg vet om hvertfall) finnes en metode som gjør det samme som round() gjør i Python. Gir et nytt flyttall med gitt presisjon. I Ruby vil Float#round returnere flyttallet avrundet til et heltall, det er greit, men Float#prec hadde ikke den betydningen jeg hadde trodd … Av en eller annen grunn tar den en klasse, og konverterer flyttallet til denne klassen (kaller klasse.induced_from(obj) med objektet som argument). Hvorfor? Aner ikke. Gadd heller ikke å sjekke. Kjapt og skittent monkeypatchet jeg Float-klassen:

class Float
  def to_f(prec=nil)
    return self unless prec # kan være en idé med prec.kind_of? Integer
    (self * (10 ** prec)).round / (10.0 ** prec)
  end
end

Math::PI.to_f 4 # => 3.1416

# Dermed en smule mer leselig:
(1..6).map {|i| Math::PI.to_f(i).to_s }

Grunnen til at jeg erstattet Float#to_f i stedet for Float#round (som kanskje virker naturlig), er at to_f bare returnerer self og dermed er enkelt å endre på uten å ødelegge eksisterende oppførsel (med mindre du regner det som ødeleggende at den tar en ekstra parameter da). round derimot er optimalisert i C for å avrunde flyttall til heltall på en kjapp måte. For å beholde denne hurtigheten måtte man derfor ha skrevet metoden om i C, og det gidder jeg ikke.

Nok en gang aner jeg ikke helt hvorfor jeg endte opp med å skrive dette … list comprehensions var stilig, men så sporet visst tankene mine av en annen plass. Jaja.

rb_eval_string_protect

Monday, March 12th, 2007

Today’s code snippet:

char *string = "raise StandardError 'LOL' \\n";
char *buffer;
int err;

// evaluate ruby code in string
rb_eval_string_protect(string, &err);

if (err) {
  // store $!.to_s (last exception as string) in buffer
  VALUE exception = rb_get_gv("$!");
  buffer = RSTRING(rb_obj_as_string(exception))->ptr;
} else {
  // store $stdout.output_buffer to string
  // (requires you to replace $stdout of course)
  VALUE b = rb_funcall(rb_gv_get("$stdout"), rb_intern("output_buffer"), 0);
  buffer = RSTRING(b)->ptr;
}

printf("%s\n", buffer);

fun_call(”Programming Ruby in C is nearly as fun as programming Ruby in Ruby … although not quite as well documented. Use the source, Luke!”);

Metameta

Sunday, February 25th, 2007

Meta kommer fra gresk, μετά, og betyr der “etter/forbi/med” eller noe slikt, men også:

meta |ˈmetə|
adjective (of a creative work) referring to itself or to the conventions of its genre; self-referential.

[...]

A prefix meaning one level of description higher. If X is some concept then meta-X is data about, or processes operating on, X.

Ordet meta og dets betydning er egentlig ganske fascinerende. Jeg har grublet litt på det i ny og ne, og i dag kom igjen en ånd over meg, og jeg gikk nok en gang inn i en tankerekke omkring dette. Selv om meta-prefikset kan bety “forbi” (engelsk: beyond, forklarer kanskje hvorfor wordpress og andre blog-motorer har RSS-feeds under overskriften “meta”) og brukes om f.eks. et fagfelt hvor betydningen da blir en dypere, mer inngående studie av dette, er det meningen over jeg hovedsaklig tenker på: “en X om X”.

(more…)

Ubuntu på iBooken …

Wednesday, January 24th, 2007

Så tilbake til noe jeg gidder å skrive noe om … tror jeg. Ettersom jeg skulle holde foredrag i HiGLUG tenkte jeg at det var på tide å realisere en plan jeg har hatt i bakhodet over lengre tid, men som har blitt utsatt gang på gang, ettersom jeg faktisk klarer å leve ganske bra med OS X. Jeg installerte Ubuntu på iBooken min.

Jeg hadde på forhånd reinstallert OS X og partisjonert opp plass til Ubuntu, og alt så bra ut. Installasjonen gikk greit nok: jeg gikk tom for batteri under der en plass, men det gikk fint å starte installasjonen på nytt. Det som ikke gikk så fint var å benytte seg av plassen jeg hadde partisjonert opp. For å si det kort: jeg overskrev deler av partisjonen med OS X på, og endte opp med å være ute av stand til å det opp igjen. Jaja. Godt jeg ikke hadde tatt backup. Enda bedre at jeg har en backup liggende hjemme hos min far. Ikke fullt så bra at det er en ~20GB stor fil. Jaja. Tar det på sikt. Tror det verste som gikk tapt var musikk. Dokumentene jeg ikke hadde andre plasser har jeg ikke bruk for nå.

Back to the case: Ting fungerer for det meste smuud (nok). Suspend og slikt fungerer “ut av boksen”. Knapper for å justere lysstyrke på display, volum og ejecting av cdrom og slikt er også gull. Låsing av skjerm og slikt fungerer akkurat som man forventer at det skal. Etter å ha lekt litt med xmodmap har jeg også mappet om knapper slik at ting er på plasser jeg har blitt vant til å ha dem. I tillegg har jeg gjort det lettere å skrive greske symboler (du vet … αβφ osv) siden det er en del forelesere som liker å bruke dette i undervisningen. I samme slengen måtte jeg så klart mappe ♥ til en tast også.

Unntak: Touchpaden har ikke vært helt venn med meg. Jeg foretrekker tap for klikking, så slipper jeg å bruke knappen. Har ikke fått det til enda. Jeg har høyre- og hjulklikking ved å tappe med henholdsvis to og tre fingre, så hvorfor jeg ikke får tappe med én finger for venstreklikk. Jeg slet også en stund med at jeg ikke hadde to-finger-scrollingen som er i OS X, men det var heldigvis en opsjon til synaptics-driveren som het VertTwoFingerScroll som fikset biffen.

Unntak: wlan er tidvis noe herk. Broadcom fortjener å brenne for å være så teite som de er. Det er et prosjekt som baserer seg på å bruke firmwaren som er tilgjengelig i OS X, men det er ikke helt stabilt akkurat. Kjører f.eks. bare på 11Mb, og ikke 54, som kortet støtter. I tillegg hender det at driveren setter raten ned til 1Mb helt av seg selv og uten grunn. Å koble til wlan er en historie for seg selv. For å ha gode sjanser for at det skal gå må man skrive noe slikt som:

sudo iwconfig eth0 rate 11M
sudo iwconfig eth0 ap any
sudo iwconfig eth0 essid NETTVERKSNAVN
sudo ifup eth0

Trenger sikkert ikke alt, men det er like greit å kjøre hele besvergelsen, så har man hvertfall gjort det. Man har det så klart i et script.

Siden jeg likevel skulle bytte fra ett system til et annet fant jeg ut at jeg skulle prøve en annen vindusbehandler også. Har snust litt på wmii, og ettersom den er relativt lett å scripte i ruby er jeg allerede i gang. Tipper jeg kanskje skriver litt mer om det senere.

Sandkasse

Saturday, December 2nd, 2006

Så nå (eller riktigere, i går) har man levert “term paper” i faget “information security and security architechture” (eller noe borti der). Satser på at foreleseren er fornøyd nok til at det drar meg opp på et brukbart nivå i faget. Man må jo være ærlig: skolen er ikke det som går best for tiden. Uansett: jeg skrev et stykke om hvordan man kan “sandboxe” kode i språkene Ruby, Python og Perl. For de uinvidde handler dette om å ta et stykke kode man ikke stoler på, lage en sandkasse den kan leke i uten å forstyrre omverdenen, og kanskje til og med legge inn noen leker i denne sandkassen (gjerne ved å fjerne de farlige delene fra disse lekene først). Tror ikke det er noe superbra akkurat, men jeg har lagt det ut på nettstedet mitt.

Litt kode må man jo poste …

def try_insecure level=1, &blk
    Thread.new {
        $SAFE = level
        begin yield blk
        rescue SecurityError => e
            puts "Caught SecurityError: #{e}"
        end
    }.join
end

try_insecure(5) { File.open('snusk') } #Blammo!

Trikset her er “safe levels” i Ruby. Disse legger en del restriksjoner på hva som kan gjøres med koden din. Trikset er også at safe-nivået er “thread local”, altså at om man oppretter en tråd for å kjøre et stykke kode i, kan man sette et annet safe-nivå for denne kodesnutten enn for resten av koden. Med andre ord: en supersimpel sandkasse. Ikke så veldig bra kanskje, men nyttig nok i enkelte tilfeller.

Update: Fikk karakter av foreleseren. En “sterk” B (vel … bokstavkarakterer er jo i grunnen endelige, men han mente visst at om jeg hadde skrevet litt mer om teori, og ikke fokusert så mye på praksis, hadde den hatt sjanse på en A). Ganske bra med andre ord. Må si meg godt nøgd med det.

Binær kjærleik

Sunday, November 19th, 2006

Pump it in your terminal!

#!/usr/bin/ruby

color = "\e[31m"
normal = "\e[m"

DATA.readlines.each do |l|
    puts l.gsub(/(1+)/) { |m| color + m.to_s + normal }
end

__END__
0000000000000000000000000000000
0000011111110000000111111100000
0001111111111100011111111111000
0011111111111110111111111111100
0011111111111111111111111111100
0011111111111111111111111111100
0001111111111111111111111111000
0000011111111111111111111100000
0000000011111111111111100000000
0000000000011111111100000000000
0000000000000111110000000000000
0000000000000001000000000000000
0000000000000000000000000000000

PS: color = "\e[31m" kan fint byttes med color = '<span style="color: #f00;">' for en HTML-variant …

Kompaktifisering …

Tuesday, October 3rd, 2006

Gidder ikke å skrive om noe som er interessant, så jeg viser heller litt kompaktifisering:

Kode for å skrive ut de fem tingene som har høyest karma på #kopweb:

#!/usr/bin/env ruby
require 'open-uri'
LIST = 'http://mysil.fjasete.com/~rune/karma.html'

items = open(LIST).readlines
items.delete_if {|l| not l.match(/<tr>/) }

items[1..5].each do |i|
    word = i.match(/<td>([^<]+)<\/td>/)[1]
    karma = i.match(/\(([^\)]+)\)/)[1]
    puts “#{word}: #{karma}”
end

Så etter at man korter den ned litt:

#!/usr/bin/env ruby
require 'open-uri'
L = 'http://mysil.fjasete.com/~rune/karma.html'

open(L).readlines.delete_if {|l| not l.match(/<tr>/) }[1..5].each { |i|
    puts “%s: %s” % i.match(/<td>([^<]+)<\/td>[^\(]+\(([^\)]+)\)/)[1..2]
}

Har egentlig ikke noe poeng med denne posten … Koden er ikke kortere en gang, bare tettere.

Dagens tåpelige kode

Thursday, September 28th, 2006

Noen i klassen hadde det morsomt med å se hva folk søkte på på Kvasir (bruker folk faktisk kvasir? o_0), så jeg fant ut jeg skulle komme meg inn på den listen mens de holdt på.

require 'open-uri'
100.times do
    begin
        open('http://www.kvasir.no/nettsok/searchResult.html?searchExpr=mordi')
    rescue EOFError # Hender den ikke klarer å lese hele siden ...
        puts "LOL"; retry
    end
end

Umogeleg oppdrag

Wednesday, September 20th, 2006

Jeg så Mission Impossible 3 hos Bjørn og Linda i går, sammen med Lars (sånn, da har jeg nevnt alle, til og med at Kristian kom innom senere for å skade figuren Bjørn har i Amped 3). Poenget mitt var: etter å ha sett filmen sa Bjørn:

Neste gang du skal gi meg en beskjed, skal du gi meg en beskjed som selvdestruerer innen kort tid.

Vel … jeg presenterer: self.destruct.rb

#!/usr/bin/env ruby

def self.destruct!
    File.delete __FILE__
end

puts DATA.read
sleep 5
self.destruct!

__END__
This is a secret message.
It will self destruct in 5 seconds.