lunes, 11 de mayo de 2015

Json Java

En esta entrada voy a describir como crear un json en la parte servidor y devolvérselo al cliente.

Noves Investigacions

Recientemente he dado una charla sobre un tema que estoy investigando para el trabajo final del Máster de Software Libre.

Concretamente el titulo de la conferéncia ha sido :

Detecció de plagi en la creació de circuits digitals en entorn educatiu, desenvolupament d'una eina de Software Lliure

Importar datos con Sqoop desde una Base de Datos Relacional

En primer lugar deberemos bajar el driver necesario para conectarnos a la base de datos 



MySQL JDBC Driver



Oracle JDBC Driver



Microsoft SQL Server JDBC Driver


curl -L 'http://download.microsoft.com/download/0/2/A/02AAE597-3865-456C-AE7F-613F99F850A8/sqljdbc_4.0.2206.100_enu.tar.gz' | tar xz

PostgreSQL JDBC Driver


curl -L 'http://jdbc.postgresql.org/download/postgresql-9.2-1002.jdbc4.jar' -o postgresql-9.2-1002.jdbc4.jar


Luego copiaremos el jar que se encuentra en sqljdbc_4.0/enu/sqljdbc4.jar en /var/lib/sqoop ( puede requerir un reinicio)

Con esto ya podremos realizar la conexión

Para comprobar si funciona listaremos las bases de datos ( en el caso de sqlserver, en el resto de la misma manera cambiando la información del conector ):

sqoop list-databases --connect jdbc:sqlserver://: --username   --password 


Para realizar la importación a Hdfs :

sqoop import --connect "jdbc:sqlserver://:;database=;username=;password=" --table  


Para realizar la importación a Hive directamente


sqoop import --connect "jdbc:sqlserver://;database=;username=;password=" --table  --hive-import

Si queremos realizar una importación de todas las tablas que contiene una base de datos, podemos hacer :

sqoop import-all-tables --connect "jdbc:sqlserver://ip:puerto;databalse=nombreDB;username=user;password=pass"

Si alguna de las tablas no tiene primaryKey tenemos dos opciones, definir por que campo diferenciaremos con -split-by o marcar que en vez de ejecutar los 4 maps que arranca por defecto sqoop, lo hagamos con un solo map con la instrucción -m 1, de esta manera no será necesario realizar los splits de la entrada del map y todo se tratara en el mismo map task.

También podemos excluir alguna de las tablas que queramos al hacer toda la importación mediante el argumento --exlclude-table nombretaba1,nombretabla2...

De esta manera la instrucción para importar todas las tablas de una bd a hive menos una, con alguna que no contenga primarykey, quedaría así :

sqoop import-all-tables --connect "jdbc:sqlserver://ip:puerto;databalse=nombreDB;username=user;password=pass" -m 1 --exclude-table nombretabla --hive-import


Los hdfs importados se guardarán en hive/warehouse y veremos que solo contienen un part-m-00000 correspondiente a cada una de las tablas que hemos importado

Para crear una tabla en hive igual que la que tenemos en la base de datos haremos :

sqoop create-hive-table --connect "jdbc:sqlserver://ip:puerto;databalse=nombreDB;username=user;password=pass" --table NombreDeLaTabla

La instrucción creará la estructura de la misma forma que en nuestra BD relacional pero no importara los datos que esta contenga.

Para cargar los datos des de un hdfs (que puede haber sido cargado previamente con sqoop en hdfs) a una tabla de hive haremos (previamente estaremos en el hive shell ) :

hive>LOAD DATA INPATH "nombredelHdfs" INTO TABLE nombreDeLaTabla

Si los datos a cargar están de manera local en nuestro filesystem, haremos :

hive>LOAD DATA LOCAL INPATH "nombredelarchivo" INTO TABLE nombreDeLaTabla

Veamos ahora un contenido un poco mas avanzado

Una alternativa si no queremos importar toda una tabla y queremos hacerlo a medida mediante una query propia pasa por introducir el parametro -query en la instrucción, en este caso también deberíamos introducir --split-by, veamos un ejemplo : 



sqoop import --connect "jdbc:sqlserver://192.168.7.128:1433;database=Selenium;username=sa;password=P@ssw0rd" --query 'SELECT Resultado.idResultado, Paso.idPaso, Resultado.Fecha, Resultado.TiempoPaso,Test.idTest, Resultado.idGrupTest, Browser.Nombre,Calendario.EveryXMinutes, Resultado.idError, Resultado.errorMsg from Resultado INNER JOIN Paso ON Resultado.idPaso = Paso.idPaso INNER JOIN Test ON Resultado.idTest = Test.idTest INNER JOIN Browser ON Test.Browser = Browser.id INNER JOIN TestCalendario ON Resultado.idTest = TestCalendario.idTest INNER JOIN Calendario ON TestCalendario.idCalendario = Calendario.idCalendario WHERE $CONDITIONS' --split-by Resultado.idTest --incremental append --check-column idResultado --target-dir /dfs/sqlData/Resultado

jueves, 7 de mayo de 2015

Importar csv a Hive.

Vamos a seguir el proceso para importar un fichero csv a hive. Como requisito necesitaremos tener instalado Cloudera 5 (ver post anterior)

martes, 5 de mayo de 2015

Instalación Cloudera 5 en Ubuntu 14.04 min

Si has llegado hasta aquí sabrás que es Hadoop y por lo tanto estarás familiarizado con el concepto de Big Data, en este post voy a seguir paso a paso el proceso de instalación de la plataforma Cloudera sobre una máquina virtual en VMWare con so Ubuntu 14.04 min de una manera lo mas sencilla posible. No pretende ser la forma mas canónica de hacerlo, pero pretende ser una manera simple para llegar al final del proceso con éxito.

lunes, 27 de abril de 2015

Inserts con clave primaria autoincremental en Hibernate y SQL Server

Algunas veces me he encontrado que teniendo que realizar un insert autoincremental en una Base de Datos SQL Server, el típico session.save(Object) ha fallado y no sabemos porque. Para eso utilizo el siguiente método como alternativa para realizarlos, 

jueves, 26 de marzo de 2015

Swipe para refrescar una Lista en Android

En la siguiente entrada voy a describir el proceso para crear un evento en el cual, mediante un deslizamiento del dedo hacia abajo se va a actualizar una lista.

jueves, 12 de marzo de 2015

Pequeño proyecto con Arduino

En esta entrada voy a presentar un pequeño proyecto hecho con Arduino.

Básicamente se trata de un desarrollo muy sencillo formado por un módulo compuesto por dos motores y un detector de distancia. 

viernes, 26 de septiembre de 2014

Manejo de fechas Java

Un poco sobre el manejo de fechas en Java de una manera muy práctica :

martes, 23 de septiembre de 2014

Algunos comandos interesantes

Esta entrada deriva de una práctica del Máster de Software Libre de la UOC de la asignatura Administración de sistemas Linux. 

En ella voy a escribir algunos comandos de linux que aparecían en esta práctica, no pretenden ser la manera mas sencilla de hacer las cosas, simplemente los menciono porque algunos de ellos me parecen interesantes.

martes, 26 de agosto de 2014

Spring. Primeros Pasos

Spring Framework
Vamos a ver la creación de un sencillo "hola mundo" con el framework Spring, pero antes vamos a ver, un poco por encima de que trata esto de Spring.

Spring es un framework  open source que tiene como objetivo facilitar el desarrollo de aplicaciones Java, está formado por diversos módulos que se pueden agregar a las aplicaciones. El único obligatorio es Spring Core (para la inyección de dependencias), a partir de aquí se pueden agregar mas módulos según las necesidades del programador, algunos ejemplos típicos son MVC (modelo vista controlador), AOP (trabajo con aspectos), DAO (data acces object)...

Sus características, a grandes rasgos, son:
  • Simplicidad y acoplamiento débil basándose en el concepto de inyección de dependencias.
  • Es un contenedor que gestiona el ciclo de vida de los objetos y su relación entre ellos facilitando que nos centremos en la lógica de la aplicación
  • Es ligero y poco intrusivo
  • Soporta la programación orientada a aspectos. Mas información

Inyección de dependencias

También conocido como inversión del control, es el mecanismo en que se basa Spring y lo que nos proporciona un acoplamiento débil entre sus clases. 
Básicamente se trata de que un objeto conozca sus dependencias a partir de una interficie y no por su implementación, lo que desemboca en que la implementación puede variar sin que el objeto dependiente se de cuenta, algo que será de extrema utilidad a la hora de mantener aplicaciones muy grandes.



Ejemplo

Vamos a ver un ejemplo muy básico, en primer lugar necesitaremos bajarnos las librerías para agregarlas a nuestro proyecto. Aquí podemos encontrarnos con el primer problema.

Inexplicablemente, des de la pagina de Spring no existe ningún link de descarga, tenemos que dirigirnos directamente al repositorio para descargarlo:
http://maven.springframework.org/release/org/springframework/spring/

