coge la información y corre

Trabajar con conexiones socket en PHP

31 de octubre del 2007 Escrito por Alex Barros

Para aquellos que cuenten con CURL en su servidor, sabrán que esta biblioteca ofrece increíbles ventajas. Sin embargo en ocasiones no contamos con esta herramienta en el servidor, o necesitamos trabajar a un nivel más bajo; es decir, sin que CURL nos lo de todo masticadito.

Este nivel es el de interactuación entre máquinas a través de un protocolo (usualmente HTTP).

Voy a centrarme en el uso de la función fsockopen() y en las cabeceras HTTP. Aúnque estas conexiones abarcan más materia, estos puntos resultan más útiles y sencillos de entender.

Para iniciar una conexión con otro dominio de internet, crearemos un puntero mediante fsockopen. Este puntero referencia a la conexión que hemos establecido con el archivo de ese otro dominio, y podremos usar las funciones típicas de un puntero de archivo (fgets() y fputs() principalmente)

La función requiere de un parámetro obligatorio (el archivo remoto) y otros opcionales, que son:

  • Puerto: Cualquier máquina consta de diversos puertos. El 80 (ó 8080 en ocasiones) es el de HTTP (transferencia de documentos web), el que más nos interesa.
  • Error numérico: Número entero que identifica un error ocurrido. 0 si ha habido éxito
  • Error descriptivo: Define en lenguaje natural el error.
  • Tiempo de espera: Puedes indicarle el tiempo para que la conexión expire. Para tener mayor control de este tiempo, puedes usar también stream_set_timeout()

Un ejemplo de conexión usando esta técnica puede ser este:

  1. $da = fsockopen("www.example.com", 80, $errno, $errstr, 30);
  2. if (!$da) {
  3.     echo "$errstr ($errno)
  4. \n"; //ha ocurrido un error …
  5. } else {
  6.     $salida = "GET / HTTP/1.1\r\n"; //conexión usando HTTP1.1 y el metodo GET
  7.     $salida .= "Host: www.example.com\r\n"; //indico el host con el que quiero conectarme, disponible con parse_url()
  8.     $salida .= "Connection: Close\r\n\r\n"; //Cierro la conexion para no seguir gastando recursos
  9.  
  10.     fwrite($da, $salida); //le escribo las ordenes que acabo de generar
  11.     while (!feof($da)) { //recorro fila a fila el archivo
  12.         echo fgets($da, 128); //imprimo esta linea
  13.     }
  14.     fclose($da); //cierro el puntero
  15. }
  16.  

Como podemos observar, nos permite enviar las cabeceras HTTP que creamos oportunas, aúnque para hacer una conexión simple basta con las tres instrucciones indicadas en el ejemplo.

Para chequear el contenido de cualquier URL, sin pararse a personalizar cabeceras se puede emplear este simple script:

  1. function urlContent($host) {
  2.         $da = fsockopen($host, 80);
  3.         if (!$da) {
  4.                 return false;
  5.         } else {
  6.                 $salida = "GET / HTTP/1.1\r\n"; //conexión usando HTTP1.1 y el metodo GET
  7.                 $salida .= "Host: $host\r\n"; //indico el host con el que quiero conectarme, disponible con parse_url()
  8.                 $salida .= "Connection: Close\r\n\r\n"; //Cierro la conexion para no seguir gastando recursos
  9.  
  10.                 fwrite($da, $salida); //le escribo las ordenes que acabo de generar
  11.                 while (!feof($da)) { //recorro fila a fila el archivo
  12.                 $data .= @fgets($da, 128); //imprimo esta linea
  13.                 }
  14.                 fclose($da); //cierro el puntero
  15.                 return $data;
  16.         }
  17. }
  18.  
  19. //Ejemplo de uso
  20. $contenido = urlContent(‘codis.boozox.net’);
  21. echo nl2br(htmlentities($contenido)); //doy formato para leer el codigo

Ver en ejecución | Descargar:

urlContent.function.zip

El funcionamiento básico de los sockets es algo más complejo que CURL, pero si nuestro servidor no admite esta librería, este script nos vendrá de perlas en más de una ocasión.

Categorias: Código, PHP, Web | 3 comentarios »

Conseguir comentarios en nuestro Blog

17 de octubre del 2007 Escrito por Alex Barros

Todos los que tenemos un blog sabemos lo importante que son los comentarios. Te ayudan a continuar con tu labor, a corregir errores, a completar información, a conocer a tus lectrores, y sobre todo pasar un buen rato.

Por eso es muy importante potenciar los comentarios, y darles el valor que se merecen. Voy a explicar una serie de estrategias que pueden hacer que se comente más en tu blog, o por lo menos que sea más agradable hacerlo.

Sigue leyendo esta entrada »

Categorias: Código, Diseño, HOWTO/CóMO, PHP, Plugins, Web, Wordpress | 2 comentarios »

Sencillo sistema AntiBot en PHP con preguntas

1 de octubre del 2007 Escrito por Alex Barros

Seguramente ya conoceréis el clásico sistema Anti Robots que consiste en hacer una pregunta que requiera del “razonamiento humano“. Este sistema puede ser construido de una forma sencillísima con PHP, y os muestro cómo:

Nuestra base de datos de preguntas y respuestas será un simple array. Además usaremos las sesiones, para verificar la respuesta en el archivo de chequeo.

El array de preguntas y respuestas contendrá una pregunta clara y legible para los humanos, y una respuesta a modo de expresión regular, para considerar las variantes de respuesta. Por ejemplo:

Pregunta: ¿Cuántos dedos tiene una mano?
Respuesta: (5|cinco) // acepta mayúsculas y minúsculas

Una vez declarado esto, seleccionaremos una pregunta al azar, con la función rand(). La parte de pregunta la imprimiremos por pantalla en el lugar adecuado junto a un campo de texto.

Lo siguiente es guardar la expresión regular que contiene la respuesta en una variable de sesión, para que quede accesible en el chequeo a continuación.

Por último, en el archivo de chequeo usaremos la función de que evalua expresiones regulares eregi(), sometiendo la respuesta del campo de texto a la expresión regular almacenada en sesión.

El concepto ya está definido, y es tan simple como eso. Ahora plasmémoslo en esas bonitas letras de colores que son el código:

En el archivo del formulario:

  1. session_start(); //Al principio del todo!!!
  2. $preguntas = array();
  3. $preguntas[] = array(‘Cuantos dedos tiene una mano?’,‘(5|cinco)’);
  4. $preguntas[] = array(‘Resultado de sumar 2 y 4?’,‘(6|seis)’);
  5. $preguntas[] = array(‘Cuantas ruedas tiene un coche?’,‘(4|cuatro)’);
  6. $preguntas[] = array(‘Que animal es mas grande: elefante o caracol?’,‘(primero|elefante)’);
  7. $preguntas[] = array(‘Cual es el color mas oscuro de todos?’,‘negro’);
  8. $preguntas[] = array(‘Por favor, contesta: eres humano?’,‘(si|claro)’);
  9. $preguntas[] = array(‘Con que mano escribe un zurdo?’,‘(izquierda)’);
  10. $preguntas[] = array(‘Escribe pan dos veces.’,‘^pan ?pan$’);
  11. // puedes escribir todas las que quieras
  12.  
  13. $pregn = rand(0,(count($preguntas)-1)); // numero al azar
  14. $_SESSION[‘pregregex’] = $preguntas[$pregn][1]; // Lo guardo en sesion
  15. echo ‘</p>’.$preguntas[$pregn][0].‘</p><br><input type="text" name="respuesta" />’;

Y en el archivo de chequeo:

  1.  
  2. if($_SESSION[‘pregregex’] AND $_GET[‘respuesta’])
  3. {
  4.         if(eregi($_SESSION[‘pregregex’],$_GET[‘respuesta’]))
  5.         echo "De acuerdo, no eres un robot…";
  6.         else
  7.         echo "Solo Bender puede superarte a robot !";
  8.         unset($_SESSION[‘pregregex’]);
  9. }

