The official Fatica Labs Blog! RSS 2.0
# Friday, May 14, 2010

Un problema veramente divertente: collegandomi ad Oracle Express, ma probabilmente lo stesso accade con l’edizione ufficiale, la connessione mi falliva con:


Oracle.DataAccess.Client.OracleException : ORA-12154: TNS: impossibile risolvere l'identificativo di connessione specificato

 

ovvero

 

TNS:could not resolve service name

sulla stessa macchina un’altra applicazione, con la medesima connection string funzionava perfettamente. Ora l’applicazione non funzionante era un test con NUnit, e sulle macchine a 64 bit il setup installa in ProgramFiles( x86 ). Pare che il client Oracle faccia qualche considerazione sulla directory in cui si trova il chiamante, e questo fallisca se ci sono dei caratteri strani ( secondo Oracle ) come le parentesi.Spostando NUnit in un percorso senza parentesi nel nome, tutto funziona. Indagando sul web, ho trovato una conferma al problema ivi descritto. Ho perso la mattinata appresso ad una stupidaggine :-~.

Friday, May 14, 2010 1:18:52 PM (GMT Daylight Time, UTC+01:00)  #    Comments [0] - Trackback
Programmin

# Thursday, May 13, 2010

clip_image001

 

Fabio Maulo propone un sondaggio per la versione di NH in uscita. Dovrà compilare su Fx 3.5 o 4.0 ?

Personalmente preferirei ancora un uscita in 3.5. Votate!

Thursday, May 13, 2010 7:53:23 AM (GMT Daylight Time, UTC+01:00)  #    Comments [0] - Trackback
NHibernate

# Thursday, May 06, 2010

Può essere interessante, quando si sviluppano e si utilizzano in modalità test servizi di windows, avere una modalità di funzionamento “Console”, che ci permetta di lanciare il nostro servizio come una console application per vedere “cosa fa” senza stare lì ad aprire ogni secondo il file di log. Ovviamente dobbiamo prevedere un sistema di logging che scriva anche sulla console  (se per loggare usate log4net, allora basta mettere un ConsoleAppender, o meglio ancora, un ColoredConsoleAppender). Per farlo basta creare la solita WindowsServiceApplication, avendo però cura di impostare il progetto come console:

consoleapp

Il main dovrà essere modificato in questoi modo

   1:          static void Main(string[] args)
   2:          {
   3:              if (!Environment.UserInteractive)
   4:              {
   5:                  log.Info("Starting as a service...");
   6:                  ServiceBase[] ServicesToRun;
   7:                  ServicesToRun = new ServiceBase[] 
   8:                  { 
   9:                      new Service1() 
  10:                  };
  11:                  ServiceBase.Run(ServicesToRun);
  12:              }
  13:              else
  14:              {
  15:                  log.Info("Starting as a console...");
  16:                  var s = new Service1(log);
  17:                  s.GetType().GetMethod(   "OnStart"
  18:                                          ,BindingFlags.Instance|BindingFlags.NonPublic
  19:                                          ).Invoke(s,new object[]{args});
  20:                  Console.WriteLine("Press enter to exit the console mode");
  21:                  Console.ReadLine();
  22:                  s.GetType().GetMethod(      "OnStop"
  23:                                              , BindingFlags.Instance | BindingFlags.NonPublic
  24:                                              ).Invoke(s, null);
  25:              }
  26:          }
 
 
 

Alla linea 3 il codice che ci permette di capire se siamo stati lanciati da uno user “vero” o dal sistema,e quindi scegliamo se partire nel modo tradizionale oppure in modalità console. Se a questo codice aggiungiamo anche la possibilità di interpretare la command line e di autoinstallarsi, abbiamo un buon segmento di codice da riusarsi per ogni WindowService.

Thursday, May 06, 2010 8:23:11 AM (GMT Daylight Time, UTC+01:00)  #    Comments [3] - Trackback
Recipes

# Monday, May 03, 2010

Quando andiamo in deploy con un servizio C# abbiamo l’opzione di utilizzare installutil.exe per “installare” il servizio, ovvero far si che compaia nel Service Control Manager. Tuttavia è possibile fare la stessa cosa programmaticamente, e farlo semplifica la vita a chi installera il vostro servizio. L’idea è che il main del servizio risponda a dei comandi sulla cmd line, per esempio “—install” o “—uninstall” in modo  che l’unico strumento che serve in fase di deploy sia il servizio stesso.

Ecco dunque la ricetta: si deve intendere “ricetta” come un segmento di codice troppo piccolo da essere messo in una libreria, ma troppo importante per essere dimenticato :-)

La ricetta in oggetto è quindi composta di due funzioni:

Install()

   1:          private static void Install()
   2:          {
   3:              ServiceProcessInstaller ProcesServiceInstaller = new ServiceProcessInstaller();
   4:              ProcesServiceInstaller.Account = ServiceAccount.LocalSystem;
   5:             
   6:              ServiceInstaller ServiceInstallerObj = new ServiceInstaller();
   7:              InstallContext Context = new System.Configuration.Install.InstallContext();
   8:              String path = String.Format("/assemblypath={0}", Assembly.GetExecutingAssembly().Location);
   9:              String[] cmdline = { path };
  10:   
  11:              Context = new System.Configuration.Install.InstallContext("", cmdline);
  12:              ServiceInstallerObj.Context = Context;
  13:              ServiceInstallerObj.DisplayName = "Nome da visualizzare in SCM";
  14:              ServiceInstallerObj.Description = "Descrizione del servizio";
  15:              ServiceInstallerObj.ServiceName = "NomeDelServizio";
  16:              ServiceInstallerObj.StartType = ServiceStartMode.Automatic;
  17:              ServiceInstallerObj.Parent = ProcesServiceInstaller;
  18:   
  19:              System.Collections.Specialized.ListDictionary state = new System.Collections.Specialized.ListDictionary();
  20:             
  21:              ServiceInstallerObj.Install(state);
  22:          }

Uninstall()

   1:          private static void Uninstall()
   2:          {
   3:              ServiceProcessInstaller ProcesServiceInstaller = new ServiceProcessInstaller();
   4:              ProcesServiceInstaller.Account = ServiceAccount.LocalSystem;
   5:   
   6:              ServiceInstaller ServiceInstallerObj = new ServiceInstaller();
   7:              InstallContext Context = new System.Configuration.Install.InstallContext();
   8:              String path = String.Format("/assemblypath={0}", Assembly.GetExecutingAssembly().Location);
   9:              String[] cmdline = { path };
  10:   
  11:              Context = new System.Configuration.Install.InstallContext("", cmdline);
  12:              ServiceInstallerObj.Context = Context;
  13:              ServiceInstallerObj.ServiceName = "ServiceName";
  14:              ServiceInstallerObj.Uninstall(null);
  15:   
  16:          }
 

Importante: Per entrambe le funzioni, ServiceName deve essere uguale alla proprietà ServiceName del servizio che si vuole installare.

Monday, May 03, 2010 10:46:55 AM (GMT Daylight Time, UTC+01:00)  #    Comments [0] - Trackback
Recipes

# Thursday, April 29, 2010

s9cThere is some interesting news with HqlEditor: now it is able to translate the query using the proper parser ( Antlr or Classic ) depending on the NH version used to build the assembly in test. An error message is shown when the syntax is parsed as invalid.

 

 

 

 

 

 

 

A first table containing the entities is present too, here below a screenshot:

s10a

As you can probably notice, the data grid is not a real grid. This is because is not so easy to present an NH graph without converting it in some sort of DTO, but I don’t want to add anything but the query process itself. So I decided to use a sort of JSON serializer to present each object in a textual fashion. In the toolbar there is the query limit too: this act by adding a SetFirstResult(), SetMaxResults() function call in the query creation. Using a count=0 forces the system to avoid limiting the query: if the data you retrieve is a big bounch you will probably experience some delay, but should be useful in the case the driver does not support limits.

Thursday, April 29, 2010 5:09:29 PM (GMT Daylight Time, UTC+01:00)  #    Comments [1] - Trackback
HQL Intellisense | NHibernate | NHWorkBench

# Wednesday, April 28, 2010

Questo post sarà un po vecchiotto, ma è di utilità eccezionale, perchè è difficile trovare documentazione specifica sull argomento. In pratica illustra come creare le classi per serializzare/deserializzare un XML basandosi sullo schema XSD che lo definisce. In pratica il codice mostrato nel post ci fa vedere come emulare in tutto e per tutto il comportamento di XSD.EXE /classes myfile.xsd /namespace:somenamespace. Non serve riscrivere XSD.EXE nella realtà, ma porebbe fare comodo, per esempio, avere una serializzazione / deserializzazione dinamica di uno stream XML basata su un XSD configurabile. Avere un tipo dinamico ci permette poi di giocare con i nostri stream XML per esempio con un approccio a Template, per esempio per fare dei tool di import/export da sistemi legacy facilmente configurabile.

path5cccc9

Quindi non molto diverso, anzi pressoche uguale all’approccio XSLT: difatti questo deve essere considerato una possibile alternativa a XSLT, con una sintassi più facile ( dipende dal template, ed in ogni caso il pensiero è opinabile ), ma almeno taglai via tutta la parte di estrazione xpath, e poi, avere un vero tipo in memoria apre la porta ad ulteriori “instrumantazioni” che forse in puro testo non sono possibili.

Wednesday, April 28, 2010 10:33:35 PM (GMT Daylight Time, UTC+01:00)  #    Comments [0] - Trackback


My Stack Overflow
Contacts

Send mail to the author(s) E-mail

Tags
profile for Felice Pollano at Stack Overflow, Q&A for professional and enthusiast programmers
About the author/Disclaimer

Disclaimer
The opinions expressed herein are my own personal opinions and do not represent my employer's view in any way.

© Copyright 2012
Felice Pollano
Sign In
Statistics
Total Posts: 143
This Year: 3
This Month: 0
This Week: 0
Comments: 105
This blog visits
All Content © 2012, Felice Pollano
DasBlog theme 'Business' created by Christoph De Baene (delarou) and modified by Felice Pollano