¿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 );
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 ) );
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.
- 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 "_".
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.
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.
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_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 ].- */
$cache_file = @fopen ( $this->cache_file, "w" ); @fwrite ( $cache_file, $cache_content );
@fclose ( $cache_file ); /** * #Salen los datos (...).- */
$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();
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?.
Gestión de archivos
Privilegio de administrador
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.
Entonces, puedo ayudarte. Voy a insertar una lista de libros para que te resulte más fácil aprender este preciado lenguaje.
Por Michele E. Davis & John A. Philips. Editorial O'reilly.~
Por Andrew G. Curioso. Editorial O'reilly. ~
Por Rasmus Lerdorf. Editorial O'reilly.~
Por Peter Maclntyre. Editorial O'reilly.~
Como ya todos sabemos, linux es el proyecto basado en software libre más grande del mundo, pero lo que pocos sabemos es cuando se creo este movimiento, quienes lo iniciaron, ni el porqué.
Entonces, empecemos nombrando a sus creadores.
Linus Torvalds, Ingeniero de sistemas nacido el 28 de diciembre de 1969 en Finlandia, creador del núcleo de Linux, basandose en Minix, lanzó este proyecto por primera vez el 25 de agosto de 1991 y en 1992, Linux adopta la Licencia Pública General (GPL), permitiendo su modificación, redistribución, copia y uso ilimitado. Actualmente, trabaja para el Open Source Development Labs, en Oregon, USA., aunque hoy día, solo el 2% del código plasmado en Linux esta escrito por el.
Richard Stallman, Programador estadounidense, fundador del gram movimiento del Software Libre Mundial, creador también de GNU Emacs, el compilador GCC y el depurador GDB. El insiste en que no solo se use código abierto en los sistemas computacionales, sino que insiste en que se use código libre en lo mismos y además que en lugar de usar Linux, se use GNU/Linux, que es distinto. Por ejemplo, Microsoft ofrece varias aplicaciones de código abierto, pero no necesariamente son libres, ni el sistema operativo lo es, entonces muchos usuarios piensan "no quiero usar más este software para financiar este monopolio que lucra con el mundo entero, voy a migrar a Ubuntu", lo cual también es erroneo, ya que Ubuntu no es totalmente GNU, aunque si esta basado en Linux y es mucho mejor que Windows.
Además de esto, seguramente TODO el mundo usó alguna vez Linux, aunque sin darse cuenta.
Por ejemplo, muchos microondas, lavaropas, heladeras, celulares, GPS's, sistemas computarizador de motores para autos, máquinas de campo, camionetas, etc., MP3, MP4, televisores, satélites, impresoras, equipos de músicas, radares y equipos de avión, entre otros miles de dispositivos.
Y las personas que ya conocen linux, talvez usen algunas de estas distribuciones:
CentOs, Debian, Fedora, Mint, Gentoo, Knoppix, Linspire, Mandriva Slackware, SuSE, Ubuntu, Zenwalk, gNewSense, Utoto, entre otros.
Y cuando digo entre otros, digo entre otros cientos. Miren si no me creen.-
¿Qué es el patrón Singletón?, simplemente una medida a tomar para que la clase que se le aplique tenga una y solo una instancia.
Este método es eficiente solo cuando se aplica por ejemplo en clases de sesiones, cookies, o bases de datos, etc. para no generar una sobrecarga en los servidores.
Se debe tener en cuenta que no se permite instanciar una clase por el método New o por su constructor, así como se restringe clonar el objeto en cuestión.
<?php
* El método (...) */
public static function getInstance () { if ( self::$_instance !== null ) { self::$_instance = new SingletonExample; } return self::$_instance; } }$Singleton = SingletonExample::getInstance(); $Singleton->talk();
Y básicamente, este es el método tan famoso.A veces se requieren cosas más complejas, por lo que existe la serialización de objetos, por ejemplo cuando se usa AJAX, pero eso lo podremos vez más adelante en los pro y las contras del patrón Singleton.
