martes, 30 de octubre de 2012

Sacar las relaciones base datos Oracle con Toad Data Modeler

Esta mañana me he estado divirtiendo con Toad Data Modeler 4.3. Se trata de un interesante programa de Dell que te permite hacer ingeniería inversa sobre una base de datos. El tema es que tenemos que interconectar dos aplicaciones y necesitamos conocer bien el modelo de datos con los que trabajan ambas y buscando y rebuscando por google me encontré con esta curiosa aplicación. 
Lo que vamos a hacer es obtener una vista de las relaciones de una base de datos en la versión Oracle 9i usando Toad Data Modeler, aunque según indican en las especificaciones se puede usar infinidad de bases de datos. Se trata de una versión de prueba de 30 días por lo que en principio tiene que se suficiente para cacharrear y si hay presupuesto comprarlo, mientras que si se trata de jugar en casa buscar el crack. 
Se puede descargar de aquí y la instalación es muy sencilla, os dejo unas capturas de pantalla como guión:

Comandos Oracle útiles

Los comandos en Oracle son algo distintos que en MySQL y que para PostgreSQL.
Pongo a continuación un resumen de algunos de los comandos que he empleado para administrar bases de datos Oracle y que nos pueden ser útiles en el futuro:

Para ver todas las tablas que hay en todas las bases de datos (si hemos entrado con system)
SELECT TABLE_NAME FROM DBA_TABLES ORDER BY TABLE_NAME;
Para ver a cuantas tablas tienen acceso cada uno de los usuarios:
SELECT  COUNT(*), OWNER FROM DBA_TABLES GROUP BY OWNER;  
Para ver un listado de las tablas a las que acceden uno de estos usuarios:
SELECT TABLE_NAME FROM ALL_TABLES WHERE OWNER='my_usuario'; 

lunes, 29 de octubre de 2012

Cambiar el nombre de una columna en PostgreSQL

Para cambiar el nombre de una columna en una tabla en PostgreSQL tenemos el comando rename column. La sintaxis sería algo como sigue:
alter table mi-tabla rename column nombre-antiguo to nombre-nuevo;

miércoles, 24 de octubre de 2012

Escribir y leer en autómatas (PLC) con Java mediante ModbusTCP

Según la Wikipedia, Modbus es un protocolo cliente/servidor empleado para la conexión de autómatas (PLC). Se trata de un protocolo abierto y de fácil implementación, cosas que han hecho que esté ampliamente extendido. Podemos consultar en la web modbus.org tanto el estándar como mucha otra documentación oficial. Modbus se encuentra dentro del nivel 7 de la pila de protocolos OSI, por lo que se establece dentro de lo que se conoce como nivel de aplicación.
El nacimiento de Modbus se remonta al año 1979 por lo que ha llovido bastante ;-) y durante estos años han surgido versiones del protocolo para poder conectar los autómatas (PLCs) en una red junto con mas autómatas o más ordenadores. Estas versiones del protocolo se conocen como Modbus/RTU si se conecta el autómata al ordenador a través de un puerto serie o Modbus/TCP si se conecta mediante Ethernet. Me centraré en Modbus/TCP que es el que he tenido que usar.

martes, 23 de octubre de 2012

Redireccionar un dominio con 1and1 a nuestro servidor con CNAME

Si tenemos nuestro nombre de dominio con 1and1 y queremos hacer una redirección de nuestro dominio o de alguno de nuestros subdominios a otra página web, podemos hacerlo con CNAME o alias. Pongo el ejemplo desde 1and1 porque es lo que he tenido que hacer, pero si tiene un servidor DNS como bind9 directamente en Ubuntu o el dominio registrado con cualquier otra compañía también es posible hacerlo. Si queremos redirigir todas las visitas de nuestras páginas a una sola página o queremos cambiar algún servicio de dirección pero que a los usuarios no les afecte, podemos configurar un alias para ese nombre de dominio y redirigir todo el tráfico a esa web. Los dominios de 1and1 se pueden comprar por solo 6 € año desde aquí mismo y ahora mismo si quieres. 
Para hacer la redirección, primero accedemos al panel de control de 1and1 y vamos a la sección de domininios. 


Pasaremos a ver una lista de nuestros dominios y subdominios tal y como se ve en la imagen:


Seleccionamos el dominio que deseamos redireccionar:



Y seleccionamos que queremos hacer una redirección por Canonical name (CNAME) o Alias Tendremos que escribir entonces el nombre hacia donde queramos mandar las visitas de nuestra web y listo.


Pero esta redirección no es inmediata, puede tardar hasta 24 horas en aplicarse ya que se tienen que actualizar los nombres en los servidores DNS. Estos servidores se refrescan periódicamente, puede que tarden hasta 24 horas, de modo que no nos volvamos locos pinchando en F5!

sábado, 20 de octubre de 2012

Java y Tomcat: filtrar peticiones que no vienen de tu dominio

Os cuento una movida que me ha pasado esta semana a ver que os parece. Desde estos últimos meses estoy trabajando en un proyecto de desarrollar una aplicación web de gestión de procesos de una empresa. Esta aplicación la estamos haciendo con Tapestry, un framework de Java que usa Maven para desarrollo de aplicaciones web. Además usamos PostgreSQL, Hibernate, Jasper, JavaScript, JSON,  y la desplegamos en un servidor Apache Tomcat en un hosting de Internet.
Como se trata de una aplicación interna, no está indexada en Google ya que no queremos que esté. Pues bien, vamos haciendo módulos y partes hasta que esta semana nos llama el cliente y nos dice que poniendo el nombre de la empresa en Google le sale una página porno llamada www.muyzorra.com y con la descripción de la aplicación que estamos haciendo. Hacemos un Whois y nos sale una empresa de Sevilla. Llamamos a la persona y nos dice que no sabe nada, que tiene ese dominio comprado hace muchos años pero aparcado para su venta. 
Lo más graciosos es que redireccionaba a la aplicación y se podía trabajar manteniendo las URL, es decir, metes usuario y password y tenías direcciones del tipo www.muyzorra.com/administracion y funcionando ;-)
Nosotros hemos puesto lo siguiente en la home de entrada para que todo el tráfico que venga de ahí lo derive a la web www.google.es Es algo parecido a usar la variable global SERVER_NAME de PHP pero para Java.

Object onActivate() throws ServletException, IOException { HttpServletResponse response = requestGlobals.getHTTPServletResponse(); HttpServletRequest request = requestGlobals.getHTTPServletRequest(); doGet(request, response); if(serverName.equals(nombreServidorObtenido) || serverName2.equals(nombreServidorObtenido)) { return null; } else { return new URL("http://www.google.es"); } } public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); nombreServidorObtenido=request.getServerName(); }

Pero sigo sin explicármelo... Comenta @nicolasmarin que seguramente alguien haya entrado en su servidor y le haya hecho una redirección con CNAME sin que lo sepa. Porque sino, para que redireccionas un dominio porno a una aplicación interna de una empresa muy pequeña?? A mi no se me ocurre nada más :-(
Seguiré dándole vueltas!!

PD: Muchas gracias a @pablesite, @nicolasmarin y @jrbelandor que son los que me echaron un cable en este embrollo

viernes, 19 de octubre de 2012

Herramientas para comparar bases de datos PostgreSQL

Normalmente, cuando se trabaja en un proyecto web, se tiene una base de datos en local  local (desarrollo) y luego la base de datos en el servidor (tanto preproduccion como producción). A medida que se van produciendo avances en desarrollo se van anotando los scripts que se tienen que meter en la base de datos de prerproducción y producción para que todo quede homogéneo. Pero cuando se producen muchos avances o el equipo es grande, en ocasiones, se puede perder el control del estado en el que se encuentran las tres bases de datos. Entonces se necesitan herramientas que permitan comparar como se encuentran estas para poder igualarlas y proseguir con el desarrollo. Yo he encontrado y probado un poco un par de ellas: apgdiff y EMS DB Comparer. Voy a contaros un poco sobre cada una de ellas.
  1. Apgdiff se trata de una herramienta online, no tenemos que descargarla, si no que accedemos a ella a través de la url y le cargamos los archivos de las bases de datos. Yo solamente lo he probado pasándole los archivos de creación del esquema, es decir, lo que generar la exportación de un pg_dump --schema-only. Y funciona de maravilla!! Obtienes en una pantalla las diferencias entre la base de datos origen y la destino, de forma que si metemos el script tal cual en la base de datos dejamos las bases de datos exactamente iguales. Una imagen de como es el resultado: 


  2. Te indica cuales son las instrucciones que tienes que ejecutar en la base de datos destino para que queden exactamente iguales, incluyendo secuencias, tablas, foreing_key y permisos.

  3. EMS DB Comparer se trata de una solución instalable pero que con Wine se me ha instalado en Ubuntu sin problemas. Esta herramienta no es gratuita sino que se trata de una herramienta de pago. Pero te puedes descargar desde la web una versión gratuita que dura 30 días. Seguramente  la siguiente vez que la tenga que usar ya se haya caducado :( Se trata de una herramienta más potente que la anterior y con alguna funcionalidad muy interesante. Ahora no tenemos que subir los archivos de creación sino que directamente la conectamos con nuestras bases de datos. Podemos indicarle parámetros de conexión tanto para bases de datos locales como para bases de datos funcionando en servidores remotos. Yo la probé para dos bases de datos locales. Una vez se le suministra los parámetros de conexión incluyendo usuario y contraseña realiza la comparación entre las bases de datos y te devuelve cuales son las instrucciones que diferencian una de otra. Las diferencias te las indica tanto en un sentido como en otro simplemente pinchando en cada una de las pestañas con la flecha y los nombres de las bases de datos.


    Además te permite ejecutar las instrucciones que te ha devuelto. Estas se pueden ejecutar de una en una o todas seguidas, así como poner primero o detrás cada una de las instrucciones que queremos ejecutar. Por lo tanto podemos ordenar las instrucciones que queremos ejecutar y con solo un botón dejar las dos bases de datos exactamente iguales. 


    Como os decía al principio esta herramienta es bastante potente y completa, encontrándose versiones desde los 45 €  hasta los 4060 €. La verdad es que no he podido encontrar en la web a que se debe cual es la diferencia de precio entre las distintas versiones porque hay bastante!

jueves, 18 de octubre de 2012

Solución al error: org.postgresql.util.PSQLException: ERROR: permission denied for sequence

Si nos encontramos con un error del tipo org.postgresql.util.PSQLException: ERROR: permission denied for sequence nombre_secuencia podemos solucionarlo haciendo un GRANT de UPDATE para esa secuencia y el usuario que deseamos. La secuencia que tenemos que usar sería algo así:
sudo su - postgres
psql nombre_base_datos
GRANT UPDATE ON nombre_secuencia TO usuario;

Esperemos que os sirva!

lunes, 15 de octubre de 2012

Historia de una portabilidad de Vodafone a Pepephone y como me quedé en Vodafone

Pues hace ya bastante tiempo que andaba con el teléfono bastante fastidiado y necesitaba cambiarlo. Durante los últimos dos años y medio me ha acompañado un HTC Desire al que le he hecho mil perrerías, entre ellas me lo llevo para correr ... Había dado una vuelta por las tiendas online de segunda mano como http://www.segundamano.es/, etc. pero la verdad es que estaba todo super caro. Del orden de 150 € por Samsung Galaxy I, unos 300 € por Samsung Galaxy II y alrededor de 450 por Samsung Galaxy III, esto solamente por poner un ejemplo. Al no estar las empresas de telefonía móvil regalando teléfonos con la misma soltura que antes se están poniendo los teléfonos un pelín caretes.
Llamo pues a Vodafone y me ofrece el Samsung Galaxy Y por 50 € y el Samsun Galaxy Ace por 100 €. Pero es que estamos locos o q?? Me estás vacilando?? Que yo estoy muy loco eh?? Hace unos meses regalaban el Ace solamente por renovar la permanencia y ahora que no tengo ni permanencia me quieren cobrar 100 €. Además resulta que tengo contrato de empresa por lo que me parecía todavía más surrealista ¿Así tratan a sus clientes de empresa? Además con tarifas mucho más caras que los OMV como Pepephone o Simyo. No, así no vamos bien...
Qué hice entonces?? Pido la portabilidad a Pepephone. Esto fue un jueves tarde, un 11 de Octubre. Durante el 12 de Octubre, festivo nacional en España, ni durante el 13 Sábado ni 14 Domingo no se pone en contacto conmigo nadie de Vodafone. Pero el lunes por la mañana me llaman a las 9 de la mañana para hacerme la contraoferta. Me ofrecen la tarifa XS2,  con llamadas a 1.9 cent/min y 15 cent establecimiento e internet a 9 €. Supongo que la tienen para gente que le dicen que se van a OMV. La única diferencia a la tarifa que había contratado con Pepephone es 2 € más caro Internet, aunque un poco más de ancho de banda. Además me dejan el Sony Xperia U a 50 € por lo que ya no me interesa pasarme a Pepephone, dado el precio de los terminales me compensa quedarme en Vodafone. 
Por lo menos a mi me han conseguido retener, dado el precio que tienen los terminales en otras web y lo poco que me ahorro con Pepephone me voy a quedar con ellos otra temporada más, aunque me jode que tenga que ser con la amenaza de la portabilidad para que te ofrezcan algo que medio merezca la pena.  

miércoles, 10 de octubre de 2012

Fallo en Tomcat7 java.lang.OutOfMemoryError: PermGen

Cuando nos encontramos en Tomcat con el fallo "java.lang.OutOfMemoryError: PermGen" es que nos hemos quedado sin espacio en una de las memorias que usa Tomcat dentro de la JVM. Es harina de otro post explicar como se separa entre PermGen, Head, etc el uso de memorias, pero para solucionar este fallo en Tomcat 7, nos vamos al catalina.sh que suele estar en /usr/share/tomcat7/bin/ y lo editamos con el editor que más nos guste, nano, vi, etc. y añadimos lo siguiente:
JAVA_OPTS="-Djava.awt.headless=true -Dfile.encoding=UTF-8 -server -Xms1536m  -Xmx1536m -XX:NewSize=256m -XX:MaxNewSize=256m -XX:PermSize=256m -XX:MaxPermSize=256m -XX:+DisableExplicitGC"
El archivo nos quedaría algo así:

# $Id: catalina.sh 1146069 2011-07-13 14:47:32Z markt $
# -----------------------------------------------------------------------------

JAVA_OPTS="-Djava.awt.headless=true -Dfile.encoding=UTF-8 -server -Xms1536m -Xmx1536m -XX:NewSize=256m -XX:MaxNewSize=256m -XX:PermSize=256m -XX:MaxPermSize=256m -XX:+DisableExplicitGC"

# OS specific support.  $var _must_ be set to either true or false.
cygwin=false
darwin=false
os400=false
case "`uname`" in
CYGWIN*) cygwin=true;;
Darwin*) darwin=true;;
OS400*) os400=true;;
esac
Lo que estamos haciendo es ampliar la memoria de PermGen por defecto como máximo a 64 Megas pasarla a 256 y con esto solucionamos la mayoría de nuestros problemas de este tipo.

viernes, 5 de octubre de 2012

Archivo de configuración de Maven 2 + Hibernate 3.3 + MySQL o PostgreSQL

En un proyecto en el que llevamos tiempo trabajando hemos estado usando Tapestry5. Más concretamente hemos estado usando Tapestry con Maven 2, Hibernate 3.3 y PostgreSQL 8. Pero ahora me ha surgido la necesidad de hacer unas pruebas con el mismo entorno pero con MySQL. Para otro desarrollo vamos a usar la misma tecnología pero no tengo claro si MySQL o PostgreSQL.
Lo primero ha sido cambiar el archivo de configuración del proyecto, el hibernate.cfg.xml. Para PostgreSQL este archivo tenía los siguientes valores:

Diferencias entre comandos para PostgreSQL y MySQL

Hay algunas diferencias entre los comandos para una y otra base de datos que voy a ir anotando aquí.
El primero es la forma de conectarse.

PostgresSQL

josealopez@josealopez-laptop:~ $ sudo su - postgres
MySQL
josealopez@josealopez-laptop:~ $ mysql -u root -p
Una vez que nos hemos conectado, para poder ver todas las bases de datos 

PostgreSQL
postgres@josealopez-laptop:~$ psql
postgres=# \l
MySQL
mysql> show databases;
Para usar una u otra base de datos

PostgresSQL:
postgres@josealopez-laptop:~$ psql database_name 
MySQL
mysql> use database_name
Para crear un campo autoincremental también se hace de forma distinta, de hecho, en MySQL no se usan los elementos del tipo sequence que pueden ser mapeados con JPA. Por lo tanto lo que para PosrgreSQL es: create sequence mi_seq que luego es empleado en una table como clave primaria con id int default nextval('mi_seq') primary key,para MySQL es id int not null primary key auto_increment.

Por lo tanto, para crear una tabla que use campo autoincrementales

PostgreSQL
CREATE SEQUENCE mi_seq;
CREATE TABLE "mi_tabla" (
id int default nextval('mi_seq') primary key,
"nombre" varchar (50),
"login" varchar(10)
);
MySQL
CREATE TABLE mi_tabla (
id int not null primary key auto_increment,
nombre varchar(50),
login varchar(10))

Iré añadiendo más conforme vaya encontrando.


Configurar SQuirreL SQL para MySQL

Uno de los clientes para bases de datos que he usado en Ubuntu ha sido SQuirreL. Con PostgreSQL siempre me ha funcionado a la perfección, es multiplataforma y de libre distribución. Pero mi guerra de hoy ha sido configurarlo para MySQL. Para ello lo primero de todo ha sido bajar el conector MySQL jdbc  de su web.

SQuirrel SQL tiene interfaz gráfica

Pues hace un tiempo que uso SQuirreL SQL y pensaba que no tenía asistente gráfico para crear relaciones ni para ver como estaban hechas. Es algo que si estaba acostumbrado a ver en SQL Server 2005 y que, aunque no lo uso mucho, si que lo echaba de menos.  Pues pensaba mal, cosa que me ocurre muy a menudo, y si que la tiene. Para usarla solamente hay que seleccionar las tablas que queramos representar y con el botón derecho hacemos click en Add to Graph y veremos las tablas en una pantalla como la que os muestro a continuación. 


Aunque no se si es por mi versión de SQuirrel o por usar Ubuntu pero no se ven las relaciones ni marca cuales son las claves primarias. Probaré a actualizarlo a ver que tal y os cuento.
Dedicado a Belando y Ródenas!!

Como conocer la versión de MySQL que se está usando

Al igual que para PostgreSQL tenemos el comando psql --version, para MySQL tenemos otro comando que nos va a mostrar la información de la versión de base de datos que estamos empleando.
Se trata del comando STATUS. Tenemos que conectarnos a nuestro MySQL y ejecutarlo. Sería algo así:


Como se puede ver, tenemos mucha más información además de la versión de MySQL.
El enlace a la documentación oficial del comando aquí.

jueves, 4 de octubre de 2012

Conocer el tamaño de una base de datos en PostgreSQL

Para conocer el tamaño de nuestras bases de datos en PostgreSQL  tenemos el comando  pg_database_size(datname). Para usarlo, la secuencia de comando sería:
sudo su - postgres
psql
SELECT datname, pg_database_size(datname) FROM pg_database;
Lo que veríamos sería algo así:


Si queremos dejarlo más bonito podemos usar el comando pg_size_pretty de la siguiente manera:
SELECT datname, pg_size_pretty(pg_database_size(datname)) FROM pg_database;
Entonces lo que muestra sería:


Esto ya es un poco más entendible ;-)