1-junio-2017
admin

Instalación RabbitMQ en Ubuntu

RabbitMQ se trata de un software de código abierto para la negociación de mensajes. Implementa el estándar Advanced Message Queuing Protocol (AMQP).

Nota: AMQP es un protocolo binario que destaca por su interoperabilidad y fiabilidad. Ofrece un amplio conjunto de funcionalidades como colas fiables basadas en mensajería P/S, enrutamiento flexible, seguridad, además de permitir un control en profundidad de colas, cabeceras,…

Para instalarlo en ubuntu se pueden seguir los siguientes pasos:

1 – Añadir el repositorio de rabbitmq al ubuntu

	echo 'deb http://www.rabbitmq.com/debian/ testing main' |
        sudo tee /etc/apt/sources.list.d/rabbitmq.list

2 – Instalarlo

	sudo apt-get update
	sudo apt-get install rabbitmq-server

3 – Comandos para iniciar, parar,…

	//inicio el servicio rabbitmq
	sudo service rabbitmq-server start

	//parar el servicio rabbitmq
	sudo service rabbitmq-server stop

	//reiniciar el servicio rabbitmq
	sudo service rabbitmq-server restart

	//ver el estado del servicio rabbitmq
	sudo service rabbitmq-server status

3 – Configuración
Por defecto trae creado el usuario: guest (la contraseña es la misma). Podriamos cambiar esa contraseña pero vamos a explicar como sería crear un usuario nuevo para luego borrar el de por defecto:

	//creamos el usuario admin con la contraseña 123
	sudo rabbitmqctl add_user admin 123

	//al usuario admin le asignamos el rol de administrator
	sudo rabbitmqctl set_user_tags admin administrator

	//eliminamos el usuario por defecto (guest)
	sudo rabbitmqctl  delete_user guest

Podemos crear ahora un virtual host con el nombre DISASTER. Un Virtual Host viene a ser el namespace sobre el que luego crearemos los distintos objetos que vamos a utilizar para el intercambio de mensajes (p.e. colas)

	//se crear el virtual host
	sudo rabbitmqctl add_vhost DISASTER

	//asignamos permisos de configuración/lectura/escritura al usuario admin
	sudo rabbitmqctl set_permissions -p DISASTER admin ".*" ".*" ".*"

Una vez creado el virtual host ya podriamos crear en él los canales para realizar el intercambio de mensajes.

Todo esto lo podriamos haber hecho desde la consola que nos provee el propio rabbitmq. Para ello, tendriamos que habilitarla

	sudo rabbitmq-plugins enable rabbitmq_management

Una vez habilitada podriamos acceder a ella así: http://localhost:15672/
Por defecto solo se puede acceder a la web desde localhost, por lo tanto tenemos dos opciones: o bien se cambia la configuracion o bien accedemos desde un tunel.

Para la configuración se debe abrir el fichero /etc/rabbitmq/rabbitmq.config y añadir los accesos que se deseen:

		{tcp_listeners, [5672]},
		{loopback_users, []}

4 – Logs
Por defecto en /var/log/rabbitmq

Documentación oficial

14-mayo-2017
admin

@ElementCollection vs @OneToMany

Estas dos anotaciones nos permiten elaborar relaciones 1 a N entre dos objetos con JPA. A continuación se va a exponer su funcionamiento:

@ElementCollection
Te permite de una forma muy simple definir una relación de una entidad con otros objetos. Se puede por ejemplo, dado un empleado, definir una lista de strings que se corresponden con los telefonos del empleado. Sería así:

@Entity(name="Employee")
@Table(name="EMPLOYEE")
public class Employee {

	@Id
	@Column(name = "_id")
	private String id;

	@Column(name="name")
	private String name;

	@ElementCollection
	@CollectionTable(name="PHONE", joinColumns=@JoinColumn(name="phone_id"))
	@Column(name="phone_number")
	private List< String> phones;
        .....
}

Teniendo en cuenta este ejemplo tendremos en BD:
– Una tabla EMPLOYEE con las columnas -> _id y name.
– Una tabla PHONE con las columnas -> phone_id y phone_number. (el campo phone_id hara de foreign key, mientras que phone_number contendrá el String del número de teléfono)

En el ejemplo anterior usábamos una lista de String pero podríamos usar un objeto @Embeddable, tal que así:

@Entity
public class Employee {
	@Id
	@Column(name = "_id")
	private String id;

	@Column(name="name")
	private String name;

	@ElementCollection
	@CollectionTable(name="PHONE",joinColumns=@JoinColumn(name="phone_id"))
        private List< Phone> phones;
        ...
}

@Embeddable
public class Phone {
        @Column(name="phone_number")
        private String number;
        ...
}

El resultado de hacerlo así en la base de datos sería exactamente el mismo pero nos va a permitir añadir mas campos en el objeto PHONE.

@OneToMany
Te permite relacionar dos objetos Entity.

@Entity
public class Employee {
	@Id
	@Column(name = "_id")
	private String id;

	@Column(name="name")
	private String name;

	@OneToMany(cascade={CascadeType.ALL}, mappedBy="empl", 
                   fetch=FetchType.LAZY, targetEntity = Phone.class)
	@OnDelete(action = OnDeleteAction.CASCADE)
	private List< Phone> phones;
  ...
}

@Entity
public class Phone {
	@Id
	private long id;

	@Column(name="phone_number")
	private String number;

	@ManyToOne
	@JoinColumn(name="phone_id")
	private Employee empl;
	...
}

Como se puede ver hay que marcar la relacion OneToMany en la entidad Employee, marcándole el campo donde debe apuntar (en este caso “empl”). En ese campo de la entidad Phone se debe marcar la ManyToOne indicandole el nombre de la columna (phone_id) que hará de foreign key.

Además, se ha añadido la anotación @OnDelete para indicarle que haga un borrado en cascada de la lista de teléfonos al eliminar al empleado. Esto es significativo por el hecho de que en el caso del ElementCollection no se permite indicar el tipo de borrado.
Nota: Hay que decir que en el borrado en cascada se eliminan de golpe todos los relacionados mientras que sin él, va haciendo un borrado de cada uno de sus relacionados (es decir, si un empleado tiene 10 teléfonos al hacerlo en cascada se lanzaría un único delete mientras que en el otro caso se lanzan 10 sentencias delete).

Resumen final
BD: el esquema de tablas y relaciones que va a construir JPA en nuestra BD va a ser muy similar en ambos casos.
Código: Se puede decir que es mucho más cómodo utilizar @ElementCollection al simplificar el código.
Potencia: Si queremos poder utilizar toda la potencia de las relaciones optimizando nuestros recursos es mejor decantarse por @OneToMany.


Fuente
@ElementCollection
@OneToMany

7-mayo-2017
admin

Configuración de host y dominio (DNS)

Cuando se quiere publicar una aplicación web tenemos dos opciones:
– Contratar el host y el dominio con el mismo proveedor
– Contratar el host con un proveedor y el dominio con otro distinto

En el primer caso no hay que hacer nada ya que el proveedor nos va a dar todo configurado. En cambio en el segundo caso debemos cambiar las DNS del dominio para que apunten a las del host.

DNS
“El sistema de nombres de dominio (DNS, por sus siglas en inglés, Domain Name System) es un sistema de nomenclatura jerárquico descentralizado para dispositivos conectados a redes IP como Internet o una red privada. Este sistema asocia información variada con nombre de dominio asignado a cada uno de los participantes. Su función más importante es “traducir” nombres inteligibles para las personas en identificadores binarios asociados con los equipos conectados a la red, esto con el propósito de poder localizar y direccionar estos equipos mundialmente.” Wikipedia DNS


Resumen pasos configuración DNS

1 – Si no sabes cuáles son (te las suelen dar cuando contratas el host) debes pedir al proveedor del host sus DNS.

2 – Una vez dispongas de ellas ya puedes ir al panel de control de tu proveedor de dominio. En él tienes que buscar la zona donde se te permite configurar las DNS asociadas a cada dominio que le hayas contratado.

3 – Finalmente, introduces las DNS del host y das a guardar.

4 – Ahora ya sólo te queda esperar. Ya que al realizar el cambio te suelen indicar que tienes que esperar entre 24 y 48 horas para que se propaguen los DNS y se haga efectivo el cambio (normalmente en menos de 24 horas ya lo tienes activado).

28-diciembre-2016
admin

Integrar Facebook en Unity para apps Android

Paso 1:
Registrarse en https://developers.facebook.com/ para lo que es necesario tener una cuenta de facebook.

Paso 2:
Crear una aplicación en la web anterior en Apps > Add new app. De esta forma obtendremos un App ID.

Paso 3:
Descargar e importar al proyecto de unity el SDK de facebook. Aquí. En mi caso para un windows 64bits instalé openssl-0.9.8k_X64.
Tras importarlo, en la plataforma unity nos aparecera una nueva opcion en el menu llamada Facebook.

Paso 4:
En ese menu nuevo vamos a la opción Edit Settings y rellenamos el App ID que habiamos obtenido en el paso 2.
Así ya tendriamos la configuración básica para poder usar facebook en unity.
Para probarlo podemos añadir un botón en nuestro proyecto que haga una llamada al login de facebook (FB.login(….)). Al pulsar en Login aparecerá una ventana pidiéndonos un User Access Token. Podemos obtenerlo pulsando en esa misma venta en Find Access Token, que nos llevará al Access Token Tool de Facebook, donde podremos generarlo y copiarlo a Unity.


A partir de aquí para Android
Paso 5:
Si en el apartado Android Build Facebook Settings vemos que sale la alerta “OpenSSL not found. Make sure that OpenSSL is installed, and that it is in your path“ es porque debemos instalar OpenSSL en nuestro equipo.
Podemos descargarlo de aquí.
Para instalarlo basta con descomprimirlo en una carpeta de nuestro equipo y modificar la variable de entorno Path, añadiéndole la ruta a la carpeta bin de OpenSSL. También podemos añadir una nueva variable de entorno llamada OpenSSL.

Paso 6:
Si la alerta que sale es “Keytool not found. Make sure that Java is installed, and that Java tools are in your path“ debes instalar la JDK o JRE de java añadiendo la ruta a la variable de entorno del sistema como antes.

Paso 7:
Debajo de esas alertas podemos ver debajo el Package Name, el Class Name y la Debug android key hash.
Estos datos deben introducirse en el apartado Settings de la app de Facebook creada al principio. Tendremos que añadir una nueva plataforma android pulsando en Add Platform e introducir los 3 valores y guardar. Haciendo esto ya podremos probar a compilar y desplegar la aplicación en el dispositivo android.

Paso 8:
En el dispositivo android no se nos pedirá un User Token al hacer login pero puede que se produzca el siguiente error: “Invalid key hash. The key hash ***** does not match any stored key hashes…“ Y es que la key hash que proporciona el SDK de Facebook en sus settings es la de debug, mientras que al desplegar la app en el dispositivo se usa otra, que es la que muestra el mensaje de error. Tendremos que añadir esta key hash en la página de Settings de la app de Facebook, a continuación de la que introdujimos previamente.

15-diciembre-2016
admin

Kill Wasp

Se trata de un juego realizado mediante la plataforma Unity y que ha sido exportado a WebGL y a Android. Se integra con facebook para poder publicar tus resultados en tu muro.

Kill Wasp

Kill Wasp

El juego consiste en hacer que tu colmenar aguante el mayor tiempo posible. Para ello tendrás que enfrentarte a dos poderosos enemigos:
– Por un lado a las avistas asiáticas cuyo principal alimento serán tus abejas. La unica solución de mantenerlas a raya es mediante el trampeo.
– Por otro lado tendrás que enfrentarte a los osos, que su aspecto no te engañe. No dudarán matarte y comerse la miel de las abejas.