Inconvenientes:

  • El idioma importa (a no ser que sean preguntas aritmeticas)
  • Puedes toparte con una mente brillante, que le de por contestarte lo que no es
  • …ninguno más, que yo sepa… pregúntale a un robot.

Podéis probar su funcionamiento en directo desde este ejemplo.

Descargar ejemplo:
anti-bot.zip

Categorias: Aplicaciones, Código, HOWTO/CóMO, PHP, Seguridad, Software libre | 5 comentarios »

Matrices para desenfocar

20 de septiembre del 2007 Escrito por Alex Barros

tallo.jpgEfectivamente. Desarrollando la versión 2.0 estable del plugin Imaset, y en busca de filtros para imágenes, me he encontrado un tipo de retoque fotográfico muy utilizado por editores gráficos, llamado “matriz de convolución

Consiste en el tratamiento de una matriz por otra llamada “kernel“. La matriz original es la propia imagen en este caso (un conjunto de píxeles bidimensional), y la matriz denominada kernel varía dependiendo del efecto deseado.

El proceso del algoritmo es algo complejo. Consiste en recorrer la imágen píxel a píxel, obtener los valores de los 8 píxeles más cercanos, y aplicar la matriz kernel. El valor resultante se adjudica al píxel, y continúa haciendo lo mismo con el resto.

Lo que deducimos de esto es que la matriz de convolución readjudica el color a cada fragmento (píxel), en función de sus píxeles vecinos, dada una norma de actuación mediante el kernel, que suele consistir en una matriz de 3×3 (aúnque las hay más grandes)

Llegados hasta aquí, un filtro interesante es el de desenfoque (el típico blur). Pues bien, la matriz necesaria, es una matriz compuesta enteramente por unos. Esto quiere decir que va a mezclar literalmente el color de todos los píxeles adyacentes por igual, y el resultado será un desenfoque general.

También hay infinidad de otras opciones, puede obtenerse más contraste, detectar bordes (hay varios tipos de bordes, y son útiles para distinguir siluetas, imprescindible para robots por ejemplo), resaltar, repujado….. cada matriz ofrece un resultado distinto.

Matriz cualquiera Matriz para bordes

Esto en la práctica, teniendo PHP y la biblioteca GD (para tratamiento de imágenes) podemos efectuarlo con la función imageconvolution().
Los parámetros necesarios son un resource de imágen (creado con imagetruecolor, imagecreatefromjpeg, etc), la matriz de convolución (de tres por tres), un divisor para los elementos de la matriz, y un compensador (offset).

Un ejemplo de script en PHP:

  1. $im = imagecreatefromjpeg(‘fotografia.jpg’);
  2. $matrix = array(
  3. array( 2, 2, 2 ),  
  4. array( 2, 2, 2 ),  
  5. array( 2, 2, 2)
  6. );
  7. imageconvolution($im, $matrix, 16, 0);
  8. imagejpeg($im,‘fotografia_blur.jpg’);
  9. imagedestroy($im);

