Posts

Suponía que habría alguna forma de hacerlo en java y suponía que de alguna forma utilizaría hilos.

Después de darle vueltas a un par de clases y tratar que un hilo desde el método run pudiermos lanzar una excepción resulta que hay otras maneras. Una de ellas, algo engorrosa utiliza clases del paquete concurrent de java. Es un especie de ejecutor de tareas al que le tenemos que pasar una clase que implemente un interfaz determinado. Luego lanzamos esa clase con un tiempo de timeout (en segundos o como queramos).

Si la tarea, que es asíncrona (en este caso está a la espera de lo que haga el usuario) no se termina, salta una excepción que desconocía que es TimeoutException.

Todo está basado en un post que encontré, pero en lugar de mostrarlo en partes, he metido todo en una clase para poder reutilizarlo en cualquier lado. En el código está la url de la solución que encontré, muy bien documentada.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.concurrent.Callable;
import java.util.concurrent.

ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;



/**
 * @author Pello Xabier
 * As seen on
 * http://www.javaspecialists.eu/archive/Issue153.html
 * Simplificado y todo metido en una clase
 */
public class TimedInput {
        private long timeoutSecs;


        // Necesitamos una clase que implemente Callable que haga la tarea
        // De desta manera la podemos invocar desde un Executor
        private class ConsoleReadLineTask implements Callable<String> {
                /**
                 * método que debemos implementar para el interfaz Callable
                 * @return String
                 * @throws IOException
                 */
                  public String call() {
                    BufferedReader reader = new BufferedReader(new
InputStreamReader(System.in));

                    String readedInput = null;

                    try {
                        readedInput = reader.readLine();
                    } catch (IOException ioe) {

                    }
                    return readedInput;
                  }
        }


        /**
         * el constructor
         * @param timeoutSecs el número de segundos que esperaremos
         */
        public TimedInput (long timeoutSecs) {
                this.timeoutSecs = timeoutSecs;
        }


        /**
         * readLine
         * Este método es que el se invocará desde cualquier lado para recoger
         * información, y encapsula todo el tema del timeout
         * @param msg que se muestra al usuario para pedir datos
         * @return un String con lo que se ha escrito o null en caso de timeout.
         */
         public String readLine(String msg)  {
                    ExecutorService executorService = Executors.newSingleThreadExecutor();
                    String readedInput = null;
                    try {

                        // Future lo utilizamos para recoger el resultado
                        // de una tarea asíncrona, vamos, de la task que hemos preparado
                        Future<String> result = executorService.submit(new
ConsoleReadLineTask());

                        try {
                                System.out.println(msg);
                                // Aquí está la madre del cordero: espera el resultado un
determinado tiempo
                                // en caso de que no se haya completado la tarea SALTA UNA
EXCEPCIÓN DE TIMEOUT
                                // gracias a la cual sabemos que el usuario NO ha escrito nada.
                                readedInput = result.get(timeoutSecs, TimeUnit.SECONDS);
                        } catch (TimeoutException e) {
                          System.out.println("Timeout, no has escrito nada, dejamos
de esperar");
                          result.cancel(true);
                        } catch (Exception e) {
                          // capturamos cualquier cosa, for the sake of simplicity
                          // and the glory of your mother
                        }

                    } finally {
                        // esto detiene todas las tareas en ejecución y las que
estuvieran en espera
                        executorService.shutdownNow();
                    }
                    // Si salió bien devolveremos lo recogido en la Task que tiene el readLine
                    // y si no, va un null.
                    return readedInput;
                  }

}

En el algún foro también he visto alguna solución aún más simple.

http://www.coderanch.com/t/232213/threads/java/implement-timeout-threads


chaos

Logo chaos

Esto es una especie de aplicación web para subir distintos tipos de contenidos (enlaces, textos, imágenes,...) para uso privado, para compartir o para colgar cosas de forma anónima. La aplicación tiene este aspecto: Web del chaos

La idea es que evolucione a otra cosa pero no sé muy bien hacia qué. En cualquier caso deseché la idea de usar frameworks e hice un MVC muy muy básico, todo ello con php+mysql y pensado para que no de problemas para instalar en ningún host gratuito.

Esta sería la pantalla en la que se suben nuevos items: Subiendo un item al chaos

Puedes ver el código y descargarte el proyecto en github: Descargar chaos

O puedes hacer alguna prueba en la web de pruebas: http://chaos.cx


 

 

Mientras se meten comandos en una consola o sobre todo mientras programas en cualquier entorno o mientras ojeas documentación o mientras haces todo eso a la vez puedes llegar poco a poco a un nivel de concentración que en un entorno favorable puede llegar al deep hack.

(http://catb.org/jargon/html/H/hack-mode.html)

 

En cualquier trabajo si te interrumpen dicen que se tarda unos 10 minutos en volver a recuperar la concentración. ¿Cómo se puede volver al trance de forma más ágil?

 

Hay música que quizá pueda ayudar a alcanzar ese estado semimístico. Hay mucho para elegir y por supuesto los gustos pueden variar, en mi caso me decanto por aquellas que más o menos siguen una misma pauta, es decir, NO me pongo un popurri de pachanga, heavy metal y clásica aleatoria.

Últimamente le he echado una oreja a muchas bandas sonoras de películas y videojuegos y hay auténticas joyas que pueden allanar el camino hacia el hack mode.

Por si le sirve a alguien de inspiración aquí pongo una lista de álbumes que suelo utilizar mientras le doy a la tecla:

 

- OST Warhammer Spacemarine, la banda sonora del videojuego.

- OST Inception, la banda sonora de Origen.

- OST Prometheus, la peli en fin, la BSO cojonuda.

- OST Silent Hill 1, el videojuego. Algo enfermizo, para trances profundos ;)

- OST El Ilusionista

- OST Alien & OST Aliens

- OST Conan the Destroyer

- OST Magic, no confundir con las cartas de los cojones, es una peli antigua de Anthony Hopkins

- Death Metal Técnico: Necrophagist, sus dos últimos discos

- Death Metal Técnico: Gorod, Process of a new Decline

- Death Metal Técnico: A Loathing Requiem, Psalms of Misanthropy

- Trash Metal: Angelus Apatrida, The Call

- Heavy Metal: Children of Bodom, sobre todo el Hatebreeder y el Follow the Reaper 


Sobrecarga y valores por defecto
En un clase se pueden sobrecargar los metodos y los constructores, e incluso se pueden asignar valores por defecto a los parametros (como en php). Veamos el ejemplo del coche un poco mas desarrollado.

Locales en Android

Android permite crear aplicaciones multilenguaje de forma fácil gracias a los resources. Los resources nos dan más trabajo pero nos permiten separar la presentación del código. Para crear aplicaciones que soporten varios lenguajes no tenemos más que duplicar directorios como values, layout, etc... incluso los drawables. Por ejemplo:

  • values
  • values-es
  • values-fr

Con eso Android se encargaría de buscar el contenido correspondiente. Siempre hay que dejar lso directorios por defecto como el values, layout para los casos en los que android no pille lo que necesita.

Descargar ejemplo de locales


 

Acceso a Web desde Android

 
En plena era de la web no es de extrañar que android disponga de facilidades para
acceder a la misma. Previamente tenemos que dar permiso a la aplicación para que pueda
salir a internet en el Manifest:
    <uses-permission android:name="android.permission.INTERNET"></uses-permission>
 
Tras eso podemos consultar la web de varias formas, aquí veremos tres:

- Utilizar un WebView, que es un View especial para cargar html de la red.

- Utilizar las clases httpclient para hacer peticiones get

- Utilizar httpclient para hacer post.

 
Descargar ejemplo de acceso a Android
 

Mapas y geolocalización

 

Desde una aplicación de android pueden utilizarse los servicios de geolocalización del propio móvil, lo cual nos puede servir para establecer unas coordenadas o simplemente para buscar una posición desde el programa.
 
La geolocalización también puede ser imprescindible si nuestra aplicación está basada en geolocalización del tipo guía garrafón. Este tipo de aplicaciones precisan premisos especiales para que se puedan usar estos servicios.
 
Demo no funciona

 

La cámara

 
Android dispone de utilidades para poder invocar la cámara desde la aplicación. Previamente, según
usemos intents o no tendremos que meter mano en el manifest y dar permisos, y avisar de que la 
aplicación requiere cámara.
 
Ver: http://developer.android.com/guide/topics/media/camera.html
 
Este programilla lanza directamente la camara con un intent, el resultado se recoge en una
ActivityResult. Poco funcional, pero como el resto no es más que una prueba de concepto:
 
Descargar ejemplo cámara

 

Switchers y lectores de XML

 
Desde Android podemos crear unos Views especiales que nos permiten cambiar su contenido: 
son los TextSwitchers para texto y los ImageSwitchers para imágenes. 
 
Para cada uno de estos switchers debemos crear una clase factory que lo que hace simplemente
es generar una ImageView.
 
Descargar ejemplo Switchers
 
Por otro lado en Android disponemos de librerías para parsear XML en el siguiente ejemplo
se carga un fichero XML que se encuentra en las resources, se parsea y se vuelca en un TextView
 
Descargar ejemplo XML android

Dialogs

En android existen una serie de Dialogs habituales en otros entornos:

  • Alerts
  • Selectores de Fecha
  • Selectores de hora
  • Selectores de caracteres
  • Progreso

Además de eso podemos definir nuestros propios dialogs, indicando un fichero de layout propio y con los controles que queramos. Aquí se pueden ver algunos ejemplos:

descargar ejemplos de dialog

subscribe via RSS