Show Posts

This section allows you to view all posts made by this member. Note that you can only see posts made in areas you currently have access to.


Messages - CrashTest

Pages: [1] 2 3 ... 5
1
2D / Re:Ridimensionamento immagine
« on: April 06, 2017, 06:40:46 PM »
Va bene, ora cerco qualcosa su quell'algoritmo ahahah. Grazie mille :D

2
2D / Re:Ridimensionamento immagine
« on: April 06, 2017, 08:35:59 AM »
Diciamo che dello scaling di uno sprite quando ridimensioni una immagine se ne occupa il renderer in automatico, a me serve scrivere un algoritmo che faccia questo.
È per scopi didattici piuttosto che pratici, appoggiarmi a qualcosa di pronto non risolve il mio problema.
Una soluzione per ricostruire l'immagine scalata sarebbe prendere un punto e fare un subsampling come si deve usando un filtro passa basso (gaussian blur) insieme ad una decimazione che prende un punto sì qualche punto no, ma è una cosa troppo complessa. Oppure se avessi usato OpenGL avrei potuto fare una piramide con dei livelli di mip mapping che contengono diverse versioni subsampled e userei un filtro trilineare che prende due immagini a diversa risoluzione per variare la scala in maniera più morbida. Di soluzioni, appoggiandosi ad API e motori grafici ce ne sono, a me però serve studiare un sistema per farlo partendo da zero e le prime soluzioni che ho trovato sono state le due interpolazioni: bilineari e nearest-neighbor

3
2D / Ridimensionamento immagine
« on: April 05, 2017, 09:49:09 PM »
Sera ragazzi,

scusate il lungo periodo di assenza ma in questo periodo sono molto impegnato con l'uni.
Sono qui perchè ho un piccolo problema. Qualcuno ha mai avuto a che fare con l'elaborazione di immagini? Devo scalare uno sprite per un videogioco (ma una immagine qualunque fa lo stesso) per fare in modo che si ridimensioni in base alla grandezza della finestra. Non posso usare nessuna libreria ad hoc, nessun motore grafico, niente di niente. Solo C++ ed una libreria multimediale (SFML). Per fare questo sto immaginando l'immagine come una serie di punti in uno spazio euclideo a due dimensioni. Essendo una immagine raster, in caso di trasformazioni geometriche questa è soggetta a perdita di qualità.

Per scalare l'immagine e ricostruire i colori avevo pensato di usare l'interpolazione che mi permette approssimare il valore di una funzione nell' intorno di un punto. Essendo l'immagine in un piano a due dimensioni ho pensato ad una interpolazione bilineare (semplicemente una interpolazione lineare ma in funzione di due variabili, in questo caso x ed y, gli assi del piano) che dato un punto -in questo caso sarebbe il pixel- analizza i pixel più vicini per trovare il miglior valore RGB per quel punto. Parlando con un ragazzo però, è uscita fuori l'interpolazione nearest-neighbor che a differenza della bilineare dovrebbe essere più semplice da implementare. Ora sono ancora più confuso di prima, quale sistema secondo voi è più preciso? Avete qualche suggerimento?

4
Introduce yourself - Presentazioni / Re:Ciao a tutti!
« on: April 05, 2017, 09:46:09 PM »
Benvenuto Giovanni. Sei al primo anno di ingegneria? Ho sentito che siete parecchi tarantini al PoliTo. Comunque come valida alternativa a Unity hai UnrealEngine :D

5
Io sono favorevole, Pubblicità non invasive e che non influenzino la leggibilità del sito sono un ottimo strumento per avere benefici per tutta la comunità. Io lo vedo come un mezzo di sopravvivenza ed auto sovvenzionamento del progetto JonixLUG.

6
Tools / Valgrind - Breve introduzione
« on: March 15, 2017, 07:23:33 PM »
Ciao a tutti, in questo post daremo uno sguardo veloce a Valgrind per capire cosa è e a cosa serve. Nei prossimi articoli analizzeremo nel dettaglio i diversi tools e vedremo come utilizzarli al meglio.

Valgrind è uno strumento multiuso, un coltellino svizzero dei programmatori. Questo ci aiuta nei casi più disparati: dal profiling al debugging della memoria per Linux.Inizialmente era disponibile per x86, dalla versione 3 lo è anche per AMD64 ed altre architetture. Valgrind ci permette di eseguire il nostro programma nel suo ambiente che controlla l'utilizzo della memoria, come ad esempio le chiamate a malloc o free (o new e delete nel caso di C++). Se si scrive fuori la fine di un array, ci si dimentica di liberare un puntatore o altri errori o sviste di questo tipo, Valgrind è in grado di rilevarlo. Dal momento che questi sono problemi abbastanza comuni, vedremo come utilizzare Valgrind per trovare questi tipi di problemi di memoria, anche se Valgrind è uno strumento molto più potente e che può fare molto di più.

Il comando per lanciare Valgrind è:

Code: You are not allowed to view links. Register or Login
$ valgrind --tool=nome_tool program_pathnome_tool è il nome dello strumento da usare e program_path è il percorso del programma da lanciare con Valgrind.
I tools più conosciuti ed utilizzati sono:

  • Memcheck
  • Addrcheck
  • Massif
  • Cachegrind
  • Callgrind
  • Helgrind

Memcheck è un rilevatore di errori in memoria. Aiuta ai programmatori a scrivere programmi (specialmente in  C e C ++) consistenti e senza problemi in memoria.

Addrcheck è una versione semplificata ed alleggerita di Memcheck. È identico a MemCheck in tutto e per tutto, ad eccezione di un dettaglio importante: non fa controlli sugli Undefined values. Questo significa che Addrcheck è più veloce di Memcheck ed utilizza meno risorse (in termini di memoria e processore).

Massif  è un profiler dell'heap. Ci permette di analizzare lo stato dello heap e ci permette quindi di scrivere programmi che utilizzano meno memoria.

Cachegrind è un profile che si occupa principalmente della cache e della predizione delle diramazioni. Ci aiuta a creare programmi più veloci e performanti.

Callgrind invece è uno strumento di profiling mantiene uno storico delle chiamate tra le funzioni in esecuzione in un programma, una sorta di grafo delle chiamate.

Helgrind è un rivelatore di errori nei thread. Ci aiuta a fare i programmi multi-threaded più corretto.

Nel prossimo post vedremo come usare Memcheck e Addrcheck, nel frattempo vi saluto e vi invito segnalare eventuali errori.
Saluti, CrashTest

Fonte: You are not allowed to view links. Register or Login

7
Crittografia / Re:Piccoli chiarimenti sulla chat segreta di Telegram
« on: March 08, 2017, 10:30:15 PM »
Bene, articolo interessante! È un dettaglio che sfugge a molti (me medesimo)!

8
Java / Re:Da jar a exe senza rivelare i sorgenti
« on: February 24, 2017, 10:09:40 AM »
You are not allowed to view links. Register or Login
E quindi anche se il codice è incompleto quale sarebbe il problema ad esporlo? Se un utente del tuo programma è abbastanza in gamba da recuperare il codice originale dal jar, sarà anche abbastanza in gamba da capire che se era commentato non è da eseguire!
In più, non sono convinto che nei file .class vengano compilati anche i commenti!
Che io sappia i commenti non vengono inclusi nel processo di compilazione, vengono eliminati in fase di pre-processing o nei primi step lasciando spazio solo al codice funzionale. In più, dando uno sguardo veloce per sicurezza al You are not allowed to view links. Register or Login non compare alcuna voce riguardante i commenti

9
Sicurezza Informatica / Re:Il significato di backup
« on: February 11, 2017, 06:07:17 PM »
La apple ha eliminato il taglio da 8gb mi pare, parte da 16

10
Sandbox / prova tag code
« on: February 11, 2017, 05:59:35 PM »
Code: (php) You are not allowed to view links. Register or Login
<?php
$a
=6;
echo 
$a;
?>


Code: (c) You are not allowed to view links. Register or Login
#include<stdio.h>

int main(void)
{
    printf("hello world");
}

Col php funziona il syntax highlighting usando "code=php", con gli altri no ahah

11
Sandbox / Re:prova latex
« on: February 11, 2017, 05:57:56 PM »
Ah, bene ahahah. Almeno si mantiene l'ordine

12
Sandbox / Re:prova latex
« on: February 11, 2017, 05:45:07 PM »
Immagino :D Però se continui così tra poco avremo 319389 bottoni sull'editor ahah

13
Sandbox / Re:prova bbcode php
« on: February 11, 2017, 05:41:46 PM »
Mmmmmh, io col PHP non ho problemi. Per il syntax highlighting usi quello di default? Io pensavo di estenderlo in questo senso
Quote
["code=lang"]
dove lang è un linguaggio qualsiasi che viene evidenziato, questo per non avere numerosi tag.
Ovviamente senza apici, le metto per non far interpretare il tag

14
C / Ottimizzazione - piccoli accorgimenti
« on: February 11, 2017, 05:38:08 PM »
Salve a tutti, ultimamente, lavorando ad un programma in C, mi è capitato di avere a che fare con qualche piccolo accorgimento riguardante l'ottimizzazione. Ho trovato poche informazioni in italiano quindi ho studiato dalle documentazioni di GCC e da vari articoli che parlano degli "internals" del linguaggio, decidendo di condividere questi, anche se piccoli, accorgimenti con voi: potrebbero tornarvi utili :D
Cercherò di essere il più chiaro possibile ed evitare fraintendimenti. Per comprendere questo articolo sono richieste delle conoscenze base relative ad array e puntatori.
Bene, dopo questa noiosa introduzione passiamo al dunque.

Nell'ottimizzazione di un programma, una delle prime cose da considerare è l'uso di array e indici. Per accedere ad un elemento di un array usando gli indici il compilatore dovrà eseguire una serie di calcoli, soprattutto moltiplicazioni. Il mio consiglio se si vuole ottimizzare un programma che fa largo uso di array è quello di vedere queste strutture per quello che realmente sono: un puntatore al primo elemento al quale applicare l'aritmetica dei puntatori. A primo impatto questo tipo di approccio potrebbe sembrare ostico, ma è abbastanza semplice, basta solo ragionarci un po' e una volta entrati nell'ottica diventa come contare normalmente. Usando l'aritmetica dei puntatori, l'incremento di un puntatore si riduce ad una banale somma che richiede molte meno risorse computazionali.
Snippets come quelli dell'esempio sottostante sarebbe meglio evitarli se il nostro obbiettivo è fare un programma molto più veloce ed ottimizzato.
Code: You are not allowed to view links. Register or Login
void somma_elementi(int *primo, int *secondo, int *somma, int elementi)
{
  for(int i = 0; i < elementi; i++)
    somma[i] = primo[i] + secondo[i] ;
}

Un'alternativa del tutto equivalente a questo codice (anche se migliorabile) potrebbe essere questa:
Code: You are not allowed to view links. Register or Login
void somma_elementi(int *primo, int *secondo, int *somma, int elementi)
{
  for(int i = 0; i < elementi; i++)
    *(somma + i) = *(primo + i) + *(secondo + i);
}

Possiamo notare come questo codice potrebbe essere riscritto in maniera leggermente differente e più chiara utilizzando l'operatore di post-incremento ottenendo uno snippet di questo tipo:
Code: You are not allowed to view links. Register or Login
void somma_elementi(int *primo, int *secondo, int *somma, int elementi)
{
  for(int i = 0; i < elementi; i++)
      *(somma++) = *(primo++) + *(secondo++);
}

Riflettendoci un attimo possiamo notare che le operazioni di post-incremento sono leggermente più lente di quelle di pre-incremento: questo perchè il compilatore è obbligato a conservare una copia del vecchio valore, restituirlo non ancora incrementato, eseguire il codice ed effettuare l'incremento. Se si tratta di poche iterazioni tutto questo non ha un peso rilevante, ma vi posso assicurare che su un numero eleveto di iterazioni la differenza in termini di prestazioni e complessità computazionale si nota. Per questo sono arrivato ad una soluzione che usi solo l'aritmetica dei puntatori e il pre-incremento.
Questo dovrebbe essere il risultato finale:
Code: You are not allowed to view links. Register or Login
void somma_elementi(int *primo, int *secondo, int *somma, int elementi )
{
    --primo;
    --secondo;
    --somma
    for(int i = 0; i < n; i++)
        *(++somma) = *(++primo) + *(++secondo);
}

Nello snippet qui sopra ho decrementato i puntatori per poi incrementarli nel ciclo for senza perdere informazioni. Arrivato a questo punto ero contento del mio programma perchè ero riuscito a ottimizzarlo e a compattare il codice. Però non è finita qui: c'è un grave errore nel mio programma, riuscite a notarlo da soli? Ok, ve lo dico nel caso non lo aveste notato. Parlando con un amico e rileggendo un attimo il manuale dell'ANSI C, nel paragrafo 6 (circa array e puntatori) ho notato che quello che avevo fatto non andava per niente bene: nonostante questo programma funzioni sulla quasi totalità delle CPU è presente un "undefined behavior", un comportamento indefinito. Decrementare il puntatore al primo elemento di un array non fa altro che farmi uscire dalla memoria dedicata all'array. Su alcuni compilatori o CPU questo non fa altro che bloccare il programma e lanciare una eccezione che potrebbe essere quella di Out of Memory o quella di Segmentation Fault. Per questo mi sono subito precipitato a correggere questo obbrobrio: avere codice non sicuro mi fa stare male. In questo caso la correzione era piuttosto banale e scontata, ve la mostro:
Code: You are not allowed to view links. Register or Login
void somma_elementi_ottimizzata(int *primo, int *secondo, int *somma, int elementi)
{
    for(int i = 0; i < elementi; i++)
    {
        *somma = *primo + *secondo;
        ++primo;
        ++secondo;
        ++somma;
    }
}

Perfetto, adesso ho l'anima in pace e il programma funziona correttamente senza un codice “unsafe”. Arrivati a questo punto possiamo provare ad analizzare brevemente questo pezzo di codice e relazionarlo ai precedenti. Come possiamo vedere, rispetto ai primi snippets non uso ne indici ne operatori di post-incremento, uso semplicemente l'aritmetica dei puntatori e gli operatori di pre-incremento.
Facendo invece un confronto con lo snippet precedente notiamo chiaramente come evitando il decremento all'inizio possiamo ridurre i cicli di clock necessari risparmiando tempo e soprattutto senza riscontrare problemi di "undefined behavior".

Spero di essere stato abbastanza chiaro, per qualsiasi dubbio o segnalazione di errori scrivete pure nei commenti. A breve pubblicherò altre guide, una riguardante l'aritmetica dei puntatori.

Saluti,
CrashTest
Fonte: You are not allowed to view links. Register or Login

15
Sandbox / Re:prova latex
« on: February 11, 2017, 05:22:17 PM »
Ahahah

Pages: [1] 2 3 ... 5