Nueva versión de AEMET (no oficial)

Se ha publicado una nueva versión de la aplicación de AEMET (no oficial). La lista de cambios es la siguiente:
  • Añadidos los tres tipos de mapas disponibles en la web de AEMET: Infraroja, Visible y Masas de Aire
  • Caché de los datos de predicción
  • Predicción de tipo texto para las provincias
  • Widget con la predicción para los próximos 4 días
Más información

Nueva versión Simple DiceRoller 1.2.1

 Se ha publicado una nueva versión de Simple DiceRoller con los siguientes cambios:
  • Layout mejorado
  • Capacidad de tirar más de un dado cada vez
  • Ordenes de las tiradas de dados
  • Opción de media de resultados       
  • Widgets de 1x1 y 2x2
Más información

Nueva versión 1.2 de AEMET (no oficial)


Se ha publicado una nueva versión de la aplicación AEMET (no oficial). Los cambios son los siguientes:
  • Añadido el soporte para consultar las imágenes de satélite
  • Se ha cambiado el parseador por TagSoup
  • Se ha mejorado el sistema de gestión de tareas en segundo plano
  • Se han corregido algunos fallos
Más información

    Web Service con Maven + Axis2 + Spring framework - Parte II (Seguridad)


    Ya vimos en la Parte I de este tutorial cómo crear un servicio web con Maven, Axis2 y Spring. En esta segunda parte veremos cómo agregarle seguridad mediante usuario y password.

    Web Service con Maven + Axis2 + Spring framework

    En este post voy a explicar cómo crear un servicio web con Maven, Axis2 y Spring framework. La idea es tener el mínimo número de ficheros y configuración para que el servicio web funcione.

    Google Calendar en el escritorio de Ubuntu

    En este post voy a explicar algo que debería ser fácil de conseguir pero que hasta hace poco no había conseguido de una forma tan limpia. Hasta ahora venía usando un calendario para el escritorio llamado Rainlendar. Este escritorio se integra bastante bien en el escritorio de Ubuntu y mediante un programita llamado GCalDaemon se conseguía sincronizar el calendario con Google Calendar. El procedimiento está explicado en un post de no hace mucho:
    Pero hoy mismo, leyendo una entrada de Ubuntips se me ha ocurrido cómo integrar de una forma más limpia (ejecutando únicamente un programa y dejando que la sincronización la haga el propio Google)

    Wallpapers para Android - Dream Theater

    ¿Tienes un móvil con Android?, ¿te gustan los Dream Theater?. Entonces te interesará este post en el que os voy a proponer un cambio de look para vuestro móvil.

    Existen multitud de páginas y aplicaciones que nos proporcionan cambiar fácilmente nuestro fondo de pantalla. ElAndroideLibre.com ya habló de esto en un post.

    Yo os voy a proponer varios fondos de pantalla que he preparado para Android, algunos de ellos extraídos a partir de las imágenes de SteveTheater. Los fondos de pantalla vienen con la resolución adecuada (640x480):














    Espero que os gusten

    Mensajes emergentes en Android - Parte 1

    En este post veremos el primero y más simple de los mensajes emergentes en Android. La plataforma Android nos proporciona mecanismos para crear de forma simple efectos muy integrados con la apariencia general del sistema.

    Los mensajes que vamos a crear se denominan Toast y vamos a ver mensajes Toast de cuatro tipos:
    Mensaje de sólo texto Mensaje con icono
    Mensaje con icono y texto Mensaje con icono y texto con XML

    Veamos cómo se crearía cada uno de ellos. Cabe destacar que este código debe ejecutarse dentro del código de una clase Activity.


    Mensaje de sólo texto

    Toast toast = Toast.makeText(getApplicationContext(), "Mensaje Toast con sólo texto", Toast.LENGTH_SHORT);
    toast.show();
    


    Mensaje con icono

    Toast toast = new Toast(getApplicationContext());
    ImageView view = new ImageView(getApplicationContext());
    view.setImageResource(android.R.drawable.ic_menu_info_details);
    toast.setView(view);
    toast.setDuration(Toast.LENGTH_SHORT);
    toast.show();
    


    Mensaje con icono y texto

    Toast toast = Toast.makeText(getApplicationContext(), "Mensaje Toast con texto e icono", Toast.LENGTH_SHORT);
    View textView = toast.getView();
    LinearLayout lay = new LinearLayout(getApplicationContext());
    lay.setOrientation(LinearLayout.HORIZONTAL);
    ImageView view = new ImageView(getApplicationContext());
    view.setImageResource(android.R.drawable.ic_menu_info_details);
    lay.addView(view);
    lay.addView(textView);
    toast.setView(lay);
    toast.show();


    Mensaje con icono y texto con XML

    LayoutInflater inflater = getLayoutInflater();
    View layoutView = inflater.inflate(layout, null);        
    Toast toast = new Toast(getApplicationContext());
    toast.setDuration(Toast.LENGTH_SHORT);
    toast.setView(layoutView);
    toast.show();
    

    El código XML del Toast sería:
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="horizontal"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:background="@layout/border"
        android:gravity="center">
            <ImageView 
                  android:src="@android:drawable/ic_menu_info_details"
                  android:layout_width="wrap_content"
                  android:layout_height="fill_parent"
                  android:layout_marginRight="10dp"/>
     <TextView 
                 android:text="@string/text_icon_msg"
                 android:layout_width="wrap_content"
                 android:layout_height="fill_parent"
                 android:textColor="#FFFFFF"
                 android:gravity="center_vertical"/>
    </LinearLayout>
    
    Como puede verse, la propiedad android:background del elemento LinearLayout apunta a un layout llamado border. Este es una forma de hacer que la ventana tenga los bordes redondeados. Debemos crear un fichero XML llamado border.xml dentro de la carpeta res/layout con el siguiente contenido:
    <?xml version="1.0" encoding="utf-8"?>
    <shape xmlns:android="http://schemas.android.com/apk/res/android">
        <solid android:color="#444444"/>    
        <stroke 
            android:width="4dp" 
            android:color="#999999" />
        <padding 
            android:left="7dp" 
            android:top="7dp"
            android:right="7dp" 
            android:bottom="7dp" />
        <corners 
            android:bottomRightRadius="7dp" 
            android:bottomLeftRadius="7dp" 
            android:topLeftRadius="7dp" 
            android:topRightRadius="7dp"/> 
    </shape> 
    

    Ahora veamos el código de la clase activity al completo:
    package org.ffbeltran;
    
    import android.app.Activity;
    import android.os.Bundle;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.widget.Button;
    import android.widget.ImageView;
    import android.widget.LinearLayout;
    import android.widget.Toast;
    
    public class EjemploToast extends Activity {
        
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            
            Button button;
            button = (Button) findViewById(R.id.text_only_button);
            button.setOnClickListener(new Button.OnClickListener() {
                public void onClick(View v) {
                    textOnlyToast(getString(R.string.text_only_msg), Toast.LENGTH_SHORT);
                }
            });
            
            button = (Button) findViewById(R.id.icon_only_button);
            button.setOnClickListener(new Button.OnClickListener() {
                public void onClick(View v) {
                    iconOnlyToast(android.R.drawable.ic_menu_info_details, Toast.LENGTH_SHORT);
                }
            });
            
            button = (Button) findViewById(R.id.text_icon_button);
            button.setOnClickListener(new Button.OnClickListener() {
                public void onClick(View v) {
                    textIconToast(R.layout.text_icon_toast, Toast.LENGTH_LONG);
    //                textIconToast(getString(R.string.text_icon_msg), 
    //                        android.R.drawable.ic_menu_info_details, Toast.LENGTH_SHORT);
                }
            });
        }
        
        private void textOnlyToast(String message, int duration) {
            Toast toast = Toast.makeText(getApplicationContext(), message, duration);
            toast.show();
        }
        
        private void iconOnlyToast(int icon, int duration) {
            Toast toast = new Toast(getApplicationContext());
            ImageView view = new ImageView(getApplicationContext());
            view.setImageResource(icon);
            toast.setView(view);
            toast.setDuration(duration);
            toast.show();
        }
        
        private void textIconToast(String message, int icon, int duration) {
            Toast toast = Toast.makeText(getApplicationContext(), message, duration);
            View textView = toast.getView();
            LinearLayout lay = new LinearLayout(getApplicationContext());
            lay.setOrientation(LinearLayout.HORIZONTAL);
            ImageView view = new ImageView(getApplicationContext());
            view.setImageResource(icon);
            lay.addView(view);
            lay.addView(textView);
            toast.setView(lay);
            toast.show();
        }
        
        private void textIconToast(int layout, int duration) {
            LayoutInflater inflater = getLayoutInflater();
            View layoutView = inflater.inflate(layout, null);        
            Toast toast = new Toast(getApplicationContext());
            toast.setDuration(duration);
            toast.setView(layoutView);
            toast.show();
        }
    }
    
    Éste es el código del layout principal:
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:gravity="center_horizontal">
     <TextView  
         android:gravity="center"
      android:layout_width="fill_parent" 
         android:layout_height="wrap_content" 
         android:text="@string/app_name"
         android:textSize="25sp"
         android:textStyle="bold"
            android:layout_marginTop="25dip"
         android:layout_marginBottom="25dip"/>
     <Button
         android:id="@id/text_only_button"
         android:layout_gravity="center"
         android:layout_width="200dip"
         android:layout_height="wrap_content"
         android:text="@string/text_only_button"/>
       <Button
         android:id="@id/icon_only_button"
         android:layout_gravity="center"
         android:layout_width="200dip"
         android:layout_height="wrap_content"
         android:text="@string/icon_only_button"/>
     <Button
         android:id="@id/text_icon_button"
         android:layout_gravity="center"
         android:layout_width="200dip"
         android:layout_height="wrap_content"
         android:text="@string/text_icon_button"/>
    </LinearLayout>
    
    Y éste el código de res/values/strings.xml
    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <string name="app_name">EjemploToast</string>
        
        <string name="text_only_button">Sólo texto</string>
        <string name="icon_only_button">Sólo icono</string>
        <string name="text_icon_button">Texto e icono</string>
        
        <string name="text_only_msg">Mensaje Toast con sólo texto</string>
        <string name="text_icon_msg">Mensaje Toast con texto e icono</string>
    </resources>
    
    Por último, puedes cargar el código fuente aquí:

    Presentación de Subversion

    A continuación podéis ver la presentación de Subversion + TortoiseSVN que realicé esta semana. espero que os se a de utilidad.

    Presentación de Subversion

    ¿Cómo poner un "escuchando ahora" ("now playing") en las páginas web (foros, twitter, facebook, etc.)?

    En primer lugar voy a aclarar que esta solución no es trivial pero si completas los pasos podrás insertar fácilmente un mensaje en las páginas para que aparezca la canción que estás escuchando.

    Actualmente está probado en algunos foros, en twitter y en facebook sin problemas pero puede adaptarse a la página web que quieras.

    Va por tí, android

    Gracias a los chicos de elandroidelibre.com me he decidido a crear mi primer post sobre android en mi blog. Y es que fue hace relativamente poco cuando me introduje en el mundo android (concretamente tres meses) gracias a una buena oferta de mi compañía de teléfono.

    Tras este post tendrán que venir muchos más puesto que soy un amante de la programación en Java y he entrado de lleno en la programación de aplicaciones para android. De hecho tengo ya un par de aplicaciones más o menos serias, una de ellas publicadas en el SlideME y ambas de software libre:
    • Simple DiceRoller
    Aplicación que, como su nombre indica, permite ejecutar dados de distintas caras de una manera simple.
    La página oficial del proyecto es: http://code.google.com/p/simple-diceroller/
    • CSV Contacs
    Esta está todavía en desarrollo y permite exportar tus contactos en CSV. 
    La página oficial del proyecto es: http://code.google.com/p/csv-contacts/

    Bueno, a parte de eso, como comentaba al principio este post ha nacido fruto de elandroidelibre.com. Leyendo el twitter recién levantado me entero que organizan un concurso en el que sortean un Nexus One así como una camiseta de EAL + 1 chapa + un muñequito Android. Así que me he puesto al lío con la esperanza de tener un poco de suerte ;).

    Si es legal, es legal

    El pasado 19 de marzo ha sido aprobada la "Ley Sinde". TutorialException se une a la campaña de la FACUA en contra de este abuso y criminalización de los usuarios:

    Fondo de escritorio

    De nuevo vamos con la sección de fondo de escritorio. Esta vez os propongo tres fondos de pantalla.

    Broken-Building
    Thumbail-Broken-Building
    Descarga aquí

    Lightning Bolt
    Thumbail-Lightning Bolt
    Descarga aquí

    Flower Garden
    Thumbail-Flower Garden
    Descarga aquí

    Columnas dinámicas con JSF

    En este post voy a explicar cómo realizar una tabla de columnas dinámicas con JSF. Esta solución se basa en la librería de etiquetas JSF de Apache Trinidad, por lo que podremos aplicarla a cualquier implementación y versión de JSF. Yo recomiendo utilizar la implementación de Apache MyFaces.

    Muchas veces, la versión de JSF a utilizar viene determinada por el entorno de ejecución. Por ejemplo, la versión 1.2 de JSF requiere servlet 2.5 y jsp 2.1, sólo implementada por Tomcat 6.x. Por lo que si vamos a ejecutar la aplicación en un contenedor Tomcat 5.5 tendremos que optar por la versión 1.1 de JSF.

    Fondo de escritorio

    Hoy inauguro esta sección sección de fondo de pantalla, en la que cada ciertos días (espero que cada semana) os propondré un nuevo fondo de pantalla.

    El que presento hoy tiene que ver con la música y no es otro que el de Airbourne


    Disponible en los siguientes formatos:

    Sincronizar tus scripts de Greasemonkey

    En este post explicaré cómo sincronizar tus scripts de Greasemonkey entre distintos ordenadores. La solución está aplicada sobre ordenadores Ubuntu con la ayuda de DropBox, pero una vez explicado el funcionamiento, puede aplicarse con poco esfuerzo a otras distribuciones linux.
    En primer lugar, si no conoces Greasemonkey decir que se trata de un plugin de firefox totalmente recomendable.
    Luego, si no conoces DropBox o lo conoces pero no tienes una cuenta te recomiendo que te hagas una. Por cada persona que invites te darán almacenamiento extra, hasta un cierto límite, por lo que aprovecho y te pido que si no te ha invitado nadie accedas a través de mi URL de invitación:

    Cambiar el contenido de ficheros de texto con Maven

    En esta entrada veremos cómo configurar Maven para que, en función de los perfiles activados, se modifiquen ciertos ficheros de texto. Un ejemplo claro de uso es cuando estamos usando log4j y queremos que el fichero de log se genere en sitios distintos en función del entorno en el que se ejecute.

    Sincronización de Rainlendar con Google Calendar en Ubuntu

    Hace tiempo que quedé impresionado por la calidad del calendario Rainlendar. Rainlendar2 es un calendario multiplataforma que se integra perfectamente en el escritorio.







    Puedes descargar la versión para tu plataforma en la página de descargas:

    La única pega es que yo usaba Google Calendar y Rainlendar2 sólo soporta la integración con Google Calendar en la versión de pago. De todas formas esto ya ha cambiado gracias a GCALDaemon. GCALDaemon es un proyecto de software libre implementado en Java que implementa una sincronización de Rainlendar2 con Google Calendar. Este programa proporciona dos modos de trabajo:
    1. Un demonio o proceso ejecutándose en segundo plano y que mantiene sincronizados los calendarios de Google y Rainlendar2
    2. Un script que al ejecutarlo sincroniza los calendarios

    En la página oficial se dan las instrucciones para configurar el modo 1. En esta entrada voy a explicar una solución basada en la segunda opción, en concreto vamos a configurar GCALDaemon para que sincronice los calendarios al entrar en Ubuntu y al salir o reiniciar.

    Navegar a un enlace interno tras un action en JSF

    En este post voy a dar una solución a un problema común que consiste en navegar a un enlace interno tras pulsar en un botón o en un enlace que ejecuta una acción en el servidor.

    Si simplemente quisiéramos navegar a un enlace interno sin ejecutar nada en el servidor podríamos hacerlo con un outputLink:

    <h:outputLink value="pagina.jsf#ancla" ><h:outputText value="Ir a la página"/> </h:outputLink>
    

    Sin embargo, puede que lo que necesitemos es ejecutar un método en el servidor y luego navegar hacia un ancla. Esto podemos hacerlo con un método actionListener al que enviaremos el nombre del ancla y que se encargará de redireccionar al usuario al ancla especificada tras hacer su trabajo.

    Automatización de Pruebas Web con Selenium RC y Ant

    En este post vamos a ver cómo realizar pruebas sobre páginas web de una forma sencilla y rápida. En primer lugar vamos a explicar qué es Selenium:
    Selenium es un framework de pruebas portable para aplicaciones web. Las pruebas pueden ser escritas directamente en tablas HTML o codificadas en un gran número de lenguajes de programación (PHP, Ruby, Java, JavaScript, etc.) y se ejecutan directamente sobre el navegador (soporta Firefox, IE, Opera, Safari y algunos más). Además podemos desplegar Selenium en distintos sistemas operativos.
    Selenium está formado por varios proyectos:
    • Selenium Core: Es el sistema de pruebas original basado en JavaScript. Actualmente es usado por Selenium Remote Control aunque puede utilziarse como un sistema de pruebas JavaScript/HTML
    • Selenium IDE: Es un plugin de Firefox que facilita la tarea de grabar y ejecutar pruebas HTML. Podemos incluso exportar dichos test HTML a los distintos lenguajes de programación.
    • Selenium Remote Control: Es un sistema cliente/servidor que nor permite controlar los navegadores web localmente o sobre otros ordenadores usando un lenguaje de programación y el framework de pruebas.
    • Selenium Grid: Permite la ejecución de pruebas en varios servidores de una forma distribuida
    • Otros proyectos: Selenium on Rails, Selenium on Ruby y CubiText (Eclipse)

    Como puede verse, disponemos de muchas herramientas para hacer pruebas dentro de Selenium. En el siguiente blog se muestra un tutorial sobre cómo hacer pruebas mediante Selenium IDE:

    En este tema mostraré cómo crear un proyecto Ant que ejecute las pruebas de forma automática. Para ello ejecutaremos una prueba simple sobre la página DZone.