sábado, 29 de diciembre de 2012

Responsive Design - Diseño que Responde

No sabía bien como traducir este término tan especial del inglés. Pero bueno, la idea es la de hacer un diseño (en este caso se mostrarán imágenes de Android pero aplica para todas las plataformas, móviles y PC) que se auto ajuste para diferentes pantallas.

Espacio limitado para recursos

Hay que tener cuidado y no creer que esto de diseñar para diferentes pantallas significa que tenemos que poner recursos gráficos para todos los tamaños. Eso resultaría en una aplicación demasiado grande.

Tampoco se trata de colocar todo el diseño al centro de la pantalla, con un ancho máximo de 320 pixels. Lo único que lograrás es que los usuarios con pantalla grande se pregunten por qué se ve todo tan chiquito si se dispone de un gran ancho de pantalla para usar.

Qué hago entonces?

Ahora más abajo vas a ver algunas capturas que dan ideas. Pero lo principal a tener en cuenta es la distribución de los elementos en la pantalla, según el ancho de la misma. Cuanto más reducida es, los elementos se tienden a apilar uno arriba de otro y a quitar lo que no es tan relevante.

Cuando tienes una pantalla más grande, ya puedes ordenar algunos de tus elementos de forma horizontal en vez de vertical.

Y cuando tienes una pantalla más grande (por ejemplo, una tablet de 10 pulgadas  vista apaisada, o tal vez una PC) entonces usas el mismo diseño que el mencionado antes pero le agrandas los márgenes y colocas elementos de ayuda en pantalla que no suelen entrar en los otros dos espacios.

Aplicación Calendario 
en pantalla pequeña.

Misma aplicación Calendario en una pantalla
mediana (los títulos de los campos van al costado y no arriba)

Misma aplicación Calendario pero en una pantalla todavía más grande.
Es el mismo diseño de una pantalla mediana pero los márgenes son mayores.

Ideas para cambiar diseño

A continuación, pongo algunas capturas de pantalla que muestran como resolver la distribución de la información a medida que cambia la pantalla. Y todo con un mismo código.

Paneles múltiples - Comprimir
La idea es comprimir el tamaño de los paneles si la pantalla es más angosta. Y agrandarlos si hay espacio. No es la idea usar valores fijos sino porcentajes.

Paneles múltiples - Apilar
Esta idea soporta pantallas realmente pequeñas. Y lo que se hace es apilar los elementos a medida que se hace más angosta la pantalla. Y expandir cuando es más grande. 

Paneles múltiples - Expandir / Colapsar.
En este caso la información tiene siempre el mismo tamaño pero es capaz de colapsar a medida que el ancho de la pantalla es menor. Y se expande cuando se hace más grande.

Paneles múltiples - Mostrar / Esconder.
En este caso, decidimos esconder la información que no consideramos tan relevante para el usuario y le dejamos un botón o enlace para que cuando quiera la muestre.

Otros ejemplos...

"Patterns" Application

"Pocket" Application

"TED Talk" Application

Related link on this blog.

UPDATE

Excelente tutorial en español sobre cómo iniciar un diseño usando esta técnica.

Sites with demos on this technique.

Twitter framework for Responsive Design (kind-of).

Adjust automatically Video static image for Youtube, Vimeo and more...




sábado, 15 de diciembre de 2012

¿Cómo funciona la red Tor?


Logo de Tor
Durante estos días, la red Tor ha saltado a la actualidad a raíz de un escándalo político en España. Fue usada para enviar un correo anónimo y muy difícil de rastrear, pero, ¿cómo funciona realmente esta red? ¿Quién lo usa, y para qué propósitos? Genbeta hoy vamos a responder a todas estas preguntas.

Cómo funciona Tor: el “enrutado cebolla”

Cómo funciona Tor
Tor es una red que implementa una técnica llamada Onion Routing (enrutado cebolla en castellano, aunque suena bastante peor), diseñada con vistas a proteger las comunicaciones en la Marina de los Estados Unidos. La ideas es cambiar el modo de enrutado tradicional de Internet para garantizar el anonimato y privacidad de los datos.
El enrutado tradicional que usamos para conectarnos a servidores en Internet es directo. Por ejemplo, si quieres leer Genbeta: tu ordenador se conecta de forma directa a los servidores de Genbeta. La ruta es, a grandes rasgos, sencilla: de tu ordenador a tu router, de ahí a los enrutadores de tu ISP(proveedor de Internet) y después directos a los servidores de Genbeta.
Fácil y sencillo, salvo por el hecho de que si alguien intercepta los paquetes de datos en un punto intermedio sabrá perfectamente de dónde vienen y a dónde van. Incluso aunque se cifren los datos de cada paquete (por ejemplo, visitando una página HTTPS) las cabeceras de este no se cifran, y los campos del remitente y destinatario (entre otros) siguen siendo visibles.
Ahí es donde entra el Onion Routing. Habréis oído que consiste en enviar el paquete por un camino no directo, a través de varios nodos, pero en realidad es algo más complejo que eso.
Primero, el ordenador A, que quiere enviar el mensaje a B, calcula una ruta más o menos aleatoria al destino pasando por varios nodos intermedios. Después, consigue las claves públicas de todos ellos usando un directorio de nodos.
Usando cifrado asimétrico, el ordenador A cifra el mensaje como una cebolla: por capas. Primero cifrará el mensaje con la clave pública del último nodo de la ruta, para que sólo él lo pueda descifrar. Además del mensaje, incluye (también cifradas) instrucciones para llegar al destino, B. Todo este paquete, junto con las instrucciones para llegar al último nodo de la lista, se cifra de nuevo para que sólo lo pueda descifrar el penúltimo nodo de la ruta.
Diagrama de cebollaEl paquete está en el centro, protegido por varias capas (cifrados) para cada uno de los nodos.
El proceso se repite hasta que acabamos con todos los nodos de la ruta. Con esto ya tenemos el paquete de datos listo, así que toca enviarlo. El ordenador A conecta con el primer nodo de la ruta, y le envía el paquete. Este nodo lo descifra, y sigue las instrucciones que ha descifrado para enviar el resto del paquete al nodo siguiente. Éste descifrará de nuevo y volverá a enviar al siguiente, y así sucesivamente. Los datos llegarán finalmente al nodo de salida, que enviará el mensaje a su destino.

Mucho más seguro, privado y anónimo, pero no es infalible

