Usemos JSON

AJAX es una de las alternativas más comunes para la consulta de datos. Trabajar con javascript me resulta divertido, pero no pienso lo mismo de PHP. Vamos, PHP no es tan divertido cuando tenemos que consultar datos y refrescar la página, porque esta acción requiere mucho más procesamientos y validaciones que si usamos AJAX-PHP-JSON.

“Si tenemos la herramienta perfecta, puedes mover el mundo” decía mi padre y al trabajar con AJAX para consultas, realmente necesitamos pocas herramientas (funciones en todo caso). Primero veamos esa función que hace la magia del lado del usuario:

function xAJAX (app,rqs,fnt,isString)
{
        var xh = (window.XMLHttpRequest) ? new XMLHttpRequest() : new ActiveXObject('Microsoft.XMLHTTP');
 
    	xh.open ('POST',app,true);
    	xh.setRequestHeader ('Content-type','application/x-www-form-urlencoded');
    	xh.onreadystatechange = function ()
    	{ 
    		if(xh.readyState == 4 && xh.status == 200) fnt( (isString) ? xh.responseText : JSON.parse(xh.responseText) );
    	};
 
    	xh.send (rqs);
};

¿Simple, no? Como vemos, a dicha función le debemos pasar cuatro parámetros, así que expliquemos para qué sirven cada uno:

  • app: Es la URL al PHP que hace las consultas a la base de datos.
  • rqs: Son los parámetros que necesitamos consultar, aplicado de la forma común variable1=valor1&variable2=valor2&variable3=valor3…
  • fnt: Una función anónima que se ejecuta luego que los datos solicitados están disponibles.
  • isString: Por su naturaleza PHP devuelve texto (string), pero como la idea de JSON es usarlo a modo de objeto en javascript, necesitamos parcear el texto devuelto. Dentro de la función tenemos “JSON.parse” que se encarga de ese procesamiento, pero si de todos modos necesitamos que la función devuelva texto, tenemos esta variable booleana (true/false). La función xAJAX siempre devolverá un objeto a menos que el usuario defina ese parámetro como true, entonces devolverá texto.

Ahora aplicamos la función en nuestro HTML de prueba:

< !DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="es" xml:lang="es">
<head>
	<title>AJAX - Respuesta Object o String</title>
</head>
<body>
 
	<input type="button" id="btn-object" value="Request Object" />
	<input type="button" id="btn-string" value="Request String" />
 
<script type="text/javascript">
/* < ![CDATA[ */
 
	function xAJAX (app,rqs,fnt,isString)
	{
	        var xh = (window.XMLHttpRequest) ? new XMLHttpRequest() : new ActiveXObject('Microsoft.XMLHTTP');
 
	    	xh.open ('POST',app,true);
	    	xh.setRequestHeader ('Content-type','application/x-www-form-urlencoded');
	    	xh.onreadystatechange = function ()
	    	{ 
	    		if(xh.readyState == 4 && xh.status == 200) fnt( (isString) ? xh.responseText : JSON.parse(xh.responseText) );
	    	};
 
	    	xh.send (rqs);
	};
 
 
	var btObj = document.getElementById('btn-object')
	var btStr = document.getElementById('btn-string');
 
 
	btObj.onclick = function()
	{
		xAJAX ('app.php','exe=objeto&userid=12345',function(resp)
		{
			console.log( resp );
		});
	};
 
	btStr.onclick = function()
	{
		xAJAX ('app.php','exe=texto&userid=12345',function(resp)
		{
			console.log( resp );
		},true);
	};
 
/* ]]> */
</script>
</body>
</html>

Para este ejemplo tenemos a “btObj” que devuelve un objeto y “btStr”, que devuelve un string. Veamos como va la cosa del lado de PHP:

< ?php

$exe = $_POST['exe'];
$userid = $_POST['userid'];

$query = mysql_query( "SELECT nombre,apellido,email,pais,nacionalidad FROM tabla_usuarios WHERE id='$userid' LIMIT 1" );
$queryRow = mysql_fetch_assoc($query);

$nombre = $queryRow['nombre'];
$apellido = $queryRow['apellido'];
$email = $queryRow['email'];
$pais = $queryRow['pais'];
$nacionalidad = $queryRow['nacionalidad'];

if ( $exe == 'objeto' )
{
	$dat = array(
		"nombre" => $nombre,
		"apellido" => $apellido,
		"email" => $email,
		"pais" => $pais,
		"nacionalidad" => $nacionalidad
	);
	echo( json_encode($dat) );
}

if ( $exe == 'texto' )
{
	$dat = $nombre . " || ";
	$dat .= $apellido . " || ";
	$dat .= $email . " || ";
	$dat .= $pais . " || ";
	$dat .= $nacionalidad;
	echo($dat);
}

?>

Primero solicitamos los datos con xAJAX, diciendo a “app.php” que filtre con “exe” qué tipo de dato debe devolver (objeto o texto). A la misma vez paso con “userid” el id que debe consultar en la base de datos. En el caso de “btStr” defino a “isString” como true para que devuelva texto.

Los datos devueltos se imprimen en la consola del navegador (Chrome, Safari, Firefox Firebug, Opera Dragonfly).

¿Verdad que es simple cuando tienes las herramientas perfectas? ;-)


Warning: call_user_func_array() [function.call-user-func-array]: First argument is expected to be a valid callback, 'brunelleschi_rel_cagegory_fix' was given in /home/junihh/public_html/wp-includes/plugin.php on line 170
Posted in
| Tagged , , , | Leave a comment

Preferir librerías de javascript o no: El dilema constante

Bueno, creo que este será uno más de esos tantos artículos sobre si conviene usar librerías de javascript como jQuery, MooTools u otros contra javascript puro, pero quiero dejar público mi opinión sobre el tema.

Se que jQuery y MooTools son las librerías usadas más comúnmente. No puedo dejar de darle crédito al hecho que por ser usado por una enorme comunidad, guardan el gran argumento de las correcciones a bugs y añadidos que permiten el soporte de múltiples navegadores, independientemente al sistema operativo que el usuario tenga.

Otra ventaja argumentativa es la cantidad de plugins disponibles, que aumentan drámaticamente la productividad y en su defecto, la entrega del proyecto. Es razonable puesto que no se hace necesario romperse la cabeza analizando cómo lograr tal o cual efecto si viene dado lo que me interesa lograr… y de gratis en la mayoría de los casos.

Siempre han sido argumentos válidos. Yo mismo he tenido conflictos con ciertas cosas que funcionan en un navegador y en otros no. En este caso tenemos el ejemplo de objeto.innerText, que curiosamente no funciona en el por muchos adorado Firefox (más curioso aún, sí funciona en Explorer 6 y 7). Es un bug que viene de años y Mozilla aún no determina solucionarlo, lo que forza a tener que aplicar objeto.textContent si necesitamos tomar el texto contenido en un objeto.

Razones hay demás para el uso de librerías, ¿pero de verdad son razones válidas? Mi respuesta es NO. Se que suena tajante, pero sin restar importancia a los argumentos mencionados, aprender a escribir javascript y aprender a lidiar con los problemas que presenta toma tiempo. Lo bueno del tiempo es que luego que aprendemos a escribir javascript nos volvemos productivos… aún sin una librería de javascript o plugin.

Vamos, una librería es una colección de funciones corregidas quién sabe qué cantidad de veces para mejorar su performance y/o eliminar errores. Lo mismo pasa con una función escrita en javascript puro. Si escribo una función que haga un efecto en particular, al reutlizar la misma función en otro proyecto quizás encuentre un error o se me ocurra otra alternativa para mejorarlo. Mientras más lo uso mejor… y es la misma función.

Pero no hablemos mucho, mejor un ejemplo. Imaginemos que tengo un grupo de fotografías en una página con la clase “.foto” y necesito que estas se disuelvan a 30% cuando se cargue la página. Escribimos algo así:

$(document).ready(function () 
{
  	$(".foto").fadeTo(1, 0.3);
});

