¿Alguna vez se preguntaron, cómo es que hacen los sitios como blogger, twitter, facebook, google y otros para poner en cada publicacion "posteado hace #$%%& minutos/días/semanas/meses/año(s)? Par empezar deben estar seguros de que las entradas de la tabla de su base de datos, la cual quieran extraer información tenga un campo date estilo TIMESTAMP el cual tenga un registro automático para el setéo de fechas (CURRENT_TIMESTAMP). Luego de ello, usen esta función en la cual el parámetro va a ser el valor del key que determina la fecha del Array devuelvo por la base de datos.

function PostDate ( $Date ) {
  if( empty ( $Date ) ) {
    return "No se puede procesar una fecha nula";
  }
  $Period = array (
    "segundo",
    "minuto",
    "hora",
    "día",
    "semana",
    "mes",
    "año"
  );
  $Length = array (
    "60",
    "60",
    "24",
    "7",
    "4.35",
    "12",
  );
  $Now = time();
  $UnixDate = strtotime ( $Date );
  if ( empty ( $UnixDate ) ) {
    return;
  }
  if ( $Now > $unix_date ) {
   $Difference = $Now - $UnixDate;
   $Tense = "hace aproximadamente";
  }
  else {
    $Difference = $UnixDate - $Now;
    $Tense = "desde ahora";
  }
  for ( $j = 0; $Difference >= $Length [ $j ] && $j < count ( $Length ) -1; $j++ ){
    $Difference /= $Length [ $j ];
  }
  $Difference = round ( $Difference );
  if( $Difference != 1 ) {
   $Period [ $j ].= "s";
  }
  return "{$Tense} $Difference $Period [ $j ]";
}



Entones para usarla hacemos simplemente print PostDate ( $Fecha );

Posted in

Como ya sabemos el API de Twitter es escasa y tiene para muchos una documentación poco legible.
Entonces propongo una función, que trabaja mediante el cURL de PHP para traer los datos desde el server de Twitter hasta nuestra aplicación.
Cabe destacar que esta no es la forma oficial de hacerlo; pero, por si alguna razón la precisan, entonces acá la comparto.

function TwitterTimeLine ( $UserName ) {
  try {
    $Url = "http://twitter.com/statuses/user_timeline/".
           $UserName.".
           json?count=1";
    $Curl = curl_init();
    curl_setopt ( $Curl, CURLOPT_URL, $Url );
    curl_setopt ( $Curl, CURLOPT_RETURNTRANSFER, 1 );
    $CurlData = curl_exec ( $Curl );
    curl_close ( $Curl );
    return current ( json_decode ( $CurlData, true ) );
  }
  catch ( Exception $e ) {
    error_log ( $e );
  }
}



Entonces, así de simple se obtiene la información; para ver la extensa lista que esto nos proporciona, en formato JSON, por cierto, pueden hacer esto: print_r ( TwitterTimeLine ( 100000 ) );

Posted in

Hoy hablaremos de los estándares en PHP.-
¿Para qué sirven éstos?; para facilitar el código y cuándo digo "facilitar" me refiero a apuntar que resulte fácil de leerse, que se obtengan menos errores y en caso de tenerlos, sea más fácil de identificarlos y depurarlos y a ayudar a mejorar el trabajo en equipo. Por convención se aprende a programar de diversas fuentes y materiales que se desparraman por toda la web; pero (...) todos o casi todos los desarrolladores de cualquier lenguaje tienen una forma diferente con la cual escriben su código. Pero imaginen que se esta trabajando con otros 2, 7, 15 o más desarrolladores en conjunto (...), sería tedioso lidiar con cada una de las notaciones del script; por eso sugiero ser más objetivo y dejar un poco de lado el ego y la subjetividad de uno mismo, o podríamos tener problemas luego (computacionalmente hablando).


Entonces, si nos basamos en los estandares PHP, nos podríamos remitir a los estándares ZEND, ya que no han de estar en vano, ya sea por optimizaciones de seguridad o por ser uno de los materiales del mismo lenguaje más visitado de la web o simplemente porque es la empresa que más se sumergió en el hecho de ayudara crecer a la extensa librería del proyecto de Rasmus Lerdorf.


Así que comencemos.


  • No esta admitido el cierre de etiquetas ?> en donde el archivo solo contenga código PHP. Es decir, si contiene HTML u otros, debe de cerrarse, por el contrario, no se aconseja.
  • No se permite tabular, solo espaciar 4 veces.
  • Cada linea de código debe mantenerse por debajo de los 80 caractéres, si es posible.
  • Los nombres de clases pueden contener sólo caracteres alfanuméricos. Los números están permitidos en los nombres de clase, pero desaconsejados en la mayoría de casos.

    Si el nombre de una clase esta compuesto por mas de una palabra, la primer y solo la primer letra de cada palabra debe aparecer en mayúsculas.
  • Las clases abstractas siguen la misma convención que las clases comunes, solo que, adicionalmente, debe de agregarse al final del nombre de la clase "Abstract".
  • Las Interfaces, al igual que las clases abstractas siguen la misma convención y acaba con la palabra clave "Interface".
  • Para separar las palabras de la ruta del archivo, es estrictamente desaconsejable usar espacios o Camell Case. Simplemente (_) ó (-) estarán permitidos.
  • Las funciones siguen el mismo patrón que las clases. Excepto que cuando las mismas se declaran como privadas o protegidas de acceso, debe de empezar su nombre por "_".
  • Las variables siguen la misma manera que las funciones, y se aconseja asignarles un nombre constructivo a no ser que solo se les de utilidad en los loops.
  • Las constantes deben nombrarse en mayúsculas y además, separar cada palabra con "_".
Cabe destacar que hay decenas de estándares más de Zend, aunque estos, a mi parecer son los más relevantes.


Posted in

Como es por converción, todo tomamos a PHP como un simple lenguaje capaz de conectarse a una base de datos e imprimir variables en pantalla, pero esto es erroneo. PHP es un lenguaje mucho más extenso y acá hay un ejemplo irrefutable de ello: el servicio o tecnología web sockets.

Una de las funcionas predefinidas desde el lenguaje más popular (en el ámbito de los sockets) es la llamada fsockopen(), la cual abre una conexión mediante socket a un dominio especificado.

Ahora, la pregunta es: ¿para que sirven estos benditos sockets?; simple: permite a los servidores y navegadores web un canal para el flujo de datos ordenado, en el cual se envían peticiones y respuestas de lado a lado. Éstos dependerán explícitamente del protocolo de comunicaciones en el cual estén basados, por lo general se usa TCP, aunque puede variar. Entonces, el servidor espera a que el cliente le proponga una petición y el mismo le responde con los datos en cuestión; simple y conciso.

Acá mismo cito un ejemplo para ver como funciona. Recomiendo profundizar un poco en cuanto a las funciones básicas.

*fsockopen abre el canal de transmisión de datos desde el cliente al servidor, por el cual van y vuelven datos de lado a lado. Sus parametros son:
1) El dominio al cual se le presenta la petición;
2) El puerto. (por lo general es 80, aunque podría ser otro. De todas formas a tener cuidado con el puerto seleccionado);
3) Si hay un error, esta variable nos proporciona su número;
4) Si hay un error, esta misma nos proporciona su mensaje;
5) Tiempo límite de conexión, aunque no siempre es necesario, a veces optimiza los canales;

*fclose cierra la conexión.

<?php
$Datos = false;
$Url ='www.miurl.com';
$Fp = @fsockopen ( $Url, 80, $Error, $ErrorStr, 1 );

if ( $fp ) {
  stream_set_timeout ( $Fp, 1 );
  $Salida = "GET / HTTP/1.0\r\n";
  $Salida .= "Host: www.miurl.com\r\n";
  $Salida .= "Connection: Close\r\n\r\n";
  if ( fwrite ( $Fp, $Salida ) ) {
    $Contenido='';
    $Cabeceras = false;
    while ( ! ( feof ( $Fp ) ) ) {
      $Datos = true;
      $Linea = fgets ( $Fp,128 );
      if ( $Linea == "\r\n" && $Cabeceras ) {
        $Cabeceras = true;
      }
      if ( $Cabeceras ) {
        $Contenido.= $Linea;
      }
    }
    fclose ( $Fp );
  }
}

if ( ! ( $Datos ) ) {
  print "No hay permisos necesarios para obtener datos desde $Url";
}
else {
  print "$Contenido";
}

?>


Entonces, se supone que esto servirá para aquellos que quieren ponerse al día de las nuevas inclusiones de PHP.
Notese que no hay que abusar de estas tecnologías; ya que a veces simplemente hay otras alternativas menos consumistas y eficientes que una sopa de letras y funciones con callBacks y detección de errores.

Posted in


A veces nuestro servidor se ve extensamente sobrecargado por nuestras aplicaciones. A lo que nos preguntamos, ¿qué es lo que consume tanto?; la respuesta es muchas cosas. Pero más básicamente se basa en peticiones a la base de datos.Entonces reformulemos la pregunta, ¿para qué hacer una petición a la base de datos de algo que posiblemente sea siempre igual, si podemos almacenarlo como un archivo y mostrarlo rápida, eficientemente y sin mayor consumo, en lugar de lo anterior?La respuesta a esto se llama CACHÉ, y he aquí una pequeña clase para manipular esta maravilla:


<?php
class Cache 
{
  private static $cache_dir = null;
  private static $cache_reset_field = "mab";
  private $cache_field = array();
  /** * @var {integer} 900 segundos -> 15 minutos.- */


  private $cache_time = 900;
  private $cache_file = null;


  public function __construct () 
  {
    if ( ! self::$cache_dir ) {
$this->set_cache_dir ( getcwd ()"/cached/" );
    }
  }
    

/** * @param {string} $dir.- * @return Cache.- */
  public function set_cache_dir $dir ) 
  {
    if ( ! is_dir$dir ) )
      @mkdir ( $dir, 0777 );
    self::$cache_dir = $dir;
    return $this;
  }
     

  /** * @param {string} $field.- * @return Cache.- */
  public function set_cache_reset_field ( $field 
  {
    self::$cache_reset_field = $field;
    return $this;
  }
     

  /** * @param {string} $field.- * @param {string} $value.- * @return Cache.- */

  public function add_cache_field ( $field$value ) 
  {
    $this->cache_field [] = "{$field}={$value}";
    return $this;
  }
     

  /** * @return {string}.- */
  public function get_cache_field () 
  {
    return @implode ( "&"$this->cache_field );
  }
   
  
/**
* @param {integer} $time.- * @return Cache.- */
  public function set_cache_time ( $time ) 
  {
    $this->cache_time = $time;
    return $this;  } /** * @return {integer}.- */
  public function sget_cache_time () 
  {
    return $this->cache_time;
  }
     

  /** * @return {boolean}.- */
  public function start_cache ( $cache_id = null
  { /**
* #Resetea todo el caché si es necesario.- */
    if ( isset$_GET [ self::$cache_reset_field ] ) ) { /** * #Resetea el tiempo.- */
      $this->set_cache_time ( 0 ); /** * #Archivo entero.- */
      if ( ! $cache_id ) {
        /**
* #Resetea el string.- */
        $reset_field = self::$cache_reset_field. "{ $_GET [ self :: $cache_reset_field ] }";
        $_SERVER [ "QUERY_STRING" ] = preg_replace (
            array (
              
"/&{$reset_field}/",
              "/&{$reset_field}/",
              
"/&{$reset_field}/" 
            ),
            array( ""
, "", "" ),
            $_SERVER [ "QUERY_STRING" ] );
      }
    } /**
* #Setemos el path completo.- */
    $this->cache_file = self::$cache_dir.
                              md5 ( ( 
$cache_id
                                        ? 
$cache_id
                                        : 
$_SERVER [ "SCRIPT_NAME" ].
$_SERVER [ "QUERY_STRING" ]                                    ). $this->get_cache_field()                               ); /** * #¿Existe el archivo?.- * #Si es verdadero, comienza el caché.- */ 
  if ( @file_exists$this->cache_file ) && (       ( time() - $this->get_cache_time() ) < @filemtime$this->cache_file ) ) )
   
{
      print file_get_contents$this->cache_file );          /** * #Si es un archivo(...).- */
      if ( ! $cache_id ) {
        exit;
     
}

    } 
    else {
       
/**
* #Comienza el flujo de datos (...) [ BUFFERING ].- */
      ob_start();
      return true;
    }
  }

  public function end_cache () 
  {
    /** * #Obtiene salida de datos (...) [ BUFFERING ].- */
    $cache_content = ob_get_clean ();
    $cache_file = @fopen$this->cache_file"w" );
    @fwrite$cache_file$cache_content );
    @fclose$cache_file );
/** * #Salen los datos (...).- */
    print $cache_content;
  }
}

Entonces, para usarlo, solo debemos hacer lo siguiente: creamos en la carpeta raíz del servidor un subdirectorio llamado "cached". Localizamos el archivo al cuál queremos darle el caché y agregamos dentro de el lo siguiente:

$path = $_SERVER ['DOCUMENT_ROOT'];
require_once $path.'/mi_directorio/Cache.php';

$Cached = new Cache; $Cached->start_cache(); (...)Código de la página en cuestión(...) $Cached->end_cache();

Y listo, eso fue todo por hoy. Espero que disfruten esta pequeña pero excelente clase, para que, tal vez, puedan añadirla a su repositorio y usarla cuando deseen. Ah (...), este objeto es EXCELENTE cuando se usa con PDO y el mismo se conecte mediante Singleton.

Posted in


Como comentaba antes, atras queda ya el conocimiento sobre 

Linux, y en este caso les acerco un poco sobre la preciada terminal.A diferencia de Mac o Windows, Linux tiene más aspectos en cuanto a la seguridad y si hablamos de su uso correcto, entonces quitemos de lado las ventanas y los cuadros de diálogo y vamos a centrarnos en la terminal de Linux. Por que, ¿qué mejor forma que usar un ordenador que desde su núcleo?.
Tengamos en cuenta que para abrir la terminal debemos teclear, en la mayoría de las distribuciones de Linux CTRL+ALT+T.

