lug 14

Cronache dal dinfo

Sono quasi le 3 di notte… in preda all’insonnia per qualche stranissimo motivo mi è venuto in mente un post che ho scritto due anni fa in un forum per descrivere una mattinata persa per le segreterie del dinfo, lo riscrivo qui, sono cose che vanno condivise, se non altro perchè sono divertenti.

E quelli di voi che frequentano quel lugubre posto si renderanno conto che in due anni non è cambiato nulla a parte il colore della facciata che da grigio sporco e passato a grigio

per comodità ( mia fondamentalmente) sostituirò il nome del professore con $simpaticone

Lunedì 22 Settembre 2008

Mi alzo di buon ora (o quasi) e decido di andare al Dinfo a caccia di informazioni
visto che col sito down siamo tornati al medioevo.
Vado al terzo piano e busso alla segreteria, nessuna risposta.
Busso di nuovo, ancora nessuna risposta.
Decido che è il caso di intrufolarmi e aspetto il primo che entra per andargli dietro
Arriva un tipo che porta dei pacchi e gli vado dietro, lui mi guarda e mi fa:
“Ha un appuntamento con un professore?”
“Veramente no”
“Allora mi dispiace ma ci è stato detto di non far entrare nessuno”
“…è perche l’anno scorso vi hanno fregato la macchinetta del caffe?”
sguardo gelido e nessuna risposta.
Rispondo con un sorriso ebete allo sguardo gelido e indietreggio facendo chiudere la porta.
Aspetto il prossimo passaggio…
Stavolta entra uno che sembra un collega e gli vado dietro ,stavolta niente proteste
trovo un cartello con la scritta “NON BUSSARE” nella prima porta a destra e sono tentato di bussare anche se non mi interessa quella porta…
ma poi vado dritto verso l’ufficio del $simpaticone e busso li

nessuna risposta

continuo dritto verso la porta centrale alla fine del corridoio
la porta è aperta e c’è un tipo che sembra star prenotando a un agriturismo via telefono
entro e non mi degna di uno sguardo, lo saluto e non mi risponde
decido di aspettare che finisca la telefonata continuando a fissarlo
finisce la chiamata e gli chiedo:
“Stavo cercando $simpaticone o un suo assistente a caso”
“non c’è nessuno”
“Mi scusi…ma quando riceve $simpaticone?”
“Quando vuole Dio”
al che decido che non mi resta che andarmene.
Nella strada del ritorno si mette pure a piovere

Share Button

giu 16

Benvenuti

Benvenuti nel nuovo sito

Adesso che funziona non mi resta che rendere decente ( e personale) la grafica

Share Button

mag 14

Disattivare le Gif animate!

Negli ultimi due giorni è scoppiata su Facebook la moda delle GIF animate, e per il solito meccanismo di condivisione compulsiva tipico di Facebook adesso mi ritrovo la bacheca che sembra un blog bimbominkia di windows live piena di animazioni tenere e sbrillucicose di conigli che saltellano e di rose rosse.

Vediamo come si possono bloccare velocemente le animazioni prima di provocare emicrania o manie omicide:

Mozilla Firefox

Semplicemente pressate Esc sulla pagina
Se non avete interesse a un blocco definitivo bassa pressare Esc sulla pagina, si deve fare ogni volta che cambiate pagina durante la navigazione

Utilizzare la Web Developer Toolbar (consigliato)
La Web Developer Toolbar è un utilissima estenzione di firefox che permette di analizzare e modificare il comportamento delle pagine, pensata per aiutare gli sviluppatori può essere usata per fare un sacco di cose tra cui bloccare le immagini, tutte o solo quelle animate.
Una volta installata https://addons.mozilla.org/it/firefox/addon/60/ basterà andare su Immagini|Disattiva|Animazione immagini per abilitare o disabilitare il blocco

Modificare il file di configurazione
Se per qualche motivo non volete usare la Web Developer toolbar potete andare alla pagina about:config e modificare il valore image.animation_mode a none.
Per riattivarle settatelo a normal

Opera

Molto molto semplice, da una pagina qualunque pressate F12 e attivate o disattivate Riproduci le immagini animate

Internet Explorer

Semplicemente pressate Esc sulla pagina
Se non avete interesse a un blocco definitivo bassa pressare Esc sulla pagina, si deve fare ogni volta che cambiate pagina durante la navigazione

Solita opzione sperduta nei menù in stile Microsoft:
andate su Strumenti|Opzioni Internet|Avanzate|Elementi Multimediali|Riproduci animazioni in pagine web e attivatela o disattivatela, richiede riavvio del browser