Pero sólo necesito que haga tal efecto, no necesito nada más de jQuery. Es un problema, porque la versión minimizada pesa 94KB, cosa irracional a mi parecer si sólo necesito el efecto de desvanecimiento. Bueno, existen otras librerías más pequeñas como Zepto.js y XUI, pero aún así no nos permiten cosas puntuales, sino que hay que cargar todo lo que la librería ofrece.

Ese es mi tema, usar cosas puntuales para lo que necesitamos en lugar de cargar TODA UNA LIBRERIA. No olvidemos que una librería tiene X peso en KBs y si añadimos un plugin, este se suma al peso de la librería. Preferiría aplicar lo siguiente:

function trns (ob,tr)
{
	ob.style.MozOpacity = (tr / 100);
	ob.style.KhtmlOpacity = (tr / 100);
	ob.style.opacity = (tr / 100);
	ob.style.filter = 'progid:DXImageTransform.Microsoft.Alpha(opacity=' + tr + ')';
	ob.style.filter = 'alpha(opacity=' + tr + ')';
	ob.style.zoom = 1;
};
 
function fadeOutClass (clase,porciento)
{
	var obAll = document.getElementsByTagName('*'), vlInt = 8, vlFX = 10, porciento = Number(porciento);
 
	for (var x = 0, c = obAll.length; x < c; x++)
	{
		if (String(obAll[x].className).indexOf(clase) != -1) fx( obAll[x] );
	};
 
	function fx (ob)
	{
		var trns = 100, int;
		xTrns(ob,trns);
 
		int = setInterval(function()
        	{
        		if (trns < porciento)
        		{
        			clearInterval(int);
        			xTrns(ob,porciento);
        		} else
        		{
        			ob.trns += (0 - trns) / vlFX;
        			xTrns(ob,trns);
        		};
        	}, vlInt);
	};
};
 
fadeOutClass('foto',30);

Listo, hace lo que necesito y es extramadamente ligero, saltándose los exagerados 94KB de toda la librería de jQuery.

Otro tema que he notado de amigos desarrolladores que usan librerías de javascript es que sólo saben escribir basados en ellas y no conocen lo que está debajo. Me parece curioso que no sepan escribir algo que de hecho escriben, pero la justificación es obvia debido a que jQuery es un lenguaje de programación en sí mismo, como lo es Ruby on Rails, aquella famosa librería para Ruby que esconde todo lo “feo” o lo que el lenguaje básico no hace.

Mi sugerencia: Está bien que escribas basado en jQuery, quizás te pueda parecer más productivo y sacar tu proyecto a tiempo, pero date tiempo de aprender lo que está debajo de la librería para tener más control de lo que haces y no verte forzado a depender de lo que otros hagan (plugins), sin recibir a cambio el soporte técnico en caso de dificultad. Al final sales ganando.

De todos modos una pregunta de cierre: ¿Cuál es la belleza o romanticismo de escribir código si no lo escribes tú? Yo prefiero escribir mis funciones y código propio porque es lo que disfruto de mi trabajo. Espero no incluir jQuery u otras librerías entre mis recursos de trabajo.


Warning: call_user_func_array() [function.call-user-func-array]: First argument is expected to be a valid callback, 'brunelleschi_rel_cagegory_fix' was given in /home/junihh/public_html/wp-includes/plugin.php on line 170
Posted in
| Tagged , , , , | 2 Comments

Películas en Mac: Lo que necesitas

Si eres fanático de las películas como yo y gustas disfrutarlas en tu Mac, acá te dejo las utilidades que necesitas para tener una mejor experiencia de usuario y pasar cómodamente el momento. Hablemos de las utilidades que uso para mejorar el volumen del sonido, controlar el equipo desde la silla sin tocar el teclado y mi reproductor favorito.

Mira

Si eres un afortunado que dispone de un Apple Remote, alguna vez te habrás preguntado cómo poder personalizar los botones. Por defecto, los botones de izquierda y derecha sólo permiten saltar a la siguiente película o la anterior en la lista de reproducción, lo que resulta molesto comparado con los mandos de TV.

Con Mira podemos personalizar el Remote por aplicación. Esto es ventajoso, porque el comando de avanzar o retroceder la película en VLC no es igual que en MPlayerX o iTunes, así que podemos reemplazar esos molestos comandos de siguiente-anterior, por avanzar-retroceder 10 segundos o cualquier otro. Esta utilidad trae un amplio catálogo de comandos predefinidos, pero también incluye una herramienta para escribir la combinación de teclas que necesitamos.

Desde que instalamos la utilidad encontramos un buen listado de aplicaciones comunes, pero podemos agregar más como MPlayerX en mi caso. Además de los botones siguiente-anterior y pausa-correr, podemos personalizar el botón MENU y subir-bajar. Estos últimos los tengo para subir y bajar el volumen, aunque a menú no le tengo nada asignado.

Más info: Twisted Melon

MPlayerX

En el renglón de reproductores de video en diferentes formatos en Mac sólo podemos contar dos: VLC y MPlayerX. Realmente existen muchos más, pero pienso que de todos estos son los mejores.

Durante mucho tiempo preferí VLC. Soporta muchos formatos entre los que se cuentan los RMVB, muy comunes para películas compartidas en Megaupload y otros por su alto nivel de comprensión del video con mínimos daños en la calidad de la imagen. Lamentablemente VLC es un PESIMO reproductor de ese formato y no sería para menos, porque quien haya visto alguna vez películas stop-motion, comparará estas con la forma como se ven los vídeos… aunque estos no sean stop-motion.

Las cosas cambiaron con el advenimiento de la Mac App Store. Poco más de dos meses después de su lanzamiento el desarrollador de MPlayer reescribió su software y mejoró hasta tal punto que a mi modo de ver se convirtió en el mejor reproductor de su tipo. Las películas en RMVB se reproducen con el mismo frame-rate que cualquier otra película en AVI, MP4, MKV u otra.

Incluye un buen manejador de colores, ecualizador, buen manejo del mouse para controlar el volumen del sonido, subtítulos y una interface muy elegante similar a QuickTime X. Lo único que odio de ese reproductor es la falta de un listado de reproducción similar al de VLC. El método que usa para reproducir múltiples películas (como en los casos que constan más de una parte) es arrastrando estos al ícono en el Dock mientras MPlayerX está abierto. Es un disparate ese método, pero es la única alternativa disponible hasta que el desarrollador integre una ventana para listados más acabado.

Más info: Niltsh

Boom

Muchos usuarios ven películas online en sus navegadores, refiriéndome específicamente a Megavideo, Cuevana y otros servicios en los que los usuarios comparten las películas. Personalmente no gustaba de esos servicios por las limitaciones que aplican y el no poder controlar la reproducción con mi Apple Remote y Mira. Como cosas de la vida llegó Netflix a latinoamérica con su enorme catálogo de películas, disponible las 24 horas del día al módico precio de US$7.99 mensual (RD$342.77). Esa oferta era irrechazable, especialmente porque me ofrecían el primer mes completamente gratis para probar el servicio.

Durante ese mes quedé enganchado y con él dejé a un lado la opinión de no ver películas en el navegador. No me quedaba otra alternativa, ya que no cuento con algún otros dispositivo de reproducción donde esté disponible Netflix aparte al navegador. Pero con la reproducción online se vino otro problema muy común: El volumen del audio puede ser muy bajo o en ciertas escenas el volumen es muy bajo pese a que el volumen de la Mac esté al máximo. Con la reproducción local no es problema, porque no es más que alterar un poco el ecualizador y listo, pero con las películas a través del navegador es “casi” imposible hacer algo.

Pero léase “casi”. Conocí a Boom, por el momento el único “booster” de sonido para Mac, aunque para Windows abundan. Al lanzarlo agrega un pequeño ícono en el top-bar con un barra para controlar el nivel del sonido. Advierto que el efecto del volumen es muy efectivo, tanto que podríamos dañar las bocinas si usamos la utilidad al máximo con mucha frecuencia. Cuando lo uso me aseguro de tener el volumen de la Mac al máximo y a Boom a no más de un 30%, pero no necesitan más allí para ver la película.