El Onion Routing proporciona muchísima más seguridad y privacidad que el enrutado normal de red. Ninguno de los nodos, salvo el primero y el último, saben de dónde viene o a dónde va el mensaje. Ni siquiera saben qué posición ocupan en la ruta, y mucho menos conocen el contenido del mensaje.
De esta forma, aunque se intercepten las comunicaciones entre dos nodos, es imposible saber qué datos transmite, a dónde van o de dónde vienen. Incluso aunque hubiese un nodo infiltrado, un topo en la red, no tendría nada que hacer con los mensajes que recibe. También tiene la ventaja de que es muy difícil tumbar la red Tor: al estar los nodos distribuidos, habría que tumbar todos y cada uno de ellos para poder parar las comunicaciones.
Por supuesto, y como cualquier sistema, no es infalible. Una forma curiosa de saber quién ha enviado y recibido mensajes es analizar los tiempos. Si el ordenador A ha enviado un paquete a las 18:19:01 y 3 milisegundos, y 300 milisegundos más tarde el ordenador B ha recibido otro paquete, y se repite el patrón de latencia varias veces, es muy probable que A y B estén conectados entre sí.
También hay que tener en cuenta que el nodo final de salida puede leer el mensaje original, así quetambién hay que cifrar el mensaje original. Pero, en general, las redes tipo Tor, de “enrutado cebolla”, son muy seguras y garantizan un nivel de privacidad extremadamente alto.

Tor, la implementación del Onion Routing

Servidor proxy
¿Y qué es Tor? Sencillo: es el software que implementa el Onion Routing de forma sencilla para los usuarios. Al instalarlo en un ordenador, pone en marcha un servidor proxy local. Para los que no lo sepáis, un servidor proxy actúa como intermediario entre dos ordenadores. Como siempre, una imagen vale más que mil palabras y la mejor explicación que he encontrado sobre servidores proxy la tenéis en la imagen de arriba.
Lo peculiar del servidor proxy de Tor es que enruta esas peticiones a través de la red Tor, usando el Onion Routing que comentábamos antes. Usando este servidor como puerta a la red anónima, podemos hacer conexiones privadas desde cualquier programa del ordenador que soporte proxys.
Por supuesto, esta aproximación tiene pegas: puede que el programa que usemos incluya nuestra IP en los datos que envía, y entonces todo el enrutado y los cifrados que hagamos no servirán para nada. Por eso, el proyecto Tor recomienda usar el navegador Tor, ya preparado para conectarse a través de la red y para no enviar ningún dato identificador. Lo mismo con algunos servicios como mensajería instantánea o correo: si no tenemos cuidado, podemos perder toda la privacidad que habíamos ganado por culpa un fallo en un programa.

¿Quién usa las redes Tor, y para qué?

Proyecto Tor
Las redes Tor son ampliamente usadas en todo el mundo por gente que necesita mantener comunicaciones seguras. Desde periodistas que se comunican con fuentes que necesitan permanecer anónimas hasta una rama de la inteligencia de la Marina de los Estados Unidos, pasando por activistas perseguidos en sus países, voluntarios de ONGs o usuarios que quieren acceder a servidores bloqueados por su ISP o por su Gobierno.
La red Tor también se usa para servicios ocultos. Un servicio crea varios puntos de introducción en ciertos nodos de la red, y notifica a una base de datos qué nodos son. Cuando un cliente quiera conectarse, enviará a uno de esos nodos la dirección de un punto de encuentro (al que está conectado) y una clave única. Ese punto de introducción conectará con el servicio oculto, que se conectará al punto de encuentro, estableciendo así una comunicación entre el cliente y el servicio.
La foram en la que están planteados estos servicios ocultos permite conectarnos a servidores de correo o de chat sin saber ni siquiera su dirección exacta, usando intermediarios y circuitos Tor anónimos. A través de uno de estos servidores de correo se envió el famoso email que causó la polémica con la que introducíamos el artículo.
En este caso, es prácticamente imposible rastrear quién envió el correo: ni siquiera el propio servidor de correo sabe con qué ordenador estaba comunicándose.
Esperamos que este artículo os haya aclarado cualquier posible duda sobre lo que es (y lo que no es) Tor, y cómo funciona realmente. Y, como siempre, si tenéis alguna duda poned un comentario e intentaremos ayudaros entre todos.


¿Cómo funciona la red Tor?

jueves, 13 de diciembre de 2012

HTML Flow with Javascript


I've been working today on this page flow and I like it.

The idea is to make things easier for users. They usually are confused when an application takes them from one screen to another.

This example will show how all the screens are piled up (using a simple animation, which must be optimized) as the user goes deeper and deeper through the application.

I did not used jQuery because I wanted to make it as small as possible. And now that I'm writting this, I realize that it'd be better if I give Google's Dart a chance...

Keep reading and be ready for Dart, very soon!

(Just copy and pase the following code into a HTML file and make doble-click to see it working on a browser)

<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<title>My Two parts screen</title>
<style>
body {
font-family:Arial;
font-size:16px;
background:#ddd;
}
/* Decoration */
.box {
position:absolute;
left:5%;
top:5%;
padding:5px;
background:#fff;
border:1px solid #ccc;
}
.box #inner {
padding:1em;
}
</style>
<script>
/* Do after body is fully loaded */
function onBodyComplete()
{
setBoxDiv();
}
/* Get current window's width */
function getWidth() 
{
var myWidth = 0, myHeight = 0;
if( typeof( window.innerWidth ) == 'number' ) {
//Non-IE
myWidth = window.innerWidth;
myHeight = window.innerHeight;
} else if( document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) ) {
//IE 6+ in 'standards compliant mode'
myWidth = document.documentElement.clientWidth;
myHeight = document.documentElement.clientHeight;
} else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) ) {
//IE 4 compatible
myWidth = document.body.clientWidth;
myHeight = document.body.clientHeight;
}
return myWidth;
}
/* Window resizes */
window.onresize = function() {
onBodyComplete();
};
/* Utility functions for the framework*/
function $(divId) {
return document.getElementById(divId);
}
function log(text) {
console.log(text);
}
function doMessage(text)
{
$('message').innerHTML = text;
}
/* Use this function for animating down any DIV element */
function animateDown(divId, pixels, callback)
{
log('animateDown');
var ele = $(divId);
if ( ele == null )
{
console.log('animateDown: element is null!');
return false;
}
var currentMarginTop = ele.style.marginTop;
currentMarginTop = currentMarginTop.replace('px','');
if ( parseInt( currentMarginTop ) >= parseInt( pixels ) ) 
{
log('animateDown: ' + currentMarginTop + ' >= ' + pixels );
ele.style.marginTop = pixels + 'px';
if ( callback != null ) callback();
return true;
}
else
{
moveDown(divId, pixels, callback, currentMarginTop);
}
}
/* This function works along with the animateDown function */
function moveDown(divId, pixels, callback, currentMarginTop)
{
var ele = $(divId);
if ( ele == null )
{
console.log('MoveDown: element is null!');
return false;
}
if ( currentMarginTop == '' ) 
currentMarginTop = 0;
currentMarginTop += 2;
ele.style.marginTop = currentMarginTop + 'px';
setTimeout("animateDown('"+divId+"', '"+pixels+"', "+callback+");", 100);
}
/* Use this function for animating up any DIV element */
function animateUp(divId, pixels, callback)
{
log('animateUp');
var ele = $(divId);
if ( ele == null )
{
console.log('animateUp: element is null!');
return false;
}
var currentMarginTop = ele.style.marginTop;
currentMarginTop = currentMarginTop.replace('px','');
if( typeof( currentMarginTop ) == 'number' )
{
// Nothing
}
else
{
if ( currentMarginTop == '' ) currentMarginTop = 0;
currentMarginTop = parseInt( currentMarginTop );
}

if( typeof( pixels ) == 'number' )
{
// Nothing
}
else
{
pixels = parseInt( pixels );
}
if ( currentMarginTop > 1000 ) currentMarginTop = 500;
if (  currentMarginTop <= pixels ) 
{
ele.style.marginTop = pixels + 'px';
if ( callback != null ) callback();
return true;
}
else
{
moveUp(divId, pixels, callback, currentMarginTop);
}
}
/* This function works along with the animateUp function */
function moveUp(divId, pixels, callback, currentMarginTop)
{
var ele = $(divId);
if ( ele == null )
{
console.log('moveUp: element is null!');
return false;
}
currentMarginTop -= 60;
ele.style.marginTop = currentMarginTop + 'px';
setTimeout("animateUp('"+divId+"', '"+pixels+"', "+callback+");", 0);
}
/* Use this function for showing or hiding a DIV element */
function makeVisible(divId, show)
{
if ( show ) 
$(divId).style.display = 'inline';
else
$(divId).style.display = 'none';
}
/* Use this function for setting height for any DIV element */
function setBoxHeight(boxId, newHeight)
{
$(boxId).style.height = newHeight + 'px';
}
/* 
*
* Utility functions for the application
*
*/
/* Will set width and height for all the components on the screen */
function setBoxDiv() 
{
var percent = '85%';
$('back-box').style.width = percent;
$('back-box').style.height = hForMsg + 'px';
$('login').style.width = percent;
$('login').style.height = hForLogin + 'px';
$('menu').style.width = percent;
$('menu').style.height = hForMenu + 'px';
$('menu-1').style.width = percent;
$('menu-1').style.height = hForMenu1 + 'px';
$('menu-2').style.width = percent;
$('menu-2').style.height = hForMenu1 + 'px';
}
var fDivIdMessageFromMenuDetail;
var fMessageFromMenuDetail;
/* Use this function for showing a message if you are inside a menu option detail */
function sendMessageFromMenuDetail(divId, text)
{
fDivIdMessageFromMenuDetail = divId;
fMessageFromMenuDetail = text;
animateDown(divId, hForMsg, function () 
doMessage(fMessageFromMenuDetail); 
setTimeout("animateUp('" + fDivIdMessageFromMenuDetail + "', 0, null)", 1500);
)
}
/* Use this function for showing an error from the login screen */
function sendErrorLogin(text)
{
fMessageFromMenuDetail = text;
animateDown('login', hForMsg, function () 
doMessage(fMessageFromMenuDetail); 
setTimeout("animateUp('login', 0, null)", 1500);
)
}
/* Use this function when the login is correct */
function sendCorrectLogin()
{
doMessage(''); 
makeVisible('menu', true);
animateDown('login', hForMenu, function () 
writeInfoInYoutLoginBox();
)
}
/* Use this function for showing the logged-in user info on screen */
function writeInfoInYoutLoginBox()
{
$('login').innerHTML = "<div id='inner'>You are logged as: <b>Walter Rodriguez</b>" + 
"<p><input type='button' value='Close Session' onClick='logoff()' /></p></div>";
}
/* Use this function for writting the FORM for making a login */
function writeLoginForm()
{
var text = '<div id="inner"><strong>ABM</strong>' +
'<form>' +
'<p>' +
'<label for="username">Username: </label>' +
'<input type="text" id="username" value="admin" />' + 
'</p>' +
'<p>' + 
'<label for="pass">Password: </label>' + 
'<input type="password" id="pass" value="pass" />' + 
'</p>' + 
'<p>' + 
'<input type="button" value="Simulate login incorrect" onClick="sendErrorLogin(\'Login incorrect. Please try again.\')" />' + 
'<input type="button" value="Simulate login correct" onClick="sendCorrectLogin()" />' + 
'</p>' + 
'</form></div>';
$('login').innerHTML = text;
}
/* This function will accomodate the screen for a logoff scenario */
function logoff()
{
doMessage(''); 
closeAllEnabledMenuDetail();
animateUp('login', 0, function () 
makeVisible('menu', false);
writeLoginForm();
)
}
var fMenuId;
/* Use this function when clicking a menu option */
function showDetailForOptionMenu(menuId)
{
fMenuId = menuId;
doMessage('');
hideAllEnabledMenuDetail();
animateDown('login', (hForMenu + hForMenu1), function () 
animateDown('menu', hForMenu1, function () 
{
makeVisible(fMenuId, true);
)
)
}
/* Use this function for closing the menu window */
function closeMenuDetail(menuId)
{
fMenuId = menuId;
doMessage('');
animateUp(menuId, 0, function ()
{
makeVisible(fMenuId, false);
animateUp('login', hForMenu, function () 
animateUp('menu', 0, function () 
// Nothing
)
)
}
);
}
/* Use this function for closing all the detailed menu option screens available */
function closeAllEnabledMenuDetail()
{
closeMenuDetail('menu-1');
closeMenuDetail('menu-2');
}
/* Use this function for hiding all the detailed menu option screens available */
function hideAllEnabledMenuDetail()
{
makeVisible('menu-1', false);
makeVisible('menu-2', false);
}
var hTiny = 100;
var hSmall = 200;
var hMedium = 300;
var hLarge = 450;
var hForMsg = hTiny;
var hForLogin = hSmall;
var hForMenu = hMedium;
var hForMenu1 = hLarge;
</script>
</head>
<body onLoad="onBodyComplete()">
<div id="wrapper">
<!-- box with error message for all boxes -->
<div id="back-box" class="box">
<div id="inner">
<div id="message"></div>
</div>
</div>

<!-- menu details -->
<div id="menu-1" class="box" style="display:none;">
<div id="inner">
<b>MENU OPTION DETAIL</b>
<p>Bla..</p>
<p>Bla..</p>
<p>Bla..</p>
<p>Bla..</p>
<p>Showing action for option menu 1</p>
<p><input type="button" value="Show message from option detail" 
onClick="sendMessageFromMenuDetail('menu-1','You just fired a message...')" /></p>
<p><input type="button" value="Back to Menu" onClick="closeMenuDetail('menu-1')" /></p>
</div>
</div>

<div id="menu-2" class="box" style="display:none;">
<div id="inner">
<b>MENU OPTION DETAIL</b>
<p>Showing action for option menu 2</p>
<p><input type="button" value="Back to Menu" onClick="closeMenuDetail('menu-2')" /></p>
</div>
</div>
<!-- menu list after login -->
<div id="menu" class="box" style="display:none;">
<div id="inner">
<b>MAIN MENU</b>
<ul>
<li><a href="javascript:showDetailForOptionMenu('menu-1')">Option 1</a></li>
<li><a href="javascript:showDetailForOptionMenu('menu-2')">Option 2</a></li>
<li>Option 3</li>
<li>Option 4</li>
<li>Option 5</li>
<li>Option 6</li>
<li>Option 7</li>
<li>Option 8</li>
<li>Option 9</li>
</ul>
<p><input type='button' value='Close Session' onClick='logoff()' /></p>
</div>
</div>
<!-- login box -->
<div id="login" class="box">
<!-- the Login form will be painted here via javascript -->
</div>
</div>
<script>writeLoginForm()</script>
</body>
</html>

My Two parts screen (with javascript)


Previously, I posted some code for a simple CSS three parts screen template using DIVs.

Now I'd like to save here this code that also works in Chrome, Firefox and iPod Touch/iPhone (thanks to Javascript, it also has a different behavior)


<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<title>My Two parts screen</title>
<style>
body {
font-family:Arial;
font-size:16px;
background:#ddd;
}
#wrapper {
width:auto;
margin:0px;
padding:0px;
border: 1px solid #ccc;
margin-right:5%;
margin-left:5%;
}
#center {
float:left;
width:80%;
background:#444;
}
#right {
float:right;
width:20%;
background:#777;
}
#inner {
padding:10px;
overflow:hidden;
}
</style>

<script>

/* Do after body is fully loaded */
function onBodyComplete()
{
if ( getWidth() <= 320 ) {
var newWidth = ( getWidth() - 48 );
document.getElementById('center').style.width = newWidth + 'px';
document.getElementById('right').style.width = newWidth + 'px';
document.getElementById('mobile-advice').innerHTML = '';
}
}

/* Get current window's width */
function getWidth()
{
var myWidth = 0, myHeight = 0;
if( typeof( window.innerWidth ) == 'number' ) {
//Non-IE
myWidth = window.innerWidth;
myHeight = window.innerHeight;
} else if( document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) ) {
//IE 6+ in 'standards compliant mode'
myWidth = document.documentElement.clientWidth;
myHeight = document.documentElement.clientHeight;
} else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) ) {
//IE 4 compatible
myWidth = document.body.clientWidth;
myHeight = document.body.clientHeight;
}
return myWidth;
}

/* Window resizes */
window.onresize = function() {
onBodyComplete();
};

</script>
</head>
<body onLoad="onBodyComplete()">
<div id="wrapper">

<div id="center">
<div id="inner">This is center</div>
</div>

<div id="right">
<div id="inner">This is right</div>
</div>

</div>

<div id="mobile-advice" style="padding-top:10px;">
<center><small>Check this on your mobile and see how it changes!</small></center>
</div>

</body>
</html>



Three-Parts Screen with DIVs

This is my version for a three parts screens using DIVs with easy.

Tested on Chrome 23.0, Firefox 17.0.1 and iPod Touch / iPhone


<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<title>My three parts screen</title>
<style>
body {
font-family:Arial;
font-size:16px;
background:#ddd;
}
#wrapper {
width:auto;
margin:0px;
padding:0px;
border: 1px solid #ccc;
margin-right:5%;
margin-left:5%;
}
#left {
float:left;
width:20%;
background:#ccc;
}
#center {
float:left;
width:60%;
background:#444;
}
#right {
float:right;
width:20%;
background:#777;
}
#inner {
padding:10px;
overflow:hidden;
}
</style>
</head>
<body>
<div id="wrapper">

<div id="left">
<div id="inner">This is left</div>
</div>

<div id="center">
<div id="inner">This is center</div>
</div>

<div id="right">
<div id="inner">This is right</div>
</div>

</div>
</body>
</html>

miércoles, 5 de diciembre de 2012

Adding maps to your BlackBerry WebWorks Applications - YouTube

Adding maps to your BlackBerry WebWorks Applications - YouTube

THE FUTURE OF DIGITAL - Business Insider

Excelente presentación de lo que significa el mundo tecnológico hasta este año 2012 que finaliza.

En resumen, se ve que Google con Android domina el mercado y que mobile es la plataforma del futuro (pero no solamente mobile)

El buscador más usado es Google y las ventas que hace en publicidad es por el mismo monto que todo USA hace en publicidad escrita.

Estoy prestando atención a las gafas de Google que ahora también tiene competidor (Microsoft) y también van a  ser el punto de pelea en el futuro.

Quién realmente gana? Siempre Google. Por qué? Porque la misión de Google es vender publicidad por Internet y es por eso que le interesa que sea libre y rápida y que todos usemos lo último de la tecnología para poder aprovecharla al máximo. Mientras que Microsoft o Apple venden productos. Y sin saberlo, le están ayudando a Google a facturar más.


THE FUTURE OF DIGITAL [SLIDE DECK] - Business Insider

viernes, 30 de noviembre de 2012

¿Cómo funciona Facebook por dentro?

En 1996 Alejandro Marcu egresó en la Escuela Técnica ORT con especialización en Informática, y recién volvió la semana pasada para compartir con los actuales alumnos su aventuras trabajando desde 2009 en la sede de Facebook en California, Estados Unidos.
Casual day: en Facebook algunos viernes se visten con traje
En aquellas épocas desarrollaba videojuegos en sistema DOS y los compartía con sus compañeros, cuando Windows aún no se conocía. Hasta llegó a publicar un título para su comercialización. Hoy su trabajo impacta en 1.000 millones de usuarios, algo que lo reconforta.

"Me gustaba sentir que la gente usaba lo que yo hacía, pero en esa época no había Internet y no se podía vender mucho. Desde 1997 y hasta 2007 estudié Ingeniería Electrónica en la UBA y tuve varios trabajos, pero en general no duraba mucho, me aburría", contó Marcu. "En el 2009 participé en un concurso de programación de una empresa llamada TopCoder y llegué a la final, en Las Vegas. ¡Esta empresa me pagaba todo! Y allí estaba Facebook auspiciándolo, y reclutando gente".

Primero se negó. Vivía bien en Argentina y no estaba en sus planes trabajar en Estados Unidos. Pero su curiosidad no pudo resistir a tomar la entrevista laboral con la red social. "Si me toman luego les digo que no", había pensado Alejandro. "Pero me fue bien y quería seguir entrevistándome. Me pagaban el viaje a Palo Alto y me pareció que estaba bueno conocer las oficinas...", recordó durante su charla.

Marcu trabajó en proyectos como la adaptación del formato "Biografía" a las "páginas" y fue quien propuso que se puedan etiquetar también páginas en las fotos. "Lo hice en unahackathon, y logré que esta idea forme parte de Facebook. Me dio mucha satisfacción haber hecho algo conocido y con mucho uso. Otro proyecto que desarrollé hace dos meses permite vender: la gente colecciona cosas, y sus amigos lo ven. Hicimos una prueba en Estados Unidos y ahora el resto del equipo sigue trabajando en este proyecto", relató.

¿Cómo funciona Facebook?

"Tenemos nuestros servidores Web, que cuando ustedes entran se les hace un pedido, y se encargan de generar el código para que ustedes vean la página que piden. Se usa Linux y PHP (mi trabajo es escribir php) compilado para que responda más rápido", explicó Alejandro. "Por otro lado tenemos las bases de datos, usamos una gratuita, MYSQL. Hay otros tipos de servidores que guardan estas bases, y cada base tiene información distinta. Cuando necesitamos acceder a la información no accedemos a cualquiera, sino a una en particular".

"Todos los servers Facebook los ponen en datacenters. Al principio la empresa alquilaba datacenters, pero en un momento quedó chico y construyeron desde cero los centros de datos", continuó el ingeniero".

¿Cómo se trabaja?

"Tengo mi notebook común y corriente, y además tengo un server de desarrollo para mí, que está en un datacenter, lejos. No tengo acceso físico. En ese server tengo mi propia versión de Facebook, la puedo cambiar y hacerle lo que quiera. Tiene 144 Giga de RAM, entonces me conecto con mi PC remotamente, edito el código y luego entro en el navegador, en una dirección especial, para ver lo que voy haciendo", dijo Marcu.

Como la red social tiene millones de líneas de código, compartir archivos y modificaciones entre distintos desarrolladores se hace complicado. Por eso utilizan un software de control de versiones que les asegura los pasos adecuados para compartir y publicar las actualizaciones.

- Qué consejo nos darías para ir al Silicon Valley?- se animó un alumno.

- Lo más importante es tener iniciativa y que te guste lo que haces. Hay que tener pasión. Lo que siempre me ayudó es tener ganas de hacer cosas, juegos, me las arreglaba para hacer un juego programando. Era otra época, porque ni había internet, no podía preguntarle a nadie. Eso me ayudo mucho, aprender por mi propia cuenta. Por supuesto que tardaba mucho más en hacer las cosas. La iniciativa de tener mis propios proyectos es lo que luego me permitió ser interesante para quienes buscan gente desde el Silicon Valley. Cada uno es como una start up, es como si yo tuviera mi empresa dentro de Facebook.

- Por qué Facebook tuvo tanto éxito?, se sumó un estudiante.

- Facebook no fue un invento muy original, ya había otras redes sociales. Fue una combinación de varias cosas, que le permitió funcionar mejor que otras. Una de ellas fue que Facebook se fue lanzando de a poco: primero era sólo para Harvard, algo exclusivo y sólo los estudiantes. Esto fue importante porque les permitió ir mejorando la infraestructura tecnológica y la interfaz del usuario. Hubo otras ideas muy buenas, como por ejemplo etiquetar las fotos, algo que no existía. También el newsfeed, que hace que uno entre todo el tiempo para ver las novedades.

De película

El día del estreno de The social network, la película que relata el nacimiento de Facebook, la empresa alquiló un complejo de cines y fueron todos a verla junto a Mark Zuckerberg, su fundador. "Mark dijo que estaba asombrado con detalles como por ejemplo que toda la ropa del protagonista era real, la que él mismo usaba", explicó Marcu, "pero que habían metido muchas cosas ficticias", como la historia con una chica que habría disparado el nacimiento de la red social.


¿Cómo funciona Facebook por dentro? - CanalAR

miércoles, 21 de noviembre de 2012

Comunidad 7BBerries - Todo el mundo BB explicado en español


Introducción al desarrollo de aplicaciones móviles

Objetivos

