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: