21/7/15

DML y DDL

Es muy común hablar de sentencias DML y DDL, por lo que vamos a ver una breve explicación para aquellas personas que no han trabajado con estas tecnologías.
Para empezar tenemos que saber que las sentencias SQL se dividen en dos categorías DDL y DML, Lenguaje de Definición de Datos y Lenguaje de Manipulación de Datos.

-          DDL - Lenguaje de definición de datos: Las sentencias DDL se utilizan para crear y modificar la estructura de las tablas así como otros objetos de la base de datos.
o   CREATE - para crear objetos en la base de datos.
o   ALTER - modifica la estructura de la base de datos.
o   DROP - borra objetos de la base de datos.
o   TRUNCATE - elimina todos los registros de la tabla, incluyendo todos los espacios asignados a los registros.
o   Lenguaje de manipulación de datos (DML)
-          DDL - Lenguaje de manipulación de datos: son utilizadas para gestionar datos dentro de los esquemas.
o   SELECT - para obtener datos de una base de datos.
o   INSERT - para insertar datos a una tabla.
o   UPDATE - para modificar datos existentes dentro de una tabla.

o   DELETE - elimina todos los registros de la tabla; no borra los espacios asignados a los registros.

Índices

Los  índices son estructuras de datos opcionales asociadas a las tablas que mejoran la velocidad de las operaciones, permitiendo rápido acceso a los datos de una tabla.

Permiten incrementar de forma sombrosa la velocidad de ejecución de sentencias. Si sobre una columna se ha definido un índice, Oracle accede a este para obtener la dirección (ROWID) de los datos evitando el gran número de operaciones E/S a disco que requiere una búsqueda secuencial en una tabla.

Es necesario conocer los índices de una tabla para poder programar haciendo un uso más efectivo.

La creación de un índice mejora considerablemente la operación de recuperación de datos que puedan beneficiarse de la existencia del mismo. Aunque las operaciones de inserción y modificación se verán penalizadas por tener que actualizar también el índice. Por lo que es importante realizar un estudio para valorar los posibles beneficios frente a los posibles contra de crear un índice.

  • Los índices pueden crearse sobre uno o varios campos (índices concatenados),  estos índices pueden ser únicos o no. Un índice único hace que no se produzcan duplicidades de campo (o varios campos). 
  • Sobre una tabla pueden crearse varios índices.
  • Para elegir índices hay que tener en cuenta que:
    • No exista duplicidad de valores en el campo.
    • Que el campo tome un amplio rango de valores.
    • Evitar campos que puedan ser nulos.
  • Si tenemos un índice concatenado, hay que tener en cuenta el orden de los campos, ya que el primer campo será el más usado y el más efectivo. Cuando el programador realice joins en sentencias, debe aprovechar eficientemente los índices.

14/5/14

Selenium (JAVA)


Vamos a repasar un poco por encima algunas cosas que podemos realizar gracias a Selenium y una breve introducción para saber que es Selenium.

Selenium.

Es un conjunto de utilidades que facilita la labor de obtener juegos de pruebas para aplicaciones web. Permitiendo grabar, editar y depurar casos de prueba, que podrán ser ejecutados de forma automática e iterativa posteriormente.

Permite registrar acciones y editarlas manualmente, e incluso crearlas desde cero.

Esta basado en el uso de diferentes API's en diferentes lenguajes (PHP, Ruby, JAVA, Javascript, etc).

Entre sus principales características podemos nombrar:
  • Facilidad de registro y ejecución de los test. 
  • Referencia a objetos DOM en base al ID, nombre o a través de XPath. 
  • Auto-completado para todos los comandos. 
  • Las acciones pueden ser ejecutadas paso a paso. 
  • Herramientas de depuración y puntos de ruptura (breakpoints). 
  • Los test pueden ser almacenados en diferentes formatos. 

Introducción a XPath.

XPath es una especificación de la World Wide Web Consortium W3C, que facilita enormemente la navegación y la lectura a través de un documento XML.

Cuando comenzó la implantación de XML en los desarrollos, se inventaron infinidad de libreraias para parsear y acceder a los documentos XML, por lo que existen muchas librerias poco eficientes, cada una diferente en cuanto a filosofía y a tratamiento.

XPath tiene una filosofía muy simple, ya que se basa de utilizar expresiones al estilo de un path, como el de un directorio de disco, a través de los nodos del archivo XML. A ésto se le une una multitud de posibilidades, como búsqueda de ciertos elementos a partir de un valor o una máscara.

En la siguiente URL podemos ver algo de la sintaxis XPATH http://www.w3schools.com/XPath/xpath_syntax.asp

Selenium es compatible con la mayoría de navegadores:
  • Explorer 
  • Mozilla Firefox 
  • Google Chrome 
  • Safari 

Próximamente iremos añadiendo información sobre este tema.

Un saludo, gracias.

Ejemplo fechas (JAVA)

Estos son algunos ejemplos que he encontrado en la red, la verdad que esta bastante bien para ver las diferentes clases que se pueden usar para trabajar con fechas.

PasosObtener la fecha y hora actual.
  1. Crear un Date:
    Date d= new date();
  2. Obtener su valor:
    String s = d.toString();
Obtener un objeto que permita ejecutar calculos en la fecha y hora de un Locale.
  1. Crear un Calendar:
    Calendar c = Calendar.getInstance();
  2. Usar c.add(...) y c.roll(...) para manipular la fecha y la hora.
Obtener un objeto que permita ejecutar calculos de la fecha y la hora en diferentes Locale.
  1. Crear un Locale:
    Locale loc = new Locale(language);
    o
    Locale loc = new Locale(languahe, country);
  2. Crear un Calendar para ese Locale:
    Calendar c = Calendar.getInstance(loc);
  3. Usar c.add(...) y c.roll(...) para manipular la fecha y la hora.
Obtener un objeto que te permita ejecutar calculos de fecha y hora y que en su salida se muestre la fecha y la hora en varios Locale distintos.
  1. Crear un Calendar:
    Calendar c = Calendar.getInstance();
  2. Crear un Locale para cada localizacion:
    Local loc = new Locale(...);
  3. Convertir tu Calendar a Date:
    Date d = c.getTime();
  4. Crear un DateFormat para cada Locale:
    DateFormat df = DateFormat.getDateInstance(style,loc);
  5. Usar el metodo format() para crear fechas formateadas:
    String s = df.format(d);
Conseguir un objeto que te permita formatear numeros o monedas a traves de Locales distintos.
  1. Crear un Locale para cada localizacion:
    Locale loc = new Locale(...);
  2. Crear un NumberFormat:
    NumberFormat nf = NumberFormat.getInstance(loc);
    o
    NumberFormat nf = NumberFormat.getCurrencyInstance(loc);
  3. Usar el metodo format() para crear una salida formateada:
    String s = nf.format(someNumber);
Un saludo.

Fechas (JAVA)

Buena a todos, en esta entrado voy a intentar expliar como funcionan las fechas en java, esta entrada la he creado a raiz de necesitar en un robot (o crawler) una clase que comparase las fechas recuperadas de entradas de blog con la fecha actual.

Al ahcer esto me encontre con varios puntos interesantes de ver.

Lo primero que hice fue crear un método al que le pasaba un webElement de donde recuperaba la fecha y un String indicando como realizar la busqueda. Retorna true si la fecha del blog que tiene el webElement es anterior a la actual:

public Boolean isInRange(WebElement we,String rangeLocator){
      WebElement rangeElement=  we.findElement(By.className(rangeLocator) );
      Date now = new Date();
      Date fecha = new Date(rangeElement.getText());
      return (now.compareTo(fecha) > 0);


}

