NOV
23

dadi_sxc.hu

In questi giorni in cui tutto si paga, è sempre bello sapere che esistono fonti di ispirazione per poter lavorare liberi da tutti (o quasi) i vincoli tipici del copyright. Soprattutto per chi come me realizza siti web è infatti di importanza vitale poter reperire immagini e/o disegni che siano liberi dai vincoli tipici delle immagini su Internet (come tutte quelle che provengono dalla ricerca di Google ad esempio) per poterle utilizzare nei propri layout, previo consenso dell’autore.

A proposito di ciò, volevo segnalare per chi ancora non lo conoscesse, un sito Internet dove sono catalogate migliaia di immagini e fotografie Royalty-Free, ovvero che non sono coperte da diritto di autore e quindi utilizzabili ovunque, da un sito web ad un’applicazione.

(All'interno il collegamento)

Continua a leggere "Immagini Royalty Free da usare ovunque"

NOV
21

internet terminerà nel 2010

da quanto emerge da studi del Nemertes Research Group, ovvero una società di ricerca indipendente che monitora e studia l’impatto economico nelle tecnologie e da quanto si può leggere in questo articolo de “la stampa” http://www.lastampa.it/, nel 2010 se il traffico continuerà ad aumentare al tasso attuale, internet sarà talmente intasata da non poter permettere più il traffico degli utenti. questo perchè? detto fatto, le infrastrutture attuali non sono alla portata della crescita che sta avvenendo, solo su youtube ogni mese vengono scambiati una cosa come 27 petabytes (!!!), ovvero 27 milioni di gigabytes di dati! in pratica bisognerebbe migliorare (di parecchio!) il QoS delle infrastrutture… a questo punto mi viene in mente TelecomItalia, che quanto a migliorare infrastrutture non ne vuole proprio sapere! io devo navigare a 256k perchè non hanno la decenza di sistemarmi l’ultimo miglio (vabbè ma questi sono altri problemi…). d’altronde, se non ci sarà più internet, per cosa pago l’adsl? spero sinceramente che tra indirizzi ip verso la terminazione e internet intasata si trovi a breve una soluzione!

molte volte capita di voler realizzare un programma nel quale un comportamento è in comune a tanti oggetti, ma che ad esempio può essere fatto in modi diversi. il primo esempio che mi viene in mente è la creazione di un logger, ovvero di un componente che gestisca in maniera autonoma il log del nostro programma: il modo in cui questo avviene a noi che facciamo il programma non interessa, ma a chi andrà poi a leggerlo sarà di primaria importanza che questo file abbia un senso logico e contenga tutte le informazioni necessarie per un buon debug. ecco perchè si è deciso di adottare il pattern singleton.

creiamo perciò un’interfaccia con tutte le funzioni che deve avere un buon logger:

public interface ILogger
{
void BeginLog(string filename);
void Log(string message);
void EndLog();
}

naturalmente la funzione Log può essere suddivisa in LogErrore, LogSemplice, LogWarning ecc ecc in base alle vostre esigenze. Io di solito uso un unica funzione di Log alla quale passo un oggetto LogMessage che contiene il tipo di messaggio, ma queste sono scelte progettuali indipendenti.

adesso creiamo la classe che andrà ad estendere l’interfaccia:

public class GenericLogger : ILogger
{
#region ILogger Members
public void BeginLog(string filename)
{
//non fa nulla
}
public void Log(string message)
{
//non fa nulla
}
public void EndLog()
{
//non fa nulla
}
#endregion
}

perchè è importante che tutte le funzioni non facciano nulla? semplice. Essendo che noi vogliamo fare dei plug-in, vogliamo che sia data la possibilità di usare il logger preferito. Ma mettiamo che per una determinata applicazione non vogliamo che venga creato il log, oppure che per un fortuito caso vengano cancellate le dll dei logger, chi si occuperà di questo? semplice, chi andrà a controllare l’esistenza dei plug-in, nel caso non trovi il logger scelto dall’utente andrà a prendere quello di default, in questo caso un logger che non fa nulla.

andiamo perciò ora a creare il singleton che restituirà un logger in base alla disponibilità:

public class Logger
{
private static Dictionary _instances = new Dictionary();
private static void Initialize()
{
foreach (FileInfo file in new DirectoryInfo(Application.StartupPath).GetFiles())
{
if (file.Extension == ".dll")
{
foreach (Type type in Assembly.LoadFile(file.FullName).GetTypes())
{
if (type.GetInterface("ILogger") != null)
_instances.Add (type.Name, (ILogger)Activator.CreateInstance(type));
}
}
}
if(!_instances.ContainsKey("GenericLogger"))
_instances.Add("GenericLogger", new GenericLogger());
}
}

questo codice controlla in ogni file presente nella cartella dell’eseguibile, se questo file è una dll allora controlla ogni oggetto al suo interno e se trova un oggetto che estende l’interfaccia ILogger allora ne crea un’istanza e la aggiunge al dizionario. al termine aggiunge un’istanza del logger generico di cui abbiamo detto poco fa.

se vogliamo fare vedere la lista dei logger allora dobbiamo creare un metodo che ce li elenchi, quindi:

public static List<string> Loggers(){
List</string><string> loggers = new List</string><string>();
foreach (ILogger logger in _instances.Values)
{
loggers.Add(logger.GetType().Name);
}
return loggers;
}

ecco quindi che ora abbiamo realizzato una base per il logger, ci manca solo da realizzare un logger che estenda l’interfaccia ILogger, creare la dll e metterla nella cartella del nostro programma e questo verrà “magicamente” visualizzato nella nostra lista smile emoticon

visto che ne ho parlato senza spiegare bene cosa è un evento, ecco una piccola guida sugli eventi in c#. un evento, come dice la parola stessa, è una notifica che viene data a chi interessa riguardo ad un fatto accaduto, come ad esempio il click su di un pulsante, l’apertura di una finestra ecc ecc.

il punto è, come poterne creare uno a nostro piacimento in un nostro oggetto?

la cosa è abbastanza semplice, creiamo una classe oggettoConEvento:

public class oggettoConEvento
{
public event EventHandler nuovoEvento;
private void OnNuovoEvento()
{
if (nuovoEvento != null)
nuovoEvento(this, EventArgs.Empty);
}
}

questo è tutto quello che ci serve per scatenare l’evento. aggiungiamo una funzione che andrà a scatenare l’evento:

private void Funzione()
{
for (int i = 0; i < 100000000; i++)
{
//fa niente
}
OnNuovoEvento();
}

ora, come per tutti gli altri eventi, basta legarci (ad esempio nel main) all’evento e non appena viene scatenato potremmo gestirlo come meglio vogliamo smile emoticon

NOV
20

Capita spesso di voler fare in modo che un’istanza di una classe sia visibile a tutti. Qualcuno di voi dirà “certo, basta dichiararla come statica!”. Esatto… o meglio, quasi! Infatti, per chi come me ha necessità di usare la Reflection (ovvero la capacità di un programma di modificare sè stesso in base all’occorrenza)… non è possibile! Non conosco l’esatto motivo per cui una classe statica non possa usare la Reflection, ma conosco il modo per aggirare il problema. È qui infatti che viene in aiuto il Design Pattern Singleton. Con questo pattern noi siamo in grado in tutto e per tutto di agire sulla classe come se questa fosse statica, però permettendoci il privilegio in più di avere la Reflection! Cosa significa questo? Significa che facendo ad esempio una classe di Opzioni basata su questo pattern non dobbiamo più salvare tutte le proprietà una ad una durante il salvataggio, ma ci penserà in automatico la reflection automaticamente! questo è solo un esempio, magari scriverò più avanti un articolo a parte… comunque, tornando al pattern…

(All'interno dell'articolo la definizione completa del pattern)

Continua a leggere "Guida ai Design Pattern – Singleton"

NOV
20

eccoci con la 3 parte del piccolo corso sui thread in c#. un altro problema che può verificarsi molto spesso è il voler compiere un’azione asincrona ma non volere che il thread principale continui finchè questi non abbia finito l’operazione, è in pratica un’operazione di sincronizzazione fra thread. c’è da chiedersi allora il perchè non fare direttamente un’operazione sincrona… i motivi ci sono, primo fra tutti il non voler intasare troppo il thread principale oppure voler fare altre operazioni prima di mettersi in attesa… ecco perciò che ci viene in aiuto l’oggetto EventWaitHandle.

posizioniamoci prima della richiesta asincrona e assegnamo un nuovo oggetto all’istanza:

EventWaitHandle waitHandle = new EventWaitHandle(false, EventResetMode.AutoReset);

a questo punto chiamiamo il nuovo thread come da codice visto in precedenza.

ThreadStart entry = new ThreadStart(CheckFile);
Thread thread = new Thread(entry);
thread.Start();

facciamo tutto quello che vogliamo fare e poi mettiamoci in pausa in attesa della fine del thread, magari con un timeout di 20 secondi ad esempio:

if (!waitHandle.WaitOne(20000, true))
{
//gestione dell'errore
}

adesso, in un punto qualsiasi della vita del thread parallelo, nel momento in cui vogliamo risvegliare il thread principale, settiamo l’handle da noi messo in pausa:

waitHandle.Set();

a questo punto il thread principale si sveglierà e noi saremmo in grado di continuare.

di seguito un codice di esempio:

ConsoleApplication3.zip