martes, 21 de julio de 2015

Testear con Perl una expresión regular

En la vida de todo programador Perl hay un momento especial en el que hay que escribir una expresión regular. Entonces nos encontramos con que nuestro patrón matchea con más o menos de lo esperado. O nada en realidad.
Este script es util para testear nuestros patrones de ExpReg con algún string y ver si matchea y dónde matchea:

    #!/usr/bin/perl

    # lee una linea de entrada a la vez
    while (<>) {
      chomp;
      if (/YOUR_PATTERN_GOES_HERE/) {
        # codigo misterios! ver explicacion
        print "Matched: |$`<$&>$'|\n"; 
      } else {
        print "No match.\n";
      }
    }

Este script es un test para que lo usen los programadores, no los usuarios finales. Por eso no tienen ningún prompt ni información de cómo se usa. Toma cualquier número de líneas como entrada y chequea cada una contra el patrón que colocas en lugar de "YOUR_PATTERN_GOES_HERE". Para cada línea que matchea se ejecuta el "codigo misterioso". Lo que hace es colocar entre paréntesis angulares el string que coincide con el patrón. Por ejemplo si el patrón es /match/ y la línea de entrada es antesmatchdespues, la salida dirá "antes<match>despues". De esta forma se hace más visible con qué parte de la cadena matchea el patrón. Prueba y verás!

domingo, 8 de febrero de 2015

Un poco de Javascript avanzado

Se trata de una traducción que tiene algunos años, espero que les guste:

Hey, yo no sabía que podías hacer eso


Si tú eres un desarrollador web y vienes del mismo lugar que yo, probablemente has usado un poco de Javascript en tus páginas web, la mayoría para pegar la interface de usuario (UI).

Hasta hace poco, conocía que Javascript tenía más capacidades OO que las que empleaba, pero no me sentía a gusto para usarlas. Cuando los navegadores comenzaron a soportar más características normalizadas de DOM y Javascript, me pareció viable escribir código más complejo y funcional para correr en el cliente. Esto ayudado por el nacimiento del fenómeno AJAX.

Cuando comenzamos a aprender lo que toma escribir nuestras buenas aplicaciones con AJAX, empezamos a notar que el Javascript que solemos usar es realmente tan sólo la punta del iceberg. Vemos ahora que Javascript se usa más allá de los quehaceres simples de UI como la comprobación de la entrada y otras tareas frívolas. El código del cliente ahora es mucho más avanzado y compuesto, tanto como una aplicación real de escritorio o un cliente pesado de un ambiente cliente-servidor. Vemos las librerías de clases, objetos modelo, jerarquías, patrones, y muchas otras cosas que acostumbramos sólo ver del lado del código del servidor. 

Ver más...

lunes, 19 de enero de 2015

Un script que testea expresiones regulares

En la vida de todo programador Perl hay un momento especial en el que hay que escribir una expresión regular. Entonces nos encontramos con que nuestro patrón matchea con más o menos de lo esperado. O nada en realidad.
Este script es util para testear nuestros patrones de ExpReg con algún string y ver si matchea y dónde matchea:





    #!/usr/bin/perl

    # lee una linea de entrada a la vez
    while (<>) {
      chomp;
      if (/YOUR_PATTERN_GOES_HERE/) {
        # codigo misterios! ver explicacion
        print "Matched: |$`<$&>$'|\n"; 
      } else {
        print "No match.\n";
      }
    }

Este script es un test para que lo usen los programadores, no los usuarios finales. Por eso no tienen ningún prompt ni información de cómo se usa. Toma cualquier número de líneas como entrada y chequea cada una contra el patrón que colocas en lugar de "YOUR_PATTERN_GOES_HERE". Para cada línea que matchea se ejecuta el "codigo misterioso". Lo que hace es colocar entre paréntesis angulares el string que coincide con el patrón. Por ejemplo si el patrón es /match/ y la línea de entrada es antesmatchdespues, la salida dirá "antes<match>despues". De esta forma se hace más visible con qué parte de la cadena matchea el patrón. Prueba y verás!

