miércoles, 19 de septiembre de 2012

Reconectar proyecto de eclipse al SVN.

Es una receta muy sencilla sazonada con un poco de WTF? :P

  • Primero, debemos tener instalado el plugin en eclipse para manejar proyectos en SVN.
  • Luego, configuramos la conexión al SVN.
  • Seguidamente comprobamos si haciendo click derecho sobre el proyecto y navegando a: Team -> Share project esta habilitado.
    • De no ser así, borramos el proyecto del eclipse SIN BORRAR LOS DATOS FISICOS.
    • Lo importamos nuevamente al workspace
  • Pulsamos sobre la opción mencionada anteriormente. Configuramos la localización correcta del repositorio y listo.

Rica, rica y con fundamento. No me explico porque el eclipse hace algo tan sencillo de la forma más difícil

miércoles, 4 de julio de 2012

Tomcat SSL

Hoy he necesitado configurar el SSL en mi tomcat de desarrollo. Para ello he encontrado el siguiente tutorial. Que explica muy brevemente y en pocos pasos como hacerlo.

Tutorial cómo configurar ssl para tomcat

miércoles, 27 de junio de 2012

Las customVars de Google Analytics

Desde que empece en mi actual puesto de trabajo se me impuso el siguiente reto: Sease un portal que registra los últimos accesos de cada usuario en una BD y a su vez se registran los usuarios logados con google analytics. El problema esta en que la lista de accesos es más grande que la registrada por google. ¿Por qué?

La respuesta aunque simple y sencilla nos ha llevado de gorro. Y es que la pantalla de login también contiene el script de tracking. Esto no representa problema salvo cuando cierras sesión, que google asume que no has abandonado la página y la pagina de login sobreescribe la variable personalizada que guarda el login del usuario por no logado.

La solución aun la estoy rumiando, pero lo más seguro es que quitemos el script de tracking de la página de login, pues aun me sigo preguntando con que fin se puso ahí.

Así que ya sabéis chicos, nada de machacar variables de google analytics salvo que lo hagáis a adrede.

lunes, 14 de mayo de 2012

Empezando con Symfony y mi viejo DELL

Bueno, ahora que estoy de vacaciones forzosas, me he decidido a trastear un poco con symfony y me he encontrado con un montón de obstáculos que me gustaría compartir con vosotros junto con su solución.

El primero de ellos ha sido una gran decepción para mi. En windows no he sido capaz de usar nginx + php porque el comando PECL para instalar extensiones tiene un bug en windows y es imposible. La única solución es usar un PHP más o menos antiguo y buscar librerías para php ya compiladas y configurartelas a mano.

Otra gran decepción y no relacionado con esto es que mi portatil es tan antiguo y tiene una gráfica tan puñetera (radeon mobility x1300) que ubuntu o cualquier linux moderno que se quiera usar se queda colgado por culpa de los drivers. Ya que los drivers privativos no traen soporte no son una opción para mi vieja máquina. Solo me queda probar a instalar una ubuntu vieja y ver si los programas de desarrollo que hay actualmente funcionan o no. (Tengo mis dudas sobre esto).

Así que al final windows  + XAMPP para desarrollar. El primer gran tropiezo lo encontramos con XAMPP. Y es que aunque trae todo configurado, no es así. No se porque, pero el PEAR de php que trae, aunque parece que va, su configuración es errónea. Para verificarlo ejecutar el comando pear config-show. Si este comando no os funciona es porque en las variables de entorno de windows no tenéis añadido al Path el valor: <DIR_XAMPP>\php\ Por ejemplo: Yo tengo instalado mi XAMPP en E:\Desarrollo\xampp, así que lo que deberíamos añadir al Path es ;E:\Desarrollo\xampp\php\


Si detectáis que alguna ruta no esta donde debería que sería lo más normal, deberéis corregir los parámetros con el siguiente comando: pear config-set <parametro> <valor>. Ej: pear config-set www_dir "E:\Desarrollo\xampp\php\www"

Una vez arreglado eso, ya podemos ejecutar los siguientes comandos para instalar symfony:
pear upgrade pear
pear channel-discover pear.symfony-project.com
pear install symfony/symfony


Seguidamente verificamos la instalación: symfony -V
Si nos muestra la versión que hemos instalado ahora podemos proceder a crear el proyecto.

Para ello vamos a la carpeta htdocs de xampp (E:\Desarrollo\xampp\htdocs). Creamos una carpeta con el nombre de nuestro proyecto (mkdir nombrecarpeta). Y accedemos a la carpeta recién creada con el comando cd.
Una vez dentro ejecutar los siguientes comandos:
symfony generate:project miproyecto
symfony generate:app frontend


Hay muchas más opciones para la creación del proyecto y la app pero eso lo tenéis más detallado en los manuales de symfony.

Ahora es turno de configurar el apache. Lo que queremos es crear un virtualHost que apunte a nuestra recien creada app. Para ello abrimos el fichero xampp\apache\conf\extra\httpd-vhosts.conf y escribimos lo siguiente:

<VirtualHost 127.0.0.1:80>
    ServerName miproyecto.localhost
    DocumentRoot "E:\Desarrollo\xampp\htdocs\miproyecto\web"
    DirectoryIndex index.php
    <Directory "E:\Desarrollo\xampp\htdocs\miproyecto\web">
        AllowOverride All
        Allow from All
    </Directory>

    Alias /sf "E:\Desarrollo\xampp\php\data\symfony\web\sf"
    <Directory "E:\Desarrollo\xampp\php\data\symfony\web\sf">
        AllowOverride All
        Allow from All
    </Directory>
</VirtualHost>

Guardamos y ahora añadimos el nuevo server name a nuestro fichero hosts que esta en: C:\Windows\System32\drivers\etc\ Y añadimos la siguiente linea: 127.0.0.1 miproyecto.localhost


Listo. Ahora iniciamos nuestro servidor apache de XAMPP y accedemos a la url miproyecto.localhost y debería salir la ventana de bienvenida de symfony.

jueves, 12 de abril de 2012

Truquillo para knockoutjs

Cuando queramos avisar de que alguna parte de nuestro ha cambiado, pero la vista no se actualiza, basta con llamar al metodo .hasMutated() desde la parte que nos interese del modelo. Si la vista esta vinculada a ese atributo del modelo se actualizará automaticamente.

viernes, 23 de marzo de 2012

Cuando no sabes que hacer con JSTL

Llevo ya mas de un mes teniendo fallos intermitentes en codigo JSTL que un dia va pero otro no. Conclusión: el servidor tomcat según le da me ignora las etiquetas EL. Para solucionarlo tendremos que poner en la cabecera de los jsp lo siguiente:

<%@ page isELIgnored="false" %>

Detectar tablas/registros

Para saber si tenemos tablas o registros bloqueados basta con lanzar una sql tal que así:

select
  t.relname,
  l.locktype,
  page,
  virtualtransaction,
  pid,
  mode,
  granted 
from 
  pg_locks l, pg_stat_all_tables t 
where 
  l.relation=t.relid 
order by 
  relation asc;

jueves, 22 de marzo de 2012

Usar otro nombre para log4j.properties

Para poder usar otro nombre de fichero distinto en log4j dentro de una aplicación web deberemos hacer los siguiente en el metodo init del servlet:

String prefix = event.getServletContext().getRealPath("/");
if (prefix.endsWith(File.separator) == false)
 prefix += File.separator;
PropertyConfigurator.configure(prefix + "log4j.revisarConsultasPendientes.properties");

Al fichero que me refiero es al log4j.properties

viernes, 16 de marzo de 2012

Generar números aleatorios con Postgres

Muchas veces nos encontraremos con que tenemos que poblar una BD con numeros para poder testear un funcionalidad que estemos programando. En postgres es tan sencillo como:

update schema.tabla set columnaNumerica = floor(random() * N) + desviacion;

Con desviación me refiero a que, si no lo añadimos, random generara numeros empezando por el 0 hasta N. El uso de floor es para redondear y quedarme solo con la parte entera. Ya que random genera floats entre 0 y 1.

Espero os sirva este pequeño truquillo. Un saludico.

viernes, 9 de marzo de 2012

Formatear fecha JSON

Para poder representar de forma bonita y humana una fecha retornada por un JSON por ejemplo, la función quedaría tal que así. En mi caso, el formato esperado es: dd/MM/yyyy hh:mm

    function FormatDate(fecha) {
     var fechaObj = new Date(fecha);
  return (fechaObj.getDate() < 10 ? '0' : '') + fechaObj.getDate()
   + '/' + (fechaObj.getMonth() < 10 ? '0' : '') + fechaObj.getMonth() 
   + '/' + fechaObj.getYear()
   + ' ' + (fechaObj.getHours() < 10 ? '0' : '') + fechaObj.getHours() 
   + ':' + (fechaObj.getMinutes() < 10 ? '0' : '') + fechaObj.getMinutes(); 
    };

martes, 6 de marzo de 2012

JSTL algo raro y nuevo

Hoy me he encontrado con alguien que me ha dicho que JSTL, que lo estoy usando en un proyecto nuevo, es algo nuevo y raro.

Cito de la wikipedia:
JSTL was developed under the Java Community Process (JCP) as Java Specification Request (JSR) 52. On May 8, 2006, JSTL 1.2 was released.
Fuente: JSTL - Wikipedia

Acceder a un tipo enumerado con JSTL

Bueno, como no, en mi día a día hoy me he visto forzado a usar un tipo enumerado con JSTL. El problema es que si usas la siguiente sentencia no funciona:
<c:if test="${consulta.estado eq EstadoConsulta.PENDIENTE">...</c:if>
Solución, guardarse los valores en el pageContext y usarlos mas tarde:
<% pageContext.setAttribute("pendiente", EstadoConsulta.PENDIENTE); %>
<c:if test="${consulta.estado eq pendiente}"/>...</c:if>
Otra solución que he visto es esta otra si tenemos un tipo enumerado tuneado:
public enum EstadoConsulta {
  PENDIENTE(1, "Pendiente"),
  LEIDA(2, "Leida");
 
  private int value;
  private String text;
  private static final Map typesByValue = new HashMap();

  static {
    for (EstadoConsulta type : EstadoConsulta.values())
      typesByValue.put(type.value, type);
  }

  private EstadoConsulta(int value, String text) {
    this.value = value;
    this.text = text;
  }

  public int getValue() { return value; }
 
  public String getText() { return text; }
 
  public static Map getMapValues() {
    return EstadoConsulta.typesByValue;
  }
}
Podremos hacer lo siguiente en nuestro JSP con JSTL:
<% pageContext.setAttribute("estados", EstadoConsulta.getMapValues()); %>
<c:out value="${estados[consulta.estado].text}" />

martes, 28 de febrero de 2012

Comparador de ficheros para windows

Hoy he tenido la necesidad de usar un comparador de ficheros. Cuando usaba linux mi programa favorito era Meld. Y buscando uno para windows he encontrado WinMerge.

La filosofía de funcionamiento en cuanto a comparar carpetas es algo distinta, pero en 5 minutillos te haces a ella.

Si os apetece usar Meld en windows he encontrado esta página. https://live.gnome.org/Meld/Windows

jueves, 23 de febrero de 2012

Parar animación y vaciar cola en jQuery

Hace tiempo que no escribo pero es porque voy hasta arriba de tareas en el curro. Pero hoy he sacado unos segundillos para comentar algo que me ha parecido interesante y curioso.

En jQuery cuando lanzamos animaciones estas se encolan en una cola por defecto llamada "fx". El problema es que cuando esa animación la lanza un evento que se repite muchas veces, dígase mousemove o similar esto puede ser una locura para el navegador. Así que lo que podemos hacer es cancelar todas las animaciones para un objeto determinado cada vez que se ejecute nuestra función dentro del evento.

La línea seria tal que así:
$(item_animado).stop( [clearQueue] [, jumpToEnd] );
Hasta la próxima que no se cuando será. Porque mi novia se viene a vivir conmigo e iremos algo ajetreados hasta que nos pongamos al día con los curros y la convivencia diaria en la casa ^^

jueves, 2 de febrero de 2012

De lo que se entera uno en MySQL

Resulta que antes, cuando definías una tabla usabas:
TYPE=InnoDB CHARACTER SET utf8;
para definir el motor de la base de datos que usaría la tabla. Pues ahora resulta que esto no funciona, según ellos sacaban warnings avisando de que estaba deprecated desde la versión 5.0. Pues yo ni lo he visto ni me he percatado, así que la cosa que tal que así:
ENGINE=InnoDB DEFAULT CHARSET=utf8;

miércoles, 1 de febrero de 2012

Reemplazar salto de linea por <BR> con JSTL

Buenas xiquets, hacia tiempo que no escribia. Hoy explicare como cambiar un salto de linea recuperado de la BD en <br/> para cuando lo pintemos en nuestra web. El codigo seria algo tal que así:
  <% pageContext.setAttribute("newLineChar", "\n"); %>
  <c:set var="textoLimpio">
    ${fn:replace(textoBD,newLineChar,"<br/>")}
  </c:set>
  <div><c:out value="${textoLimpio}" escapeXml="false" /></div>
La primera linea es muy importante porque si usamos \n directamente en el replace no compila y si usamos \\n no reemplezará el texto. También cuando hagamos el c:out deberemos usar el escapeXml a falso, para que los símbolos > y < no los interprete como texto.

jueves, 26 de enero de 2012

Concatenar elementos de una colección en un String

En java, para poder concatenar los elementos de una colección en un único String haciendo uso del separador que deseemos emplearemos la liberia commons-lang de apache.

En el codigo de nuestra aplicación escribiremos:
String listaStr = StringUtils.join(lista, ",");

miércoles, 25 de enero de 2012

Iterar sobre un enumerado con JSTL

Para poder iterar sobre un enumero con JSTL primero deberemos insertar el enumerado en el contexto de la pagina:
pageContext.setAttribute("miEnum", MiEnum.values());
Seguidamente ya podremos iterar con el haciendo uso de JSTL:
<c:forEach items="${miEnum}" var="item">
   <c:out value="${miEnum.value}" />
</c:forEach>

viernes, 20 de enero de 2012

Div dentro dentro de un link

Pues eso, que hoy he descubierto que según el estándar HTML4.01 las etiquetas <a></a> solo puede contener etiquetas de visualización inline, es decir, un <div></div> no cumple esa cualidad.

lunes, 16 de enero de 2012

Como crear campo autoincremental en postgres

Para ello tenemos dos alternativas:
  • El uso de serial o bigserial como tipo de dato del campo.
  • Haciendolo a mano definiendo, un sequencial, luego el campo que queramos con las restricciones oportunas y asignando como dueño del sequencial al campo que acabamos de crear.
En el siguiente enlace viene muy bien explicado lo que os comento: http://www.postgresql.org/docs/8.4/static/datatype-numeric.html#DATATYPE-SERIAL

Usar JNDI en tests de jUnit

Para poder cargar el contexto y poder acceder a lo que configuremos con JNDI en jUnit definiremos el método setUp de la siguiente forma:
try {
    // Create initial context
    System.setProperty(Context.INITIAL_CONTEXT_FACTORY,
        "org.apache.naming.java.javaURLContextFactory");
    System.setProperty(Context.URL_PKG_PREFIXES, 
        "org.apache.naming");            
    InitialContext ic = new InitialContext();

    ic.createSubcontext("java:");
    ic.createSubcontext("java:/comp");
    ic.createSubcontext("java:/comp/env");
    ic.createSubcontext("java:/comp/env/jdbc");
   
    // Construct DataSource
    OracleConnectionPoolDataSource ds = new OracleConnectionPoolDataSource();
    ds.setURL("jdbc:oracle:thin:@host:port:db");
    ds.setUser("MY_USER_NAME");
    ds.setPassword("MY_USER_PASSWORD");
    
    ic.bind("java:/comp/env/jdbc/nameofmyjdbcresource", ds);
} catch (NamingException ex) {
    Logger.getLogger(MyDAOTest.class.getName()).log(Level.SEVERE, null, ex);
}
En la zona donde definimos el DataSource podremos incluir cualquier conexión a base de datos que necesitemos simplemente cambiando las clases. En el mi caso que es para Postgres la cosa quedaría así:
PGPoolingDataSource ds = new PGPoolingDataSource();
ds.setServerName("SERVER");
ds.setDatabaseName("DB_NAME");
La fuente de todo esto la extraje de: http://blogs.oracle.com/randystuph/entry/injecting_jndi_datasources_for_junit

viernes, 13 de enero de 2012

Convertir int a enum en Java

Hoy me he estado peleando en java buscando la forma de convertir un entero que hay almacenado en la BD a un tipo enumerado que tengo definido en mi aplicación. En los métodos de serie no viene nada así que venga buscar, y mas buscar, y he dado con dos soluciones:

Primera solución:
En el caso de que la enumeración que tenemos almacenada empiece en 0, podremos usar esto:
MyEnum foo = MyEnum.values()[valorEnteroDeLaBD];
Las pegas de este sistema es que el coste de llamar a .values() es muy alto además de que estamos obligados a empezar la enumeración en 0.

Segunda solución y la mejor para mi:
Dentro del enum declaramos un Map statico y un metodo estatico que rellene el Map. Además deberemos crear un atributo valor para poder almacenar el valor enumerado que queramos. Esto quedaria asi:
import java.util.HashMap;
import java.util.Map;

public enum EstadoIncidencia {
 ABIERTO_POR_CLIENTE(1), RESPONDIDO(2), EN_PROCESO(3), CERRADO(4);

 private int value;
 private static final Map typesByValue = new HashMap();

 static {
  for (EstadoIncidencia type : EstadoIncidencia.values()) {
   typesByValue.put(type.value, type);
  }
 }

 private EstadoIncidencia(int value) {
  this.value = value;
 }

 public int getValue() {
  return value;
 }
 
 public static EstadoIncidencia forValue(int value) {
  return typesByValue.get(value);
 }
}
Esto lo he encontrado en StackOverflow: http://stackoverflow.com/questions/5292790/convert-integer-value-to-matching-java-enum
Espero os sea igual de util que a mi ;).

miércoles, 11 de enero de 2012

Concatenar cadenas dentro de etiquetas jsp

Hoy me he encontrado con una cadena de codigo tal que asi dentro de un jsp:
<jsp:include page="<%=var + "/foo" %>" flush="true" />
Si eso lo ejecutas en un tomcat 6 o superior te dara una fallo y no compilara el jsp. La solucion que me han dado mis compañeros es la siguiente: En el arranque del tomcat añadimos el siguiente parametro:
-Dorg.apache.jasper.compiler.Parser.STRICT_QUOTE_ESCAPING=false
A mi modo de ver es una solucion pero no me convence, asi que he seguido investigando y habia gente que hacia esto otro:
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<jsp:include page="${var}/foo" flush="true" />
Espero os haya gustado la solucion a este problemilla que seguro le habreis dedicado unos minutillos valiosos.

Tengo que echar un ojo a esto

En el blog de GenbetaDev he leido en uno de los comentarios que había una alternativa a ajax. Parece interesante asi que cuando tenga tiempo este finde me leere el tema y lo trasteare un poquillo porque me pica la curiosidad esos de los websockets que tanto leo a menudo. http://code.google.com/p/jquery-websocket/

lunes, 9 de enero de 2012

Ostras tu lo que se encuentra uno

Hoy, Esther, una compi del curro me ha pasado el siguiente enlace y me ha parecido tan interesante que quiero compartirlo con vosotros :).

http://tympanus.net/codrops/category/tutorials/

Espero que la disfrutéis tanto como yo

lunes, 2 de enero de 2012

Métodos estáticos en javascript

Como sigo metido con OO en JavaScript, hoy me he visto en la necesidad de crear un método estático, a continuación os digo como:
function MiClase() {
  // Constructor
}

MiClase.MetodoEstatico = function () {
  // Metodo estatico, no se puede invocar con new MiClase().MetodoEstatic()
};