lunes, 31 de diciembre de 2012

Mi resumen de 2012 y los propósitos para 2013.

Para cerrar el año me gustaría hacer un post resumen de como ha transcurrido para mi el año 2012, tanto en lo personal como en lo profesional, y de mis propósitos para el año que viene. Siempre suelo comenzar el año con nuevas metas. Es para mi imposible no intentar mejorar en aquello que creo puedo hacer mejor, aunque muchas de estas mejoras las arrastro año tras año ;-)

sábado, 22 de diciembre de 2012

ssh error: WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!

Cuando intentamos acceder por ssh a un ordenador y tenemos el siguiente error:
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that the RSA host key has just been changed.
The fingerprint for the RSA key sent by the remote host is
4a:95:6f:08:82:7d:aa:a1:c3:c3:2b:5f:d5:e3:6c:b8.
Please contact your system administrator.
Add correct host key in /home/josealopez/.ssh/known_hosts to get rid of this message.
Offending key in /home/josealopez/.ssh/known_hosts:4
RSA host key for 192.168.1.50 has changed and you have requested strict checking.
Host key verification failed.

Como vemos en la siguiente captura:


Es debido que ya hemos conectado por ssh a otro ordenador con esa misma IP. Una posible solución es ejecutar el siguiente comando para borrar las claves pertenecientes a este ordenador del fichero know_hosts.
ssh-keygen -R 192.168.1.50
Ahora ya podemos acceder pos ssh a esa IP sin problemas

viernes, 21 de diciembre de 2012

Conocer tarjeta wifi con un comado Ubuntu

Para conocer detalles sobre todos los componentes hardware que tenemos conectados un nuestro ordenador Ubuntu vía PCI tenemos el comando "lscpi"
Este comando nos sacará un montón de información sobre todos estos componentes instalados. Pero para filtrar y sacar solamente información sobre nuestra tarjeta wifi podemos ejecutar el siguiente comando

lspci | grep Wireless

La información que veremos será algo así:


martes, 18 de diciembre de 2012

La historia de Android

Dando una vuelta por Internet, buscando documentación para la redacción de unos temarios, me he encontrado con la web http://www.droidlife.com/
En ella se hace un repaso sobre todos y cada uno de los hitos más relevantes de Android, desde la aparición de una nueva versión del sistema operativo, la aparición de un nuevo SDK, nuevos teléfonos puestos a la venta, etc. 
La estética está bastante cuidada, con una línea de tiempo que se va recorriendo de forma secuencial y, aunque no indica quien es el propietario de la web, de hecho el whois nos devuelve a https://www.domainsbyproxy.com/, un sistema de registro para ocultar el propietario del dominio, la mayoría de teléfonos que aparecen es de la marca Motorola.
Os dejo una captura de pantalla y si alguna vez tenéis que preparar alguna documentación sobre Android ya tenéis un recurso más!


LIBRO RECOMENDADO PARA APRENDER ANDROID

Uno de los libros fundamientales y que recomiendo para aprender Android y llegar a hacer aplicaciones profesionales es: Android 2 Application Developement de Reto Meier


lunes, 3 de diciembre de 2012

Como comenzar con GitHub

Hace unas semanas os decía que había comenzado a usar Bitbucket (aquí) para trabajar en un repositorio que, por ahora, queríamos que fuera privado. Ahora, en otro proyecto nos han pedido que usemos GitHub dado que la mayoría de participantes estaban acostumbrados a él. Al ser la primera vez que lo uso, me he hecho mi propia guía sobre como empezar a usarlo. 

GitHub: error: The requested URL returned error: 403 while accessing https://github.com/repositorio.git/info/refs

