Archivo de Agosto de 2009

Restaurante Zhu en Alicante

Miércoles, 26 de Agosto de 2009

El otro día estuvimos en un restaurante “asiático” (chino en realidad) que me pareció bastante bien. Los precios son un poco más altos de lo habitual, pero merece la pena. Se llama Restaurante Zhu y está ubicado en la calle Dr. Sánchez San Julián, 6, Alicante.

Los sushis que preparan son exquisitos. He fotografiado la carta con mi móvil para que podais ver los precios.

También voy a hacer una prueba de Google Maps API y dejo el mapa del sitio.

[geo_mashup_map]

Seleccionar fecha con jQuery UI Datepicker

Martes, 25 de Agosto de 2009

Hoy en día hay muchas librerías que nos pueden hacer la vida mucho más sencilla cuando se trata de JavaScript. Todos conocemos bibliotecas como jQuery, Prototype y otras. En esta entrada voy a hablar sobre una extensión de la librería jQuery llamada jQuery UI.

jQuery UI Datepicker

Esta biblioteca ofrece varios componentes gráficos que podemos usar en nuestras páginas, entre ellos podemos destacar, datepicker — seleccionador de fecha (calendario), dialog — ventanas modales, progressbar — barra de progreso y muchos otros. Voy a explicar como podemos usar datepicker adaptado al entorno nuestro, es decir, a España con sus correspondientes días de la semana, nombres de meses, etc.

Antes que nada tenemos que descargar la última versión de jQuery e incluirla en nuestras páginas:



<script type="text/javascript" src="jquery.js"></script>

Una vez que tengamos jQuery instalado, descargamos jQueryUI desde esta página. Como podéis ver ofrecen las versiones completamente personalizadas para cada gusto. Yo aconsejaría descargar la versión de la librería completa, al menos para las pruebas.

Desempaquetamos todos, en este punto vamos a tener tres grupos de ficheros, el propio JavaScript, las imágenes y el css, en un principios las imágenes tienen que ir en el directorio /images, no he mirado las opciones para poder cambiar esto, pero estoy casi seguro que se podrá hacer de alguna forma. En cuanto al resto, lo incluímos en la cabecera de la página web.



<link type="text/css" href="jquery-ui.css" rel="stylesheet" />
  <script type="text/javascript" src="jquery-ui.js"></script>

Una vez hecho esto ya podemos instanciar el datepicker. La forma más sencilla de hacerlo es creado un input de tipo texto:



<input type="text" id="date-start" name="date-start" />

Una vez que lo tengamos definido, podemos instanciar el datepicker en el bloque head de la siguiente manera:



<script type="text/javascript">
    $(function() {
      $("#date-start").datepicker({
        dateFormat: 'dd/mm/yy', // formato de fecha que se usa en España
        dayNames: ['Domingo', 'Lunes', 'Martes', 'Miércoles', 'Jueves', 'Viernes', 'Sabado'], // días de la semana
        dayNamesMin: ['D''L''M''X''J''V''S']// días de la semana (versión super-corta)
        dayNamesShort: ['Dom', 'Lun', 'Mar', 'Mie', 'Jue', 'Vie', 'Sab'], // días de la semana (versión corta)
        firstDay: 1// primer día de la semana (Lunes)
        maxDate: new Date()// fecha máxima
        minDate: '-2y',
        monthNames: ['Enero', 'Febrero', 'Marzo', 'Abril', 'Mayo', 'Junio', 'Julio', 'Agosto', 'Septiembre', 'Octubre', 'Noviembre', 'Diciembre'], // meses
        monthNamesShort: ['Ene', 'Feb', 'Mar', 'Abr', 'May', 'Jun', 'Jul', 'Ago', 'Sep', 'Oct', 'Nov', 'Dic'], // meses
        navigationAsDateFormat: true,
        });
    });
  </script>

Sitios para buscar afiliados

Viernes, 21 de Agosto de 2009

Buscando en Internet lugares donde promocionar tusueros.com he encontrado siguientes sitios de afiliados.

Aquí está la lista:

  • Foro – Ganar dinero web — Un foro no muy activo, pero para dejar la descripción del sistema y algún enlace vale.
  • STS – Sube tu sueldo — Un foro con muchos más usuarios que el anterior. La gente participa de forma activa, dan buenos consejos.
  • El Dólar — otro foro sin apenas usuarios.
  • TuDinerito.com — todo muy bonito, pero sin usuarios.
  • Rentabilizar Web — un foro muy potente. Buena comunidad de usuarios que participan de una forma muy activa.

Intentaré ir ampliando esta lista.

Ser autónomo en España

Martes, 18 de Agosto de 2009

Presiamente hoy he estado hablando con mi gestor sobre cómo ser autónomo en España. Más concretamente sobre los impuestos y la seguridad social que tiene que pagar uno. Para todas aquellas personas que quieren dar el paso dejo aquí esta pequeña referencia.

Un autónomo paga la Seguridad Social, la cotización mínima que puede escoger es de 250 euros si la persona es mayor de 30 años y un 75% de esta cantidad (lo que viene a ser unos 187,50 euros) si es menor de 30 años. Este pago es sagrado y tiene que realizarse mensualmente.

Otro gasto que va a tener es el IRPF, es decir que va a pagar un 20% sobre todos los beneficios obtenidos. Un autónomo puede tener gastos y beneficios, pongamos por caso que has hecho un proyecto por el que has cobrado 1000 euros, pero para hacerlo has tenido que pagar un ordenador que cuesta 800 euros. Pués tu ganancia neta ha sido de 200 euros. Tendrás que pagar de IRPF unos 40 euros. Este pago es anual (corregidme si me equivoco).

Por último un autónomo tiene que declarar el IVA trimestralmente. Aquí viene lo gracioso y lo que más quebraderos de cabeza nos da. En cada factura que emitamos se añade un 16% de IVA. Por ejemplo, si emites una facutra por un importe de 1000, el total será de 1160 (1000 euros + 16%). Pero claro, en nuestra vida cotidiana para desarrollar nuestras funciones como autónomo necesitamos luz, internet, coche, comer, etc. Pués todo este IVA que pagas en cada factura se puede deducir ya que la declaración la tienes que hacer sobre la diferencia de lo que has pagado y lo que has percibido. Si has pagado más IVA de lo que percibiste, la hacienda tiene que devolverte la diferencia, pero si has pagado menos de lo que has percibido, como dice mi socio, tienes un problema.

Java2HTML — una utilidad para colorear Java

Lunes, 17 de Agosto de 2009

Ya que siempre estoy poniendo el código en estas páginas voy a pensar más en los usuarios que lean esto. He encontrado una utilidad muy buena llamada Java2HTML. Se puede instalar o bien como una aplicación aparte o bien como un plugin de Eclipse. Colorea el código bastante bien (podeis ver ejemplos en este mismo blog) y es muy sencilla de instalar, aquí dejo los enlaces:

Java2HTML — aplicación standalone.
Java2HTML — plugin para Eclipse (probado con Ganymede).

Ejecutar comandos Linux desde Java (II)

Lunes, 17 de Agosto de 2009

La primera parte se encuentra aquí.

En la entrada anterior vimos un ejemplo sencillo sobre cómo podíamos ejecutar un comando externo desde el código Java. Voy a intentar construir algo más complejo que esto, concretamente me interesa hacer una clase que pueda lanzar un comando Linux sin bloquear el hilo que lo origina. Es decir, lanzar un comando como si fuera un Thread más de la máquina virtual.

La forma más sencilla que conozco para hacerlo sin ningún tipo de bloqueos es mediante un Listener. A mi me interesa ver en tiempo real la STDOUT y STDERR del comando externo. También quiero saber cuando acaba y cuál es el código de salida. Construyo una interfaz:



public interface ProcessListener {
  // se llama cuando se actualiza la salida estándar
  public void updateStdOut(byte[] b);
  
  // se llama cuando se actualiza StdErr
  public void updateStdErr(byte[] b);
  
  // se llama cuando el proceso termina
  public void processFinish(int exitCode, byte[] stdOut, byte[] stdErr);
}

Esta será la interfaz que implementaremos en una clase que será la responsable de realizar ciertas operaciones en función de las distintas salidas del comando exterior. Ahora necesitamos una clase que será la encargada de lanzar el proceso propiamente dicho:



public class ProcessLauncher implements Runnable {
  private String Command;
  
  private int ExitCode = Integer.MIN_VALUE;
  
  private Thread MyThread;
  
  private Vector StdOut;
  private Vector StdErr;
  
  private ProcessListener MyProcessListener;
  
  private Object Lock = new Object();
  
  private Process MyProcess;
  
  public ProcessLauncher(String command, ProcessListener pl) {
    Command = command;
    MyProcessListener = pl;
    
    StdOut = new Vector();
    StdErr = new Vector();
    
    MyThread = new Thread(this);
    MyThread.start();
  }
  
  public boolean isFinished() {
    return ExitCode != Integer.MIN_VALUE;
  }
  
  public void run() {
    try {
      // arranco el proceso
      MyProcess = startProcess();
      // creo un controlador del proceso
      ProcessController pc = new ProcessController(MyProcess, this);
      
      // ahora hasta que no finalice el método voy leyendo la salida
      while(ExitCode == Integer.MIN_VALUE) {
        synchronized(Lock) {
          // de esta forma me aseguro que nadie más está leyendo la salida
          readStreams();
        }
        
        Thread.sleep(500)// duermo un poco para liberar los recursos
      }
    }catch(Exception e){
      e.printStackTrace();
    }
  }
  
  private void readStreams() throws Exception {
    InputStream stdout = MyProcess.getInputStream();
    InputStream stderr = MyProcess.getErrorStream();
    
    byte[] b;
    int size;
    
    size = stdout.available();
    if(size != 0) {
      b = new byte[size];
      stdout.read(b);
      
      MyProcessListener.updateStdOut(b);
      for(int i = 0; i < b.length; i++) {
        StdOut.add(b[i]);
      }
    }
    
    size = stderr.available();
    if(size != 0) {
      b = new byte[size];
      stderr.read(b);
      
      MyProcessListener.updateStdErr(b);
      for(int i = 0; i < b.length; i++) {
        StdErr.add(b[i]);
      }
    }
  }
  
  private Process startProcess() throws Exception {
    Process proc = Runtime.getRuntime().exec(Command);
    return proc;
  }
  
  public void notifyExit(int exitCodethrows Exception {
    // me notifican que se el proceso se ha terminado
    ExitCode = exitCode;
    
    // leo por última vez las salidas, por si se ha quedado algo
    synchronized (Lock) {
      readStreams();
    }
    
    // notifico al listener
    byte[] stdOut = new byte[StdOut.size()];
    for(int i = 0; i < stdOut.length; i++) {
      stdOut[i((Byte)StdOut.get(i)).byteValue();
    }
    
    byte[] stdErr = new byte[StdErr.size()];
    for(int i = 0; i < stdErr.length; i++) {
      stdErr[i((Byte)StdErr.get(i)).byteValue();
    }
    
    MyProcessListener.processFinish(exitCode, stdOut, stdErr);
  }
}

Esta clase se encargará de leer periodicamente los flujos de salida del proceso e ir tanto guardándolo en memoria como pasándolo al Listener en tiempo real. Pero claro, aquí nos encontramos con otra dificultad y es que resulta que queremos saber a ciencia cierta y en el momento exacto cuando termina nuestro proceso, para ello definimos un controlador de proceso (ProcessController):



public class ProcessController implements Runnable {
  private Process MyProcess;
  
  private Thread MyThread;
  
  private ProcessLauncher MyProcessLauncher;
  
  public ProcessController(Process proc, ProcessLauncher pl) {
    MyProcess = proc;
    MyProcessLauncher = pl;
    
    MyThread = new Thread(this);
    MyThread.start();
  }
  
  public void run() {
    try {
      int code = MyProcess.waitFor();
      
      // notificar al padre
      MyProcessLauncher.notifyExit(code);
    }catch(Exception e){
      e.printStackTrace();
    }
  }
}

El objeto de esta clase se ejecutará en un hilo aparte que se quedará bloqueado hasta que el proceso termine. En cuanto termina el proceso el código de salida es comunicado a ProcessLauncher para que este pueda tomar las acciones oportunas. Para la próxima vez pondré ejemplos de utilización y si me da tiempo prepararé un JAR para que se pueda bajar y usar tranquilamente como si fuera una librería.

Ejecutar comandos Linux desde Java (I)

Domingo, 16 de Agosto de 2009

Muchas veces hay una necesidad de ejecutar un comando Linux (o Windows) desde Java. Las razones pueden ser varias, a veces conviene usar una cosa que ya está disponible en forma de comando (imaginaros el prototipo de un programa con el presupuesto aún sin aprobar) o a lo mejor simplemente porque una utilidad de consola consume mucho menos recursos que Java (supongamos que tenemos que recodificar avi -> fla muchos videos que nos han subido). El caso es que Java sirve perfectamente para ello, teniendo en cuenta ciertas consideraciones.

Veamos el código:


Process proc = Runtime.getRuntime().exec("ls -la");
InputStream is = proc.getInputStream();
int size;
String s;
int exCode = proc.waitFor();
StringBuffer ret = new StringBuffer();
while((size = is.available()) != 0) {
byte[] b = new byte[size];
is.read(b);
s = new String(b);
ret.append(s);
}
System.out.println(ret.toString());

La primera línea nos crea un proceso dentro de nuestro Runtime, con el comando ls -la dentro. Acto seguido obtenemos un InputStream para poder ver la salida estándar del programa. Y aquí viene la primera consideración, en el momento de lanzar el proceso con Runtime.getRuntime().exec() arranca un subproceso que sigue a su ritmo completamente. Quiero decir, si nada más arrancar el proceso intentamos leer lo que ha devuelto tendremos un String vacío, ya que de momento el processo no ha sacado nada por la salida estándar.

La solución para eso es esperar hasta que el proceso termine. Esto lo hacemos con la siguiente línea: proc.waitFor(); Lo que hace es que detiene el Thread dentro del cual hemos lanzado el proceso y espera hasta que termine el proceso (cuidado con los bloqueos). Como resultado devuelve un número entero con el código de terminación del proceso lanzado. Normalmente el código 0 significa OK, en caso de que se haya producido algún error lo normal es que devuelva otro valor.

Las siguientes líneas simplemente leen lo que el proceso ha enviado por la salida estándar y sacan el resultado por pantalla.

Otra consideración de la que no debemos olvidarnos es que un proceso tiene los siguientes flujos (dos de ellos para leer y uno para escribir):

  1. STDIN – flujo de entrada estándar. Mediante este flujo podemos enviarle datos al comando. Se obtiene mediante Process.getOutputStream().
  2. STDOUT – flujo de salida estándar. Es el que hemos usado en nuestro ejemplo.
  3. STDERR – flujo para la salida de errores. Se obtiene mediante Process.getErrorStream().

Segunda parte — como hacer lo mismo pero sin bloquear el Thread.

Copias de seguridad de MySQL con mysqldump

Sábado, 15 de Agosto de 2009

Hace tiempo leí que cada buen administrador de sistemas tiene que recordar tres reglas de oro: copias de seguridad, copias de seguridad y copias de seguridad. De eso voy a hablar en este post, ¿cómo de una forma sencilla podemos organizar el tema de las copias de seguridad usando las herramientas estándar que cualquier sistema Linux ofrece?

Casi siempre que instalamos el servidor de las bases de datos MySQL junto a él viene la utilidad llamada mysqldump. Se trata precisamente de eso, es un programa para sacar las copias de seguridad de la base de datos. Yo lo hago de la forma más sencilla que se me ha ocurrido, en mi crontab (como root) añado la siguiente entrada:


59 23 * * * /usr/bin/mysqldump -u root xand_prod | /bin/gzip -9 -c > /www/xand/backup/xand_prod-`/bin/date +\%Y\%m\%d`.gz

¿Qué hace este código? Cada día a las 23 59 se lanza el comando mysqldump (accede a la base de datos como root) y saca una copia de la BBDD xand_prod por la salida estándar. Como podeis ver, la salida se redirecciona mediante un pipe al gzip. Este a su vez lo comprime y lo guarda en el fichero que hemos indicado. Con el /bin/date pongo la fecha de cada fichero en el nombre del mismo.

Conectarse desde Java a MySQL mediante JDBC

Viernes, 14 de Agosto de 2009

Este post es una microchuleta sobre como uno puede conectarse a MySQL desde Java mediante JDBC. Existe infinidad de métodos y librerías para realizar esta tarea, pero aquí vamos a ver el más directo.

Supongamos que tenemos una tabla llamada test en la base de datos llamada prueba. Lo primero que tenemos que hacer es cargar el controlador (también llamado Driver).

Class.forName("com.mysql.jdbc.Driver");

Ahora componemos la URL de conexión a la BBDD y conectamos:


String urlDDBB = "jdbc:mysql://localhost:3306/prueba?user=root&password=contrasenya";
Connection conn = DriverManager.getConnection(urlDDBB);

Con esto le indicamos al controlador que nuestro servidor de MySQL se encuentra en localhost, escucha en el puerto 3306 (estándar), la base de datos se llama prueba, el usuario con el que conectamos es root y su contraseña es contrasenya. Una vez realizado podemos empezar a lanzar consultas a la tabla. Vamos a ver como podemos obtener los distintos valores que pueden guardarse en la tabla a asignarlos a las variables nuestras.


String consulta = "SELECT * FROM test";
String s;
int i;
Date d;
long l;
double dd;
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(consulta);
while(rs.next()){
s = rs.getString("columna_string");
i = rs.getInt("columna_int");
d = rs.getDate("columna_date");
l = rs.getLong("columna_long");
dd = rs.getDouble("columna_double");
}

Una cosa muy importante que debemos de hacer una vez hemos terminado de trabajar con los datos de la tabla es cerrar todos los componentes:


rs.close();
stmt.close();
conn.close();

Espero que sirva de ayuda.

Cambiar una palabra por otra en Java

Viernes, 14 de Agosto de 2009

Mucha gente pregunta sobre cómo se puede cambiar una palabra por otra en Java. Es decir, lo que pretende el usuario normalmente es sustituir una cadena de caracteres por otra.

Por suerte, Java es bastante flexible y nos da dos opciones para hacerlo. La primera opción va a resulta más sencilla para toda aquella gente que no conoce expresiones regulares (RegExp) y consiste básicamente en separar la cadena en cadenas más pequeñas usando como separador la palabra buscada. Luego se concatena todo y se mete entre medias la cadena que queramos poner. Este es el algoritmo:

static String replace(String str, String pattern, String replace) {
int s = 0;
int e = 0;
StringBuffer result = new StringBuffer();
while ((e = str.indexOf(pattern, s)) >= 0) {
result.append(str.substring(s, e));
result.append(replace);
s = e+pattern.length();
}
result.append(str.substring(s));
return result.toString()
}

Otra forma mucho más sencilla de hacerlo es mediante las expresiones regulares:

String s = "Cadena1 larga muy muy larga";
s = s.replaceAll("\\{Cadena1\\}", "Cadena2")

En este ejemplo la cadena Cadena1 va a ser sustituida por Cadena2.