domenica 9 ottobre 2011

FileSystemWatcher

La classe FileSysnteWatcher è un componente con delle potenzialità notevoli.
Riesce a mettersi in ascolto di una cartella e "avverte" quando una modifica è accaduta.
Con modifica intendo, la creazione, la modifica, la cancellazione di files o sotto cartelle.

Premetto che non l'ho ancora utilizzato in alcuna produzione ma questo strumento è decisamente interessante in quanto la mia esperienza ha mostrato che ancora oggi il sistema più usato per scambiare dati tra processi diversi è il deposito di un file in una cartella di scambio e di un loop che controlla l'esistenza di nuovi file (in moltissime realtà il concetto stesso di soap service non è ancora arrivato).
Ebbene, questa classe consente invece di evitare la creazione del loop ma affidarsi agli eventi scatenati, con ovvi benefici in sicurezza, affidabilità e robustezza.

venerdì 29 luglio 2011

Come usaer Page_Load e Page_Init

Nel Page_Init bisogna lanciare tutto quello che riguarda la costruzione della pagina (o del controllo in generale) che NON RIGUARDA I DATI che eventualmente possono essere caricati da un post.

Nel Page_Load invece si mette tutto ciò che è inerente alla manipolazione del dato da visualizzare.

Ad esempio: il caricamento dinamico di una drodownlist deve avvenire in init, almeno nel caso in cui il caricamento non fosse in funzione di dati della pagina stessa.

Questa distrinzione vale anche per i partial postback di Ajax.
Da ricordarsi comunque che in questo caso this.IsPostBack è sempre a true.

martedì 15 marzo 2011

Resizing image on the fly

Per risolvere questo problema in maniera definitiva ho deciso di creare un servizio on line di ridimensionamento delle immagini "al volo".
Il sistema è molto semplice:
1) registrarsi al servizio contattandomi marco@ghizzi.it e comunicandomi la cartella delle immagini pubblicate on line.
2) vi verrà fornito un codice utente.
3) utilizzare il link del seguente tipo anziché l'immagine locale:
htttp://www.ghizzi.it/outimage/<codice_utente>/<nome_immagine_compresa_di_estensione>.ashx
4) a questo url aggiungere in query string uno o più parametri dei seguenti:
width=<larghezza_in_pixel>, height=<altezza_in_pixel>, align=<near_far_o_center>, color=<colore_di sfondo>
5) al posto di tali settaggi si può precaricare dei preset identificati da dei codici all'atto della registrazione.

Per ulteriori informazioni, contattatemi alla email marco@ghizzi.it

venerdì 4 marzo 2011

Come memorizzare le password

Recentemente mi sono posto questo problema:
qual'è il metodo migliore per memorizzare una password in un database, evitando ovviamente di metterla in chiaro?
A tale domanda la mia prima risposta è stata quella di utilizzare la funzione di hashing della stringa, presente praticamente in ogni liunguaggio di programmazione "attuale" (ho diretta esperienza in Java e .NET).
Questa scelta però non è vincente in quanto l'hash non garantisce la "portabilità" tra tecnologie diverse (la funzione di hashing di Java e C# sono diverse!) ma nemmeno tra versioni diverse della stessa tecnologia: infatti non si garantisce che tale algoritmo di hashing non venga cambiato in future versioni dello stesso linguaggio.

A mio avvio quindi la scelta migliore è quella di usare uno degli algoritmi di generazione del digest come può essere l'SHA-1 o qualsiasi altro algoritmo superiore.
Riporto sotto il codice per generare tale digest nei due linguaggi che utilizzo di norma.

 C#.NET:


        ///

        /// Create Digest of one string
        ///

        ///

        ///
        public static byte[] GetDigest(String arg)
        {
            System.Security.Cryptography.SHA1 sha = new System.Security.Cryptography.SHA1Managed();
            ASCIIEncoding ae = new ASCIIEncoding();
            byte[] data = ae.GetBytes(arg);
            byte[] digest = sha.ComputeHash(data);
            return digest;
        }

        ///

        /// COnverts an array of bytes in the UNICODE value of the string.
        ///

        ///
        ///
        public static string GetAsString(byte[] bytes)
        {
            StringBuilder s = new StringBuilder();
            int length = bytes.Length;
            for (int n = 0; n < length; n++)
            {
                s.Append(Convert.ToChar(bytes[n]));
            }
            return s.ToString();
        }