Como os decía en la entrada anterior (aquí) he comenzado a usar GitHub para poder compartir el código de un proyecto que me gustaría que se desarrollase en un ámbito colaborativo.
Al intentar subir el repositorio me he encontrado con el siguiente error:
error: The requested URL returned error: 403 while accessing https://github.com/josealopezpastor/ElggAndroidClient.git/info/refs
Y ha resultado ser por un error en la versión de Git que tenía instalado. Según podemos ver en la información de GitHub (aquí) se ha de tener la versión 1.7.10 o superior. 
Para actualizar Git solamente tenéis que seguir los 3 comandos básicos que apunté en la anterior entrada (aquí)
Espero que os sirva esta entrada!!

Como actualizar Git en Ubuntu

Pues resulta que he comenzado a usar GitHub por un proyecto colaborativo en el que tengo mucha ilusión y que os iré contando poco a poco. Resulta que tras hacer push me salía un error que tras buscar en mi amigo Google es por tener una versión desactualiada de Git.
Para actualizarlo hay que hacer tres sencillos pasos, añadir el repositorio de Git, actualizar el índice del repositorio y por último actualizar Git. Los comandos son:

sudo add-apt-repository ppa:git-core/ppa
sudo apt-get update
sudo apt-get install git

Espero que os sirva!

viernes, 30 de noviembre de 2012

Icono de nuestra web en el navegador

Esta mañana me han pedido cambiar la imagen que aparece en la pestaña del navegador cuando cargamos una página web. Es decir, el icono pequeño que se carga en nuestro navegador y que, si no lo cambias, en Tomcat aparece algo como os muestro a continuación:


La verdad es que no está mal ver el gato de Tomcat pero prefiero ver la imagen de mi aplicación, siempre será mejor para el "branding" de la web que estamos desarrollando. Para cambiarlo, tenemos que poner los siguiente en el Head de nuestra web:

<link rel="shortcut icon" href="enlace_imagen_favicon" type="image/x-icon"/>

Y ahora veremos algo como sigue:


Podéis encontrar más información haciendo una búsqueda en Google con "cambiar favicon" ;-)

viernes, 23 de noviembre de 2012

Como aumentar velocidad de carga de la web

He comenzado  a leer el libro de Sico de Andrés sobre SEO "Quiero que mi empresa salga en Google" con el fin de poder ir aplicando al blog un poco de optimización y de aprender este maravilloso mundo que siempre he ido dejando de lado. La verdad es que llevo muy pocas páginas para poder hacer una valoración global del libro,por ahora muy sencillo, muy rápido de leer y muy interesante, pero iré anotando todo aquello que voy viendo relevante para conseguir optimizar y hacer un poco de SEO. Lo primero que me ha llamada la atención y no conocía es una herramienta de Google para optimizar la velocidad de carga de la web. Se llama "Make the web faster" y permite indicando la URL de tu web recibir una serie de consejos a realizar para conseguir que tu web cargue de forma más rápida.

martes, 20 de noviembre de 2012

Configurar IP estática en Ubuntu Server 12.04 LTS


En otras entradas anteriores os comentaba como instalar Ubuntu Server 12.04 LTS (aquí) y además os comentaba como instalar el servidor Open SSH (aquí), pues ahora os enseñaré como configurar la IP de forma estática. Esto es imprescindible sino queremos que se nos cambie la IP del servidor cada vez que lo reiniciamos.


Para ello tenemos que modificar el fichero /etc/network/interfaces y cambiar lo que hay por:
iface eth0 inet static
address 192.168.1.50
netmask 255.255.255.0
network 192.168.1.0
broadcast 192.168.1.255
gateway 192.168.1.1
dns-nameservers 208.67.222.222 208.67.220 220

Aunque claro, debemos de cambiar los valores por lo que nos interese:
address: la dirección IP que tendrá nuestra máquina
netmask: la máscara de red. Si usamos una dirección IP de clase C, habitual en redes pequeñas, del tipo 192.168.1.x la máscara de red será 255.255.255.0
nerwork: la dirección de la red. Será nuestra dirección IP pero con el último valor acabado en 0.
broadcast: la dirección de broadcast. Será nuestra dirección IP pero con el último valor acabado en 255.
gateway: la puerta de enlace, es decir, la IP del router de salida.
dns-nameservers: la dirección IP de los servidores DNS. En este caso he usado los del proyecto OpenDNS.
En este caso tengo que darle miles de gracias a Pedro Espín López que ha sido quién se ha currado esta entrada. Además yo no tenía ni idea del proyecto OpenDNS por lo que ya aprendí algo en el día de hoy ;-)
 ---------------------------------------------
