<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Web and Beer</title>
	<atom:link href="http://webandbeer.com.ar/feed/" rel="self" type="application/rss+xml" />
	<link>http://webandbeer.com.ar</link>
	<description>Unidos por la web y la cerveza!</description>
	<lastBuildDate>Tue, 01 Nov 2011 20:41:05 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>twitter-node https fix</title>
		<link>http://webandbeer.com.ar/2011/11/twitter-node-https-fix/</link>
		<comments>http://webandbeer.com.ar/2011/11/twitter-node-https-fix/#comments</comments>
		<pubDate>Tue, 01 Nov 2011 20:38:43 +0000</pubDate>
		<dc:creator>Cesar Casas</dc:creator>
				<category><![CDATA[javascript]]></category>
		<category><![CDATA[NodeJS]]></category>
		<category><![CDATA[programacion]]></category>
		<category><![CDATA[api]]></category>
		<category><![CDATA[fix]]></category>
		<category><![CDATA[http]]></category>
		<category><![CDATA[https]]></category>
		<category><![CDATA[node.js]]></category>
		<category><![CDATA[nodejs]]></category>
		<category><![CDATA[streaming]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://webandbeer.com.ar/?p=1010</guid>
		<description><![CDATA[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. [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_1012" class="wp-caption alignleft" style="width: 210px"><a href="http://webandbeer.com.ar/wp-content/uploads/2011/11/nodejs.jpg" rel="lightbox[1010]"><img class="size-full wp-image-1012" title="nodejs twitter-node" src="http://webandbeer.com.ar/wp-content/uploads/2011/11/nodejs.jpg" alt="nodejs twitter-node" width="200" height="200" /></a><p class="wp-caption-text">nodejs twitter-node</p></div>
<div id="attachment_1013" class="wp-caption alignleft" style="width: 310px"><a href="http://webandbeer.com.ar/wp-content/uploads/2011/11/twitter-logo.jpg" rel="lightbox[1010]"><img class="size-medium wp-image-1013" title="twitter streaming api" src="http://webandbeer.com.ar/wp-content/uploads/2011/11/twitter-logo-300x200.jpg" alt="twitter streaming api" width="300" height="200" /></a><p class="wp-caption-text">twitter streaming api</p></div>
<p class="clear:both">
<p>Como muchos sabran, hace un tiempo el steaming api de twitter solo funciona con https.</p>
<p>Para nodejs existe el modulo twitter-node, que permitia consumir este streaming, pero dejo de funcionar por el tema del https.</p>
<p>Aca adjunto el index.js de ese modulo (el codigo js que lo hace funcionar) fixeado para que trabajo con https.</p>
<p>Como fix extra, también deje habilitado el debug (propiedad que existía pero no hacia nada).</p>
<p>&nbsp;</p>
<pre class="brush:javascript">//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 &amp;&amp; this._clientResponse.connection) {
    this._clientResponse.socket.end();
  }

  if (this.action === 'filter' &amp;&amp; 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 &gt; 0) options.track = this.trackKeywords.join(",");
  if (this.following.length &gt; 0)     options.follow = this.following.join(",");
  if (this.locations.length &gt; 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);
    }
  };
};</pre>
]]></content:encoded>
			<wfw:commentRss>http://webandbeer.com.ar/2011/11/twitter-node-https-fix/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Actulizar android en tablets chinas (apad, wondermedia, eken, etc).</title>
		<link>http://webandbeer.com.ar/2011/10/actulizar-android-en-tablets-chinas-apad-wondermedia-eken-etc/</link>
		<comments>http://webandbeer.com.ar/2011/10/actulizar-android-en-tablets-chinas-apad-wondermedia-eken-etc/#comments</comments>
		<pubDate>Wed, 12 Oct 2011 04:30:26 +0000</pubDate>
		<dc:creator>Cesar Casas</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Descargas]]></category>
		<category><![CDATA[recursos on-line]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[china]]></category>
		<category><![CDATA[eken]]></category>
		<category><![CDATA[kernel]]></category>
		<category><![CDATA[tablets]]></category>
		<category><![CDATA[uberoid]]></category>
		<category><![CDATA[update]]></category>
		<category><![CDATA[wondermedia]]></category>

		<guid isPermaLink="false">http://webandbeer.com.ar/?p=1001</guid>
		<description><![CDATA[Actualizar android en tablets chinas, un lindo desafío &#160; 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&#8230; limitado. Normalmente suelen tener micros entre 400 y 1G, memoria de 256 o 512, [...]]]></description>
			<content:encoded><![CDATA[<h1>
<a href='http://webandbeer.com.ar/2011/10/actulizar-android-en-tablets-chinas-apad-wondermedia-eken-etc/dftbbg/' title='Como saber que tablet tengo'><img width="150" height="150" src="http://webandbeer.com.ar/wp-content/uploads/2011/10/dftbbg-150x150.jpg" class="attachment-thumbnail" alt="Como saber que tablet tengo" title="Como saber que tablet tengo" /></a>
<a href='http://webandbeer.com.ar/2011/10/actulizar-android-en-tablets-chinas-apad-wondermedia-eken-etc/eken-m001/' title='eken m001'><img width="150" height="150" src="http://webandbeer.com.ar/wp-content/uploads/2011/10/eken-m001-150x150.jpg" class="attachment-thumbnail" alt="eken m001" title="eken m001" /></a>
<a href='http://webandbeer.com.ar/2011/10/actulizar-android-en-tablets-chinas-apad-wondermedia-eken-etc/eken-tablet-2/' title='eken tablet 2'><img width="150" height="150" src="http://webandbeer.com.ar/wp-content/uploads/2011/10/eken-tablet-2-150x150.jpg" class="attachment-thumbnail" alt="eken tablet 2" title="eken tablet 2" /></a>
<a href='http://webandbeer.com.ar/2011/10/actulizar-android-en-tablets-chinas-apad-wondermedia-eken-etc/eken-tablet/' title='eken tablet'><img width="150" height="150" src="http://webandbeer.com.ar/wp-content/uploads/2011/10/eken-tablet-150x150.jpg" class="attachment-thumbnail" alt="eken tablet" title="eken tablet" /></a>
</p>
<p>Actualizar android en tablets chinas, un lindo desafío</h1>
<p>&nbsp;</p>
<p>Actualmente es facil encontrar tablets chinas de poca capacidad, pero a precios muy economicos.</p>
<p>Un gran ejemplo son las tablets WonderMedia, que por 100 dolares intentan resolver todo a base de hardware muy&#8230; limitado.</p>
<p>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&#8242;, y la parte mas divertida, un android viejo y choto para poder funcionar en esas configuraciones de hardware tan malas.</p>
<p>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).</p>
<p>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.</p>
<p>Obviamente, lo primero que queria era cambiar ese android que ni market traia, así que comence a investigar como hacia tiempo no lo hacia.</p>
<p>Buscando y buscando, encontre un gran sitio web, <a href="http://techknow.freeforums.org/tablets-f7.html" target="_blank">http://techknow.freeforums.org/tablets-f7.html</a> , el templo de las tablets podriamos decir.</p>
<p>Les dejo unos tips básicos.</p>
<p>&nbsp;</p>
<p>Como se actualiza android en una tablet?</p>
<p>El proceso es medianamente facil gracias a un package que esta disponible en techknow.freeforums.org.</p>
<p>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.</p>
<p>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.</p>
<p>&nbsp;</p>
<p>Algunos tips son:</p>
<ul>
<li>Formatear la microSD</li>
<li>Obviamente insertemos la microsd cuando la tablet esta apagada</li>
<li>El proceso suele durar unos 10 minutos, asi que no desesperar</li>
<li>Cuando reiniciamos por primera vez, veremos el logo de android, despues un loading con la leyenda &#8220;oberoid&#8221; y si todo sale bien finalmente el desktop de android. Si pasan mas de 5 minutos y sigue en &#8220;loading&#8221; es que no funciono.</li>
<li>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.</li>
<li>Si todo funciono, pero no funciona el touch o la resolucion no esta bien es que hemos elegido mal la opcion de distro.</li>
</ul>
<h1>Como saber que tablet tengo?</h1>
<p>Normalmente estas tablets &#8220;chinas&#8221; 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 &#8220;que tablet tenemos&#8221;.</p>
<p>Las caracteristicas son:</p>
<ul>
<li>Size de pantalla (7,8, 10, 10.1 pulgadas)</li>
<li>Color del led de encendido (Verde o azul)</li>
<li>Color de la webcam</li>
<li>Color del jack de audio</li>
</ul>
<div>Les dejo una tabla con características y posibles modelos.</div>
<div>
<div id="attachment_1002" class="wp-caption aligncenter" style="width: 148px"><a href="http://webandbeer.com.ar/wp-content/uploads/2011/10/dftbbg.jpg" rel="lightbox[1001]"><img class="size-medium wp-image-1002 " title="Como saber que tablet tengo" src="http://webandbeer.com.ar/wp-content/uploads/2011/10/dftbbg-138x300.jpg" alt="Como saber que tablet tengo" width="138" height="300" /></a><p class="wp-caption-text">Como saber que tablet tengo</p></div>
<p>Tabien les adjunto una version del software que a mi personalmente me funciono para una eken con micro wm8650.</p>
<p><a title="WM8650 Universal Uberoid" href="http://webandbeer.com.ar/WM8650_Universal_Uberoid_v9.1.7z" target="_blank">Descargar WM8650 Universal Uberoid v9.1</a></p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://webandbeer.com.ar/2011/10/actulizar-android-en-tablets-chinas-apad-wondermedia-eken-etc/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>El arte de la intrusion &#8211; Kevin Mitnick</title>
		<link>http://webandbeer.com.ar/2011/08/el-arte-de-la-intrusion-kevin-mitnick/</link>
		<comments>http://webandbeer.com.ar/2011/08/el-arte-de-la-intrusion-kevin-mitnick/#comments</comments>
		<pubDate>Wed, 10 Aug 2011 03:22:09 +0000</pubDate>
		<dc:creator>Cesar Casas</dc:creator>
				<category><![CDATA[Descargas]]></category>
		<category><![CDATA[internet]]></category>
		<category><![CDATA[Manuales y libros]]></category>
		<category><![CDATA[para relajarse]]></category>
		<category><![CDATA[Seguridad]]></category>
		<category><![CDATA[casinos]]></category>
		<category><![CDATA[cracking]]></category>
		<category><![CDATA[hackers]]></category>
		<category><![CDATA[hacking]]></category>
		<category><![CDATA[intrusion]]></category>
		<category><![CDATA[kevin mitnick]]></category>
		<category><![CDATA[Redes]]></category>
		<category><![CDATA[robo]]></category>
		<category><![CDATA[seguridad]]></category>

		<guid isPermaLink="false">http://webandbeer.com.ar/?p=990</guid>
		<description><![CDATA[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 [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_991" class="wp-caption alignleft" style="width: 244px"><a href="http://webandbeer.com.ar/wp-content/uploads/2011/08/el-arte-de-la-intrusion.jpg" rel="lightbox[990]"><img class="size-medium wp-image-991" title="El arte de la intrusion" src="http://webandbeer.com.ar/wp-content/uploads/2011/08/el-arte-de-la-intrusion-234x300.jpg" alt="El arte de la intrusion" width="234" height="300" /></a><p class="wp-caption-text">El arte de la intrusion</p></div>
<p><strong>El Arte de la Intrusion</strong> es uno de los dos libros publicados hasta el momento por <strong>Kevin Mitnick</strong>.</p>
<p>Para los que no sepan quien es Kevin Mitnick, les dare una breve introducción.</p>
<p>Kevin Mitnick es un <strong>hacker</strong> famoso de USA, quizas le mas famoso y respetado de todo el mundo.</p>
<p>A los 16 arranco su carrera delictiva como hacker, experto en <strong>redes</strong>, con conocimiento en <strong>electrónica</strong>, genio de la <strong>telefonía</strong>, Kevin eran tan peligroso que fue restringido de poder usar un teléfono o computadora.</p>
<p>Estuvo en prisión varias veces, fue acusado de <strong>robos millonarios</strong> en concepto de información (tanto por robar con su computadora como en persona), y se le conocen muchos &#8220;trucos&#8221; que han dejado pasmado a mas de un gran &#8220;hacker&#8221;.</p>
<p><strong>El libro</strong> 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 <strong>hacking</strong>, cuales fueron las consecuencias, etc.</p>
<p>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 <strong>historia</strong> para saber si son verdaderas.</p>
<p>Les recomiendo leer el libro a cualquier persona, no es necesario ser un <strong>experto programador</strong> para entenderlo, solo hay que tomarse el tiempo de ser cuidadoso con las palabras que no sepamos y buscarlas en google.</p>
<p>Sin dudas, es una gran oportunidad, se lee medianamente facil, y esta muy recomendado por la comunidad.</p>
<p>Por cierto, esta en castellano.</p>
<p><strong><a href="http://webandbeer.com.ar/wp-content/uploads/2011/08/El-arte-de-la-intrusion.pdf">El arte de la intrusion (Descargar)</a></strong></p>

<a href='http://webandbeer.com.ar/2011/08/el-arte-de-la-intrusion-kevin-mitnick/el-arte-de-la-intrusion/' title='El arte de la intrusion'><img width="150" height="150" src="http://webandbeer.com.ar/wp-content/uploads/2011/08/el-arte-de-la-intrusion-150x150.jpg" class="attachment-thumbnail" alt="El arte de la intrusion" title="El arte de la intrusion" /></a>
<a href='http://webandbeer.com.ar/2011/08/el-arte-de-la-intrusion-kevin-mitnick/kevin_mitnick/' title='kevin mitnick'><img width="150" height="150" src="http://webandbeer.com.ar/wp-content/uploads/2011/08/kevin_mitnick-150x150.jpg" class="attachment-thumbnail" alt="kevin mitnick" title="kevin mitnick" /></a>
<a href='http://webandbeer.com.ar/2011/08/el-arte-de-la-intrusion-kevin-mitnick/kevin_wanted/' title='kevin wanted'><img width="150" height="150" src="http://webandbeer.com.ar/wp-content/uploads/2011/08/kevin_wanted-150x150.jpg" class="attachment-thumbnail" alt="kevin wanted" title="kevin wanted" /></a>
<a href='http://webandbeer.com.ar/2011/08/el-arte-de-la-intrusion-kevin-mitnick/kevin-mitnick/' title='kevin mitnick el arte de la intrusion'><img width="150" height="150" src="http://webandbeer.com.ar/wp-content/uploads/2011/08/kevin-mitnick-150x150.jpg" class="attachment-thumbnail" alt="kevin mitnick el arte de la intrusion" title="kevin mitnick el arte de la intrusion" /></a>

<p>PD: Kevin, estoy divulgando la palabra, no haciendo piratería.</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://webandbeer.com.ar/2011/08/el-arte-de-la-intrusion-kevin-mitnick/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Utilidades para el manejo del flujo asincrónico en NodeJS</title>
		<link>http://webandbeer.com.ar/2011/07/utilidades-para-el-manejo-del-flujo-asincronico-en-nodejs/</link>
		<comments>http://webandbeer.com.ar/2011/07/utilidades-para-el-manejo-del-flujo-asincronico-en-nodejs/#comments</comments>
		<pubDate>Wed, 06 Jul 2011 21:37:39 +0000</pubDate>
		<dc:creator>Demián Rodriguez</dc:creator>
				<category><![CDATA[javascript]]></category>
		<category><![CDATA[NodeJS]]></category>
		<category><![CDATA[programacion]]></category>
		<category><![CDATA[async]]></category>
		<category><![CDATA[currying]]></category>
		<category><![CDATA[forEachAsync]]></category>
		<category><![CDATA[future]]></category>
		<category><![CDATA[nodejs]]></category>

		<guid isPermaLink="false">http://webandbeer.com.ar/?p=978</guid>
		<description><![CDATA[Los que programan en NodeJS seguramente habrán notado lo dificil que es seguir el flujo del programa cuando tenemos varias llamadas a funciones que realizan operaciones asincronicas. Los casos mas comunes que se suelen dar son donde tenemos que realizar 2 o mas operaciones asincrónicas en serie o en paralelo y debemos determinar cuando se [...]]]></description>
			<content:encoded><![CDATA[<div>
<div id="attachment_374" class="wp-caption alignleft" style="width: 142px"><a href="http://webandbeer.com.ar/wp-content/uploads/2011/03/nodejs.jpg" rel="lightbox[978]"><img class="size-full wp-image-374" title="nodejs" src="http://webandbeer.com.ar/wp-content/uploads/2011/03/nodejs.jpg" alt="nodejs" width="132" height="68" /></a><p class="wp-caption-text">nodejs</p></div>
<p>Los que programan en <strong>NodeJS</strong> seguramente habrán notado lo dificil que es seguir el flujo del programa cuando tenemos varias llamadas a funciones que realizan operaciones asincronicas.<br />
Los casos mas comunes que se suelen dar son donde tenemos que realizar 2 o mas operaciones asincrónicas en serie o en paralelo y debemos determinar cuando se han finalizado de procesar.<br />
Para ello hay varias librerías que nos ayudan a escribir código mas legible y ahorrarnos un poco de indentación, pero la verdad es que, en mi opinión, la mayoría son demasiado complejas y tienen demasiados “features” para resolver problemas sencillos.<br />
Basandome en algunas de estas librerías y algunos conceptos que leí por ahí, desarrollé unas utilidades simples.</p>
</div>
<p>1) <strong>forEachAsync</strong>: Permite realizar una operación asincrónica en cada iteración y continuar a la siguiente al finalizarla.</p>
<div>
<p>&nbsp;</p>
<div>
<pre class="brush:javascript">Array.prototype.forEachAsync = function(iterator, then) {
	var self = this;
	var loop = function(i) {
		if (i &lt; self.length) {
			iterator(self[i], function() {
				loop(i+1);
			});
		}
		else {
			then();
		}
	};
	loop(0);
};</pre>
</div>
<p>Ejemplo:</p>
<div>
<pre class="brush:javascript">[1,2,3,4,5].forEachAsync(function(item, next) {
	console.log('item ' + item);
	setTimeout(function() {
		next(); // avanzamos al siguiente item, alias ‘continue’
	}, 500);
}, function() {
	console.log('end');
});</pre>
</div>
<p>2) forEachAsyncParallel: Parecido a la versión anterior pero permite n cantidad de operaciones simultaneas.</p>
<div>
<pre class="brush:javascript">Array.prototype.forEachAsyncParallel = function(iterator, max, then) {
	var self = this;
	var count = 0, index = 0;
	var loop = function() {
		if (index == self.length &amp;&amp; count == 0) then();
		else if (index &lt; self.length) {
			count++;
			iterator(self[index++], function() {
				count--;
				loop();
			});
		}
	};
	if (self.length == 0) then();
	for (var i = 0, len = Math.min(max, self.length); i &lt; len &amp;&amp; index &lt; self.length; i++) loop();
};</pre>
</div>
<p>Ejemplo:</p>
<div>
<pre class="brush:javascript">[1,2,3,4,5].forEachAsyncParallel(function(item, next) {
	console.log('item ' + item);
	setTimeout(function() {
		next();
	}, 500);
}, 2, function() {
	console.log('end');
});</pre>
</div>
<p>3) Futuros / continuaciones<br />
Podemos aplicar el concepto de “currying” y hacer una función que nos ayude a encapsular una operación asincrónica para recuperar el resultado mas adelante.<br />
Este concepto consiste en derivar una funcion de n parámetros en una que solo acepte un parámetro. Si aplicamos esto al callback podemos hacer lo siguiente:</p>
<div>
<pre class="brush:javascript">function searchApi(url, callback) {
	// async op...
}
function readFile(path, callback) {
	// async op...
}

// creamos funciones especializadas
function curriedSearchApi(url) {
	return future(searchApi, arguments, 1);
}
function curriedReadFile(path) {
	return future(readFile, arguments, 1);
}

// iniciamos las operaciones...
var apiSearch = curriedSearchApi('http://google.com?q=lalala');
var fileReader = curriedReadFile('/etc/passwd');

// mas adelante...
apiSearch(function(err, result) {
	fileReader(function(err, result) {
		// terminaron ambas operaciones, hacemos algo con ambos resultados
	});
});</pre>
</div>
<p>Y aquí está la implementación de “future”:</p>
<div>
<pre class="brush:javascript">function future(fn, args, i) {
	var done, err, result;
	var cb = function(e, r) {
		done = true;
		err = e,
		result = r;
	};
	args = Array.prototype.slice.call(args);
	args[i || 1] = function(e, r) {
		cb(e, r);
	};
	fn.apply(this, args);
	return function(_) {
		if (done) _(err, result);
		else cb = _;
	};
}</pre>
</div>
<p>Como se ve, lo que hacemos es llamar a la funcion fn con los argumentos recibidos. i indica el índice que ocupa el callback en el objeto arguments.<br />
Creamos nuestro propio callback que va a almacenar el resultado y retornamos una función cuyo único parámetro es un callback.<br />
Si al momento de llamar esta función ya teníamos el resultado, simplemente lo devolvemos, caso contrario se reemplaza el callback por el nuevo.</p>
<p>Hay varias formas de resolver los casos anteriores, algunas tan sencillas como usar contadores y otras algo rebuscadas pero que en definitiva ayudan a mantener legible el código.<br />
Pueden ver la lista de módulos que ayudan a resolver este tipo de problemas aquí: <a href="https://github.com/joyent/node/wiki/modules#async-flow">https://github.com/joyent/node/wiki/modules#async-flow</a></p>
<p>Espero les haya gustado, hasta la próxima! <img src='http://webandbeer.com.ar/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://webandbeer.com.ar/2011/07/utilidades-para-el-manejo-del-flujo-asincronico-en-nodejs/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Escalar imagen en forma inteligente con gimp</title>
		<link>http://webandbeer.com.ar/2011/07/escalar-imagen-en-forma-inteligente-con-gimp/</link>
		<comments>http://webandbeer.com.ar/2011/07/escalar-imagen-en-forma-inteligente-con-gimp/#comments</comments>
		<pubDate>Mon, 04 Jul 2011 14:10:57 +0000</pubDate>
		<dc:creator>Cesar Casas</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[Desarrollo Web]]></category>
		<category><![CDATA[open source]]></category>
		<category><![CDATA[editor de imagen]]></category>
		<category><![CDATA[escalar]]></category>
		<category><![CDATA[gimp]]></category>
		<category><![CDATA[imagenes]]></category>
		<category><![CDATA[liquid rescale]]></category>
		<category><![CDATA[maquetacion]]></category>
		<category><![CDATA[resize]]></category>

		<guid isPermaLink="false">http://webandbeer.com.ar/?p=970</guid>
		<description><![CDATA[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 [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_974" class="wp-caption alignleft" style="width: 266px"><a href="http://webandbeer.com.ar/wp-content/uploads/2011/07/gimp.png" rel="lightbox[970]"><img class="size-full wp-image-974" title="gimp - editor de imagenes portable" src="http://webandbeer.com.ar/wp-content/uploads/2011/07/gimp.png" alt="gimp - editor de imagenes portable" width="256" height="256" /></a><p class="wp-caption-text">gimp - editor de imagenes portable</p></div>
<p>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.</p>
<p>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.</p>
<p>Una de las tareas mas comunes es la necesidad de escalar una imagen, por ejemplo, un background de una botonera o algo parecido.</p>
<p>El tema de escalar es que no queda bien si mantenemos las propociones, y si no las mantenemos se nos rompe todo.</p>
<p>Para esta tarea, gimp cuenta con un plugin que es simplemente fantastico, se llama Liquid Rescale, y pueden bajarlo desde <a title="Liquid Rescale Gimp Plugin" href="http://liquidrescale.wikidot.com/en:download-page" target="_blank">aca</a>.\</p>
<p>Tenemos versiones para Linux, Windows y Mac.</p>
<p>Para usarlo, simplemente vamos a Layer (en ingles, en spanish es &#8220;capa&#8221;), y hacemos click en Liquid Rescale.</p>
<p>Se nos abre una ventana parecida a esta</p>
<div id="attachment_972" class="wp-caption alignnone" style="width: 310px"><a href="http://webandbeer.com.ar/wp-content/uploads/2011/07/liquid-rescale.jpg" rel="lightbox[970]"><img class="size-medium wp-image-972" title="liquid rescale" src="http://webandbeer.com.ar/wp-content/uploads/2011/07/liquid-rescale-300x204.jpg" alt="Liquid Rescale - Escalar imagenes en gimp" width="300" height="204" /></a><p class="wp-caption-text">Liquid Rescale - Escalar imagenes en gimp</p></div>
<p>Tenemos varias opciones, pero las de la izquierda son las que casi siempre usaremos.</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://webandbeer.com.ar/2011/07/escalar-imagen-en-forma-inteligente-con-gimp/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>LightVC: Un framework mínimo de vistas y controladores para PHP5</title>
		<link>http://webandbeer.com.ar/2011/06/lightvc-un-framework-minimo-de-vistas-y-controladores-para-php5/</link>
		<comments>http://webandbeer.com.ar/2011/06/lightvc-un-framework-minimo-de-vistas-y-controladores-para-php5/#comments</comments>
		<pubDate>Sun, 19 Jun 2011 21:35:19 +0000</pubDate>
		<dc:creator>elbarto</dc:creator>
				<category><![CDATA[frameworks]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[frameworks php]]></category>
		<category><![CDATA[lightvc]]></category>
		<category><![CDATA[php 5]]></category>

		<guid isPermaLink="false">http://webandbeer.com.ar/?p=965</guid>
		<description><![CDATA[En estos días tenía que hacer un sitio web muy básico, estático, y para no repetir líneas y líneas de HTML le iba a meter algo de PHP. Pero no me daba hacer como en los viejos tiempos metiendo includes de header y footer, porque además quería poder manejar URLs un poco más amigables. No [...]]]></description>
			<content:encoded><![CDATA[<p>En estos días tenía que hacer un sitio web muy básico, estático, y para no repetir líneas y líneas de HTML le iba a meter algo de PHP. Pero no me daba hacer como en los viejos tiempos metiendo includes de header y footer, porque además quería poder manejar URLs un poco más amigables. No me iba a poner a reinventar la rueda para este pequeño sitio ni tenía ganas de usar un framework grande que pese 500 veces más que el sitio en sí para darme un montón de funcionalidades que no iba a usar.</p>
<p>Buscando un rato en Google me topé con <a href="http://www.lightvc.org/">LightVC</a>. Es un framework muy básico y livianito que solamente implementa las vistas y los controladores de lo que sería un <a href="http://es.wikipedia.org/wiki/Modelo_Vista_Controlador">patrón MVC</a>. Precisamente está pensado para sitios que, o bien no necesitan interactuar con una DB (como en mi caso) o que quieren integrarse fácilmente con un <a href="http://es.wikipedia.org/wiki/Mapeo_objeto-relacional">ORM</a>.</p>
<p>Usarlo es muy sencillo. Simplemente nos bajamos del <a href="http://www.lightvc.org/downloads/">sitio web</a> el esqueleto de una aplicación que zippeado pesa sólo 24 KB, lo descomprimimos, apuntamos nuestro virtual host a la carpeta webroot de nuestro proyecto y ya tenemos un ejemplo andando.</p>
<p>Luego tenemos dos archivos de configuración: config/application.php con algunas constantes e includes básicos y config/routes.php donde definimos un array para el ruteo de los requests. Les muestro el ejemplo que viene al desargar el framework que es bastante claro:</p>
<pre lang="php"><!--?php // Format of regex =--> parseInfo
$regexRoutes = array(

	// Map nothing to the home page.
	'#^$#' =&gt; array(
		'controller' =&gt; 'page',
		'action' =&gt; 'view',
		'action_params' =&gt; array(
			'page_name' =&gt; 'home',
		),
	),

	// Allow direct access to all pages via a "/page/page_name" URL.
	'#^page/(.*)$#' =&gt; array(
		'controller' =&gt; 'page',
		'action' =&gt; 'view',
		'action_params' =&gt; array(
			'page_name' =&gt; 1,
		),
	),

	// Map controler/action/params
	'#^([^/]+)/([^/]+)/?(.*)$#' =&gt; array(
		'controller' =&gt; 1,
		'action' =&gt; 2,
		'additional_params' =&gt; 3,
	),

	// Map controllers to a default action (not needed if you use the
	// Lvc_Config static setters for default controller name, action
	// name, and action params.)
	'#^([^/]+)/?$#' =&gt; array(
		'controller' =&gt; 1,
		'action' =&gt; 'index',
	),

);
?&gt;</pre>
<p>Luego tenemos una carpeta views y una carpeta controllers donde podremos poner nuestras vistas y controladores respectivamente. El esqueleto de la aplicación ya viene con ejemplos de todo esto, lo cual hace muy sencillo comprender cómo funcionan las cosas y dejar nuestra aplicación funcionando en forma muy rápida.</p>
<p>Así que ya saben, la próxima vez que tengan que hacer un sitio muy básico y quieran utilizar un framework muy sencillo que les ahorre trabajo en algunas tareas básicas, peguenle una mirada a <a href="http://www.lightvc.org/">LightVC</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://webandbeer.com.ar/2011/06/lightvc-un-framework-minimo-de-vistas-y-controladores-para-php5/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Consejos de timezone by Demian Rodriguez</title>
		<link>http://webandbeer.com.ar/2011/06/consejos-de-timezone-by-demian-rodriguez/</link>
		<comments>http://webandbeer.com.ar/2011/06/consejos-de-timezone-by-demian-rodriguez/#comments</comments>
		<pubDate>Thu, 02 Jun 2011 14:35:33 +0000</pubDate>
		<dc:creator>Cesar Casas</dc:creator>
				<category><![CDATA[javascript]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[NodeJS]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[programacion]]></category>
		<category><![CDATA[demian rodriguez]]></category>
		<category><![CDATA[nodejs]]></category>
		<category><![CDATA[time]]></category>
		<category><![CDATA[timezone]]></category>
		<category><![CDATA[zone]]></category>

		<guid isPermaLink="false">http://webandbeer.com.ar/?p=959</guid>
		<description><![CDATA[Demian Rodriguez nos da unos consejos para minimizar estos problemas. 1) Establecer como timezone default &#8220;UTC&#8221; 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 [...]]]></description>
			<content:encoded><![CDATA[<h1>
<div id="attachment_960" class="wp-caption alignleft" style="width: 310px"><a href="http://webandbeer.com.ar/wp-content/uploads/2011/06/timezone-programacion-php-mysql-javascript-nodejs.png" rel="lightbox[959]"><img class="size-medium wp-image-960" title="programacion: timezone" src="http://webandbeer.com.ar/wp-content/uploads/2011/06/timezone-programacion-php-mysql-javascript-nodejs-300x245.png" alt="time zone, el gran problema de la programacion. Consejos y trucos" width="300" height="245" /></a><p class="wp-caption-text">Timezone, consejos y trucos para php, mysql y nodejs</p></div>
<p>Demian Rodriguez nos da unos consejos para minimizar estos problemas.</h1>
<p>1) Establecer como timezone default &#8220;UTC&#8221; tanto en el server como en la base de datos.<br />
Ej en Debian:</p>
<pre>#dpkg-reconfigure tzdata
#restart mysql</pre>
<p>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.</p>
<p>3) Al mostrar una fecha al usuario se debe convertir al timezone adecuado. Como?</p>
<p>PHP:</p>
<pre>// mostrar
$fechaDeMysql = "2011-06-01 08:30:20";
$date = new DateTime($fechaDeMysql, new DateTimeZone("UTC"));
$date-&gt;setTimeZone(date_default_timezone_get());
$date-&gt;format(...);

// guardar
$fechaQueVieneDeNoseDonde = 'Mon, 15 Aug 2005 15:52:01 +0300'; // ya tiene timezone
$date = new DateTime($fechaQueVieneDeNoseDonde);
$date-&gt;setTimeZone(new DateTimeZone("UTC"));
// guardarla en mysql...</pre>
<p>NodeJS:<br />
Si aca no mostramos nada al usuario es re facil, no hay que hacer nada <img src='http://webandbeer.com.ar/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /><br />
El proceso usa el tz del SO. Pero tambien lo podemos forzar seteando la variable de entorno al principio del script:</p>
<pre>process.env.TZ = 'UTC';</pre>
<p>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</p>
<pre>// guardar
/**
 * metodo re copado para formatear fechas <img src='http://webandbeer.com.ar/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />
 * return formatted date as yyyy-mm-dd H:i:s using UTC
 */
Date.prototype.formatUTC = function() {
	function pad(n) {
		return n &lt; 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();</pre>
]]></content:encoded>
			<wfw:commentRss>http://webandbeer.com.ar/2011/06/consejos-de-timezone-by-demian-rodriguez/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Youtube acata ordenes de los gobiernos para censurar videos con protestas populares</title>
		<link>http://webandbeer.com.ar/2011/05/youtube-acata-ordenes-de-los-gobiernos-para-censurar-videos-con-protestas-populares/</link>
		<comments>http://webandbeer.com.ar/2011/05/youtube-acata-ordenes-de-los-gobiernos-para-censurar-videos-con-protestas-populares/#comments</comments>
		<pubDate>Fri, 20 May 2011 15:28:37 +0000</pubDate>
		<dc:creator>Cesar Casas</dc:creator>
				<category><![CDATA[internet]]></category>
		<category><![CDATA[Noticias]]></category>
		<category><![CDATA[novedades]]></category>
		<category><![CDATA[censura]]></category>
		<category><![CDATA[gobiernos]]></category>
		<category><![CDATA[protesta sociales viral]]></category>
		<category><![CDATA[youtube]]></category>

		<guid isPermaLink="false">http://webandbeer.com.ar/?p=954</guid>
		<description><![CDATA[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 &#8220;dando caso&#8221; a los gobiernos que presionan para [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_955" class="wp-caption alignleft" style="width: 310px"><a href="http://webandbeer.com.ar/wp-content/uploads/2011/05/youtube-censura.jpg" rel="lightbox[954]"><img class="size-medium wp-image-955" title="youtube censura a pedido de los gobiernos" src="http://webandbeer.com.ar/wp-content/uploads/2011/05/youtube-censura-300x161.jpg" alt="youtube censura a pedido de los gobiernos" width="300" height="161" /></a><p class="wp-caption-text">youtube censura a pedido de los gobiernos</p></div>
<p>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 &#8220;dando caso&#8221; 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).</p>
<p>Es dificil creer que en un mundo virtual, donde todo es libre, donde el universo creado es practicamente infinito&#8230;. exista la sensura (en especial en un servicio masivo, donde todos colaboran y comparten).</p>
<p>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.</p>
<p>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.</p>
<p>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.</p>
<div id="attachment_956" class="wp-caption aligncenter" style="width: 310px"><a href="http://webandbeer.com.ar/wp-content/uploads/2011/05/600x400-PROTESTA-CONTRA-EL-PAPA.jpg" rel="lightbox[954]"><img class="size-medium wp-image-956" title="Protesta contra el papa" src="http://webandbeer.com.ar/wp-content/uploads/2011/05/600x400-PROTESTA-CONTRA-EL-PAPA-300x225.jpg" alt="Protesta contra el papa" width="300" height="225" /></a><p class="wp-caption-text">Protesta contra el papa</p></div>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://webandbeer.com.ar/2011/05/youtube-acata-ordenes-de-los-gobiernos-para-censurar-videos-con-protestas-populares/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ant Video Downloader envia informacion de navegacion a su autor</title>
		<link>http://webandbeer.com.ar/2011/05/ant-video-downloader-envia-informacion-de-navegacion-a-su-autor/</link>
		<comments>http://webandbeer.com.ar/2011/05/ant-video-downloader-envia-informacion-de-navegacion-a-su-autor/#comments</comments>
		<pubDate>Fri, 20 May 2011 14:57:57 +0000</pubDate>
		<dc:creator>Cesar Casas</dc:creator>
				<category><![CDATA[internet]]></category>
		<category><![CDATA[Noticias]]></category>
		<category><![CDATA[novedades]]></category>
		<category><![CDATA[Seguridad]]></category>
		<category><![CDATA[ant video downloader]]></category>
		<category><![CDATA[espionaje]]></category>
		<category><![CDATA[extension]]></category>
		<category><![CDATA[firefox]]></category>
		<category><![CDATA[seguridad]]></category>

		<guid isPermaLink="false">http://webandbeer.com.ar/?p=950</guid>
		<description><![CDATA[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 &#8220;robando&#8221; informacion sin permiso a fines de lograr estadisticas (que como todos sabemos [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_951" class="wp-caption alignleft" style="width: 310px"><a href="http://webandbeer.com.ar/wp-content/uploads/2011/05/ant-video-download.png" rel="lightbox[950]"><img class="size-medium wp-image-951" title="ant video downloader espia nuestra informacion de navegacion" src="http://webandbeer.com.ar/wp-content/uploads/2011/05/ant-video-download-300x159.png" alt="ant video downloader espia nuestra informacion de navegacion" width="300" height="159" /></a><p class="wp-caption-text">ant video downloader espia nuestra informacion de navegacion</p></div>
<p>Simon Newton, un programador, ha descubierto que la extension Ant Video Download recolecta informacion de las paginas visitadas y las envie a su autor.</p>
<p>Se pude detectar como dicha extension hacia request hacia el dominio rcp.ant.com.Podemos pensar que la empresa Ant esta &#8220;robando&#8221; 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).<br />
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.<br />
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.<br />
Hay que tener mas cuidado que las extensiones que se instalan!.</p>
]]></content:encoded>
			<wfw:commentRss>http://webandbeer.com.ar/2011/05/ant-video-downloader-envia-informacion-de-navegacion-a-su-autor/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Javascript bible gold edition download pdf free</title>
		<link>http://webandbeer.com.ar/2011/05/javascript-bible-gold-edition-download-pdf-free/</link>
		<comments>http://webandbeer.com.ar/2011/05/javascript-bible-gold-edition-download-pdf-free/#comments</comments>
		<pubDate>Mon, 16 May 2011 02:16:09 +0000</pubDate>
		<dc:creator>Cesar Casas</dc:creator>
				<category><![CDATA[Descargas]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[Manuales y conceptos]]></category>
		<category><![CDATA[Manuales y libros]]></category>
		<category><![CDATA[biblia]]></category>
		<category><![CDATA[descargar gratis]]></category>
		<category><![CDATA[manual]]></category>
		<category><![CDATA[pdf]]></category>

		<guid isPermaLink="false">http://webandbeer.com.ar/?p=946</guid>
		<description><![CDATA[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 [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_947" class="wp-caption alignleft" style="width: 234px"><a href="http://webandbeer.com.ar/wp-content/uploads/2011/05/biblia-de-javascript-descargar-pdf.png" rel="lightbox[946]"><img class="size-medium wp-image-947" title="biblia de javascript descargar" src="http://webandbeer.com.ar/wp-content/uploads/2011/05/biblia-de-javascript-descargar-pdf-224x300.png" alt="biblia de javascript download" width="224" height="300" /></a><p class="wp-caption-text">Descargar La biblia de JavaScript en formato PDF</p></div>
<p>La biblia de JavaScript Gold Edition para bajar en PDF.</p>
<p>Este libro pasado a PDF es sin duda una de las mas importantes referencias de javascript.</p>
<p>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.</p>
<p>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.</p>
<p>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.</p>
<p><a href="http://webandbeer.com.ar/wp-content/uploads/2011/05/biblia-de-javascript.pdf">biblia de javascript gold edition download</a></p>
]]></content:encoded>
			<wfw:commentRss>http://webandbeer.com.ar/2011/05/javascript-bible-gold-edition-download-pdf-free/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

