Zėŋōfōbìå

18 marzo 2008

Parsing internazionale di numeri

Filed under: C#, informatica — Tag: — Zeno @ 8:44

Il parsing delle stringhe è un problema legato all’internazionalizzazione del codice ma anche all’interfacciamento di ambienti diversi. Tipicamente un server in inglese ed uno in italiano comunicheranno le proprie informazioni con stringhe diverse. A prescindere dal fatto che, la dove
possibile occorra usare una codifica indipendente dalla lingua, la soluzione fornita da .Net è la seguente:

1 int.Parse(“32.768”);
2 int.Parse(“32,768”, System.Globalization.NumberFormatInfo.InvariantInfo);

15 novembre 2007

Compatibilita dei Thread con C# 2.0

Filed under: C#, informatica, Linguaggi — Tag:, , , — Zeno @ 10:18

Fare il porting di una applicazione Windows Form C# 1.1 verso C# 2.0 comporta delle modifiche impegnative. Una delle difficoltà da affrontare riguarda il fatto che con C# 2.0 non è più possibile, da parte di un Thread diverso da quello di una certa form, di accedere ai suoi componenti grafici.

Le soluzioni sono due: correggere tutti gli accessi con degli Invoke oppure settare un flag di compatibilità con 1.1:

CheckForIllegalCrossThreadCalls = false;

4 aprile 2007

Delegati e Invoke in C# 2.0

Filed under: C#, informatica — Tag:, , , — Zeno @ 13:22

Il primo impatto con C# 2.0, tipicamente, è negativamente legato all’impossibilità di invocare dei metodi da thread differenti con un approccio diretto.

Supponiamo da un thread di dover modificare la label della form principale, segue una soluzione estremamente semplice:

myLabel.Invoke((MethodInvoker)delegate
{
    myLabel.Text = "What a great post";
});

24 marzo 2007

Gestire i log con log4net

Filed under: C#, informatica — Tag:, — Zeno @ 11:01

Ho sempre dedicato una fetta del tempo di sviluppo di qualunque applicazione di un certo rilievo alla realizzazione di una libreria di log che fosse comoda e adatta alle esigenze del programma. In genere quello che occorre è sempre uguale: una routine che permetta di salvare su un file, piuttosto che in un sql, un insieme di informazioni che comprenda: data del log, entità del problema, thread, riga del file di codice (ammesso che sia possibile), messaggio.
Mi è capitato più di una volta di perdere del tempo per una cattiva implementazione della libreria, alla quale non si vuole dedicare mai troppo tempo.

Sto provando Log4Net, soluzione di Apache che mi pare eccellente. Modulare, configurabile, comoda, semplice, è una meraviglia.

Un esempio per chiarirne la comodità:

using log4net;
using log4net.Config;

...
static class Program
{
    private static readonly ILog log =
        LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);

    static void Main()
    {
        // Set up a configuration taken from xml.
        XmlConfigurator.Configure(new System.IO.FileInfo("logfile.xml"));

        log.Info("Main");
    }
}

Notate che non viene determinata la forma del log: questa è descritta nel file xml logfile.xml, che contiene:

<?xml version="1.0" encoding="utf-8" ?>

<log4net>
  <appender name="RollingFile" type="log4net.Appender.RollingFileAppender">
    <file value="filelog.log" />

    <appendToFile value="true" />
    <maximumFileSize value="1000KB" />
    <maxSizeRollBackups value="10" />

    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%date [%thread] %-5level %logger (%file:%line) - %message%newline" />
    </layout>

  </appender>

  <root>
    <level value="DEBUG" />
    <appender-ref ref="RollingFile" />

  </root>
</log4net>

In questa maniera vengono creati dei file di nome myproject.log, per un massimo di 100Kb e 20 files.
conversionPattern definisce la formattazione, che in questo caso produce log del tipo:

2007-03-22 15:27:43,923 [10] INFO Program (C:ProgettitestLog4net.cs:26) - Main

Crea un sito o un blog gratuitamente presso WordPress.com.