Abrir aplicación por defecto desde java

Esta es una de las típicas cosas que te vuelves un poco majareta buscándolas, pues la gente escribe mucho pero no esta probado.

El siguiente código lo he sacado googleando y lo he modificado y mejorado.

La función permite llamar a la aplicación por defeto que tenga un archivo asociado desde nuestro programa java.

Funciona en Linux(he probado en kubuntu), Windows, y en Mac.

A continuación se peude ver el código fuente.

    private void lanzarVisor(File archivo) {
        try {
            Process p = null;
            String osName = System.getProperty("os.name");
            try {
                if (osName.startsWith("Windows")) {
                    String[] command = {"cmd","/c","start",""visor"",""" + archivo.getAbsolutePath() + """};
                    p = Runtime.getRuntime().exec(command);
                } else if (osName.startsWith("Mac OS X")) {
                    String[] command = {"sh","-c","open "" + archivo.getAbsolutePath() + """};
                    p = Runtime.getRuntime().exec(command);
                } else { // es linux
                    String[] command = {"sh","-c","xdg-open "" + archivo.getAbsolutePath() + """};
                    p = Runtime.getRuntime().exec(command);
                }
            } catch (Exception e) {
                System.out.println("Please open a browser and go to "+ archivo.getAbsolutePath());
            }

            int exitCode = -1;
            if(p != null)
                exitCode = p.waitFor();
            if (exitCode != 0)
            {
                System.out.println("Nose puede abrir "" + archivo.getAbsolutePath() + """);
            }
        } catch (InterruptedException ex) {
            Logger.getLogger(CDIPlannerView.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

Para probarlo se le puede llama de la siguientes maneras

lanzarVisor(new File("pepe.txt"));
lanzarVisor(new File("/home/pepeillo/imagenes/logo.jpg"));

Si lo que queremos es abrir una url tendríamos que modificar el método para que recoja un objeto String.

Como escribir un log en PHP

Se puede escribir un log de muchas maneras, podría ir a una base de datos, a un archivo, o a otro servidor. En este artículo vamos a ver como escribir un log en disco de una manera sencilla.

Primero nos vamos a crear un método para escribir el log. Podemos verlo en el siguente trozo de código.

/**
 * Escribe lo que le pasen a un archivo de logs
 * @param string $cadena texto a escribir en el log
 * @param string $tipo texto que indica el tipo de mensaje. Los valores normales son Info, Error,  
 *                                       Warn Debug, Critical
 */
function write_log($cadena,$tipo)
{
	$arch = fopen(realpath( '.' )."/logs/milog_".date("Y-m-d").".txt", "a+"); 

	fwrite($arch, "[".date("Y-m-d H:i:s.u")." ".$_SERVER['REMOTE_ADDR']." ".
                   $_SERVER['HTTP_X_FORWARDED_FOR']." - $tipo ] ".$cadena."\n");
	fclose($arch);
}

El método es muy sencillo y no requiere mucha explicación. Le pasamos dos valores, el primero es la cadena a escribir y el segundo es el tipo de error.

El tipo de error es un string que podemos escribir l oque queramos, pero lo normal es escribir algunos de los valores descritos en el comentario del método ( Info, Error, Warn, Debug, Critical).

Para el tipo se podrían utilizar constantes, pero eso va en gustos.

La función abre un archivo en el directorio “logs” que esta en el directorio rais de nuestro código. El nombre del archivo es log_web_ + la fecha. así conseguimos que el log se rote todos los días y así tengamos un archivo por día. Al poner “a+” estamos diciendole al fopen que se posicione al final del archivo para que añada lo nuevo detras.

Después realizamos la escritura en el archivo abierto poniendo la fecha, la IP, y el tipo de mensaje entre corchetes, y el texto detras. Esto nos permite identificar rápidamente los mensajes y cuando se han escrito.

Por último cerramos el archivo.

Ya tenemos un método que escribe lo siguiente sería utilizarlo. En el siguiente código podemos ver un ejemplo de como se utiliza.

write_log("Estro es una prueba","Debug");
write_log("Se ha producido un error en el método xxxx. el valor de la variable es $variable","Error");
write_log("Navegador: ".$_SERVER['HTTP_USER_AGENT'].$titulo,"Info");

Mi consejo es poner en el inicio de tu código un log indicando la información del usuario que esta navegando y después todo lo que quieras. Esta instrucción podería tener el siguiente formato.

write_log("IP: ".$_SERVER['REMOTE_ADDR']." - ".$_SERVER['HTTP_X_FORWARDED_FOR'].
                             "\nHTTP_HOST: ".$_SERVER['HTTP_HOST']."\nHTTP_REFERER: 
                             ".$_SERVER['HTTP_REFERER']."\nHTTP_USER_AGENT: ".
                             $_SERVER['HTTP_USER_AGENT']."\nREMOTE_HOST: ".
                             $_SERVER['REMOTE_HOST']."\nREQUEST_URI: ".
                             $_SERVER['REQUEST_URI'],"INFO");

El aspecto de nuestro log sería como el siguiente.

[2012-09-06 11:29:21.u 66.220.153.250  - INFO ]IP: 66.220.153.250 - 
HTTP_HOST: www.piensayactua.com
HTTP_REFERER: 
HTTP_USER_AGENT: facebookexternalhit/1.1 (+http://www.facebook.com/externalhit_uatext.php)
REMOTE_HOST: 
REQUEST_URI: /index.php
[2012-09-06 11:29:21.u 66.220.153.250  - Debug ] Estro es una prueba
[2012-09-06 11:29:21.u 66.220.153.250  - Debug ] Se ha producido un error en el método xxxx. el valor 
de la variable es HOLA MUNDO
[2012-09-06 11:29:21.u 66.220.153.250  - Debug ] Navegador:  facebookexternalhit/1.1 
(+http://www.facebook.com/externalhit_uatext.php)

Este código se puede mejorar mucho e incluso utilizar librerías existentes para estos fines.

Espero que os sea de utilidad.

Android Contra IOS

El mundo de la programación es un mundo muy complicado y extenso. En lo que respecta a dispositivos móviles, al día de hoy sólo hay dos sistemas en los que merece la pena programar, estos son Android e IOS(Apple).

Como programador estoy obligado a trabajar en los dos, pero creo que Android le ha ganado la partida a IOS por goleada. Estaréis pensando que se me ve el plumero, pero la verdad es que nunca más lejos de la realidad. Os voy a poner mi comparativa personal no basada en ninguna web, sólo en mi experiencia.

Los dos sistemas son muy parecidos, teniendo funcionalidades muy parecidas:

  • Tienen entornos de desarrollo con emuladores de los dispositivos.
  • Un API extenso y fácil de utilizar con funcionalidades muy potentes.
  • Un sistema de distribución de aplicaciones centralizado que simplifica la publicación, venta e instalación de aplicaciones.
  • Funcionalidades de telefonía, localización, multimedia, y redes sociales.

Hasta aquí todo bien. Pero la gran diferencia entre los dos sistemas esta en los siguientes puntos.

  • Android esta en Java e IOS esta en ObjetiveC. Al día de hoy el parque de desarrolladores en Java es inmenso y el de IOS ObjetiveC esta compuesto por los desarrolladores actuales para Mac.
  • Android tiene un IDE de desarrollo libre que es eclipse multiplataforma (hay un plugin para netbeans, esto significa que realmente existen dos IDEs libres), IOS tiene Xcode que viene en todos los Mac y es gratuito. Aunque parece que están a la misma altura, no es así. Para Android puedes programar en un sistema windows, unix, linux, sun solaris, y mac. En cambio Xcode sólo corre sobre Mac y te obliga a adquirir hardware. Por lo tanto si no eres programar de Mac y quieres adentrarte en este mundo o tantear haciendo alguna aplicación, tienes que desembolsar unos 1200 euros en un equipo.
  • Las aplicaciones de distribución de aplicaciones son muy parecidas, pero hay una diferencia económica importante si eres programador, pues para Android te cuesta darte de alta 20 dolares y ya esta, en cambio para IOS son 100 dolares anuales o más dependiendo si eres independiente o empresa.
  • Otro punto a favor para Android es que si no quieres date de alta en el market (aplicación de distribución) siempre puedes colgar tu aplicación en una web para que se la descarguen e instalen. Para IOS sólo puedes instalar aplicaciones desde su aplicación de paquetería a no ser que tenga el IPhone crackeado.
  • Los dos sistemas operativos son muy potentes y permiten hacer cualquier cosa, de echo el harware donde corren son verdaderos equipos informáticos llenos de gagets. Aquí prefiero indicar las ventajas de los dos y no compararlos, pues unas ventajas cubren otras carencias. IOS corre sobre un hardware muy concreto y por tanto teóricamente es más estable. Android corre sobre muchos dispositivos hardware de distintos fabricantes permitiendo un mercado más rico, abierto a nuevas invenciones por parte de los fabricantes gracia a la competencia entre ellos.
  • Los dispositivos hardware de Android han conseguido superar en características y prestaciones a los de IOS, pero Android como sistema operativo le falta un pequeño hervor.

Es evidente en la guerra actual de patentes que tiene Apple con Google y sus afiliados que Android es un serio rival para Apple e intenta quitarse esa posible competencia de la manera más directa. Atacando con patentes y con lo que se le ocurre.

Hasta hace poco el parque de desarrolladores de dispositivos móviles estaba limitado a los desarrolladores de Symbian, JavaML y Mac, pero Android ha abierto la puerta del desarrollo a mills de desarrolladores Java que de repente ven facil programar para su propio teléfono móvil.

Hay otro sitema RIM, pero lo doy por difunto, es parecido a los dos que he analizado en este artículo pero no ha sabido atraer al colectivo de desarrolladores.

A mi me toca trabajar con los dos, pero me siento más cómodo con Android.

Esta claro al día de hoy que ganará la batalla quien sepa atraer a los desarrolladores, por que los dispositivos de hoy en día son tan complejos y necesitan tantas aplicaciones que ni las grandes multinacionales tienes suficientes desarrolladores para afrontar dichos desarrollos.

Es la comunidad del desarrollo quien elegirá cual será el dispositivo estrella en cada momento y no importará si tiene una manzana en la parte trasera o un robot.