martedì 29 aprile 2008

Difendersi da Sql Injection

Ho trovato questo interessante articolo guida su come difendersi da Sql Injection.

How To: Protect From SQL Injection in ASP.NET

venerdì 18 aprile 2008

Un Cardellino mi ha fatto visita

Un cardellino ha sostato per parecchio tempo davanti al mio davanzale mentre aspettavo l'installazione del Service Pack 1 di Windows Vista.

Ecco alcune delle foto

Verifica Validità formale della Partita IVA per VB6 / VBA

Su richiesta di qualche amico ho convertito la mia funzione VB.NET di controllo e verifica validità Partita Iva.

La funzione di verifica:

Option Explicit
Public Function PadLeft(ByVal testo As String, ByVal lungo As String) As String
    Dim s As String
    s = String(lungo, "0") & testo
    PadLeft = Right(s, lungo)
End Function
Public Function CheckPartitaIva(ByVal PIva As String) As String
    CheckPartitaIva = "Errata"
    Const caratteri As Integer = 11
    Dim partitaiva As String
    partitaiva = PIva
    If Not (Len(partitaiva) = caratteri) Then
        If Len(partitaiva) < caratteri Then
            partitaiva = PadLeft(partitaiva, caratteri)
        Else
            partitaiva = Mid(partitaiva, 3)
        End If
    End If
    If Len(partitaiva) <> caratteri Then Exit Function
    If Mid(partitaiva, 1, 8) = "00000000" Or Mid(partitaiva, 9, 2) = "00" Then Exit Function
    If (CInt(Mid(partitaiva, 8, 3)) > 121) Then Exit Function
    Dim somma As Integer
    somma = 0
    Dim i As Integer
    Dim j As Integer
    For i = 1 To caratteri - 1
        j = CInt(Mid(partitaiva, i, 1))
        If i Mod 2 = 0 Then
            j = j * 2
            'Dim c As Char() = j.ToString("00").ToCharArray
            somma = somma + CInt(Mid(Format(j, "00"), 1, 1))
            somma = somma + CInt(Mid(Format(j, "00"), 2, 1))
        Else
            somma = somma + j
        End If
    Next
    If (Mid(Format(somma, "00"), 2, 1) = "0") And (Not (Mid(partitaiva, 11, 1) = "0")) Then
        Exit Function
    End If
    somma = CInt(Right(partitaiva, 1)) + CInt(Right(Format(somma, "00"), 1))
    If Right(Format(somma, "00"), 1) = "0" Then CheckPartitaIva = "Corretta"
End Function

Un progetto vb6 di esempio

giovedì 17 aprile 2008

Controllo del codice fiscale per VB6 / VBA

Ho realizzato una versione per VB6 del mio controllo del codice fiscale con omocodia

La funzione di controllo

Public Function CheckCodiceFiscale(ByVal codicefiscale As String) As String
    CheckCodiceFiscale = "Errata"
    Const caratteri As Integer = 16
    If codicefiscale & "" = "" Then Exit Function
    If Not Len(codicefiscale) = caratteri Then Exit Function
    Const omocodici As String = "LMNPQRSTUV"
    Const listaControllo As String = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    Dim listaPari() As Variant
    listaPari = Array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25)
    Dim listaDispari() As Variant
    listaDispari = Array(1, 0, 5, 7, 9, 13, 15, 17, 19, 21, 2, 4, 18, 20, 11, 3, 6, 8, 12, 14, 16, 10, 22, 25, 24, 23)
    codicefiscale = UCase(codicefiscale)
    Dim k As Integer
    Dim x As Integer
    Dim cCodice(15) As String
    For k = 0 To 14
        cCodice(k) = Mid(codicefiscale, k + 1, 1)
    Next
    Dim somma As Long
    somma = 0
    Dim i As Integer
    i = 0
    While i < 15
        Dim s As String
        s = cCodice(i)
        x = InStr(1, "0123456789", s)
        If Not (x <= 0) Then
            s = Mid(listaControllo, x, 1)
        End If
        x = InStr(1, listaControllo, s, vbTextCompare)
        If (i Mod 2) = 0 Then
           x = listaDispari(x - 1)
        Else
            x = listaPari(x - 1)
        End If
        somma = somma + x
        i = i + 1
    Wend
    x = somma Mod 26 + 1
    If Mid(listaControllo, x, 1) = Right(codicefiscale, 1) Then
      CheckCodiceFiscale = "Corretto"
    End If
End Function

Programma di esempio

Powerered with Window Live Writer

domenica 13 aprile 2008

Elezioni 2008 - Andiamo tutti a votare

La mia esortazione, per quello che può servire è che tutti si vada a votare.

Non rinunciamo ad un diritto / dovere fondamentale.

A me non è mai piaciuto e mai piacerà chi si tira fuori chi dice "non mi importa", importa invece e importa molto perchè il non voto alimenta il qualunquismo, da sempre uno dei peggiori mali che affligge l'Italia.

Andiamo a votare e partecipiamo in questo modo alla realizzazione del nostro futuro, smettiamo di essere succubi della politica e diventiamo protagonisti.

L'unica arma che abbiamo è il voto, usiamolo a favore di chi ci piace un pò di più della parte avversa e soprattutto ciascuno di noi deve avere "memoria" delle promesse fatte in campagna elettorale, diventiamo capaci di premiare chi si comporta bene e punire chi si comporta male.

Quindi il voto "a prescindere" per un certo partito è il male perchè questo partito si adagia sulla propria base elettorale, non lamentiamoci se abbiamo la classe politica più antica del mondo (antica in senso anagrafico), dobbiamo diventare come altri, capaci di cambiare partito ad ogni tornata elettorale premiando appunto chi ci pare si sia comportato bene e punendo chi non ha tenuto fede alle proprie promesse e/o ha fatto il proprio interesse al posto o ai danni dell'interesse di tutti.

Powerered with Window Live Writer

mercoledì 9 aprile 2008

Visual Studio 2008 che mi combini o Windows Vista che mi combini?

Ho recentemente installato Visual Studio Team System 2008 Development Edition Italiano.

Tutto bene da quello che ho visto e vedo mi piace sempre di più tranne un particolare molto fastidioso.

Ogni volta che riaccendo il pc (Windows Vista) parte il Setup e l'installer di Visual Studio 2008.

La prima volta ho rimesso il dvd ha scandagliato disco e dvd per una buona ora e poi è terminato.

La richiesta del dvd è riapparsa ad ogni nuova accensione, inserito di nuovo il dvd ha lavorato per un'altra ora e poi mi ha detto che non avevo il permesso di scrivere nella cartella programmi due file .bat che impostavano le variabili per il prompt dei comandi (già c'erano).

Allora sono andato nel registro alla caccia di quella infame riga che faceva ripartire il setup anche se era tutto a posto, non ho trovato nulla.

Ho provato a disabilitare l'UAC, il setup manco parte (che beffa)

Riabilito l'UAC, il setup riparte, cambio i permessi sulla cartella programmi e faccio partire il setup che sovrascrive i .bat e il setup termina correttamente.

Oggi riaccendo, punto a capo, il setup riparte, spero non si siano sentiti gli improperi.

Ora sono alla caccia di qualche suggerimento, a me come è andata l'installazione va bene, possibile che non si possa disattivare la ripartenza di quel setup?

Grazie in anticipo

lunedì 7 aprile 2008

Utilizzo della libreria Microsoft.JScript su .NET per ottenere il risultato di una formula

Credo sia noto che C#  non ha la funzione Eval, è possibile però utilizzare una libreria di JScript che è l'implementazione di MIcrosoft di javascript Jscript.NET.

Tramite questa è possibile dotare tutti i linguaggi .NET di funzioni gestite dal linguaggio di scripting e difficilmente implementabili direttamente.

 

Fornire una stringa e ottenere un risultato è uno dei cimenti (inutili) che di solito capitano nella vita di un programmatore, io stesso ho scritto almeno due "valutatori" (nessuno su .net però), uno addirittura che "funzionava" durante l'editazione di una stringa sconto.

Su .NET l'implementazione è del tutto semplice, anzi banale.

Si inizia scrivendo una "classe" di interfaccia con la propria applicazione in JScript.NET:

Evaluator.js

class Evaluator
{
    static function Eval(MathExpression : String) : double
    {
        return eval(MathExpression);
    };
}

Si compila come libreria (si, bisogna andare al prompt dei comandi, suvvia non c'è niente di preoccupante a vedere la shell di Windows), ovviamente è necessario utilizzare quel comando che fa paura: "prompt dei comandi di visual studio" che ha il grosso vantaggio di impostare automaticamente path e variabili corrette.

Ci posizioniamo quindi sulla cartella dove abbiamo salvato il nostro Evaluator.js, diamo il comando: jsc /t:library evaluator.js

E' generata una nuova libreria (.dll).

Poi andiamo nel nostro programma / progetto, aggiungiamo il riferimento alla libreria testè creata e a Microsoft.JScript.

Inseriamo il nostro codice, l'intellisense fa il resto.

Più facile a farsi che a dirsi :D

Powerered with Window Live Writer

Disegnare la propria applicazione perchè usi i Plug-ins .NET

Cercando una cosa migliore della mia "scarsa" implementazione di plug-ins ho trovato un interessante articolo pubblicato su MSDN Magazine che tratta appunto della materia. 

Plug-Ins: Let Users Add Functionality to Your .NET Applications with Macros and Plug-Ins
Si tratta di un ottimo esempio di implementazione che seguirò per l’applicazione che sto preparando.

Powerered with Window Live Writer

domenica 6 aprile 2008

Microsoft Pattern & Pratice

Se non bastasse l'immenso repository di MSDN esiste Microsoft Pattern & Pratice che guida e suggerisce la corretta operatività nella preparazione, installazione e configurazione sulla piattaforma Microsoft.

Powerered with Window Live Writer

Lavorare con il formato Open XML ovvero come documenti Word / Excel senza installare Office

Dalla miniera di OpenXmlDeveloper.Org ho trovato una serie di articoli riguardanti i formati xml di Word ed Excel.
Ci sono esempi realizzati con Visual Studio .net e documentazione scaricabile liberamente.
Vista la profondità della trattazione consiglio a tutti di prenderne visione.

Powerered with Window Live Writer

Un altro motivo ancora per preferire C# a VB.NET

Mi sono accorto di un diverso comportamento tra C# e VB.NET, comportamento che mi ha gratificato ancora una volta nell'aver scelto C# al posto di VB.NET (Nota per i vbfanatici: preferire non vuol dire disprezzare).

I termini della questione:

Ho un ArrayList, lo popolo con 4 Array di char con i valori (a coppie: 1-3,2-4,3-6,4-7), poi con un ciclo "For/for" estraggo i dati e cancello un elemento.

C#

ArrayList ar = new ArrayList();
ar.Add(new char[] {'1','2'});
ar.Add(new char[] {'3','4'});
ar.Add(new char[] {'5','6'});
ar.Add(new char[] {'7','8'});

for (int i = 0; i < ar.Count; i++)
{
       char[] c = (char[]) ar[i];
       Console.WriteLine(string.Format("{0} {1} {2}",i,ar.Count,c[0]));
       if (i == 1)
              ar.RemoveAt(i); 

}

VB.NET

Dim ar As New ArrayList()
ar.Add(New Char() {"1"C, "2"C})
ar.Add(New Char() {"3"C, "4"C})
ar.Add(New Char() {"5"C, "6"C})
ar.Add(New Char() {"7"C, "8"C})
For i As Integer = 0 To ar.Count - 1
  Dim c() As Char = Ctype(ar(i),char())
  Console.WriteLine(String.Format("{0} {1} {2}", i, ar.Count, c(0)))
  If i = 1 Then
       ar.RemoveAt(i)
  End If
Next

Come si può vedere sono del tutto analoghi con una piccola / grande differenza: Il ciclo VB.NET genera un errore.

L'istruzione per la chiusura del ciclo for su C# viene valutato ad ogni esecuzione quindi quando ar.Count cambia C# ne tiene conto.
L'istruzione per la chiusura del ciclo For su VB.NET è valutata una sola volta all'inizio se ar.Count cambia VB.NET NON ne tiene conto.
Ne consegue che l'errore che esce solo su VB.NET con le istruzioni mostrate è più che plausibile (purtroppo).

Il workaround per VB.NET è NON usare il ciclo For e al suo posto un ciclo While:

Dim i As Integer = 0
While (i < ar.Count)
Dim c() As Char = Ctype(ar(i),char())
       Console.WriteLine(String.Format("{0} {1} {2}", i, ar.Count, c(0)))
       If i = 1 Then
             ar.RemoveAt(i)
      
End If
       i += 1
End While

Powerered with Window Live Writer

Disegnare una stringa di testo sopra un oggetto Image con C# e VB.NET

Ogni tanto, quando posso cerco di imparare qualche cosa di nuovo, questa volta ho giocato un pò con immagini e stringhe.

Per la realizzazione ho utilizzato le classi di System.Drawing:

C#

/// <summary>
/// Caricamento immagine da file
/// </summary>
/// <param name="nomeFile">File contenente l'immagine</param>
/// <returns></returns>
System.Drawing.Image CaricaImmagine (string nomeFile)
{
       using (Bitmap img = new Bitmap(nomeFile))
                          return new Bitmap(img);
}

/// <summary>
/// Disegna testo sopra un'immagine
/// </summary>
/// <param name="nomeFile">Nome file contenente l'immagine</param>
/// <param name="testo">Testo da disegnare nell'immagine</param>
/// <returns>Image</returns>
public System.Drawing.Image DrawTestoSuBitmap(string nomeFile, string testo)
{
       // recupero immagine
       Image imageFile = this.CaricaImmagine(nomeFile);
       // creazione di un oggetto di tipo Graphics
       Graphics g = Graphics.FromImage(imageFile);                   

       g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias; 

  // Da msdn
 
// Creazione del pennello e scelta del colore
  SolidBrush drawBrush = new SolidBrush(Color.Black);
  // generazione font da utilizzare
  System.Drawing.Font drawFont = this.Font;
 
if (drawFont == null)
 
{
     drawFont = new System.Drawing.Font("Courier", 20,System.Drawing.FontStyle.Regular);
  }           

       // Generazione del punto di posizionamento del testo
       PointF drawPoint = new PointF(10.0F, 100.0F);
       // se si è passato un testo vuoto non si fa nulla
       if (!string.IsNullOrEmpty(testo))
             g.DrawString(testo,drawFont, drawBrush, drawPoint);
       // rigeneriamo l'oggetto Image modificato
       g.DrawImage(imageFile,new Point(0,0));
       // restituzione Image all'oggetto chiamante
       return imageFile;
}

VB.NET

''' <summary>
''' Caricamento immagine da file
''' </summary>
''' <param name="nomeFile">File contenente l'immagine</param>
''' <returns></returns>
Private Function CaricaImmagine(ByVal nomeFile As String) As System.Drawing.Image
       Using img As New Bitmap(nomeFile)
             Return New Bitmap(img)
       End Using
End Function

''' <summary>
''' Disegna testo sopra un'immagine
''' </summary>
''' <param name="nomeFile">Nome file contenente l'immagine</param>
''' <param name="testo">Testo da disegnare nell'immagine</param>
''' <returns>Image</returns>

Public Function DrawTestoSuBitmap(ByVal nomeFile As String, ByVal testo As String) As System.Drawing.Image
       ' recupero immagine
       Dim imageFile As Image = Me.CaricaImmagine(nomeFile)
       ' creazione di un oggetto di tipo Graphics
       Dim g As Graphics = Graphics.FromImage(imageFile)

       g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias 

       ' Da msdn
       ' Creazione del pennello e scelta del colore
       Dim drawBrush As New SolidBrush(Color.Black)
       ' generazione font da utilizzare

       Dim drawFont As System.Drawing.Font = Me.Font
       If drawFont Is Nothing Then
             drawFont = New System.Drawing.Font("Courier", 20, System.Drawing.FontStyle.Regular)
       End If

       ' Generazione del punto di posizionamento del testo
       Dim drawPoint As New PointF(10F, 100F)
       ' se si è passato un testo vuoto non si fa nulla
       If Not String.IsNullOrEmpty(testo) Then
             g.DrawString(testo, drawFont, drawBrush, drawPoint)
       End If

       ' rigeneriamo l'oggetto Image modificato
       g.DrawImage(imageFile, New Point(0, 0))
       ' restituzione Image all'oggetto chiamante
       Return imageFile
End Function

sabato 5 aprile 2008

Recuperare le risorse incorporate da una DLL .NET

Ho trovato questo frammento molto interessante che suggerisce il modo di recuperare le risorse incorporate da una dll .NET.

Assembly asm = Assembly.LoadFrom(System.Environment.CurrentDirectory +
@"\AssemblyResources.dll");
            Stream strm =
asm.GetManifestResourceStream((string)asm.GetManifestResourceNames()[0]);
            Bitmap b = (Bitmap)Image.FromStream(strm);
            pictureBox1.Image = b;

Nella fattispecie recupera solo il primo elemento ma .. GetManifestResourceNames() restituisce un array di nomi e quindi .. :).

Deadlocks - Un problema che va affrontato se si lavora con i Threads

Navigando in internet mi sono imbattuto in questo interessante articolo che parla appunto dei DeadLocks che consiglio a tutti di leggere.

Validazione di un file XML con un file XSD con C# e VB.NET

Dovendolo fare "per lavoro" mi sono messo alla ricerca di un semplice "validatore" di file .XML mediante un file .XSD.
Nella rete ho trovato programmi che con xml "vendevano" e facevano praticamente di tutto, dalla gestione dei documenti alla "semplice" programmazione, tutto fuorchè quello che interessava a me, la sola validazione di un file XML con un file XSD.

E cioè le operazioni: caricare unf ile .XML, caricare un file .XSD e .. mostrare gli errori! nulla di più.
Così ho deciso di scrivermelo.
Ho trovato, suggerito da un amico che non cito (poi si capirà) un link (non andateci che perdete solo del tempo): http://www.codeguru.com/Csharp/Csharp/cs_data/xml/article.php/c6737/
A questo link ho trovato sì quello che mi interessava, peccato che le classi e i metodi usati fossero stati nel frattempo dichiarati obsoleti.
Mi sono messo alla caccia quindi di altri esempi che usassero le nuove classi, nulla, tutti gli esempi che ho trovato usavano anch'essi gli stessi metodi dichiarati già obsoleti, e volete che io mi metta a copiare esempi già vecchi? manco morto!
Una piccola ricerca sul mio MSDN locale, quante volte ho invitato qualche amico a fare sempre la prima ricerca sul proprio help in linea e io ci sono cascato come una pera, chiedo scusa, si sa il calzolaio va in giro con le scarpe rotte, l'idraulico ha in casa sempre un tubo che perde, il programmatore che dovrebbe fare della pulizia e dell'essenziale una regola di vita si circonda sempre e ovunque di cose ed orpelli del tutto inutili tanto a ricordare che si è stupidi e si fa un lavoro previsto per il massimo della stupidità una macchina che non fa altro che fare ciò che gli è stato detto di fare :)

Pagato il tributo alla mia stupidità .. su MSDN ho trovato  XmlValidatingReader.SchemaType Property che ha aperto le porte alla comprensione e alla soluzione.

Ho cominciato con il definire una nuova classe "Valida" con un metodo principale per la restituzione di una lista degli elementi, degli attributi di ciascun elemento e .. degli errori riscontrati durante la validazione, a proposito si deve sapere che se il validatore incontra un errore qualsiasi il metodo finisce a quel punto.

C#
public static List<Elementi> Validate(string xmlFile, string xsdFile)

VB.NET (si noti, non lo dirò più quanto C# sia più essenziale e meno prolisso di VB.NET)

Public Shared Function Validate(ByVal xmlFile As String, ByVal xsdFile As String) As List(Of Elementi)

La funzione restituisce una lista di Elementi (Elementi è una classe generata per lo scopo, contiene i campi, tutti stringa, necessari all'interfacciamento con un dataset locale non tipizzato che ho utilizzato per mostrare su una datagridview i risultati), data la sintassi si tratta di una lista "tipizzata", l'oggetto infatti è predisposto per ricevere solo oggetti di tipo Elementi.
La classe tipizzata Elementi contiene i campi, ordine obbligatorio: Elemento, Tipo, Livello, Messaggio, Valore, l'ho dotata di un costruttore personalizzato che riceve come argomento un array con i valori dei campi.
La classe Elementi non serve alla nostra trattazione.

C#
XmlReaderSettings settings = new XmlReaderSettings();
settings.Schemas.Add(null,xsdFile);
settings.ValidationType = ValidationType.Schema;
XmlReader txtReader = XmlReader.Create(xmlFile, settings);            settings.ValidationEventHandler += new ValidationEventHandler(settings_ValidationEventHandler)

VB.NET
Dim settings As New XmlReaderSettings()
settings.Schemas.Add(Nothing, xsdFile)
settings.ValidationType = ValidationType.Schema
Dim txtReader As XmlReader = XmlReader.Create(xmlFile, settings)
AddHandler settings.ValidationEventHandler, AddressOf settings_ValidationEventHandler

Questo blocco di istruzioni definisce nell'ordine

  1. un oggetto di tipo XmlReaderSettings, necessario per impostare il file xsd contenente la struttura che "valida" il file xml
  2. Aggiunta dello schema xsd (riferimento al file di validazione)
  3. Definizione di un reader di tipo XmlReader con passaggio del file xml e della classe del validatore
  4. Abbonamento ad un evento e definizione del gestore dell'evento ValidationEventHandler

Finito questo passaggio per far "funzionare" il validatore è sufficiente eseguire il ciclo di lettura:

C#
while (txtReader.Read())

VB.NET
While txtReader.Read()