Cuando abrimos la ventana de la utilidad vemos que nos ofrece un ecualizador. Trae algunos perfiles como Movie, Music, Vocals, entre otros, pero podemos personalizar a gusto. También nos permite hacer boosting a archivos de audio y vídeos, pero la verdad no es de mi agrado, prefiero controlar el nivel del volumen o calidad del sonido con el ecualizador de iTunes o MPlayerX.

Más info: Global Delight Technologies Pvt. Ltd

Otras utilidades

No quiero dejar de mencionar otras utilidades que no deben faltar en tu Mac:

Perian: Es un extra para QuickTime buy popular. Permite reproducir en el QuickTime Player o en el Finder formatos que por si mismo QuickTime no soporta, como AVI, DIVX o FLV. Es bueno tenerlo porque podemos disponer de una prevista de la película, sin necesidad de abrir nuestro reproductor de películas favorito.

HandBrake: Creo que uno de los mejores (sino el mejor) convertidor de videos y ripeador de DVD’s que podemos contar en Mac. Es un infaltable, especialmente para aquellos que tienen iPod o iPhone.

Kigo Video Converter: Otro convertidor de videos, pero con un más amplio catálogo de formatos que HandBrake. Es el mejor convertidor de RMVB y WMV a otros formatos en Mac, pero para esto necesita la ayuda de un codec basado en MPlayer que instalamos adicionalmente.

Adapter: Otro convertidor en formatos muy variados, pero con la salvedad de poder descargar videos de YouTube y poder guardarlos en otros formatos o exportar el audio de estos.

NOTA FINAL: Mira y Boom son utilidades de pago, pero luego de usarlos por buen tiempo puedo afirmar que valen cada centavo que cuestan, así que eso no sea una limitante. Ambos ofrecen períodos de prueba. En el caso de Boom pueden descargarlo de acá para aprovechar el período de 10 días.


Warning: call_user_func_array() [function.call-user-func-array]: First argument is expected to be a valid callback, 'brunelleschi_rel_cagegory_fix' was given in /home/junihh/public_html/wp-includes/plugin.php on line 170
Posted in
| Tagged , , , , , , , , , , , , , | Comments Off

Capturar las variables pasadas por url con javascript

No gusto de pasar variables con datos importantes por el location bar por razones de seguridad, pero trabajando en un proyecto, me tocó el caso que debía usar javascript en lugar de PHP para capturar las variables enviadas. Hasta ese momento no había necesitado del efecto, así que busqué -infructuosamente- el cómo hacerlo. Los ejemplos que encontré me resultaban inútiles, porque eran muy específicos para los casos estudiados. Acá mi versión de cómo capturar tales parámetros.

Veamos el siguiente ejemplo:

http://junihh.com/?usuario=junihh&nacionalidad=dominicano

El ejemplo consta de sólo dos variables, pero en la forma como lo parcearemos podremos leer cuantos parámetros se pasen, similar a como funciona GET de PHP. Necesitamos tomar el valor de “usuario”, así que lo guardamos en una variable llamada “vr”. Luego tomamos la url del location bar y de esta sólo los parámetros pasados, que inician a partir de “?”.

var vr = 'usuario'; /* parámetro que se necesita */
var src = String( window.location.href ).split('?')[1];

Luego guardamos los parámetros en un array, tomando como referencia el símbolo “&” que se usa para concatenar cada variable de la cadena:

var vrs = src.split('&');

A partir de este punto ya todo el proceso será más simple. Ahora necesitamos iterar entre cada objeto de “vrs” por la variable que se necesita (vr). En este ejemplo usaremos el bucle “for” y en cada lapso nos aseguramos de revisar que existe un pedazo de texto similar al nombre de la variable que buscamos (“usuario”):

for (var x = 0, c = vrs.length; x < c; x++) 
{
        if (vrs[x].indexOf(vr) != -1)
        {
        	return decodeURI( vrs[x].split('=')[1] );
        	break;
        };
};

