Artículos
Java

Listar las claves de una Hashtable

31/Mar/2011

El otro día veíamos cómo crear una Hashtable para insertar pares clave/valor. En el mismo ejemplo podíamos ver cómo insertar un par clave/valor con el método .put() y como recuperar un valor, dada una clave, con el método .get().

Hashtable paises = new Hashtable();
paises.put("ES", "España");
paises.put("UK", "Reino Unido");
paises.put("US", "Estados Unidos");
paises.put("FR", "Francia");

Y es que el mecanismo de la Hashtable se basa principalmente en las claves. Pero, ¿cómo conocemos las claves que hay en una Hashtable? ¿es posibre listar estas claves?

Para poder listar las claves de una Hashtable podemos utilizar el método .keys(). El método .keys() nos devuelve un Enumeration con todas las claves de la Hashtable.

Enumeration e = paises.keys();

Así que solo tendremos que recorrer el Enumeration para listar cada una de las claves. El Enumeration nos dará elemento a elemento mediante el método .nextElement().

while(e.hasMoreElements())
  System.out.println(e.nextElement());

Mediante .hasMoreElements() comprobaremos si queda algún elemento por listar.

Vídeos sobre Java

Disfruta también de nuestros artículos sobre Java en formato vídeo. Aprovecha y suscribete a nuestro canal.

Test Java

¿Te atreves a probar tus habilidades y conocimiento en Java con nuestro test?

Test Java
Artículos
Java

Número de ocurrencias en un array

30/Mar/2011

Un par de nuestros usuarios nos preguntaban sobre cómo calcular las ocurrencias que aparecen en un array de números. Es decir, cuántas veces aparece un número en u n array. Así, que vamos a ver cómo hacerlo…

La idea será recorrer el array (no nos queda otro remedio) y mientras recorremos el array guardar los números en un HashMap. Dónde la clave es el número a contabilidad y el valor asociado a esa clave la cantidad de veces que aparece dicho número.

Lo primero, el array y el HashMap:

int[] listaNumeros = {1,4,7,8,9,2,7,15,4,6,9,9,8};
HashMap hm = new HashMap();

Ahora empezamos a recorrer el array. Si el número del array ya está en el HashMap, esto nos lo dice el método .containsKey(), incrementamos su valor en uno. Si elemento no está en el array lo inicializamos con 1.

for (int x=0;x < listaNumeros.length;x++) {			
  clave = listaNumeros[x];
  if (hm.containsKey(clave))
    hm.put(clave, hm.get(clave)+1);
  else
    hm.put(clave,1);			
}

Para acceder a los elementos de HashMap utilizamos los método .put() y .get()

Una vez cargado el HashMap solo nos quedará listarlo para ver los valores de los números y las ocurrencias que había en el array.

Para listar los elementos del HashMap vamos a utilizar un Iterator, el cual se apoyará en un conjunto o Set devuelto por el HashMap mediante el metodo .entrySet()

Hay que tener cuidado al manipular el conjunto devuelto por el HashMap ya que realmente es una vista del HashMap. Así que cualquier operación de borrado que hagamos sobre la vista se reflejará directamente en el HashMap.

Iterator < Entry < Integer,Integer > > it = hm.entrySet().iterator();
String vez;
 		
while (it.hasNext()) {
  Entry e = it.next();
  vez = (e.getValue()>1)?" veces":" vez";
  System.out.println("El número " + e.getKey() + " aparece " + e.getValue() + vez);
}

Si nos fijamos en el código, cada entrada está representada por un par clave/valor, que en Java se representa con un Map.Entry y que tienen sus métodos .getKey() y .getValue()

Vídeos sobre Java

Disfruta también de nuestros artículos sobre Java en formato vídeo. Aprovecha y suscribete a nuestro canal.

Test Java

¿Te atreves a probar tus habilidades y conocimiento en Java con nuestro test?

Test Java
Artículos
Java

Depurar una conexión SMTP con Java Mail

29/Mar/2011

