log4net – SQLite appender


A volte non è necessario scomodare SQL Server per fare un minimo di tracing/logging. A volte basta il tracing di ASP.NET. A volte vogliamo un file di testo o un file XML. Io ho avuto bisogno di configurare un appender per SQLite.

La documentazione ufficiale di log4net utilizza un appender configurato per un driver abbastanza datato (Finisar.SQLite.SQLiteConnection) che a me non andava.  
Dopo varie vicissitudini, sono riuscito a configurare un appender (funzionante) con un assembly leggermente recente.

<appender name="ADONetAppender" type="log4net.Appender.AdoNetAppender">
<connectionType
   value="System.Data.SQLite.SQLiteConnection, System.Data.SQLite" />
<connectionString value="Data Source=|DataDirectory|Trace.db3" />
<commandText
   value="INSERT INTO Log (Date, Thread, Level, Logger, User, Message)
          VALUES (@date, @thread, @level, @logger, @user, @message)" />
<commandType value="Text"/>
<bufferSize value="100" />
<parameter>
    <parameterName value="@date" />
    <dbType value="DateTime" />
    <layout type="log4net.Layout.RawTimeStampLayout" />
</parameter>
<parameter>
    <parameterName value="@thread" />
    <dbType value="String" />
    <size value="255" />
    <layout type="log4net.Layout.PatternLayout">
        <conversionPattern
value="%thread" />
    </layout>
</parameter>
<parameter>
    <parameterName value="@level" />
    <dbType value="String" />
    <size value="50" />
    <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%level" />
    </layout>
</parameter>
<parameter>
    <parameterName value="@logger" />
    <dbType value="String" />
    <size value="255" />
    <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%logger" />
    </layout>
</parameter>
<parameter>
    <parameterName value="@user" />
    <dbType value="String" />
    <size value="50" />
    <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%X{user}" />
    </layout>
</parameter>
<parameter>
    <parameterName value="@message" />
    <dbType value="String" />
    <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%m" />
    </layout>
</parameter>
</appender>

HTH,
a.

author: Antonio Santise | posted @ sabato 27 giugno 2009 18.46 | Feedback (0)

log4net – ConversionPattern


Sul fatto che log4net sia potente, non si discute.
Sul fatto che sia leggermente ostico… qualcosina si potrebbe dire.
Io, ad esempio, ho avuto difficoltà a trovare come configurare i layout pattern (quelle stringhe fatte di tanti % e lettere, come “%C %F %L %l %M”). Paradossalmente sono riuscito a trovare prima la versione originaria della documentazione a supporto dei pattern di concatenazione dei messaggi per log4j e finalmente questa per log4net.

Di solito, nei miliardi di esempi di configurazione che circolano per la rete, si trovano dei pattern +/- standard come il seguente: “%date %thread %level %logger %message%newline”.
Dando un’occhiata al link di cui sopra, ci si accorge delle forti customizzazioni che si possono fare sul logging (o tracing, che dir si voglia).

HTH,
a.

author: Antonio Santise | posted @ sabato 27 giugno 2009 18.30 | Feedback (0)

[OT] Quando “sempre online” vuol dire “…quando possibile”


Prendo spunto da un post di Andrea Benedetti e cito anche quello di Andrea Saltarello che, a modo suo, parla di qualità del software per un piccolo sfogo su un disservizio che non dovrebbe esserci, per un sacco di buone ragioni:

  • una banca online deve essere online sempre (sempre, secondo me, vuol dire almeno 9 volte su 10; se capita 2 volte di fila a distanza di qualche giorno che io non possa accedere al mio conto online, personalmente comincio a dubitare della efficienza con la quale vengono amministrati i miei risparmi)
  • mi ripeto: una banca online _non_ può permettersi di andare offline perché i soldi che si spendono in consulenze, outsourcing ecc sono davvero tanti

Veniamo a 2 esempi concreti.
Conosco una nota banca online (esiste solo online) che è sempre giù dalle 23.30 circa in poi (sono arrivato a provare anche alle 2.00 di notte). “Sempre giù” significa che non ti fanno accedere al tuo conto corrente o, nelle migliori delle ipotesi, accedi ma non vedi nulla… qualunque voce di menu risulta attiva ma il dettaglio ti rimanda ad una pagina di errore con un messaggio del tipo “servizio temporaneamente non disponibile”.
“temporaneamente” pensavo volesse dire qualche minuto, qualche ora al massimo… per qualche giorno, magari per attività straordinarie sui sistemi… ma non che ci fossero gli stessi problemi tutte le notti, negli stessi orari… allora mettete sul sito un messaggio del tipo “banca online solo nelle ore diurne”.
Ho contattato il servizio di assistenza, giusto per chiedere (e rompere un po’) e mi è stato detto che ogni notte, “siccome ci sono pochi utenti che usano il conto”, fanno operazioni di backup…