PD: Un buen libro para aprender sobre Ubuntu Server (aunque un poco caro) es:  El libro oficial de Ubuntu Server de Kyle Rankin y Benjamin Mako Hill.

domingo, 18 de noviembre de 2012

Perspectiva DDMS para ver emulador Android con Eclipse

Gracias a @itmag he descubierto una nueva perspectiva para cuando vuelvas compilas tus desarrollos y te los llevas al emulador de Android. Se llama DDMS (Dalvik Debug Monitor Server) y se puede mostrar desde Window-Open Perspective-Other y seleccionamos la opción DDMS.






Ahora lo que vemos son todas las pantallas que nos hacen falta para interactuar con nuestro emulador, entre ellos el File Explorer, el log, acceso al GPS, llamadas, etc. Es muy útil para poder probar cosas e interactuar con la máquina virtual.


LIBRO RECOMENDADO PARA APRENDER ANDROID

Uno de los libros fundamientales y que recomiendo para aprender Android y llegar a hacer aplicaciones profesionales es: Android 2 Application Developement de Reto Meier




Como borrar base de datos en nuestros desarrollos Android

El motor de base de datos que usa por defecto Android es SQLite. Cuando creamos una base de datos esta se guarda como un fichero dentro del sistema del emulador de archivos y podemos, si nos interesa, borrarla para ver como se comporta nuestra aplicación. No entramos aquí en como se crean y se emplean las bases de datos Android, lo puedes ver en otras entradas del blog buscando a la derecha con la etiqueta Android.

Aquí os quiero enseñar en como cargarnos de un plumazo toda la base de datos. Para ello vamos a usar File Explorer dentro del entorno de desarollo Eclipse. En esta entrada os comenté como se abría esta ventana de Eclipse para poder subir y ficheros. Pero además también podemos borrar la base de datos entera. Para ello, tenemos que abrir File Explorer y buscar la ruta data - data como vemos en la imagen siguiente:


Una vez abrimos esta ruta veremos un listado con los archivos de todas las aplicaciones que tenemos instaladas. Para buscar nuestra aplicación tenemos que buscar la ruta de los paquetes que hemos empleado en el desarrollo en mi caso org.development.lupulina. Veremos dentro un directorio que se llama databases y dentro el fichero que lleva nuestra base de datos. Seleccionándola y pinchando en el botón que os pongo en la imagen siguiente hemos borrado nuestra base de datos.


Esperemos que os sirva!
LIBRO RECOMENDADO PARA APRENDER ANDROID

Uno de los libros fundamientales y que recomiendo para aprender Android y llegar a hacer aplicaciones profesionales es: Android 2 Application Developement de Reto Meier




viernes, 16 de noviembre de 2012

Ver archivos del emulador android

Si estamos desarrollando un proyecto con Android podemos usar muchos entornos de desarrollo entre ellos Eclipse. Este es el que uso normalmente, nunca he usado netebean ni ningún otro y la verdad es que siempre me ha funcionado a la perfección. Cuando instalamos el SDK también podemos crear máquinas virtuales o AVD (Android Virtual Device). A menudo necesitamos mover archivos a estas AVD y para ello lo mejor es usar el File Explorer del Eclipse. Para poder cargarlo tenemos que hacer los siguiente Window-->Show View--> Others


 Y seleccionamos  FileExplorer:


Ahora ya veremos en nuestro Eclipse una pestaña que nos permite subir y bajar ficheros al emulador, ir recorriendo las carpetas, etc. Esto suele ser muy útil cuando queremos por ejemplo borrar un archivo o ver que archivos hemos creado en el emulador.


Espero que os sirva!!

LIBRO RECOMENDADO PARA APRENDER ANDROID

Uno de los libros fundamientales y que recomiendo para aprender Android y llegar a hacer aplicaciones profesionales es: Android 2 Application Developement de Reto Meier




lunes, 12 de noviembre de 2012

Como pasar datos entre dos activity en #Android

En Android a menudo tenemos que pasar un parámetro o un valor desde una pantalla o activity a otra pantalla. Por ejemplo, cuando tenemos una lista y seleccionamos un elemento de dicha lista y queremos tratar dicho elemento en una pantalla siguiente.

Supongamos que tenemos nuestra aplicación Android y ahora mismo estamos en una pantalla en la que podemos ver una lista como la que mostramos a continuación:


Este activity se llama ListPerson.java y queremos que cuando se seleccione uno de los elementos de la lista se pase a otro activity llamado EditPerson.java. El código que se encarga de escoger el seleccionado y pasar a otra activity es:


@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
        // TODO Auto-generated method stub
        super.onListItemClick(l, v, position, id);
     
        String identificador = Long.toString(id);
        Intent editarPersona = new Intent(getApplicationContext(), EditPerson.class);
        editarPersona.putExtra("identificador", identificador);
        startActivity(editarPersona);
}
Vemos como estamos cogiendo el id del elemento seleccionado en la variable identificador, creado un intent del tipo EditPerson.java y mediante putExtra le añadimos este identificador al intent. Por último solamente tenemos que hacer el startActivity.
Lo que tenemos que hacer en el activity EditPerson.java es mostrado a continuación:

@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.editperson);
     
        Bundle extras = getIntent().getExtras();
        if (extras!=null)
        {
        String identificador = extras.getString("identificador");
        }
}

En el onCreate estamos introduciendo la línea Bundle extras=getIntent().getExtras la cual introduce en la variabke extras todo lo recibido. Ahora solamente nos falta extraerlas en el caso de que no esté vacío con un getString("mismo nombre que le dimos antes") y listo, ya hemos pasado el valor de una pantalla a otra.
       

LIBRO RECOMENDADO PARA APRENDER ANDROID

Uno de los libros fundamientales y que recomiendo para aprender Android y llegar a hacer aplicaciones profesionales es: Android 2 Application Developement de Reto Meier




sábado, 10 de noviembre de 2012

How to ... Como personalizar listas de datos en Alfresco

Hace unas semanas tuvimos que hacer una personalización de una lista de datos para hacerle una demo a un cliente y menos mal que lo teníamos documentado de otras veces que no tuvimos que empezar desde cero. Lo anoto ahora aquí por si le sirve a otras personas.

Para personalizar una lista de datos se tienen que modificar tres archivos:

El  1º de ellos el datalistModel.xml se encuentra en: /opt/alfresco-3.4.d/tomcat/webapps/alfresco/WEB-INF/classes/alfresco/model
El 2º archivo a modificar es share-datalist-form-config.xml que se encuentra en: /opt/alfresco-3.4.d/tomcat/webapps/share/WEB-INF/classes/alfresco
Y por último se tiene que modificar data-list-model_es.properties que se encuentra en: /opt/alfresco-3.4.d/tomcat/webapps/alfresco/WEB-INF/classes/alfresco/messages

lunes, 5 de noviembre de 2012

Como saber programas que tengo instalados en Ubuntu

Según podemos ver en la wikipedia, el programa dpkg es el que se encarga de la gestión de los paquetes en la distribución de Ubuntu. Con un man dpkg podemos tener mucha más información sobre este comando pero el que nos interesa es:
dpkg --get-selections
Nos devolverá un lista, a menudo muy extensa, de las aplicaciones que tenemos instaladas. Si queremos consultar esta lista de una manera más cómoda podemos hacer
dpkg --get-selections > programas.txt
Y abrir nuestro archivo con cualquier visor como nano, vim o less. O también podemos filtrar directamente el resultado con grep. Si queremos ver por ejemplo todos los programas que lleven la palabra java, podemos hacer:
dpkg --get-selections | grep java
Otra cosa apuntada y si te sirve comparte!