Cuando estamos trabajando con Java Mail, por ejemplo para realizar envíos de email, en caso de fallo con el protocolo SMTP, puede ser complicado encontrar una solución a un problema. Es por ello que es bueno que sepamos cómo depurar una conexión SMTP con Java Mail.

En una gestión de errores basada en excepciones, cuándo se nos genere un fallo saldrá el código asociado al fallo. Por ejemplo, si no se puede verificar el destinatario, la excepción será la siguiente:

javax.mail.SendFailedException: Invalid Addresses;
  nested exception is:
	com.sun.mail.smtp.SMTPAddressFailedException: 550-Verification failed for 
550-No Such User Here
550 Sender verify failed

Pero, ¿qué ha pasado hasta entonces? ¿qué se ha negociado en el protocolo SMTP?

Para depurar una conexión SMTP con Java Mail simplemente tenemos que activar el modo de depuración a la Session con el método .setDebug().

mailSession.setDebug(true);

Con esto conseguiremos ver en la consola todo el negociado del protocolo SMTP. Por ejemplo:

DEBUG: setDebug: JavaMail version 1.4.1
DEBUG: getProvider() returning javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Sun Microsystems, Inc]
DEBUG SMTP: useEhlo true, useAuth false
DEBUG SMTP: trying to connect to host "mail.lineadecodigo.com", port 25, isSSL false
220-box548.bluehost.com ESMTP Exim 4.69 #1 Sun, 27 Mar 2011 17:35:58 -0600 
220-We do not authorize the use of this system to transport unsolicited, 
220 and/or bulk e-mail.
DEBUG SMTP: connected to host "mail.lineadecodigo.com", port: 25
EHLO vivaldi
250-box548.bluehost.com Hello vivaldi [89.140.22.132]
250-SIZE 52428800
250-PIPELINING
250-AUTH PLAIN LOGIN
250-STARTTLS
250 HELP
DEBUG SMTP: Found extension "SIZE", arg "52428800"
DEBUG SMTP: Found extension "PIPELINING", arg ""
DEBUG SMTP: Found extension "AUTH", arg "PLAIN LOGIN"
DEBUG SMTP: Found extension "STARTTLS", arg ""
DEBUG SMTP: Found extension "HELP", arg ""
DEBUG SMTP: use8bit false
MAIL FROM:
250 OK
RCPT TO:
550-Verification failed for 
550-No Such User Here
550 Sender verify failed

Realmente útil y sencillo activar cómo depurar una conexión SMTP con Java Mail.

Vídeos sobre Java

Disfruta también de nuestros artículos sobre Java en formato vídeo. Aprovecha y suscribete a nuestro canal.

Test Java

¿Te atreves a probar tus habilidades y conocimiento en Java con nuestro test?

Test Java
PHP

Contraseña aleatoria con php

28/Mar/2011

En algunos casos, nos vemos con la necesidad de crear de un conjunto de caracteres alfanuméricos para un uso específico posterior. Un uso habitual podría ser para generar una contraseña aleatoria en un nuevo registro de tu web.

Primero, creamos dos variables que puedes personalizar a tu necesidad.

$caracteres='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
$longpalabra=8;

Puedes personalizar la longitud de la contraseña a generar con la variable $longpalabra, y los caracteres que compondrán la contraseña en la variable $caracteres.

A continuación, creamos un bucle para obtener un valor aleatorio en cada ciclo y que se detenga cuando consigamos la longitud deseada.

for($pass='', $n=strlen($caracteres)-1; strlen($pass) < $longpalabra ; ) {
  $x = rand(0,$n);
  $pass.= $caracteres[$x];
}

Para conseguir el resultado, hemos usado el método de bucle for que nos ofrece PHP, siendo uno de los ciclos más completos, ya que nos permite usar tres expresiones en su sintaxis.

Sintaxis de un ciclo for:

for (expresion1; expresion2; expresion3) {
  sentencia
}
  • La primera expresión se ejecutará una única vez al iniciar el ciclo. Puede contener varias expresiones separadas por coma.
  • La segunda expresión será evaluada antes de iniciar el ciclo, si su valor obtenido es TRUE el ciclo se ejecutará hasta que el valor obtenido sea FALSE. En el caso de tener varias expresiones separadas por coma, únicamente tendrá en cuenta el valor de la última expresión.
  • La tercera expresión se ejecutará cada vez que se termine el ciclo. Puede contener varias expresiones separadas por coma.

Si os fijáis en el código, en la primera expresión la aprovechamos para crear la variable vacía que almacenará nuestra contraseña generada, y para contar los caracteres con la función strlen() a la que restamos un valor añadiendo -1 ya que cuando utilicemos la cadena de texto mas adelante, el primer carácter al igual que sucede con un array corresponde el número 0 y no al número 1. Por ejemplo, podemos contar 20 caracteres pero en la variable estarán asignándolos del 0 al 19, y no del 0 al 20 que sumarían 21.

En la segunda expresión del código, aprovechamos para poner nuestra condición.

Dentro de la sentencia, la función rand() nos dará como resultado un numero aleatorio desde el 0 al número de caracteres disponibles, el cual utilizaremos para añadir el valor a la variable donde almacenamos nuestra contraseña.

Ya podemos usar nuestra contraseña almacenada en la variable $pass.

El código completo sería:

$caracteres='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
$longpalabra=8;
for($pass='', $n=strlen($caracteres)-1; strlen($pass) < $longpalabra ; ) {
  $x = rand(0,$n);
  $pass.= $caracteres[$x];
}
print 'Nuestra contraseña obtenida es: ' . $pass;
Artículos
Java

Crear una Hashtable

27/Mar/2011

Una Hashtable es una estructura Java de tipo diccionario que nos permite almacenar elementos identificados por pares clave/valor de una forma muy sencilla. De igual manera, nos permite una recuperación atendiendo a las claves insertadas.

La estructura Hashtable está definida dentro del paquete java.util. Por ello, lo primero que haremos para crear una Hashtable, será el importar dicho paquete.

import java.util.Hashtable;

El constructor de HashtableHashtable paises = new Hashtable();

Para ir añadiendo elementos a la Hashtable.put(), al cual se le pasan la clave y el valor.

paises.put("ES", "España");
paises.put("UK", "Reino Unido");
paises.put("US", "Estados Unidos");
paises.put("FR", "Francia");

Y si queremos recuperar alguna clave de la Hashtable.get()

String clave = "US";		
System.out.println("El valor de la clave " + clave + " es " + paises.get(clave));

De esta forma sencilla hemos podido crear una Hashtable.

Vídeos sobre Java

Disfruta también de nuestros artículos sobre Java en formato vídeo. Aprovecha y suscribete a nuestro canal.

Test Java

¿Te atreves a probar tus habilidades y conocimiento en Java con nuestro test?

Test Java
PHP

Descargar emails de GMail con PHP

25/Mar/2011

Una aplicación práctica para descargarte emails con IMAP y PHP es decargarnos los correos de GMail.

Lo primero que tenemos que hacer es confirmar que tenemos activado el acceso por IMAP en nuestra cuenta de GMail. Para ello tenemos que ir a:

Mail Settings » Forwarding and POP/IMAP » IMAP Access

Seleccionamos la opción Enable IMAP y guardamos los cambios.

Lo segundo que tenemos que saber es que al servidor de IMAP de GMail se accede mediante la siguiente configuración:

$hostname = '{imap.gmail.com:993/imap/ssl}INBOX';
$username = '[email protected]';
$password = 'password';

Hay que tener cuidado ya que se utiliza el puerto 993 para acceder por IMAP.

Los siguientes pasos son los mismos que explicamos en cómo descargarte emails con IMAP y PHP o en cómo decargarte emails con POP3 y PHP. Pero dejemos el código impreso:

$emails = imap_search($inbox,'ALL');
if($emails) {
  $salida = '';
  foreach($emails as $email_number) {    
    $overview = imap_fetch_overview($inbox,$email_number,0);
    $salida.= 'Tema: '.$overview[0]->subject;
    $salida.= 'De: '.$overview[0]->from;	   
  }  
  echo $salida;
} 
imap_close($inbox);
PHP

Descargar emails con IMAP y PHP

24/Mar/2011

En el artículo Descargar emails con POP3 y PHP ya vimos como acceder a nuestro email mediante POP3. Ahora vamos a ver qué pequeñas modificaciones hay que hacer para acceder a un servidor vía IMAP.

La principal modificación está en la definición del hostname que utilicemos al establecer la conexión con imap_open. Los servidores de correo suelen atender el protocolo IMAP por el puerto 143.

$hostname = '{aulambra.com:143/imap/ssl}INBOX';
$username = '[email protected]';
$password = 'password';
 
$inbox = imap_open($hostname,$username,$password) or die('Ha fallado la conexión: ' . imap_last_error());

En este caso este servidor de email necesita de una conexión segura. Es por ello que utilizamos el flag /ssl.

El resto de pasos son iguales que con POP3. Hacemos el filtrado de mensajes mediante imap_search:

$emails = imap_search($inbox,'ALL');

El siguiente paso será recorrerlos accediendo a su cabecera con imap_fetch_overview:

foreach($emails as $email_number) {
  $overview = imap_fetch_overview($inbox,$email_number,0);
  $salida.= 'Tema: '.$overview[0]->subject;
  $salida.= 'De: '.$overview[0]->from;
}

Y por último no se nos puede olvidar la conexión con imap_close:

imap_close($inbox);

Lo mejor que puedes hacer es ver todo el código para descargar emails con IMAP y PHP y jugar con él.

PHP

Saber cuántos emails tenemos con PHP

23/Mar/2011

Si ayer vimos como conectarnos a nuestro servidor de email utilizando POP3, hoy vamos a explotar esta característica para saber cuántos emails tenemos en nuestro buzón de correo mediante PHP.

Lo primero realizar la conexión mediante imap_open. Para ello pasamos el hostname, usuario y password.

$hostname = '{mail.aulambra.com/notls}INBOX';
$username = '[email protected]';
$password = 'password';

$inbox = imap_open($hostname,$username,$password) or die('Ha fallado la conexión: ' . imap_last_error());

En el caso de no conectarnos se mostrará en pantalla el motivo del error.

Recuerda que la opción /tls de imap_open es para evitar la creación de una conexión segura.

Ahora, para saber cuántos emails tenemos en el buzón vamos a utilizar la función imap_num_msg, la cual recibe la conexión que hemos establecido con imap_open como parámetro.

$numero_emails = imap_num_msg($inbox);
echo "Tienes ".$numero_emails." mensajes en tu correo";

De una forma sencilla tenemos el número de emails en pantalla. Ahora ya solo nos quedará cerrar la conexión mediante imap_close.

imap_close($inbox);
PHP

Descargar emails con POP3 y PHP

22/Mar/2011

Descargar emails con POP3 y PHP es una operación muy sencilla y que solo requerirá el conocimiento de dos o tres funciones. De esta forma podremos crear una página PHP que liste nuestros emails descargandolos con POP3.

Lo primero es conocer la función imap_open. Esta función es la que nos permitirá conectarnos con el servidor de email vía POP3.

La función imap_open a parte de POP3 también permite descargas de email mediante IMAP y de news mediante NNTP.

La función imap_open tiene la siguiente estructura:

imap_open($mailbox, $username, $password [, $options, $retries, $params]

De los tres parámetros obligatorios de imap_open tenemos:

  • mailbox, buzón que contiene el email que nos queremos descargar con POP3.
  • username, Nombre del usuario que se conecta al buzón. Suele ser una dirección de email.
  • password, la contraseña del usuario.

Así, que lo primero será declarar los valores de estos parámetros en variables:

$hostname = '{mail.lineadecodigo.com/notls}';
$username = '[email protected]';
$password = 'mipassword';

El que tiene más complicación es el nombre del mailbox. La estructura del mailbox suele ser la siguiente:

{servidor:puerto/flags}carpeta

En nuestro caso mail.lineadecodigo.com es el nombre del servidor. El puerto no lo indicamos, aunque en el caso de acceder vía POP3 utilizaremos el 110. El parámetro /notls son las opciones de conexión. En este caso al utilizar /notls indicamos al servidor que no inicie una sesión segura (por simplicidad). Tampoco hemos indicado la carpeta de la que queremos recuperar los emails mediante POP3. Al no ponerla se toma INBOX como por defecto.

Pasemos a conectarnos con imap_open:

$inbox = imap_open($hostname,$username,$password) or die('Ha fallado la conexión: ' . imap_last_error());

La sentencia or die permite gestionar el caso de fallo en la conexión.

Una vez que tenemos la conexión pasamos a listar los emails. Para ello tenemos varias funciones, aunque nosotros nos centraremos en imap_search() esta función busca los emails bajo un determinado criterio. Nosotros utilizaremos el criterio «ALL», es decir, todos los emails.

$emails = imap_search($inbox,'ALL');

Ahora tendremos un array en $emails con todos los email de nuestro inbox. Es por ello que los recorreremos mediante un bucle for-each.

foreach($emails as $email_number) {...}

La estructura del email tiene varias partes, pero nosotros nos centraremos en la cabecera. En la cabecera es dónde va la información de la persona que nos lo envió, el tema del email,… Para recuperar la cabecera de un email utilizamos la función imap_fecth_overview. A esta función le pasamos el buzón y el email del que queremos recuperar la cabecera.

foreach($emails as $email_number) {    
    $overview = imap_fetch_overview($inbox,$email_number,0);
    $salida.= 'Tema: '.$overview[0]->subject;
    $salida.= 'De: '.$overview[0]->from;	   
  }

El resultado de ejecutar imap_fecth_overview es un array con un montón de propiedades. De estas propiedades nos quedamos con subject y from para mostrarlas por pantalla.

Ahora que hemos listado las cabeceras de todos los mensajes de nuestro buzón lo que haremos será el cerrar la conexión de nuestro buzón de emails mediante la función imap_close.

imap_close($inbox);

Ya tendremos listo nuestro programa para descargar emails con POP3 y PHP.

Artículos
CSS

Múltiples fondos

20/Mar/2011

Una de las mejoras menos conocidas en CSS3 es la capacidad de especificar múltiples fondos con la propiedad background. De esta forma los diferentes fondos se irán montando en cascada.

Pero primero revisemos la propiedad background.

background: [color] [image] [repeat] [attachment] [position];

De esta forma, poner una imagen de forma sencilla podría hacerse de la siguiente forma:

background:url(logo.png) no-repeat 50px 700px;

Para poner múltiples fondos con CSS simplemente tendremos que concatenarlos con comas. Así, si queremos tener dos imágenes de fondo lo haremos de la siguiente forma:

background:url(logo.png) no-repeat 50px 700px,
                url(bg.gif) repeat 0 0;

Como el soporte de múltiples fondos no está en todos los navegadores tendremos que utilizar un pequeño truco, y este será especificar varios fondos. Uno de ellos será definido de la forma tradicional:

background:url(bg.gif) repeat 0 0;
background:url(logo.png) no-repeat 50px 700px,
                url(bg.gif) repeat 0 0;  

Así el navegador que no soporte los múltiples fondos, cargará un único fondo, de la forma tradicional.

Las versiones de los navegadores a partir de las cuales se soportan los múltiples fondos con CSS son:

  • Chrome 4.0
  • Safari 4.0
  • Opera 10.10
  • Firefox 3.6
  • Internet Explorer 9

Código Fuente

Descárgate el código fuente de Múltiples fondos
Y si te ha gustado nuestro código fuente puedes regalarnos una estrella Star

Test CSS

¿Te atreves a probar tus habilidades y conocimiento en CSS con nuestro test?

Test CSS