Ho trovato questo interessante articolo guida su come difendersi da Sql Injection.
martedì 29 aprile 2008
venerdì 18 aprile 2008
Un Cardellino mi ha fatto visita
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
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
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.
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
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.
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.
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.
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
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
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)
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
- un oggetto di tipo XmlReaderSettings, necessario per impostare il file xsd contenente la struttura che "valida" il file xml
- Aggiunta dello schema xsd (riferimento al file di validazione)
- Definizione di un reader di tipo XmlReader con passaggio del file xml e della classe del validatore
- 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()