Una vez agregados a nuestro classpath del proyecto, también deberemos agregar los jars de Apache Commons. Los podremos descargar de este enlace.

Para este ejemplo no hará falta descargarlos todos, a continuación listo los que yo tengo añadidos a mi classpath para este ejemplo, con el link a su página de descarga:

Primero vamos a crear el proyecto, lo haremos funcionar, y al final explicaré que es lo que está pasando.

La estructura final con el proyecto de ejemplo terminado tendrá este aspecto :


Crearemos un archivo que llamaremos spring.xml que tendrá el siguiente contenido :

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">

<bean id="saludoImpl" class="com.repocodigo.SaludoImpl">
      <property name="val" value="Hola repocódigo!!!!!"/>
</bean>

<bean id="persona" class="com.repocodigo.Persona" >
      <property name="saludo" ref="saludoImpl"/>
</bean>

</beans>


Creamos una clase encargada de cargar nuestro archivo spring.xml, la llamaremos ContextFactory.java

package com.repocodigo;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;


public class ContextFactory {

private static ApplicationContext respuesta;
    
    
    public static ApplicationContext getInstance(){
        if (respuesta != null) {
            return respuesta;
        }
        respuesta = new FileSystemXmlApplicationContext("C:/wrkspcPruebas/SPRING_1/spring.xml"); //Ruta de nuestro xml
        return respuesta;
    }
}
 

Listo, ahora creamos una clase llamada Persona, esta clase tendrá un atributo que será una interfície llamada Saludo, este es el código para Persona.java

package com.repocodigo;

import com.repocodigo.interfaces.Saludo;

public class Persona {

 private Saludo saludo;
 
 public Saludo getSaludo(){
  return saludo;
 }
 
 public void setSaludo(Saludo saludo){
  this.saludo = saludo;
 }
}

Ahora vamos con la interficie Saludo.java

package com.repocodigo.interfaces;

public interface Saludo {
 public String saluda();
}

A continuación realizaremos una implementación de la clase saludo llamada SaludoImpl.java

package com.repocodigo;

import com.repocodigo.interfaces.Saludo;

public class SaludoImpl implements Saludo{
 
 private String val;
 
 public String saluda() {
  return val;
 }
 
 public String getVal(){
  return val;
 }
 
 public void setVal(String val){
  this.val = val;
 }

}

Una vez ya lo tenemos todo, yo creo una clase llamada Principal.java que lo único que contendrá será un metodo main que tendrá el aspecto siguiente :

package com.repocodigo;

import org.springframework.context.ApplicationContext;

public class Principal {

 public static void main(String[] args) {
  
  ApplicationContext factory = ContextFactory.getInstance();
  
  Persona persona = (Persona) factory.getBean("persona");
  System.out.println(persona.getSaludo().saluda());
 }
}

Ejecutamos y vemos el resultado siguiente :


El funcionamiento lo marca el archivo de configuración spring.xml.
Todo lo que se encuentre dentro de la etiqueta es configuración de Spring.
El tag indica a Spring que ese objeto en cuestión va a ser utilizado dentro del contenedor de Spring.
Dentro de este tag hemos definido dos atributos en nuestro ejemplo:

id = que es obligatorio, se trata de un identificador único para cada bean
class = indica la clase a la cual pertenece el bean

Cada bean puede tener subelementos que representan los atributos de la clase.
Los atributos para properties son :

name = nombre del atributo que tenga la clase
value = valor que le damos a la variable
ref = indicamos que el atributo es un objeto, de manera que configuraremos este objeto de manera independiente, siento el valor de ref el id de este objeto

Como se traduce esto a la práctica?
Tradicionalmente cada objeto es el responsable de obtener sus propias dependencias, como consecuencia nos encontraremos con un código muy acoplado porque cada objeto debe conocer como se construyen otros.
Al aplicar la inyección de dependencias un objeto conoce sus dependencias mediante su interfaz, esto se traduce en un acoplamiento débil ya que podemos variar la implementación ese objeto sin que el objeto dependiente se entere.

lunes, 4 de agosto de 2014

Actualización del Kernel de Linux

Vamos a actualizar el núcleo de Linux a una versión mas reciente, el proceso es realmente sencillo pero muchas veces puede provocarnos algun que otro dolor de cabeza.

El ejemplo se realiza en una distro Ubuntu pero el proceso es válido para cualquier distribución existente en el mercado con algunas pequeñas modificaciones.