Chrome

Non ne ho assolutamente la minima idea e la cosa mi secca molto

per concludere eccovi una fastidiosa pagina sbrilluccicosa per provare:

http://www.gifandgif.com/gif_animate/Amore/

Share Button

feb 24

Schema per la risoluzione di qualunque problema lavorativo

Schema per la soluzione di qualunque problema lavorativo

Share Button

feb 20

Algoritmi sulle permutazioni, articolo in PDF

Ho tratto un articolo dai vari post sugli algoritmi per la generazione di permutazioni.

Gli argomenti trattati sono:

1 Algoritmo iterativo per generare permutazioni in ordine lessicografico
2 Algoritmo ricorsivo per generare permutazioni
3 Algoritmo degli scambi semplici (Plain changes – Johnson-Trotter)
4 Determinare una specifica permutazione dall’insieme delle permutazioni
4.1 I Factoradic
4.2 Interpretazione dei codici di Lehmer
4.2.1 Algoritmi per la generazione di un Factoradic
4.3 Generazione di permutazioni casuali con i factoradic
5 Ricavare il numero di una permutazione (ranking)
6 Generare permutazioni casuali (algoritmo di Fisher-Yates o Knuth shuffle)
6.1 Problemi di bias

Il testo è rilasciato sotto licenza Creative Commons Leggi il resto »

Share Button

feb 18

Algoritmo degli scambi semplici (Plain changes – Johnson-Trotter)

L’algoritmo degli scambi semplici è l’algoritmo più efficiente per generare permutazioni, le permutazioni vengono generate con un singolo scambio, quindi costituiscono un codice Gray.

L’algoritmo è stato ideato nel diciassettesimo secolo in Inghilterra da parte di alcuni suonatori di campane che avevano sviluppato il buffo passatempo di suonare le campane secondo tutte le permutazioni possibili.

Le prime traccie scritte di questo algoritmo risalgono al 1653 ed è trattato in maniera estensiva nel libro Tintinnalogia del 1668 che gli dedica addirittura 60 pagine…Le prime implementazioni informatiche documentate risalgono invece al 1962 ad opera di H. F. Trotter e al 1963 con S.M. Johnson
ed è per questo che l’algoritmo è noto anche come l’algoritmo di Johnson-Trotter.

L’algoritmo opera facendo in modo che solo una coppia venga scambiata ad ogni permutazione e che la coppia sia sempre formata da elementi adiacenti.
L’idea da cui nasce l’algoritmo è che si possano generare le permutazioni di un vettore di n elementi scegliendo dei sottovettori di n-1 elementi e facendo scorrere l’n-esimo elemento all’interno dei sottovettori.
Quando l’n-esimo ha percorso l’intero sottovettore, si calcola la prossima permutazione del sottovettore e si fa scorrere l’n-esimo elemento in senso contrario.
Per implementare questa procedura si usa un secondo vettore che contiene le direzioni di mobilità possibili (il vettore D) che vengono settate a 1 (mobile a destra) o a -1 (mobile a sinistra).
Un singolo elemento è mobile soltanto se nella direzione della sua mobilità (vettore D) l’elemento successivo è inferiore dell’elemento corrente (in particolare il primo elemento non è mai mobile a sinistra e l’ultimo non è mai mobile a destra).
Si usa inoltre un vettore degli scambi (vettore C) il cui n-esimo elemento rappresenta il numero di elementi minori di n che stanno alla sua destra. Confrontando le variazioni del vettore C con la direzione di mobilità contenuta nel vettore D si può ottenere lo scambio da eseguire per arrivare alla permutazione successiva.

a questo punto l’algoritmo agisce in questo modo:

Finchè esistono elementi mobili se ne trova il maggiore e lo si inverte con l’elemento successivo nella direzione di mobilità e si inverte la direzione di mobilita di tutti gli elementi alla sua destra

Esecuzione dell'algoritmo degli scambi semplici su un insieme di 4 elementi

Esecuzione dell'algoritmo degli scambi semplici su un insieme di 4 elementi

n
Factoradic
Permutazione (Semplice)

Permutazione (Plain Changes)

Vettore degli scambi

Vettore delle direzioni

0
0000
[ 1,2,3,4 ]
[ 1,2,3,4 ]
[ 0,0,0,0 ]
----
1
0010
[ 1,2,4,3 ]
[ 1,2,4,3 ]
[ 0,0,0,1 ]
----
2
0100
[ 1,3,2,4 ]
[ 1,4,2,3 ]
[ 0,0,0,2 ]
----
3
0110
[ 1,3,4,2 ]
[ 4,1,2,3 ]
[ 0,0,0,3 ]
----
4
0200
[ 1,4,2,3 ]
[ 4,1,3,2 ]
[ 0,0,1,3 ]
+---
5
0210
[ 1,4,3,2 ]
[ 1,4,3,2 ]
[ 0,0,1,2 ]
-+--
6
1000
[ 2,1,3,4 ]
[ 1,3,4,2 ]
[ 0,0,1,1 ]
--+-
7
1010
[ 2,1,4,3 ]
[ 1,3,2,4 ]
[ 0,0,1,0 ]
---+
8
1100
[ 2,3,1,4 ]
[ 3,1,2,4 ]
[ 0,0,2,0 ]
----
9
1110
[ 2,3,4,1 ]
[ 3,1,4,2 ]
[ 0,0,2,1 ]
----
10
1200
[ 2,4,1,3 ]
[ 3,4,1,2 ]
[ 0,0,2,2 ]
----
11
1210
[ 2,4,3,1 ]
[ 4,3,1,2 ]
[ 0,0,2,3 ]
----
12
2000
[ 3,1,2,4 ]
[ 4,3,2,1 ]
[ 0,1,2,3 ]
++--
13
2010
[ 3,1,4,2 ]
[ 3,4,2,1 ]
[ 0,1,2,2 ]
++--
14
2100
[ 3,2,1,4 ]
[ 3,2,4,1 ]
[ 0,1,2,1 ]
+-+-
15
2110
[ 3,2,4,1 ]
[ 3,2,1,4 ]
[ 0,1,2,0 ]
+--+
16
2200
[ 3,4,1,2 ]
[ 2,3,1,4 ]
[ 0,1,1,0 ]
-+--
17
2210
[ 3,4,2,1 ]
[ 2,3,4,1 ]
[ 0,1,1,1 ]
-+--
18
3000
[ 4,1,2,3 ]
[ 2,4,3,1 ]
[ 0,1,1,2 ]
--+-
19
3010
[ 4,1,3,2 ]
[ 4,2,3,1 ]
[ 0,1,1,3 ]
--+-
20
3100
[ 4,2,1,3 ]
[ 4,2,1,3 ]
[ 0,1,0,3 ]
+--+
21
3110
[ 4,2,3,1 ]
[ 2,4,1,3 ]
[ 0,1,0,2 ]
-+-+
22
3200
[ 4,3,1,2 ]
[ 2,1,4,3 ]
[ 0,1,0,1 ]
--++
23
3210
[ 4,3,2,1 ]
[ 2,1,3,4 ]
[ 0,1,0,0 ]
--++
Permutazioni di un insieme di 4 elementi generate secondo i vari algoritmi descritti
public  void list_all(){
	 int n=this.len;
	 do{
		 flag=true;
		 System.out.println(Array_util.dump(elementi));
		 j=n-1;
		 s=0;
		 do{
			 q=c[j]+d[j];
			 if(q==1 && j==0)return;
			 if(q>=0 && q!=(j+1)){
				 Array_util.swap(elementi, j-c[j]+s, j-q+s);
				 c[j]=q;
				 flag=false;
			 }else{
				 if(q==j+1)s++;
				 if(q<0 || q==j+1){
					 d[j]=-d[j];
					 j--;
				}
			 }
		 }while(flag);
	 }while(true);
}

ma la parte divertente deve ancora arrivare: ho fatto suonare l’algoritmo su una scala pentatonica e ne ho generato un midi

Share Button

gen 10

Ruby portabile

Finalmente qualcuno ha pensato di fare una cosa che cercavo da tempo.

Una versione di ruby autopartente e senza dipendenze esterne che permette di poter utilizzare in maniera semplice ed immediata gli script che usano la libreria standard senza bisogno di installare alcun software.

Il pacchetto è disponibile per Linux, Windows e MacOsX ed rilasciato sotto licenza GNU GPL

E’ possibile scaricarlo da questa pagina.

Per avviare uno script è sufficiente estrarre l’interprete e metterlo nella stessa cartella dello script, e poi avviarlo da terminale ( o in maniera grafica spostando lo script sopra l’eseguibile)

Share Button

nov 07

Programmazione, compiti svolti

Publico i miei svolgimenti di alcuni esami di programmazione da 9cfu del corso di ingegneria informatica di Palermo sperando che siano utili a qualcuno.

Le implementazioni sono tutte in C++ ANSI, l’ambiente di sviluppo usato e Dev-Cpp (non perché mi piacesse…semplicemente era l’IDE che avrei usato durante l’esame e quindi era bene che mi abituassi alle sue stranezze, adesso è un ambiente passabile ma la versione 4 che usavo era orrenda). inoltre uso il più possibile le STL (il mio corso non prevedeva la scrittura di strutture di dati)

Tipicamente nei compiti uso un file main, un file di header con tutti i prototipi e un file cpp con tutte le implementazioni, genericamente non è una buona idea ma per cose così piccole è inutile fare le cose in maniera scalabile

Testo del compito

PROGRAMMAZIONE (9 CFU)
SIMULAZIONE DI UNA BATTUTA DI CACCIA.
Scrivete un programma per la simulazione di una battuta di caccia in base alle specifiche sotto riportate.
La battuta di caccia si svolge in una riserva, che per semplicità si suppone quadrata e di dimensione 3000×3000, nella quale sono presenti 50 lepri e 10 cinghiali inizialmente disposti in posizione casuale e con direzione di moto casuale.
I cinghiali si muovono in linea retta con velocità costante di 2,5 m/s fino a quando non raggiungono il confine della riserva; in questo ultimo caso cambiano direzione in maniera casuale.
Le lepri si muovono a intermittenza. Si muovono in linea retta con velocità di 4m/s e direzione casuale per 5 secondi, poi stanno fermi per cinque secondi, poi si muovono per altri 5 secondi con una nuova direzione casuale e così via.
Nella riserva sono anche presenti 3 cacciatori che vengono inizializzati in posizione casuale e non si muovono durante la simulazione. Quando un animale si trova a distanza inferiore a 25 m da un cacciatore viene catturato.
Alla fine della battuta di caccia (dopo 7200 secondi) stampate il numero di cinghiali e di lepri catturate da ciascun cacciatore.

Diagramma UML della mia soluzione

Diagramma UML

Diagramma UML, (clicca per lo zoom)

Leggi il resto »

Share Button

set 24

Ricavare il numero di una permutazione (ranking)

questo articolo è la continuazione del articolo sulla determinazione di una specifica permutazione e affronta il problema inverso:

determinare la posizione di una specifica permutazione nell’insieme delle permutazioni ordinate lessicograficamente.

Ancora qualcosa sull’interpretazione dei codici di Lehmer

I singoli termini del codice di Lehmer si possono anche interpretare come il numero di elementi che si trovano “al posto sbagliato”, cioè il numero di elementi minori dell’elemento preso in esame che si trovano alla sua destra (e che quindi violano l’ordinamento crescente degli elementi).

Applicando questo teorema è possibile ricavare il codice di Lehmer di una permutazione e dal codice ricavare la posizione della permutazione.

Generazione del codice di Lehmer

“i singoli elementi del codice di Lehmer sono costituiti dal numero di elementi minori dell’elemento che si trovano alla sua destra”

    public static int[] inverseLehmer(int[] v){
        int n=v.length;
        int[] lh=new int[n];
        lh[n-1]=0;
        for (int a=0; a&lt;n-1; ++a){
            int i = 0;
            for (int b=a; b&lt;n; ++b)
                if ( v[b]&lt;v[a] ) i++;
            lh[a] = i;
        }
        return lh;
    }

Calcolo della posizione della permutazione (conversione da factoradic a numero)

    public static int rank(int[] permutazione){
        int[] l=inverseLehmer(permutazione);
        int f=1;
        int r=0;
        int n=permutazione.length;
        for(int a=1;a&lt;(n+1);a++){
            r=r+f*l[n-a];
            f=f*a;
        }
        return r;
    }
Share Button

set 19

Determinare una specifica permutazione dall’insieme delle permutazioni

questo articolo è la continuazione del articolo precedente sulle permutazioni.

Potrebbe essere necessario determinare una singola permutazione dall’insieme delle permutazioni ordinate e inutile determinarle tutte.

Come si affronta questo problema? ogni informatico sano di mente scarterebbe nel giro di un paio di secondi la possibilità di generare tutte le permutazioni fino a quella cercata (ma non preoccupatevi…se non avete scartato entro due secondi potete comunque laurearvi in molte università e dire in giro di essere degli ingegneri del software).

Dunque, riformuliamo il problema: come fare per determinare una specifica permutazione in tempo costante o quantomeno proporzionale al numero di elementi del dominio?

La soluzione risiede nell’uso dei factoradic (termine che non so proprio come tradurre in italiano)
Leggi il resto »

Share Button

Post precedenti «

» Post successivi