El objetivo principal de este capítulo es describir las diferencias entre el desarrollo de aplicaciones para un entorno de escritorio frente a un entorno de dispositivo móvil basado en las características del dispositivo físico y en las necesidades del usuario.
Desarrollo en dispositivos móviles
Desarrollar para dispositivos móviles tiene algunas cosas en común con el desarrollo para escritorio o servidor, pero las diferencias son realmente importantes. Por esto es necesario describir algunas características del desarrollo de aplicaciones móviles y luego poder considerarlas a la hora de programar aplicaciones. Estos conceptos tendrán un impacto importante a la hora de implementar finalmente una aplicación.
Lo primero a tener en cuenta es la limitación de recursos que existen en un dispositivo móvil. Si bien la evolución es constante y en gran escala, no se debe olvidar que sigue siendo un dispositivo limitado.
Recursos a tener en cuenta a la hora de programar:
- Tamaño de la pantalla
Los teléfonos móviles cuentan con una pantalla de pequeño tamaño, lo cual hace imprescindible tenerlo en cuenta a la hora de diseñar una aplicación. Es importante entender que no toda la información que tenemos disponible puede ser presentada al mismo tiempo en una sola pantalla. Para ello es necesario realizar un diseño de nuestra aplicación considerando siempre los elementos más relevantes dentro de cada pantalla.
- Memoria
Los dispositivos móviles cuentan con reducida capacidad de almacenamiento. Si bien es posible utilizar memorias externas, es difícil considerar que se dispone de gran capacidad para persistir y sostener información. Es importante administrar y gestionar prolijamente el uso de la memoria para evitar la caída del rendimiento de la aplicación y el dispositivo en general. Evitar la creación de objetos innecesarios es un factor muy determinante en el cuidado de este recurso. Así como Java Standard cuenta con el “Garbage Collector” (recolector de basura en memoria), Java Microedition también utiliza este mecanismo. No por esto se deberá dejar información “basura” dentro de la memoria esperando que el recolector haga su trabajo. Cuando se programa para móviles, es muy importante reducir el trabajo del GC.
- Capacidad del procesador
Así como la memoria es limitada, el procesador y su capacidad de procesamiento también lo son. Es por eso que es necesario evitar cualquier utilización innecesaria de este recurso. Los aplicaciones Java que corren en dispositivos BlackBerry poseen la capacidad de ejecutar tareas en simultáneo “multithreading”, por lo que se está expuesto a la degradación del rendimiento general del equipo. Tanto el diseño de clases y métodos, como la implementación de estos, es fundamental para la mejor optimización del procesador. Existen herramientas “profiler” que permiten analizar la utilización del CPU y encontrar la mejor implementación para cada rutina, llegando a optimizarlas lo máximo posible. Se mostrarán ejemplos y explicará su uso en otro capítulo.
- Medios de conexión
Los dispositivos móviles cuentan con la posibilidad de estar “todo el tiempo” conectados, tanto a internet como a dispositivos periféricos. Existen distintos métodos para lograrlo, como la conexión celular, WiFi y BlueTooth. Es importante no abusar del uso de este recurso, ya que este representa el factor de mayor consumo de procesador y memoria. En la etapa de diseño de una aplicación, es necesario considerar el mínimo uso de las distintas conexiones en los distintos escenarios.
- Batería
Los dispositivos móviles cuentan con una fuente de energía muy limitada. El mal uso de los recursos (pantalla, memoria, procesador y conexiones) tendrán un impacto directo en el consumo de batería, generando una baja considerable en el rendimiento de las aplicaciones y la experiencia de los usuarios.

Métodos de desarrollo para dispositivos móviles

Objetivos

El objetivo de este capítulo es enumerar y describir cuatro métodos para el desarrollo de aplicaciones para dispositivos móviles BlackBerry. Se describirá cómo difieren las aplicaciones HTML5, Java, Air y C++, mostrando distintos ejemplos. Se describirán las consideraciones de diseño y limitaciones para los métodos de desarrollo de aplicaciones.


Desarrollo JAVA

Las aplicaciones Java se caracterizan por residir y correr dentro de los dispositivos móviles. Las aplicaciones para BlackBerry se escriben basadas en Java® ME.

Existe la posibilidad de implementar aplicaciones “Standalone”, que no requieren de conexión a internet, y por lo contrario, contienen el contenido y lógica completos dentro de estas. Ademas, es posible desarrollar aplicaciones que soporten funciones “wireless”.


Desarrollo HTML5

En primer lugar, una aplicación de BlackBerry WebWorks es una aplicación independiente, lo que significa que no tiene que apuntar a un servidor remoto para cargar una página web o aplicación (a menos que se requiera). En este caso, la aplicación reside en el dispositivo BlackBerry. Básicamente se trata de un conjunto de recursos que se encapsulan en un contenedor que puede ser visto por un "explorador sin cabeza" - el motor WebKit.

En segundo lugar, usted puede tomar ventaja de las tecnologías web estándar, como CSS, HTML5 y JavaScript para construir su aplicación.

También puede tomar ventaja de los populares frameworks para móviles, tales como Sencha, PhoneGap, jQuery, o Dojo. Esto permite crear aplicaciones más rápido porque puede volver a utilizar las aplicaciones existentes y los recursos.

Lo más importante es que se puede agregar funcionalidad nativa a una aplicación HTML5 utilizando la plataforma BlackBerry WebWorks.

Se puede obtener acceso completo a la API de la plataforma a través de wrappers de JavaScript, que puede utilizar para extender la aplicación y tomar ventaja de las características específicas de BlackBerry (por ejemplo, BBM, PIM, los medios de comunicación, hardware), ofreciendo una experiencia integrada para el usuario de BlackBerry .


Desarrollo en Adobe Air

Para desarrollar aplicaciones que corran en BlackBerry tablets, se puede utilizar BlackBerry Tablet OS SDK para Adobe Air, y junto con Adobe ActionScript y Adobe Flex se pueden crear experiencias cutivantes para el usuario.

El SDK provee APIs que extienden ActionScript 3.0 que permiten desarrollar aplicaciones que se asemejan a las desarrolladas para BlackBerry Tablets. Estas API proporcionan algunos de los componentes de interfaz de usuario únicos y skins predefinidos, así como de los listeners para los eventos que son específicos para el sistema operativo BlackBerry Tablet.

Usando la API de Flash, la aplicación también puede acceder a las funciones que son exclusivas de los dispositivos móviles, tales como el acelerómetro y la información de geolocalización.

Desarrollo en C++

BlackBerry Native SDK para Tablet OS es un conjunto de herramientas de desarrollo que le permite aprovechar el poder de la BlackBerry PlayBook.

Combinando la velocidad y estabilidad del sistema operativo en tiempo real QNX Neutrino con el entorno de desarrollo basado en Eclipse Momentics QNX, el SDK nativo está diseñado para desarrolladores que necesitan tener acceso completo a todo lo que la BlackBerry PlayBook tiene para ofrecer.

El SDK nativo le proporciona un conjunto APIs de C y C++ que expone todas las herramientas necesarias para crear aplicaciones potentes y dinámicas.

Las capacidades incluyen:

API nativo del sistema para la pantalla, el navegador, ecualizador, el acelerómetro, la red, etc

Un entorno de compilación que le permite personalizar la configuración del proyecto, del compilador y las opciones de deploy

