domingo, 30 de octubre de 2016

Reconocimiento Facial con PHP

Reconocimiento Facial con PHP

La clase se llama Face_Detector y su autor es un frances (creo?) Maurice Svay su web es http://svay.com/blog/face-detection-in-pure-php-without-opencv/(siempre respetando los derechos de autor). Su implementación es bastante sencilla y lo mejor es que no utiliza librerias ajenas como OPENCV u otros para el reconocimiento facial, según entiendo el autor saco este código de un código en javascript (el enlace ya no esta disponible) y lo migro a puro PHP, ademas esta clase hace uso de un archivo detection.DAT donde estan los patrones de reconociemto facial.

La clase Face_Dectector
<?php

class Face_Detector {
   protected $detection_data;  protected $canvas;  protected $face;  private $reduced_canvas;  #El constructor de clase carga el archivo .dat y lo asigna a una variable  public function __construct($detection_file = 'detection.dat') {    if (is_file($detection_file)) {      $this->detection_data = unserialize(file_get_contents($detection_file));    } else {      throw new Exception("No se pudo cargar el archivo");    }  }  #Dado un archivo imagen   public function face_detect($file) {    if (!is_file($file)) {      throw new Exception("No se puede carga el archivo $file");    }  #crea una nueva imagen temporal    $this->canvas = imagecreatefromjpeg($file);    $im_width = imagesx($this->canvas);    $im_height = imagesy($this->canvas);     //Resample before detection?    $ratio = 0;    $diff_width = 320 - $im_width;    $diff_height = 240 - $im_height;    if ($diff_width > $diff_height) {      $ratio = $im_width / 320;    } else {      $ratio = $im_height / 240;    }     if ($ratio != 0) {      $this->reduced_canvas = imagecreatetruecolor($im_width / $ratio, $im_height / $ratio);      imagecopyresampled($this->reduced_canvas, $this->canvas, 0, 0, 0, 0, $im_width / $ratio, $im_height / $ratio, $im_width, $im_height);       $stats = $this->get_img_stats($this->reduced_canvas);      $this->face = $this->do_detect_greedy_big_to_small($stats['ii'], $stats['ii2'], $stats['width'], $stats['height']);      $this->face['x'] *= $ratio;      $this->face['y'] *= $ratio;      $this->face['w'] *= $ratio;    } else {      $stats = $this->get_img_stats($this->canvas);      $this->face = $this->do_detect_greedy_big_to_small($stats['ii'], $stats['ii2'], $stats['width'], $stats['height']);    }    return ($this->face['w'] > 0);  }    public function toJpeg() {    $color = imagecolorallocate($this->canvas, 255, 0, 0); //red    imagerectangle($this->canvas, $this->face['x'], $this->face['y'], $this->face['x']+$this->face['w'], $this->face['y']+ $this->face['w'], $color);    header('Content-type: image/jpeg');    imagejpeg($this->canvas);  } #esto solo para JSON  public function toJson() {    return "{'x':" . $this->face['x'] . ", 'y':" . $this->face['y'] . ", 'w':" . $this->face['w'] . "}";  }   public function getFace() {    return $this->face;  }   protected function get_img_stats($canvas){    $image_width = imagesx($canvas);    $image_height = imagesy($canvas);       $iis = $this->compute_ii($canvas, $image_width, $image_height);    return array(      'width' => $image_width,      'height' => $image_height,      'ii' => $iis['ii'],      'ii2' => $iis['ii2']    );       }   protected function compute_ii($canvas, $image_width, $image_height ){    $ii_w = $image_width+1;    $ii_h = $image_height+1;    $ii = array();    $ii2 = array();        for($i=0; $i<$ii_w; $i++ ){      $ii[$i] = 0;      $ii2[$i] = 0;    }                 for($i=1; $i<$ii_w; $i++ ){       $ii[$i*$ii_w] = 0;          $ii2[$i*$ii_w] = 0;       $rowsum = 0;      $rowsum2 = 0;      for($j=1; $j<$ii_h; $j++ ){        $rgb = ImageColorAt($canvas, $j, $i);        $red = ($rgb >> 16) & 0xFF;        $green = ($rgb >> 8) & 0xFF;        $blue = $rgb & 0xFF;        $grey = ( 0.2989*$red + 0.587*$green + 0.114*$blue )>>0; // this is what matlab uses        $rowsum += $grey;        $rowsum2 += $grey*$grey;         $ii_above = ($i-1)*$ii_w + $j;        $ii_this = $i*$ii_w + $j;         $ii[$ii_this] = $ii[$ii_above] + $rowsum;        $ii2[$ii_this] = $ii2[$ii_above] + $rowsum2;      }    }    return array('ii'=>$ii, 'ii2' => $ii2);  }   protected function do_detect_greedy_big_to_small( $ii, $ii2, $width, $height ){    $s_w = $width/20.0;    $s_h = $height/20.0;    $start_scale = $s_h < $s_w ? $s_h : $s_w;    $scale_update = 1 / 1.2;    for($scale = $start_scale; $scale > 1; $scale *= $scale_update ){      $w = (20*$scale) >> 0;      $endx = $width - $w - 1;      $endy = $height - $w - 1;      $step = max( $scale, 2 ) >> 0;      $inv_area = 1 / ($w*$w);      for($y = 0; $y < $endy ; $y += $step ){        for($x = 0; $x < $endx ; $x += $step ){          $passed = $this->detect_on_sub_image( $x, $y, $scale, $ii, $ii2, $w, $width+1, $inv_area);          if( $passed ) {            return array('x'=>$x, 'y'=>$y, 'w'=>$w);          }        } // end x      } // end y    } // end scale    return null;  }   protected function detect_on_sub_image( $x, $y, $scale, $ii, $ii2, $w, $iiw, $inv_area){    $mean = ( $ii[($y+$w)*$iiw + $x + $w] + $ii[$y*$iiw+$x] - $ii[($y+$w)*$iiw+$x] - $ii[$y*$iiw+$x+$w] )*$inv_area;    $vnorm = ( $ii2[($y+$w)*$iiw + $x + $w] + $ii2[$y*$iiw+$x] - $ii2[($y+$w)*$iiw+$x] - $ii2[$y*$iiw+$x+$w] )*$inv_area - ($mean*$mean);      $vnorm = $vnorm > 1 ? sqrt($vnorm) : 1;     $passed = true;    for($i_stage = 0; $i_stage < count($this->detection_data); $i_stage++ ){      $stage = $this->detection_data[$i_stage];       $trees = $stage[0];        $stage_thresh = $stage[1];      $stage_sum = 0;       for($i_tree = 0; $i_tree < count($trees); $i_tree++ ){        $tree = $trees[$i_tree];        $current_node = $tree[0];          $tree_sum = 0;        while( $current_node != null ){          $vals = $current_node[0];          $node_thresh = $vals[0];          $leftval = $vals[1];          $rightval = $vals[2];          $leftidx = $vals[3];          $rightidx = $vals[4];          $rects = $current_node[1];           $rect_sum = 0;          for( $i_rect = 0; $i_rect < count($rects); $i_rect++ ){            $s = $scale;            $rect = $rects[$i_rect];            $rx = ($rect[0]*$s+$x)>>0;            $ry = ($rect[1]*$s+$y)>>0;            $rw = ($rect[2]*$s)>>0;             $rh = ($rect[3]*$s)>>0;            $wt = $rect[4];             $r_sum = ( $ii[($ry+$rh)*$iiw + $rx + $rw] + $ii[$ry*$iiw+$rx] - $ii[($ry+$rh)*$iiw+$rx] - $ii[$ry*$iiw+$rx+$rw] )*$wt;            $rect_sum += $r_sum;          }            $rect_sum *= $inv_area;           $current_node = null;          if( $rect_sum >= $node_thresh*$vnorm ){            if( $rightidx == -1 )               $tree_sum = $rightval;            else              $current_node = $tree[$rightidx];          } else {            if( $leftidx == -1 )              $tree_sum = $leftval;            else              $current_node = $tree[$leftidx];          }        }         $stage_sum += $tree_sum;      }       if( $stage_sum < $stage_thresh ){        return false;      }    }     return true;  }}
?>

Su Implementacion:
<?php
require ('Face_Detector.php'); $detector = new Face_Detector('detection.dat'); $detector->face_detect('FOTO.jpg'); $detector->toJpeg(); ?>
Se incluye la clase Face_Detector.php, se crea una instancia especificando el archivo .dat y se hace uso de la función face_detectet(‘archivo imagen’); indicando el archivo de imagen a detetectar. El resultado sera una imagen con un recuadro sobre el rostro, si es que lo detecto, claro nada es perfecto, si le pasamos una foto cualquiera que no incluya un rostro, los resultados podran ser bastantes curiosos.

Descarga los archivos desde Aqui
Compartir:

viernes, 28 de octubre de 2016

Instala PHP7 en WAMPSERVER

INSTALAR PHP 7 EN WAMPSERVER

Editado por: JL Sistemas | Programadores en Desarrollo

El famoso PHP 7 la versión mejorada ya que vemos varias mejoras en cuanto a la versión anterior, el cual podemos destacar que es más rápida que la versión anterior, también cuenta con soporte para equipos con 64 Bits.

Te gustaría tener esta nueva versión en tu WAMPSERVER? Aquí te decimos como instalarlo.

1.- Instalar el paquete de VC_14Runtime de Windows:


2.- Descargar la versión PHP 7, se recomienda la version Thread Safe:

Desde el Portal de PHP: http://windows.php.net/download

3.- Entrar a la carpeta wamp/bin/php y crea una carpeta llamada PHP7.0.0.

4.- Desempaqueta el zip en la carpeta creada.

5.- Ir a la carpeta de la version anterior PHP5.2.12, copia los archivos PHP.ini y WAMPSERVER.conf a la carpeta PHP7.0.0.

6.- Editar el archivo PHP.ini y buscar la linea extension_dir y reemplaza la carpte 5.2.12 por 7.0.0, quedando de la siguiente manera "C:/wamp/bin/php/php7.0.0/ext/", (Esto considerando que sea la ruta por default que se crea al instalar WAMPSERVER).

7.- Buscar la linea 
; Be sure to appropriately set the extension_dir directive, luego reemplaza hasta la linea que diga Module Setting con el texto siguiente:


; Be sure to appropriately set the extension_dir directive.
;
extension=php_bz2.dll
extension=php_curl.dll
;extension=php_com_dotnet.dll
;extension=php_enchant.dll
extension=php_fileinfo.dll
;extension=php_ftp.dll
extension=php_gd2.dll
extension=php_gettext.dll
extension=php_gmp.dll
extension=php_intl.dll
extension=php_imap.dll
;extension=php_interbase.dll
extension=php_ldap.dll
extension=php_mbstring.dll
extension=php_exif.dll ; Must be after mbstring as it depends on it
extension=php_mysqli.dll
;extension=php_odbc.dll
extension=php_openssl.dll
;extension=php_pdo_firebird.dll
extension=php_pdo_mysql.dll
;extension=php_pdo_oci.dll
;extension=php_pdo_odbc.dll
;extension=php_pdo_pgsql.dll
extension=php_pdo_sqlite.dll
;extension=php_pgsql.dll
;extension=php_phpdbg_webhelper.dll
;extension=php_shmop.dll
 ; The MIBS data available in the PHP distribution must be installed.
; See [www.php.net]
;extension=php_snmp.dll
 extension=php_soap.dll
extension=php_sockets.dll
extension=php_sqlite3.dll
;extension=php_sysvshm.dll
;extension=php_tidy.dll
extension=php_xmlrpc.dll
extension=php_xsl.dll
;;;;;;;;;;;;;;;;;;;
; Module Settings ;
;;;;;;;;;;;;;;;;;;;
8.- Realiza una copia del archivo PHP.ini en la misma carpeta y reenombralo por phpForApache.ini

9.- Abre el archivo wampserver.conf y reemplaza todo el código con el siguiente texto.


<?php
       $phpConf['phpIniDir'] = '.';
       $phpConf['phpExeDir'] = '.';
       $phpConf['phpConfFile'] = 'php.ini';
       //PHP 7 needs Apache 2.4.x and doesn't works with Apache 2.2.x
       $phpConf['apache']['2.4']['LoadModuleName'] = 'php7_module';
       $phpConf['apache']['2.4']['LoadModuleFile'] = 'php7apache2_4.dll';
       $phpConf['apache']['2.4']['AddModule'] = '';
?>
10.- Reinicia tu wampserver y eso seria todo, ya podrás ver en el menú de php que puede seleccionar la versión 7.0.0.

Deja tus comentarios.

Compartir:

miércoles, 26 de octubre de 2016

11 Extensiones para Google Chrome para Desarrolladores Web

Una de las ventajas de utilizar un navegador web como Google Chrome es que incluye una gran cantidad de extensiones destinadas a satisfacer múltiples necesidades. De hecho existe una buena cantidad de extensiones de Google Chrome destinadas a desarrolladores web que pueden ser de mucha ayuda.

Las extensiones son complementos que podemos instalar en muchos navegadores web. Suelen agilizar mucho el trabajo ya que no necesitarás arrancar ningún programa. Con tenerlas instaladas pueden ahorrarte mucho tiempo.

Las extensines suelen ofrecer información adicional de gran valor.

Las mejores extensiones de Chrome para diseñadores web

Dado su utilidad hemos seleccionado hasta conce complementos de Google Chrome para diseñadores web para optimizar el trabajo.

Web developer

Quizás la extensión de diseño web mas completa que exista. A través de una barra de herramientas podrás ver una gran cantidad de información sobre cualquier página web. Hojas de estilo CSS, estructura de una web, información sobre caché,… y una enorme cantida de información.

Awesome Screenshot

Uno de los complementos para Chrome al que más partido le puedas sacar. Aunque no se trata de una extensión especialmente dirigida a diseñadores web resulta especialmente práctica. Permite realizar una captura de pantalla de una página web total o parcial. Una vez realizada la captura se pueden agregar formas y anotaciones para destacar los elementos más importantes, además de que se puede guardar o compartir.

Resolucion Test

Ver como va a quedar un diseño en diferentes resoluciones es una tarea obligatoria en cualquier profesional. Con esta herramienta verás una web en distintas resoluciones con solo pinchar en la resolución determinada. Hacerlo mas rápido es imposible.

Responsive Web Design Tester

Comprueba si una página web o blog cuenta con diseño adpatado a móviles en solo un instante. Otra forma de comprobar si un diseño es reponsivo o no en solo un segundo.

CSS Viewer

CSS Viewer CSS es un sencillo visor de propiedades para inspeccionar el código fuente de cualquier página web. Con solo hacer clic sobre la herramienta y luego sobre un elemento podrás ver el código de una web de una forma rápida y fácil.

WhatFont

Una de las extensiones mas antiguas que se conocen. Una forma de saber qué tipografía utiliza una web. Pincha sobre la extensión y luego sobre la fuente que quieres identificar y ya está.

Who Is Hosting?

Si quieres averiguar el hosting de una página web está herramienta te interesa. En solo un segundo averiguarás datos de una web que de otra forma sería mas costosa. Con un solo clic sabrás dónde está alojado un dominio.

Cloud Save

Esta es una extensión de Chrome que nos permite guardar archivos de cualquier sitio web en diferentes servicios de almacenamiento en la nube como Dropbox, Amazon Cloud Drive o Flickr.

Code Cola

Con esta extensión, los usuarios tendrán la oportunidad de editar el CSS dentro de un sitio web.

HTML Instant

Se trata de una extensión que funciona como un editor de código HTML en tiempo real, además de que se muestra con una pantalla dividida para trabajar con mayor comodidad. Conforme se escribe el texto con el código HTML en el lado izquierdo, en el panel de la derecha se van mostrando los resultados de forma automática. También escompatible con JavaScript y CSS.

Alexa Traffic Rank

Una extensión para saber al instante el ranking de una página web. Pero Alexa nos da mas información al respecto como número de enlaces, velocidad de carga,…

LastPass: Free Pasword Manager

Otra extensión que no es propiamente de diseño web. Está pensada paragestionar múltiples contraseñas web desde el navegador.

Con todas estas herramientas y extensiones de Google Chrome para desarrolladores web seguro que lograrás agilizar cualquier trabajo. Con el tiempo seguro que encuentras otras extensiones que pueden serte tan útiles como éstas o incluso más.

Compartir:

martes, 18 de octubre de 2016

¿Sabías que tu router doméstico está siendo atacado continuamente?

¿Sabías que tu router doméstico está siendo atacado continuamente?

El router inalámbrico es el corazón de nuestra red local doméstica, y en muchas ocasiones no está lo suficientemente protegido, por lo que los equipos de la red podrían estar en peligro. Los ataques a cualquier router doméstico son continuos, y es fundamental tomar unas medidas mínimas de seguridad para proteger los equipos de la red.
Los usuarios domésticos, aunque pueda parecer lo contrario, también son objetivo de los ciberdelincuentes. Si no tenemos correctamente configurado nuestro dispositivo, o tiene un firmware con alguna vulnerabilidad conocida, un atacante podría infectar nuestro router con malware y reenviar a todos los equipos de la red local a páginas maliciosas para infectar sus equipos con malware.

Recomendaciones de seguridad para routers domésticos

La primera recomendación de seguridad que os podemos dar escambiar la contraseña de administrador, algo que muy pocos usuarios hacen, ya sea por desconocimiento o por dejadez. Es fundamental que si nuestro router es accesible desde la WAN de Internet, tengamos la contraseña de acceso cambiada, para no facilitar a los ciberdelincuentes el acceso al panel de administración y que cambien la configuración de por ejemplo los servidores DNS.
Otra medida de seguridad que debemos tomar es deshabilitar cualquier servicio de administración a través de la WAN que no usemos, es decir, si nuestro enrutador tiene un servidor Telnet o SSH para poder administrarlo remotamente y no lo vamos a usar, es recomendable deshabilitarlo. También debemos tener en cuenta la administración de los routers a través de HTTP o HTTPS, si no vamos a administrarlos desde Internet lo mejor es deshabilitarlo. En el hipotético caso de que sí necesitemos administrar nuestro router a través de Internet, cambia la contraseña de administrador.
Con estos sencillos consejos ya tendremos el router bastante protegido, y es que el propio firewall que incorporan los routers son capaces de bloquear cualquier intento de conexión ilegítimo.
Algo que no está en la mano de los usuarios domésticos son los fallos de seguridad de los propios firmwares, sin embargo, sí depende de nosotros actualizar el firmware cuando haya uno nuevo disponible. Es recomendable revisar periódicamente las nuevas versiones de firmware, sobre todo si es un router comprado por ti y no un router de un operador, ya que estos últimos no suelen tener demasiadas actualizaciones. En el portal RouterSecurity encontraremos todas las noticias de vulnerabilidades de routers y también escáners para comprobar fallos de seguridad conocidos.

¿Sabes todos los ataques que ocurren en tan solo 24 horas en un router?

El investigador de seguridad Francisco J. Rodríguez @0fjrm0 colocó una sonda en su router proporcionado por un conocido ISP español y sacó unas conclusiones muy preocupantes. Todas las pruebas fueron ataques de la red WAN de Internet:
  • Tuvo más de 20.000 eventos hacia su router doméstico.
  • De estos eventos, más de 4.600 fueron ataques hacia diferentes puertos para acceder a su router y servicios. Los servicios más afectados fueron SSH, Telnet, 443, 2323, RPD, VNC, 8080 entre otros.
  • Se registraron un total de 92 países distintos y se consultaron casi 350 puertos diferentes.
Muchos de esos intentos de conexión fueron desde España, de hecho, algunas IP tenían disponibles los paneles de administración remota de sus routers, incluso algunos usaban los credenciales predeterminados del ISP.
Fuente: redeszone
Compartir: