domingo, 21 de enero de 2007

Algoritmo de ordenamiento Burbuja en Java y C#

Ordenamiento Burbuja o Bubble Sort es un algoritmo para ordenar arreglos o listas de menor a mayor, conocido por la mayoría de los programadores.

Consiste en recorrer la lista las veces que sea necesario e ir comparando los elementos de a dos e intercambiándolos si fuera necesario para ordenarlos.

La condición a seguir seria:

Si(arreglo[i]>arreglo[i+1]) entonces
Variable Temporal=arreglo[i]
arreglo[i]=arreglo[i+1]
arreglo[i+1]=Variable Temporal

Y luego se incrementaría ya fuera de la condición el índice [i] en 1, bastaría con un i++. Un ejemplo básico seria una lista así:

Arreglo original: [5,4,8,7,6,3]

Primera pasada: [4,5,7,3,6,8]
Segunda pasada: [4,5,3,6,7,8]
Tercera pasada: [4,3,5,6,7,8]
Cuarta pasada: [3,4,5,6,7,8]

Asi en cuatro recorridos haciendo las comparaciones este metodo ordeno el arreglo.

Este es un ejemplo del metodo escrito en Java:

public static void burbuja(int [] ordenar) //recibe como parametro el arreglo desordenado
{
for (int i=1; i<ordenar.length;i++) //este for recorre el arreglo tantas veces como sea su tamaño.
{
for(int j=0;j<ordenar.length-1;j++) // este for recorre el arreglo y repite la condicion.
{
if (ordenar[j] > ordenar[j+1]) // compara los elementos en los indices [j] y [j+1]
{
int temp = ordenar[j]; // si el valor del indice [j] es mayor al de [j+1] los intercambia
ordenar[j]= ordenar[j+1];
ordenar[j+1]= temp;
}
}
}
}

Escrito en C#:

public static void burbuja(int[] ordenar) //recibe como parametro el arreglo desordenado
{
for (int i = 1; i < ordenar.Length; i++) //este for recorre el arreglo tantas veces como sea su tamaño.
{
for (int j = 0; j < ordenar.Length - 1; j++) // este for recorre el arreglo y repite la condicion.
{
if (ordenar[j] > ordenar[j + 1]) // compara los elementos en los indices [j] y [j+1]
{
int temp = ordenar[j]; // si el valor del indice [j] es mayor al de [j+1] los intercambia
ordenar[j] = ordenar[j + 1];
ordenar[j + 1] = temp;
}
}
}
}

Son códigos bastante similares ya que Java y C# utilizan casi la misma sintaxis, lo único que cambia en entre ambos es el método length en Java length y en C# Length. Tambien podría implementarse burbuja en c# utilizando foreach.

Con esto concluimos este articulo, saludos desde TecnoTutoriales.

sábado, 20 de enero de 2007

Montar un servidor apache y mysql utilizando EasyPHP y PhpMyAdmin

Las necesidades de montar un servidor local propio ya sea para su uso en la misma computadora o en una LAN, WAN o MAN han ido aumentado con el tiempo, la necesidad de almacenar grandes cantidades de información se ha hecho común, y una buena opción para almacenarlos es mediante una base de datos MySQL conocido globalmente por millones de programadores. Hoy en DIA cualquier desarrollador de software se ve obligado a montar su propio servidor tanto como para poder escribir sus programas como también a la hora de hacer la entrega del paquete a quienes contrataron el servicio.

En este tutorial explicaremos como montar nuestro propio servidor para utilizarlo en el host local.

El primer paso a llevar a cabo es bajar las versiones mas recientes de EasyPHP y phpMyAdmin, las versiones actuales al momento de escribir este TecnoTurorial son EasyPHP1-8 y phpMyAdmin-2.9.0.2, que podrán bajarlos haciendo click sobre ellos, o visita los sites oficiales de estos aquí:

EasyPHP

phpMyAdmin

En total 11,1 Mb, luego instalaremos el easyPHP siguiendo los pasos para la instalacion.

1) Seleccionamos el idioma

2) Nos dan la bienvenida, click en Next

3) Leemos y aceptamos la licencia, clicqueamos Next

4) Leemos la información importante que nos proporcionan y click en Next

5) Proporcionamos la ruta de instalacion y click en Next

6) Indicamos el grupo de trabajo

7) Y por ultimo confirmamos los datos ingresados y procedemos a la instalación, cliqueando Install

8) Una vez terminada la instalación, click en Finish

Y con esto ya tenemos instalado el EasyPHP, solo necesitaremos iniciar y si ve la necesidad de actualizar sus archivos de configuración pedirá permiso para reiniciar la aplicación, le damos que si y el se encarga de todo, luego iniciara los servicios y estará listo para utilizar.

Con esto podremos usar php y Mysql en el host local, aun no podremos ingresar mediante una computadora que esta en la misma red, para hacer que el servidor funcione en LAN se deberán modificar algunas cositas en el archivo httpd.conf que se encuentra en EasyPHP1-8\conf_files\ en el próximo tutorial nos centraremos en la configuración de este archivo.

