Thursday, July 29, 2010

Estic llegint: La dictadura de la incompetència

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.

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.

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):
  1. A partir del codi font generar un codi HTML autònom que puguis posar a la teva pàgina Web.
  2. Generar un codi HTML juntament amb un CSS. Això pot ser problemàtic en un Blog si no vols tocar la plantilla.
  3. Fer servir un JavaScript que faci el highlight en temps d'execució.
Hi ha moltes solucions interessants de cadascuna de les tres opcions. Finalment, gràcies al David, he trobat una pàgina que conté un llistat dels millors ressaltadors de sintaxi per a la web. N'hi ha de molt potents i per tots els llenguatges.

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.

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 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;
}

Monday, July 19, 2010

Estic llegint: El enigma de la calle Calabria

El enigma de la calle CalabriaDe 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!

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 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ó!

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?

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:
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.

Porc senglar al Parc de l'Oreneta

Tuesday, July 6, 2010

Estic llegint: Tokio Blues (acabat)

Tokio BluesÉ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.

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 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.
Happy logging!