Archive

Author Archive

twitter-node https fix

November 1st, 2011 No comments
nodejs twitter-node

nodejs twitter-node

twitter streaming api

twitter streaming api

Como muchos sabran, hace un tiempo el steaming api de twitter solo funciona con https.

Para nodejs existe el modulo twitter-node, que permitia consumir este streaming, pero dejo de funcionar por el tema del https.

Aca adjunto el index.js de ese modulo (el codigo js que lo hace funcionar) fixeado para que trabajo con https.

Como fix extra, también deje habilitado el debug (propiedad que existía pero no hacia nada).

 

//Fixed by Cesar Casas (lortmorris@gmail.com)
var https         = require('https'),
    query        = require('querystring'),
    Parser       = require('./parser'),
    EventEmitter = require('events').EventEmitter,
    Buffer       = require('buffer').Buffer;

// process.mixin is gone, a function for replacement
function extend(a, b) {
  Object.keys(b).forEach(function (key) {
    a[key] = b[key];
  });
  return a;
}

// Creates a streaming connection with twitter, and pushes any incoming
// statuses to a tweet event.
//
// options - optional Object that specifies custom configuration values.
//
// Valid option keys:
//
// port      - Integer of proxy port
// host      - String or ip address of the proxy server.  Defaults to 'stream.twitter.com'.
// path      - String of the base path for the request.
// action    - String part of the URL that specifies what to query for.
// track     - Array of keywords to filter.  See track()
// following - Array of userIDs to filter.  See follow()
// locations - Array of lat/long tuples.  See location()
// params    - Extra HTTP params Object to send with the request.
// user      - String Twitter login name or email.
// password  - String Twitter password.
//
// Returns TwitterNode instance.
var TwitterNode = exports.TwitterNode = function(options) {
  EventEmitter.call(this);
  if(!options) options = {};
  var self           = this;
  this.port          = options.port      || 80;
  this.host          = options.host      || 'stream.twitter.com';
  this.path          = options.path      || '/1/statuses/';
  this.action        = options.action    || 'filter';
  this.trackKeywords = options.track     || [];
  this.following     = options.follow    || [];
  this.locations     = options.locations || [];
  this.params        = options.params    || {};
  this.user          = options.user;
  this.password      = options.password;
  this.headers       = { "User-Agent": 'Twitter-Node' };
  this.debug         = options.debug || false;
  this.parser        = new Parser();
  this.parser.addListener('object', processJSONObject(this));
  this.parser.addListener('error', function (error) {
    self.emit('error', new Error('TwitterNode parser error: ' + error.message));
  });
  if (options.headers) {
    extend(this.headers, options.headers);
  }
}

TwitterNode.prototype = Object.create(EventEmitter.prototype);

// Track the following keyword.  If called multiple times, all words are sent
// as a comma-separated parameter to Twitter.
//
// See: http://apiwiki.twitter.com/Streaming-API-Documentation#track
//
// word - String word to track.
//
// Returns nothing.
TwitterNode.prototype.track = function track(word) {
  this.trackKeywords.push(word);
  return this;
};

// Follow the given twitter user (specified by their userID, not screen name)
// If called multiple times, all userIDs are sent as a comma-separated
// parameter to Twitter.
//
// See: http://apiwiki.twitter.com/Streaming-API-Documentation#follow
//
// userID - Integer userID to track.
//
// Returns nothing.
TwitterNode.prototype.follow = function follow(userId) {
  this.following.push(userId);
  return this;
};

// Match tweets in the given bounding box.
//
// See: http://apiwiki.twitter.com/Streaming-API-Documentation#locations
//
// Example: location(-122.75, 36.8, -121.75, 37.8) // SF
//
// lng1, lat1 - southwest corner of the bounding box.
// lng2, lat2 - northeast corner.
//
// Returns nothing.
TwitterNode.prototype.location = function location(lng1, lat1, lng2, lat2) {
  this.locations.push(lng1, lat1, lng2, lat2)
  return this;
};

TwitterNode.prototype.stream = function stream() {
  if (this._clientResponse && this._clientResponse.connection) {
    this._clientResponse.socket.end();
  }

  if (this.action === 'filter' && this.buildParams() === '') return;

	var headers = extend({}, this.headers),
      twit    = this,
      request;

  headers['Host'] = this.host;

  if (this.user) {
    headers['Authorization'] = basicAuth(this.user, this.password);
  }

var options = {
  host: this.host,
  port: this.port,
  path: this.requestUrl(),
  method: 'GET',
  headers : headers
};

if(this.debug) console.log(options);

var req = https.request(options, function(res) {

if(this.debug)  console.log("statusCode: ", res.statusCode);
if(this.debug)  console.log("headers: ", res.headers);

  res.on('data', function(d) {
    twit._receive(d);
    if(this.debug) process.stdout.write(d);
  });

  res.on('response', function(d) {
	    twit._clientResponse = d;
	    if(this.debug) process.stdout.write(d);
	  });

  res.on('end', function() {
      twit.emit('end', this);
      twit.emit('close', this);
    });

});

req.end();

req.on('error', function(e) {
  console.error(e);
});

  return this;
};

// UTILITY METHODS

// Passes the received data to the streaming JSON parser.
//
// chunk - String data received from the HTTP stream.
//
// Returns nothing.
TwitterNode.prototype._receive = function(chunk) {
  this.parser.receive(chunk);
  return this;
};

// Builds the URL for the streaming request.
//
// Returns a String absolute URL.
TwitterNode.prototype.requestUrl = function() {
  var url =  this.path + this.action + ".json" + this.buildParams();
	console.log('make url: ', url);

	return url;
};

// Builds the GET params for the streaming request.
//
// Returns URI encoded string: "?track=LOST"
TwitterNode.prototype.buildParams = function() {
  var options = {};
  extend(options, this.params);
  if (this.trackKeywords.length > 0) options.track = this.trackKeywords.join(",");
  if (this.following.length > 0)     options.follow = this.following.join(",");
  if (this.locations.length > 0)     options.locations = this.locations.join(",");
  if (options.track || options.follow || options.locations) {
    return "?" + query.stringify(options);
  }
  return "";
};

// Base64 encodes the given username and password.
//
// user - String Twitter screen name or email.
// pass - String password.
//
// Returns a Basic Auth header fit for HTTP.
var basicAuth = function basicAuth(user, pass) {
  return "Basic " + new Buffer(user + ":" + pass).toString('base64');
};

// Creates a callback for the object Event of the JSON Parser.
//
// twit - an instance of this TwitterNode.
//
// Returns a function to be passed to the addListener call on the parser.
var processJSONObject = function processJSONObject(twit) {
  return function(tweet) {
    if (tweet.limit) {
      twit.emit('limit', tweet.limit);
    } else if (tweet['delete']) {
      twit.emit('delete', tweet['delete']);
    } else {
      twit.emit('tweet', tweet);
    }
  };
};

Actulizar android en tablets chinas (apad, wondermedia, eken, etc).

October 11th, 2011 No comments

Actualizar android en tablets chinas, un lindo desafío

 

Actualmente es facil encontrar tablets chinas de poca capacidad, pero a precios muy economicos.

Un gran ejemplo son las tablets WonderMedia, que por 100 dolares intentan resolver todo a base de hardware muy… limitado.

Normalmente suelen tener micros entre 400 y 1G, memoria de 256 o 512, webcam de 0,3 o 1M, pantallas de 7,8 y 10.1′, y la parte mas divertida, un android viejo y choto para poder funcionar en esas configuraciones de hardware tan malas.

Por suerte el precio lo compensa todo, van desde los 500 pesos argentinos (unos 120 dolares) hasta unos 2.000 pesos argentinos (unos 470 dolares).