Luego descomprimimos el phpMyAdmin y cambiamos el nombre de la carpeta para tener un modo de acceso mas fácil, en vez de algo como phpMyAdmin-2.9.0.2-all-languages, podríamos tener phpMyAdmin. Esta carpeta debemos moverla a la carpeta EasyPHP1-8\www\

Y con esto tenemos instalado nuestro servidor Apache + MySQL, además de eso tenemos nuestro gestor web de base de datos MySQL, solo restar abrir un explorador, e ingresar a http://localhost/ o 127.0.0.1 que es equivalente a localhost y podremos ver el index del EasyPHP y de ahí ya podremos navegar localmente por nuestras webs gracias al servidor que hemos montado. Todas las webs que se quieran montar bastara con copiarlas dentro de la carpeta www.

Esto es todo por el momento, luego expandiremos mas esto en otro tutorial permitiendo que este servidor pueda ser accesado remotamente desde otras computadoras, entre tanto estate atento para esta nueva entrega, un saludo desde TecnoTutoriales.

viernes, 19 de enero de 2007

Creación de SISTEMA DE AYUDA en Java utilizando JAVAHELP

Quizás muchos de vosotros no hayáis pensado que incluir la típica “Ayuda” en la barra de herramientas de vuestras aplicaciones le ofrecerá un valor añadido a vuestro cliente y quizás os pueda ahorrar de las pesadas conservaciones con cliente que ha contratado vuestros servicios.

En muchos de los casos las aplicaciones quizás no requieran, por su complejidad, un manual de soporte al usuario final. Sin embargo, en proyectos mayores servirá como documentación adicional que el usuario podrá consultar para resolver posibles problemas que puedan surgirle sin necesidad de tener que ponerse en contacto con el desarrollador de la aplicación.

Que dispongamos de esta herramienta para la plataforma Java y que su uso no sea sumamente complicado no significará que sea necesario desarrollar la ayuda para el clásico tres en raya; el usuario no la consultará nunca y eso se verá traducido en trabajo inútil que nunca será valorado. ¿Para que comprarte un 200cv si no puedes pasar de 120 km/h…?

Llegados a este punto creo que no es necesario describir que es JavaHelp. Se trata de un conjunto de herramientas que permiten crear el clásico sistema de ayuda con unos resultados profesionales.

El resultado dependerá, como no, de lo que se lo trabaje cada uno. Quizás alguna vez hayáis entregado un manual de usuario a vuestro cliente; pues bien, este manual puede haber sido más o menos consultado en función del empeño que hayáis puesto en él.

Para poder llevar a cabo nuestro sistema de ayuda deberemos disponer de la máquina virtual JAVA, de un IDE para el desarrollo (yo utilizo NetBeans), un editor de texto y del fuente JavaHelp, que podéis descargar en http://java.sun.com/products/javahelp/download_binary.html. El binario contendrá las clases necesarias para desarrollar la ayuda y los ficheros JAR necesarios para distribuir con la aplicación.

Como habéis podido ver en tutoriales anteriores, el estándar XML ofrece un abanico infinito de posibilidades. Aquí no iba a ser menos. Para el desarrollo de nuestra ayuda deberemos crear 3 archivos que seguirán el citado estándar. Los formatos de los ficheros serán *.jhm, *.xml y *.hs. Ándate con cuidado, JavaHelp es Case-Sensitive.

1.- Fichero JHM: El formato para este archivo deberá ser el siguiente:

Lo que haremos en este fichero será definir cada una de las páginas que compondrán nuestra ayuda (que deberán estar en formato HTML). Un ejemplo podría ser “altaCliente.html”, “bajaCliente.html”, “asociarCliente.html”… Además definiremos los iconos que se utilizarán para mostrar los nodos (carpeta raíz desplegada, carpeta raíz cerrada,…).

Un ejemplo real de este fichero podría ser el siguiente:

En el ejemplo se han definido 5 páginas (archivos html) y 6 iconos (archivos de imagen).

2.- Fichero XML: Ahora será necesario, para cada entrada creada anteriormente, asignarle un nombre, que será el que se muestre en el árbol jerárquico. Analicemos el siguiente ejemplo:



CategoryOpenImage y CategoryClosedImage hace referencia al icono que se mostrará cuando el nodo padre del árbol esté desplegado/plegado. TopIcImage será el icono que se mostrará en los nodos hoja, text será el texto del nodo y target la referencia asociada a la página, que se ha identificado en el fichero JHM.

3.- Fichero HS: El formato de este fichero, así como la explicación de cada uno de los valores es el siguiente:



Una vez creados estos 3 ficheros crearemos un índice con las palabras clave que compongan nuestro manual. Para ello deberemos hacer uso del script jhindexer que encontraremos en javahelp/bin. Supongamos que tenemos todos nuestros ficheros html en la carpeta JavaHelp (como es mi caso); deberemos teclear, pues, en la línea de comandos jhindexer JavaHelp.

El Script nos creará una carpeta (JavaHelpSearch). Es importante que este comando lo ejecutemos una vez tengamos la jerarquía de directorios creada ya que si movemos los ficheros deberemos volver a ejecutar el script ya que se perderán las referencias a los índices creados.

Ahora será interesante realizar una vista de cómo se mostrará nuestra ayuda antes de integrarla en la aplicación. Para ello utilizaremos un jar que se encuentra en demos/bin (dentro de la carpeta JavaHelp, claro está). Para realizar esta vista previa ejecutaremos la instrucción java – jar hsviewer.jar. Se nos mostrará un cuadro de diálogo en el que deberemos especificar, en el primer campo, el nombre del fichero hs junto con su extensión (por ejemplo: ayuda.hs). En el segundo campo deberemos definir la ruta.

El último paso será añadir el sistema JavaHelp a nuestra aplicación. Primero deberemos añadir las clases necesarias para su correcta compilación y funcionamiento. Posteriormente deberemos definir la URL del fichero con extensión hs y crearemos una instancia del objeto HelpSet. El tercer paso será instanciar un objeto de la clase HelpBroker. Únicamente nos quedará asignar el evento al botón que vayamos a utilizar para mostrar la ayuda (por ejemplo al pulsar F1). El código resultante podría asemejarse al siguiente:


import javax.help.*;

try {
URL hsURL = HelpSet.findHelpSet(null, "../help/fichero.hs");
hs = new HelpSet(null, hsURL);
} catch (Exception e) {
System.out.println("HelpSet "+hs+" no encontrado")
return;
}

HelpBroker hb = hs.createHelpBroker();
help_browser.enableHelpOnButton(btnHelp, "introduction", hs);


Recuerda que será necesario que añadas una de las librerías de sistema (las de extensión jar) en el classpath de tu aplicación (por ejemplo, jh.jar).

miércoles, 17 de enero de 2007

Teoría básica de los WEBSERVICES

El siguiente artículo no lo trataremos de forma tan práctica como con otros anteriores.

Por lo tanto no consideraremos este texto como un tutorial sino como un artículo debido a que creemos que puede ser, de cualquier forma, de vuestro interés.

Es habitual el bombardeo por medio de páginas, spam, publicidad, banners… de términos ingleses muy novedosos que ni siquiera conocen quienes hablan de ellos.

1.- ¿Qué es un WebService?

La traducción literal de WebService es servicio web, con lo que podremos imaginar por donde irán los tiros. No son más que aplicaciones que proveen de datos Y/O servicios a otras aplicaciones. Se trata de un sistema de comunicación (que sigue unos estándares básicos basados en XML) entre diferentes servidores.

Dichas aplicaciones se encuentran “empaquetadas” en la red y contienen una colección de funciones. Cualquier aplicación puede acceder a un servicio web sin importar en que plataforma resida el servicio o en que lenguaje haya sido desarrollado. Para entenderlo de una manera sencilla, imagina la cada día más clásica tienda virtual. Si buscamos en la web encontraremos rápidamente WebServices que ofrecen un intercambio directo entre la tienda virtual y la entidad bancaria.

Otros ejemplos serían el caso de Amazon.com, que permite acceder directamente a sus servicios manejando el “carrito de la compra” o Google, el cuál puede invocar la búsqueda directamente usando una API.

El acceso a los servicios web suele ser vía http o https, ésta última mucho más segura. Sin embargo, los WS también pueden funcionar bajo los protocolos FTP, SMTP o TCP.

El uso de los WebServices (a partir de ahora WS), asegurarán pues, una interoperabilidad entre sistemas. Es de suma importancia analizar los beneficios que supone el uso de los WS ya no sólo para desarrolladores (que se liberarán de la tarea de desarrollar software propio), sino también para empresas (que permitirán que los desarrolladores dediquen su tiempo a enfocarse en el valor añadido de la compañía reduciendo así costes).

También podríamos hacer una descripción algo más técnica del término; se trata de una interface que se encuentra entre el código de aplicación y el código del usuario.

Todo esto está muy bien y es muy interesante pero, ¿como se invoca un WS?

2.-Invocación de los WS
La invocación se basa en 4 capas: Descubrimiento (protocolo UDDI), descripción (protocolo WSDL), invocación (protocolo XML/SOAP) y transporte (protocolo TCP/SMTP/HTTP).


Capa 1 - Descubrimiento / Discovery: Se trata de obtener el WS que cumpla los requerimientos que “andamos buscando”. Por ejemplo, un WS que nos devuelve la población de cada una de las provincias de un país.

Capa 2 - Descripción / Description: Ahora que ya hemos localizado el servicio en la red, deberemos saber cómo invocarlo para obtener los resultados deseados. En el caso de que queramos saber los habitantes de Barcelona, ¿qué método deberemos utilizar; getBarcelona(), getPoblacion(String: ciudad,…)?

Capa 3 - Invocación / Packaging: Deberemos llamar al método correspondiente utilizando los parámetros correspondientes. Para ello se utiliza el protocolo SOAP, como norma general.

Capa 4 - Transporte / Transport: Se encarga del transporte de datos (respuesta) entre servidores.

3.-Creación y puesta en marcha de un WS
Como hemos comentado anteriormente, un WS puede es independiente de la plataforma y del código que se haya empleado. Sin embargo, el WS deberá ser publicado para que posteriormente pueda ser “descubierto”. Esto se realizará mediante un documento WSDL. El WS además será necesario que se publique en el registro UDDI, que no es más que una base de datos de WS.

WSDL, SOAP, UDDI… ¿como funciona cada protocolo?
Todos y cada uno de los protocolos se basan en el estándar XML.

a) SOAP (Simple Object Access Protocol): Este protocolo define un mecanismo para el paso de instrucciones (comandos) y parámetros entre clientes y servidores. Independiente tanto del modelo de datos, como del lenguaje de programación utilizado y de la plataforma.

b) WSDL (Web Services Description Language): Este protocolo indica qué operaciones puede realizar el WS, dónde se ubica, cómo se invoca…) WSDL describe un servicio como una colección de puertos (“communication endpoints”) capaces de intercambiar mensajes, pudiendo describir en forma abstracta operaciones y mensajes, prescindiendo de las especificaciones de protocolo y tipo de datos.
WSDL vincula las descripciones abstractas a una implementación concreta de protocolos y tipos de datos, permitiendo la reutilización de las definiciones abstractas. Este documento se puede crear de forma manual o utilizando alguna aplicación que lo genere de forma automática, como podría IBM Web Services Toolkit o Apache WebServices Toolkit.

c) UDDI (Universal Description Discovery and Integration): Este protocolo permite que se listen, busquen y descubran este tipo de software. Podríamos llegar a compararlo con las clásicas páginas amarillas.

Obtener la ruta de la aplicacion en Java con StringTokenizer

El usuario final de cualquier software debería poder instalar este en la unidad y carpeta que el decida mas conveniente, por lo que a la hora de escribir el programa no podemos simplemente especificar la ruta en la que estará instalada este soft posteriormente.

Mediante getClass().getResource("archivo.ext"); podemos obtener el URL desde donde se esta ejecutando el programa, y obtener la dirección exacta del archivo que deseemos localizar, el problema radica en que nos devuelve algo como esto:

file:/C:/Documents%20and%20Settings/SLiM/Escritorio/Tecno/programa/Tutoriles/classes/archivo.ext

Una clase de mucha utilidad para casos como este es StringTokenizer, que nos permite recorrer un String en partes divididas por un carácter común, en este caso nuestro carácter común será "/".


Aquí les dejo un ejemplo de como utilizando StringTokenizer podemos obtener nuestra ruta exacta algo así como: "C:/Documents%20and%20Settings/SLiM/Escritorio/Tecno/programa/Tutoriles/classes/archivo.ext"

import java.util.StringTokenizer;

public class miPrograma {

public String getPath(String file){

String ruta = getClass().getResource(file).toString();
StringTokenizer tokenizer = new StringTokenizer(ruta, "/");
tokenizer.nextToken(); // Para saltar el la parte que no deseamos
String newRuta="";

while (tokenizer.hasMoreTokens()) {
newRuta+= tokenizer.nextToken()+"/";
}

return newRuta;
}

public static void main(String[] args) {
miPrograma instancia=new miPrograma();
System.out.println(instancia.getPath());

}

}

Esperamos que este miniTecnoTurorial haya sido de utilidad. Un saludo desde TecnoTutoriales.

Como almacenar y recuperar datos utilizando archivos de texto con Java

Para cualquier sistema informático es de vital importancia poder almacenar datos, de manera tal que la próxima vez que se encienda el ordenador y accedamos al sistema podamos recuperarlos, una forma de almacenar datos seria escribiéndolos sobre un archivo de texto.

import java.io.File;
import java.io.FileWriter;

Para ello necesitaremos de 2 clases fundamentales File y FileWriter, para poder instanciarlos debemos importar las siguientes librerías:

import java.io.File;
import java.io.FileWriter;

Luego crearemos el archivo:

File miArchivo = new File("unArchivo.txt");

También necesitaremos instanciar a FileWriter (que recibe como parámetro un archivo) que es el encargado de rellenar el archivo con la información:

try {

FileWriter writer = new FileWriter(miArchivo);

}

catch (IOException ex) {
ex.printStackTrace();

}

Ahora es el momento en el que debemos escribir los datos en el arhivo, siempre dentro del Try:

writer.write("Este es mi texto almacenado");

Y por ultimo debemos cerrar el FileWriter, dentro del Try:

writer.close();

Observacion: Sin este ultimo paso, el archivo quedaría vació.

Generalmente estamos acostumbrados a cerrar el archivo, en este caso el FileWriter se encarga de cerrar el archivo y guardar los cambios realizados.

De esta manera el archivo ha sido creado, ya contiene la información que se le proporciono para almacenar, y estos datos persistirán en disco.

Ahora si, cada vez que escribamos algo al archivo con write, esto se almacenara justo después de lo ultimo escrito, osea que si lo hacemos así:

writer.write("Este es mi texto almacenado");
writer.write("Este es mi texto almacenado");
writer.write("Este es mi texto almacenado");
writer.write("Este es mi texto almacenado");
writer.close();

Lo que tendremos como resultado en el archivo seria exactamente esto:

Este es mi texto almacenadoEste es mi texto almacenadoEste es mi texto almacenadoEste es mi texto almacenado

Podríamos separalos mediante caracteres de escape como \n para una nueva línea, aunque seria tedioso a la hora que necesitemos almacenar 1000 líneas, por lo que aconsejaría utilizar aparte del FileWriter la clase PrintWriter que recibe como parámetro al FileWriter que a la vez ya tiene asignado el archivo sobre el cual va a trabajar, en este caso la clase el método quedaría algo así:

public void escribirArchivo(String datos){

File miArchivo = new File("unArchivo.txt");

try {
FileWriter writer = new FileWriter(miArchivo);
PrintWriter printer=new PrintWriter(writer);
printer.println(datos);
printer.close();
}

catch (IOException ex) {

ex.printStackTrace();
}

}

Comparando el método write con el println:

printer.println("Este es mi texto almacenado");
printer.println("Este es mi texto almacenado");
printer.println("Este es mi texto almacenado");
printer.println("Este es mi texto almacenado");

Tendríamos como resultado:

Este es mi texto almacenado
Este es mi texto almacenado
Este es mi texto almacenado
Este es mi texto almacenado

en lugar de:

Este es mi texto almacenadoEste es mi texto almacenadoEste es mi texto almacenadoEste es mi texto almacenado

que es lo que se obtuvo con:

writer.write("Este es mi texto almacenado");
writer.write("Este es mi texto almacenado");
writer.write("Este es mi texto almacenado");
writer.write("Este es mi texto almacenado");

Nótese que no cerramos el writer sino el printer, ya que printer se encarga de cerrar todo lo demás, guardando así los cambios realizados.

En caso de querer modificar el archivo ya creado, primero se deberá almacenar en una variable el dato que ya contiene, debido a que al escribir de nuevo se sobrescribirá el archivo.

Para leer el contenido del archivo necesitaremos crear instancias de BufferedReader y FileReader, y una variable String para almacenar los datos leídos, entre los imports se debera agregar:

import java.io.FileReader;
import java.io.BufferedReader;

Luego creamos el archivo y el BufferedReader que contendrá todo lo que esta escrito en el archivo:

File miArchivo = new File("unArchivo.txt");
BufferedReader reader = null;
try {
reader = new BufferedReader(new FileReader(miArchivo));
String linea = reader.readLine();
String datos="";

Ya solo queda recorrer el archivo y guardar cada linea en la variable datos:

while(linea!=null){
datos+=linea;
reader.readline();
}
} catch(IOException ex){
ex.printStackTrace
}

Ahora si, ya tenemos lo contenido en el archivo dentro de la variable datos, y podemos utilizarla para lo que necesitemos, para visualizarla en un JTextArea, o simplemente imprimirlo a consola, etc.

Espero este tutorial haya sido de ayuda, no dudes en escribirnos, sobre cualquier duda, tutorial o sugerencia que tengas para aportar.

martes, 16 de enero de 2007

Encriptar y desencriptar passwords en Java con Blowfish

Muchas veces al desarrollar un sistema, los programadores nos vemos obligados a almacenar datos que no son de interés común a todos los usuarios que lo utilicen, mas bien son datos privados de cada usuario particular, especialmente en el caso de contraseñas o passwords, que deben permanecer almacenados manera tal que el sistema tenga conocimiento de ellos, pero no asi las personas que lo utilicen. En casos como este debemos almacenar estas cadenas de manera no legible a los usuarios.

Imagínese que tenemos la lista de usuarios con sus respectivos datos, y su contraseña almacenadas en una base de datos, y que tal base de datos caiga en manos de alguna persona con malas intenciones, ver el contenido de una db no es de lo mas difícil, esta persona podría obtener el usuario y contraseña del administrador del sistema, pudiendo asi modificar información vital del sistema, tales asi como montos, tazas de cambio, costos, salarios, etc, ocasionando perdidas a la compañía.

Pero que sucede si el campo mas importante de la fila "Password" esta encriptada?, sencillamente los datos obtenidos no servirían de nada, a no ser que los pueda desencriptar.

En este articulo, se explica como podemos encriptar y desencriptar un password (sin espacios) en otros tutoriales explicaremos como podríamos almacenar estos passwords en un archivo de texto, o una base de datos.

A continuación tenemos la clase que nos permitirá encriptar y desencriptar lo que necesitemos:

import java.security.*;
import javax.crypto.*;
import javax.crypto.spec.*;
import java.security.spec.*;
import java.io.*;

public class Blowfish {

public static String encriptar(String cleartext, String key)

throws Exception {

return crypt(cleartext, key, Cipher.ENCRYPT_MODE);

}

public static String desEncriptar(String ciphertext, String key)

throws Exception {

return crypt(ciphertext, key, Cipher.DECRYPT_MODE);

}

private static String crypt(String input, String key, int mode)

throws Exception {

// Install SunJCE provider

Provider sunJce = new com.sun.crypto.provider.SunJCE();

Security.addProvider(sunJce);

KeyGenerator kgen = KeyGenerator.getInstance("Blowfish");

kgen.init(448);

SecretKey skey = kgen.generateKey();

byte[] raw = key.getBytes();

SecretKeySpec skeySpec = new SecretKeySpec(raw, "Blowfish");

Cipher cipher = Cipher.getInstance("Blowfish/ECB/PKCS5Padding");

cipher.init(mode, skeySpec);

ByteArrayOutputStream bos = new ByteArrayOutputStream();

ByteArrayInputStream bis = new ByteArrayInputStream(input.getBytes());

CipherOutputStream cos = new CipherOutputStream(bos, cipher);

int length = 0;

byte[] buffer = new byte[8192];

while ((length = bis.read(buffer)) != -1) {

cos.write(buffer, 0, length);

}

bis.close();

cs.close();

return bos.toString();

}

}

Siendo los metodos principales encriptar y desEncriptar de la clase Blowfish públicos y estáticos nos dará la facilidad de utilizarlos sin necesidad crear una instancia de la clase sino que bastara con invocar la clase y luego el metodo, de modo que podemos almacenar el resultado en una variable String de la siguiente manera:


try {

String passwordEncriptado=Blowfish.encriptar("miPassword", "llave");

}

catch (Exception ex) {

ex.printStackTrace();

}

donde:

miPassword es la contraseña que deseamos encriptar

y llave es precisamente la llave que se tendrá en cuenta para encriptar y desencriptar

Bien, ahora ya tenemos el ciphertext del password almacenada en passwordEncriptado, con un

System.out.println(passwordEncriptado); podemos ver el ciphertext que es õÛR.Â<¶ìZïúÞÆˆ}³ equivalente a miPassword

De la misma manera si queremos desencriptarlo bastara con llamar al método desEncriptar de la siguiente manera:

try {

String passwordDesencriptado=Blowfish.desEncriptar(passwordEncriptado,"llave");

}

catch (Exception ex) {

ex.printStackTrace();

}

Donde:

passwordEncriptado es el ciphertext, y la llave es la llave utilizada para encriptarlo. Observación importante: Si se utiliza una llave diferente no se podrá recuperar el password, sino que obtendremos otra cadena en vez de la original.

Si imprimimos a consola podremos ver que passwordDesencriptado = "miPassword". Tal como estaba antes de encriptarse.

Con esto ya tenemos el poder para almacenar información confidencial, dando mas seguridad al sistema en cuanto a perdida, modificaciones y robo de informaciones.

Espero este tutorial haya sido de ayuda, no dudes en escribirnos, sobre cualquier duda, tutorial o sugerencia que tengas para aportar.

Crear un servidor de noticias RSS utilizando RSS Builder y Dreamweaver 8

Internet, la red de redes, avanza a pasos agigantados. Una web estática no es llamativa para el usuario; se ve arcaica, retro, antigua, desactualizada…simplemente parece ser una información que alguien colgó algún día y que reside allí esperando a que el autor algún día se digne a modificar. Y es que el tópico de renovarse o morir es totalmente aplicable a la web 2.0.

Últimamente vemos más a menudo como las páginas web se actualizan de una forma sencilla y dinámica. Cualquier usuario sin conocimientos avanzados puede tener su propio blog e ir actualizándolo de una forma rápida y cómoda.

El siguiente artículo va dirigido a aquellos webmasters que deseen incluir una sección de noticias en su web. Los usos de los conocimientos adoptados después de leer el artículo pueden adaptarse en función de la imaginación y la usabilidad que le de el programador: lista de novedades, de artículos recientes… incluso podría llegar a programarse su propio blog desde 0.

Os pondré un ejemplo para que lo entendáis de una forma más clara: en http://www.provicsa.com/ hay una sección de actualidad inmobiliaria que se actualiza a diario para nuestros clientes. La implementación podría haberse realizado de dos maneras: la primera sería haciendo una suscripción a un servidor de noticias RSS, el cuál nos “bombardearía” de noticias que quizás no nos interesarían y que, por lo consiguiente, no podríamos controlar. La segunda opción sería crear nosotros nuestro propio servidor de noticias. Esta opción quizás no sea tan cómoda como la primera y requiera de unos conocimientos más avanzados en cuanto a programación hago referencia, pero la personalización del canal dará un valor añadido a nuestro feed (o servidor de noticias).

Este artículo va orientado a desarrolladores web que tengan unos conocimientos básicos sobre XML y sus posibles usos. Si no conoces nada sobre este lenguaje te recomendamos que eches un vistazo en los buscadores.

¿Pero, qué es RSS?
Se trata de una especificación del estándar XML para utilizar en sitios que se actualizan frecuentemente facilitando la agregación de información de medios a partir de procedimientos automáticos. No es más que un documento XML que incluye información orientada a listas.

A continuación se detalla el patrón XML que sigue el estándar RSS:

INFORMACIÓN GENERAL DEL CANAL
- Título del canal RSS
- Vínculo
- Descripción (¿qué función tiene el canal, a quién va dirigido?)
ELEMENTOS (serán cada una de nuestras noticias):
- Título (título de cada una de las noticia, por ejemplo)
- Vínculo de la noticia
- Descripción (pequeña introducción sobre qué tratará la noticia)
- Fecha de publicación
- Fuente de la noticia o autor

PASO 1: CREAR ARCHIVO RSS
Una forma de crear el archivo RSS sería hacerlo de forma manual, utilizando cualquier editor de texto ya que, como se ha comentado anteriormente, el resultado será un archivo que seguirá el patrón XML. Sin embargo, el objetivo es que se pueda modificar el contenido web de una forma ágil y eficaz, y esto sería realmente una manera tediosa.

Otra forma más cómoda y rápida de crear este canal de noticias sería haciendo uso de alguna aplicación que utilice una interfaz gráfica amigable y de uso sencillo que nos genere por si misma el fichero RSS.

En nuestro caso crearemos el canal RSS (o también feed o canal de noticias) mediante RSS BUILDER, que podemos descargar desde www.snapfiles.com/get/rssbuilder.html

El proceso de instalación es rápido y el asistente no planteará ningún tipo de complicación al usuario.

La aplicación funciona de forma similar a un FTP. Nuestro feed deberá estar alojado en algún sitio en la red (deberemos tener un espacio donde alojarlo), con lo que será necesario configurar el acceso para subir el fichero que generemos. Dicha configuración la haremos accediendo a Settings >> FTP Site Manager o con el método abreviado de teclado CTRL+F.

Deberemos definir un nuevo sitio (New Site) y asignarle un nombre (en este caso, PROVICSA). Posteriormente deberemos rellenar los campos que aparecen en la parte derecha del cuadro de diálogo con los datos del servidor. Los campos user y password hacen referencia a los mismos datos que utilizas para conectarte a tu servidor FTP. En el campo Remote Path incluiremos la ruta en la que ubicaremos el feed. Si se mantiene el valor por defecto, el programa entenderá que se copia en la raíz del server. Un ejemplo de este campo podría ser /httpdocs/noticias/. En este caso el fichero lo encontraremos dentro de la carpeta "noticias", y esta carpeta "noticias" estará dentro de la carpeta "httpdocs".

Remote File hará referencia al nombre del archivo que creemos (con extensión XML). Por ejemplo, podríamos llamarlo noticias.xml. Por lo tanto, nuestro fichero RSS lo encontraremos en nuestro server en la ruta /httpdocs/noticas/noticias.xml.

Una vez completados todos los datos del servidor ya podremos empezar a trabajar con nuestro feed. En la parte izquierda de la pantalla principal encontramos las propiedades del canal, como puede ser el título (en el caso de Provicsa le hemos asignado “Últimas noticias del sector inmobiliario”). Iremos rellenando los campos que creamos oportunos con los valores que queramos asignar. No es obligatorio rellenar todos los campos.

Ahora únicamente nos quedará ir añadiendo cada una de las noticias o items. El programa nos muestra 4 botones (añadir item, eliminarlo, desplazar hacia arriba y desplazar hacia abajo).
Haciendo clic sobre el primer icono (añadir item) crearemos el primer item o noticia. Los campos principales serán el título, el enlace (que será el de la página correspondiente que contendrá la noticia completa) y la descripción, donde como norma general se incluirá una breve descripción, introducción o resumen de lo que será la noticia en cuestión. Con dicho campo podrás incluir enlaces, textos en negrita… para ello utiliza el icono HTML Editor y verás todas las posibilidades que el programa ofrece.

Iremos añadiendo tantas noticias como sea necesario y, una vez finalizado el proceso de inserción de datos, será necesario subir el fichero al servidor. Esto lo haremos mediante el icono Publish Feed. Aparecerá un cuadro de diálogo en el que deberemos seleccionar el servidor (que será el que hayamos configurado previamente, en nuestro caso PROVICSA). Además, podremos indicar cuantos ítems queremos subir al server. La misma aplicación se encargará de subir el fichero al servidor.

Una vez cierres el programa, éste te preguntará si deseas almacenar el fichero. Esta copia se refiere a nivel local, ya que en el servidor ya la tendremos almacenado.

De esta forma ya tendremos creado nuestro canal de noticias. Siempre que queramos modificar el fichero únicamente será necesario iniciar la aplicación, hacer clic sobre el icono Download Feed, actualizar los datos que sean necesarios y volver a subir el canal al servidor. Así de simple.

PASO 2: PROCESAR EL FICHERO RSS
El objetivo siguiente es el de procesar nuestro fichero RSS para mostrar las noticias en nuestro sitio web. Para ello utilizaremos Dreamweaver 8. Lo primero que tendremos que hacer será crear un fragmento de XSLT. Esto lo hacemos de la siguiente manera: Archivo >> Nuevo >> Categoría Básica >> XSLT (fragmento). Al aceptar, Dreamweaver nos pedirá que asociemos una fuente de datos (archivo XML) para asociar el nuevo fragmento de XSLT. En nuestro caso pondremos la ruta del feed que hemos creado anteriormente con RSS Builder. Una vez asociado el fichero, Dreamweaver nos mostrará el panel de vinculaciones. Si la aplicación no te muestra el panel de vinculaciones, haz clic sobre Ventana >> Vinculaciones o utiliza el método de teclado abreviado CTRL+F10 para mostrarlo.

En el panel de vinculaciones lo que se nos mostrará es el aspecto del fichero XML que hemos asociado. Deberemos arrastrar y soltar los nodos que nos interesen al panel de diseño. Por ejemplo, si queremos insertar el título del canal, bastará con arrastrar el nodo title (cuyo padre es channel) a dicho panel.

Para insertar el título de las noticias arrastraremos el nodo title cuyo padre es item. Al arrastrar dicho nodo a la pantalla de diseño, lo que se mostrará será el siguiente texto:
{rss/channel/item/title.

Ahora introduciremos el autor de la noticia. Para ello situaremos el cursor al final del marcador XML y presionamos Mayús+Enter para introducir una nueva línea. Ahora introduciremos, por ejemplo: “Escrito por:” o, en el caso de Provicsa, “Fuente: ”. Se trata del texto que se mostrará, para cada noticia, de quién ha escrito o de dónde proviene la noticia. Ahora únicamente consiste en arrastrar el nodo autor (cuyo padre es item). Iremos añadiendo los ítems y los textos que queramos de la misma manera (“Resumen: ” acompañado del nodo “description”, por ejemplo). Puedes realizar una vista previa en el navegador mediante F12. Se mostrará el título y el autor de la última entrada añadida en el canal de noticias.

Eso está muy bien, pero lo que queremos es que se nos muestren todas las entradas, no únicamente la última que hemos añadido al fichero RSS. Para ello deberemos crear una región repetida que se encargue de recorrer todos los elementos del feed, como si de un bucle se tratara. Para ello, en la pantalla de diseño, seleccionaremos todo aquello que queramos que se repita para cada una de las noticias y, en la ventana de propiedades (si no se muestra utiliza Ventana >> Propiedades o utiliza el método abreviado CTRL+F3) , seleccionaremos como formato Párrafo. De esta forma conseguiremos que cada noticia se muestre como un párrafo diferente. Una vez hecho esto, y con el texto aún seleccionado, haremos clic sobre Insertar >> Objetos XSLT >> Repetir región. Un cuadro de diálogo nos pedirá el nodo a repetir. Deberemos seleccionar el nodo item. Una vez realizado el paso guardaremos los datos y crearemos una vista previa para ver que se ha creado correctamente la región repetida. Aplicaremos los estilos CSS que creamos necesarios, aunque no se mostrarán al realizar la vista previa.

El siguiente paso consistirá en crear los vínculos correspondientes para cada una de las noticias. Cada artículo deberá apuntar a su link. Para acceder a este link lo podemos crear de la manera que más nos guste. Podríamos hacerlo al hacer clic sobre el título, o sobre la descripción, o con el clásico “leer” o “Acceder a la noticia”. En este caso lo haremos mediante el citado “Acceder a la noticia”. Para ello deberemos introducir este texto en la región repetida que hemos creado. Una vez introducido el texto dentro de la región, lo seleccionaremos y haremos clic sobre la carpeta que se encuentra adjunta a la etiqueta de vínculo. Aparecerá una pantalla para seleccionar el archivo; no nos interesará que el vínculo sea un fichero, sino que sea una fuente de datos. Para ello, selecciona la opción Fuente de datos y selecciona el nodo link cuyo padre es item. Una vez realizada la operación, salvaremos los datos y generaremos una vista previa para verificar que el paso se ha realizado correctamente y los enlaces funcionan a la perfección.

La primera parte ya estará finalizada. Ahora faltará integrar este fragmento XSLT a una página dinámica. En este caso crearemos un nuevo documento llamado actualidad-inmobiliaria.php, por ejemplo. Aconsejamos que almacenes el fichero en la misma ruta que el fragmento XSL. Realizaremos el diseño para la página que creamos oportuno, eso ya va "a gusto del consumidor". Recuerda que deberás reservar un área para introducir la sección de noticias.

Una vez sepamos donde ubicar la sección de noticias, situaremos allí el cursor y ya sólo faltará incluir el fragmento en nuestra página dinámico. Esto lo haremos de la siguiente manera: Insertar >> Objetos de aplicación >> Transformación XSL. Seleccionaremos el fragmento que hemos creado anteriormente (el fichero XSL) y Dreamweaver detectará la fuente de datos de forma automática. Una vez pulsemos Aceptar se generará una carpeta llamada includes en la raíz del sitio. Dicha carpeta contendrá la biblioteca que realiza la transformación en el lado del servidor y debe cargarse en el servidor de prueba. Es importante recalcar que esta carpeta, el fragmento XSLT y la página dinámica deberán subirse al servidor para que el feed funcione correctamente. Ahora sí se mostrarán los estilos aplicados al documento XSLT.

De esta forma ya podremos visualizar nuestro feed en nuestro sitio web.

Esperamos que este documento haya sido de utilidad. Un saludo desde TecnoTutoriales.