Si se encuentra tal parámetro, se detiene el for y devuelve el valor buscado. Ahora organicemos todo como una función para poder aplicarlo más fácilmente a nuestros proyectos:

function locationVars (vr)
{
        var src = String( window.location.href ).split('?')[1];
        var vrs = src.split('&');
 
        for (var x = 0, c = vrs.length; x < c; x++) 
        {
        	if (vrs[x].indexOf(vr) != -1)
        	{
        		return decodeURI( vrs[x].split('=')[1] );
        		break;
        	};
        };
};

Entonces lo probamos:

console.log( locationVars('usuario') ); /* devuelve: junihh */
console.log( locationVars('nacionalidad') ); /* devuelve: dominicano */

Listo. Puede ser servido frío y con mucho aderezo. ;-)


Warning: call_user_func_array() [function.call-user-func-array]: First argument is expected to be a valid callback, 'brunelleschi_rel_cagegory_fix' was given in /home/junihh/public_html/wp-includes/plugin.php on line 170
Posted in
| Tagged , , , , | 7 Comments

Finalmente Adobe cancela Flash para móviles

En un movimiento que para muchos no fué novedad, finalmente Adobe acepta lo que se veía desde un principio: Flash no es para móviles.

La razón más que justificada porque aún en modelos Android, quienes se jactan de tener Flash, el uso de recursos del equipo es alto. Steve Jobs nunca aceptó Flash, pero Adobe insistía en el mismo tema, martillando y martillando… hasta verse de frente a la verdad: NO, Flash no es para móviles. Vamos, si para desktop consume muchos recursos, qué se puede esperar para móviles.

El problema con el plugin de Flash es el arrastre y soporte de todas las versiones anteriores. Miremos como referencia que mientras el instalador del plugin de la versión 5 pesaba menos de 2MB, el de la versión 11.0.1.152 (la actual) pesa unos paquidérmicos 14MB. Como sabrán, los instaladores comprimen el software y habitualmente el software instalado pesa el doble de su instalador.

Adobe no tenía otra alternativa. El mercado iOS es demasiado amplio y se le ha hecho más que claro que no podrá entrar en él a menos que se mueva a HTML5. De esa encrucijada el lanzamiento de Adobe Edge. Más reciente tenemos la compra de PhoneGap, uno de los frameworks de desarrollo para móviles más importantes.

Flash es un producto que no se renueva. Se hace cada vez más viejo y cubre los mismos requerimientos que ya encontramos con AJAX, CSS3 y HTML5.

Flash tiene sus días contados. Adobe no lo reconoce, no lo quiere reconocer, pero el mercado le chocará en sus narices tal como en el caso de los móviles. Sólo toca esperar con suficiente paciencia, porque con los millones que invierten en desarrollo y publicidad, lamentablemente todavía dará batalla.

Según explican en su blog, relegarán Flash para aplicaciones basadas en Adobe Air y el plugin sólo para desktop. Me pareció cómico leer el titular del anuncio diciendo “… contribuye agresivamente a HTML”. Claro que deben contribuir agresivamente, si no lo hacen pierden su mercado… agresivamente.


Warning: call_user_func_array() [function.call-user-func-array]: First argument is expected to be a valid callback, 'brunelleschi_rel_cagegory_fix' was given in /home/junihh/public_html/wp-includes/plugin.php on line 170
Posted in
| Tagged , , , | Comments Off

Mi Magic Mouse se desconecta – Solución

Recientemente he notado que mi Magic Mouse pierde la conexión inexplicablemente, aunque éste se encuentre muy cerca de la Mac y la batería tenga carga de más del 50%.

Pues como así de inexplicable es que se desconecte el mouse, algo más inexplicable sucedió mientras jugaba: Se volvió a desconectar el Magic Mouse sin ningún tipo de respuesta, aunque le reemplacé las baterías por otras cargadas al 100%.