viernes, 27 de diciembre de 2013

Algunas buenas prácticas en PHP

Indentar tu código y usar espacios en blanco para mejorar su lectura

Coloca varios niveles de sangrado y separar párrafos de código con líneas en blanco mejoran su legibilidad. Esto te ayudará a hacer cambios en el futuro. Se recomienda usar espacios en vez de caracteres de tabulación porque podría verse diferente en diferentes editores. Los IDEs y editores de texto avanzados puede indentar en forma automática.

Encontrá el mayor número de una terna

Como ejemplo tratemos de leer este código :
if(($n1>$n2)&&($n1>$n3)){ echo "El mayor es $n1\n"; }else{ 
if($n2>$n3){ echo "El mayor es $n2\n"; }else{ echo "El mayor es $n3\n"; 
}} 
y comparémoslo con este código bien indentado:
if (($n1>$n2) && ($n1>$n3)) {
  echo "El mayor es $n1\n";
} else {
  if ($n2>$n3) {
    echo "El mayor es $n2\n";
  } else {
    echo "El mayor es $n3\n";
  }
} 

Almacenar direcciones IP como UNSIGNED INT

Cuando tenemos que guardar una IP en una tabla de nuestra base de datos podemos pensar en usar un VARCHAR(15) sin darnos cuenta que podemos almacenarlo en un entero, ahorrando espacio y utilizando un campo de tamaño fijo en vez de variable.

INET_ATON()

Esta función de Mysql retorna una representación numérica de una dirección IP.
Por ejemplo:
mysql> SELECT INET_ATON('10.0.5.9');
        -> 167773449
el valor se calcula sumando los productos de cada término por 256 elevado al cubo, al cuadrado, a la uno o a la cero según su posición: 10×2563 + 0×2562 + 5×256 + 9 = 167773449.

INET_NTOA()

Dado un número esta función de Mysql retorna una representación de dirección IP que estamos acostumbrados a ver de cuatro números separados por puntos.
Por ejemplo:
mysql> SELECT INET_NTOA(167773449);
        -> '10.0.5.9'

Implementación

Tenés que utilizar campos UNSIGNED INT porque los campos INT no pueden almacenar correctamente los valores numéricos de IPs que empiecen con un número mayor a 127.
En PHP hay funciones similares llamadas ip2long() y long2ip(). Por ejemplo para actualizar una tabla "usuarios" con la IP del usuario actual podriamos usar:
$r = "UPDATE usuarios 
      SET ip = INET_ATON('{$_SERVER['REMOTE_ADDR']}') 
      WHERE user_id = $user_id";  

Usar Output Buffering

Activando el almacenamiento de la salida en búffer mejoramos el rendimiento y velocidad de nuestros scripts PHP. Sin output buffering el script va mostrando el HTML de la página a medida que lo va procesando, en trozos. Pero agregando output buffering PHP almacena en una variable todo el HTML y lo envía al navegador de un tirón.

Funciones ob_start() y ob_end_flush()

ob_start() activa el almacenamiento en búffer y en forma optativa podemos decirle cuánto queremos almacenar como máximo y qué función llamar cuando se llene el búffer.
ob_end_flush() desactiva el almacenamiento de la salida en búffer, envía su contenido y lo descarta.

Implementación

Imprimir los cubos de los primeros 100 números naturales:
<!DOCTYPE html>  
<?php ob_start(); ?>  
<html lang="en">  
<head>  
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">   
    <title>Cubos</title>  
</head>  

<body>  
  <?php for($i = 0; $i <= 100; $i++){?>
      <p>El cubo de <?php echo $i;?> es <?php echo pow($i, 3);?></p>
  <?php } ?> 
</body>  
</html>  
<?php ob_end_flush();