miércoles, 4 de diciembre de 2013

Maven no accede a repositorios en internet

Maven no accede a repositorios en internet

El problema es debido a la preferencia de IPv4/IPv6 de Java. Java intenta utilizar IPv6 de forma predeterminada (?) y mi ISP no soporta IPV6. Sin embargo, está habilitado en mi Windows 7 de forma predeterminada.
Si estás experimentando un comportamiento similar, se puede verificar esto yendo a "Panel de control / Conexiones de red e Internet / Red", hacemos clic con el botón derecho en su conexión a Internet, y seleccionando "Status" en el menú contextual. El cuadro de diálogo de estado mostrará dos líneas similares a esta:

IPv4 Connectivity: Internet
IPv6 Connectivity: No hay acceso a internet

Esta es la raíz del problema, Java prefiere IPv6, que no puede conectarse a Internet.
Para solucionar este problema, realiza cualquiera de las dos (o ambos) de estas tareas:
  1. Desactivar IPv6 en su caja de Windows 7.
  2. Comience el programa de java utilizando esta opción de línea de comandos: -Djava.net.preferIPv4Stack = true
La realización de cualquiera uno de estos se solucionará el problema.

lunes, 4 de noviembre de 2013

Despliegue de Jenkins en un servidor dedicado



La instalación de jenkins en un servidor de aplicaciones web, como por ejemplo, tomcat, es tan sencillo como poner el fichero jenkins.war en la carpeta $TOMCAT_HOME/webapps. El propio servidor de aplicaciones se encargará de realizar el despliegue y poder acceder desde un navegador.

Pero también se puede realizar un despliegue de Jenkins en un servidor dedicado que lleva intrínseco dentro del war. Se trata de un servidor web llamado winstone, que no consigo encontrar en la web como servidor independiente. De esta manera, no es necesario instalar un tomcat para poder utilizar jenkins.

A continuación se indican los comandos a ejecutar para gestionar la instancia de jenkins con el servidor dedicado:

  • Para realizar el despliegue de jenkins se ejecuta lo siguiente:
    java -jar D:\tomcat\webapps\jenkins.war --httpPort=8082 --controlPort=8001
    
    donde el argumento --controlPort indica el puerto para controlar la instancia. Este parámetro es fundamental para poder reiniciar o para la instancia.
  • Para reiniciar la instancia se ha de ejecutar el siguiente comando:
    java -cp $JENKINS_HOME/war/winstone.jar winstone.tools.WinstoneControl reload: --host=localhost --port=8001
    
  • Para parar la instancia se ha de ejecutar el siguiente comando:
    java -cp $JENKINS_HOME/war/winstone.jar winstone.tools.WinstoneControl shutdown --host=localhost --port=8001
    

Editar un libro en papel

Hay varias páginas para editar un libro, por ejemplo, escrito en word y pasado a pdf o a epub, y contratar los servicios de alguien que se encargue de editarlo.
No hace falta que escribas un best-seller, ni si quiera es necesario ponerlo a la venta. Si estás en un caso como el mío, que quieres editar un libro para tí o para tu familia, entonces, esto te puede interesar.
Existen un par de webs que se dedican a editar libros. También los puedes poner a la venta en internet, pero eso es opcional.

 Las webs son éstas:
Las dos se dedican a casi lo mismo. El siguiente artículo explica las ventajas e inconvenientes de usar uno u otro.
http://www.escritores.org/publicar/articulos-de-interes/1442-lulu-vs-bubok-mi-experiencia-

lunes, 14 de octubre de 2013

Instalación de Wordpress en Ubuntu

Primero hay que instalar wordpress en el sistema a través de paquete synaptic con el siguiente comando:

$ sudo apt-get install wordpress

Después hay que configurar el servidor apache para sea capaz de leer la ubicación de wordpress como recurso. Se supone que wordpress se ha instalado en la carpeta /usr/share/wordpress, entonces lo que hemos de hacer es indicárselo al apache en su fichero de configuración que hay que crear nuevo /etc/apache2/sites-available/wordpress.

    Alias /blog /usr/share/wordpress
    Alias /blog/wp-content /var/lib/wordpress/wp-content
    <Directory /usr/share/wordpress>
        Options FollowSymLinks
        AllowOverride Limit Options FileInfo
        DirectoryIndex index.php
        Order allow,deny
        Allow from all
    </Directory>
    <Directory /var/lib/wordpress/wp-content>
        Options FollowSymLinks
        Order allow,deny
        Allow from all
    </Directory>
Después hay que habilitar este nuevo site dentro del servidor con el siguiente comando:
$ sudo a2ensite wordpress
Y después recargar el servidor apache:
$ sudo service apache2 restart
Este artículo es el oficinal para indicar cómo se instala:
Otro artículo interesante, ya que también utilizo mediaWiki, es este otro donde dice cómo instalar mediaWiki. Para esto dedicaré un artículo entero.

jueves, 3 de octubre de 2013

Montar servidor de correo en Ubuntu

He encontrado en internet un tutorial bastante bueno.
Se instalan herramientas de ubuntu siguiente:
  1. bind9: servidor DNS.
  2. postfix: agente de transporte de correo.
  3. mailx: enviar mails mediante la línea de comando.
  4. squirrelmail: aplicación webmail en PHP.
 El link al tutorial es el que se indica a continuación:
http://www.nosolounix.com/2010/01/servidor-de-correo-en-ubuntu.html

Si sigues a pies juntillas el tutorial, vas a ver que está casi todo correcto, pero no debes poner el fichero de configuración del DNS, no es "exacto". El correcto, en mi caso y con mi nombre de dominio elegido, mi fichero ubuntu-oscarf.db es el siguiente, :

;
; BIND data file for local loopback interface
;
$TTL    86400
@       IN      SOA     ubuntu-oscarf.com. root.ubuntu-oscarf.com. (
                              1         ; Serial
                         604800         ; Refresh
                          86400         ; Retry
                        2419200         ; Expire
                         604800 )       ; Negative Cache TTL
;
@       IN      NS      ns.ubuntu-oscarf.com.
@       IN      MX      10      mail.ubuntu-oscarf.com.
ns      IN      A       192.168.1.200
mail    IN      A       192.168.1.200
www     IN      A       192.168.1.200
ubuntu  IN      A       192.168.1.200

jueves, 26 de septiembre de 2013

Despliegues con Puppet

Me acaban de comentar una herramienta que, al parecer, es bastante potente realizando despliegues en distintas máquinas. Permite automatizar tareas, crear paquetes para que sean desplegados, avisos cuando un servicio se cae, permisos para realizar esas tareas. Es algo que estaría bien investigar a ver qué tal resulta. Me han contado buenas experiencias.

Enlaces
Hay que leerlo.

miércoles, 18 de septiembre de 2013

Tutoriales de Spring

De momento, no conozco mucho el framework Spring, pero me dispongo a conocerlo ya que el proyecto en el que estoy metido está desarrollado enteramente con arquitectura Spring. Para empezar, hay un tutorial de Spring y Maven de una pequeña aplicación web que me parece interesante.

Es éste: http://hop2croft.wordpress.com/2011/09/10/ejemplo-basico-de-spring-mvc-con-maven/
Y aquí hay otro: http://kh-yiu.blogspot.com.es/2012/05/quick-tutorial-to-spring-mvc-with-maven.html

lunes, 16 de septiembre de 2013

Modificar fichero de SVN de forma individual

Existe la posibilidad en Subversion de hacer un checkout de un sólo fichero de forma individual. Pongamos por caso que tenemos una estructura muy jerarquizada de carpetas que se encuentran en un repositorio de Subversion:
http://repoSVN.server.com/svn/project/trunk/mod/comp/
Y a partir de esta ruta, tenemos muchas subcarpetas cada uno con el propósito distinto con el que ha sido creado. Imagínate que queremos cambiar un valor del fichero pom de maven de la carpeta raíz comp. Si no se pudieran modificar los ficheros de forma individual tendríamos que hacer un checkout de toda la carpeta, después modificar el fichero y finalmente hacer un commit para subir los cambios. Pues bien, lo que vamos a hacer es realizar un checkout del fichero pom.xml que deseamos modificar.
  1. Hacemos un checkout de la ruta correspondiente del repositorio de SVN donde se encuentra el fichero:
    $ svn checkout http://repoSVN.server.com/svn/project/trunk/mod/comp/ --depth empty
    Checked out revision 223.
    Lo que le hemos querido decir con el parámetro --depth y el argumento empty es decir que se convierta en una carpeta de trabajo de Subversion pero que no baje ningún fichero del repositorio. De esta manera, si inspeccionamos el contenido de esta carpeta aparece sólo la carpeta oculta de control de subversion.
  2. Hacemos un update pero sólo con el nombre del fichero que queremos descargar a la carpeta de trabajo de la siguiente manera:
    $ svn update pom.xml
    Updating 'pom.xml':
    A    pom.xml
    Updated to revision 223.
    Si observamos ahora el contenido de la carpeta, además de tener el fichero de control de subversion, tenemos sólo el fichero pom.xml.
  3. Le modificamos como sea necesario y después hacemos el commit:
    $ svn commit -m "Modificado el pom de forma individual"
    Sending        pom.xml
    Transmitting file data .
    Committed revision 224.
Resumiendo, lo que tenemos que hacer:
$ svn checkout http://repoSVN.server.com/svn/project/trunk/mod/comp/ --depth empty
Checked out revision 223.
$ svn update pom.xml
Updating 'pom.xml':
A    pom.xml
Updated to revision 223.
$ svn commit -m "Modificado el pom de forma individual"
Sending        pom.xml
Transmitting file data .
Committed revision 224.

viernes, 13 de septiembre de 2013

Publicar en Heroku

Para publicar en heroku necesitas tener una cuenta. Si estás a través de proxy, entonces lo tienes más complicado. Ahí van unas urls con información sobre cómo realizar una publicación en Heroku de una aplicación y desplegar y ejecutar.
  1. Getting Started with Heroku
  2. Getting Started with Java on Heroku
  3. Heroku through a proxy server: Si estás en un PC que se conecta a internet a través de proxy, entonces tienes un problema. Esta entrada te dice cómo configurar tu Heroku para poder hacer git push del código subido a heroku. Sin esto puedes crear aplicaciones, pero no desplegar. Yo no lo he conseguido hacer y es algo complicado. Si tú puedes, bien por tí!!!

lunes, 15 de julio de 2013

Ejecutar scripts con Cygwin

Mediante la utilidad Cygwin podemos tener un entorno Unix/Linux emulado en nuestro Windows. Una de las posibles utilidades de esto es la posibilidad de ejecutar un script bash desde Windows. Muchas veces, en cambio, necesitaremos llamar a este script desde fuera del entorno de Cygwin (por ejemplo para ejecutarlo como tarea programada). Para ello tenemos que crear un bat con las siguientes lineas.
chdir C:\cygwin\bin
bash --login -i /cygdrive/c/mi_script.sh
Si nos fijamos, es una copia del invocador cygwin.bat añadiéndo la ruta del script al final. De esta forma ya podemos ejecutar el script haciendo doble click sobre el fichero bat o ejecutando el fichero bat como tarea programada. Nota: Me he dado cuenta que el fichero del script es necesario guardarlo con formato UNIX ya que si no da problemas con los saltos de línea.

martes, 26 de febrero de 2013

Crear un evento en java

Crear un evento en java

Una clase es fuente de un evento y una o más clases pueden declararse como oyentes de ese evento. Estas clases oyentes pueden ser de los tipos más dispares, pero todas ellas deben implementar la interfaz que las define como posibles oyentes del evento. En este ejemplo, esta interfaz se llamará VariableChangeListener:
import java.util.*;
 
public interface VariableChangeListener {
  public void variableChanged(EventObject e);
}
Como puedes ver, esta interfaz sólo obliga a implementar un método, variableChanged, al que se llamará cuando se lance el evento. Este método recibe un único argumento, de tipo java.util.EventObject, que representa un objeto de estado de evento. Su función es identificar al objeto fuente del evento.
Si deseas que el objeto de estado del evento proporcione más información, te haces una subclase de ésta y ya está.
La interfaz Listener podría definir tantos métodos como eventos distintos pudiesen diferenciarse. En caso de haber un número excesivo de eventos, sería interesante crear una clase adaptadora. Pero no me meto en este jardín, porque nuestra interfaz sólo define un método.
Así que todas las clases que quieran apuntarse como oyentes del evento tendrán que implementar esta interfaz.
Por ejemplo, la clase MiClase quiere atender a eventos de este tipo:
public class MiClase implements VariableChangeListener {
  ...
  // En algún método esta clase se registra como oyente
  Variable var;
  ...
  var.addVariableChangeListener(this);
 
  // Debe implementar el método definido por la interfaz
  public void variableChanged(EventObject evt) {
    // Y actuar en consecuencia al dispararse el evento
  }
  ...
}
Bueno, y ahora queda lo divertido, que es implementar la clase fuente del evento. Es muy facilote, verás: esta clase tiene una única variable miembro (aquella cuyo valor queremos controlar). Cuando se le dé a esta variable un valor superior al límite establecido, se disparará el evento.
La clase fuente de evento debe implementar dos métodos para registrar y desregistrar oyentes del evento. El registro de un oyente, addVariableChangeListener, se limita a agregar al mismo (un objeto que, recordemos, implementa la interfaz antes definida) a una lista de oyentes. El desregistro, removeVariableChangeListener, obviamente elimina al oyente de tal lista (un objeto podría querer dejar de ser notificado de ese evento).
También implementa un método protegido (sólo lo llama la propia clase fuente o una hipotética subclase) al que se llama desde cualquier método que modifique el valor de la variable a controlar cuando supere el valor límite: notifyVariableChanged.
Te pongo la clase:
import java.util.*;
 
public class Variable {
 
  private static int LIMITE_SUP;
  private int variable;
 
  private List listeners = new ArrayList();
 
  // Métodos accesores
  public void setVariable(int variable) {
    this.variable = variable;
 
    if (this.variable > LIMITE_SUP)
      notifyVariableChanged();
  }
 
  public int getVariable() {
    return this.variable;
  }
 
  // Métodos de registro/desregistro de oyentes
  public synchronized void addVariableChangeListener(VariableChangeListener listener) {
    listeners.add(listener);
  }
 
  public synchronized void removeVariableChangeListener(VariableChangeListener listener) {
    listeners.remove(listener);
  }
 
  // Método de notificación de evento
  protected void notifyVariableChanged() {
    List lst;
    EventObject evt = new EventObject(this);
    synchronized(this) {
      lst = (List)((ArrayList)listeners).clone();
    }
 
    for (Iterator it = lst.iterator() ; it.hasNext() ; )
      ((VariableChangeListener)it.next()).variableChanged(evt);
  }
 
}
Un breve comentario sobre los métodos de registro/desregitro y el de notificación de evento: los dos primeros son sincronizados, porque se supone que se les puede invocar desde distintos objetos simultáneamente y hay que evitar pollos. El último parece complicado, pero no lo es en absoluto: se limita a invocar al método variableChanged sobre todos los objetos que hay en la lista de oyentes registrados. Pero no recorre esa lista directamente, sino un clon de la misma. Así, no hay problemas si, por ejemplo, estamos recorriendo el iterador procedente de la lista y se nos registra o desregistra un nuevo objeto como oyente del evento.

Referencias