programmer@work

robe da informatici

World of Warcraft leaderboards: is arena PvP balanced?

I’ve created a little script in Ruby to grab some data from the World of Warcraft 2v2 and 3v3 PvP leaderboards. On Github you can find the source code of the script:

This script parse these leaderboards pages https://worldofwarcraft.com/en-gb/game/pvp/leaderboards/2v2 and count for every class the number of players. Then generate a pie graph to see which classes are most frequent in the leaderboards.

If you run the script with the command ruby wowpvpstats.rb after few seconds you can find two png images like these:

2v2 graph

and

3v3 graph

Now you can easily see which classes are more present in the leaderboards: druids, shamans and monks dominate the leaderboard while mages and hunters suck. So, what do you think? Is this PvP balanced?

Il numero 666

Oggi vi voglio parlare di qualcosa di diverso dall'informatica, qualcosa di carattere storico, biblico. Parliamo del famoso numero 666. Tanti lo associano al diavolo, ma in realtà si riferisce ad una persona. Vediamo questo breve passo dell'Apocalisse di San Giovanni (Ap 13,16-18):

Faceva sì che tutti, piccoli e grandi, ricchi e poveri, liberi e schiavi ricevessero un marchio sulla mano destra e sulla fronte; e che nessuno potesse comprare o vendere senza avere tale marchio, cioè il nome della bestia o il numero del suo nome. Qui sta la sapienza. Chi ha intelligenza calcoli il numero della bestia: essa rappresenta un nome d'uomo. E tal cifra è seicentosessantasei.

Parafrasando: quest'uomo faceva in modo che tutti, piccoli e grandi, ricchi e poveri, liberi e schiavi venissero plagiati nel lavoro e nella mente, nel pensiero; e che nessuno potesse vivere senza essere plagiato (nessuno è più libero). E qui sta la sapienza, nel capire chi è il male. Chi è intelligente calcoli il numero della bestia: questa bestia è un uomo malvagio. E questo numero è il 666.

Si pensa che questo uomo sia l'imperatore romano Cesare Nerone che era al potere nei primi anni dopo la morte di Cristo; si pensa infatti che il numero 666 non sia altro che il multigramma di calaba ebraica, un modo per scrivere le lettere con i numeri; infatti come in greco antico, così anche in alfabeto ebraico i numeri venivano scritti usando le lettere, secondo, appunto la cabala ebraica. Prendendo dunque le consonanti del nome QeSaR NeRON (קסר נרון) si ha:

Q (qof)     = 100
S (sameckh) = 60
R (resh)    = 200
N (nun)     = 50
R (resh)    = 200
O (waw)     = 6
N (nun)     = 50

se sommiamo le cifre otteniamo il numero 666 (la vocale O è in realtà legata alla consonante W che è una mater lectionis, cioè una consonante che serviva a evitare equivoci nella lettura). Ovviamente questa è un'ipotesi degli studiosi, infatti la gematria (cioè l'utilizzo della corrispondenza fra numeri e lettere dell'alfabeto ebraico, greco o latino) può produrre molti risultati diversi e costituisce più un gioco intellettuale che uno strumento d'indagine.

Comunque quello che mi preme dire è che Nerone era in quel tempo il capo dell'Impero Romano dove girava tutta l'economia e il denaro. Quindi mi vien da pensare che la “bestia”, il male, che solo i sapienti riusciranno a riconoscere, è il denaro.

Ruby Module include vs prepend

Oggi cerchiamo di capire un po' meglio la differenza tra i metodi Module#include e Module#prepend. Vediamo la differenza con un esempio mooolto semplice:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Person
  def name
    # return name here
    puts 'Call method name in class Person'
  end
end

module Superhero
  def fly
    # fly here
    puts 'Call method fly in module Superhero'
  end

  def name
    # return name here
    puts 'Call method name in module Superhero'
  end
end

Person.include(Superhero)

Person.new.name

Cosa abbiamo fatto? Allora abbiamo la classe Person con un metodo name. Poi abbiamo il modulo Superhero con due metodi: fly e name. Notare a questo punto che sia la classe Person che il modulo Superhero hanno entrambi un metodo che si chiama name. Ora andiamo a mixare la classe Person con il modulo Superhero usando il metodo include. Se invochiamo il metodo name su un oggetto di tipo Person vedremo che viene chiamato il metodo definito dentro la classe Person e non quello definito nel modulo Superhero. Questo ci potrebbe anche andare bene, ma a volte vorremmo che quando facciamo questo tipo di operazione i metodi del modulo che mixiamo sovrascrivessero (override) i metodi della classe, come succede quando estendiamo una classe. Per ottenere questo usiamo il metodo prepend al posto di include disponibile dalla versione 2 di Ruby.

1
2
3
Person.prepend(Superhero)

Person.new.name

Adesso vediamo che viene invocato il metodo name definito nel modulo Superhero.

Edit git last commit

Oggi mi è capitato questa situazione mentre stavo fixando una issue di Chess, una mia gemma per Ruby su github: in pratica ho fixato il problema e ho fatto un commit git commit -am "fix issue bla bla". Mi sono poi accorto che non ho aumentato il numero di versione della gemma e che quindi non potevo pusharla su Rubygems. A questo punto potevo modificare il numero di versione e fare un secondo commit, ma questo non mi andava, mi sarebbe piaciuto modificare l'ultimo commit e includere la modifica del file version.rb.
Come fare? Facciamo la nostra modifica al file version.rb aumentando la versione della gemma e committiamo il tutto con il comando:

git commit -a --amend --no-edit

Bene! Abbiamo modificato l'ultimo commit. Ultima cosa da aggiungere: se avevate già fatto il push dell'ultimo commit lo SHA-1 di questo sarà cambiato dopo questa operazione e quindi bisognerà pushare le modifiche usando l'opzione --force

git push -f  

Ruby's predefined variables: DATA

Ho scoperto da poco che tra le variabili predefiniti di Ruby ne esiste una che si chiama DATA. È molto interessante.
In un file sorgente Ruby tutto quello che segue __END__ diventa una specie di file virtuale e può essere letto appunto tramite la variabile predefinita DATA. Ecco un esempio:

1
2
3
4
5
6
7
8
puts DATA.read.split("\n")
__END__
tomatoes
potatoes
milk
beer
salt
beer again