Una manera de implementar sus aplicaciones a los dispositivos BlackBerry PlayBook reales o al simulador de PlayBook incluido

Un depurador integrado que le permite examinar cada línea de código, mientas es ejecutada

Documentación, tutoriales y ejemplos de código


Ventajas y desventajas de cada lenguaje

SmartphonePlayBook
 HTML5JAVAHTML5AirC++
Complejidad del lenguajeBajoAltoBajoMedioMuy Alto
FlexibilidadBajaAltaBajaMediaMuy Alta
Utilización de estándaresBuenaBajaBuenaBuenaAceptable
RendimientoBuenoMuy BuenoBuenoMuy BuenoAlto
Conexión con dispositivos periféricosSiSiNoNoNo
Integración con Hardware del dispositivoSiSiNoSiSi
Conexión a internetOpcionalOpcionalOpcionalOpcionalOpcional
Almacenamiento localNoSiSiSiSi
Acceso a información de posicionamientoSiSiSiSiSi
Ejecución de tareas en segundo planoSiSiNoNoSi
PortabilidadAltaBajaAltaBaja-
Push NotificationsSiSiNoNoNo
Integración con serviciosMuy simpleComplejoMuy simpleSimpleMuy Complejo
Acceso a base de datosSi (OS 5.0+)SiSiSiSi
EscalabilidadBajaMedioBajaMedioAlta
Disponibilidad de ejemplosAltaMediaAltaMediaBaja
Integración con otras tecnologíasLimitadoMedioLimitadoMedioAlto


Definiciones

Complejidad del lenguaje
Define cuán difícil o intuitivo es desarrollar una aplicación en ese lenguaje, tomando en cuenta tanto la simpleza de la sintaxis como asi también el conocimiento requerido para realizar distintas tareas.

Flexibilidad
Determina cuan permisivo es el lenguaje para poder crear cualquier estilo, apariencia y funcionabilidad. Siendo altamente flexibles aquellos lenguajes que prácticamente no presentan límites ni requisitos que determinen la apariencia y comportamiento, dejando así en manos de los desarrolladores y diseñadores ambas cuestiones. Aun así, se recomienda seguir las buenas prácticas de programación, estándares y consideraciones de diseño para evitar complicaciones y facilitar el uso.

Utilización de estándares
Determina cuan respetados son los estándares de programación por parte del resto de la comunidad. Tomando en cuenta desde los que determinan como se escribe el código (forma de nombrar clases, variables, métodos, utilización de llaves y ubicación de las mismas) hasta las que indican las mejores maneras de proceder para realizar determinadas procesos.

Rendimiento
Define que tan eficiente o efectivo es el código producido, siendo la efectividad la capacidad de alcanzar el efecto deseado y la eficiencia la capacidad de alcanzar dicho efecto con la menor cantidad de recursos posibles. Aun así, el rendimiento está altamente ligado a la habilidad y conocimientos del programador, ya que a pesar de que C++ tiene una alta performance, si se codifica mal o bien no se tiene cuidado se puede generar código mucho menos eficiente que el producido en otros lenguajes.

Conexión con dispositivos periféricos
Describe la posibilidad de integrar el uso de las características del dispositivo BlackBerry, tales como la Cámara de fotos y las funciones del Teléfono. Así mismo, es posible la integración con aplicaciones nativas que se encuentren instaladas en el dispositivo, tales como la Agenda de contactos, el Media player y BlackBerry® Maps.

Integración con Hardware del dispositivo
Determina si las aplicaciones pueden comunicarse con los dispositivos que posean conectividad mediante Bluetooth®, tales como Headsets, Impresoras, Dispositivos de entrada y Transmisores GPS.

Nota: En Air se puede utilizar las ANE (Adobe Native Extensions) y acceder a librerías compiladas con el NDK.

Conexión a internet
Significa que no requieren una conexión a internet para poder ejecutarse ni para obtener sus recursos.

Almacenamiento local
Define la capacidad del leguaje para acceder a los dispositivos de almacenamiento interno del dispositivo (memoria interna y memoria SD).

Nota: Si bien HTML5 no puede utilizar la memoria interna del dispositivo, se puede usar lo que se denomina Storage (Local storage, session storage y database storage).

Acceso a información de posicionamiento
Determina si es posible detectar la ubicación del dispositivo BlackBerry y proporcionar información para esa ubicación. Existen distintos mecanismos para lograrlo, difiriendo en la precisión final de la ubicación conseguida y variando en el consumo de recursos para lograrlo.

Ejecución de tareas en segundo plano
Posibilidad de implementar procesos que se ejecutan en segundo plano, escuchando eventos y/o actualizaciones. Esto permite a los usuarios ejecutar otras funciones mientras la aplicación realiza tareas o ejecuta rutinas que requieran un indeterminado tiempo para finalizar.

Portabilidad
Define la facilidad para portar la aplicación a otras plataformas, determinada por las modificaciones que se requieran. Muchas veces se requiere crear distintas versiones de la aplicación orientadas a soportar las características propias de cada dispositivo.

Nota:Las aplicaciones desarrolladas en C++ no pueden ser portadas a smartphones, debido a que estos no soportan aplicaciones desarrolladas en este lenguaje.

Push notifications
Describe la posibilidad de recibir un request originado del lado del servidor. Cuando haya contenido nuevo, el servidor tiene la capacidad de “empujar” esta información a los dispositivos.

Integración con servicios
Define la complejidad que presenta el lenguaje a la hora de interactuar con servicios web.

Nota:Tanto HTML5 como Air tienen una limitación dada por same origin policy, en el caso de HTML5 esto se puede resolver utilizando JSONP y en Air se puede solucionar mediante el uso de un archivo de cross domain ubicado en el dominio.

Acceso a base de datos
Determina la capacidad de poder acceder y trabajar sobre la base de datos local.

Escalabilidad
Indica la capacidad de ampliación o extensión de las aplicaciones sin perder calidad ni funcionabilidad.

Disponibilidad de ejemplos
Define la facilidad así como también la cantidad de ejemplos disponibles en internet.

Integración con otras tecnologías
Describe la complejidad dada para realizar integraciones con distintas tecnologías como pueden ser realidad aumentada.


Transportes de red

Objetivos

El objetivo principal de este capítulo es cubrir y explicar las diferentes formas que un dispositivo BlackBerry puede utilizar para conectarse a la red. Se explicarán las principales características y beneficios de cada método y cuándo y cómo utilizarlos.

Visión general de transportes de red

Los dispositivos BlackBerry pueden acceder a Internet de distintas maneras:
TCP Celular: Directamente vía el Operador.
WAP: Directamente vía el Operador usando WAP.
TCP WiFi: Directamente vía redes WiFi.
BIS (o MDS público): Vía el Operador, pero a través del Gateway de Internet de RIM.
BES (o MDS): Vía el Operador, pero a través del Gateway empresarial de RIM.
WiFi: Vía BIS o BES a través de una red WiFi.

Tipos de acceso a internet

TCP Celular


- El transporte TCP celular crea una conexión a Internet a través de la puerta de enlace de Internet de un Operador. Este método crea el tipo más directo de conexión que utiliza la radio celular.
- La mayoría de los Operadores configuran los dispositivos BlackBerry del usuario para usar la puerta de enlace de Internet del proveedor. Sin embargo, cuando el usuario se mueve a otra red, este debe configurar el dispositivo manualmente para usar el gateway de Internet en la red del host.
- Si la aplicación utiliza este transporte, debería probarlo con cada Operador.
- Generalmente este transporte genera un costo adicional al usuario, ya que no está contemplado dentro del servicio de datos BlackBerry.


WAP


- El transporte WAP crea una conexión a través de la puerta de enlace WAP del Operador. Se admiten WAP 1.0, 1.2 y 2.0.
- Para soportar este transporte, el usuario o el Operador debe configurar los parámetros de conexión WAP en el dispositivo. Como resultado, este transporte puede que no se admitido en todas las redes inalámbricas o con todos los planes de datos.
- Si la aplicación utiliza este transporte, debería probarlo para cada Operador que puede utilizar la aplicación.
- Para utilizar WAP 2.0, debe recuperar el identificador de conexión del libro de servicio.
- Generalmente este transporte genera un costo adicional al usuario, ya que no está contemplado dentro del servicio de datos BlackBerry.


TCP WiFi


- El transporte WiFi crea una conexión a Internet o a redes privadas, como las de una organización o un hogar. Cuando la radio WiFi está activada, el usuario del dispositivo BlackBerry o una aplicación puede configurar el dispositivo para conectarse a Internet utilizando este transporte.
- Si aplica, el dispositivo puede enviar automáticamente datos a un BlackBerry Enterprise Server o BlackBerry® Internet Service a través de una conexión WiFi. Por ejemplo, si el dispositivo está conectado a una red WiFi y un perfil VPN está configurado para la organización del usuario, el dispositivo intenta conectarse al BlackBerry Enterprise Server a través de la VPN mediante la conexión WiFi porque la transmisión de datos a través de Wi-Fi es generalmente más barata que otros transportes. Este comportamiento se conoce como el enrutamiento de menor costo.


Servicio de internet de BlackBerry (MDS público)


- El transporte BlackBerry Internet Service crea una conexión a Internet a través de la infraestructura de BlackBerry. Los datos que se envían y reciben utilizando este transporte son comprimidos y optimizados para la transmisión en conexiones inalámbricas.
- Las aplicaciones que utilizan el transporte BlackBerry Internet Service automáticamente se benefician por el enrutamiento de menor costo. El dispositivo se conecta a una red WiFi automáticamente, si está disponible.


Servicio empresarial BlackBerry (MDS)


- El transporte de BlackBerry MDS permite a un dispositivo BlackBerry conectarse a su asociado BlackBerry Enterprise Server a través de la infraestructura de BlackBerry o utilizando una conexión WiFi.
- Los datos que se envían y reciben utilizando este transporte son comprimidos y optimizados para la transmisión en conexiones inalámbricas.
- Es posible acceder a destinos privados dentro de la red corporativa.


Tecnología PUSH

Objetivos

El objetivo principal de este capítulo es definir la tecnología Push y describir sus beneficios. Se describirá cómo funcionan las aplicaciones push server-side y se proporcionarán ejemplos de usos en aplicaciones BlackBerry.

Introducción a la tecnología PUSH

Las aplicaciones Push envían el contenido web u otros datos a los dispositivos BlackBerry sin necesidad de intervención del usuario. Estas aplicaciones proporcionan automáticamente la información tan pronto como esté disponible en el lado del servidor, por eso se denomina información “empujada”.

El paradigma PUSH

Una de las características principales de la solución BlackBerry es la tecnología PUSH. El principal objetivo a cumplir es entregar los datos de forma proactiva, haciendo que estos se encuentren listos en el dispositivo cuando el usuario los necesita. Para ello, los datos se entregan tan pronto como estén disponibles, por ejemplo cuando se produjo un evento de interés en el servidor.
Las aplicaciones están siempre escuchando la llegada de datos sin necesidad de que el usuario intervenga para recibirlos. Este se entera de la llegada de nueva información mediante una alerta (reproducir una melodía, vibrar, parpadear, ventana emergente, icono) cuando han sido entregados todos los datos, procesados y listos para ver, provocando la apariencia de cero latencia.
La aplicación no se encuentra solicitando actualizaciones constantemente, sino que simplemente espera a que esta llegue por medio de una solicitud del servidor.
La experiencia del usuario es que el evento acaba de ocurrir, automáticamente, en tiempo real y de forma fiable.

Beneficios

Los beneficios principales de la implementación de aplicaciones que utilizan la tecnología PUSH son:
- Instantaneidad
El usuario recibe la información en el momento que se produce el evento o actualización.
- Eficiencia
La información solo se envía cuando está disponible, evitando que el cliente este solicitando actualizaciones constantemente.
- Latencia reducida
Se reduce el impacto en la red debido a que la aplicación no se encuentra todo el tiempo solicitando información.
- Duración de batería prolongada
El hecho de no estar constante e innecesariamente solicitando actualizaciones tiene un impacto positivo en la duración de la batería. La información es recibida y procesada solo cuando está disponible y el usuario no se preocupa por solicitar actualizaciones.

Flujo básico

1. Proveedor de contenido envía la petición Push
2. Servicio BlackBerry devuelve respuesta, declarando la aceptación o rechazo del mensaje
3. Servicio BlackBerry empuja los datos a los dispositivos asignados en el puerto especifico
4. Dispositivo devuelve respuesta al servicio BlackBerry
6. Proveedor de contenidos devuelve notificación de lectura al servicio BlackBerry


7 BBerries - Comunidad 7BBerries: