lunes, 20 de octubre de 2008

JUnit 3.8.1 vs JUnit 4.x

JUnit es una herramienta que nos ayuda en uno de los procesos más abandonados en el desarrollo software, que es la fase de pruebas. Esta fase no suele hacerse como se debería, sino que se suelen hacer pruebas a la vez que vamos desarrollando nuestro software. Pues bien, es importante tener una fase de pruebas en todo desarrollo y esta herramienta nos hace esta tarea mucho más sencilla. De hecho existen metodologías basadas en pruebas de modo que diseñas las pruebas antes que el software y vas desarrollando supervisado a través de los test.

Bueno pues JUnit es una herramienta que desde que se publicó su versión 3.8.1 ha quedado un poco congelada. Pero recientemente el proyecto a vuelto a cobrar vida con las nuevas versiones 4.x. Estas nuevas versión introducen algunos conceptos nuevos y hacen uso de las anotaciones introducidas en la versión 1.5 de java.

A continuación, se listan las principales novedades de esta versión de JUnit respecto a versiones precedentes:
  • Es necesario utilizar la versión 5 de la JDK para ejecutar los tests.
  • Las clases de prueba no necesitan heredar de la clase junit.framework.TestCase.
  • Los métodos de inicialización y liberación pueden ser definidos con cualquier nombre siempre y cuando sean etiquetados adecuadamente con @Before y @After. Además puede existir más de un método de inicialización y liberación simultaneamente.
  • Los nombre de los métodos de prueba no necesitan contener el prefijo test, sin embargo es necesario que sean definidos con la etiqueta @Test, la cual permite ser utilizada con parámetros que enriquecen las posibilidades de la prueba.
  • Existe la posibilidad de declarar métodos de inicialización y liberación globales a la clase de pruebas mediante las etiquetas @BeforeClass y @AfterClass.
Y para terminar os pongo un mismo ejemplo desarrollado con las distintas versiones:

JUnit3.8.1

package pruebasSistemaSoftware.junit381;

import junit.framework.*;
import servidorEstadoTrafico.Registro;
import servidorEstadoTrafico.RegistroMalFormadoException;
import servidorEstadoTrafico.Tramo;

public class RegistroTest extends TestCase {

   private Registro m_registro;

   public void setUp(){
     String strCarretera ="M-40";
     String strHora="12:23:45";
     String strFecha="1/3/2007";
     String strClima="Nublado";
     String strObras = "No";

     m_registro = new Registro(strCarretera,strHora,strFecha,strClima,strObras);
     Tramo tramo1 = new Tramo("0","10","3","1","Retenciones","Sin accidentes");
     Tramo tramo2 = new Tramo("10","12","2","0","Retenciones","Sin accidentes");
     Tramo tramo3 = new Tramo("12","15","3","1","Retenciones","Sin accidentes");

     m_registro.anadirTramo(tramo1);
     m_registro.anadirTramo(tramo2);
     m_registro.anadirTramo(tramo3);
}

  public void tearDown(){

  }

  public void testComprobarFormato(){
     try{
         m_registro.comporbarFormato();
     } catch (RegistroMalFormadoException e){
       fail("Se ha originado una excepcion inesperada" + e.toString());
     }
  }

  public void testObtenerLongitud(){
     assertEquals(m_registro.obtenerLongitud(),10+2+3);
  }



JUnit 4.x

package pruebasSistemaSoftware.junit4.2;

import java.lang.*;
import java.util.*;

import org.junit.Test;
import org.junit.After;
import org.junit.Before;
import static org.junit.Assert.*;
import junit.framework.JUnit4TestAdapter;

import servidorEstadoTrafico.Registro;
import servidorEstadoTrafico.RegistroMalFormadoException;
import servidorEstadoTrafico.Tramo;

public class RegistroTest{

  private Registro m_registro;

  @Before public void inicializar(){
     String strCarretera = "M-40";
     String strHora="12:23:45";
     String strFecha="1/3/2007";
     String strClima="Nublado";
     String strObras = "No";

     m_registro = new Registro(strCarretera,strHora,strFecha,strClima,strObras);
     Tramo tramo1 = new Tramo("0","10","3","1","Retenciones","Sin accidentes");
     Tramo tramo2 = new Tramo("10","12","2","0","Retenciones","Sin accidentes");
     Tramo tramo3 = new Tramo("12","15","3","1","Retenciones","Sin accidentes");

     m_registro.anadirTramo(tramo1);
     m_registro.anadirTramo(tramo2);
     m_registro.anadirTramo(tramo3);

  }

  @After public void liberar(){
  }

  @Test(expected=RegistroMalFormadoException.class)
  public void comprobarFormato() throws RegistroMalFormadoException {
     m_registro.comprobarFormato();
  }

  @Test(timeout=1000)
  public void obtenerLongitud(){
    assertEquals(m_registro.obtenerLongitud(),10+2+3);
  }

}

Ejemplos extraidos del libro "Pruebas de Software y JUnit Un análisis en profundidad y ejemplos prácticos"

Plantilla Ant

Bueno como todos ya conoceréis Ant es una herramienta desarrollada integramente en java y que sirve para automatizar el proceso de compilación, despliegue, generación de documentación etc ... Estas y otras muchas son tareas que debemos repetir multiples veces. Bueno pues esta herramienta ha sido pensada de forma que tu describes un fichero xml que por norma general suele llamarse build.xml, en el que describes los pasos que quieres realizar una vez hayas modificado el código. De esta forma podremos desplegar nuestra aplicación tantas veces como queramos en el servidor bajando el fuente desde un ftp o un subversion y todo ejecutando en el directorio el comando "ant" (seguido del nombre del fichero de descripción en el caso de que no sea build.xml).

Bueno pues voy a poneros una plantilla que va a recoger todas estas tareas:

-Limpiar: Se eliminan los directorios que contienen las clases compiladas y la documentación que pudo ser generrada anteriormente. Se eliminan ambos a la vez para que no exista una versión de documentación que no se corresponda con las clases compiladas y viceversa.

-Compilar: En la primera de sus tareas se crea, si no existe, el directorio donde se guardarán las clases compiladas. El directorio no existirá porque se ha eliminado con el objetivo limpiar, del cual depende compilar. La segunda tarea compila las clases, situadas en ${src} y almacena los resultados de la compilación en el directorio ${build}. Para ello utiliza el classpath definido en la propiedad ${classpath}.

-Jar: Se genera un archivo .jar con todas las clases presentes een el directorio ${destino} (build). Esta tarea depende del objetivo compilar para garantizar que existan clases compiladas en este directorio antes de intentar generar el archivo .jar.

-Documentar: En la primera tarea se crea, si no existe, el directorio donde se guardará la documentación generada. El directorio no existirá porque se ha eliminado con el objetivo limpiar, del cual depende compilar. La segunda tarea genera la documentación del proyecto.

-Main: Se ejecutan todos los objetivos para crear el programa y dejarlo listo para ser ejecutado.

<project name="Proyecto_basico" default="main" basedir=".">

   <!-- propiedades globales del proyecto -->
   <!-- definición de directorios que se van a usar-->
   <property name="src" value="."/>
   <property name="build" value="build"/>
   <property name="doc" value="doc"/>

  <!-- caracteristicas del proyecto-->
  <property name="classpath" value="./lib/misclases.jar"/>

  <target name="limpiar">
    <delete dir="$"/>
     <delete dir="${doc}"/>
  </target>

  <target name="compilar" depends="limpiar">
     <mkdir dir="${build}"/>
     <javac srcdir="${src}" destdir="${build}" classpath="${classpath}"/>
  </target>

  <target name="jar" depends="compilar">
     <jar jarfile="clases.jar" basedir="${build}" includes="**"/>
  </target>

  <target name="documentar" depends="limpiar">
     <mkdir dir="${doc}"/>
     <javadoc packagenames="proyectobasico" sourcepath="${src}" destdir="${doc}"/>
  </target>

  <target name="main" depends="compilar,documentar">
  </target>

</project>

Bueno espero que os sirva para describir vuestros proyectos si en algún momento no recordáis la sintaxis de Ant.

jueves, 2 de octubre de 2008

Comprimir y descomprimir en Linux

Como siempre los artículos que publico son a modo de recordatorio, de forma que este blog es como una guía para el día a día. Hoy he encontrado un artículo en (http://stolz.gsmlandia.com), que creo muy interesante y necesario, descomprimir y comprimir ficheros en linux desde línea de comandos.

Comprimir y descomprimir archivos en Linux desde la línea de comandos es algo habitual y siempre viene bien tener a mano un pequeño resumen de cómo hacerlo.

Los típicos

Ficheros .tar

tar empaqueta varios archivos en uno solo, pero no comprime.
  • Instalar la herramienta: # emerge -n tar

  • Empaquetar: # tar cf archivo.tar ficheros

  • Desempaquetar: # tar -xvf archivo.tar

  • Ver contenido: # tar -tf archivo.tar

Ficheros .gz

gzip sólo comprime fichero a fichero, no empaqueta varios ficheros en uno ni comprime directorios.
  • Instalar la herramienta: # emerge -n gzip

  • Comprimir: # gzip fichero

  • Descomprimir: # gzip -d fichero.gz

Ficheros .bz2

bzip2 sólo comprime fichero a fichero, no empaqueta varios ficheros en uno ni comprime directorios.
  • Instalar la herramienta: # emerge -n bzip2

  • Comprimir: # bzip2 fichero

  • Descomprimir: # bzip2 -d fichero.bz2

Para comprimir varios ficheros y archivarlos en uno solo, al estilo de los compresores zip o rar hay que combinar tar con gzip o con bzip2 como muestro a continuación.

Ficheros .tar.gz

  • Comprimir: # tar -czf archivo.tar.gz ficheros

  • Descomprimir: # tar -xvzf archivo.tar.gz

  • Ver contenido: # tar -tzf archivo.tar.gz

Ficheros .tar.bz2

  • Comprimir: # tar -c ficheros | bzip2 > archivo.tar.bz2

  • Descomprimir: # bzip2 -dc archivo.tar.bz2 | tar -xv

  • Ver contenido: # bzip2 -dc archivo.tar.bz2 | tar -t

Ficheros .zip

  • Instalar las herramientas: # emerge -n zip unzip

  • Comprimir: # zip archivo.zip ficheros

  • Descomprimir: # unzip archivo.zip

  • Ver contenido: # unzip -v archivo.zip

Ficheros .rar

  • Instalar la herramienta: # emerge -n rar

  • Comprimir: # rar a archivo.rar ficheros

  • Descomprimir: # rar x archivo.rar

  • Ver contenido: # rar l archivo.rar o # rar v archivo.rar

Los no tan típicos

Ficheros .lha

  • Instalar la herramienta: # emerge -n lha

  • Comprimir: # lha a archivo.lha ficheros

  • Descomprimir: # lha x archivo.lha

  • Ver contenido: # lha v archivo.lha o # lha l archivo.lha

Ficheros .arj

  • Instalar las herramientas: # emerge -n arj unarj

  • Comprimir: # arj a archivo.arj ficheros

  • Descomprimir: # unarj archivo.arj o # arj x archivo.arj

  • Ver contenido: # arj v archivo.arj o # arj l archivo.arj

Ficheros .zoo

  • Instalar la herramienta: # emerge -n zoo

  • Comprimir: # zoo a archivo.zoo ficheros

  • Descomprimir: # zoo x archivo.zoo

  • Ver contenido: # zoo L archivo.zoo o # zoo v archivo.zoo

Ahora que sabes como compimir directorios, recuerda hacerte una copia de seguridad de tu sistema :)

lunes, 29 de septiembre de 2008

Configuración de SSH en debian

Lo primero que hacemos es instalar el SSH

#apt-get install ssh

Luego de la instalación buscamos el archivo de configuración sshd_config que esta en

# vi /etc/ssh/sshd_config

(Nota. no confundir con el fichero ssh_config)

Agregamos o modificamos las siguientes entradas en el archivo


Parámetro Port
Si fuera necesario por seguridad se puede cambiar el puerto por el cual escucha el SSH

Port 54321

Parámetro ListenAddress
Especificamos bajo que direcciones intefaces responderá las peticiones

ListenAddress 10.0.0.5

Parámetro PermitRootLogin
Especificamos si el superusuario podrá conectarse mediante SSH

PermitRootLogin no

Parámetro X11Forwarding
Especificamos si es necesario que se ejecuten aplicaciones gráficas mediante SSH

X11Forwarding no

Parámetro AllowUsers
Especificamos que usuarios se conectarán mediante SSH

AllowUsers espiridion, cascajo, pully

Tambien se puede restringir el acceso por usuario y host

AllowUsers espiridion@192.168.0.55 cascajo@192.168.5.22

Reiniciamos el SSH

#/etc/init.d/ssh restart

domingo, 28 de septiembre de 2008

Cómo llamar al recolector de basura JAVA

     He encontrado un árticulo muy bueno en (http://www.programacion.com/) que te comenta cosas 

tan olvidadas para los programadores de lenguajes como JAVA, en la que nos olvidamos de la 

destrucción de objetos, ya que el recolector de basura lo hace supuestamente por nosotros. 


Forzar la Finalización y la Recolección de Basura

El sistema de ejecución de Java realiza las tareas de manejo de memoria por tí. Cuando un programa ha terminado de utilizar un objeto-- esto es, cuando ya no hay más referencias a ese objeto- el objeto es finalizado y luego se recoge la basura.

Estas tareas suceden asíncronamente en segundo plano. Sin embargo, se puede forzar la finalización de un objeto y la recolección de basura utilizando los métodos apropiados de la clase System.

. Finalizar Objetos

Antes de recolectar la basura de un objeto, el sistema de ejecución de Java le da la oportunidad de limpiarse a sí mismo. Este paso es conocido como finalización y se consigue mediante una llamada al método finalize() del objeto. El objeto debe sobreescribir este método para realizar cualquier tarea de limpieza final como la liberación de recursos del sistema como ficheros o conexiones. Para más informaciónsobre el método finalize() puedes ver: Escribir un método finalize().

Se puede forzar que ocurra la finalización de un objeto llamando al método runFinalization() de la clase System.

System.runFinalization();

Este método llama a los métodos finalize() de todos los objetos que están esperando para ser recolectados.

. Ejecutar el Recolector de Basura

Se le puede pedir al recolector de basura que se ejecute en cualquier momento llamando al método gc() de la clase System.

System.gc();

Se podría querer ejecutar el recolector de basura para asegurarnos que lo hace en el mejor momento para el programa en lugar de hacerlo cuando le sea más conveniente al sistema de ejecución.

Por ejemplo, un programa podría desear ejecutar el recolector de basura antes de entrar en un cálculo o una sección de utilización de memoria extensiva, o cuando sepa que va a estar ocupado algun tiempo. El recolector de basura requiere unos 20 milisegundos para realizar su tarea, por eso un programa sólo debe ejecutarlo cuando no tenga ningún impacto en su programa -- esto es, que el programa anticipe que el recolector de basura va a tener tiempo suficiente para terminar su trabajo.

Plantilla MIDlet J2ME

Como todos conocéis J2ME es la tecnología de Sun Microsystems para dispositivos empotrados. Se entienden como tal los dispositivos Moviles, PDAS, PocketPC, Video, Decodificadores, Lavadoras etc...

Bueno pues os cuento un poco de historia. Dentro de J2ME existe 2 configuraciones:

CLDC: Connected Limited Device Configuration, para dispositivos con muy pocos recursos como móviles, PDAs ...

CDC: Connected Device Configuration, para dispositivos con altos recursos como el decodificador de antena.

Y ahora dentro de cada Configuración tenemos distintos perfiles (profile):

Para trabajar con dispositivos moviles por tanto nos centraremos en la configuración CLDC con el perfil MIDP que actualmente va por su versión 2.0.

Bien pues las aplicaciones MIDP se llaman MIDlets por afinidad con los APPlets. Pues aquí os dejo la plantilla que nos ayudará a empezar a programar nuestro MIDlet, el "Hola mundo":

import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;

public class HolaMundo extends MIDlet{

//Atributos
private Display pantalla;
private Form formulario = null;

//Constructor
public HolaMundo(){
pantalla = Display.getDisplay(this);
formulario = new Form(“Hola Mundo”);
}

public void startApp(){
pantalla.setCurrent(formulario);
}

public void pauseApp(){
}

public void destroyApp(boolean unconditional){
pantalla = null;
formulario = null;
notifyDestroyed();
}
}

Convierte tu viejo Windows XP en un MacosX tiger

Esta semana bicheado cosas por la red, he encontrado una herramienta que cambia totalmente tu windows XP y lo convierte en un Tiger. Es increible porque no estamos hablando de un simple skin. Estamos hablando de una transformación completa con el famoso Dock de MacosX o una utilidad llamada spysearch para búsquedas indexadas.

Os podéis hacer una idea del cambio brutal que hace en el sistema por lo que recomiendo que hagáis un punto de retorno antes de instalarlo pero no os preocupéis porque al instalarlo el se encarga de hacerlo.

Podéis encontrar el link para descargar:

http://www.flyakiteosx.com/


http://osx.portraitofakite.com/

jueves, 19 de junio de 2008

Comandos de consola en Windows XP

Alguna vez que otra he tenido que montar un servidor IIS sobre un windows server. Todo esto porque a alguien se le ocurre que el lenguaje ASP es un bueno lenguaje para desarrollar páginas webs :S. Bueno cuando te encargan una tarea de estas, andas muy perdido ya que en un windows todo lo sabes hacer a través del entorno gráfico, pues bien aquí os dejo una lista de comandos de consola muy útiles que no servirán para trabajar más comodamente e incluso sin tener que arrancar un escritorio remoto, sino a través de un Openssh por ejemplo.


subst x: c:\carpeta: Crea una unidad virtual a través de una carpeta.

Archivos y sistemas de ficheros

cacls: Permite modificar los permisos en ficheros y carpetas, permitiendo o prohibiendo a cada usuario leer, escribir o modificar el contenido de dichos archivos o carpetas.

chkdsk: Comprueba el estado de una partición y repara los daños en caso de que encuentre alguno. Si lo ponemos sin ningún parámetro simplemente escaneará la partición, si queremos que además corrija los errores, deberemos añadir la opción /F, es decir, chkdsk /F.

cipher: Permite cifrar archivos, directorios o particiones siempre que se encuentren en el sistema de archivos NTFS.

comp: Compara archivos o carpetas y muestra las diferencias existentes entre ellos.

compact: Permite comprimir archivos o carpetas para ahorrar espacio en el disco duro. Para comprimir los archivos deberemos utilizar el modificador /c y para descomprimirlo en modificador /u. Por ejemplo, para comprimir la carpeta c:\pruebas debemos utilizar el comando compact /c c:\pruebas y para descomprimirla compact /u c:\pruebas.

convert: Convierte particiones FAT ó FAT32 a NTFS. Antes de utilizar este comando es recomendable realizar una copia de seguridad puesto que es posible que durante la conversión se pierdan datos.

defrag: Desfragmenta los archivos de una unidad, similar a la utilidad Defragmentador de discos de Windows pero en modo consola.

diskpart: Permite crear, eliminar y administrar particiones. Este programa en modo consola debemos utilizarlo con cuidado puesto que es fácil que eliminemos sin darnos cuenta todo el contenido del disco duro o de la partición activa.

find y findstr: Estos comandos buscan cadenas de textos en el interior de uno o varios archivos. Sin embargo, el comando findstr ofrece más opciones de búsqueda que el comando find.

iexpress: Este comando lanzará un asistente para crear archivos comprimidos .CAB autodescomprimibles.

openfiles: Muestra a un administrador los archivos abiertos en un sistema a un administrador y permite desconectarlos si se han abierto a través de red.

Configuración del sistema

bootcfg: Permite ver y modificar las entradas del archivo boot.ini. Estas entradas nos permiten seleccionar con que sistema operativo deseamos iniciar el equipo.

control userpasswords2: Permite modificar las claves y los permisos de los diferentes usuarios, así como requerir la pulsación de control+alt+suprimir para poder iniciar sesión, haciendo el inicio de sesión más seguro.

driverquery: Hace un listado de todos los drivers instalados en el sistema y muestra información sobre cada uno de ellos.

dxdiag: Lanza la herramienta de diagnóstico de Direct X, con la cual podremos comprobar la versión Direct X que tenemos instalada y permite comprobar mediante tests que todo lo referente a estos controladores funcione correctamente.

gpresult: Muestra información sobre las políticas de grupo aplicadas a un usuario.

gpupdate: Vuelve a aplicar las políticas de grupo.

msconfig: Desde esta aplicación en modo gráfico podremos seleccionar que programas y servicios se cargan durante el inicio de Windows así como los sistemas operativos que el usuario puede seleccionar para iniciar el ordenador.

pagefileconfig: Permite configurar el archivo de paginación de Windows.

prncnfg: Muestra información sobre las impresoras instaladas

prnjobs: Muestra información sobre los trabajos de impresión en cola.

reg: Permite ver y modificar valores del registro de Windows. Las opciones posibles son:

reg query => realiza una consulta en el registro

reg add => añade una entrada al registro

reg delete => elimina una clave del registro

reg copy => copia una clave del registro a otra parte del registro o a otro equipo

reg save => guarda una parte del registro en un archivo

reg restore => restaura una parte del registro de un archivo

reg load => carga una clave o árbol al registro desde un archivo

reg unload => descarga una clave o árbol del registro

reg compare => compara varios valores del registro

reg export => exporta el registro o parte del registro a un archivo

reg import => importa el registro o parte del registro de un archivo

regedit: Editor del registro en modo gráfico.

sc: Este commando nos permite administrar los servicios, ya sea iniciar uno, detenerlo, mandarle señales, etc.

sfc: Este comando permite buscar archivos del sistema dañados y recuperarlos en caso de que estén defectuosos (es necesario el CD de instalación del sistema operativo para utilizarlo). Para realizar una comprobación inmediata, deberemos ejecutar la orden sfc /scannow.

systeminfo: Muestra información sobre nuestro equipo y nuestro sistema operativo: número de procesadores, tipo de sistema, actualizaciones instaladas, etc.

taskkill: Permite eliminar un proceso conociendo su nombre o el número del proceso (PID).

tasklist: Realiza un listado de todos los procesos que hay. Útil si deseamos eliminar un proceso y no conocemos exactamente su nombre o su PID.

Redes

arp: Muestra y permite modificar las tablas del protocolo ARP, encargado de convertir las direcciones IP de cada ordenador en direcciones MAC (dirección física única de cada tarjeta de red).

ftp: Permite conectarse a otra máquina a través del protocolo FTP para transferir archivos.

getmac: Muestra las direcciones MAC de los adaptadores de red que tengamos instalados en el sistema.

ipconfig: Muestra y permite renovar la configuración de todos los interfaces de red.

nbtstat: Muestra las estadísticas y las conexiones actuales del protocolo NetBIOS sobre TCP/IP, los recursos compartidos y los recursos que son accesibles.

net: Permite administrar usuarios, carpetas compartidas, servicios, etc. Para un listado completo de todas las opciones, escribir net sin ningún argumento. Para obtener ayuda sobre alguna opción en concreto, escribier net help opción.

netsh: Este programa en modo consola permite ver, modificar y diagnosticar la configuración de la red

netstat: Mediante este comando obtendremos un listado de todas las conexiones de red que nuestra máquina ha realizado.

nslookup: Esta aplicación se conecta a nuestros servidores DNS para resolver la IP de cualquier nombre de host. Por ejemplo, si ejecutamos nslookup y escribimos www.xdireccion.com, nos responderá con algo como:

Respuesta no autoritativa:
Nombre: www.xdireccion.com
Address: 217.76.130.250


Esto quiere decir que la dirección webwww.xdireccion.com corresponde con la IP 217.76.130.250.

pathping: Muestra la ruta que sigue cada paquete para llegar a una IP determinada, el tiempo de respuesta de cada uno de los nodos por los que pasa y las estadísticas de cada uno de ellos.

ping: Poniendo detrás del comando ping el nombre o la dirección IP de la máquina, por ejemplo ping 192.168.0.1 enviaremos un paquete a la dirección que pongamos para comprobar que está encendida y en red. Además, informa del tiempo que tarda en contestar la máquina destino, lo que nos puede dar una idea de lo congestionada que esté la red.

rasdial: Permite establecer o finalizar una conexión telefónica.

route: Permite ver o modificar las tablas de enrutamiento de red.

tracert: Muestra el camino seguido para llegar a una IP y el tiempo de respuesta de cada nodo.


Varios

at: Permite programar tareas para que nuestro ordenador las ejecute en una fecha o en un momento determinado.

logoff:: Este comando nos permite cerrar una sesión iniciada, ya sea en nuestro ordenador o en otro ordenador remoto.

msg:: Envía un mensaje a unos o varios usuarios determinados mediante su nombre de inicio de sesión o el identificador de su sesión

msiexec:: Permite instalar, desinstalar o reparar un programa instalado mediante un paquete MSI (archivos con extensión .msi).

runas: Permite ejecutar un programa con privilegios de otra cuenta. Útil por ejemplo si estamos como usuario limitado y queremos hacer algo que necesite privilegios de administrador.

shctasks: Permite administrar las tareas programadas.

shutdown: Permite apagar, reiniciar un ordenador o cancelar un apagado. Es especialmente útil si hemos sido infectado con el virus Blaster o una de sus variantes para cancelar la cuenta atrás. Para ello, tan sólo tendremos que utilizar la sintaxis shutdown -a.


Microsoft Management Console (MMC)

Estos comandos nos darán acceso a distintas partes de la Microsoft Management Console, un conjunto de pequeñas aplicaciones que nos permitirán controlar varios apartados de la configuración de nuestro sistema operativo.

Para acceder a estas opciones, no es necesario entrar en la consola del sistema (cmd.exe), sino que basta con introducirlos directamente desde inicio - ejecutar.

ciadv.msc: Permite configurar el servicio de indexado, que acelera las búsquedas en el disco duro.

compmgmt.msc: Da acceso a la Administración de equipos, desde donde podemos configurar nuestro ordenador y acceder a otras partes de la MMC.

devmgmt.msc:: Accede al Administrador de dispositivos.

dfrg.msc: Desfragmentador del disco duro.

diskmgmt.msc: Administrador de discos duros.

fsmgmt.msc: Permite administrar y monitorizar los recursos compartidos.

gpedit.msc: Permite modificar las políticas de grupo.

lusrmgr.msc: Permite ver y modificar los usuarios y grupos locales.

ntmsmgr.msc: Administra y monitoriza los dispositivos de almacenamientos extraíbles.

ntmsoprq.msc: Monitoriza las solicitudes del operador de medios extraíbles.

perfmon.msc: Monitor de rendimiento del sistema.

secpol.msc: Configuración de la política de seguridad local.

services.msc: Administrador de servicios locales.

wmimgmt.msc: Configura y controla el servicio Instrumental de administración (WMI) de Windows.

miércoles, 28 de mayo de 2008

Configuración de Apache, Mod_JK y glassfish

A menudo se suele usar un apache como servidor de aplicaciones que redirecciona las peticiones a nuestro glassfish con nuestra aplicación J2EE. ¿Porqué se hacer esto? pues puede que tengas varios servicios en esa misma máquina, imaginate que quieres tener un servicio en php que va de sobra con un apache por el puerto 80, pero ahora necesitas colgar el nuevo servicio en J2EE para lo que apache no da soporte. Tambíen destacar que la gestión de peticiones y la compresión del tráfico de datos es mucho más eficiente en apache que en glassfish, por este motivo mucha gente suele usar estos dos servidores web en conjunción para trabajar. Y Mod_jk no es más que el modulo que nos permitira conectar apache y glassfish.


Instrucciones paso a paso:

a) aptitude install apache2 libapache2-mod-jk

b) Descargar:
http://java.net/download/javaee5/v2ur2/promoted/Linux/glassfish-installer-v2ur2-b04-linux.jar

c) Seguir estos pasos:
Establecer JAVA_HOME al JDK que tengamos.
Lanzar:
% sudo java -Xmx256m -jar glassfish-version-que-seea.jar
Esto descomprime el glassfish y crea una nueva estructura.
% cd glassfish
Damos permisos al ant de glassfish:
% chmod -R +x lib/ant/bin
% lib/ant/bin/ant -f setup.xml

Si queremos soporte a clustering (garantizaría disponibilidad absoluta del servicio), cambiamos lo anterior por:
% lib/ant/bin/ant -f setup-cluster.xml

d) Abrimos /etc/apache/httpd.conf y le copiamos estas líneas:

JkWorkersFile /etc/apache2/worker.properties
# Where to put jk logs
JkLogFile /var/log/apache2/mod_jk.log
# Set the jk log level [debug/error/info]
JkLogLevel debug
# Select the log format
JkLogStampFormat "[%a %b %d %H:%M:%S %Y] "
# JkOptions indicate to send SSL KEY SIZE,
JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories
# JkRequestLogFormat set the request format
JkRequestLogFormat "%w %V %T"
# Send all jsp requests to GlassFish
JkMount /*.jsp worker1
# Enviar peticiones de clg-web a Glassfish
#JkMount /clg-web/* worker1
JkMount /* worker1

e) ahora descargamos una instalación de tomcat exclusivamente para copiar el archivo tomcat-ajp.jar
Pensé que podría descargarlo de aquí (tomcat6), por aquello de ser una versión más nueva:
http://ftp.udc.es/apache-dist/tomcat/tomcat-6/v6.0.16/bin/apache-tomcat-6.0.16.tar.gz
Pero no trae el archivo tomcat-ajp.jar, así que lo sacamos de aquí:
wget http://archive.apache.org/dist/tomcat/tomcat-5/v5.5.16/bin/apache-tomcat-5.5.16.tar.gz

f) Copiamos esto:
/opt/glassfish/lib# cp /opt/apache-tomcat-5.5.16/server/lib/tomcat-ajp.jar .

g) Hacemos lo mismo con:
http://apache.rediris.es/commons/logging/binaries/commons-logging-1.1.1-bin.tar.gz
Y luego:
/opt/glassfish/lib# cp //tmp/commons-logging-1.1.1/commons-logging-1.1.1.jar commons-logging.jar
Y lo mismo con:
http://apache.rediris.es/commons/modeler/binaries/commons-modeler-2.0.1.tar.gz
Y con:
/opt/glassfish/lib# cp /tmp/commons-modeler-2.0.1/commons-modeler-2.0.1.jar commons-modeler.jar

g) Por último, habilitamos mod_jk, arrancando primero Glassfish (asadmin start-domain domain1)y luego:

asadmin create-jvm-options -Dcom.sun.enterprise.web.connector.enableJK=8009

domingo, 18 de mayo de 2008

Integrar Spring con Struts

¿Cómo podemos usar Spring como framework para la capa de negocio y struts para la presentación?

El problema radica en que Spring es un framework empresarial "ligero". De esta forma, su tecnología IoC (inyección de dependencias) solo tiene alcance en el propio framework Spring y no inyecta dependencias en Struts. Si no inyecta dependencias en Struts, ¿como podemos desde struts llamar a los métodos de negocio implementados por Spring? En este tutorial intentaremos dar respuesta a esta pregunta. Tenemos el fichero de configuración de Struts que tendrá la información pertinente a los ActionForm y los Action, principalmente, junto con otra información adicional como los global-exceptions, etc., el fichero de configuración de struts (struts-config.xml) ¡no es necesario tocarlo con este método que vamos a mostrar para integrar struts con spring!.

El único fichero que tocaremos será web.xml.

Pero antes de nada, vamos por partes:

1) Lo primero es tener el fichero de configuración de Spring que tendrá una pinta como esta (versión 2.5)




xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd">





Podemos comprobar como se han activado con la línea el manejo de las anotaciones de las clases para que quede al más puro estilo EJB3. De este modo, las clases de negocio de Spring basta con anotarlas con @Service, por ejemplo:

/* Interfaz de negocio (el equivalente al @Local de EJB, nótese que no requiere anotación en Spring) */
package com.myapp.negocio;

public interface IUnServicio {

boolean login(String user, String pass);

}

/* Implementación de la interfaz, note que para indicarle a Spring que es un objeto de negocio se usa la anotación @Service (sería el "equivalente" a @Stateless de EJB3) */
package com.myapp.negocio;

import org.springframework.stereotype.Service;

@Service
public class UnGranServicioBean implements IUnServicio {
public boolean login(String user, String pass) {
return user.equals("jjj") && pass.equals("mmm");
}
}

Siguiendo con el fichero de configuración de Spring, la línea le indica a Spring que rastree todas las clases del paquete indicado en el atributo "package" en busca de aquellas que estén anotadas (en nuestro caso con @Service, aunque serviría @Component y @Repository) y mantenerlas (posibilidad de inyección de dependencias en otras clases, etc.,).

La última línea del fichero de configuración indica que se active la programación orientada a Aspectos (implementada por AspectJ que es el framework dónde se apoya Spring). De este modo si se encuentran Aspectos se compilan y tejen como si usáramos AspectJ.

Hay que tener en cuenta que para activar AspectJ necesitamos tener dicha librería en el PATH. En el framework de Spring si nos lo bajamos con las dependencias tenemos en la carpeta LIB el jar correspondiente a AspectJ por lo que en teoría no deberíamos de bajarnos nada más. Para integrar AspectJ con Spring basta con añadir al PATH una librería más, la librería correspondiente a AspectJ que se encuentra en la subcarpeta Module del framework de Spring.

Con el fichero de configuración de Spring, Struts y los @Service listos junto con las librerías de Spring necesarias, basta añadir las siguientes líneas al fichero web.xml para integrar Spring con Struts:



org.springframework.web.context.ContextLoaderListener


¿Cómo accedo, por tanto, al ApplicationContext de Spring para obtener los objetos de negocio?

Basta con cambiar la clase que hereda los Action por ActionSupport. Por ejemplo:

package com.myapp.struts;

import com.myapp.negocio.IUnServicio;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionForward;
import org.springframework.web.struts.ActionSupport;

// Nota como la clase que hereda es ActionSupport en vez del clásico Action de Struts.
public class LoginAction extends ActionSupport {

private final static String SUCCESS = "success";

public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
IUnServicio servicio = (IUnServicio) this.getWebApplicationContext().getBean("unServicio");
return mapping.findForward(SUCCESS);

}
}

Esta ActionSuppor nos permite sacar el contexto de Spring con getWebApplicationContext() y ahora si podemos sacar los objetos de negocio.

El nombre del objeto de negocio es el nombre de la interfaz en minúscula la primera letra. Por ejemplo, si nuestra interfaz se llama MiInterfaz, tendremos que preguntar por getWebApplicationContet().getBean("miInterfaz"). También hay que tener en cuenta que si seguimos la convención de que los nombres de las interfaces empiecen por 'I' latina mayúscula, Spring la omite para el nombre. De este modo, la interfaz IMiInterfaz la conseguiremos del mismo modo que MiInterfaz, preguntando por "miInterfaz".

Existen más métodos para integrar Struts con Spring. Este método es el más sencillo pero provoca que se acoplen Spring y Struts. Esto no debería ser un problema si la apuesta es segura. Los otros métodos requieren cambiar muchos parámetros de los ficheros de configuración de ambas herramientas lo que provoca, finalmente, que se acoplen a nivel de ficheros de configuración, por lo que personalmente prefiero este método que para desacoplar si, por ejemplo, se decide usar EJB en vez de Spring, bastaría con renombrar los ActionSupport por Action (un simple Replace All en cualquier IDE) y eliminar la línea de de web.xml.

Conexión a Base de datos con Java

Hay algunas aplicaciones chorras que tenemos que hacer de vez en cuando, que necesitan hacer una conexión a una bbdd y debido a lo pequeñas que son no merece la pena usar un motor de persistencia del tipo hibernate o toplink. En estos casos es importante tener claro como hacer conexiones a pelo desde java contra una bbdd con jdbc.

En este tutorial pongo el codigo java para hacer una conexión a una bbdd MYSQL y lanzar algunas consultas.

Codigo java

(Para que este codigo os funcione teneis que añadir el conector jdbc para mysql, en el caso de usar otra bbdd simplemente con cambiar el connector o driver es suficiente para que funcione. Lo interesante de jdbc es que nos hace de fachada y nos permite conectarnos de la misma forma con cualquier base de datos)

-----------------------------------------------------------------------------

import java.sql.*;


public class Connect
{
public static void main (String[] args)
{
Connection conn = null;

try
{
String userName = "nombre_usuario";
String password = "password_usuario";
String url = "jdbc:mysql://localhost/nombre_bbdd";
Class.forName ("com.mysql.jdbc.Driver").newInstance ();
conn = DriverManager.getConnection (url, userName, password);
System.out.println ("Database connection established");

Statement s = conn.createStatement ();
int count;
count= s.executeUpdate(
"INSERT INTO revistas (idrevista, fecha, titulo , destino)"
+ " VALUES"
+ "('78','2007-11-22','esto va a pelo','va a pelitooo')");
s.close ();
System.out.println (count + " rows were inserted");

}
catch (Exception e)
{
System.err.println ("Cannot connect to database server");
e.printStackTrace();
}
finally
{
if (conn != null)
{
try
{
conn.close ();
System.out.println ("Database connection terminated");
}
catch (Exception e) { /* ignore close errors */ }
}
}
}
}

--------------------------------------------------------------------------

Espero que os sirva ;)

Configurar java en ubuntu

Tengo muchos amigos, en el trabajo que se vuelven locos instalando java. Y mira que es la cosa más tonta del mundo incluso te puedes bajar el Automatix que te lo instala solo. Ahora que ocurre cuando tienes varias versiones de java instaladas. Ohhh no tengo instalada la versión ultima de java pero me sigue saliendo la version 1.4.2 que viene por defecto con el sistema operativo. Oh no el eclipse no me arranca.... Bien pues os mostraré el super comando que lo arregla, y es que con poner en la consola:

> sudo update-alternatives --config java

Os saldran en forma de lista todas las versiones de java que tengais instalados en la maquina y simplemente seleccionado su numeración se configura el sistema para usar dicha versión.

Espero que os sea tan util como a mi ;)

Comandos de interés IV - SVN

Subversión es el sistema de control de versiones probablemente más usado, pero una vez que te acostumbras a trabajar con él, solo te dedicas a hacer update o commit. Bien pues esto es una vez que ya esta todo configurado, por ello creo interesante hacer este articulo sobre los comandos más usados en SVN a nivel de administrador, ya que se usan en contadas ocasiones y nunca las recuerdas por lo que tener una guía rápida donde mirar siempre viene bien

Espero que os sirva a todos también.

Crear un repositorio nuevo

svnadmin create nombre_repositorio

Añadir un árbol de directorios al repositorio

svn import path_al_directorio nombre_repositorio

Obtener una copia de trabajo

svn checkout file:///nombre_repositorio/dir directorio_de_trabajo

Obtener una copia sin control de versiones

svn export file:///nombre_repositorio/dir directorio_destino

Hacer una copia de seguridad de todo el repositorio

svnadmin dump nombre_repositorio > ficheroBackup

Restaurar una copia de seguridad en un nuevo repositorio

svnadmin create nombre_nuevo_repositorio
svnadmin load nombre_nuevo_repositorio < ficheroBackup

Ver el estado actual de la copia de trabajo

svn status

Añadir nuevos ficheros o directorios

svn add nombre_fichero

Eliminar ficheros

svn del nombre_fichero --force

Actualizar la copia de trabajo con los últimos cambios en el repositorio

svn update

Actualizar el repositorio con los cambios de tu copia de trabajo

svn commit -m "Mensaje para etiquetar los cambios"

Permitir accesos anónimos al repositorio (si se usa svnserve)

Editar el fichero nombre_repositorio/conf/svnserve.conf y descomentar según proceda las lineas:

# anon-access = read
# auth-access = write
NOTA: Sustituir file:/// por svn:///SERVIDOR si los repositorios están en otra máquina y se está usando svnserve.

SSH en windows

Hola a todos, como ya sabreis el protocolo SSH es una tonteria instalarlo en un linux, pero no en windows, existen todos los clientes que quieras pero los servidores suelen ser de pago.

Muchas veces ahi que copiar ficheros de un linux a un windows o viceversa y el protocolo SSH suele ser uno de los métodos más seguro.

En este tutorial os explicaré como instalar un servidor SSH en windows totalmente gratuito.





Lo primero que vamos a hacer es bajarnos el fichero de instalación de OpenSSH, que es la implementación libre, la cual dispone de una implementación sobre windows, aunque cuando lo instaleis podréis ver que es una emulación del ssh en linux.

http://sshwindows.sourceforge.net/

Descargais el ejecutable y lo instalais como cualquier juego que se instala en windows ;)

He podido comprobar que las ultimas versiones de OpenSSH para windows ya te configuran las variables de entorno y te crean el par de claves y llaves, por lo que no tenemos que preocuparnos por estos temas

Bien pues si comprobais la instalación vereis una estructura de carpetas muy similar a la de un linux, por eso podriamos decir que se está emulando este servicio.

Para poder tener acceso al servicio ssh necesitamos autenticar los usuarios para ello, cogeremos tomaremos todos los usuarios de la maquina windows y los exportaremos para OpenSSH:

en la carpeta /bin

> mkpasswd -l -u [usuario_del_sistema_windows] >> ..\etc\passwd (1 vez por cada usuario)

>mkgroup -l >> ..\etc\group (esto copia todos los grupos)

Bien, pues por ultimo arrancamos el servicio ssh.

>C:\net start opensshd



Tan facil como esto, ya tendremos SSH en windows ;)

Tunea Gimp para que parezca photoshop

Gimp es la mejor herramienta de diseño que conozco en linux, pero en windows y Macos tenemos la herramienta rey "photoshop". Bien pues ahi un grupo que esta adaptando Gimp para que la su organización y opcion sean similares a las de photoshop, es muy curioso porque a todos aquellos que sepais manejar photoshop y querais trabajar con Gimp pero no os sintais cómodos, está es la solución.

