Trabaja con datos mediante SQL con Javascript

Me han pasado una librería con la que podemos trabajar con datos en Javascript usando sentencias SQL, aunque los datos hay que recuperarlos de ficheros mediante Ajax y deben estar en un formato específico. La librería no admite inserts aún y los datos no se almacenan en el cliente, sino en el servidor, pero puede ser una interesante alternativa hasta que las bases de datos de HTML5 estén plenamente disponibles en todos los navegadores.

var sql="select NombreCompania, NombreContacto, CargoContacto from clientes order by 3, 2 desc" ;
var res=myJSSQL.Query(sql);

Dispone de una librería PHP que convierte una BD de MySQL o Postgres en el formato específico de la librería javascript.

JavascriptSQL

Boomerang: medición de rendimiento desde la perspectiva del usuario

Boomerang es una librería desarrollada por Yahoo que permite medir diferentes aspectos de rendimiento de nuestra web desde la perspectiva del usuario final. Añadiendo un script y distintas funciones, podemos comprobar diversos aspectos de nuestra web como:

  • El tiempo que el usuario cree que tarda en cargarse la web
  • El tiempo de carga de contenido dinámico
  • El ancho de banda durante la carga de la página
  • Tiempo de carga de diferentes módulos, por ejemplo módulos de Twitter o Facebook
  • Latencia HTTP
  • Latencia DNS
BOOMR.init({
  user_ip: "",
  beacon_url: "http://yoursite.com/path/to/beacon.php",
  BW: {
    base_url: 'http://yoursite.com/path/to/bandwidth/images/"
  }
});

Además permite etiquetar páginas para realizar distintos tests y poder compararlos, realizar tests a usuarios aleatorios y evitar abusos de uso

Boomerang

Vía / WebAppers

Manejar y generar excepciones en Javascript

Los que hemos trabajado con Java estamos acostumbrados a tratar y lanzar excepciones para controlar los errores, algo que en Javascript no es muy común, pero en librerías algo elaboradas podría ser muy útil.

// Clases de errores
function DivisionByZeroError() {
    this.name = "DivisionByZeroError";
}
function DivisionByStringError() {
    this.name = "DivisionByStringError";
}
// Funcion que devuelve un error
function divisionCanFail(a, b) {
    if (b == 0) {
        throw new DivisionByZeroError();
    }
    if (typeof b == "string") {
        throw new DivisionByStringError();
    }
    return a / b;
}
// Funcion de test
function decoratedDivision(a, b) {
    try {
        alert(divisionCanFail(a, b));
    } catch (error if (error.name == "DivisionByZeroError")) {
        alert("A division by zero...");
        alert("Exception class: " + error.name);
    } catch (error if (error.name == "DivisionByStringError")) {
        alert("Exception class: " + error.name);
    }
}

decoratedDivision(5, "isThisANumber?!");
decoratedDivision(5, 0);

Exceptional JavaScript

Guía de estilos de Javascript de Google

Google tiene una guía de estilos para programar en Javascript. Yo no soy muy partidario de ello, ya que cada cual programe como quiera siempre que sea código legible, es decir, ¿por qué usar variables con nombres así: nombreVariable y no así: nombre_variable?. Está claro que en un proyecto o una empresa sí tiene sentido usar guías de estilo, pero que una guía de estilo sea generalizada, no le veo sentido.

De todas formas los consejos están bastante bien y ante la duda de cómo hacerlo, podemos echarle un vistazo a cómo lo hacen en Google. Claro, que luego lo ofuscan y no hay quién entienda sus librerías.

Google JavaScript Style Guide

Vía / DZone

DLayer: script jQuery que nos ayuda a maquetar diseños

Cuando nos pasan un diseño en PNG o PSD y tenemos que transformarlo a CSS y XHTML, una de las partes más tediosas es comprobar que el HTML se ajusta al diseño. Por ello, he creado un script rápido (y un tanto chapuzas) que permite añadir una imagen en el documento HTML y modificar su top y left así como el opacity para poder comprobar si vamos por buen camino.

La imagen la podemos indicar mediante una URL o haciendo drag&drop del fichero (PNG, GIF o JPEG). El D&D sólo funciona en Firefox y sinceramente, el resto del script solo lo he probado en Firefox. Luego solo nos falta cambiar el opacity, el top o el left y hacer pruebas.

Para instalarlo solo hay que añadir el script y añadir jquery si no está ya incluido.

Espero que os sea útil

jquery-dlayer

Generar documentos MS Word con phpdocx

Me avisan los creadores de esta librería para la generación de ficheros docx de Microsoft, la cual dispone de una versión gratuita que ofrece bastantes características e incluso las más necesarias:

  • Formato de textos
  • Formato de párrafos
  • Enlaces externos
  • Cabeceras y pies de página
  • Imágenes
  • Listas
  • Tablas
  • Imágenes
require_once('../classes/cCreateDocx.inc');
$objDocx = new cCreateDocx();
$arrParamsText = array( 'b' => 'single', 'jc' => 'center’); //b for bold and jc for alignment
$objDocx->fAddText('Hello World.', $arrParamsText);
$objDocx->fCreateDocx('hello_world.docx');

PHPDOCX

HTML5 websockets con PHP

Ya hace tiempo hable lo de los websockets con HTML, los cuales solo se pueden usar en Safari, Chrome y la beta de Firefox 4, pero además el servidor necesita que los soporte. Para poder usarlos en nuestras aplicaciones PHP se puede hacer un apaño con la siguiente librería:

log("Handshaking...");
list($resource,$host,$origin) = getheaders($buffer);
$upgrade = "HTTP/1.1 101 Web Socket Protocol Handshake\r\n" .
           "Upgrade: WebSocket\r\n" .
           "Connection: Upgrade\r\n" .
           "WebSocket-Origin: " . $origin . "\r\n" .
           "WebSocket-Location: ws://" . $host . $resource . "\r\n" .
           "\r\n";
$handshake = true;
socket_write($socket,$upgrade.chr(0),strlen($upgrade.chr(0)));

phpwebsockets

Vía / bo! hu? co.

Filtra y recupera de forma segura $_GET y $_POST en PHP

Hace tiempo comentaba cómo filtrar variables, ahora, usando los mismos filtros, podremos filtrar y realizar sanitize de $_GET y $_POST y asegurarnos de que no nos metan valores peligrosos en las entradas de nuestras aplicaciones.

Para ello haremos uso de filter_input y filter_input_array, pudiendo usar una lista de filtros bastante amplia.

$var = filter_input(INPUT_GET, 'parametro_entrada', FILTER_SANITIZE_STRING);
$var = filter_input(FILTER_GET,'paramentro_sin_filtrar', FILTER_UNSAFE_RAW);
$args = array(
  'product_id'   => FILTER_SANITIZE_ENCODED,
  'component'    => array('filter'    => FILTER_VALIDATE_INT,
    'flags'     => FILTER_REQUIRE_ARRAY, 
    'options'   => array('min_range' => 1, 'max_range' => 10)
    ),
  'versions'     => FILTER_SANITIZE_ENCODED,
  'doesnotexist' => FILTER_VALIDATE_INT,
  'testscalar'   => array(
    'filter' => FILTER_VALIDATE_INT,
    'flags'  => FILTER_REQUIRE_SCALAR,
    ),
  'testarray'    => array(
  'filter' => FILTER_VALIDATE_INT,
  'flags'  => FILTER_REQUIRE_ARRAY,
  )
);
$myinputs = filter_input_array(INPUT_POST, $args);

Never Use $_GET Again

Vía / PHPDeveloper.org

Mostrar la media semanal de lectores de Feedburner con PHP

Parece que Feedburner está dando problemas, y ahora parece que te muestra los usuarios que leyeron tu blog el día anterior, y no el numero de suscritos como se mostraba anteriormente, por lo que a los que no escribimos posts a diarios, el número que muestra Feedburner puede variar muchísimo.

Por ello, puede ser interesante mostrar la media semanal o mensual, como queramos, de los usuarios que nos leen:

function get_average_readers($feed_id,$interval = 7){
	$today = date('Y-m-d', strtotime("now"));
	$ago = date('Y-m-d', strtotime("-".$interval." days"));
	$feed_url="https://feedburner.google.com/api/awareness/1.0/GetFeedData?uri=".$feed_id."&dates=".$ago.",".$today;
	$ch = curl_init();
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
	curl_setopt($ch, CURLOPT_URL, $feed_url);
	$data = curl_exec($ch);
	curl_close($ch);
	$xml = new SimpleXMLElement($data);
	$fb = $xml->feed->entry['circulation'];

	$nb = 0;
	foreach($xml->feed->children() as $circ){
		$nb += $circ['circulation'];
	}

	return round($nb/$interval);
}
$nb = get_average_readers('miusuario');
echo "tengo ".$nb." suscriptores RSS";
// o
$nb = get_average_readers('miusuario', 30);
echo "tengo ".$nb." suscriptores RSS";

How to get a more relevant Feedburner count

Vía / DZone

Conocer a quien le gusta tu post en Google Reader con PHP y CURL

No es difícil ver en blogs los retweets que hace la gente de tus posts y que estos se muestren en los comentarios. ¿Por qué no hacer lo mismo con Google Reader?. En Google Reader, es posible ver a quienes les gustan tus posts (si tienes tu propio blog en el reader), lo cual te puede ayudar a saber si tus posts interesan o no, o encontrar usuarios con gustos parecidos y así seguir sus recomendaciones y poder leer posts interesantes.

Google suele dar complicaciones a la hora de hacer uso de sus webs, pero si usamos su API de ClientLogin lo podemos hacer de forma sencilla.

Primero tendremos que loguearnos en Google, para lo cual tendremos que indicar nuestro usuario y contraseña y los datos posts que tendremos que pasarle:

$usuario = 'micorreo@gmail.com';
$password = 'mipassword';
$postdata = 'service=reader&Email='.urlencode($usuario).'&Passwd='.urlencode($password).'&continue=http://www.google.com/reader/&service=reader';

Luego nos logueamos y obtenemos el valor de Auth para usarlo en el resto de peticiones usandolo en el header de la petición HTTP:

$ch = crl_init($url);
crl_setopt( $ch, CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.0.3705; .NET CLR 1.1.4322; Media Center PC 4.0)');
crl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
crl_setopt ($ch, CURLOPT_COOKIEJAR, './cookie');
crl_setopt ($ch, CURLOPT_COOKIEFILE, './cookie');
crl_setopt ($ch, CURLOPT_POSTFIELDS, $postdata);
crl_setopt ($ch, CURLOPT_POST, 1);
crl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false );
crl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false );