JAVA:
    public byte[] getDigest(String arg) throws java.security.NoSuchAlgorithmException, UnsupportedEncodingException {
        java.security.MessageDigest digest = java.security.MessageDigest.getInstance("SHA-1");
        digest.reset();
        return digest.digest(arg.getBytes("UTF-8"));
    }

    public static String GetAsString(byte[] bytes) {
        StringBuilder s = new StringBuilder();
        int length = bytes.length;
        for (int n = 0; n < length; n++) {
            s.append((char) (bytes[n] & 0xff));
        }
        return s.toString();
    }

domenica 30 gennaio 2011

Efficienza vs efficacia

Spesso nel mio lavoro mi capita di dover pensare se la soluzione che ho in mente e che chiedo alla direzione di (far) realizzare, sia proprio la soluzione migliore in quell'istante per l'azienda, cercando di trovare il giusto compromesso tra soluzioni formalmente curate, frutto di architetture flessibili e manutenibili,... contro soluzioni veloci, che puntano alla risoluzione del mero problema del cliente, il così detto "quick and dirty"
La teoria della Qualità, del sistema Toyota non lascia alcun dubbio sulla strada da seguire: quello che bisogna fare è risolvere il problema, nel più breve tempo possibile, tanto da sostenere che, se nel giro di una settimana (la famosa Settimana Kaizen) non si riesce a trovare, e implementare una soluzione, significa che si sta sbagliando strategia.

La regola d'oro sembra quindi essere: puntare all'efficacia piuttosto che all'efficienza.

Ho sempre sostenuto che questa logica di miglioramento a piccoli passi, atta a risolvere velocemente il mero problema del cliente,  non fosse applicabile ad ogni realtà, ma solo a quelle che hanno superato una certa "massa critica" nell'organizzazione e standardizzazione aziendale, massa critica che deve essere raggiunta a
suon di pesanti investimenti.

Questo mio convincimento porta anche a ripensare al valore dell'efficienza che deve essere uguale o forse maggiore a quella dell'efficacia.
Mi piace vedere l'efficacia come il fine che deve obbligatoriamente essere raggiunto con un processo efficiente, ovvero "di qualità" che riesca a garantire flessibilità e manutenibilità nel tempo.

SQL Server, IIS 7 e Windows Server 2008

Che user viene utilizzato per far girare web app ASP.NET su IIS 7? E più concretamente, qual'è lo user con cui una web app si collega a SQL Server? In pratica, se SQL Server si trova sulla stessa macchina su cui gira IIS 7 e si volesse utilizzare l'integrated security evitando di mettere in chiaro una password nella configurazione, a quale user bisognerebbe garantire l'accesso al DB (modulando l'autorizzazione minima necessaria per fare tutto il lavoro)? La risposta è: IIS_IUSR.
Tale discorso vale anche se SQL Server e IIS 7 si trovassero su due macchine differenti, entrambe sotto lo stesso dominio.

IIS 7 su sistema x64

In questi giorni ho scoperto che esistono due moduli distinti asp.net per IIS: oltre a quello standard ne esiste uno specifico per macchine a 64 bit.

Volendo pubblicare una web app in ASP.NET su un tale sistema a 64 bit bisogna ricordarsi di agganciare eventuali estensioni particolari (oltre alle solite *.aspx) ad entrambi i moduli, pena l'impossibilità di visualizzare tali   pagine.