dimecres, 20 de novembre del 2013

Problemes amb els estils de newsletters a Gmail

A Amidasoft estem desenvolupant el portal d'Exposicions Itinerants de la Diputació de Girona (http://www.ddgi.cat/exposicions). Disn d'aquest portal, hi ha la utilitat d'enviament de newsletters amb les darreres novetats del mateix.

Fins aquí tot correcte, però amb les darreres proves, els usuaris han detectat que a Gmail (i altres webmails, com el OWA), tot el text apareix en color blau.

Debugant el sistema, hem vist que l'email que s'envia i el que mostra el Gmail són diferents: al fitxer origen, totes les etiquetes tenen un style="color:black" , mentre que, usant el Firebug, es pot comprovar que aquest atribut no apareix al mail rebut.

He trobat a http://www.emailonacid.com/blog/details/C13/12_things_you_must_know_when_developing_for_gmail_and_gmail_mobile_apps que el Gmail ignora l'atribut de color si aquest és "black", "#000" o "#000000".

Per tant, la solució és fàcil: canviar el style="color:black" per style="color:#010101" 

divendres, 14 de juny del 2013

Condicions a Oracle ignorant accents i majúscules

Moltes vegades succeeix que, en anar a escriure les condicions d'una consulta, aquestes es fan sobre camps de text que poden contenir accents, majúscules, minúscules, etc. i no es vol que aquests elements distorsionin els resultats.

Una opció (en ORACLE) és usar la funció translate.

Aquesta funció rep tres paràmetres:

  1. La cadena a tractar.
  2. Un conjunt de caractèrs a substituir.
  3. Els caràcters pels que substituir.
El que fa és, sobre la cadena a tractar, per cada ocurrència de (2), busca el caràcter que està a la mateixa posició de (3) i el canvia.



Exemple:


    SELECT nom
      FROM usuaris o
     WHERE TRANSLATE(UPPER(o.nom),'ÁÉÍÓÚÀÈÌÒÙÄËÏÖÜÂÊÎÔÛ','AEIOUAEIOUAEIOU')
      LIKE TRANSLATE(UPPER('%lluis%'),'ÁÉÍÓÚÀÈÌÒÙÄËÏÖÜÂÊÎÔÛ','AEIOUAEIOUAEIOU') ;

Aquesta consulta retorna les files que tenen el camp o.nom amb valors: lluis,lluís, Lluís, Lluïs, etc.

dijous, 23 de maig del 2013

Error 17002 d'Oracle desde Tomcat

Avui hem trobat un nou problema: en una aplicació executant-se sobre Tomcat 7, usant les llibreries de persistència EclipseLink, un cop fet loguin es quedava tot penjat.

Mirant el catalina.out hi havia els missatges:


[EL Info]: 2013-05-22 23:24:06.515--ServerSession(9509498)--EclipseLink, version: Eclipse Persistence Services - 2.3.2.v20111125-r10461 
[EL Info]: 2013-05-22 23:24:06.624--ServerSession(9509498)--file:/usr/local/apache-tomcat-7.0.40/webapps/BopGestioUsuaris/WEB-INF/classes/_BopGestioUsuarisPU login successful 
[EL Info]: 2013-05-22 23:39:34.411--UnitOfWork(27713589)--Communication failure detected when attempting to perform read query outside of a transaction. Attempting to retry query. Error was: Exception 
[EclipseLink-4002] (Eclipse Persistence Services - 2.3.2.v20111125-r10461): org.eclipse.persistence.exceptions.DatabaseExceptionInternal 
Exception: java.sql.SQLException: Excepción de E/S: Expiró el tiempo de conexión 
Error Code: 17002Call: SELECT COUNT(CODIENTITAT) FROM ENTITAT WHERE (? = ?)        bind => [2 parameters bound]Query: ReportQuery(referenceClass=Entitat sql="SELECT COUNT(CODIENTITAT) FROM ENTITAT WHERE (? = ?)").

Era un error curiós, ja que en reiniciar el Tomcat, funcionava durant una estona correctament.
Buscant informació, hem trobat que això és degut a un error de xarxa, ja que no és capaç de trobar el servidor de base de dades.

Solució: modificar el fitxer persistence.xml per a modificar la URL de connexió i especificar el nom complet del servidor.

dimecres, 30 de gener del 2013

Redirigir wget cap a la sortida estàndard

De vegades és útil fer que el wget, enlloc d'escriure el resultat de la web a descarregar a un fitxer, l'escrigui per la sortida estàndard. Darrerament m'ha estat d'utilitat fer-ho en posar un wget a una tasca CRON, ja que així rebo el resultat per mail.
Simplement cal afegir el paràmetre -O -

Exemple:

 
 wget -q -O - http://www.amidasoft.com  

divendres, 11 de gener del 2013

Plegat de codi amb NetBeans (code-fold)

L'IDE NetBeans permet ocultar talls de codi que no són importants per tal de permetre centrar l'atenció en aquells que sí que ho són.
Per a aconseguir-ho, únicament cal embolcallar el codi a plegar amb els comentaris:



// <editor-fold defaultstate="collapsed" desc="descripció-que-es-mostrarà">
EL CODI QUE ES VOL OCULTAR
// </editor-fold>

dilluns, 17 de desembre del 2012

java.lang.RuntimeException: com.sun.faces.config.ConfigurationException: CONFIGURATION FAILED! Absent Code attribute in method that is not native or abstract in class file FILE_NAME

Avui m'ha apregut aquest error en intentar desplegar un projecte fet amb JSF 2.0 i Hibernate sobre Tomcat 6:


SEVERE: Exception sending context initialized event to listener instance of class com.sun.faces.config.ConfigureListener
java.lang.RuntimeException: com.sun.faces.config.ConfigurationException: CONFIGURATION FAILED! Absent Code attribute in method that is not native or abstract in class file ddgi/exposicionsIteAdm/contJSF/VideosnController$VideosnControllerConverter
at com.sun.faces.config.ConfigureListener.contextInitialized(ConfigureListener.java:292)
at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:3934)
at org.apache.catalina.core.StandardContext.start(StandardContext.java:4429)
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:791)
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:771)
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:526)
at org.apache.catalina.startup.HostConfig.deployDescriptor(HostConfig.java:630)
at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:514)
at org.apache.catalina.startup.HostConfig.check(HostConfig.java:1288)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:297)
at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:836)
at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:761)
at org.apache.catalina.manager.ManagerServlet.check(ManagerServlet.java:1473)
at org.apache.catalina.manager.ManagerServlet.deploy(ManagerServlet.java:824)
at org.apache.catalina.manager.ManagerServlet.doGet(ManagerServlet.java:350)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:525)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:849)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:454)
at java.lang.Thread.run(Thread.java:680)
Caused by: com.sun.faces.config.ConfigurationException: CONFIGURATION FAILED! Absent Code attribute in method that is not native or abstract in class file ddgi/exposicionsIteAdm/contJSF/VideosnController$VideosnControllerConverter
at com.sun.faces.config.ConfigManager.initialize(ConfigManager.java:379)
at com.sun.faces.config.ConfigureListener.contextInitialized(ConfigureListener.java:225)
... 33 more
Caused by: java.lang.ClassFormatError: Absent Code attribute in method that is not native or abstract in class file ddgi/exposicionsIteAdm/contJSF/VideosnController$VideosnControllerConverter
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClassCond(ClassLoader.java:631)
at java.lang.ClassLoader.defineClass(ClassLoader.java:615)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141)
at org.apache.catalina.loader.WebappClassLoader.findClassInternal(WebappClassLoader.java:1850)
at org.apache.catalina.loader.WebappClassLoader.findClass(WebappClassLoader.java:890)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1354)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1233)
at com.sun.faces.util.Util.loadClass(Util.java:281)
at com.sun.faces.config.AnnotationScanner.processClassList(AnnotationScanner.java:304)
at com.sun.faces.config.JavaClassScanningAnnotationScanner.getAnnotatedClasses(JavaClassScanningAnnotationScanner.java:127)
at com.sun.faces.config.DelegatingAnnotationProvider.getAnnotatedClasses(DelegatingAnnotationProvider.java:85)
at com.sun.faces.config.ConfigManager$AnnotationScanTask.call(ConfigManager.java:846)
at com.sun.faces.config.ConfigManager$AnnotationScanTask.call(ConfigManager.java:798)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
at java.util.concurrent.FutureTask.run(FutureTask.java:138)
at com.sun.faces.config.ConfigManager.initialize(ConfigManager.java:350)
... 34 more


La solució? Doncs una recerca a Google només reflecteix problemes de Maven, però en el meu cas no estic usant Maven, sinó Ant (via NetBeans), pel que no em serveix.

Al final, la solució ha consistit en:

  1. Matar tots els processos Java
  2. Iniciar NetBeans
  3. Recompilar completament el projecte
  4. Redesplegar-lo
La solució ha estat simple, però fora bo tenir una explicació millor....


dilluns, 10 de desembre del 2012

;org.artofsolving.jodconverter.office.OfficeException: could not establish connection

Avui m'he trobat amb aquest problema en un projecte que usa JSF 1.1 executant-se sobre un CentOS.
Succeeix en intentar usar OpenOffice per a convertir un docx a PDF.
El problema prové de que es tracta d'un sistema sense X, pel que no pot connectar-se a la interfície gràfica.
Segons http://www.artofsolving.com/node/10 , cal iniciar l'OpenOffice amb la comanda

soffice -headless -accept="socket,host=127.0.0.1,port=8100;urp;" -nofirststartwizard

Però en executar això dóna un error degut a que no hi ha la variable DISPLAY.

L'únic que faltava era instal·lar el paquet que permet l'execució del LibreOffice en mode headless:
 yum intall libreoffice-headless


Amb això ja ha funcionat