martes, 4 de marzo de 2014

Comandos Maven (mvn) de uso diario.

Lista de comandos Maven de uso diario:
Se supone que está configurado el ambiente con anterioridad.

Para ejecutar maven en linea de comandos debemos situarnos en el directorio base de nuestro proyecto, que es donde se encuentra nuestro pom.xml, si no existe pom.xml maven arrojara un error.

mvn clean verify
Borra espacio de trabajo y verifica nuestro proyecto

mvn clean install
Borra espacio de trabajo, crea los ejecutables y los instala en maven local carpeta .m2


mvn clean deploy
Sube al repositorio de artifacs (nexus sonatype) nuestro aplicativo en version de desarrollo, generalmente para testing o QA


Para generar nuestra version de produccion Release es necesario ejecutar dos comandos, es muy importante que antes de ejecutar estos comandos el proyecto se encuentre sincronizado con nuestro programa de control de versiones como puede ser Subversion, Git,.. etc..
mvn release:prepare
mvn release:perform
mvn release:roolback

roolback en caso de error en release:prepare

Cuando hay problemas con nuestro repositorio maven, es necesario ejecutar el comando purge
mvn dependency:purge-local-repository




Espero les sirva. JAM


lunes, 26 de agosto de 2013

Conectar por VPN sin perder la conexión a Internet


Desactivar el cambio de la puerta de enlace predeterminada
En este caso, lo que se pretende es que las direcciones que pertenecen a la empresa se enruten a través de la VPN y el resto de direcciones se dirijan directamente a nuestra puerta de enlace predeterminada (la que actualmente nos da acceso a Internet).

Cuando creamos una conexión VPN y conectamos a través de ella, la puerta de enlace predeterminada se suele cambiar por la puerta de enlace de la red a la que nos hemos conectado, de modo que todo el tráfico que generemos se dirigirá hacia dicha dirección. Por regla general, las redes a las tenemos acceso a través de la VPN no nos darán acceso a Internet, ya que esto haría que todo el trafico que generásemos pasase por el servidor VPN e incrementaría al tráfico desmesuradamente, pudiendo ralentizar la conexión de todos los usuarios que se conectan a la misma. Para que no se cambie la puerta de enlace predeterminada por la de la red remota debemos entrar en las propiedades de la conexión VPN realizar los siguientes pasos:

  1. Vamos a la pestaña "Funciones de red"
  2. Seleccionamos el "Protocolo de Internet versión 4 (TCP/IPv4)"
  3. Pinchamos en "Propiedades".
  4. En la nueva ventana pinchamos en "Opciones avanzadas..."
  5. En la ventana "Configuración avanzada de TCP/IP" desmarcamos el check "Usar la puerta de enlace predeterminada en la red remota". Esta es la opción que sólo nos permitía acceder a la red conectada a través de la VPN.


Ahora es momento de probar en que punto estamos, para ello, si tenemos la VPN conectada la desconectamos y la volvemos a conectar, ya que la configuración establecida no se aplica a la conexión actual, sino a la próxima que se establezca. Con los cambios realizados se debería acceder sin problemas a Internet, pero ¿puedes acceder a la red conectada a través de la VPN?

Si en este punto ya puedes acceder tanto a la VPN como a Internet ya está todo resuelto (no es habitual, pero puede ser que no haya que realizar el resto de pasos en función de la configuración actual de la red), si ahora lo que no tienes es conexión a la red conectada a través de la VPN tendrás que enrutar las conexiones convenientemente.


Enrutando las conexiones a través de la VPN
Al dejar de usar la puerta de enlace predeterminada en la red VPN a la que nos hemos conectado, es posible que las conexiones no se envíen a través de la VPN cuando es necesario, de modo que habrá que decirle explícitamente que conexiones han de enviarse a través de la conexión VPN.

Para ello, conectamos con la VPN y comprobamos la dirección IP que se nos ha asignado, ejecutando el comando ipconfig en una ventana de línea de comandos o mostrando la hoja de estado de la conexión VPN que tenemos conectada.


Nota: Se puede arrancar la "Línea de comandos" poniendo cmd en el cuadro ejecutar en Windows XP, o en el cuadro de texto del menú Inicio de Windows 7/Vista, aunque también lo puedes encontrar en el menú Accesorios del menú Inicio, con el nombre de "Símbolo del sistema".


La dirección IP que nos ha asignado el servidor VPN es la que se indica como "Dirección IPv4" en el resultado del ipconfig (OJO: comprobar que el apartado se llama "Adaptador PPP <Nombre nuestra VPN>") o como "Dirección IPv4 del cliente" en la ventana de "Estado de <Conexión VPN>".

Si la dirección IP que nos ha asignado el servidor VPN es 192.168.X.X podemos hacer que todas las conexiones con direcciones IP que empiecen por 192.168. se envíen a través de la conexión VPN ejecutando el siguiente comando en una ventana de comandos con permisos de administrador.

route add 192.168.0.0 mask 255.255.0.0 192.168.X.X

Es decir, enrutamos todas las conexiones a direcciones IP que empiecen por 192.168. a través de la dirección IP que nos ha asignado el servidor VPN.

Rizando el rizo
Es habitual que tanto los routers ADSL domésticos como otros equipos concentradores o enrutadores utilicen un rango de direcciones IP que empiecen por 192.168. de modo que, al enrutar con el comando anterior puede haberse perdido la conexión a la red local, es decir, a otros equipos que tengamos en caso conectados al router ADSL, por ejemplo.

En este caso, puedes cambiar el rango de direcciones de la red local al rango 10.X.X.X o, si ambas redes no disponen de algún rango distinto aprovecharlo para enrutar un rango de direcciones IP más pequeño. Por ejemplo, si las direcciones de nuestra red local empiezan por 192.168.2.X y las de la red a la que conectamos por VPN empiezan por 192.168.8.X, podemos enrutar todas las direcciones que se correspondan con dicho intervalo con el comando:

route add 192.168.8.0 mask 255.255.255.0 192.168.X.X

Si las direcciones de la red accesible a través de la VPN empiezan por 192.168.8.X o por 192.168.9.X, es decir, 192.168.8.0 con la máscara 255.255.254.0, podríamos indicarlo de dicho modo:

route add 192.168.8.0 mask 255.255.254.0 192.168.X.X

En este sentido puede ser interesante conocer el rango de direcciones de la red a la que conectamos por la VPN para definir un enrutado más exacto, aunque no es imprescindible. Dicho rango de direcciones se define por una dirección IP de la red (por ejemplo, la dirección de la puerta de enlace y la máscara de red). Si solamente tenemos acceso a algunos recursos esta información nos la tendrá que dar el administrador del sistema (si es que nos la quiere dar), pero si tenemos acceso a algún ordenador remoto (ya sea una máquina física o una máquina real), podemos ejecutar el comando ipconfig en la máquina remota para obtener esta información.

Y, si el servidor de VPN nos asigna una dirección IP cada vez que nos conectamos (no es habitual, pero puede configurarse de dicho modo), entonces podemos utilizar el comando route con la conexión VPN ya establecida, ya que el enrutado se puede aplicar sobre la marcha sin problemas.

Dejándolo todo como estaba
Si haciendo pruebas has dejado la tabla de rutas IP inservible, puedes ver la pinta que tiene con:

route print

y eliminar las que no sean necesarias o estorben con:

route delete <direccion> mask <máscara>

por ejemplo, para eliminar el primer enrutado que hicimos se podría ejecutar el comando (fíjate que no aparece el 192.168.X.X al final):

route delete 192.168.0.0 mask 255.255.0.0

Pero tampoco tienes que preocuparte demasiado, ya que todos los enrutados que hemos definido desaparecerán al reiniciar el equipo. Si ya has probado la configuración y va bien puedes hacerla definitiva utilizando el parámetro -p, en el comando de enrutado, como en el siguiente ejemplo:

route -p add 192.168.0.0 mask 255.255.0.0 192.168.X.X

miércoles, 24 de julio de 2013

Cómo implementar un API REST en Java/JEE

by Guido García on 31/07/2011
Me pidieron consejo hace unos días sobre este tema.  Personalmente, a día de hoy sólo recomiendo estas opciones, muy parecidas y que se basan en anotar las clases Java:
  • El especificación JAX-RS, incluida de serie en Java EE 6. Hay varias implementaciones, entre otras Jersey, Restlet o Resteasy. Esta última es la que utiliza JBoss y que he utilizado sin problemas también con JBoss 5.1.
@Path("/product/{id}")
public class ProductResource {

    @GET
    public String get(@PathParam("id") String id) {
        return ...;
    }
}












  • Spring MVC. Imagino que acabará convergiendo con JAX-RS ya que no tiene demasiado sentido mantener sus propias anotaciones. Yo he sido bastante fan de Spring, al que pronto dedicaré una serie de artículos completos. Fui reacio un tiempo por la documentación oficial, excesivamente dura para un novato, pero siempre han ido un paso por delante, son más ágiles que las JSR, que en ocasiones acaban pariendo clones de Spring (por ejemplo el JSR 330 para la inyección de dependencias).
@Controller
public class ProductResource {
    @RequestMapping(value="/product/{id}", method=RequestMethod.GET)
    public Product get(@PathVariable int id) {
        return ...;
    }
}
  • Para proyectos muy simples en los que no se quiera incluir ninguna dependencia, la esperada especificación de Servlets 3.0/JSR 315 (también de serie en JEE6 e implementada en Tomcat 7, Jetty 7, Glassfish 3, etc) incluye la anotación @WebServlet.  No la he utilizado nunca para estos fines, pero con algo más de esfuerzo de desarrollo en el procesamiento de las peticiones, podría valer.

@WebServlet(urlPatterns={"/product/*"}
public class ProductResource extends HttpServlet {
    public void service(ServletRequest req, ServletResponse res)
            throws IOException, ServletException {
        // Esta parte sería más fea
        // Parsear la URL para extraer parámetros...
    }
}

Mi consejo

Es difícil decantarse porque las diferencias acaban siendo sutiles. Dejo algunas consideraciones que se podrían tener en cuenta:
  • Spring mola. Si ya utilizáis o conocéis Spring, usad Spring MVC, corre en un simple Tomcat sin más. Podréis aprovechar otras de sus deliciosas ventajas (inyección de dependencias, validaciones, etc).
  • Si ya usáis un servidor de aplicaciones JEE6 (p.e. JBoss) usad JAX-RS. Si estáis usando Netbeans también es un punto a favor de JAX-RS porque viene bien integrado.
  • Si no queréis utilizar un servidor de aplicaciones JEE6, usad Spring. Si queréis hacer algo simple (p.e. un piloto o una aplicación que va a recibir poca carga), utilizad Restlet que tiene una extensión para JAX-RS  y corre como una aplicación Java, sin necesidad de ningún tipo de servidor web o de aplicaciones.
Espero vuestros comentarios, aunque sea para contar lo fácil que sería todo esto con Ruby on Rails.
Disclaimer: Todos los extractos de código del artículo están escritos sin probar.

jueves, 18 de julio de 2013

No se puede acceder a una vista en la base de datos MySQL debido al error: "'view_name' references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them"

Síntomas

El mismo usuario de la base de datos no puede utilizar una vista creada en una base de datos MySQL alojada. Se obtiene el siguiente error:
CREATE VIEW temp_view as
    SELECT * from TEMP_TABLE1;

SELECT * FROM temp_view; 
ERROR 1356 (HY000): View 'db1004420_test_customer.temp_view' references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them

Resolución

Especifique de forma explícita que debe usarse el modelo de seguridad INVOKER mientras se ejecute la vista tal y como puede verse a continuación:
CREATE  SQL SECURITY INVOKER VIEW temp_view as
    SELECT * from TEMP_TABLE1; 

martes, 9 de julio de 2013

JPA Modificar conexion Hibernate por codigo (persistense.xml)


Map addedOrOverridenProperties = new HashMap();

// Let's suppose we are using Hibernate as JPA provider
addedOrOverridenProperties.put("hibernate.show_sql", true);
addedOrOverridenProperties.put("hibernate.connection.url", Configuracion.getProperty("Bd_PcsCsv_Str"));
addedOrOverridenProperties.put("hibernate.connection.username", Configuracion.getProperty("Bd_PcsCsv_Usr"));
addedOrOverridenProperties.put("hibernate.connection.password", Configuracion.getProperty("Bd_PcsCsv_Pas"));

Persistence.createEntityManagerFactory([PERSISTENCE_UNIT_NAME], addedOrOverridenProperties);