$url = 'https://www.google.com/accounts/ClientLogin';
crl_setopt($ch, CURLOPT_URL, $url);
crl_setopt($ch, CURLOPT_FOLLOWLOCATION, 4);
$res = crl_exec($ch);
preg_match('/Auth=(.*)/', $res, $m);
$auth = $m[1];

Después realizo la búsqueda, para lo cual busco el título del post y le añado el nombre del blog (chapu a la espera de encontrar algo mejor), por ejemplo “Stanford%20Javascript%20Crypto%20Library%20sentidoweb

$url = 'https://www.google.com/reader/api/0/search/items/ids?q=Stanford%20Javascript%20Crypto%20Library%20sentidoweb&output=json';
crl_setopt($ch,CURLOPT_HTTPHEADER,array('Authorization: GoogleLogin auth='.$auth)); 
crl_setopt($ch, CURLOPT_POST, 0);
crl_setopt($ch, CURLOPT_URL, $url);
$res = crl_exec($ch);
$datos = json_decode($res);

De aquí obtengo el ID del post dentro de Google Reader, y con ese ID obtengo los likers y muestro sus fotos:

if (isset($datos->results[0]->id)) {
  $url = 'https://www.google.com/reader/api/0/stream/items/contents?client=scroll';
  crl_setopt($ch, CURLOPT_POST, 1);
  crl_setopt ($ch, CURLOPT_POSTFIELDS, 'i='.$datos->results[0]->id);
  crl_setopt($ch, CURLOPT_URL, $url);
  $res = crl_exec($ch);
  
  $datos = json_decode($res);
  if (isset($datos->items[0]->id)) {
    $id = $datos->items[0]->id;
    $id = end(explode('/', $id));
    $url = 'https://www.google.com/reader/api/0/item/likers?i=tag%3Agoogle.com%2C2005%3Areader%2Fitem%2F'.$id.'&output=json&client=scroll';
    crl_setopt($ch, CURLOPT_POST, 0);
    crl_setopt($ch, CURLOPT_URL, $url);
    $res = crl_exec($ch);
    $data = json_decode($res);
    if (isset($data->friends)) {
      foreach($data->friends as $friend) {
        if (isset($friend->photoUrl)) {
          echo '';
        }
      }
    }
  }
}

De los likers se pueden obtener más datos, y si se hace un var_dump($data->friends) se podrá ver cómo acceder a ellos.

Está claro que un plugin para WordPress estaría bien, pero es algo más complejo si se quiere hacer bien, porque se debería obtener los ids segun URLs, entre otras cosas.