Compre una de 750 pesos para mi hijo, una wondermedia de 256 de ram, micro de 800, y un horrible android 2.2 sacado de una pelicula de miedo.

Obviamente, lo primero que queria era cambiar ese android que ni market traia, así que comence a investigar como hacia tiempo no lo hacia.

Buscando y buscando, encontre un gran sitio web, http://techknow.freeforums.org/tablets-f7.html , el templo de las tablets podriamos decir.

Les dejo unos tips básicos.

 

Como se actualiza android en una tablet?

El proceso es medianamente facil gracias a un package que esta disponible en techknow.freeforums.org.

Hay que ejecutar una aplicacion (disponible para windows y linux), quemar una imagen en la microsd externa de la tablet (no traen por defecto, asi que busquemos una), insertar la microsd, prender la tablet y automaticamente reconoce que hay un SO a instalar.

Basicamente lo que vamos a instalar es un android 100% compilado y optimizado para la tablet puntual que tengamos, por eso al ejecutar el instalador de la imagen en la microsd, tenemos que seleccionar correctamente que version queremos.

 

Algunos tips son:

  • Formatear la microSD
  • Obviamente insertemos la microsd cuando la tablet esta apagada
  • El proceso suele durar unos 10 minutos, asi que no desesperar
  • Cuando reiniciamos por primera vez, veremos el logo de android, despues un loading con la leyenda “oberoid” y si todo sale bien finalmente el desktop de android. Si pasan mas de 5 minutos y sigue en “loading” es que no funciono.
  • Normlamente, no funciona porque hemos seleccionado mal la distro a instalar. Las versiones de android vienen compiladas y optimizadas para cada marca/modelo/color de led , asi que tenemos que elegir la correcta.
  • Si todo funciono, pero no funciona el touch o la resolucion no esta bien es que hemos elegido mal la opcion de distro.

Como saber que tablet tengo?

Normalmente estas tablets “chinas” no tienen ni marca ni modelo, ya que son ensambladas por empresas que pocos tienen que ver con los fabricantes, pero existe una forma de saber “que tablet tenemos”.

Las caracteristicas son:

  • Size de pantalla (7,8, 10, 10.1 pulgadas)
  • Color del led de encendido (Verde o azul)
  • Color de la webcam
  • Color del jack de audio
Les dejo una tabla con características y posibles modelos.
Como saber que tablet tengo

Como saber que tablet tengo

Tabien les adjunto una version del software que a mi personalmente me funciono para una eken con micro wm8650.

Descargar WM8650 Universal Uberoid v9.1

El arte de la intrusion – Kevin Mitnick

August 9th, 2011 2 comments
El arte de la intrusion

El arte de la intrusion

El Arte de la Intrusion es uno de los dos libros publicados hasta el momento por Kevin Mitnick.

Para los que no sepan quien es Kevin Mitnick, les dare una breve introducción.

Kevin Mitnick es un hacker famoso de USA, quizas le mas famoso y respetado de todo el mundo.

A los 16 arranco su carrera delictiva como hacker, experto en redes, con conocimiento en electrónica, genio de la telefonía, Kevin eran tan peligroso que fue restringido de poder usar un teléfono o computadora.

Estuvo en prisión varias veces, fue acusado de robos millonarios en concepto de información (tanto por robar con su computadora como en persona), y se le conocen muchos “trucos” que han dejado pasmado a mas de un gran “hacker”.

El libro básicamente trata sobre relatos de hackers en todo el mundo, sobre todo el proceso de hacking a un dispositivo/sistema, cuales fueron los problemas encontrados, como los lograron resolver, como se llevo el hacking, cuales fueron las consecuencias, etc.

En teoria el mismo Kevin fue el que entrevisto a los que aportaron las historias, haciendo el mismo las pregunas tecnicas, y chequeando una y otra vez todos los puntos de la historia para saber si son verdaderas.

Les recomiendo leer el libro a cualquier persona, no es necesario ser un experto programador para entenderlo, solo hay que tomarse el tiempo de ser cuidadoso con las palabras que no sepamos y buscarlas en google.

Sin dudas, es una gran oportunidad, se lee medianamente facil, y esta muy recomendado por la comunidad.

Por cierto, esta en castellano.

El arte de la intrusion (Descargar)

PD: Kevin, estoy divulgando la palabra, no haciendo piratería.

 

Escalar imagen en forma inteligente con gimp

July 4th, 2011 3 comments
gimp - editor de imagenes portable

gimp - editor de imagenes portable

Muchos programadores nos vemos en la necesidad de maquetar mas de una vez, es por ello que voy a intentar de dar soluciones a problemas simples que me fueron surgiendo en materia de maquetado, cortar imagenes, etc.

Todo lo resuelvo con gimp, tanto si estoy en linux como en windows, ya que me estoy familiarizando con gimp y al ser portable me parece mas sano que aprender a usar photoshop.

Una de las tareas mas comunes es la necesidad de escalar una imagen, por ejemplo, un background de una botonera o algo parecido.

El tema de escalar es que no queda bien si mantenemos las propociones, y si no las mantenemos se nos rompe todo.

Para esta tarea, gimp cuenta con un plugin que es simplemente fantastico, se llama Liquid Rescale, y pueden bajarlo desde aca.\

Tenemos versiones para Linux, Windows y Mac.

Para usarlo, simplemente vamos a Layer (en ingles, en spanish es “capa”), y hacemos click en Liquid Rescale.

Se nos abre una ventana parecida a esta

Liquid Rescale - Escalar imagenes en gimp

Liquid Rescale - Escalar imagenes en gimp

Tenemos varias opciones, pero las de la izquierda son las que casi siempre usaremos.

 

Consejos de timezone by Demian Rodriguez

June 2nd, 2011 2 comments

time zone, el gran problema de la programacion. Consejos y trucos

Timezone, consejos y trucos para php, mysql y nodejs

Demian Rodriguez nos da unos consejos para minimizar estos problemas.

1) Establecer como timezone default “UTC” tanto en el server como en la base de datos.
Ej en Debian:

#dpkg-reconfigure tzdata
#restart mysql

2) Para el caso de MySQL, las columnas de tipo DATE, DATETIME o TIME no almacenan info sobre el timezone, uno es responsable de saber en que formato esta la fecha para despues mostrarla correctamente al usuario. Para esto es recomendable guardar todas las fechas en UTC.

3) Al mostrar una fecha al usuario se debe convertir al timezone adecuado. Como?

PHP:

// mostrar
$fechaDeMysql = "2011-06-01 08:30:20";
$date = new DateTime($fechaDeMysql, new DateTimeZone("UTC"));
$date->setTimeZone(date_default_timezone_get());
$date->format(...);

// guardar
$fechaQueVieneDeNoseDonde = 'Mon, 15 Aug 2005 15:52:01 +0300'; // ya tiene timezone
$date = new DateTime($fechaQueVieneDeNoseDonde);
$date->setTimeZone(new DateTimeZone("UTC"));
// guardarla en mysql...

NodeJS:
Si aca no mostramos nada al usuario es re facil, no hay que hacer nada :)
El proceso usa el tz del SO. Pero tambien lo podemos forzar seteando la variable de entorno al principio del script:

process.env.TZ = 'UTC';

Como obtener una fecha de la db y mostrarla al usuario en el TZ correcto? No se, es una incógnita como sabe JS en que TZ está la fecha que saque de la db. Lo pregunté aca: https://github.com/felixge/node-mysql/pull/55

// guardar
/**
 * metodo re copado para formatear fechas :)
 * return formatted date as yyyy-mm-dd H:i:s using UTC
 */
Date.prototype.formatUTC = function() {
	function pad(n) {
		return n < 10 ? '0' + n : n
	}
	var d = this;
	return d.getUTCFullYear()+'-'
	  + pad(d.getUTCMonth()+1)+'-'
	  + pad(d.getUTCDate())+' '
	  + pad(d.getUTCHours())+':'
	  + pad(d.getUTCMinutes())+':'
	  + pad(d.getUTCSeconds());
};

var fechaParaInsertar = new Date('Mon, 15 Aug 2005 15:52:01 +0300').formatUTC();

Youtube acata ordenes de los gobiernos para censurar videos con protestas populares

May 20th, 2011 No comments
youtube censura a pedido de los gobiernos

youtube censura a pedido de los gobiernos

Simpre pensamos que youtube bloquea todos aquellos videos con contenido sexual, terrorista o cualquier cosa que infrinja sus terminos y condiciones (entre la mas importante de las razones esta el derecho de autor). Pues bien, no solo son esas las razones aparentemente, sino que ahora le esta “dando caso” a los gobiernos que presionan para que, por ejemplo, no se puedan ver videos con protestas sociales masivas (normalmente se usan para hacer campanias virales).

Es dificil creer que en un mundo virtual, donde todo es libre, donde el universo creado es practicamente infinito…. exista la sensura (en especial en un servicio masivo, donde todos colaboran y comparten).

No es noticia que las grandes empresas invierten millones de dolares en herramientas que les permitan bloquear contenido, detectarlo lo antes posible y sobre todo, empaquetar esas dos acciones y venderlas extraoficialmente como servicios.

La censura en todos sus aspecto es algo que no deberia existir, es un instrumento de un aparato que intenta simplemente decirnos como pensar y actuar,  ejemplo de ello es el gobierno de gan Bretana, que pidio a youtube eliminar los terminos de busqueda y censurar los videos de la ultima protesta popular en contra del recorte de presupuesto.

Podriamos ser mas fatalistas y pensar que mientras grandes empresas tengan el control total de nuestra informacion (google y facebook mas que nada) no podremos evitar la venta de informacion, la censura, etc. pero no creo que el total de la responsabilidad sea de la corporaciones, como usuario de internet tenemos un cierto grado de responsabilidad en todo el asunto.

Protesta contra el papa

Protesta contra el papa

 

Ant Video Downloader envia informacion de navegacion a su autor

May 20th, 2011 No comments
ant video downloader espia nuestra informacion de navegacion

ant video downloader espia nuestra informacion de navegacion

Simon Newton, un programador, ha descubierto que la extension Ant Video Download recolecta informacion de las paginas visitadas y las envie a su autor.

Se pude detectar como dicha extension hacia request hacia el dominio rcp.ant.com.Podemos pensar que la empresa Ant esta “robando” informacion sin permiso a fines de lograr estadisticas (que como todos sabemos son muy valiosas en el mercado), o quizas estan llendo mas lejos aun.Ant es una empresa que posee como principal producto un buscador web, asi que no nos extrania que este robando informacion de navegacion para poder ofrecer una mejor calidad de resultados (y ser mas competitiva en el mercado de los buscadores).
Sea cual sea el fin, esta claro que el mundo de las extensiones se esta volviendo tan amplio que es dificil saber en quien confiar y en quien no, como asi tambien es hora de demandar un poco mas de control en addons.mozilla.org.
En teoria la extension ya no esta disponible, sin embargo al hacer la busqueda hace unos minutos la he encontrado en su mas reciente version lista para instalar.
Hay que tener mas cuidado que las extensiones que se instalan!.

Javascript bible gold edition download pdf free

May 15th, 2011 2 comments
biblia de javascript download

Descargar La biblia de JavaScript en formato PDF

La biblia de JavaScript Gold Edition para bajar en PDF.

Este libro pasado a PDF es sin duda una de las mas importantes referencias de javascript.

A toda aquella persona que quiera perfeccionarse en javascript o quiera aprender de cero el lenguaje que dominara la tecnologia en los proximos anios, les recomiendo intentar darle una lectura al libro.

En el libro se cubren basicamente la totalidad de los aspectos mas importante del lenguaje JavaScript, desde los conceptos mas simples (incluso conceptos basicos de programacion) hasta lo mas avanzado, dejando al lector un conocimiento realmente importante, con el cual se sentira libre de desarrollar cualquier aplicacion, tanto web como desktop.

Recomiendo tambien la lectura no solo para los que desean aprender javascript para el lado del cliente, sino tambien para aquellos que inician en la novedosa y poderosa tecnologia NodeJS.

biblia de javascript gold edition download

Galeria de iconos para aplicaciones desktop y aplicaciones web

May 15th, 2011 No comments

Aca presentamos una galeria de iconos ideales para aplicaciones webs o desktops.

Dejo un descargable con todo comprimido, tanto en 16×16 como 32×32

Para bajar la coleccion de iconos para aplicaciones en 16×16, hacer click aca

Para bajar la coleccion de iconos para aplicaciones en 32×32, hacer click aca

Aca dejo algunas muestras de los iconos que hay en el pack, eso si, solo solo algunos nomas.

 

Qbasic en javascript

May 13th, 2011 1 comment
qbasic javascript codigo en basic

qbasic javascript codigo en basic

Sin dudas algunas JavaScript es el lenguaje mas flexible del cual disponemos hoy en dia.

Su capacidad de estar presente tanto del lado del Cliente (mas que nada por frameworks como mootools, jquery, etc) y actualmente del lado del servidor (enter ellos el incomparable NodeJS) lo convierte en una opcion de potencial practicamente infinito, y hoy presentaremos algo que demuestra lo que decimos.

Navegando en internet en busqueda de nuevas tendencias o novedades de JavaScript me he topado con algo que realmente me parecio brillante, y es nada mas y nada menos que un interprete (con editor y todo) de QBasic.

Para los que no sepan (mas que nada los jovenes) QBasic era un lenguaje de progamacion bastante usado para aprender a hacer los primeros sistemitas, usado para juegos y poco para tareas administrativas, QBasic fue sin duda en la primer pasion de los que hoy son denominados “Sr. en programacion o Ninjas”.

Bien, entendamos que necesitamos (en forma muy grosera obvio) para tener un lenguaje de programacion (mas que nada si tiene editor).

Primero que nada, el editor en si, es decir, una “gui” o “pantalla” donde podamos escribir nuestro codigo, que nos advierta de alguna mala sintaxis, o que nos sugiera correciones.

Por otro lado, necesitamos un “compilador” que no presisamente pase nuestro codigo fuente a codigo maquina, puede simplemente hacer un paso intermedio, como por ejemplo generar bytecode, es decir, un grupo de instrucciones que seran interpretados por una maquina virtual.

Si hablamos de una maquina virtual, necesitamos “algo” que interprete los bytecodes y en base a los mismos “haga algo”.

Bueno, lo que hoy les traigo son todos esos pasos, desde el editor hasta la maquina virtual, 100% escrito en JavaScript.

El unico requisito para que todo esto funcione correctamente es contar con un navegador que soporte Canvas… y obviamente se recomienda chrome o firefox.

qbasic javascript bytecode editor

qbasic javascript bytecode editor

Para verlo funcionando hacer click aca

qbasic javascript demo game

qbasic javascript demo game

Aca les dejo los archivos JS para que vean de que se trata por separado.

CodeGenerator

console

GlrParser

qbasic

RuleParser

RuleSet

Tokenizer

TypeChecker

types

virtualmachine

 

Tambien para que todo funcione, necesitan una imagen de mapa de caracteres y les paso el ejemplo (archivo.bas).

test.bas

charmap qbasic javascript

charmap qbasic javascript