Lo he probado y es muy curioso ;)

Necesitaremos descargar el paquete gimp shop para eso tecleamos en consola

wget http://www.plasticbugs.com/blogimg/gimpshop_2.2.11-1_i386.deb

Cuando lo tengamos descargado o hacemos doble click sobre él para que se instale o tecleamos en consola

sudo dpkg -i gimpshop_2.2.11-1_i386.deb

Ejecutamos Gimp y observaremos como ha cambiado.

Redirigir de un pagina a otra

Muchas veces ocurre que cambiais una web de nombre o de alojamiento y esto hace imposible que mantenga la misma URL que tenia. Si os ocurre esto pero teneis ya un volumen de clientes teneis que ir mostrandoles la nueva URL de la forma menos drastica posible. Para ello se usa la redirección para que en la URL donde antes teniais vuestra pagina ejemplo : www.midominio.com, colgais un html con la unica funcion de llevaros a la nueva url: www.minuevodominio.com.

Bien pues en el ejemplo que os pongo muestro como hacer esto sin uso de javascript de forma que si el navegador del cliente no lo tiene activado siga redireccionando. Como podeis imaginaros esto es una tonteria del copón pero a mi siempre se me olvida, así que este artículo sirve más que nada de recordatario ;).

Bajo la url antigua colgais el siguiente html:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta http-equiv="refresh" content = "5;url=http://www.minuevodominio.es">
<title>Redirection</title>
</head>
<body style="font-family: verdana,arial; font-style: normal; font-variant: normal; font-weight: bold; font-size: 10pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">
<center>
<div style="border: 6px solid rgb(70, 130, 180); padding: 35px; width: 550px; margin-top: 50px; background-color: rgb(248, 248, 255); text-align: left;">
<h2>Redirección URL</h2>

<p>La página solicitada ya no existe.</p>
<p>En unos segundos, será redirigido automáticamente a la nueva página.<br>Por favor, espere...</p>

<br>
<div style="text-align: right;"><a style="font-family: verdana; font-style: normal; font-variant: normal; font-weight: bold; font-size: 9px; line-height: normal; font-size-adjust: none; font-stretch: normal;" href="http://www.minuevodominio.es">Si no es redirigido automáticamente, haga clic sobre este enlace.</a></div>
</div>
</center>
</body>
</html>



Donde lo unico importante es esta linea:

<meta http-equiv="refresh" content = "5;url=http://www.minuevodominio.es">

que es la que nos redirecciona lo demas es para la estética del mensaje.

;)

Stepmania en Ubuntu

Bien para todos aquellos que no lo sepais, stepmania es un simulador de baile muy divertido. Se puede jugar con el teclado convencional aunque lo ideal es comprarse las tipica alfombrilla que habreis visto alguna vez con flechas arriba, abajo, izq, derecha que se conecta usb.

Tambien destacar que se hace mucho ejercicio jugando ha este juego, asi q todos aquellos que esteis buscando algo divertido para perder peso ya que no teneis tiempo para el gym. Tirar a la basura todo eso que anuncia la teletienda esto es sin dudas lo mejor para ello.

Y por ultimo añadir que esto es otro zasss en toda la boca a todo aquel que dice aquello de "en linux no se puede jugar" ;)





Para instalar la ultima versión de Stepmania (version 4) solo tendreis que seguir estas instrucciones:

1) Añadir un nuevo repositorio a nuestro source.list

$sudo gedit /etc/apt/source.list

Y al final del fichero añadimos la linea

#Repositorio de stepmania

deb http://repositorios.nighto.net/ feisty/

(Nota.Nos os preocupeis por lo de feisty yo lo he probado en una edgy y va perfe)



2) Actualizar e instalar

$sudo apt-get update

$sudo apt-get install stepmania



3) Inicialmente nuestro juego viene sin canciones asi que nos bajaremos unas cuantas del repositorio para tener por donde empezar a jugar. De todos modos podreis encontrar por internet grandes colecciones y bajaroslas.

$sudo apt-get install stepmania-songs*



Y fin ya teneis esta maravilloso juego instalado que lo encontrareis en la ruta

Aplicaciones > juegos > Stepmania



A bailarr !!

Peticion POST con Google Web Toolkit y PHP

Bien actualmente estoy diseñando un interfaz web usando Google Web Toolkit un kit que aunque aun esta muy verde y no existe demasiada documentación pues siempre cuesta un poco dar cada paso.

Ahora eso si os recomiendo este toolkit es increible, de una facilidad pasmosa y lo mas aluciante programas en JAVA, es decir olvidate de lenguajes de script. Es un proyecto que esta evolucionando rapidamente y seguro que dentro de poco será una nueva alternativa muy válida para el desarrollo de interfaces webs.

En este ejemplo muy simple os explico como se haria una petición POST con google web toolkit que se ejecuta en el cliente, y capturar esa petición con codigo PHP que se ejecute en el servidor.

Espero que os sea muy util ;)

Bien pues con google web toolkit lo primero es crearnos un proyecto para ello actualmente se tiene que hacer desde consola y las instrucciones de como hacerlo podeis encontrarlas en la dirección:
http://code.google.com/webtoolkit/gettingstarted.html

Una vez creado el proyecto como sabreis google web toolkit usa una clase que implementa el interfaz EntryPoint y que será nuestra clase principal como el MAIN en otros lenguajes.

Bien inicialmente esta clase ya viene implementa con un ejemplo de un boton que dice click me! cuando lo pulsas.

Bien el primer paso será sustituir el contenido de esta clase por este otro:
public class MakePost implements EntryPoint {

public static void doPost(String url, String postData){
RequestBuilder builder = new RequestBuilder(RequestBuilder.POST,url);
builder.setHeader("Content-type","application/x-www-form-urlencoded");

try{
Request response = builder.sendRequest(postData, new RequestCallback(){

public void onError(Request request, Throwable exception) {
Window.alert("onError");

}

public void onResponseReceived(Request request, Response response) {
Window.alert("onResponseReceived request:"+response.getText());

}
});
} catch (RequestException e){
Window.alert("Failed to send the request:"+e.getMessage());
}
}

public void onModuleLoad() {
doPost("/post.php", "nombre=HelloWorld");
}

Como podeis observar en el codigo creamos un metodo doPost que nos permitirá hacer peticiones POST a una web. Para nuestro ejemplo la petición será realizada hacia post.php fichero php que se ejecutará en el servidor para capturar la petición y que como indica la barra "/" delante del nombre la colocaremos en el DocumentRoot de nuestro Apache.

Nota importante observar que para que la petición se realice correctamente en el objeto Request se actualiza la cabecera de la petición con este valor:
builder.setHeader("Content-type","application/x-www-form-urlencoded");

Si no hacemos esto no funcionará!!

Ahora en el fichero de configuración de nuestro proyecto google web toolkit que es un fichero xml llamado:
MiAplicacion.gwt.xml

Tendremos que añadir una linea que nos permita usar las clases para la petición HTTP:
<module>

<!-- Inherit the core Web Toolkit stuff. -->
<inherits name='com.google.gwt.user.User'/>
<inherits name='com.google.gwt.http.HTTP'/>

<!-- Specify the app entry point class. -->
<entry-point class='com.cica.client.MakePost'/>

</module>



El siguiente paso será compilar nuestra clase, con el script shell que nos genera gwt automaticamente y que se encuentra en el directorio raiz de nuestro proyecto:
MiAplicacion-compile

Al ejecutarlo nos generará una carpeta WWW con todo el contenido repleto de ficheros html y javascript que son el resultado de traducir nuestro codigo java.

Esta carpeta la copiaremos en el documentRoot de nuestro Apache tambien

Por ultimo lo unico que nos queda es el fichero que captura la petición llamado post.php que como he dicho anteriormente se encuentra en el DocumentRoot de apache y tendrá el siguiente contenido:
<html>
<head>
<title>Recibir Post</title>
</head>
<body>
<h1>Recibir Post</h1>
<?php
echo "Recibo: ".$_POST['nombre'].";
?>
</body>
</html>

Y bueno eso es todo ;)

Javascript Request POST and PHP

Como ya sabeis desde html la unica forma de hacer una peticion POST es a través de un formulario. Pero y si quereis mandar una información sin tener que usar un formulario.

Bien en este ejemplo os cuento como hacer una peticion desde javascript (cliente) y capturarla desde un php (servidor). Estos tutoriales son los más utiles porque puedes entender perfectamente su funcionamiento debido a su simplicidad, y ayudarte a iniciarte.

Bien pues lo primero que vamos ha hacer es generarnos un fichero javascript que constituirá como nuestra pequeña libreria para hacer Request.

Crear un fichero llamado xmlhttp.js con el siguiente contenido:

function getXMLHttp() {
var XMLHttp = null;
if (window.XMLHttpRequest) {
try {
XMLHttp = new XMLHttpRequest();
} catch (e) { }
} else if (window.ActiveXObject) {
try {
XMLHttp = new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
      try {
XMLHttp = new ActiveXObject(
"Microsoft.XMLHTTP");
} catch (e) { }
}
}
return XMLHttp;
}

Ahora crearemos el fichero html que contendrá el código javascript que se ejecuta en cliente para hacer la petición. Este fichero lo llamaremos request.html y contendrá:


Por ultimo crearemos el fichero post.php que se ejecuta en el servidor y que captura la petición post :

 if (isset($_POST['word1']) &&
isset($_POST['word2'])) {
echo $_POST['word1'] . ' ' . $_POST['word2'];
} else {
echo 'No data sent.';
 }?>
 

Y eso es todo ;)

Peticion HTTP/HTTPS GET/POST Java

Esto es una curiosidad muy util, como hacer una petición HTTP por ejemplo para usar los nuevos servicios de Yahoo. Pues aqui teneis el fragmento de código que te resolverá el problema es muy facilito y usando ese maravilloso lenguaje llamado java.

Seguro que muchos de vosotros no habiais hecho esto con java en la vida, pues es increible pero si esta en el paquete java.net...