PD: Un buen libro para aprender sobre Ubuntu Server (aunque un poco caro) es:  El libro oficial de Ubuntu Server de Kyle Rankin y Benjamin Mako Hill.

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

martes, 25 de septiembre de 2012

Ver las últimas líneas de un fichero en Linux. El comando tail

Si queremos consultar la última parte de un fichero sin abrirlo entero e ir, por ejemplo porque estamos levantando Tomcat y queremos ir viendo el catalina.out, podemos usar el comando tail. Este comando permite ver las últimas líneas de un fichero, pudiendo decir si queremos que abra un número de líneas o un número de bytes.
La forma más normal de usarlo es:
tail -20 nombre_fichero
Y nos mostrará las últimas 20 líneas del archivo que le especificamos.

lunes, 24 de septiembre de 2012

Problema con previsualización de .pdf en Alfresco 3.4.x

Cuando instalamos por primera vez la versión 3.4.x de Alfresco vemos que no se previsualizan los documentos del tipo .pdf cuando usamos la interfaz de Alfresco Share. Esto es por un problema con la librería pdf2swf. Pero no nos asustemos tiene fácil solución. La fuente a como solucionarlo aquí 
Para comprobar que sea por este problema, tenemos que irnos a:
/opt/alfresco-3.4.c/common/bin
y ejecutar ./psd2swf
Veremos que nos dice algo como:
/opt/alfresco-3.4.d/common/bin/.pdf2swf.bin: error while loading shared libraries: /opt/alfresco-3.4.d/common/lib/libstdc++.so.5: file too short
La solución es movernos a la carpeta /opt/alfresco-3.4.d/common/lib/ y cambiar el enlace simbólico con:
mv libstdc++.so.5 libstdc++.so.5.bad
Y crear un nuevo enlace simbólico con:
ln -s libstdc++.so.5.0.3 libstdc++.so.5
Ahora ya si volvemos a /opt/alfresco-3.4.d/common/bin/ y ejecutamos ./pdf2swf veremos la información sobre el uso de las librerías.




Alfresco 4.x en un ordenador de 32 bits

La última versión de Alfresco Community solo está disponible para máquinas de 64 bits, por lo que si no tienes un ordenador de esas características solo te queda la opción de, con sudor, lágrimas y un poco de suerte, seguir el excelente tutorial de @tpeelen que se encuentra aquí e intentar instalarlo desde el war. La versión que vamos a emplear es la 4.0.e y se puede descargar desde aquí.

miércoles, 12 de septiembre de 2012

How to ... Como instalar Oracle Virtual Box en Ubuntu

Esta semana me ha tocado instalarme una máquina virtual en mi portátil con Ubuntu para unas pruebas con Alfresco. Para ello he seguido tanto este blog como esta web

Un resumen de los comandos para tenerlos a mano son:
  1. Añadimos al /etc/apt/sources.list el repositorio con: echo "deb http://download.virtualbox.org/virtualbox/debian $(lsb_release -sc) contrib" | sudo tee -a /etc/apt/sources.list
  2. Añadimos las claves con: wget -q http://download.virtualbox.org/virtualbox/debian/oracle_vbox.asc -O- | sudo apt-key add -
  3. Ahora ya podemos darle caña a la instalación del paquete con: sudo apt-get install virtualbox-4.1 La versión 4.1 es la última disponible.
Además es recomendable instalar las Extension Pack, algo así como las Tools de VMWare. Para ello tenemos que descarganos el archivo  http://download.virtualbox.org/virtualbox/4.1.22/Oracle_VM_VirtualBox_Extension_Pack-4.1.22-80657.vbox-extpack y desde VirtualBox - Archivo - Preferencias - Extensiones le indicamos el archivo que hemos descargado y ya tenemos el Extension Pack instalado.