El priemer problema que me encontre es que cada blog tenia la fecha informada de una forma distinta, este método funcionaria para el blog que presentaba la fecha de forma "dd/mm/yyyy", pero al realizar algunas pruebas encontre otro blog que presentaba la fecha "dd MMM yyyy" donde MMM es ABR o MAY o JUN ..... por lo que me fallaba.

Para resolver este probleme capture la excepcion y realice el siguiente tratamiento de fechas:

public Boolean isInRange(WebElement we,String rangeLocator){
      WebElement rangeElement=  we.findElement(By.className(rangeLocator) );
      Date now = new Date();
      Date fecha;
      try {
          fecha = new Date(rangeElement.getText());
      }catch (java.lang.IllegalArgumentException e1){
          DateFormat df = new SimpleDateFormat("dd-MMM-yyyy");
          DateFormat df2 = new SimpleDateFormat("dd-MM-yyyy");
          String fecha1 = we.findElement(By.className(rangeLocator)).getText();
          String fecha2= fecha1.replaceAll("\n","-");
          Date date = null;
          try {
              fecha = df.parse(fecha2);
          } catch (ParseException e2) {
              e2.printStackTrace();
              fecha = null;
          }
      }
      return (now.compareTo(fecha) > 0);


}

Para comprender este método vamos a explicar el código.

Primero vamos a estudiar las clases Date, SimpleDateFormat, y ya que estamos DateFormat también.

Antes de nada comento que las lineas en la que extraigo la fecha del webElement, no voy a entrar en detalle de explicar que es esto, simplemente os comento que estas lineas:

WebElement rangeElement=  we.findElement(By.className(rangeLocator) );
String fecha1 = we.findElement(By.className(rangeLocator)).getText();

Donde rangeLocator es "date-header", aqui lo único que hace es recuperarnos las fechas en su formato original del código de la web, blog,... según estemos trabajando, estamos usando Selenium (XPATH). En futuro incluiremos en el blog alguna entrada sobre este tema, que es también bastante interesante.

La clase Date, del paquete java.util, encapsula un valor Long representando un momento específico en el tiempo. El constructor más útil es Date(), crea un objeto Date teniendo por valor el día, hora, etc del momento en el cual fue creado.  El método getTime() devuelve un valor Long de un objeto Date. 

En el código creamos now de tipo DATE para poder obtener la fecha actual.

La clase DateFormat se utiliza para poder manejar las feches con facilidad, ya que en todos sitios no se representan las fechas de la misma forma (mascara o idioma), utilizaremos DateFormat para hacerlo como mejor nos convenga. Si utilizamos una instancia de DateFormat sin parámetros, el valor por defecto que se utiliza es el que tiene la máquina donde se ejecuta el programa.

La clase SimpleDateFormat, nos permite construir nuestros propios formatos de fechas, ya que la clase DateFormat tiene limitadas sus instancias. Para construir las fechas con SimlpeDateFormat,  tendremos como referencia un String donde se especificará un patrón para formatear  y/o parsear las fechas.

En el código podemos ver como instanciamos dos veces a esta clase, para poder interpretar la fecha obtenida y para poder asiganar el formato nuevo de fecha donde se almacenará la obtenida.
DateFormat df = new SimpleDateFormat("dd-MMM-yyyy");
DateFormat df2 = new SimpleDateFormat("dd-MM-yyyy");

Proximamente iremos ampliando esta entrada con más información de estas clases.

Os he dejado otra entrada con ejemplos utilizando Calendar, Date, DateFormat.

Un saludo.

6/5/14

Popup selección de fecha. (Android)

Vamos a ver rapiadmente como crear en un activiy un popup para seleccionar una fecha. El popup queda así en el emulador de mi móvil:




Lo que tenemos que usar es la siguiente clase, se puede poner como interna dentro de un Activity o usarla desde fuera, como cada uno prefierá.

public static class DatePickerFragment extends DialogFragment
                           