Versión Web
Versión Android

11-diciembre-2016
admin

English Couple

Se trata de un juego realizado mediante la plataforma Unity y que ha sido exportado a Web Player y a Android.

English Couple

English Couple

El juego consiste en ir buscando unos libros por el escenario. Cada libro te permite jugar a un juego de realizar parejas sobre una temática aleatoria. Se trata de ir asociando a cada imagen su significado en inglés.
Hay muchas fichas para cada temática para que tengas más palabras que practicar.

Versión Web
Versión Android

1-diciembre-2016
admin

Handlebars como sistema de templates en jQuery

HandlebarsJS es un sistema de plantillas Javascript y una herramienta esencial. Está basado en la sintaxis de “Mustache Templates“, a las que han agregado algunas funcionalidades extra.

Documentación Oficial

Ejemplo de uso para intentar explicar como funciona:

1 – Añadimos dentro de nuestra página html el siguiente template y le asignamos un id.

< script type="text/x-handlebars-template" id="templateEx">
{{# each elementos}}
Name: {{name}} 
{{/each}} < /script>

En esta plantilla se recorre la lista elementos y se escribe el valor de su propiedad name

2 – En nuestro fichero js cuando queramos cargar la pagina tenemos que decirle que compile la plantilla para ello primero tenemos que obtener el código del a plantilla.

var stemplate = $("#templateEx").html();
//Y una vez obtenido poedemos compilar la plantilla:
var tmpl = Handlebars.compile(stemplate);

3 – Ahora solo faltaría asignar los datos al contexto de la plantilla:

var ctx = {};
ctx.elementos = [{"name":"elemento1"},{"name":"elemento2"}];
html = tmpl(ctx);

4 – Ahora añadimos el contenido de la plantilla al html.

$("#content").append(html);
$("#content").show(); 

En este ejemplo se ha usado jQuery para tratar con el DOM pero puede usarse cualquier otra librería.


24-noviembre-2016
admin

Aplicación que integra Spring-Boot + AngularJS + Thymeleaf

En mi repositorio de GitHub he dejado una apicación simple que integra Spring-Boot con AngularJS utilizando lo siguiente:

Para la configuración de Spring se ha utilizado Spring Boot junto con los siguientes módulos
. . . . 1- Spring Data JPA -> como capa de persistencia.
. . . . 2- Spring Data REST con Spring HATEOAS -> para la capa de servicios rest con los que interactuará AngularJS.
. . . . 3- Spring Security -> para la Autenticación y Autorización de la aplicación.
. . . . 4- Spring MVC con Thymeleaf -> se utiliza para gestionar principalmente los listados de consulta, así como todas las vistas que no tienen formularios.
. . . . 5- AngularJS -> se utiliza para las vistas de los formularios de detalles.
. . . . 6- Bootstrap + Angular-ui + Font Awesome + Angular-Show-Errors -> para el diseño y maquetación del front end.
. . . . 7- JUnit -> pruebas unitarias.

Se utilizan Base de datos y servidor embebidos a modo de ejemplo: H2 y Tomcat.

Para la creación de informes se utiliza JasperReports. Se ha configurado el pom para que a partir de los ficheros /src/main/resources/static/reports/*.jrxml y genere los /src/main/webapp/jasper/*.jasper. Para ello basta con ejecutar mvn generate-resources.

La gestión de dependencias se realiza con: Maven y bower.


Instalación
=========

1- Instalar maven (utilizada la 3.0.5)
2- Instalar el wraper de maven para spring-boot:

mvn -N io.takari:maven:wrapper

3- Se puede ejecutar de varias formas:

//Con maven:	
mvn spring-boot:run. 

//o bien

//Construyendo el jar:      
mvn clean package 
//Y haciéndolo correr con:  
java -jar target/springangularjs-0.0.1-SNAPSHOT.jar

4- Si todo va bien la aplicación correrá en: http://localhost:8080/
5- Copiar proyecto e importarlo al eclipse como proyecto de maven.
6- Recordar que para modificar las librerías de js es necesario bower. Para ello:
. . . . a- se necesita tener instalado node.js (https://nodejs.org/)
. . . . b- se necesita también tener instalado git (https://git-scm.com/download/win)
. . . . c- instalamos bower con:

                  npm install -g bower

. . . . d- finalmente ejecutando “bower install” en el proyecto nos colocara en el directorio /src/main/resources/static/bower_components las versiones de las librerías indicadas en el bower.json.


Todo el código esta subido al GitHub
Esquema de la Arquitectura
Digrama de clases

16-noviembre-2016
admin

Despliegue aplicación Spring-Boot en Openshift

En este tutorial vamos a explicar como se debe desplegar una aplicación Spring-Boot en Openshift. La aplicación correrá en un tomcat y utilizará como Base de Datos H2.

Creamos la aplicación en OpenShift. Para ello:
Paso 1: Nos registramos en https://www.openshift.com/
Paso 2: Creamos una aplicación que contenga un Tomcat 7 (JBoss EWS 2.0).



Instalamos y configuramos las Openshift Client Tools
Paso 1: Lo primero que debemos hacer es instalar Ruby, la versión que recomienda Openshift es la 1.9.3.
http://dl.bintray.com/oneclick/rubyinstaller/rubyinstaller-1.9.3-p551.exe
(Cuando estamos instalando Ruby debemos marcar la opcion que dice Add Ruby executables to your PATH, para que se añada al Path del sistema.)
Para saber si tenemos Ruby añadido correctamente al Path, abrimos un terminal y ejecutamos:

ruby –v.

Paso 2: Instalamos la última versión de Git.
https://github.com/msysgit/msysgit/releases/download/Git-1.9.5-preview20150319/Git-1.9.5-preview20150319.exe
para comprobar si git también está bien instalado poedemos ejecutar:

git --version.

Paso 3: Instalamos las Client Tools (Openshift rhc).

//Para instalar las rhc sólo debemos escribir en nuestro terminal:		
gem install rhc
//A continuación, configuramos con:	 
rhc setup

Nos pedirá logarnos con nuestras credenciales. Al introducirlas, si son correctas el sistema de configuración nos indicará que va a crear un Token para que podamos acceder a OpenShift sin necesidad de colocar nuestras credenciales de acceso, este Token se guardará en nuestra carpeta de usuario en una carpeta llamada .openshift.



Generando War
Usando maven se puede hacer directamente por la consola con:

mvn clean package


Desplegando WAR en OpenShift
Paso 1: Primero debemos crear un SSH public key para poder acceder al servidor por ssh. Se crean desde la propia consola web de Openshift. O usamos la que nos ha creado por defecto openshift en nuestro directorio de usuario cuando se instaló rhc.
Si queremos crear una nueva podemos crearla con el Putty Key Generator. Luego se debe añadir en el openshift a través de la consola web.
Paso 2: Descargamos el repositorio git.
Paso 3: Borrar la carpeta src y el pom.xml
Paso 4: Colocamos nuestro WAR en la carpeta webapp
Paso 5: Editar el archivo server.xml que está en .openshift/config/server.xml. Buscamos el siguiente conector y en el redirectPort pone 8443, le quitamos el 8 y guardamos.
Paso 6: Al archivo .openshift/config/context.xml le añadimos la siguiente Valve:

< Valve className="org.apache.catalina.valves.RemoteIpValve" protocolHeader="x-forwardedproto"/>

Paso 7: Hacemos commit y push
Paso 8: Reiniciamos el servidor.



Base de datos H2
Se debe colocar el fichero de bd en app-root/data y darle permisos de lectura y escritura.

8-noviembre-2016
admin

Comandos básicos de GIT

Comandos Básicos de Git

a) Buscando Ayuda:
1. git help comando ó git comando –help -> Muestra la ayuda para ese comando

b) Creación de un repositorio:
2. git init -> Crea un repositorio en el directorio actual
3. git clone url -> Clona un repositorio remoto dentro de un directorio

c) Operaciones sobre Archivos:
4. git add path -> Adiciona un archivo o un directorio de manera recursiva
5. git rm ruta -> Remueve un archivo o directorio del árbol de trabajo
-f : Fuerza la eliminación de un archivo del repositorio
6. git mv origen destino -> Mueve el archivo o directorio a una nueva ruta
-f : Sobre-escribe los archivos existentes en la ruta destino
7. git checkout [rev] archivo -> Recupera un archivo desde la rama o revisión actual
-f : Sobre-escribe los cambios locales no guardados

d) Trabajando sobre el código:
8. git status -> Imprime un reporte del estado actual del árbol de trabajo local
9. git diff [ruta] -> Muestra la diferencia entre los cambios en el árbol de trabajo local
10. git diff HEAD ruta -> Muestra las diferencias entre los cambios registrados y los no registrados
11. git add path -> Selecciona el archivo para que sea incluido en el próximo commit
12. git reset HEAD ruta -> Marca el archivo para que no sea incluido en el próximo commit
13. git commit -> Realiza el commit de los archivos que han sido registrados (con git-add)
-a : Automáticamente registra todos los archivos modificados
14. git reset –soft HEAD^ -> Deshace commit & conserva los cambios en el árbol de trabajo local
15. git reset –hard HEAD^ -> Restablece el árbol de trabajo local a la versión del ultimo commit
16. git clean -> Elimina archivos desconocidos del árbol de trabajo local

e) Examinando el histórico:
17. git log [ruta] -> Muestra el log del commit, opcionalmente de la ruta especifica
18. git log [desde [..hasta]] -> Muestra el log del commit para un rango de revisiones dado
–stat : Lista el reporte de diferencias de cada revisión
-S’pattern’ : Busca el historial de cambios que concuerden con el patrón de búsqueda
19. git blame [archivo] -> Muestra el archivo relacionado con las modificaciones realizadas

f) Repositorios remotos:
20. git fetch [remote] -> Trae los cambios desde un repositorio remoto
21. git pull [remote] -> Descarga y guarda los cambios realizados desde un repositorio remoto
22. git push [remote] -> Guarda los cambios en un repositorio remoto
23. git remote -> Lista los repositorios remotos
24. git remote add remote url -> Añade un repositorio remoto a la lista de repositorios registrados

g) Ramas:
25. git checkout rama -> Cambia el árbol de trabajo local a la rama indicada
-b rama : Crea la rama antes de cambiar el árbol de trabajo local a dicha rama
26. git branch -> Lista las ramas locales
27. git branch -f rama rev -> Sobre-escribe la rama existente y comienza desde la revisión
28. git merge rama -> Guarda los cambios desde la rama

h) Exportando e importando:
29. git apply – < archivo -> Aplica el parche desde consola (stdin)
30. git format-patch desde [..hasta] -> Formatea un parche con un mensaje de log y un reporte de diferencias (diffstat)
31. git archive rev > archivo -> Exporta resumen de la revisión (snapshot) a un archivo
–prefix=dir/ : Anida todos los archivos del snapshot en el directorio
–format=[tar|zip] : Especifica el formato de archivo a utilizar: tar or zip

i) Etiquetas:
32. git tag name [revision] -> Crea una etiqueta para la revisión referida
-s : Firma la etiqueta con su llave privada usando GPG
-l [patrón] : Imprime etiquetas y opcionalmente los registros que concuerden con el patrón de busqueda

j) Banderas de Estado de los Archivos:
M (modified) : El archivo ha sido modificado
C (copy-edit) : El archivo ha sido copiado y modificado
R (rename-edit) : El archivo ha sido renombrado y modificado
A (added) : El archivo ha sido añadido
D (deleted) : El archivo ha sido eliminado
U (unmerged) : El archivo presenta conflictos después de ser guardado en el servidor (merge)

Páginas:«1234567...24»

Categorias

Linkedin