Toni Tassani's blog about books, comics, agile, software development, java, Linux, Oracle, Barcelona and whatever. In English, Catalan or Spanish
Thursday, July 29, 2010
Estic llegint: La dictadura de la incompetència
De Xavier Roig. 2008 (5a edició gener 2009). Publicat per La Campana. 193 pàgines.
Em van deixar aquest llibre dient-me que resultava molt revelador. Que explicava moltes coses de economia i de política de Catalunya força interessants.
M'ha resultat fàcil de llegir i molt interessant. Tot el contingut és (malauradament) força vigent, donat la data en la que va ser escrit, excepte quan parla amb detall de la crisi econòmica.
L'autor és del sector de les tecnologies i escriu (o escrivia) al diari Avui, i la seva prosa és molt assequible, esquitxada d'acudits per facilitar l'entrada d'algunes realitats.
Analitza l'educació, el funcionariat i els polítics. Explica que la majoria dels polítics que configuren els parlaments espanyol i català eren funcionaris abans de dedicar-se a la política, a diferència d'altres parlaments més equilibrats. Defensa el capitalisme democràtic basat en la competència, i ho fa d'una forma molt didàctica. Critica el sistema electoral de les llistes tancades, que només beneficia als partits polítics. Tot plegat fa una bona repassada a la manera de fer dels catalans en matèria de política i economia. I de vegades produeix esgarrifances.
Molt recomanable.
Labels:
Estic llegint,
Lectures
Monday, July 26, 2010
Bobby McFerrin a TV3
Diumenge, per casualitat, vam veure un tros del concert que va fer Bobby McFerrin amb l'Orfeó Català al Palau de la Música Catalana (i que també està editat en CD). No havia vist un directe seu des del Circlesongs i em vaig quedar bocabadat. El que més em va agradar és que el meu fill també es va quedar hipnotitzat, totalment captivat per la música i el joc que feia el cantant amb el públic.
Veig, a la web de música clàssica de TV3, que repeteixen el concert la matinada del dissabte 1 d'agost. A veure si li puc gravar.
Bobby McFerrin és molt més que el Don't Worry Be Happy. Al YouTube pots trobar moltíssimes genialitats. Aquí hi ha un vídeo en el que fa una demostració de l'escala pentatònica (una escala musical de cinc notes en comptes de set) i com la coneixem tots de forma inconscient.
Veig, a la web de música clàssica de TV3, que repeteixen el concert la matinada del dissabte 1 d'agost. A veure si li puc gravar.
Bobby McFerrin és molt més que el Don't Worry Be Happy. Al YouTube pots trobar moltíssimes genialitats. Aquí hi ha un vídeo en el que fa una demostració de l'escala pentatònica (una escala musical de cinc notes en comptes de set) i com la coneixem tots de forma inconscient.
Labels:
General
Syntax Highlighting del codi font al blogger
Al post anterior volia posar el codi font amb colorets, amb ressaltat de sintaxi, de la mateixa manera que es pot veure en qualsevol editor modern. Amb el tallar-i-enganxar de l'Eclipse pots portar-te el resaltat a un editor de texts (Word o OpenOffice.org Writer) per què per dintre exporta RTF, però després això no funciona bé en un pàgina Web.
Vaig buscar força i veig que hi ha tres tipus de solucions (potser hi ha més):
La solució que he triat és de les primeres, un codi HTML autònom que es diu Highlight (l'onzè de la llista) i que té versió on-line i també es pot instal·lar. Jo he fet servir la versió online i funciona molt bé també per trossos de codi. De Color Theme he triat Typical i ha quedat força bé.
Pel format del blog he hagut d'editar el codi generat per reduir la mida de la font (a 8pt) i per afegir a l'estil de l'etiqueta
Opino que ha quedat força bé però en un altre moment provaré alguna solució de les del JavaScript, que hi ha una de Google i un parell basades amb jQuery.
Vaig buscar força i veig que hi ha tres tipus de solucions (potser hi ha més):
- A partir del codi font generar un codi HTML autònom que puguis posar a la teva pàgina Web.
- Generar un codi HTML juntament amb un CSS. Això pot ser problemàtic en un Blog si no vols tocar la plantilla.
- Fer servir un JavaScript que faci el highlight en temps d'execució.
La solució que he triat és de les primeres, un codi HTML autònom que es diu Highlight (l'onzè de la llista) i que té versió on-line i també es pot instal·lar. Jo he fet servir la versió online i funciona molt bé també per trossos de codi. De Color Theme he triat Typical i ha quedat força bé.
Pel format del blog he hagut d'editar el codi generat per reduir la mida de la font (a 8pt) i per afegir a l'estil de l'etiqueta
<pre>
l'opció per què pugui fer scroll horitzontal si no hi cap en una línia: overflow: scroll;
.Opino que ha quedat força bé però en un altre moment provaré alguna solució de les del JavaScript, que hi ha una de Google i un parell basades amb jQuery.
Labels:
Tècnic
Wednesday, July 21, 2010
Xifrat i desxifrat entre Java i PHP
Se'ns va presentar la necessitat d'implementar un xifrat (encriptació no figura al diccionari) de dades des d'una aplicació Java que després s'havia de desxifrar des d'un PHP.
En teoria els algorismes de xifrat són genèrics i independents del llenguatge de programació. En la realitat sempre hi ha sorpreses. Ja vaig haver de patir per una altra interoperabilitat similar entre PL/SQL i Java, així que anava avisat.
Per xifrar i desxifrar des de Java es fa amb la Java Cryptography Architecture (JCA). Cal indicar l'algorisme i el tipus de padding, i sel·leccionar i una clau i un vector d'inicialització.
Per fer-ho des de PHP cal fer servir el mòdul mcrypt. En funció del sistema operatiu cal revisar que estigui instal·lat el mòdul (revisant el
Caldrà triar un algorisme de xifrat que sigui vàlid als dos entorns i nosaltres vam triar compartir el resultat en format hexadecimal. També és important triar la mida de la clau i del vector d'incialització. Per encriptació de 128-bits la clau ha de ser de 16 bytes i per 256-bits de 32 bytes.
El problema entre els dos llenguatges és com tracten el padding, el farcit de caràcters fins arribar a la mida de cadena correcta. Mcrypt sempre farceix amb \0 (null) i no pas amb espais.
Jugant amb trims i NoPaddings de Java s'aconsegueix la màgia. Nosaltres vam triar encriptació amb AES de 128 bits.
El xifrat a Java es fa així:
El desxifrat a PHP el fem així:
En teoria els algorismes de xifrat són genèrics i independents del llenguatge de programació. En la realitat sempre hi ha sorpreses. Ja vaig haver de patir per una altra interoperabilitat similar entre PL/SQL i Java, així que anava avisat.
Per xifrar i desxifrar des de Java es fa amb la Java Cryptography Architecture (JCA). Cal indicar l'algorisme i el tipus de padding, i sel·leccionar i una clau i un vector d'inicialització.
Per fer-ho des de PHP cal fer servir el mòdul mcrypt. En funció del sistema operatiu cal revisar que estigui instal·lat el mòdul (revisant el
phpinfo
) i mirar quins ciphers i modes són actius.Caldrà triar un algorisme de xifrat que sigui vàlid als dos entorns i nosaltres vam triar compartir el resultat en format hexadecimal. També és important triar la mida de la clau i del vector d'incialització. Per encriptació de 128-bits la clau ha de ser de 16 bytes i per 256-bits de 32 bytes.
El problema entre els dos llenguatges és com tracten el padding, el farcit de caràcters fins arribar a la mida de cadena correcta. Mcrypt sempre farceix amb \0 (null) i no pas amb espais.
Jugant amb trims i NoPaddings de Java s'aconsegueix la màgia. Nosaltres vam triar encriptació amb AES de 128 bits.
El xifrat a Java es fa així:
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
...
private String padString(String source) {
char paddingChar = ' ';
int size = 16;
int padLength = size - source.length() % size;
for (int i = 0; i < padLength; i++) {
source += paddingChar;
}
return source;
}
public String encrypt(String text) {
String encrypted = null;
try {
cipher = Cipher.getInstance("AES/CBC/NoPadding");
} catch (Exception e) {
logger.error("Error creating cipher instance", e);
}
try {
SecretKeySpec keySpec = new SecretKeySpec(key.getBytes(), "AES");
IvParameterSpec ivSpec = new IvParameterSpec(iv.getBytes());
if (cipher != null) {
cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivSpec);
byte[] res = cipher.doFinal(padString(text).getBytes());
encrypted = asHex(res);
}
} catch (Exception e) {
logger.error("Error ciphering", e);
}
return encrypted;
}
El desxifrat a PHP el fem així:
function decrypt($param) {
$cipher = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_CBC, '');
$key128 = '0123456789ABCDEF';
$iv = 'FEDCBA9876543210';
$decrypted = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key128, hex2bin($param), MCRYPT_MODE_CBC, $iv);
$decrypted = trim($decrypted);
return $decrypted;
}
Labels:
Tècnic
Monday, July 19, 2010
Estic llegint: El enigma de la calle Calabria
De Jerónimo Tristante. 2010. Publicat per Maeva. 300 pàgines.
És curiós llegir una novel·la d'un autor que coneixes. De fet no conec personalment a en Jerónimo, però és amic del meu cunyat i això retalla els graus de separació. :-)
Aquesta novel·la és la tercera del mateix personatge, en Víctor Ros, un detectiu de la policia de finals del segle XIX, que és un precursor en l'ús de la ciència i del mètode deductiu per tal de resoldre els casos.
L'any passat vaig llegir la segona novel·la d'aquesta sèrie, El caso de la viuda negra, i haig de dir que aquest m'ha agradat molt més, té més ritme i és més entretinguda.
Tot i així, hi ha un parell de detalls que m'han distanciat a l'hora de llegir.
Un és que en Víctor Ros és un Sherlock Holmes castís, però com a mínim Sherlock tenia un greu defecte que el feia més humà. En Víctor de vegades resulta insuportable.
L'altra és l'aparició de personatges reals (com Gaudí o Monturiol). De vegades una mica forçat i que no feia falta per crear entorn històric i posar realisme.
El fet que estigui ambientada a Barcelona ha estat un atractiu addicional. I crec que el personatge del dolent està molt ben trobat. De fet, m'imagino que no serà la darrera vegada que el veiem...
Estic desitjant llegir una altra novel·la del mateix autor i que no està protagonitzada per Víctor Ros, 1969. D'aquesta m'han parlat molt bé. I clar, esperarem a la propera aventura del nostre detectiu. I tant!
És curiós llegir una novel·la d'un autor que coneixes. De fet no conec personalment a en Jerónimo, però és amic del meu cunyat i això retalla els graus de separació. :-)
Aquesta novel·la és la tercera del mateix personatge, en Víctor Ros, un detectiu de la policia de finals del segle XIX, que és un precursor en l'ús de la ciència i del mètode deductiu per tal de resoldre els casos.
L'any passat vaig llegir la segona novel·la d'aquesta sèrie, El caso de la viuda negra, i haig de dir que aquest m'ha agradat molt més, té més ritme i és més entretinguda.
Tot i així, hi ha un parell de detalls que m'han distanciat a l'hora de llegir.
Un és que en Víctor Ros és un Sherlock Holmes castís, però com a mínim Sherlock tenia un greu defecte que el feia més humà. En Víctor de vegades resulta insuportable.
L'altra és l'aparició de personatges reals (com Gaudí o Monturiol). De vegades una mica forçat i que no feia falta per crear entorn històric i posar realisme.
El fet que estigui ambientada a Barcelona ha estat un atractiu addicional. I crec que el personatge del dolent està molt ben trobat. De fet, m'imagino que no serà la darrera vegada que el veiem...
Estic desitjant llegir una altra novel·la del mateix autor i que no està protagonitzada per Víctor Ros, 1969. D'aquesta m'han parlat molt bé. I clar, esperarem a la propera aventura del nostre detectiu. I tant!
Labels:
Estic llegint,
Lectures
Sunday, July 18, 2010
Obtenir la DDL dels índexs d'Oracle Text
Per tal de crear els índex d'Oracle Text (el mecanisme de recerca textual que proporciona Oracle, i que s'ha anomenat al llarg del temps Intermedia Text, ConText, Text Server i no sé què més)... deia que per crear els índex d'Oracle Text no n'hi ha prou amb fer un
El més habitual és que l'administrador (o el desenvolupador) guardi les sentències de creació dels índexs de Text, però si no és així sempre ho pots deduir tirant de les vistes que comencen amb
El cas és que l'altre dia vaig trobar que a les noves versions d'Oracle Text ja tenen un mecanisme per obtenir la DDL (data definition language, les sentències de creació) dels índexs. I va molt bé! El nom de les preferències se les inventa, i si tens més d'un índex que vols que reaprofiti les preferències has d'adaptar els scripts que genera, però treu molta feina.
Ara n'hi ha prou amb fer servir
Això existeix, com a mínim, des de la versió 9.2 d'Oracle, però jo havia estat una mica allunyat.
Tens una versió del
CREATE INDEX
, sinó que cal especificar un munt de preferències (l'idioma, els caràcters separadors de paraula, etcètera).El més habitual és que l'administrador (o el desenvolupador) guardi les sentències de creació dels índexs de Text, però si no és així sempre ho pots deduir tirant de les vistes que comencen amb
CTX
.El cas és que l'altre dia vaig trobar que a les noves versions d'Oracle Text ja tenen un mecanisme per obtenir la DDL (data definition language, les sentències de creació) dels índexs. I va molt bé! El nom de les preferències se les inventa, i si tens més d'un índex que vols que reaprofiti les preferències has d'adaptar els scripts que genera, però treu molta feina.
Ara n'hi ha prou amb fer servir
CTX_REPORT.CREATE_INDEX_SCRIPT(index_name)
i et treu totes les sentències com un CLOB.Això existeix, com a mínim, des de la versió 9.2 d'Oracle, però jo havia estat una mica allunyat.
Tens una versió del
CREATE_INDEX_SCRIPT
com a funció i una altra com a procediment i si vols obtenir els scripts de tots els teus índexs textuals pots fer:
SELECT index_name, ityp_name, table_name, CTX_REPORT.CREATE_INDEX_SCRIPT(index_name)
FROM user_indexes
WHERE index_type='DOMAIN'
AND ityp_owner='CTXSYS'
Alapamui des d'Argentina
Un company d'Argentina, que no domina pas el català, m'ha dit que fent servir el Google Translator es pot llegir força bé l'Alapamuí. M'ha fet molta il·lusió!
Labels:
General
Saturday, July 17, 2010
Servei tècnic de Dell i de Toshiba
En molt poc temps se m'ha espatllat un portàtil Dell i un Toshiba, i he hagut de fer servir el seu servei tècnic.
El portàtil Dell estava ja fora de la garantia però, per sort, quan el vaig adquirir vaig comprar també una ampliació de garantia i aleshores sí que m'entrava. Fa que pensar. El cas és que la pantalla del meu XPS M1330 (que ja no la fan) va començar a fer coses rares. Vaig obrir una incidència per la seva Web, em van demanar que passés unes proves i que els hi enviés unes fotos i en res se'm van presentar per l'oficina i un tècnic em va canviar la placa base en 15 minuts. Una meravella.
Amb netbook Toshiba, un NB200, el cas és més curiós. Com era una màquina que em portava a tot arreu, i mogut per una paranoia amb la seguretat, li havia ficat un password a la BIOS: havia de posar una clau de pas cada cop que encenia la màquina. Fins aquí cap problema. El problema va venir quan vaig voler treure la clau. Continuava demanant-me la clau, però ja no funcionava la que jo li havia posat. Remenant per internet vaig trobar un senyor que li havia passat el mateix i que deia que era un bug a la BIOS. Fins i tot explicava com desmuntar la màquina i resetejar la password, per què resulta que Toshiba no ho considera un bug i et cobren per resetejar la password encara que estigui en garantia. Aquesta pàgina (Removing bios password in Toshiba Netbook NB200 - Jayson Online – Articles & Projects) curiosament va deixar d'estar accessible als pocs dies de la meva visita, així que no vaig poder prendre nota. Vaig portar la màquina a un servei tècnic de Barcelona (Tronik) i em van resetejar la password sense cobrar-me, tot indicant-me que no és un servei gratuït i que la propera vegada sí que m'ho cobraran. Van ser molt ràpids, també.
Haig de dir que ambdós portàtils són dues molt bones màquines però, com tot, de vegades tens incidències.
Mai havia hagut de fer servir serveis tècnics de portàtils i les dues experiències han estat molt bones. Així un es queda més tranquil, no?
El portàtil Dell estava ja fora de la garantia però, per sort, quan el vaig adquirir vaig comprar també una ampliació de garantia i aleshores sí que m'entrava. Fa que pensar. El cas és que la pantalla del meu XPS M1330 (que ja no la fan) va començar a fer coses rares. Vaig obrir una incidència per la seva Web, em van demanar que passés unes proves i que els hi enviés unes fotos i en res se'm van presentar per l'oficina i un tècnic em va canviar la placa base en 15 minuts. Una meravella.
Amb netbook Toshiba, un NB200, el cas és més curiós. Com era una màquina que em portava a tot arreu, i mogut per una paranoia amb la seguretat, li havia ficat un password a la BIOS: havia de posar una clau de pas cada cop que encenia la màquina. Fins aquí cap problema. El problema va venir quan vaig voler treure la clau. Continuava demanant-me la clau, però ja no funcionava la que jo li havia posat. Remenant per internet vaig trobar un senyor que li havia passat el mateix i que deia que era un bug a la BIOS. Fins i tot explicava com desmuntar la màquina i resetejar la password, per què resulta que Toshiba no ho considera un bug i et cobren per resetejar la password encara que estigui en garantia. Aquesta pàgina (Removing bios password in Toshiba Netbook NB200 - Jayson Online – Articles & Projects) curiosament va deixar d'estar accessible als pocs dies de la meva visita, així que no vaig poder prendre nota. Vaig portar la màquina a un servei tècnic de Barcelona (Tronik) i em van resetejar la password sense cobrar-me, tot indicant-me que no és un servei gratuït i que la propera vegada sí que m'ho cobraran. Van ser molt ràpids, també.
Haig de dir que ambdós portàtils són dues molt bones màquines però, com tot, de vegades tens incidències.
Mai havia hagut de fer servir serveis tècnics de portàtils i les dues experiències han estat molt bones. Així un es queda més tranquil, no?
Labels:
Tècnic
Wednesday, July 14, 2010
Monitoritzar l'ús d'índexs d'Oracle
De vegades no tens ni idea dels índexs de la base de dades que realment s'estan fent servir i de quins no. Tenir índexs de més és igual de problemàtic (o més) que tenir-ne de menys.
Cada inserció o actualització haurà d'actualitzar índexs innecessaris, i és un procés costós. Sense parlar del consum d'espai.
A partir de la versió 10g Oracle té la funcionalitat de monitorització d'índexs. No et diu quantes vegades s'han fet servir sinó si s'han fet servir o no.
Per activar la monitorització per a un índex concret cal fer servir la següent comanda:
Per veure si s'han fet servir després d'un temps cal consultar la vista
Per desactivar la monitorització es pot fer servir la següent comanda:
... Per cert. No funciona pels índexs d'Oracle Text :-(
Cada inserció o actualització haurà d'actualitzar índexs innecessaris, i és un procés costós. Sense parlar del consum d'espai.
A partir de la versió 10g Oracle té la funcionalitat de monitorització d'índexs. No et diu quantes vegades s'han fet servir sinó si s'han fet servir o no.
Per activar la monitorització per a un índex concret cal fer servir la següent comanda:
ALTER INDEX nom_index MONITORING USAGE;
Per veure si s'han fet servir després d'un temps cal consultar la vista
V$OBJECT_USAGE
.Per desactivar la monitorització es pot fer servir la següent comanda:
ALTER INDEX nom_index NOMONITORING USAGE;
... Per cert. No funciona pels índexs d'Oracle Text :-(
Tuesday, July 13, 2010
Porc senglar
L'altre dia al Parc de l'Oreneta vam veure un porc senglar passejant, buscant menjar en les papereres i fent-se un bany al fang. I molt a prop del trenet. Ja sabíem que baixen de Collserola i cada cop tenen menys por de les persones, però encara no ens els havíem trobat tant a prop. I quan el vam veure córrer algú es va espantar una miqueta massa.
Labels:
General
Tuesday, July 6, 2010
Estic llegint: Tokio Blues (acabat)
És una novel·la curta i fàcil de llegir. Prometia molt inicialment, i sí que és veritat que han hagut parts que m'han deixat enganxat, però finalment no ha estat tant. Com m'imaginava, ha resultat un drama. I un drama previsible.
Ha hagut fins i tot una part que m'ha resultat difícil de llegir, per la proximitat a una situació viscuda, però no m'agrada quan veig les eines de l'autor. Quan sento com està preparant una situació. Quan veus com descriu un personatge per tal de que sentis afinitat cap a ell. Quan veus que elabora una situació, i intueixes l'intenció. O quan veus que força el ritme. És con veure els fils de les titelles.
No vol dir que no m'hagi agradat, que sí que ho ha fet, però no formarà part de la llista dels meus favorits.
Ha hagut fins i tot una part que m'ha resultat difícil de llegir, per la proximitat a una situació viscuda, però no m'agrada quan veig les eines de l'autor. Quan sento com està preparant una situació. Quan veus com descriu un personatge per tal de que sentis afinitat cap a ell. Quan veus que elabora una situació, i intueixes l'intenció. O quan veus que força el ritme. És con veure els fils de les titelles.
No vol dir que no m'hagi agradat, que sí que ho ha fet, però no formarà part de la llista dels meus favorits.
Labels:
Lectures
Sunday, July 4, 2010
Log4j i la seva configuració
En els vells temps del desenvolupament de servlets, quan necessitaves generar missatges en el servidor per ajudar-te a diagnosticar algun error feies servir
La gràcia que té Log4j com a mecanisme de logging és que permet als desenvolupadors definir els tipus de missatges que volen que surtin (trace, debug, info, warning i error) i segons la configuració de l'aplicació es pintaran uns o uns altres. Si executes amb nivell de WARN sortiran els missatges d'error i de warning, però no sortiran els d'info, debug ni trace. És una jerarquia. A més a més, pots definir el nivell de log per cada classe, o per cada package o per descriptors que et puguis inventar, i pots fer que els missatges s'enregistrin en fitxers, que t'arribin per e-mail o moltes més virgueries.
Això sí, si treballes amb Maven cal anar amb compte per no tenir problemes amb el classloader. El jar del log4j no s'ha d'incloure a l'aplicació: a les dependencies pel log4j cal posar
La definició de com vols que s'enregistrin els missatges es configura en un fitxer que s'anomena
Vaig aprendre que una manera de sobreviure a les diferents versions del log4j.properties era fer servir un paràmetre d'inicialització de la màquina virtual de java que li digués on buscar la configuració de log4j:
Amb Spring Framework també li donen molta importància a la configuració de log4j i n'hi ha unes pràctiques definides de com ha d'anar i de com configurar el reload periòdic del fitxer de configuració, per poder-lo canviar en calent.
Però ara que faig servir JBoss com a servidor d'aplicacions he aprés una nova cosa força interessant: la definició del logging és una tasca de l'administrador de la instal·lació i no pas del desenvolupador. L'administrador sap com són els seus discos, on té més espai i quina retenció vol tenir dels missatges. Ha d'adquirir els coneixements per poder configurar el log4j (que no són tan complicats) i ha de saber els nivells de log que permet l'aplicació. El desenvolupador no ha de tenir un fitxer
La veritat és que aquest plantejament em sembla molt assenyat i és força alliberador.
Malauradament m'ha fet veure un error que he comés en el passat. Com que log4j és tan potent i tan fàcil de fer servir, de vegades l'he fet servir per coses que no li correspon. Dintre de les coses que vols enregistrar en disc puc pensar en: missatges de diagnòstic, missatges d'error complert, missatges d'auditoria d'accés, missatges d'auditoria de rendiment, ... Tots aquests tipus de missatge els anava enregistrant amb Log4j, i configurava el fitxer de properties de muntant un fitxer de log per cada tipus de missatge i donant-li característiques de rotació diferents.
Amb aquest nou plantejament de "la configuració de log4j és responsabilitat de l'administrador" es desmunta aquests usos que li donava. Els fitxers d'auditoria, per exemple, no haurien de poder ser desactivables per part de l'administrador, així que caldria enregistrar-los amb un mecanisme fora del log4j.
Crec que com a regla general podem dir:
System.out.println
. Quan vaig descobrir el Log4j, ja fa uns anys, va ser tot un encert. He conegut alternatives com java util logging (també conegut com JULI) o el Simple Logging Facade for Java (SL4J), però encara segueixo amb Log4j ja què és el que fan servir la majoria dels frameworks.La gràcia que té Log4j com a mecanisme de logging és que permet als desenvolupadors definir els tipus de missatges que volen que surtin (trace, debug, info, warning i error) i segons la configuració de l'aplicació es pintaran uns o uns altres. Si executes amb nivell de WARN sortiran els missatges d'error i de warning, però no sortiran els d'info, debug ni trace. És una jerarquia. A més a més, pots definir el nivell de log per cada classe, o per cada package o per descriptors que et puguis inventar, i pots fer que els missatges s'enregistrin en fitxers, que t'arribin per e-mail o moltes més virgueries.
Això sí, si treballes amb Maven cal anar amb compte per no tenir problemes amb el classloader. El jar del log4j no s'ha d'incloure a l'aplicació: a les dependencies pel log4j cal posar
<scope>provided</scope>
.La definició de com vols que s'enregistrin els missatges es configura en un fitxer que s'anomena
log4j.properties
o log4j.xml
i la manera més fàcil d'ubicar-lo és al classpath. Una part molt delicada del projecte és configurar el fitxer de forma correcta i no equivocar-te de pujar el fitxer de desenvolupament a l'entorn d'explotació (o producció).Vaig aprendre que una manera de sobreviure a les diferents versions del log4j.properties era fer servir un paràmetre d'inicialització de la màquina virtual de java que li digués on buscar la configuració de log4j:
-Dlog4j.configuration=file:/c:/onsigui/log4j.properties
. Això té avantatges i inconvenients, per què tenir un fitxer de configuració de logging independent de nous desplegaments, pot evitar-te complicacions en el desplegament, pot respectar-te les configuracions que hagi fet l'administrador de la instal·lació però també pots deixar de pujar configuracions de log4j que t'anirien bé tenir pel nou desplegament.Amb Spring Framework també li donen molta importància a la configuració de log4j i n'hi ha unes pràctiques definides de com ha d'anar i de com configurar el reload periòdic del fitxer de configuració, per poder-lo canviar en calent.
Però ara que faig servir JBoss com a servidor d'aplicacions he aprés una nova cosa força interessant: la definició del logging és una tasca de l'administrador de la instal·lació i no pas del desenvolupador. L'administrador sap com són els seus discos, on té més espai i quina retenció vol tenir dels missatges. Ha d'adquirir els coneixements per poder configurar el log4j (que no són tan complicats) i ha de saber els nivells de log que permet l'aplicació. El desenvolupador no ha de tenir un fitxer
log4j.properties
preparat per cada instal·lació.La veritat és que aquest plantejament em sembla molt assenyat i és força alliberador.
Malauradament m'ha fet veure un error que he comés en el passat. Com que log4j és tan potent i tan fàcil de fer servir, de vegades l'he fet servir per coses que no li correspon. Dintre de les coses que vols enregistrar en disc puc pensar en: missatges de diagnòstic, missatges d'error complert, missatges d'auditoria d'accés, missatges d'auditoria de rendiment, ... Tots aquests tipus de missatge els anava enregistrant amb Log4j, i configurava el fitxer de properties de muntant un fitxer de log per cada tipus de missatge i donant-li característiques de rotació diferents.
Amb aquest nou plantejament de "la configuració de log4j és responsabilitat de l'administrador" es desmunta aquests usos que li donava. Els fitxers d'auditoria, per exemple, no haurien de poder ser desactivables per part de l'administrador, així que caldria enregistrar-los amb un mecanisme fora del log4j.
Crec que com a regla general podem dir:
- La configuració de log4j és responsabilitat de l'administrador de la instal·lació
- El logging que no s'ha de poder desactivar o modificar no s'ha de fer amb log4j.
Labels:
Tècnic
Subscribe to:
Posts (Atom)