implements DatePickerDialog.OnDateSetListener {

   
@Override
   
public Dialog onCreateDialog(Bundle savedInstanceState) {
       
// Use the current date as the default date in the picker
       
final Calendar c = Calendar.getInstance();
       
int year = c.get(Calendar.YEAR);
       
int month = c.get(Calendar.MONTH);
       
int day = c.get(Calendar.DAY_OF_MONTH);

       
// Create a new instance of DatePickerDialog and return it
       
return new DatePickerDialog(getActivity(), this, year, month, day);
   
}

   
public void onDateSet(DatePicker view, int year, int month, int day) {
       
// Do something with the date chosen by the user
   
}
}

Tengo que decir que esta clase me la paso un compañero de trabajo que también estaba aprendiendo Android, pero esta muy pero que muy bien para crear de forma rápida y sencilla un popup que permita seleccionar una fecha.

El evento onDateSet es el que recuperará la fecha seleccionada por el usuario. Hay que tener en cuenta que enero es el mes 0.

Para llamar al popup de seleccionar la fecha sólo tienes que hacer esto


DialogFragment newFragment = new DatePickerFragment();

newFragment.show(getFragmentManager(), "datePicker");
En estos momentos ya solo tendriamos que crear un botón o lo que queramos, para cuando se pulse, muestre el popup.

Yo en la APP que estaba haciendo, he creado dos botones con dos editText, para seleccionar la fecha desde y fecha hasta, y lo he implementado de la siguiente forma.

En el metodo onManejadorEventoFecha capturo el botón que se pulsa y llamo a la clase que hemos creado.

public void onManejadorEventoFecha(View v) {                                    
  DialogFragment newFragment = new DatePickerFragment();
  Bundle args = new Bundle();
  int vista = v.getBottom(); //.getId();
  args.putLong("vista",vista);
  newFragment.setArguments(args);
  newFragment.show(getFragmentManager(), "datePicker");

 }


Y en el método de OnDataSet de la clase que hemos creado, recuperamos las fechas seleccionadas en el evento y en función del id del botón pulsado las cargamos en un elemento de texto u otro.

public void onDateSet(DatePicker view, int year, int month, int day) {
  long vista = getArguments().getLong("vista");
  
  // Do something with the date chosen by the user
  DateFormat df =  DateFormat.getDateInstance();
  Date fecha = new Date(year,month,day);
  if (vista == 158){
      et_fechIni.setText(String.valueOf(df.format(fecha)));
  }else if (vista == 309){
      et_fechast.setText(String.valueOf(df.format(fecha)));
  }

}

Un saludo, gracias.


Crear un fichero y escribir en el. (JAVA)

Con esta entrada vamos a ver rapidamente como crear un fichero y como podemos escribir en el, para usarlo de Log, o para lo que necesitemos:

Primer paso deberemos crear un fichero, en este caso creamos un txt:.

        String url_log = "C:\misLogs\milog.txt";
        File fich_log = new File(url_log);


Ahora vamos a crear un método para que cada vez que queramos escribir en el fichero sea más rápido, simplemente lo llamemos.

 public static void EcribirFichero(File fichero,String texto){
        try {
            //Si no Existe el fichero lo crea
            if(!fichero.exists()){
                fichero.createNewFile();
            }
            /*Flujo de escritura sobre el fichero con codificacion utf-8.*/
            BufferedWriter mibuffer =new BufferedWriter(new OutputStreamWriter(new FileOutputStream(fichero,true), "utf-8"));
            /*Escribe la cadena en el fichero y añadimos un salto de linea*/
            mibuffer.write(texto) + "\r\n");
            //Cierra flujo
            mibuffer.close();
        } catch (Exception e1) {
            //Capturamos errores
            System.out.println(e1.getMessage());
        }
    }

En este momento ya podriamos llamar a este método para escribir en el fichero.

        String miTexto= "Inicio del fichero";
        EcribirFichero(fich_log,miTexto);

Un saludo, espero que esta entrada es sea de utilidad.