Para aquellos que no dispongan de esta función en su biblioteca GD, por ser un poco atrasada, o por cualquier otra razón, aquí hay un código para generarla:

  1. //include this file whenever you have to use imageconvolution…
  2. //you can use in your project, but keep the comment below :)
  3. //great for any image manipulation library
  4. //Made by Chao Xu(Mgccl) 2/28/07
  5. //www.webdevlogs.com
  6. //V 1.0
  7. if(!function_exists(‘imageconvolution’)){
  8. function imageconvolution($src, $filter, $filter_div, $offset){
  9.     if ($src==NULL) {
  10.         return 0;
  11.     }
  12.    
  13.     $sx = imagesx($src);
  14.     $sy = imagesy($src);
  15.     $srcback = ImageCreateTrueColor ($sx, $sy);
  16.     ImageCopy($srcback, $src,0,0,0,0,$sx,$sy);
  17.    
  18.     if($srcback==NULL){
  19.         return 0;
  20.     }
  21.        
  22.     for ($y=0; $y<$sy; ++$y){
  23.         for($x=0; $x<$sx; ++$x){
  24.             $new_r = $new_g = $new_b = 0;
  25.             $alpha = imagecolorat($srcback, $pxl[0], $pxl[1]);
  26.             $new_a = $alpha >> 24;
  27.            
  28.             for ($j=0; $j<3; ++$j) {
  29.                 $yv = min(max($y1 + $j, 0), $sy1);
  30.                 for ($i=0; $i<3; ++$i) {
  31.                         $pxl = array(min(max($x1 + $i, 0), $sx1), $yv);
  32.                     $rgb = imagecolorat($srcback, $pxl[0], $pxl[1]);
  33.                     $new_r += (($rgb >> 16) & 0xFF) * $filter[$j][$i];
  34.                     $new_g += (($rgb >> 8) & 0xFF) * $filter[$j][$i];
  35.                     $new_b += ($rgb & 0xFF) * $filter[$j][$i];
  36.                 }
  37.             }
  38.  
  39.             $new_r = ($new_r/$filter_div)+$offset;
  40.             $new_g = ($new_g/$filter_div)+$offset;
  41.             $new_b = ($new_b/$filter_div)+$offset;
  42.  
  43.             $new_r = ($new_r > 255)? 255 : (($new_r < 0)? 0:$new_r);
  44.             $new_g = ($new_g > 255)? 255 : (($new_g < 0)? 0:$new_g);
  45.             $new_b = ($new_b > 255)? 255 : (($new_b < 0)? 0:$new_b);
  46.  
  47.             $new_pxl = ImageColorAllocateAlpha($src, (int)$new_r, (int)$new_g, (int)$new_b, $new_a);
  48.             if ($new_pxl == -1) {
  49.                 $new_pxl = ImageColorClosestAlpha($src, (int)$new_r, (int)$new_g, (int)$new_b, $new_a);
  50.             }
  51.             if (($y >= 0) && ($y < $sy)) {
  52.                 imagesetpixel($src, $x, $y, $new_pxl);
  53.             }
  54.         }
  55.     }
  56.     imagedestroy($srcback);
  57.     return 1;
  58. }
  59. }
  60.  

Muy pronto os presentaré la versión definitiva de Imaset 2.0, qué nervios!

Categorias: Aplicaciones, Código, HOWTO/CóMO, PHP | No hay comentarios »

Pequeña comparativa de editores HTML en Linux

14 de septiembre del 2007 Escrito por José Cabo

Muchos de los programadores de HTML, PHP, CSS, etc… siguen afirmando que en Linux es imposible o poco productivo trabajar. Me siento obligado a negar tal hecho porque es simplemente.. falso. En el mundo Linux, como en otros Sistemas Operativos (tanto Windows como MacOS) hay montones de editores de montones de sabores y, en el caso de Linux, abundan los multiplataforma y… libres.

Actualmente podemos ver montones de editores relacionados con la programación web. Es un ejemplo el abandonado NVU y su sucesor Kompozer (que hace nada liberaron su última versión), Quanta Plus (que pinta muy muy bien), el mismo gedit, etc… Muchos de ellos se complementan así mismo aunque mi preferido hasta el momento es KompoZer o Quanta plus (que explicaré el porqué).

kompozer.pngEn primer lugar NVU es un proyecto de Mozilla que pretendía revolucionar a los editores HTML del momento en Linux… y bueno, casi lo consigue solo que se abandonó el proyecto. Una verdadera pena porque estaba siendo bastante completo para lo que había actualmente en Linux. Pero gracias a unos buenos programadores se creo un fork, KompoZer, y se empezó a solucionar los bugs y a añadir nuevas herramientas en este “nuevo” programa de edición. Tiene varios modos: el modo normal (ves la página como si estuvieras en el navegador), el modo source para ver el código y el modo tag, para ver las etiquetas, son los más usados. Trae buenas herramientas que más bien podrían pasar por simples gestores de ayuda. Lo que yo creo que le hace falta… es un autocompletado al escribir código.

quanta1.pngTenemos también a Quanta Plus un editor gráfico que usa las librerías de KDE y por lo tanto… se ve mejor en KDE (aunque os puedo asegurar que no se ve tan mal en Gnome). Este programa parecía que iba a ser el que realmente me iba a llamar la atención… y lo fue durante un tiempo porque es el único que conozco que tiene el autocompletado, aunque es una versión muy rudimentaria y no funciona en todos los lenguajes (en CSS por ejemplo no funciona y en HTML no funciona como se espera). Este editor no tiene pestaña para ver lo que llevas hecho sin necesidad de ir al navegador.

gedit1.pngEso por lo que respecta a editores gráficos y nos lanzamos, pues, a editores de texto el que más destaca es sin duda Gedit el -editor de texto plano- de Gnome. Pero no os engañéis, no tiene nada que ver con el Notepad de Windows. Éste es mucho más profesional, bello y funcional. Destaca por su gran capacidad para colorear código en muchos tipos de lenguajes (no solo web, sino de código fuente de C, VB, C++, Perl, Python, etc). Éste es sin duda el preferido por cualquier usuario que se atreva a escribir a pelo sin pijadas.

Por lo que respecta a otros editores no-gráficos (como Gedit) desconozco de otros que estén a su altura (dentro de lo que cabe). Así que si alguien se siente la necesidad de informarme de algún otro programa con mucho gusto lo añadiré.

Ahora lo que realmente os traigo es una sorpresa, aunque posiblemente al sector más conservador de Linux no le agrade la idea. Os traigo a mi amigo Wine, que no es un emulador, y que gracias a él vamos a poder portar ciertas aplicaciones que para los nostálgicos y gente como yo viene realmente bien. Hablo del conocido Dreamweaver, creado por Macromedia y comprado por Adobe después. Gracias a Wine tenemos casi un perfecto porte de esta aplicación nativa de Windows a Linux. Eso sí, me temo que actualmente con la versión actual de Wine (0.9.44) no funciona en su última versión. Así que deberemos usar la versión anterior, la 8 y puedo asegurar que funciona realmente bien, aunque seguro que pronto dan soporte para la que sacaron hace poco: Dreamweaver CS3.

Para instalarlo bajo Wine no necesitáis ningún añadido extra más que el instalador (ejecutable o CD) y seguir como si fuera una instalación normal en Windows (supongo que todos sabéis como funciona Wine $ wine PROGRAMA.exe). Aunque parezca que no, Wine consigue lo imposible. Dreamweaver 8 está bastante integrado en el escritorio y funciona a la perfección con las últimas versiones de Compiz Fusion, incluido exposé, el efecto gelatina y la transparencia en los menús, una gozada.

dw1.png
dw2.png
dw3.png

Como ya he dicho, si tenéis dudas sobre los mismos programas o queréis añadir cosas nuevas (features o lo que sea) tenéis un maravilloso sistema de comentarios para contactar y hablar con nosotros (y con quien sea) ahí debajo.

Categorias: Comparativa, CSS, GNU/Linux, HTML, Internet, PHP, Software libre, Web | 6 comentarios »

Las cadenas también son arrays

23 de agosto del 2007 Escrito por Alex Barros

Reivindiquemos el derecho de las cadenas alfanuméricas a ser arrays!

Así es, en PHP las cadenas tienen esta curiosa propiedad. Y esque se comportan como un array, donde el índice es un número representando la posición del cacarter, y el valor es el caracter que se encuentra en esa posición.

Veamos un código de ejemplo:

  1. $cadena = ‘ABCDEFGHIJKLMNOPQRSTUVWXYZ’;
  2. echo $cadena[25],$cadena[20],$cadena[12],$cadena[1],$cadena[4];

El ejemplo anterior imprimiría en pantalla la palabra ZUMBE .

Así que ya sabéis, no discriminéis a una cadena por no tener índices, estaríais cayendo en un grave error!

Categorias: Código, PHP | No hay comentarios »

CURLOPT de CURL

21 de agosto del 2007 Escrito por Alex Barros

Aúnque el título parezca más bien un trabalenguas proviniente del mismísimo Chiquito de la Calzada, hoy voy a comentar algunas potentes opciones que nos brinda la biblioteca CURL.

Para mí CURL era un auténtico desconocido, cuando en el anterior host no tenia ni fopen para urls externas. Pero una vez lo conoces se convierte en una herramienta muy potente y útil.

Lo primero a realizar en nuestro código, es siempre la inicialización de curl, con la función curl_init()

  1. $ch = curl_init();

Hecho esto tendremos en la variable $ch el identificador de nuestra sesión CURL. Ahora sólo nos tenemos que dedicar a marcarle nuestras preferencias para la conexión. Voy a mostraros a continuación las que me parecen más importantes, pero recordad que hay muchas más.

  1. // Indicamos la URL a la que queremos acceder
  2. curl_setopt($ch, CURLOPT_URL, "http://www.example.com/");
  3. // Si la conexión tarda más de 30 segundos, que no siga
  4. curl_setopt($ch,CURLOPT_CONNECTTIMEOUT,30);
  5. // Si la conexión falla, que lo haga de forma "silenciosa"
  6. curl_setopt($ch, CURLOPT_FAILONERROR, 1);
  7. // Permitir que la conexión se redirija si le es indicado
  8. curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
  9. // El resultado lo quiero almacenar en una variable, en lugar de que lo imprima por pantalla
  10. curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
  11. // Voy a enviar contenido en forma de variables POST
  12. curl_setopt($ch, CURLOPT_POST, 1);
  13. // Estos son los campos POST, en forma de array asociativo
  14. curl_setopt($ch, CURLOPT_POSTFIELDS, array(‘nombre’=>"Alex",‘apellido’=>"Barros"));
  15. // Voy a finjir que tengo una serie de Cookies, incluida la de sesión
  16. curl_setopt($ch, CURLOPT_COOKIE, ‘nombre=Alex; galleta=chocolate; PHPSESSID=0123456789qwertyasdfg9876543210′);
  17. // Foy a finjir que provengo de otra web, la que yo quiera
  18. curl_setopt($ch, CURLOPT_REFERER, ‘http://zumbe.net/’);
  19. // Voy a indicar qué User Agent estoy usando. Por ejemplo el de un iPhone
  20. curl_setopt($ch, CURLOPT_USERAGENT, ‘mozilla/5.0 (iphone; u; cpu like mac os x; en) applewebkit/420+ (khtml, like gecko) version/3.0 mobile/1c25 safari/419.3′);

Por último, ejecutamos la sesión, y cerramos la misma.

  1. // Almaceno en la variable $resultado el codigo de la pagina
  2. $resultado = curl_exec($ch);
  3. // Se cierra el recurso CURL y se liberan los recursos del sistema
  4. curl_close($ch);

Sólo con esas herramientas ya podemos hacer un proxy muy completo, que nos haga lo que nosotros queramos.
Ahora sólo es echarle imaginación, ingenio y paciencia.

Categorias: Código, PHP, Web | 2 comentarios »

Siguientes entradas »

del.icio.us meneame.net RSS

Search:

Bicivalencia Localiza las estaciones de Valenbisi, servicio público de bicicletas en Valencia, España. Ver más Gpsia Descubre y comparte rutas por todo el mundo, tomadas con GPS. Ver más Imaset Edita tus imágenes de Wordpress con este sencillo plugin. Ver más

¡Mi música es tuya!

Digo yo que...

Mis fotos de Flickr

Entradas recientes

Meta:

Respeta el copyleft

,