Gestión de archivos

cd .- Con este comando, podremos entrar y salir de ciertos directorios. Por ejemplo: cd /home/carpetaX/, ahí estaríamos diciendole a Linux que nos lleve a la carpeta "carpetaC" que a su vez esta dentro de la carpeta "home". Pero al contrario de esto, si solo tecleamos cd, nos retornaría a la carpeta anterior. Imaginemos que estamos en "home/carpetaX/" y tecleamos  cd, nos dirigirá a la carpeta "home". Digamos que retrocede a la carpeta madre en la cual estamos situados, por así decirlo, vulgarmente.
ls .-  Lista todos los archivos de una carpeta especifica, en colores por mostrar las propiedades de cada archivo.
rm .-  Borra un archivo específico, por ejemplo: rm /home/carpetaX/archivoX.pdf
rmdir .- Igual que rm, pero en este caso elimina un directorio o carpeta, por ejemplo: rmdir /home/carpetaX/
cp .- Copia un archivo a otra carpeta, por ejemplo: cp /home/carpetaX/archivoX.pdf /home/carpetaZ/archivoZ.pdf
mv .- Mueve un archivo a otra dirección, de la misma manera que cp

Privilegio de administrador


sudo .- todo lo que venga después de este comando, sera ejecutado a nivel administrador del sistema, con máximos privilegios.
Entonces, talvez te interese probar la consola de Linux, para aprender mejor como funciona tu computadora.
Tengan en cuenta que la terminal de Linux no ha matado a nadie, o por lo menos no directamente. Así que intentenlo, siempre les servira.


¿Querés aprender PHP y no sabes por donde empezar?, o, ¿simplemente queres profundizar tus conocimientos?

Entonces, puedo ayudarte. Voy a insertar una lista de libros para que te resulte más fácil aprender este preciado lenguaje.

Si aún no empezaste con PHP, o queres repasar aspectos básicos, entonces (...);

Programming PHPProgramming PHP, es un excelente libro escrito por Kevin Tratoe y Rasmus Lerdorf.    Para quienes no saben quién es Rasmus Lerdorf, es el creador del lenguaje PHP. Así que, ¿qué mejor que su creador para enseñarte este lenguaje? 
Por Rasmus Lerdorf & Kevin Tratoe. Editorial O'reilly.~


Learning PHP & MySQL, es un libro que comienza desde lo básico, esencial y más elemental de PHP. Obviamente PHP no sería nada sin su compañero MySQL o alguna base de datos, ya que no sería tan dinámico que digamos.
Por Michele E. Davis & John A. Philips. Editorial O'reilly.~


Ajax with PHP5, te muestra cuán efectivo puede ser PHP implementado con AJAX, para un mejor servicio en tu sitio. Repasa además, aspectos de seguridad y tips para implementar en cuanto a la optimización del desarrollo.
Por Andrew G. Curioso. Editorial O'reilly. ~


PHP, pocket reference, otro maravilloso libro escrito por el amigo Rasmus Lerdorf. Es un libro que cuenta con varias funciones imprescindibles a la hora de programar en este lenguaje. Es una edición de bolsillo, por lo cual no se detiene en explicaciones redundantes.
Por Rasmus Lerdorf. Editorial O'reilly.~


PHP, the good parts. Como bien dice el título, se propone a enseñarte los mejores aspectos de este extenso lenguaje.
Por Peter Maclntyre. Editorial O'reilly.~



Si aún no viste la respectiva orientación a objetos de PHP o sos un programador avanzado y querés aprender aún más(...);

Professional PHP6 es un extenso libro que te muestra las mejores técnicas de este lenguaje y patrones de organización y optimización del mismo, así como diagramas para desarrollo. En mi opinión, uno de los mejores libros del mundo entero de PHP.
Por Ed lecky-Thompson, Steven D. Nowicki & Thomas Myer. Editorial Wrox.~


PHP Objects, Patprogressprogressterns & Practice es un buen libro también, aunque si no sos un buen amante de PHP, posiblemente muchas cosas no puedas entenderlas. Recomiendo leerlo con calma y hacer todos los ejercicios.
Por Matt Zandstra. Editorial Apress.~


MongoDB & PHP. Por si acaso no te agradan las bases de datos de estructura relacional, o te llevas mal con el álgebra relacional y buscas otro tipo de análisis, entonces este libro es para vos. Hay que aclarar que es bastante complejo.
Por Steve Francia. Editoral O'reilly.~

A medida que encuentre material, actualizaré este post.



GroovieDev, compartiendo conocimiento. Con la tecnología de Blogger.