Internet

space-tweet: Buenos tweets vs. Malos tweets en Node, Socket.IO, MooTools

0

Reportado en el blog de Twitter, Jacob Thornton a creado una demostración divertida sobre el sentimiento de los tweet con el clásico Space Invaders.

Jacob buscaba aprender más sobre Node y desarrollo este proyecto utilizando Node.js, Socket.IO, MooTools, y el API de streaming de Twitter.

Twitter se renueva – NewTwitter

1

“Bienvenido al nuevo Twitter.com”

Una experiencia más fácil, más rápida y más profunda. ¡Pronto estará disponible para todos los usuarios!

Twitter - NewTwitter - Nuevo Diseño

Esta es la consigna que proclama Twitter en NewTwitter, en las próximas semanas Twitter irá cambiando gradualmente el diseño y agregando una serie de funcionalidades a su sitio.


Ve fotos, vídeos y otro contenido externo.
Ver fotos y videos directamente en Twitter será más fácil, gracias al apoyo de DailyBooth, DeviantART, Etsy, Flickr, Justin.TV, Kickstarter, Kiva, Photozou, Plixi, Twitgoo, TwitPic, TwitVid, USTREAM, Vimeo, yfrog, y YouTube.

Descubre información pertinente
Al hacer clic en un Tweet, el panel de detalles mostrará información adicional relacionada con el autor o tema del Tweet. Dependiendo del contenido del Tweet, verás @respuestas, otros Tweets del mismo usuario, mapa de la ubicación del Tweet y mucho más.

Mini perfiles
Puedes hacer clic en un @nombredeusuario para ver el mini perfil sin tener que salir de tu página de inicio. Esto proporciona acceso rápido a la información de la cuenta como Tweets y biografía

Duración del lanzamiento gradual
Durante las próximas semanas, habrá un lanzamiento incremental de estos cambios. Podrás alternar entre las versiones para que tengas tiempo de acostumbrarte a cómo funcionan las cosas. Con el tiempo, todos tendrán acceso a la nueva versión de Twitter.com.

Facebook – Dns Failure

1

Después de revisar mi conexión, verificar que mi ISP estuviera funcionando correctamente, veo con sorpresa que Facebook esta offline, con un error aparentemente en el DNS.

Facebook DNS Error - Fail

Facebook DNS Error - Fail

dig www.facebook.com

; <<>> DiG 9.7.0-P1 <<>> www.facebook.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 23288
;; flags: qr rd ra; QUERY: 1, ANSWER: 4, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;www.facebook.com.              IN      A

;; ANSWER SECTION:
www.facebook.com.       11      IN      CNAME   sorry.ak.facebook.com.edgesuite.net.
sorry.ak.facebook.com.edgesuite.net. 20319 IN CNAME a1030.g.akamai.net.
a1030.g.akamai.net.     7       IN      A       204.2.249.33
a1030.g.akamai.net.     7       IN      A       204.2.249.50

Parece que después de todo el éxito lo alcanzo, tal cuál lo hizo con Twitter, y le jugo una mala pasada

Gwibber: Ubuntu y las Redes Sociales

1

Siempre dije que no entendía cual era “la cosa” con esto de las redes sociales, con el Facebook, Twitter y cuanta red social apareciera, aunque la verdad sea dicha, tengo mi cuenta en varias redes sociales, dígase HI5, Facebook, Twitter, Linked In, Menéame… en la única que tenía actividad constante era en Menéame, pero luego cada vez más el contenido de esta se empezo a enfocar en una región (España o Europa) y bueno, aquí lo interesante era intercambiar opiniones y votar noticias, pero, que iba a comentar y a votar si por un lado no entendía las noticias y por otro tampoco me importaban? así que terminé abandonando la única red social que alguna vez me interesó.

Con el resto de redes sociales, nunca terminaron de atraerme por completo y nunca me concentré en ninguna de ellas, de vez en cuando miraba mi twitter y llegaba tarde a los mensajes que alguna vez me enviaron, asi que si vos sos uno de los que alguna vez me escribió, perdón hermano. Lo mismo pasó con mi cuenta de Facebook, y no digamos el HI5, a este último ni asunto le puse, abrí mi cuenta solo porque alguien me envió una invitación y queria ver algunas fotos pero de allí nunca subi nada.

Con el cambio de versión de Ubuntu se anunciaba que esta versión introduciría aplicaciones para redes sociales, y que muchas de sus funciones estaban orientadas a hacer fácil el manejo de tus cuentas, específicamente había una aplicación que me llamaba la atención y tenía curiosidad de explorar, se trataba de Gwibber.

Gwibber es un intento por centralizar en un solo lugar la interacción con las redes sociales, esto para mi tiene mucho sentido pues el principal problema que tengo es que no me gusta estar yendo de red en red para ver si hay nuevos mensajes o actualizaciones de mis amigos, con Gwibber en un solo lugar se tiene acceso a Facebook, Twitter, FriendFeed, Digg y algunas otras.

Estoy usando Gwibber desde hace un mes y la experiencia ha sido buena, hay cosas que podrían mejorar pero aún asi me parece una buena alternativa, ya que me evita el tener que ir a cada sitio. Ahora le doy seguimiento a los que escriben mis amig@s y llego a tiempo para responder los mensajes :D , lo cual ha mejorado mucho mi percepción de las redes sociales, más ahora que he encontrado en Facebook amigos que no veo desde hace años.

(más…)

Node.js – Express vs Sinatra Benchmarks

2

Siguiendo con una serie de post referidos a Node.js, vamos a ver a continuación una serie frameworks para Node.js y su performance respecto a sus contrapartes para Ruby.

Comenzamos realizando un benchmark para Express, con resultados realmente sorprendentes! Los números indicados deben tomarse a la ligera, sin embargo, coinciden en afirmar que Express es bastante rápido.

Si estás interesado en realizar un benchmark de tus propias aplicaciones web puedes leer el artículo ApacheBench Gnuplot Graphing Benchmarks.

Todos los benchmark que verás a continuación fueron realizado con ApacheBench, una concurrencia de 50 y realizando 2000 requests. Tené en cuenta que se utilizó Thin para servir Sinatra requests.

Express vs Sinatra

Para los que no conocen Express, es un NodeJS framework inspirado en Sinatra para Ruby. Debajo pueden encontrar los resultados de un benchmark para un típico “Hello World” response, que incluye NodeJS benchmarks sin el overhead de las características provistas por Express:

Express vs Sinatra Benchmark

Express vs Sinatra
(más…)

Ejecutando procesos en paralelo con Javascript

0

El sistema usado en el ejemplo que croczilla.com publica, está desarrollado usando Stratified Javascript (SJS), una implemenetación de Javascript con Javascript O.o. Se trata de una librería multinavegador que nos permite añadir concurrencia a Javascript fácilmente.
La clave está en el uso de tags <script/> de un tipo diferente al que conocemos como text/javascript, usando uno propio se encarga de evaluar el código contenido en él añadiendo una serie de funcionalidades como hold(),resume(), suspend() y la posibilidad de usar concurrencia en Javascript.

Ejemplo

<script type="text/javascript" src="sjs-loader.js"></script>
<script type="text/sjs">
….
function animate(elemname, duration_ms, step_ms) {
 var elem = document.getElementById(elemname);
 var start_time = new Date();
 var x = 0;
 do {
 elem.style.left = x;
 x = (x + 10) % 200;
 hold(step_ms); // Parando la ejecución
 } while (duration_ms > new Date() - start_time);
 }

 function par(a, b) {
 alert("all done");
 }
 // Procesos paralelos
 par(animate("animated_element_1", 10000, 100),
 animate("animated_element_2", 7000, 80));
…
</script>

Como podemos ver, en esta porción de código sacada de una demo de crockzilla.com, usamos hold() para detender la ejecución y usamos el paso de parámetros para comenzar la concurrencia de procesos.
Con los Web Workers a la vuelta de la esquina, estas técnicas nos puedes empezar a mostrar el camino a seguir en unos meses (años). Por el momento, recomendaría usarla con precaución ya que no debemos olvidar que la librería basa su funcionamiento en la evaluación del código, con el coste que esta operación conlleva.

Apache CouchDB: una base de datos NoSQL (Relax)

1

Apache CouchDB

CouchDB, oficalmente Apache CouchDB, es una base de datos orientada a documentos (document-oriented database), también conocido como ‘NoSQL’, que puede ser consultada e indexada usando JavaScript como función MapReduce.

CouchDB ofrece una API (Application Programming Interface) RESTful (Representational State Transfer) en JSON que puede ser accedida vía peticiones HTTP. Hay muchas librerías para casi cualquier lenguaje de programación que facilitan el acceso.

CouchDB está escrito en Erlang, un lenguaje de programación funcional robusto ideal para construir sistemas distribuidos simultáneos, lo que permite un diseño flexible y fácilmente escalable y extensible.

Base de datos documental sin schema

Estamos acostumbrados a que cuando hablamos de base de datos pensemos en el modelo relacional (columna, filas, tablas, relaciones…)  En cambio CouchDB nos ofrece guardar nuestros datos de otra forma. En pocas palabras, para CouchDB solo hay documentos. Todo lo que almacenamos es un documento sin schema, lo cual nos permite guardar juntos documentos con distintos campos dentro de la misma BD.

Estos documentos se almacenan en JSON, un formato ligero, sencillo y cómodo de usar desde cualquier lenguaje. Vamos a ver un típico documento de CouchDB:

{
    "_id" : "234a41170621c326ec63382f846d5764",
    "_rev" : "1-480277b989ff06c4fa87dfd0366677b6",
    "tipo" : "articulo",
    "titulo" : "Esto es una prueba",
    "cuerpo" : "Soy el contenido de un artículo de prueba",
    "tags" : ["cine", "comedia"]
}

El _id sirve para que CouchDB lo distinga de otros documentos y a nosotros nos vale para poder recuperarlo posteriormente. Es un string que puede contener lo que queramos aunque si no ponemos nada CouchDB generará un UUID. ¿Y por que no genera los ids con un autoincremental? Bueno, el uso del UUID nos permite tener un id único UNIVERSALMENTE, lo cual nos será muy útil cuando entremos en el tema de la replicación, pero no adelantemos acontecimientos…

El campo _rev también es especial y sirve para que CouchDB controle la versión del documento. Cada vez que guardamos un cambio en el documento cambia el número de revisión (se incrementa el 1 de antes del – y el resto del número cambia). Esto es útil porque cada vez que intentamos guardar un documento pasamos el numero de la versión que vamos a modificar, de forma que si CouchDB ve que estamos guardando un cambio sobre una revisión antigua da error y no permite continuar.

Después, el resto de campos  podemos poner lo que queramos, siempre que usemos expresiones JSON válidas, como en el ejemplo donde tenemos el atributo tags que es un array de strings. Podría ser un diccionario ({“clave1″: “valor1″, “clave2″:”valor2″}),un número (2), etc…

La parte buena de estar trabajando sin schema es que este sistema se adapta a los cambios en la estructura de los documentos que es necesario almacenar. De esta forma nos podemos despreocupar de lo que vamos metiendo en la base de datos, ya nos preocuparemos cuando tengamos que recuperarlos.

Consultable al estilo MapReduce

CouchDB no nos ofrece un lenguaje tipo SQL para realizar consultas sino que nos ofrece un sistema basado en MapReduce para poder obtener los datos que queramos. ¿Y como funciona esto?  Pues es mas sencillo de lo que parece, se compone de una parte Map una parte Reduce.

Map: Es una función que se ejecuta para cada documento. Esta función recibe como parámetro el propio documento y puede devolver pares de clave-valor. Un función puede devolver 0, 1 ó varios de estos pares para un único documento de entrada. A primera vista esto puede parece muy ineficiente, pero la función sólo se ejecuta una vez para cada documento y va almacenando los resultados en un índice que relaciona claves y valores de forma que en posteriores consultas se ataque sobre este índice. Por supuesto, si alguno de los documentos de nuestra BD se modifica, se vuelve a rehacer el índice (pero sólo para los documentos modificados)

Un ejemplo rápido:

function(doc) {
  for (var i in doc.tags)
   emit(doc.tags[i], doc);
}

Como podemos ver las funciones Map (y las Reduce) se definen en Javascript. CouchDB ofrece una arquitectura pluggable mediante la cual podemos crear estas en nuestro lenguaje favorito (Python, Ruby…).

Esta función devuelve como clave cada uno de los tags y como valor el propio documento. De esta forma ejecutada sobre nuestro doc de ejemplo daría 2 filas: una para “cine”  y otra para “comedia” ambas teniendo como valor el propio documento.

Después sobre este conjunto de resultados podemos  filtrar por clave o bien por un par de claves inicio y fin. De esta forma si queremos sabe todos los artículos que son de cine filtraríamos aquellos que tienen la clave “cine”. Es fácil, ¿no?

Lo bueno es que las claves pueden ser cualquier tipo de datos soportado por JSON como arrays, números, diccionarios… lo cual puede ser útil para realizar consultas más avanzadas.

Reduce: A grandes rasgos esta agrupa los resultados del Map para obtener un número. De esta forma si la parte Map anterior fuera asi:

function(doc) {
  for (var i in doc.tags)
    emit(doc.tags[i], 1);
}

Podemos definir una funcion reduce tal que asi:

function(keys, values)
{
  return sum(values);
}

La función Reduce recibe como entrada todas las claves y todos los valores. Con la funcion sum, proporcionada por CouchDB, vamos acumulando los 1 que devuelve la función map de forma que como resultado de esta obtenemos varias filas con cada uno de los tags como clave y el número de documentos que tienen este tag como valor.

En la nomenclatura de CouchDB un par de funciones MapReduce se llama view (no siendo obligatorio definir la parte reduce).

Accesible por REST

REST nos permite acceder a nuestro datos de una forma muy sencilla a través de URLs. Por ejemplo para recuperar nuestro documento con id  6e1295ed6c29495e54cc05947f18c8af de nuestra BD albums accederíamos a esta URL que nos devuelve el documento JSON correspondiente:

http://localhost:5984/albums/6e1295ed6c29495e54cc05947f18c8af

De forma similar si queremos acceder a una view como la que comentábamos cuando explicábamos el Map y recuperar algún resultado iremos a la URL:

http://localhost:5984/blog/_design/doc/_view/tag?key="cine"

Esta URL quiere decir que estamos accediendo a la BD llama blog, para recuperar un design document (donde se guardan las views dentro de la BD) llamado doc y dentro de este a la view llamada tag. Después como comentábamos antes, dentro de la view queremos recuperar el resultado identificado por la clave cine (es interesante ver como hay que pasarla entre ” ” ya que la clave es un string, uno de los tipos válidos de JSON).

En esta URL obtendríamos un resultado similar a este:

{"total_rows":4,"offset":0,"rows":[
 {
   "id":"9280b03239ca11af9cfedf66b021ae88",
   "key":"cine",
   "value":{"_id":"9280b03239ca11af9cfedf66b021ae88",
                "_rev":"1-0289d70fe05850345fd4e9118934a99b",
                "tags":["cine","comedia"]}
 },
{
   "id":"a92d03ff82289c259c9012f5bfeb639c",
   "key":"cine",
   "value":{"_id":"a92d03ff82289c259c9012f5bfeb639c",
                "_rev":"2-97377eef95764a4dbf107d8142187f53",
                "tags":["cine","drama"]}}
]}

Como podemos ver en key y value tenemos los resultado esperados: el tag y el documento que lo contiene. Aparte CouchDB incluye el id del documento que ha dado lugar a ese resultado (el que entra como parámetro en la función Map). Además se devuelve el numero total de filas devueltas y el offset del resultado.

En vez del parámetro key se le puede pasar a nuestra vista un par de parámetros startkey y endkey para obtener un rango de los resultados que nos interese (p.ej. en una view que devolviera como clave un string representando una fecha).

Replicación integrada

Una funcionalidad relativamente exótica que nos permite que nuestra BD de datos sincronice sus datos de una forma muy sencilla (una simple llama REST la activa) con otra BD remota o local. De este modo podemos tener de una forma sencillísima una o mas réplicas de nuestra BD para implementar arquitecturas de alta disponibilidad o de balanceo de carga.

Si os acordáis de cuando comentábamos  que CouchDB usaba por defecto UUIDs como identificadores de los documentos veréis que al tener varias BD de datos intercambiándose filas esto es indispensable. Pensad que pasaría si tuviéramos 2 o más bases de datos cada una con su autoincremental como id y empezaran a pasarse datos entre ellas ;)

Futon Apache CouchDB

Futon Apache CouchDB

De forma similar, el atributo _rev anteriormente comentado nos permite que CouchDB detecte casos en los que un mismo documento ha sido modificado en varias bases de datos a la vez (cada documento tendria un _rev diferente) .

Si os ha parecido interesante este post podéis probar a seguir la introducción práctica ofrecida en el libro gratuito de CouchDB aquí.

Mañana se presentará Google Chrome OS

0
Google-Chrome1

Hace pocos días saltaba la noticia de que Chrome OS, sistema operativo de Google anunciado por el mes de julio, sería finalmente lanzado durante esta semana. Pues bien, hoy los de TechCrunch vuelven con más noticias sobre este tema.

Al parecer Google celebrará mañana mismo un evento en sus oficinas de Mountain View centrado enteramente en Chrome OS. En él se dará información sobre las tecnologías del sistema operativo y se mostrarán algunos vídeos del SO en funcionamiento. En definitiva el plan es dar una visión general sobre Chrome OS, lo que ciertamente hace falta porque no se sabe prácticamente nada sobre el mismo. Lo que parece estar bastante claro es que finalmente el sistema operativo de Google no se lanzará hasta el año que viene.

Veremos si finalmente mañana tiene lugar o no el sarao que anuncian desde TechCrunch, estaremos atentos ya que aunque por el momento el sistema operativo no se va a poder probar, si que tendríamos mucha más información sobre Chrome OS.

Buscando imágenes con Google Image Swirl

0
Google Images

Google siempre está investigando y tratando de encontrar mejores formas de presentar la información y realizar nuevas búsquedas. Desde el 2001 que la compañía le ha dado una importancia muy grande a la forma en que se buscan imágenes y/o fotografías, y como son presentados los resultados. Siempre me ha resultado muy útil el buscador de imágenes, para encontrar los logos de las compañías para un post, una presentación o encontrar la imagen adecuada que ilustrará un post en el blog.

Hoy se presenta Google Image Swirl, una nueva y experimental forma de buscar imágenes. Los resultados son presentados en grupos que al darle click se convierten en “remolinos” con imágenes muy similares unas de otras. Por ejemplo, al buscar Washington en Google Image Swirl, aquí está lo que se verá si hace clic en la imagen del Obelisco:

washington monument

La tecnología se encuentra en desarrollo y por ahora el servicio está dentro de los Google Labs. Es muy interesante ver como se agrupan las fotografías de algún lugar en particular. Yo me pase un rato buscando imágenes de Times Square y de la Fontana di Trevi.

Vía: Google Blog

Propuesta para una mejor microsintaxis en Twitter

0

Chris Messina hace una interesante propuesta para mejorar la microsintaxis en Twitter con relación a la forma en que hacemos retweets, metemos a más personas en la conversación y citar a una persona:

  1. Cambiar el RT: o el (via @usuario) a: /via @usuario — es más explicativo y se ahorra un caracter en el segundo caso.
  2. Empezar el uso de /cc @usuario para agregar a la conversación a una persona, como sucede con los emails.
  3. Usar /by @usuario cuando se quiera citar a una persona.

Es curioso, pero la adopción (o no adopción) de este tipo de microsintaxis por aplicaciones populares para actualizar Twitter determina bastante la forma en que usamos ese tipo de servicios. Recordemos que fue Chris Messina quien propuso los #hashtags para agrupar temas.

Se ha creado un wiki para identificar, investigar y encontrar puntos comunes en el uso de este tipo de expresiones.

Vía: Denken Über

Go to Top