domingo, 24 de febrero de 2013

HTC One, el fracaso de un gran smartphone

HTC One

La semana pasada HTC presentó el nuevo HTC One, un smartphone con unas características técnicas impresionantes.

  • Pantalla: 4.7" Super LCD 3 - 1080p (468ppp) - Gorilla Glass 2.
  • Procesador: Qualcomm Snapdragon 600 - 4 núcleos Krait - 1.7 GHz.
  • GPU: Adreno 320.
  • RAM: 2 GB.
  • Batería: 2.300 mAh. (no reemplazable)
  • SO: Android 4.1.2 Jelly Bean.
  • Cámara: 13 Ultrapíxeles + vídeo 1080p.
  • Sonido: Beats Audio + BoomSound (2 altavoces stereo con amplificador).
  • Capacidades: 32Gb y 64Gb. Sin ranura MicroSD.
  • Colores: blanco y negro.
  • Puerto: MicroUSB.
  • Otros: Sensor IR .

Predecir que este maravilloso smartphone va a ser un sonoro fracaso de HTC quizás sea muy presuntuoso por mi parte, pero tengo mis razones. Tiene algunas pegas como que no pueda sustituirse la batería o que carezca de ranura para tarjetas Micro SD, pero esos no son motivos para decir que va a fracasar. Muchos otros smartphones tienen esos mismos defectos. ¿Entonces en que me baso para decir que el HTC One no será un superventas como el Samsung Galaxy S3? El principal motivo es que HTC aun no ha entendido que la atención al cliente no se acaba cuando se vende el terminal. Ahora me explico...

HTC One

Antecedentes

Corría el año 2010 cuando HTC presentó su nuevo buque insignia: el HTC Desire. Se trataba de un fantástico smartphone que compartía hardware con el Google Nexus One (también fabricado por HTC). En aquella época Android estaba en pañales y hablar de Android era lo mismo que hacerlo de HTC. La marca ya tenía experiencia con Android tras el lanzamiento del HTC Magic y el HTC Dream un año antes y estaba preparada para liderar el mercado de los smartphones con Android. Y lo consiguió.

A muchos, entre los que me incluyo, nos sedujo ese terminal para preferirlo incluso frente al Nexus One, el teléfono Android de referencia del momento. Por aquel entonces sacar del bolsillo un Desire era sentirse envidiado por muchos. Pero hubo un problema: Android fue evolucionando y mejorando y HTC fue sacando nuevos smartphones mientras se olvidaba de actualizar los antiguos.

HTC Desire

El HTC Desire salió al mercado con Android 2.1 Eclair. Pronto apareció Android 2.2 Froyo y HTC actualizó los Desire... y ahí se acabó la cosa. Google fue sacando nuevas versiones de Android: 2.3, 4.0, ... y los propietarios de los HTC veíamos como nuestro maravilloso teléfono se quedaba congelado. Al principio HTC anunció que actualizaría los Desire a Android 2.3 Gingerbread. Luego anunció que no los actualizaría. Por fin tras una enorme campaña de presión por parte de de los usuarios en las redes sociales, volvió a anunciar que lo actualizaría... pero lo hizo deprisa y mal, sacando una versión plagada de fallos que había que instalar manualmente, perdiendo en el proceso todos los datos del móvil. Un desastre.

Pero no acaba ahí la cosa. Menos de un año después de la salida al mercado del Desire, HTC presentó dos nuevas versiones vitaminadas: El HTC Desire HD (con pantalla más grande) y el HTC Desire Z (con teclado físico). Junto con ellos presentó un nuevo servicio llamado HTCSense.com que pretendía conectar los smartphones de HTC con la nube. Ahora tenemos multitud de servicios similares como Google Drive o Dropbox, pero en aquel tiempo era toda una novedad. Pero HTCSense.com salió sólo con soporte para los nuevos terminales Desire Z y HD, olvidándose completamente del que había sido buque insignia tan solo unos meses antes.

Desde entonces han salido el HTC Sensations, los HTC Wildfire (varias versiones), la gama HTC One del año pasado (One X, One S, One V) y por fin el nuevísimo HTC One. Pero HTC ha seguido olvidándose de sus usuarios. Sin embargo los usuarios no olvidamos.

Conclusiones

Hay usuarios que año tras año se cambian el smartphone, adquiriendo siempre lo último del mercado: ya sea el último iPhone, Galaxy o otro. A ellos quizás no les afecte la pésima política de actualizaciones de HTC. Sin embargo la mayoría de usuarios cambian de móvil cada dos o tres años. Unos gracias a las campañas de las compañías telefónicas como los programas de puntos o simplemente cambiado de compañía; otros se lo compran libre. A ellos, entre los que de nuevo me incluyo, sí nos afecta esa política y por ello muchos de los anteriores usuarios de HTC se están pasando a otras marcas como Samsung que tiene una política de actualizaciones mucho más amplia. En mi caso hace un par de meses cambié mi desfasado HTC Desire por un genial Samsung Galaxy S3. El HTC One X no tenía nada que envidiar al SGS3 en cuanto a hardware y software, pero yo ni lo consideré.

HTC... ¡No gracias!

Enlaces

miércoles, 20 de febrero de 2013

PHP Avanzado: Namespaces y funciones anónimas

PHP Tanto los namespaces como las funciones anónimas fueron novedades de PHP 5.3. En este artículo explicaré un poco que son ambas cosas, incluyendo ejemplos de uso.


Funciones anónimas en PHP:

Las funciones anónimas, también llamadas closures, son funciones sin nombre que normalmente se utilizan para crear callbacks de forma sencilla. Son ampliamente usadas en otros lenguajes como Javascript, pero PHP no las ha implementado hasta la versión 5.3. Las funciones anónimas pueden asignarse a una variable, pasarse como parámetro de otra función o ser retornadas.

$strlen = function($str) {
    return strlen($str);
}
echo $strlen('Hola Mundo');

Para que una función anónima pueda heredar las variables del padre debe usarse la palabra clave "use" con la siguiente sintaxis:

$strings = array('Hola ', 'Mundo');
$concat = null;

// Imprime "10" (el resultado de la función anónima)
echo function() use($strings, &$concat) {
    $result = 0;
    $concat = '';
    foreach($strings as $string) {
        $result += strlen($string);
        $concat .= $string;
    }
    return $result;
};

// Imprime "Hola Mundo" (lo ha cargado la función anónima)
echo $concat;

Namespaces en PHP:

Según la Wikipedia, un namespace (o "espacio de nombres") es "es un contenedor abstracto en el que un grupo de uno o más identificadores únicos pueden existir". Esto quiere decir que un identificador es único dentro del espacio de nombres, pero el mismo identificador puede existir en varios espacios de nombres. En la práctica, los namespaces se utilizan para estructurar mejor el código fuente de la aplicación.

En PHP los espacios de nombres se diseñaron para disponer de una forma de agrupar clases, interfaces, funciones y constantes relacionadas bajo un mismo nombre, manteniendo nombres comprensibles para los distintos elementos. De esta manera los diseñadores de librerías reusables evitan tener que usar nombres extra largos para diferenciar sus clases/interfaces/funciones/constantes de otras de terceros. Entre otras ventajas esto mejora la legibilidad del código fuente.

Como declarar espacios de nombres:

Para declarar un espacio de nombre se usa la palabra clave namespace. Esta sentencia debe ser la primera del archivo. Las únicas sentencias válidas antes de namespace son sentencias de tipo declare.

<?php
    namespace MiNombre;
?>

Dentro de un namespace puede incluirse una jerarquía de niveles, similar a una estructura de directorios. Las diferentes jerarquías de los espacios de nombres de separan con la barra invertida "\":

<?php
    namespace Empresa\Proyecto\Componente;
?>

Como curiosidad, en PHP se puede definir el mismo espacio de nombres en distintos archivos, cosa que no suele estar permitida en otros lenguajes. También se puede declarar más de un namespace en el mismo archivo, aunque está totalmente desaconsejado.

Como usar los espacios de nombres:

Para usar un identificador declarado en un espacio de nombres desde fuera del namespace (por ejemplo una clase) hay que usar la jerarquía completa, comenzando por la barra invertida. A esto se le llama nombre completamente cualificado. También se pueden usar nombres relativos al namespace actual, de forma análoga al sistema de archivos de una PC que está formado por directorios, subdirectorios y archivos. Por ejemplo supongamos que tenemos definida la clase "Clase" en el espacio de nombres "Empresa\Proyecto\Componente". La forma de crear un objeto de esa clase sería:

namespace {
    $class = new \Empresa\Proyecto\Componente\Clase();
}

namespace Empresa {
    $class = new Proyecto\Componente\Clase();
}

namespace Empresa\Proyecto {
    $class = new Componente\Clase();
}

namespace Empresa\Proyecto\Componente {
    $class = new Clase();
}

Para acceder a cualquier clase, función o constante globales (esto es: definidas fuera de cualquier espacio de nombres), se puede usar un nombre completamente cualificado empezando por la barra invertida. Por ejemplo:

namespace Proyecto {
    class String {
        private $str;
        // (...)
        public function strlen() {
            return \strlen($str);
        }
    }
}

Otra forma de acceder a los identificadores de un namespace es a través de la palabra clave "use", la cual permite "importar" los identificadores de un espacio de nombres sobre el namespace actual. Sería algo similar al establecimiento de un enlace simbólico con otro espacio de nombres. La palabra clave use también permite definir un alias sobre un nombre de clase o interfaz.

namespace Empresa\Proyecto1 {
    class Clase {
        // (...)
    }
}

namespace Empresa\Proyecto2 {

    // Importa el namespace completo.
    use Empresa\Proyecto1;

    // Crea un objeto de clase \Empresa\Proyecto1\Clase
    $clase = new Proyecto1\Clase();
}

namespace Empresa\Proyecto3 {

    // Importa sólo una clase y le asigna un alias
    use Empresa\Proyecto1\Clase as Clase1;

    // Crea un objeto de clase \Empresa\Proyecto1\Clase
    $clase = new Clase1();
}

Para resolver ambigüedades a la hora de acceder a un identificador del espacio de nombres propio cuando existen otros identificadores iguales importados de otros namespaces se puede usar la palabra clave "namespace":

namespace Empresa\Proyecto1 {
    class Clase {
        // (...)
    }
}

namespace Empresa\Proyecto2 {
    use Empresa\Proyecto1\Clase;

    class Clase {
        // (...)
    }

    // Crea un objeto de clase \Empresa\Proyecto1\Clase
    $clase1 = new Clase();

    // Crea un objeto de clase \Empresa\Proyecto2\Clase
    $clase1 = new namespace\Clase();
}

Enlaces y referencias:

lunes, 18 de febrero de 2013

Bases de datos: PostgreSQL

PostgreSQL PostgreSQL, o simplemente Postgres, es una base de datos relacional y orientada a objetos de código abierto y es una alternativa a MySQL en el desarrollo de proyectos web. Según sus desarrolladores es el sistema de gestión de bases de datos de código abierto más potente del mercado y en sus últimas versiones no tiene nada que envidiarle a otras bases de datos comerciales como Oracle o DB2.

PostgreSQL, que tiene versiones tanto para Windows como para Linux y Unix, utiliza un modelo cliente/servidor y usa multiprocesos para garantizar la estabilidad del sistema, de forma que un fallo en uno de los procesos no afecte al resto y el sistema continúe funcionando. Sus puntos fuertes son: estabilidad, potencia, robustez, facilidad de administración e implementación de estándares.


Caracterísicas:

Podríamos definir PostgreSQL como una base de datos Objeto-Relacional, ya que incorpora características tanto de las bases de datos orientadas a objetos como de las relacionales. Sus características más importantes son:

  • Integridad transaccional.
  • Integridad referencial (claves foráneas).
  • Extensibilidad de tipos de datos. Soporta de forma nativa gran cantidad de tipos de datos y permite definir nuevos.
  • Control de acceso multi-versión (MVCC), que permite que un proceso acceda a una tabla mientras otro la sobreescribe, sin necesidad de bloqueos.
  • Soporte completo al lenguaje SQL.
  • Restricciones (constraints).
  • Disparadores (triggers).
  • Reglas (rules).
  • Funciones/procedimientos almacenados (stored procedures).
  • Lenguaje de programacion PL/pgSQL (similar al PL/SQL de Oracle).
  • Numerosas APIs para programar en C/C++, Java, .Net, Python, Ruby, etc.
  • Soporte a juegos de caracteres internacionales.
  • Licencia BSD (código abierto).

Historia:

PostgreSQL tiene detrás una larga historia. El proyecto nació en 1986 en la Universidad de Berkeley como sucesor de uno anterior llamado Ingres, el cual fue a su vez uno de los primeros intentos de crear una base de datos relacional. Su nombre original fue Postgres (Post-Ingres) y fue pionera en muchos de los conceptos de bases de datos relacionales orientadas a objetos. El proyecto duró hasta 1994 y finalizó con el lanzamiento de la versión 4. Después de eso continuó siendo desarrollado como código abierto, ya que contaba con licencia BSD. En 1995 se le añadió soporte para el lenguaje SQL, naciendo Postgres95. Posteriormente en 1996 se le cambió el nombre al que tiene en la actualidad: PostreSQL. Con dicho cambio de nombre pretendía diferenciarse del proyecto original. Actualmente el proyecto va por la versión 9 y está dirigido por la comunidad PGDG (PostgreSQL Global Development Group). Como los demás proyectos de código libre se trata de una comunidad de desarrolladores que trabajan de forma desinteresada, altruista y libre, en ocasiones apoyados por organizaciones comerciales. Aquí podéis leer más información sobre la historia de PostgreSQL.


PostgreSQL frente a MySQL:

Tanto PostgreSQL como MySQL son gestores de bases de datos de código abierto y ambos comparten muchas características. Los expertos consideran que PostgreSQL es superior a MySQL porque incorpora de forma nativa gestión de transacciones, soporte a la integridad referencial y subconsultas. Además ofrece mejor tiempo de respuesta en bases de datos de gran tamaño. Sin embargo PostgreSQL carece de un conjunto de herramientas que permitan una fácil gestión de los usuarios y de las bases de datos que contenga el sistema. Por su parte los puntos fuertes de MySQL son su bajo consumo, siendo apto para ser ejecutados en máquinas de bajos recursos, su velocidad a la hora de realizar las operaciones (siempre que el número de registros no sea muy elevado) y la gran cantidad de herramientas de las que dispone. Además las últimas versiones de MySQL van incorporando algunas de las características de las que carecía como la integridad referencial.

MySQL es, con diferencia, el gestor de bases de datos más usado en el diseño de páginas web, disponiendo de numerosa documentación y multitud de herramientas de ayuda al programador. Debería ser por lo tanto la primera elección a la hora de escoger un gestor de bases de datos para un proyecto web. Sin embargo PostgreSQL es superior en muchos aspectos y debería ser tenido en cuenta en proyectos que requieran alta concurrencia o elevado volumen de datos.


Enlaces:

martes, 5 de febrero de 2013

Herramientas de programación web: Bootstrap

Bootstrap Bootstrap es un framework HTML5, CSS3 y Javascript creado por el equipo de desarrollo de Twitter. Es una herramienta que facilita el desarrollo de aplicaciones y sitios web de forma rápida y flexible. Además Bootstrap fomenta las buenas prácticas de desarrollo y la aplicación de estándares W3C y permite diseñar webs que se visualicen correctamente en múltiples dispositivos (PCs, tabletas, teléfonos móviles, etc.).

Bootstrap proporciona estilos predefinidos para una gran cantidad de de elementos de uso común en los sitios webs modernos (botones, tablas, formularios, tipografías, ...) y permite maquetar las páginas web de forma sencilla, con resultados profesionales y reduciendo el tiempo necesario de desarrollo. Además todos los estilos son personalizables. También incorpora varios plug-ins javascript basados en jQuery para realizar diseños avanzados.

Además Bootstrap se ofrece con licencia de código abierto y apto para todo tipo de proyectos tanto personales como profesionales.


Primeros pasos

Lo primero que se necesita es descargar Bootstrap desde el sitio web oficial y copiar el contenido de la carpeta bootstrap en la raíz del proyecto. Si se van a usar los plug-ins javascript, también será necesario descargar la librería jQuery y copiarla en otra carpeta del proyecto (por ejemplo /js). La estructura típica de un archivo HTML que incluya Bootstrap es la siguiente:

<!DOCTYPE html>
<html>
<head>
<title>Título del documento</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link href="/css/bootstrap.min.css" rel="stylesheet" media="screen">
</head>
<body>
[...]
<script src="/js/jquery-last.min.js"></script>
<script src="/js/bootstrap.min.js"></script>
</body>
</html>

Estructura básica: Diseño adaptable.

La estructura básica de una página HTML formateada con Bootstrap consiste en un grid (parrilla o cuadrícula) de hasta 12 casillas de ancho fijo (container) o proporcional al espacio disponible (container-fluid). Cada fila (row o row-fluid) puede tener una o varias columnas de diversos anchos (span1, span2, span3, ..., span12). También podemos dejar columnas en blanco con (offset2, offset2, offset3, ...). Las columna de ancho fijo siempre miden lo mismo. En cambio el ancho de las columnas proporcionales será un porcentaje del ancho disponible.

<div class="container">
    <div class="row">
        <div class="span12">[...]</div">
    </div">
    <div class="row">
        <div class="span4">[...]</div">
        <div class="span4">[...]</div">
        <div class="span4">[...]</div">
    </div">
    <div class="row">
        <div class="span8 offset2">[...]</div">
    </div">
</div">

La estructura anterior se corresponde a una página web con una fila de cabecera que ocupa todo el ancho disponible (span12), seguido de otra ficha dividida en tres columnas de ancho 4 (span4) y una última fila de ancho 8 centrada (span8 offset2). Se incluye aquí únicamente a modo de ejemplo.

<div class="container">
    <div class="row">
        <div class="span4">
            [...]
        </div">
        <div class="span8">
            <div class="row-flexible">
                <div class="span6">[...]</div">
                <div class="span6">[...]</div">
            </div">
        </div">
    </div">
</div">

En este otro ejemplo se ha usado una estructura de columnas anidada. Las columnas pueden anidarse tantas veces como sea necesario, incluso mezclando columnas de ancho fijo con columnas de ancho flexible. Leer más sobre el diseño adaptable de Bootstrap.


CSS Básico y componentes.

En Bootstrap usaremos los tags HTML5 comunes, pero éstos tendrán formatos predefinidos: títulos (<h1>, <h2>, ..., <h6>), párrafos (<p>), listas de elementos (<ul>, <ol>, <li>), listas de definiciones (<dl>, <dt>, <dd>), texto en negrita o cursiva (<strong>, <em>, <b>, <i>), abreviaturas (<abbr>), direcciones (<address>), citas y referencias (<blockquote>), código fuente (<code>, <pre>), tablas (<table>, <thead>, <tbody>, <tr>, <td>, <th>, <caption>), etc.

También podremos usar una serie de estilos predefinidos como .lead que muestra una letra grande (a modo de presentación de una web); .muted, texto de color clarito; .text-warning, para mensajes de aviso (color amarillo); .text-error para mensajes de error (color rojo); .text-info, para mensajes informativos (color azul); .text-success para mensajes de éxito (color verde); entre otros.

Bootstrap tiene estilos predefinidos para todo tipo de elementos: tipografías, tablas, formularios, botones, imágenes, etc. También proporciona decenas de componentes predefinidos construidos para ayudar en la navegación, mostrar alertas y mucho más: menús desplegables, botones de grupo, barras de navegación, puntos de navegación (breadcrumbs), paginación de listas, etiquetas e insignias, miniaturas de imágenes, alertas, barras de progreso, entre otros. Por último Bootstrap proporciona varios plugins jQuery que no voy a enumerar ahora.


Enlaces y referencias

lunes, 4 de febrero de 2013

Sobre el Nexus 4, la descarga de apps en España y los desarrolladores

El pasado jueves 30 de Enero a las 16:00 horas, tal y como estaba previsto, se volvía a poner a la venta el Nexus 4 en España. En esta ocasión el esperadísimo teléfono de Google apenas duró 10 minutos en stock. ¿Una mala planificación de Google? Imposible. Eso ya les había pasado el día de su debut el 13 de Noviembre cuando todo el stock de Nexus 4 se agotó en media hora. Entonces, ¿Por qué han traído tan pocas unidades del Nexus 4 a España?

Google Nexus 4

Está claro que el gigante de Mountain View cometió un grave error a nivel mundial con la solicitud de stock inicial a LG que aun no han conseguido solucionar, pero en otros países la cantidad de Nexus 4 disponibles en Google Play ha sido mucho mayor y el último smarthone de Google ha estado disponible más días y durante más tiempo. ¿Por qué Google margina a España de esa manera?

Los motivos reales sólo Google los sabe, pero en mi opinión tanto los chicos de Android Ayuda como los de Xataca Android han dado en el clavo en sendos artículos:

En esos artículos se postula que el motivo principal podría ser que si bien España es un país con una gran cantidad de smartphones Android, también es uno de los territorios donde menos contenidos se consume en Google Play. El Nexus 4 es un móvil de gama alta con precio de gama media. Google lo vende prácticamente a precio de coste con la intención de expandir el universo Android. Google prefiere ganar dinero con los contenidos, en lugar de con el hardware. Pero recuperar la inversión debe ser más difícil en España que en otros países. De ahí que prefieran centrarse en otros mercados.

Google Nexus 4

España tiene una penetración altísima de smartphones Android y es uno de los 8 únicos países donde el Nexus 4 está disponible (son Alemania, Australia, Canadá, España, Estados Unidos, Francia, Reino Unido y Japón), por lo tanto estamos entre los mercados principales para Google, lo que son muy buenas noticias. Google confía en España. Aun así nosotros tenemos menos stock disponible que otros países, lo que quiere decir que aun siendo del top-8, no estamos en las primeras posiciones dentro de esos ocho.

Mi opinión como desarrollador es que debemos concienciarnos de que las cosas tienen un coste. Si la gente no está dispuesta a pagar uno o dos Euros por una aplicación útil que va a usar a diario, es que hay un problema de base. Entre todos debemos convencer a la gente de que descargar apps de los markets alternativos no hace daño a Google sino a los pequeños desarrolladores. Puedo entender que alguien quiera piratear Windows u Office. Son productos extremadamente caros que no todo el mundo puede permitirse. ¿Pero realmente no puedes gastarte 1€ al año en WhatsApp o 1,50€ en el último Angry Birds? Los programas de Android son baratos. La excusa del precio no sirve aquí.

Como nota final sólo me queda poner un ejemplo: Mi aplicación Contacts Backup está disponible en Google Play desde mediados de Octubre de 2012. Actualmente lleva 7000 descargas y 2000 personas la mantienen instalada. Como era mi primera app decidí ponerla gratuita con publicidad. Pues bien en esos 4 meses he recaudado con la publicidad nada más y nada menos que 16,55$. ¡Un dineral! ¿De eso tenemos que vivir los desarrolladores? Por suerte no hice esa aplicación para ganar dinero sino para aprender. ¿Que tengo que hacer con la próxima? Si la hubiera puesto de pago, ¿se la habría descargado alguien? Esa es la cuestión...