private static String conexionGET(String request, String protocolo) {

        String responce = "";

        BufferedReader rd = null;

        try {

            URL url = new URL(request);

            if (protocolo.equals("HTTPS")) {

                HttpsURLConnection conn1 = (HttpsURLConnection) url.openConnection();


                rd = new BufferedReader(new InputStreamReader(conn1.getInputStream()));

            } else {

                URLConnection conn2 = url.openConnection();

                rd = new BufferedReader(new InputStreamReader(conn2.getInputStream()));

            }



            String line;



            while ((line = rd.readLine()) != null) {

                //Process line...

                responce += line;

            }



        } catch (Exception e) {

            System.out.println("Web request failed");

        // Web request failed

        } finally {

            if (rd != null) {

                try {

                    rd.close();

                } catch (IOException ex) {

                    System.out.println("Problema al cerrar el objeto lector");

                }

            }

        }



        return responce;

    }



    private static String conexionPOST(String request, String datos, String protocolo) {

        String responce = "";

        OutputStreamWriter wr = null;

        BufferedReader rd = null;

        try {

            URL url = new URL(request);



            if (protocolo.equals("HTTPS")) {

                HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();


                //Escribir los parametros en el mensaje

                conn.setDoOutput(true);

                wr = new OutputStreamWriter(conn.getOutputStream());

                wr.write(datos);

                wr.flush();



                //Recibir respuesta

                rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));

            } else {

                URLConnection conn = url.openConnection();

                //Escribir los parametros en el mensaje

                conn.setDoOutput(true);

                wr = new OutputStreamWriter(conn.getOutputStream());

                wr.write(datos);

                wr.flush();



                //Recibir respuesta

                rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));

            }





            String line;



            while ((line = rd.readLine()) != null) {

                //Process line...

                responce += line;

            }



        } catch (Exception e) {

        } finally {

            try {

                if (wr != null) {

                    wr.close();

                }

                if (rd != null) {

                    rd.close();

                }

            } catch (IOException ex) {

                System.out.println("Exception al cerrar el lector o el escritor");

            }

        }

        return responce;

    }

AMule daemon (emule)

Para todos aquellos que esten intentado dar el paso de cambiarse de un windows a tener un linux instalado, o para aquellos que tenga un ordenador antiguo con pocas prestaciones de hardware y quieran aprovecharlo, creo que este artículo os viene como anillo al dedo.

El famoso emule de windows podemos instalarlo en linux con su versión aMule es practicamente igual por lo que no tendréis motivos para perderos. Es más yo tengo un ordenador antiguo que lo uso de servidor y un entorno windows consume muchisimos recursos por lo al instalarle un ubuntu pude comprobar lo bien que va este sistema en máquinas ya anticuadas y así poder sacarle provecho. Reto: Intenta instalarle a un Pentium 1 a 133 Mhz un Windows Server 2003 o un XP a ver que tal va ;).

Instalar y configurar amule-daemon para poder utilizar amuleweb

$sudo apt-get install amule-daemon

$amuled

Calcular la contraseña cifrada

$echo -n [CONTRASEÑA] | md5sum | cut -d ' ' -f 1

Edita el fichero amule.conf

$gedit .aMule/amule.conf

Actualizar las siguientes lineas con estos valores:

AccpetExternalCOnnections=1

ECPassword=CONTRASEÑA CIFRADA ANTERIORMENTE

Session [WebServer]

Enable=1

Password= CONTRASEÑA CIFRADA ANTERIORMENTE

Para que todo funcione debes tener los siguientes puertos abiertos

4662 TCP, 4665 UDP, 4672 UDP y 4711 TCP

Por ultimo para arrancar el servidor de amule:

$amuled -f (la f es para que se ejecute de fondo)

Nota para saber que se esta ejecutando -> $ps -ef | grep amule

Para acceder desde el navegador http://localhost:4711 e introducir la [CONTRASEÑA] en el formulario

NOTA. Por seguridad es aconsejable que cambies estos puertos por otros no tan conocidos.

También recomendar que en vez de usar amuleweb, useis amulegui es un pakete que te lo puedes instalar con synaptic además lo puedes encontrar para windows y para Unix.

Virtual Host en Apache2 (Ubuntu)

Bien pues ya sabeis que hay mil y una versiones de apache y sus fichero de configuración. En red hat o CentOS se llaman httpd y el fichero de configuración httpd.conf y ahi se mete todo a pelo. En ubuntu/debian se llama apache2 y dentro de /etc/apache2 tenemos un conjunto de carpetas y ficheros para configurar el servidor esto lo hace más elegante que en los red hat, pero también es más entretenido de aprender.

Pues nada yo estaba muy acostumbrado a red hat pero cuando cogi un ubuntu dije ostias esto como es, así que aqui os dejo lo que teneis que hacer para crear un virtual host de apache en una ubuntu/debian.

Lo que sigue es una breve nota técnica que me sirva (y a otros) como recordatorio para la próxima vez , dado que hoy he perdido un rato con la configuración de un host virtual en Ubuntu (en Fedora lo tenía todo ya hecho, y sólo era copiar y pegar :-)

En /etc/apache2 disponemos de varios subdirectorios, dos de ellos importantes para nuestra tarea. El primero sites-available y el segundo sites-enabled.

Los ficheros de configuración de los hostings virtuales se configuran en sites-available. El segundo subdirectorio sólo contiene enlaces a aquellos virtulhost que queremos activar.

Queremos crear un virtualhost de nombre "jorges" Es decir, cuando ponga en mi navegador http://jorges me debe de llevar a la página principal de ese host. Si pongo http://localhost me llevará al virtualhost por defecto (distinto del de jorges).

Lo primero, creo una nueva entrada en /etc/hosts (mantengo lo que había y añado lo siguiente):

127.0.0.1 jorges

Copio los archivos del nuevo site en /var/www/jorges.

Comienza el procedimiento de configuración del nuevo virtualhost en Apache2:

$ cd /etc/apache2/sites-available

Edito las dos primeras líneas del fichero default para que queden así:

NameVirtualHost *:80

$ cp default jorges

Edito hackit para que las primeras líneas queden así:


ServerAdmin webmaster@jorges

ServerName jorges

DocumentRoot /var/www/jorges


Options FollowSymLinks
AllowOverride None


$ cd /etc/apache2

El siguiente comando, a2ensite (available2enablesite) crea un enlace en sites-enable al site que le indiquemos (es decir, activa el virtualhost que acabamos de crear)

# a2ensite jorges

Comprobamos:

$ ls -al sites-enabled/

Recargamos apache2:

#/etc/init.d/apache2 force-reload
Listo!



Fuente: diariolinux

Error Mysql 1016 Can't open file: 'jos_session.MYI'

Hoy en el trabajo saltaron las alarmas cuando una de nuestras maquinas tras algunas pruebas sobre ella, de repente dejo de funcionar el portal con joomla que corria sobre ella con este error tan estraño y sin que nadie hubiera tocado.

Todo quedo en un susto y que existe una forma muy facil de corregirlo. El error era algo similar a esto:

BD function failed with error number 1016

Can't open file: 'jos_session.MPYI' (errno:145) SQL=SELECT session_id FROM jos_session

WHERE session_id='dadfa23rdfa3t4fgfd2323'

SQL=

SELECT session_id

FROM jos_session

WHERE session_id = '1234dfjskfa2dffa'

Si reconoces este problema aqui tienes la solucción...

Necesitas reparar la tabla "jos_session" de tu base de datos MYSQL porque ha sido corrompida.

Para ello desde linea de comandos

//Accedes a mysql

$mysql -u [usuario] -p

//Introduces en la base de datos de joomla

$show databases;

$use [bd_joomla];

//Reparas las tabla

$repair table jos_session

Despues de esto todo tiene que ir como la ceda. También puedes realizar esta misma operación desde tu phpmyadmin, desde la pestaña SQL introduces "REPAIR TABLE 'jos_session'"

Espero que os solucione el problema como a mi ;)

Seguridad en Joomla

Bueno muchos de vosotros que utiliceis Joomla, os sonará eso de que para acceder al backend de joomla es tan facil como http://www.midominio.com/administrator.

Bien pues eso lo sabe cualquiera que conozca joomla y lo haya instalado alguna vez. Es más

es tan fácil como irte a una página web y si en el pie de la página pone "by power joomla" o algo así o si el favicon no lo han cambiado y sale el logitipo joomla. Si es así ya sabes que concatenandole a la dirección /administrator te sale el control de acceso de joomla y si tienes usuarios con niveles pobres de password o aparece un hueco de seguridad de joomla, pues estas jodido.

Solución: y si restringimos el acceso a /administrator de forma que no todo el mundo pueda acceder al formulario...

Pues para nuestro fin utilizaremos la potencia que nos ofrecen los fichero .htaccess en nuestro apache.

1) Nos colocamos en el directorio raiz de nuestro servidor apache

$ cd /var/www (suele estar en esa dirección en los linux)

2) Accedemos a la carpeta de nuestro dominio joomla y luego a la carpeta de administration

$ cd joomla/administrator

3) Creamos el fichero llamado .htaccess, es importante el "." ya que hace que el archivo sea oculto y apache no lo publique.

$sudo gedit .htaccess

4) y le copiamos el siguiente texto

#Comentario

deny from all

allow from 127.0.0.1

Nota. Con esto conseguimos que sólo desde la máquina local donde esta instalado el servidor podremos acceder al backend de joomla

Así podemos poner añadir una lista de sentencias "allow from ip" dando permiso a varias

máqinas más:

deny from all

allow from 127.0.0.1

allow from www.google.es

etc ...

5) Por último recordar que en el apache deberéis tener configurado el virtual host para que permita sobreescritura de la configuración por los ficheros .htaccess que se consigue tocando en el fichero de configuración de apache (httpd.conf):

...
ServerName www.midominiojoomla.com
...
AllowOverride All
Options None
...

Nota. Si os daís cuenta lo mismo que estamos haciendo con el .htaccess lo podríamos poner directamente en el fichero de configuración de Apache, pero de esta forma nos permite restringir cualquier directorio de la misma forma con sólo copiar el fichero en otros directorios.

Bueno espero que con esto reduzcais los posibles ataques a vuestra web joomla.

;)

Google Desktop en Linux (Ubuntu)

Bueno supongo que ya conoceréis google desktop, es una herramienta de google totalmente gratuita. Ya estaréis hartos de utilizar el buscador del windows que se te da tiempo a tomarte un cafe antes de que encuentre un fichero, pues los de google utilizan toda la potencia de su algoritmo de indexación pero para organizar los ficheros de tu ordenador. Ademas la herramienta se encuentra totalmente integrada con gmail, buscador de google etc ... Una maravilla. Pues bien ya podemos disponer de esta herramienta en nuestro linux también, aunque ya algunos utilizarais como beagle que también es un buscador buenísimo.

Yo siempre pienso que google nos controlará a todos ya que conoce todas las webs que buscamos en internet y con herramientas como google desktop conocerá todo lo que tenemos en nuestro disco duro, pero weno esto es sólo una opinión, ahora si si no poseeis datos Top Secret la herramienta es una chulería.

Instalar google Desktop en ubuntu

1. Autentificar el repositorio que vamos a usar (repositorio provisional)

$ wget -q -O - http://dl.google.com/linux/linux_signing_key.pub

$ sudo apt-key add -

2. Añadimos el repositorio a nuestra lista

$ sudo gedit /etc/apt/sources.list

Y añadimos al final del fichero las siguientes líneas

# Google software repository
deb http://dl.google.com/linux/deb/ stable non-free

3. Finalmente instalamos google desktop

$ sudo aptitude update
$ sudo aptitude install google-desktop-linux

4. La próxima vez que iniciemos nuestra sesión google desktop se pondrá en marcha, y aparecerá un icono nuevo en nuestra barra de herramientas. En ese momento google desktop comienza a indexar ficheros de tu disco duro por lo que según la cantidad de fichero y la potencia de vuestro ordenador puede llevar varias horas el que se encuentre en disposición de funcionar de forma eficiente. Ahora una vez indexado la mayor parte de tus fichero aquello es rapidísimo.

URL amigables en Joomla

Bueno para el que no sepa lo que son las Url amigables se lo cuento rápidamente. Si habeis utilizado el gestor de contenidos Joomla alguna vez, habréis podido observar que cuando pichas en un enlace de tu dominio la url será algo como esto:

http://www.dominio.com/index.php?option=com_zoom&Itemid=42

Bien pues esta dirección es a mi gusto algo dificil de recordar, esto sería una Url poco amigable, además si tienes un portal web y quieres darlo a conocer y que aparezca lo más alto posible en el buscador de google, tienes que vigilar este tema ya que el motor de google penaliza url poco amigables como la del ejemplo anterior.

Bíen pues en este artículo os muestro como configurar vuestro Joomla y Apache para conseguir dicho fin.

En la configuración de tu apache tendrás un virtual host asignado para tu dominio, en el debes introducir la opción de AllowOverride All que permite que el .htaccess modifique la configuración de apache.

ServerName www.midominio.com

DocumentRoot "/usr/var/www/midominio"

AllowOverride All

Options None

En el directorio donde alojas Joomla encontrarás un fichero llamado htaccess.txt para usarlo deberás renombrarlo por .htaccess.

En el Backend de Joomla o panel de administración vete a Sitio > Configuración Global > SEO. y activa las opciones:

URLs amigables para buscadores: Presiona SÍ
Títulos dinámicos en las páginas: Presiona SÍ

Guarda tu configuración.

Con esto acabas de activar el componente que trae Joomla (versión 1.0.12) para implementar las Url Amigables, pero para mi gusto no es demasiado bueno así que instalaremos un componente de terceros.

Bájate el componente 404 SEF RC1 en español desde Joomlaspanish.org

Instala el componente ya sabes como es Backend>Instaladores> Instalar componente

Ahora debes abrir tu archivo .htaccess y descomentar las siguientes líneas:

########## Begin - 3rd Party SEF Section
############# Use this section if you are using a 3rd party (Non Joomla! core) SEF extension - e.g. OpenSEF, 404_SEF, 404SEFx, SEF Advance, etc
#
RewriteCond %{REQUEST_URI} ^(/component/option,com) [NC,OR] ##optional - see notes##
RewriteCond %{REQUEST_URI} (/|\.htm|\.php|\.html|/[^.]*)$ [NC]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.*) index.php

#
########## End - 3rd Party SEF Section

Estas líneas son referentes a los SEF implementados por terceras partes, y si se te olvida descomentarlas el componente 404SEF no funcionará.

Listo. Ahora en vez de tener direcciones como:
http://www.dominio.com/index.php?opt...id=2&Itemid=75

Serán verá así:
http://www.dominio.com/nombre_relevante.html

Este componente tiene muchas opciones y entre ellas te permite editar el nombre asignado a cada url real, todo ello lo encontrareis en el panel del administrador o backend.

Lista de problemas encontrados

1) En las debian/ubuntu por defecto el modulo de Rewrite no viene instalado por defecto por lo que tendras que darlo de alta con el comando:

> a2enmod rewrite

> /etc/init.d/apache2 restart

Convertir Joomla a UTF-8

Bueno en mi trabajo hemos utilizado Joomla (Gestor de contenidos) para desarrollar alguno de los portales que ofrecemos (tales como www.cica.es o supercomputacion.cica.es), una vez ya con las manos en la masa, nos encontramos con el problema de que la versión española de joomla (descargada de http://www.joomlaspanish.org/) se encuentra con la codificación ISO-8859-1 es decir latin 1.

Existen unos follones con las codificaciónes increibles, porque el ISO-8859-1 trae los caracteres especiales solo del castellano, luego existe otro para los caracteres griegos o los caracteres árabes, os podeis imaginar menudo follón.

Bueno pues para resolver el problema se ha inventado el UTF-8 que contiene todos los caracteres internacionales de modo que si utilizas esta codificación todos los navegadores ya sean arábes o griegos poseen este estandar y podrán ver los textos tal y como ha sido escritos y no con caracteres raros.

Bien pues en este artículo elaborado por dos compañeros de trabajo se explica como convertir todo el proyecto tanto frontend como backend de joomla a la codificación UTF-8.

GUÍA PARA CONVERTIR UN SITIO JOOMLA


DESDE CODIFICACIÓN ISO-8859-1x A UTF-8



Introducción:


Joomla es una potente herramienta capaz de gestionar un sito web de forma fácil a la vez que eficiente. Sin embargo, esta útil herramienta nos llega a los españoles con un problema que tiene mucho que ver con su política de desarrollo. La versión española de Joomla se entrega por defecto con una codificación ISO-8859-1, mientras que todo el mundo está migrando a la nueva codificación UTF-8. Este conflicto de codificaciones no es nuevo en el mundo de internet, y provocará que todos los símbolos no internacionales (tildes, eñes y similares) se muestren como carácteres desconocidos si nuestro navegador está configurado para mostrar las páginas bajo UTF-8.


Surge, por tanto, la necesidad de poder cambiar la codificación de todo el sitio web gestionado por Joomla a la internacional UTF-8, sin que por ello tengamos que perder mucho de nuestro valioso tiempo examinando archivos y modificándolos manualmente. Desgraciadamente, hay poca información al respecto sobre cómo se podría realizar esta migración, y mucho menos sobre cómo se podría hacer automáticamente.


Este documento pretende ser una guía con la que mostrar el camino a seguir para migrar un sitio Joomla ISO-8859-1 a UTF-8 de forma automática y bajo Linux, indicando todo el proceso paso a paso.


Visión general del proceso:


Estos van a ser, expresados de forma esquemática, los

pasos a seguir para realizar la migración del sitio web:


    1. Realizar una copia de seguridad del sitio.

    2. Aplicar el script para convertir los archivos iso-8859-1 a utf-8.

    3. Instalar el paquete de idioma español utf-8 para Joomla.

    4. Actualizar la base de datos de Joomla.


Realizar una copia de seguridad del sitio:


Ni que decir tiene que es una muy buena idea tener a mano una copia de seguridad del sitio que vayamos a migrar, por si acaso. Supongamos que nuestro sitio web se encuentra alojado en la carpeta /var/www/ejemplo de nuestro servidor. Para realizar la copia de seguridad y crear una carpeta llamado ejemploBAK, ejecutaremos las siguientes ordenes:


cd /var/www

mv ejemplo ejemploBAK


Aplicar el script para convertir los archivos iso-8859-1 a utf-8:


Ahora necesitamos copiar el script webiso2utf.sh a un sitio que sea accesible por nosotros, como por ejemplo el directorio en donde se encuentra alojado nuestro sitio de ejemplo. Supongamos que ya tenemos el script creado en nuestro directorio home. En este caso, tendríamos que hacer:


cd /var/www

mv $HOME/webiso2utf.sh .


Con el script en este directorio, sólo nos resta ejecutarlo sobre la carpeta de copia de seguridad, generando de esta forma nuestro sitio originial pero codificado como utf-8:


./webiso2utf.sh ejemploBAK ejemplo


Esto debería tardar un poco (Dependiendo del tamaño total del sitio que estemos migrando) y, al acabar, aparecerá una carpeta ejemplo en la que todos los archivos sujetos a ser convertidos estarán en utf-8. El script no convierte a utf-8 todos los archivos porque existen algunos, como los jpg o los png, que guardan su valor tal cual en binario, por lo que no tiene ningún sentido que se modifiquen para adaptarlos a una u otra codificación.


Nótese que la carpeta ejemploBAK sigue estando intacta y aún posee todos los archivos originales, en codificación iso-8859-1 por si nos hiciera falta en el futuro.

Instalar el paquete de idioma español utf-8 para Joomla:


Una vez que todos los demás archivos han sido convertidos a la codificación utf-8, tenemos que instalar en el propio Joomla el paquete español para utf-8. Este paso no se ha realizado previamente debido a que el paquete copia algunos archivos en codificación utf-8, con lo que al aplicarle el script estos archivos son recodificados y nos mostrarían carácteres extraños al representarlos nuestro navegador.


Para instalar el paquete en español utf-8, seguiremos los siguientes pasos:


Actualizar la base de datos de Joomla:


Por último, aún nos queda un paso para tener completamente nuestro sitio migrado. Joomla guarda la mayoría de su configuración en una base de datos, que se establece a la hora de la instalación. Esta base de datos es la encargada de mostrar las descripciones y opciones de la interfaz de cara al administrador del sitio, y estará por defecto codificada bajo iso-8859-1, por lo que tendremos que modificar su contenido para ajustarlo a utf-8.


Suponiendo que usamos mysql y que el nombre de la base de datos que guarda todas las tablas de configuración de Joomla es ejemplo, esto es lo que habría que hacerse:


  1. Volcamos el contenido del schema ejemplo a un archivo ejemplo.sql:

mysqldump -u [usuario] -p –opt ejemplo > ejemplo.sql

(Nos pedirá nuestra contraseña de acceso a la base de datos)


  1. Convertimos el archivo desde iso-8859-1 a utf-8:

iconv -f iso-8859-1 -t utf-8 ejemplo.sql > ejemploutf.sql


  1. Volcamos este archivo codificado como utf a la base de datos:


mysql -u [usuario] -p <>


Con esto, nuestra base de datos ya debería estar codificada en utf-8.



Sin embargo, cuando estuvimos trabajando con nuestro sitio de Joomla, los pasos previamente comentados no nos realizaron correctamente la codificación. Para convertir la base de datos a una codificación que mostrara correctamente los carácteres no internacionales en un navegador configurado para UTF-8, tuvimos que aplicar el siguiente script a ejemplo.sql en lugar de usar el comando iconv:


sqlfix.sh ejemplo.sql ejemploutf.sql


El tercer paso es idéntico al utilizado previamente, y una vez volcado el contenido, la base de datos funcionaba correctamente.


Scripts utilizados:


A continuación se incluyen los códigos de los dos scripts utilizados para realizar la migración del sitio. Estos han sido webiso2utf.sh y sqlfix.sh


webiso2utf.sh


#!/bin/bash

#

#Script que copia la estructura de archivos desde dir_origen hasta

#dir_destino y convierte todos los archivos del origen de iso-

8859-1

#a utf-8 en el destino.

#

#Ejemplo de uso:

#iso2utf.sh dir_origen dir_destino

#

#Creado por: Jhonatan Garcia Gutierrez

#


#Primero creamos algunas variables que usaremos mas adelante

comando=$0

dir_or=$1

dir_base=$2


#En principio, dir_des y nuevo tendran la cadena vacia.

#Conforme se vaya ejecutando el script, se iran llamando con otros valores

dir_des=$3

nuevo=$4


#En lista guardamos la relacion de archivos existentes en el directorio actual

if [ ! -z $nuevo ] ; then

lista=$(ls -A $dir_or/$dir_des);

else

lista=$(ls -A $dir_or);

fi


#Creamos una matriz ext en donde guardaremos las extensiones de los archivos que convertiremos a utf-8

#Los archivos de tipo jpg o png, por ejemplo, no serán convertidos a utf-8 (No tendria sentido)

declare -a ext

ext=( asp cfg css en es euc-jp euc-kr fr freebsd htm html js js_ lib linux php php~ php-dist properties sh sql src txt TXT xml )

tam=${#ext[*]}


#Si el directorio destino en donde vamos a crear los archivos convertidos no existe, crearlo

if [ ! -e ${dir_base}/${dir_des} ] ; then

mkdir ${dir_base}/${dir_des};

fi


#Por cada archivo existente en el directorio origen actual hacer:

for arch in $lista ; do


#Guardamos el nombre del archivo para usarlo mas adelante

nom_arch=${arch}


#Si no es la primera vez que se llama al script, sera porque estamos convirtiendo

#tambien los archivos incluidos dentro de un subdirectorio.

#En este caso le agregamos la ruta de este subdirectorio al archivo actual.

if [ ! -z $nuevo ] ; then

arch=${dir_des}/${arch};

fi


#Si el archivo es un directorio, habra que ejecutar esta script sobre el para convertir

#tambien sus archivos en el directorio destino.

if [ -d ${dir_or}/${arch} ] ; then

$comando ${dir_or} ${dir_base} ${arch} 1;


#En cambio, si es un archivo ordinario, tendremos que comprobar si lo convertimos o no

else


#Obtenemos el valor del archivo origen y destino para usarlos luego mas comodamente

archivo=${dir_or}/${arch}

archivo_des=${dir_base}/${arch}


#Obtenemos la extension del archivo

extension=${nom_arch##*.}


#Recorremos la matriz de extensiones. Si la extension del archivo actual esta dentro de

#la matriz, entonces tendremos que convertir el archivo.

#En otro caso, sera un archivo de tipo jpg o similar y nos limitaremos a copiarlo en el destino

let flag=1

let indice=0

while [ $flag -eq 1 -a $indice -lt $tam ] ; do

if [ $extension = ${ext[$indice]} ] ; then

#Si encontramos la extension en la matriz, ponemos la bandera a 0

let flag=0

fi

let indice=($indice + 1)

done


#Si la extension del archivo era una de las que vamos a convertir a utf-8:

if [ $flag -eq 0 ] ; then


#Creamos dos archivos temporales para guardar datos intermedios

aux1=$0$$1

aux2=$0$$2


#Convertimos todas las referencias que nos indican que el archivo esta en iso-8859-1X a utf-8

sed -e s/[cC][hH][aA][rR][sS][eE][tT]\ *=\ *[iI][sS][oO]-8859-1[0-9]/charset=utf-8/g $archivo > $aux1

sed -e s/[cC][hH][aA][rR][sS][eE][tT]\ *=\ *[iI][sS][oO]-8859-1/charset=utf-8/g $aux1 > $aux2


#Esta ultima es para los archivos de SQL

sed -e s/[cC][hH][aA][rR][sS][eE][tT]\ *=\ *[lL][aA][tT][iI][nN]1/CHARSET=UTF-8/g $aux2 > $aux1

#Realizamos la conversion del archivo ayudandonos del comando iconv

iconv -f iso-8859-1 -t utf-8 $aux1 > $archivo_des;


#Borramos los archivos temporales que habiamos utilizado previamente

rm $aux1

rm $aux2


#Si la extension del archivo no era una de las que vamos a convertir, lo copiamos en el destino

else

cp $archivo $archivo_des;


fi

fi

done


sqlfix.sh


#!/bin/bash

#

#Fichero creado por: Jhonatan Garcia Gutierrez

#

#Este script se ha creado para solucionar un problema que da muchos

#quebraderos de cabeza.

#

#Muchas veces consultamos una base de datos y el resultado nos lo

#devuelve en iso-8859-1, por lo que nuestro navegador no muestra

#bien los simbolos cuando esta configurado para mostrar utf-8.

#

#Usa solucion a este problema seria hacer un volcado de la base de datos:

#mysqldump -u [usuario] -p --opt [tabla] > [archivo].sql

#convertir el archivo resultante a utf-8 y subir este archivo

convertido

#a nuestra base de datos:

#mysql -u [usuario] -p [tabla] < [archivo].sql

#

#Sin embargo, hay veces en las que esto no funciona, y hay que codificar

#nuestro archivo de una manera especial para que la base de datos muestre

#los resultados de nuestras consultas como deberia.

#

#Para arreglar este problema, simplemente tendremos que ejecutar los

#siguientes pasos:

#

#mysqldump -u [usuario] -p --opt [tabla] > [archivo].sql

#./sqlfix.sh [archivo].sql [archivofix].sql

#mysql -u [usuario] -p [tabla] < [archivofix].sql

#



arch_or=$1

arch_des=$2


aux1=${0}$$1

aux2=${0}$$2


sed -e s/¿/¿/g $arch_or > $aux1

sed -e s/¡/¡/g $aux1 > $aux2

sed -e s/á/á/g $aux2 > $aux1

sed -e s/é/é/g $aux1 > $aux2

sed -e s/í/í/g $aux2 > $aux1

sed -e s/ó/ó/g $aux1 > $aux2

sed -e s/ú/ú/g $aux2 > $aux1

sed -e s/Á/Ã\201/g $aux1 > $aux2

sed -e s/É/É/g $aux2 > $aux1

sed -e s/Í/Ã\215/g $aux1 > $aux2

sed -e s/Ó/Ó/g $aux2 > $aux1

sed -e s/Ú/Ú/g $aux1 > $aux2

sed -e s/ñ/ñ/g $aux2 > $aux1

sed -e s/Ñ/Ñ/g $aux1 > $aux2

sed -e s/ü/ü/g $aux2 > $aux1

sed -e s/Ü/Ãœ/g $aux1 > $aux2

sed -e s/ç/ç/g $aux2 > $aux1

sed -e s/CHARSET=latin1/CHARSET=utf8/g $aux1 > $aux2


mv $aux2 $arch_des

rm $aux1


Paquetes instalados una vez migrada la web:


Nos hemos dado cuenta de que una vez que la web ha sido migrada a utf-8, al instalar un paquete nuevo, éste aparecía en formato iso-8859-1. Al parecer, la codificación del paquete no se modifica automáticamente al instalarlo, por lo que por defecto se instalará con la codificacón con la que el paquete fue creado.


Esto quiere decir que, cada vez que instalemos un paquete nuevo, habrá que convertirlo a utf-8. Afortunadamente, esto se puede hacer sólo con la carpeta del paquete, y no con el sitio web completo. Para realizar ésto, tendremos que buscar la carpeta en la que se ha instalado el nuevo paquete. Supongamos que el paquete se instala en la carpeta administrator/components/jos_paquete del sitio ejemplo. Lo que tendríamos que hacer sería:


cd /var/www/ejemplo/administrator/components

mv jos_paquete jos_paqueteBAK

$HOME/webiso2utf.sh jos_paqueteBAK jos_paquete


Y con eso el nuevo paquete estará codificado en utf-8. Ahora, si vemos carácteres extraños al usar el paquete, se deben a que los datos introducidos en la base de datos al instalar el paquete se han realizado en formato iso-8859-1. Por lo tanto, deberíamos reconvertir la base de datos a utf-8, usando los mismos pasos explicados anteriormente.


Todo esto hay que hacerlo, obviamente, si el nuevo

paquete que hemos instalado se encontraba realizado en iso-8859-1 y nos encontramos con carácteres raros al usar el Joomla. Si el paquete fue creado con la codificación utf-8 y no nos crea ningún problema a la hora de mostrarlo cuando estemos usando el navegador, mejor no tocamos nada.


Consideraciones finales:


Todo lo expuesto en esta guía ha sido probado y ejecutado satisfactoriamente para realizar la migración de codificaciones en el sitio web del CICA (www.cica.es). Los scripts cumplen su cometido cuando se ejecutan bajo Debian y con un bash como consola. Sin embargo, no hemos podido probar la eficacia de lo anteriormente expuesto en ninguna otra configuración de máquinas o sistemas operativos.


Debido a esto, puede que lo dicho previamente no funcione correctamente para la configuración actual de trabajo que estés usando. Si has tenido algún problema que no haya sido recogido por esta guía y has conseguido solucionarlo, exponlo abiertamente para que podamos recoger la información y ayudar a más personas con el mismo problema.


De todas formas, a continuación voy a redactar una pequeña guía de problemas relacionados con la configuración de equipos que sí son esperados y que podrían solucionarse con relativa facilidad:


Si al ejecutar los scripts no obtienes el resultado esperado, comprueba que tu máquina posee el comando iconv y que es accesible directamente. Si no lo posee, deberás buscar el comando equivalente para tu sistema operativo y modificar el script para que realice una llamada al comando correspondiente.


Si tu script no se ejecuta en absoluto, comprueba que tu consola de comandos es bash y no otra similar (Como

ksh). Si no es bash, prueba a modificar el script para que busque tu consola de comandos al principio en lugar de realizar la llamada a #!/bin/bash


Espero que no haga falta decir que estos scripts no funcionarán en Windows :P



Guía elaborada por:


Jhonatan Garcia Gutierrez

Cristóbal Tamayo