LA (prima) banca online italiana è sempre online, tranne qualche mattina presto (massimo le 10.00), pbmente perché qualche operazione di backup o manutenzione è andata a p...ne non è andata a buon fine e il poverino dell'application management (un help desk evoluto) che si trova in turno di mattina deve risolvere i problemi :) Ne ho visto qualcuno di questi all’opera, e vi assiuro che non è gradevole trovarsi nei paraggi quando il poverino fa query su query per capire cosa sia successo. Specie se tu sei cattolico e a lui piacciono i calendari :s

Due esperienze diverse, usano tecnologie differenti, la seconda banca è nettamente più affidabile della prima, IMHO, ma non per il taglio tecnologico, bensì per la filosofia che ha sempre adottato. Inoltre, in più di 10 anni non ho mai visto un messaggio del tipo “il server IIS o Apache non risponde” o “le operazioni di backup non sono terminate”… o messaggi tecnici di questo tipo.

Per tornare al messaggio di Andrea... all'utente che cavolo gliene frega del "DATA BASE non disponibile"?

author: Antonio Santise | posted @ venerdì 5 giugno 2009 0.14 | Feedback (0)

NHibernate – inverse attribute


Il mapping in file hbm è un’attività che non faccio spesso, ma quando la faccio mi scordo sempre se e come usare l’attributo “inverse” nelle collection.

A futura memoria segnalo questo post  di Brian Chavez che mi sembra più esauriente della documentazione ufficiale di NH.

Suppose you have ParentTable (parentId PK, parentcol1, parentcol2) and ChildTable(childid PK, parentid FK, childcol1, childcol2).  In a one-to-many relationship, you will have one parent and many children.  The ChildTable has a primary key and foreign key.   The foreign key is a reference to the primary key in the ParentTable.  If you look at the ChildTable, you will notice that the ChildTable stores extra information about a row in the ParentTable via the ChildTable's parentId foreign key.  Using this perspective, the "child" owns (knows about) the relationship it has with its parent row.  So, the child will be the owner of the relationship in this one-to-many relationship.

Quindi “the child will be the owner of the relationship in this one-to-many relationship” e di conseguenza, siccome il parent non è l’owner della relazione, è considerato l’inverso (il “target”).

In Hibernate, you might encounter the inverse="true" attribute being used in the definition of a bidirectional relationship. If so, don't worry, because this feature is equivalent to ... the non-owner of the relationship whose table doesn't have the foreign key. Similarly, the Hibernate inverse="false" attribute is equivalent to the ... owner of the relationship whose table has the foreign key.

La cosa più importante è che

[…] a Hibernate mapping with inverse="true" set on the many-to-one side of a bidirectional relationship. If you find such a mapping, you should change it ..., as it is not a best practice in Hibernate and does not generate optimal SQL. For instance, if the many-to-one side is set to inverse="true" then every time you create a child, Hibernate will execute two SQL statements, one to create the child and one to update the child with the foreign key of the parent.

hth

Technorati Tag:

author: Antonio Santise | posted @ lunedì 25 maggio 2009 17.18 | Feedback (0)

Cloud Computing


Se qualcuno non ha ancora ben chiaro cosa sia… direi che questo video toglie ogni dubbio.


HTH

author: Antonio Santise | posted @ venerdì 27 marzo 2009 12.00 | Feedback (0)

Ivar Jacobson esiste! Io l’ho visto!


Avete presente quando leggete un sacco di libri su (o di) un personaggio e dopo un po’ lo metabolizzate (o astraete) come entità fantastica, un ectoplasma frutto solo dell’immaginazione umana?
Bene, per me Ivar era quasi questo :)

Oggi sono stato alla conference in Microsoft. Speaker d’eccezione come Lorenzo e Giancarlo, ma anche altri… ma soprattutto lui: Ivar in persona.

Una “entità” di quel calibro non ti aspetti neanche che invecchi! Eppure è lì, davanti a me, spiritoso, pungente e chiaro!

Ha aperto le sessioni, presentato in modo secondo me ingrato, però resta una mia opinione :)

Qualcuna delle massime, per mia personale memoria e a futuro monito:

  • Alla domanda che spesso gli fanno “Cosa pensi dello Unified Process oggi?”, lui risponde “UP è una mia creatura (baby) ma il bambino è cresciuto (its' grow up!)”… riflette un po’ il risultato prodotto da un gruppo di programmatori che devono realizzare un cavallo :)
  • A fool with a tool is a dangerous fool
  • Software is developed by people, not by process and tools
  • We have two classes of people: developers and testers! (unsmart)
    We are all testers! (this is smart)
  • If the modeling language isn’t executable, focus on the essentials only: the skinny system
  • Myth: The idea that you document software so people later can read what you did.
    Law of nature: People don’tread documents

E ancora sulle metodologie, il passaggio chiave:

non serve adattarsi alla metodologia, ma occorre adattare la metodologia al proprio modo di lavorare

Questa la incornicio come facevo con le leggi di Maxwell! :)

Non ho riportato tutto: lui ha dato degli spunti sui quali riflettere e sui quali si potrebbero scrivere altri n libri. Rileggerò le slide che ci hanno consegnato a fine giornata. Peccato siano in pdf e non ci siano le spiritose animazioni che tanto lo divertivano :D

Evento da non perdere anche solo per la sua sessione, senza nulla togliere agli altri speaker.
Ultima nota di colore: è stato introdotto con una frase simile alla seguente (spero di riuscire a comunicare almeno il senso): “Ora lascio la parola a Ivar Jacobson, che ha realizzato… ho preso nota - leggendo da un appunto - lo Unified Modeling Language, cioè un linguaggio di modellazione.
Io volevo seppellirmi, ma spero capisca poco l’italiano :s

a.

author: Antonio Santise | posted @ mercoledì 11 marzo 2009 22.10 | Feedback (2)

Gestire un progetto .Net v1.1 in VS2008


Il titolo del post poteva essere "A volte ritornano", ma sarebbe stato decisamente OT.
Di questi tempi meglio evitare.

Ho dovuto metter su un progetto in poco più di 2 giorni, un mini-cms per la gestione di qualche contenuto... poco più "del sito dell'amico", insomma.
Il problema: il sito stava su un server telecom dislocato chissà dove (forse in server farm a Rozzano, forse nello sgabuzzino di qualche smanettone). Non si poteva chiedere il setup di un db di qualche tipo, non si avevano le specifiche del server, e il progetto non richiedeva queste grandi risorse.
L'ho preso a scatola chiusa, ho smanettato cn Linq to XML, finito in mezza giornata. Poi il dubbio: forse il framework 3.5 non è molto supportato su un server telecom di qualche anno fa. Chiedere l'upgrade sarebbe stata la morte (un requisito non funzionale era l'urgenza).
Quindi ho dovuto fare un downgrade al framework 1.1. Non avevo visual studio 2003, e non pensavo minimamente di installarlo su Vista, con tutte le p. del caso (front page ext., j# r.p., ecc).

Cercando in rete ho trovato come gestire un progetto .Net 1.1 con Visual Studio 2008 (e anche 2005):

  • installare l'sdk del framework 1.1
  • installare MSBuild Extras – Toolkit for .NET 1.1 (is an addition to MSBuild that allows developers to build managed applications using Visual Studio 2005 projects that target .NET 1.1)
  • scaricarsi questo allegato
  • leggersi questo, questo ma soprattutto questo post.

E mentre il download di VS2003 era arrivato al 15%, con piacere ho premuto sul tasto "cancel" del download manager. Son soddisfazioni! :D

Sicuramente lavorare con VS2003 e .Net 1.1 non è il massimo per un dev che cerca di tenersi al passo... ma sempre meglio che tornare a lavorare in VB6! ;)

author: Antonio Santise | posted @ martedì 10 febbraio 2009 14.09 | Feedback (3)

LINQ to XML : Querying XML with Namespaces


Se avete la necessità di usare LINQ con una fonte XML e avete definito un namespace, LINQ restituirà i dati correttamente solo se specificherete il namespace da utilizzare.

Alla fonte: LINQ to XML : Querying XML with Namespaces

hth

author: Antonio Santise | posted @ venerdì 6 febbraio 2009 16.51 | Feedback (0)

Essential ITIL: What You Need To Succeed


Segnalo e segno a futura memoria questo interessante documento _molto_ introduttivo sull'ITIL, scritto da Malcolm Fry (CA) http://www.ca.com/files/WhitePapers/essential-itil-what-you-need-to-succeed.pdf. In pratica si pone la seguente domanda: "Da dove cominciare?" E cerca di rispondere a suo modo. HTH

author: Antonio Santise | posted @ sabato 20 dicembre 2008 0.03 | Feedback (0)

Describing RESTful Applications


Interessante aticolo sul come ci si debba approcciare ai serivizi REST-ful. http://www.infoq.com/articles/subbu-allamaraju-rest Da leggere. Anche i commenti.

author: Antonio Santise | posted @ sabato 20 dicembre 2008 0.01 | Feedback (0)