Bajo la situación no quedó más remedio que buscar en la gaveta de aparatos “arrumbados” por mi viejo mouse retráctil y tratar de localizar alguna respuesta en los foros de Apple. Una solución fué resetear el PRam (Option+Command+P+R al reiniciar la Mac) y luego probar corregir permisos en recovery mode de Lion (Command+R al reiniciar la Mac).

Ninguno me funcionó y otras muchas de soluciones recomendaban llevar el Magic Mouse a un Apple Store, pero como sabrán en República Dominicana no existen tales establecimientos. Volví a investigar un poco más y encontré la pregunta de alguien que pasó por la misma situación que yo. Una de las respuestas le recomendaba lo siguiente:

  • Ir a Mi-Disco-Duro > Library > Preferences y localizar el archivo com.apple.bluetoot.plist.
  • Borrar dicho archivo y reiniciar la Mac para que el sistema lo vuelva a crear forzosamente.
  • Ir a System Preferences > Bluetooth Panel, seleccionar el mouse y eliminarlo de la lista .
  • Si el Bluetooth Panel reconoció el mouse antes de borrarlo, de todos modos borrarlo, para garantizar que al parearse se genere un nuevo ID.
  • Marcar el Magic Mouse como “favorite”.
  • Listo.

Me sorprendió lo simple de la solución. Espero que si te encuentras en una situación similar a la descrita, este artículo te sirva de ayuda. Suerte.


Warning: call_user_func_array() [function.call-user-func-array]: First argument is expected to be a valid callback, 'brunelleschi_rel_cagegory_fix' was given in /home/junihh/public_html/wp-includes/plugin.php on line 170
Posted in
| Tagged , , , , , , , | Comments Off

El chasco entre BlackBerry e iClod

Muchos esperabamos a iCloud, el servicio de sincronización en la nube de Apple. Junto con él, una serie de novedades que de primera vista me parecieron más que suficientes para sustituir la sincronización de mis contactos con Google y pasarlos a iCloud.

La sincronización inicial fué llana, pudiendo así tener mis contactos de la oficina junto con los personales en la misma cuenta. iCloud, aunque ofrece lo mismo que ya tenía con Google, me permitía sincronizar también iCal, cosa que por el momento no era posible con la sincronización de Google que sólo soporta los contactos y no el calendario.

Todo bien. Como uso BlackBerry y tengo por costumbre sincronizar y hacer backup semanalmente, aproveché que activé iCloud para darle una buena revisión a la gran cantidad de contactos, apliqué “machete” a buena cantidad de estos con los que no me trataba desde bastante. Luego de actualizar también el BlackBerry Desktop que tenía una versión adelantada ya disponible, pongo a que el BlackBerry Desktop reemplace los contactos del aparato por los que están en la computadora.

Al final, noté que no tenía ni un sólo contacto en el Calendar del BlackBerry. No voy a entrar en detalles sobre las palabras agrias que dije contra el BlackBerry Desktop. Cuando me calmé un poco luego de tratar de poner los contactos en el móvil 5 veces más sin éxito, decidí probar con Missing Sync for BlackBerry.

Lamentablemente con Missing Sync for BlackBerry tuve el mismo resultado que con BlackBerry Desktop, pero como Missing Sync es una utilidad de pago, aproveché y busqué posibles soluciones en su sección de soporte y encontré que la razón de la falta de sincronización es el formato de la base de datos de contactos que ahora usa una copia de iCloud. Address Book lo puede leer y hacer cambios, pero ya no usa el sistema de sincronización anterior, por lo que los programas existentes no pueden sincronizar los contactos.

Cambiar el formato de archivos estándar por parte de Apple me parece una medida extrema, pero como siempre he dicho, es su vaina y hacen lo que les peguen en ganas.

Para volver a tener mis contactos sincronizados con la nube, no me quedó más remedio que cancelar la sincronización de contactos con iCloud y reactivar la sincronización con Google. Por cierto, olvidé mencionar que al activar iCloud, este obliga cancelar la sincronización con Google.

El siguiente paso fué activar en el BlackBerry la sincronización de contactos y calendario a través de “Email Settings”, para que la sincronización sea OTA. Toca ahora esperar que RIM adapte a BlackBerry Desktop o Mark/Space a Missing Sync for BlackBerry.


Warning: call_user_func_array() [function.call-user-func-array]: First argument is expected to be a valid callback, 'brunelleschi_rel_cagegory_fix' was given in /home/junihh/public_html/wp-includes/plugin.php on line 170
Posted in
| Tagged , , , , , , , , , , | Comments Off

BlackBerry: El smartphone sin identidad

En el día de ayer RIM anunció a BlackBerry BBX, que según ellos combina lo mejor de BlackBerry y QNX, el OS para su BlackBerry Playbook. Todo bien, pero con esto hablamos de 3 sistemas operativos móviles ofertados al mismo tiempo por un solo fabricante.

Hace pocos meses RIM presentó el “tan esperado” BlackBerry 7, que a la larga no fué más que un simple theme con algunas mejoras del BlackBerry 6… que a la vez también es un theme del BlackBerry 5. Ese es precisamente mi punto, ¿cómo una empresa “madura” ha sabido ser tan inconsistente con tantos OS’s? Creo que precisamente esa situación es lo que ha llevado a RIM a estar en la cuerda floja económica por la que actualmente atraviesa, claro, además de mal manejo administrativo y estratégico.

Comparado con otros OS mobiles, BlackBerry ciertamente es un atraso. Aparte a elegancia y conectividad online, muchos usuarios buscan un OS simple de usar, cosa que irremediablemente BBOS no ofrece. RIM lo entendió así y luego de comprar QNX el año pasado y someterlo a rediseño, presentó un producto (BlackBerry Playbook) que realmente podía competir contra los demás.

Muchos entendíamos que los siguientes modelos a lanzar vendrían con QNX, pero saltan con la estupidez de presentar el atrasado BlackBerry 7.

Hace 4 años atrás el fuerte más importante de BlackBerry era la conectividad. Poder leer tus correos o navegar internet era un pro. Aunque existían otros móviles con capacidades similares, BlackBerry seguía siendo el rey… hasta que Apple lanzó el iPhone. Conectividad, correos, música, tres pros que hicieron tambalear la economía de RIM, quien vió sus ventas decrecer.

Ya está bueno de tantas majaderías. Aún no le veo sentido a la estratégia de lanzar nuevos OS’s si BlackBerry ya tenía QNX. Debieron enfocar todos los nuevos productos a ese sistema operativo. Deben adaptar QNX a smartphones y no sólo para tabletas y enfocarse en precios que sean más atractivos para los clientes. Está difícil que RIM recupere su mercado si no reduce los precios de sus modelos y redefine el OS que incluirán sus smartphones y es aún más difícil si pretenden enfocar QNX a sólo tabletas.

Cierto, las tabletas han solucionado un nicho. Muchos fabricantes quieren sacar sus modelos y de allí la aparición del Play Book, pero si el fuerte de RIM es un modelo móvil capaz de leer correos y navegación y además con precios económicos en sus planes, ¿por qué cometer la estupidez de pretender entrar a un mercado que sabes no puedes competir? Baja los precios de los equipos, mejora el BlackBerry OS, mejora el diseño de los modelos, introduce novedades que den valor al producto y olvidate de la competencia. Crea valores que pueden interesar al cliente común, no te enfoques en qué está haciendo la competencia y pretendas emularlo. Esa es la belleza del éxito de Apple.

Espero que a partir de este BBX finalmente la empresa lleve ese enfoque. Ya está bueno de tantas estupideces que a la larga confunden al usuario que busca un smartphone. Tantos tipos de modelos-os’s sólo provoca buscar modelos de la competencia que están claramente más definidos, como iOS y Android.


Warning: call_user_func_array() [function.call-user-func-array]: First argument is expected to be a valid callback, 'brunelleschi_rel_cagegory_fix' was given in /home/junihh/public_html/wp-includes/plugin.php on line 170
Posted in
| Tagged , , , , , , , , | 1 Comment