May 2005 Blog Posts

Validazione di XML con XSD

Ma è possibile che non esiste un programma per validare un file XML passandogli un XSD? Cercando su internet ho trovato degli IDE per gestire XML, per scrivere XSD, per XSLT, per testare le trasformate, per tutto, e fanno anche la validazione, ma sono programmi da 20Mb, da installare, da comprare, e che fanno anche il caffè in formato XML... ma non uno stupido programma che prende solo un file XML e lo valida contro un XSD. Allora me lo sono fatto io... con .NET è veramente facile... 1  using System;2  using System.Text;3  using System.Xml;4  using System.Xml.Schema;5  6  namespace Com.Piyosailing.Xml.Validator7  {8      public class XmlValidator9      {10          // salvo lo stato della validazione11          private bool _isValid = true;12          private StringBuilder _stringBuilder = new StringBuilder();13  14          //Propretà per fornire al chiamante il risultato della validazione15          public string ValidationErrors 16          {17              get 18              {19                  return _stringBuilder.ToString();20              }21          }22  23          // Metodo che valida24          public bool Validate(string xmlPath, string xsdPath,string targetNameSpace) 25          {26              XmlTextReader reader = null;27              XmlValidatingReader vReader = null;28              XmlSchemaCollection myschema = new XmlSchemaCollection();29              try30              {31                  //Creo XML reader32                  reader = new XmlTextReader(xmlPath);33                  //Incapsulo XML reader dentro Validiting reader34                  vReader = new XmlValidatingReader(reader);35                  vReader.ValidationEventHandler36                          +=new ValidationEventHandler(vReader_ValidationEventHandler);37  38                  myschema.Add(targetNameSpace, xsdPath);39  40                  vReader.ValidationType = ValidationType.Schema;41                  vReader.Schemas.Add(myschema);42  43                  //Leggo il file44                  //Se ci fossero errori viene chiamato l'handler45                  while (vReader.Read()) {}46              }47              catch48              {49                  _isValid=false;50              }51              finally52              {53                  if(reader.ReadState!=ReadState.Closed)54                      reader.Close();55                  if(vReader.ReadState!=ReadState.Closed)56                      vReader.Close();57              }58  59              return _isValid;60          }61  62          //Event Handler per cattuare tutti gli errori di validazione63          private void vReader_ValidationEventHandler(object sender, ValidationEventArgs e)64          {65              _isValid = false;66              _stringBuilder.AppendFormat("\r\nValidation Error: {0}", e.Message);67          }68      }69  } Questa è solo la libreria che valida, l'ho estrapolata dal programmino da linea di comando...

Pensieri sparsi di esperienza sul campo

Ho appena aggiunto la categoria di post "Progetto in corso"... E' il progetto del quale parlavo un po' di tempo fa, e che, nonostante mi faccia stare in ufficio dalle 9 alle 21 tutti i giorni (fortunatamente sono riuscito a schivare i weekend ), mi sa mettendo di fronte a molte problematiche che non avevo mai affrontato prima d'ora: gestione dei thread per eseguire molti task in contemporanea (per fortuna non vanno sincronizzati ) processing "pesante" di file XML, da validare con XSD, e deserializzare salvandolo in un DB utilizzo estensivo...

Come testare DTO gerarchici

Nel progetto appena iniziato sto provando ad adottare varie metodologie scoperte da quando sto seguendo UGIdotNET e, soprattutto dal Workshop "Architecture and Management". Ieri, primo giorno di scrittura codice, mi sono trovato a scrivere i Data Transfer Object, che, per come è strutturato l'ambito applicativo, sono gerarchici, cioè tutti gli oggetti ereditano da un "mainobject". Ma come scrivere dei test per gli assegnamenti, evitando di replicare per ogni oggetto tutti gli assegnamenti delle proprietà comuni? Io ho trovato questa soluzione // Classe DTO Padrepublic abstract class MCObject {        private string _uuid = string.Empty;        private DateTime _data = DateTime.Now;        private DateTime _dataMod = DateTime.Now;        public string Uuid        {            get            {                return _uuid;            }            set            {                _uuid = value;            }        }        public System.DateTime Data        {            get            {                return _data;            }            set            {                _data = value;            }        }}// Classe DTO figliopublic class MCOTappo: MCObject{    private string _url = string.Empty;        public string Url        {        get        {            return _url;        }        set        {            _url = value;        }    }}// Test dell'oggetto padre con i Test per le// proprietà generiche// NOTA: non è marcato [TestFixture]public class MCObjectFixture    {    public MCObjectFixture() {}    private MCObject mco;    public MCObject MCO     {        set         {            mco=value;        }    }    [Test]    public void UuidAssignment()    {        string id = "68d6d186-c6ee-11d9-98ef-0003ba99c667";        mco.Uuid=id;        Assert.AreEqual(id, mco.Uuid);    }    [Test]    public void DataAssignment()    {        DateTime value = DateTime.Now;        mco.Data=value;        Assert.AreEqual(value, mco.Data);    }    }// Test dell'oggetto figlio// è marcata come [TestFixture]// e testa solo la proprietà specifica[TestFixture]public class MCOTappoFixture: MCObjectFixture{    private MCOTappo tappo;    // Nel setup creo l'oggetto da testare    // e lo passo anche al test padre    [SetUp]    public void SetUp()    {        tappo = new MCOTappo();        base.MCO=tappo;    }    [TearDown]    public void TearDown()    {        tappo = null;    }        [Test]    public void UrlAssignment()    {        string value = "http://www.ugidotnet.org";        tappo.Url=value;        Assert.AreEqual(value, tappo.Url);    }} powered by IMHO 1.2

Arrivata la moneta di Firefox e upgrade 1.0.4 per Firefox

Mi è arrivata oggi, insieme ad una penna luminosa, la moneta coniata per il 25M download di Firefox a metà Febbraio.La moneta mi è stata attribuita per essere uno dei 25 utenti che più hanno aiutato la diffusione di Firefox. [Leggi mail originale].  In aggiunta, è uscito l'ennesimo update di sicurezza per Firefox (1.0.4), per tappare le falle scoperta da Secunia 2-3gg fa. powered by IMHO 1.2

[OT] Grafico Microsoft Arrampicatore

Oggi mi è arrivata la mail d'invito al Developer Security Tour.Presumo che l'evento contenga le stesse info del workshop UGI di inizio Aprile sulla Security (anche perchè non c'è Milano tra le location possibili). Da notare è la cura con la quale è stato riprodotto il moschettone usato nella grafica della mail:gli avvezzi all'arrampicata noteranno il key-lock per la chiusura della leva, e la leva curva tipica dei moschettoni dei rinvii... Complimenti, raramente una grafica ad "effetto" è così curata nei particalari.Bel lavoro!!!! powered by IMHO 1.2

Finalmente un progetto!!! - Plugin pattern

Dopo 3 mesi di analisi e "tappabuchi" inizia finalmente un progetto... anche abbastanza complesso...Mi ero stufato di scrivere analisi e allegati tecnici alle proposte commerciali. E' un bel progetto (del quale, ovviamente, avevo fatto anche l'analisi nei mesi scorsi ) che include la realizzazione di un servizio windows, che legge dei file xml di vario tipo (questo spiega il perchè del "Plugin Pattern" del titolo), li elabora e li mette in un DB.Poi c'è un sito web che visualizza in maniera "graficamente accattivante" i contenuti recuperati. Negli ultimi mesi ho fatto un po' di prove con Enterprise Library di MS, e...

DVD Beta Experience

Grazie MS per la celere consegna del Visual Studio 2005 Beta 2 Experience Kit su DVD. Però un controllo sugli indirizzi tripli lo potevate anche fare  (Mi si è impallata x 2 volte il form di richiesta del DVD, e quindi mi sono arrivati 3 DVD... per fortuna che ho altri 2 colleghi sviluppatori ai quali dare i 2 DVD in più) powered by IMHO 1.2

Offerta di lavoro per programmatore junior

Offerta di lavoro: se interessate cliccate sul link

Come ridimensionare (e croppare) un'immagine con .NET

Oggi mi sono imbattuto in problema "strano" per chi è abitutato a lavorare come me su applicazioni di puro data retrivial via web: il ridimensionamento di un'immagine da codice. Prima di .NET mi ricordo che c'era da smattire con GDI, directX, puntatori... insomma, una cosa complessa. Con C# è invece tutto molto facile. Ecco il codice, commentato: // Carico l'oggetto Image dal file sorgente da ridimensionareSystem.Drawing.Image oImg = System.Drawing.Image.FromFile(sourceFileName); // Creo un'immagine bitmap delle dimensioni dell'immagine ridimensionataSystem.Drawing.Image oThumbNail = new Bitmap((int)finalW, (int)finalH, oImg.PixelFormat);// Creo una "drawing surface", ossia una lavagna sulla quale disegnare// che si appoggia sulla bitmap appena creataGraphics oGraphic =  Graphics.FromImage(oThumbNail);// Setto tutto alla massima qualità (tanto è un'operazione "batch", non realtime)oGraphic.CompositingQuality = CompositingQuality.HighQuality ;oGraphic.SmoothingMode = SmoothingMode.HighQuality ;oGraphic.InterpolationMode = InterpolationMode.HighQualityBicubic ;// Definisco un'area rettangolare della dimensione finaleRectangle oRectangle = new Rectangle(0, 0, (int)finalW, (int)finalH);// Ridimensiono e croppo:// in pratica tutta l'operazione sta in questo metodo, che esiste in 30 versioni// questa prende una zona dell'immagine originale (da cropStartX-Y con dimensioni// cropW-cropH) e la disegna nel rettangolo appena definito dell'oggetto graphic.oGraphic.DrawImage(oImg, oRectangle,(float)cropStartX,(float)cropStartY,                        (float)cropW,(float)cropH,GraphicsUnit.Pixel);// Poi salvo il file in formato jpegoThumbNail.Save(outputFileName,ImageFormat.Jpeg); // "Butto" i due oggetti immagineoImg.Dispose(); oThumbNail.Dispose(); Tutto questo cercando su MSDN, dalla necessità alla "produzione" in mezza giornata. powered by IMHO 1.2

«May»
SunMonTueWedThuFriSat
24252627282930
1234567
891011121314
15161718192021
22232425262728
2930311234