Otra cosa anotada!

How to ... Como añadir repositorios externos en Ubuntu

El archivo que se encarga de controlar los repositorios desde los que se instalan los paquetes o aplicaciones el /etc/apt/sources.list Para añadir un nuevo repositorio desde el que obtener paquetes solamente tenemos que añadir una línea en ese archivo para indicar el nuevo repositorio. Ahora mismo estoy con la instalación de VirtualBox para Ubuntu por lo que la línea que he tenido que añadir es

deb http://download.virtualbox.org/virtualbox/debian lucid contrib
Para añadir la línea podemos usar cualquier editor de texto como nano o vim o directamente usar la sentencia 
echo "deb http://download.virtualbox.org/virtualbox/debian $(lsb_release -sc) contrib" | sudo tee -a /etc/apt/sources.list
Como veis se tiene que añadir que versión de Ubuntu se tiene para que el repositorio que consultemos sea el adecuado. Con el comando anterior, además se indica la versión de Ubuntu directamente sin que la indiquemos a mano. Esto lo hace la sentencia $(lsb_release -sc)
Otro apunte anotado para tenerlo a mano!

PD: basado en el artículo de AJPD http://www.ajpdsoft.com/modules.php?name=News&file=article&sid=530#.UFBuxaU5i9V Este tio es un crack!

martes, 11 de septiembre de 2012

Como cambiar la IP en Ubuntu

Para poner una IP en Ubuntu tenemos que modificar el fichero /etc/nertwork/interfaces. Para ellos
sudo vim /etc/network/interfaces
Si tenemos configurada la IP por DHCP, cuando entremos veremos algo así:
#This file describes the network interfaces available on your system#and how to activate them. For more information, see interfaces
#The loopback network interfaceauto loiface inet loopback
#the primary network interfaceauto eth0iface eth inet dhcp
Pero si queremos ponerle una IP de forma manual, tenemos que cambiarlo por:

#This file describes the network interfaces available on your system
#and how to activate them. For more information, see interfaces
#The loopback network interface
auto lo
iface inet loopback
#the primary network interface
auto eth0
address 192.168.1.25
netmask 255.255.255.0
network 192.168.1.0
broadcast 192.168.1.255
gateway 192.168.1.1

Donde los valores address, netmask, network, broadcast y gateway son cambiados por lo que nos interesa. Ya solamente faltaría reiniciar la interfaz de red con: sudo /etc/init.d/networking restart

lunes, 10 de septiembre de 2012

Configurar el correo saliente en Alfresco 3.4

Hace unos días que se nos rompió el disco duro del servidor donde teníamos Alfresco funcionando en la empresa y estoy intentando volver a hacerlo funcionar. Una de las cosas que teníamos configuradas era el servidor de correo y vamos a volver a ponerlo bien. 
Cuando lo puse en marcha fué gracias a uno de los blogs más completos de Alfresco en español, http://blyx.com/ y aquí está la entrada de como configurar el correo.
Para configurar el correo debemos añadir en el archivo /opt/alfresco-3.4.d/tomcat/shared/classes/alfresco-global.properties lo siguiente:

### Outbound mail SMTP ###
mail.host=smtp.gmail.com
mail.port=465
mail.protocol=smtps
mail.smtps.auth=true
mail.username=ctnavalydelmar@gmail.com
mail.password=xxxxxxx
mail.encoding=UTF-8
mail.from.default=ctnavalydelmar@gmail.com
mail.smtp.starttls.enable=true

Además con esto tendremos un correo de notificación cada vez que Alfresco arranca:

### Test message when Alfresco starts ###
mail.testmessage.send=true
mail.testmessage.to=josealopez@ctnaval.com
mail.testmessage.subject=Outbound mail from Alfresco, server started.
mail.testmessage.text=Outbound SMTP email subsystem is working. Installed on ${dir.root}