domingo, 13 de junio de 2010

Página curiosa http://www.superbad.com/

Dejo un enlace de una página muy curiosa donde cada una de ellas contiene enlaces a otras páginas con otros diseños y formas totalmente diferentes!

Algo desconcertante, curioso, desordenado y divertido!. Merce la pena que le eches un vistazo.

http://www.superbad.com

domingo, 25 de abril de 2010

Ejecutar procesos en PHP (Windows)

Después de mucho tiempo sin escribir nada voy a hacerlo con una pequeña pero útil prestación de php.

El proceso que voy a realizar aquí va dedicado para Windows mediante COM, que a resumidas cuentas un objeto COM permite la comunicación entre procesos dando igual el lenguaje, implementación, etc desde donde proceda.

Veamos un ejemplo:


Supongamos que necesito ejecutar dede php un script también escrito en php.
Podría hacerlo mediante una redirección desde el navegador que apuntase al script que necesito ejecutar, ¿pero qué ocurre si no deseo que se ejecute por la salida del navegador y sea como un proceso independiente?, pues ahí radica el kid de la cuestión. Necesitamos ejecutar un script como si se tratase de un proceso independiente del sistema donde ejecutamos el servidor web.

Estableciendo el escenario.
Nuestro script se va a encargar de rastrear un sitio web completo en busca de direcciones de correo electrónico.
Por un lado, tenemos el script que se encargará de realizar la llamada al script que se ejecutará como proceso independiente pasándole como parámetro le URL del sitio web a rastrear.

lanzadera.php


A continuación el script que procesa la petición para buscar emails

buscas_emails.php


El resto del código te lo dejo pendiente para que lo finalices, pero la idea es:
  • Tener un formulario de entrada donde recibir por GET la dirección del sitio web a rastrear.
  • Realizar la llamada al script que se va a ejecutar como un proceso independiente
  • Tras realizar la llamada, rastrear el sitio web completo en busca de todos los emails
  • Los emails encontradros los almacenamos en memoria mediante un vector
  • Finalizado el rastreo del servidor, volcamos todos los emails encontrados en un fichero en el sistema
  • Mediante Ajax, realizar un seguimiento del fichero donde se encuentran todos los emails para comprobar si tal fichero tiene o no contenido. En caso de tenerlo mostrarlo


Espero te sirva de utilidad y completes el ejemplo satisfactoriamente!

viernes, 18 de diciembre de 2009

Subir archivos con Java mediante HTTP y tratamiento con PHP

Más de una vez me ha surgido la necesidad de subir varios archivos al servidor asíncronamente y de tal forma que muestre al detalle el total de archivos subidos, progreso, tamaño total ,etc.
Pues bien, en uno de mis experimentos, me decidí a desarrollar mi propio uploader en Java, que es lo que voy a tratar de explicar aquí. Para ello analizaremos los paquetes que son enviados al servidor mediante el protocolo HTTP, oséase al servidor web y así poder implementar dicho protocolo en Java.

La subida de archivos por el protocolo HTTP mediante PHP y un servidor web tal como APACHE, para un programador experimentado es bien conocida, no obstante, vamos a repasar algunos conceptos de cómo se hace con este método tan rudimentario y tan usado por muchos.

upload.html

Tenemos preparado el documento html para la entrada de datos, una vez que se pulsa el botón "Subir!", la petición se redirige al script especificado en el atributo "action", en este caso vamos a parar a "tratar-upload.php".

tratar-upload.php
Bien, ya tenemos todo listo, ahora nos toca analizar cómo hace intrínsicamente la operación de subir archivos. Para ello nos valemos de un analizador de protocolos de red tal como wireshark. Ponemos a la escucha en el interfaz de red pertinente, seleccionamos archivos en el documento html y pulsamos el botón "Subir!".

Análisis de subida de archivos por el protocolo HTTP usando el método POST.

Petición HTTP
Quiero hacer una objeción respecto a -RETORNO DE CARRO + SALTO DE LINEA-. Indica que existen 2 bytes no visibles adicionales para el salto a la siguiente línea. Véase más sobre secuencias de escape, pero para el ejemplo sólo usaremos dos:

Retorno de carro:\r
Salto de línea: \n

Donde se indica "2 x", es que existen dos saltos.
Pasemos a analizar paso a paso cada campo de la cebecera de la petición.

Realizamos petición para "mandar, fijar, poner" en el script "tratar-upload.php" los datos de la petición.
POST tratar-upload.php HTTP/1.1
Dirección completa del servidor desde donde realizamos la petición.
Host: localhost
Agente-navegador usado desde donde realizamos la petición.
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; es-ES; rv:1.9.0.16)
Tipos de datos que acepta el agente-navegador para procesar la respuesta una vez concluida la petición.
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Lenguajes aceptados para la respuesta por parte del navegador.
Accept-Language: es-es,es;q=0.8,en-us;q=0.5,en;q=0.3
Tipos de codificación aceptados para la respuesta por parte del navegador.
Accept-Encoding: gzip,deflate
Conjunto de carácteres aceptados para la respuesta por parte del navegador.
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Representa el número máximo de segundos entre envío y respuesta de paquetes sobre una conexión persistente.
Keep-Alive: 300
Indica que el navegador soporta conexiones persistentes sobre una misma conexión TCP.
Connection: keep-alive
Indica desde donde procede la petición.
Referer: http://localhost/upload.html
Muy Importante.
Establece que la petición puede estar formada por diferentes partes de datos y se indica el separador (límite) entre las partes involucradas. Oséase, que cada archivo debe estar separado convenientemente por el límite establecido boundary. La serie numérica que le sigue está formada aleatoriamente y no sigue ningún tipo de lógica.
Content-Type: multipart/form-data; boundary=---------------------------265001916915724
Tamaño en bytes del conjunto de datos que vamos a enviar excluyendo la cabecera.
Content-Length: total_bytes_de_los_ficheros_incluyendo_los_delimitadores<2 x RETORNO DE CARRO + SALTO DE LINEA>

A continuación voy a explicar las partes de cada archivo que enviamos al servidor.

Indica el comienzo de una parte, osea, los datos de un archivo
-----------------------------265001916915724
Aquí se establece el nombre del campo del fichero especificado en el form y el nombre del archivo que vamos a enviar.
Content-Disposition: form-data; name="f1"; filename="archivo1.ext"
Tipos de datos que contiene el archivo. Normalmente binarios.
Content-Type: application/binary<2 x RETORNO DE CARRO + SALTO DE LINEA>
Los datos en bruto del fichero son colocados aquí, acabamos con un salto de línea.


Para terminar la retransmisión de datos hacia el servidor, debemos indicarlo con el siguiente campo.
-----------------------------265001916915724--
(nótese que acaba con dos guiones -- más retorno de carro y el salto de línea correspondiente.)

Ya creo que estamos listos para ver el código fuente del programa que desarrollé en Java para la subida de ilimitado número de archivos. El código se corresponde con la clase más significativa del programa, el uploader. He suprimido algunas partes del código para exponer más claramente lo que estamos tratando aquí.

Uploader.java

Si estás interesado en todo el desarrollo del applet, puedes ponerte en contacto conmigo.
Para poder usarlo correctamente, el applet está firmado para poder explorar el disco duro del cliente con los archivos que desea subir al servidor.