» Publishers, Monetize your RSS feeds with FeedShow: More infos (Show/Hide Ads)
Aunque en España sigue costando 300€, en Amazon UK ya podemos encontrar el modelo de 8GB de Wii U por sólo 149£. 177€ al cambio. Un 40% más barato que en España.

¿177€ por una consola que acaba de salir? Con un precio así puedo hacerme ya con mi primera consola de octava generación, y comprar una PS4 o una XBOX 720 en el futuro.

Además, para hacer la oferta aún más tentadora, los creadores de Wiikey anunciaron hace unos días que ya tienen casi lista la primera solución para cargar copias de seguridad en Wii U. ¡Desde disco externo USB y sin soldaduras!
Si llevas un tiempo programando en Java recordarás esas decenas de líneas de código de inicialización y aquellos enormes XML de configuración con los que teníamos que lidiar en frameworks como Spring, JPA o JSF antes de que se popularizaran las anotaciones. En Android esa tendencia todavía no ha impuesto, pero os alegrará saber que sí existen librerías externas con las que reducir enormemente el código auxiliar y centrarnos en lo que realmente importa.
La opción más interesante es AndroidAnnotations, ya que es muy completa, no impone penalización alguna en el rendimiento y no nos obliga a que nuestras actividades extiendan de una cierta clase, lo que al carecer Java de herencia múltiple complicaría ligeramente el uso de librerías como ActionBarSherlock. ¿Suena bien? Entonces genera un proyecto con AndroidAnnotations en AndroidKickstarR y sigue leyendo; te aseguro que no te vas a arrepentir.
Asociar un layout a una actividad o fragmento
Sin AndroidAnnotations:
public class Actividad extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.actividad);
}
}
Con AndroidAnnotations podemos usar la anotación @EActivity (de enhanced activity o actividad mejorada) y pasarle el identificador del layout:
@EActivity(R.layout.actividad)
public class MyActivity extends Activity {}
De forma parecida a las actividades, con la anotación @EFragment podemos obviar el método onCreateView del fragmento. Sin AndroidAnnotations:
public class Fragmento extends Fragment {
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragmento, container, false);
return view;
}
}
Con AndroidAnnotations:
@EFragment(R.layout.fragmento)
public class Fragmento extends Fragment {
}
Inyección de vistas
Sin AndroidAnnotations:
public class Actividad extends Activity {
Button btnGuardar;
EditText txtNombre;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.actividad);
btnGuardar = (Button) findViewById(R.id.btnGuardar);
txtNombre = (EditText) findViewById(R.id.txtNombre);
}
}
Con AndroidAnnotations usaríamos la anotación @ViewById pasando como parámetro el identificador de la vista
@EActivity(R.layout.actividad)
public class Actividad extends Activity {
@ViewById(R.id.btnGuardar)
Button btnGuardar;
@ViewById(R.id.txtNombre)
EditText txtNombre;
}
Si el nombre de la variable es igual al identificador de la vista el parámetro se puede obviar:
@EActivity(R.layout.actividad)
public class Actividad extends Activity {
@ViewById Button btnGuardar;
@ViewById EditText txtNombre;
}
También podemos inyectar fragmentos con @FragmentById
@EActivity(R.layout.actividad)
public class Actividad extends Activity {
@ViewById Button btnGuardar;
@ViewById EditText txtNombre;
@FragmentById Fragmento fragmento;
}
Manipular las vistas
Si usamos @ViewById para inyectar la vistas, por la manera que tiene de funcionar AndroidAnnotations, no tendremos todavía las instancias asociadas en onCreate, por lo que si tenemos que hacer algo con las vistas tendremos que anotar uno o varios métodos con @AfterViews. Esto, que a alguno le puede parecer un incordio, a mí personalmente me gusta, porque prefiero extraer el resto del código a otros métodos siguiendo el Principio de Responsabilidad Única.
De esta forma un código como
public class Actividad extends Activity {
TextView txtVersion;
TextView txtFecha;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.actividad);
txtVersion = (TextView) findViewById(R.id.txtVersion);
txtFecha = (TextView) findViewById(R.id.txtFecha);
establecerVersion();
establecerFecha();
}
void establecerVersion() {
try {
PackageInfo infoPaquete = getPackageManager().getPackageInfo(getPackageName(), 0);
txtVersion.setText(infoPaquete.versionName);
} catch(NameNotFoundException e) {
e.printStackTrace();
}
}
void establecerFecha() {
DateFormat formato = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss");
Date fecha = new Date();
String strFecha = formato.format(fecha);
txtFecha.setText(strFecha);
}
}
se convertiría en lo siguiente
@EActivity(R.layout.actividad)
public class Actividad extends Activity {
@ViewById TextView txtVersion;
@ViewById TextView txtFecha;
@AfterViews
void establecerVersion() {
try {
PackageInfo infoPaquete = getPackageManager().getPackageInfo(getPackageName(), 0);
txtVersion.setText(infoPaquete.versionName);
} catch(NameNotFoundException e) {
e.printStackTrace();
}
}
@AfterViews
void establecerFecha() {
DateFormat formato = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss");
Date fecha = new Date();
String strFecha = formato.format(fecha);
txtFecha.setText(strFecha);
}
}
Eventos
Android cuenta con un atributo XML android:onClick con el que es muy rápido y sencillo asociar un listener a un evento clic. El equivalente en AndroidAnnotations es la anotación @Click, a la que se le pasa el identificador de la vista a la que se asocia el listener (se puede obviar en caso de que el nombre del método coincida con el identificador de la vista o que sea igual pero con el sufijo Clicked).
@EActivity(R.layout.actividad)
public class Actividad extends Activity {
@Click(R.id.button1)
void mostrarVersion() {
// ...
}
@Click
void mostrarFecha() {
// ...
}
@Click
void guardarClicked() {
// ...
}
}
En este caso la ventaja de las anotaciones no es tan obvia; quizás el poder ver la asociación entre la vista y el método en un golpe de vista. Tiene mayor interés el que podamos asociar listeners para unos pocos eventos más de forma igual de sencilla, con @LongClick para pulsaciones largas o @TextChange para cambios de texto.
Menús
Con la anotación @OptionsMenu podemos inflar el XML de menú, ahorrándonos sobreescribir onCreateOptionsMenu. Con @OptionsItem asociamos las distintas opciones de menú con distintos listeners, pasando el id de la opción a la anotación (también se puede obviar el id si coincide con el nombre del método, o si es igual pero con el sufijo Selected).
Versión sin anotaciones:
public class Actividad extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.actividad);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.actividad, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.actualizar:
actualizar();
return true;
case R.id.acercaDe:
acercaDeSelected();
return true;
default:
return false;
}
}
void actualizar() {
// ...
}
void acercaDeSelected() {
// ...
}
}
Versión con anotaciones:
@EActivity(R.layout.actividad)
@OptionsMenu(R.menu.actividad)
public class Actividad extends Activity {
@OptionsItem(R.id.actualizar)
void actualizar() {
// ...
}
@OptionsItem
void acercaDeSelected() {
// ...
}
}
Inyección de recursos
Para cada tipo de recurso existe una anotación que permite inyectar dicho recurso en nuestra clase pasándole simplemente el identificador (o sin pasarle nada si el nombre del recurso coincide con el de la variable): AnimationRes, BooleanRes, ColorRes, ColorStateListRes, DimensionPixelOffsetRes, DimensionPixelSizeRes, DimensionRes, DrawableRes, HtmlRes, IntArrayRes, IntegerRes, LayoutRes, MovieRes, StringArrayRes, StringRes, TextArrayRes, TextRes.
De esta forma en lugar de:
String nombreApp = getResources().getString(R.string.nombreApp);
simplemente podríamos escribir:
@StringRes String nombreApp;
Además, en el caso concreto de que queramos obtener una cadena HTML de un archivo de recurso y establecerla como texto en un TextView, podemos llevar a cabo ambos pasos con una simple anotación @FromHtml.
Hilos de ejecución
¿Harto de usar AsyncTask o similares para ejecutar un cierto código en un hilo distinto del principal o de interfaz de usuario?
void ejecutarTareaSegundoPlano(URL urls) {
new AsyncTask<URL, Integer, Long> {
protected Long doInBackground(URL... urls) {
int numUrls = urls.length;
Long tamanyoDescarga = 0;
for (int i = 0; i < numUrls; i++) {
tamanyoDescarga += ClienteHttp.descargar(urls[i]);
publishProgress((int) ((i / (float) numUrls) * 100));
}
return totalSize;
}
protected void onProgressUpdate(Integer... progreso) {
actualizarProgreso(progreso[0]);
}
protected void onPostExecute(Long tamanyoDescarga) {
mostrarDialogo("Descargados " + tamanyoDescarga[0] + " bytes");
}
}.execute();
}
¿Qué tal si pudieras usar la anotación @Background para indicar que un método debe ejecutarse en un hilo en segundo plano y @UiThread para que se ejecute en el hilo de interfaz de usuario? De esta forma el ejemplo anterior se reduciría a:
@Background
void descargarArchivos(URL urls) {
int numUrls = urls.length;
Long tamanyoDescarga = 0;
for (int i = 0; i < numUrls; i++) {
tamanyoDescarga += ClienteHttp.descargar(urls[i]);
actualizarEstadoDescarga((int) ((i / (float) numUrls) * 100));
}
mostrarDialogoFinDescarga(tamanyoDescarga);
}
@UiThread
void actualizarEstadoDescarga(int progreso) {
actualizarProgreso(progreso);
}
@UiThread
void mostrarDialogoFinDescarga(Long tamanyoDescarga) {
mostrarDialogo("Descargados " + tamanyoDescarga + " bytes");
}
Guardar y recuperar el estado
Esta es otra de esas tareas repetitivas que suponen gran cantidad de código. Comparemos una implementación típica con su correspondiente versión con anotaciones.
public class Actividad extends Activity {
Jugador jugador;
int puntuacion;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
if(savedInstanceState != null) {
jugador = (Jugador)savedInstanceState.getSerializable("jugador");
puntuacion = savedInstanceState.getInt("puntuacion");
}
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putSerializable("jugador", jugador);
outState.putInt("puntuacion", puntuacion);
}
}
@EActivity(R.layout.actividad)
public class Actividad extends Activity {
@InstanceState
Jugador jugador;
@InstanceState
int puntuacion;
}
Otras funcionalidades de interés
@Tracenos permite trazar la ejecución de un método escribiendo una entrada en el log cuando se entra y se sale del método.@HierarchyViewerSupportpermite utilizar la herramienta Hierarchy Viewer aunque no dispongamos de un teléfono con permisos de root o de desarrollo@RoboGuicenos permite integrar AndroidAnnotation con el framework de inyección de dependencias del mismo nombre (basado en Guice, de Google)@OrmLiteDaonos permite integrar AndroidAnnotation con el framework de mapeo objeto-relacional OrmLite@EViewy@EViewGroupfacilitan la creación de vistas personalizadas@SystemServicenos permite inyectar un servicio del sistema
Decía Larry Wall, el creador de Perl, que las tres virtudes principales de un programador son la pereza, la impaciencia y el orgullo desmedido. Pereza e impaciencia suficientes para querer invertir una gran cantidad de tiempo y esfuerzo en minimizar tareas repetitivas. Y de eso es de lo que vamos a hablar hoy.
Considera este fragmento de código, que podríamos encontrar varias veces repetido en una página JSF y que genera una caja de texto HTML con una etiqueta asociada y con un span en el que mostrar errores de validación para ese campo:
<h:outputLabel value="Nombre:" for="nombre"/>
<h:inputText id="nombre" label="Nombre" required="true" value="#{controlador.entidad.nombre}"/>
<h:message for="nombre"/>
NetBeans, y casi todo IDE que se precie, tiene una característica de plantillas de código con la que insertar automáticamente el código de la plantilla escribiendo una abreviatura que le hayamos asignado y pulsando Tab.
Pero casi todos los IDE van un paso más allá y permiten parametrizar estas plantillas de código, de forma que podamos sustituir estos parámetros por sus respectivos valores antes de la inserción final.

En NetBeans podemos consultar las plantillas de código predefinidas y añadir otras nuevas en Tools -> Options -> Editor -> Code Templates. La plantilla correspondiente al fragmento anterior tendría este aspecto, con los parámetros a sustituir siguiendo la sintaxis ${nombre del parámetro}:
<h:outputLabel value="${nombre}:" for="${id}"/>
<h:inputText id="${id}" label="${nombre}" required="true" value="#{controlador.entidad.${id}}"/>
<h:message for="${id}"/>
Al escribir el atajo que hayamos asociado al fragmento de código, NetBeans insertará el fragmento en esa línea y moverá el cursor al primer parámetro. Sólo tendremos que escribir el valor que queramos darle y pulsar Enter para que se cambie el valor en ese parámetro y todos los del mismo nombre. NetBeans situará el cursor en el siguiente parámetro para que podamos darle un valor, y así sucesivamente.
Cuando publiqué la entrada de las que, para mí, eran las 10 mejores canciones de videojuegos de la historia, me quedé con mal sabor de boca por haber dejado fuera a tantísimos de mis favoritos. Para remediarlo he montado una pequeña lista en mi adorado Spotify; tarea que, por cierto, es harto complicada al no ser tan habitual que se publicaran las bandas sonoras de los juegos antiguos.
Echadle una oída
Si compartes contenido en Internet eres un ladrón. Da igual que los precios no se ajusten a la realidad del mercado o que se introduzcan medidas antipiratería que no hacen más que molestar a aquellos que sí han pagado por el contenido. Simples excusas.
Toma ejemplo de Vytas Simanavicius, honrado ciudadano lituano, vicepresidente de la asociación antipiratería de su país, que no contento con dedicar sus días a la lucha contra el cáncer de la piratería, dedica sus noches al noble arte del tráfico de drogas para poder pagar por los discos de Bisbal. Un trabajador incansable, ejemplo e inspiración para todos.
Cuando se programa con alguna librería o framework de terceros siempre es fundamental poder contar con su código fuente, ya sea para aprender o para ver cómo funcionan las cosas por dentro. Android no es una excepción; por eso lo primero que hago nada más instalar Eclipse con las Android Developer Tools es añadir el código fuente del SDK. De otra forma, al intentar ver el código de cualquier clase de Android Eclipse nos mostrará una pantalla similar a esta, con el código decompilado en lugar del código fuente:

Para solucionarlo sólo tienes que descargar el código fuente de la versión de Android para la que estés desarrollando utilizando el Android SDK Manager (paquete “Sources for Android SDK”), pulsar el botón Attach Source en Eclipse, seleccionar External Folder y buscar la carpeta en la que se ha descargado el código fuente; normalmente android/sdk/sources/android-nivel api
Al hablar de moda geek puede venirnos a la cabeza el cosplay, las camisetas con integrales y chistes informáticos, y otras curiosidades. Pero, ¿qué hacer si además de ser un amante de la cultura pop eres un fanático de la moda? ¿se puede llevar el cosplay a la vida diaria y hacerlo vistiendo bien? Esto es lo que propone Sartorial geek, dedicado, entre otras, cosas a publicar outfits inspirados en personajes tan famosos como Gandalf, Yoshi, Aqua man o el Capitán América.

En mi trabajo suelo utilizar dos redes distintas: una red WiFi, de velocidad aceptable, y una red de área local, bastante más lenta que la primera y con algunas restricciones, pero que es necesaria para conectarse a ciertos recursos y páginas de la organización. Harto de tener que activar y desactivar ambas conexiones según lo que estuviera haciendo, recurrí a Google en busca de una solución. Su nombre: ForceBindIP.
Esta aplicación funciona interceptando las llamadas de red de las aplicaciones que carga. Sólo tenéis que crear un acceso directo a la aplicación que queráis forzar a utilice una determinada red, con ForceBindIP como ejecutable y la IP y la ruta de la aplicación a lanzar como parámetros. Por ejemplo:
ForceBindIP 174.193.48.35 “C:\Archivos de programa\Internet Explorer\iexplore.exe”
Si la red asigna IP de forma dinámica, tendrás que sustituir la IP por la clave que identifica a la red en el registro de Windows. Para ello, haz clic en el botón de Inicio, selecciona Ejecutar y escribe el comando regedit, lo que abrirá el editor de registro. En HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces busca la clave con un valor para DhcpIPAddress igual a la IP asignada actualmente para esa interfaz.
ForceBindIP {11388731-F073-4EC4-A52C-3EFA7F325A1D} “C:\Archivos de programa\Internet Explorer\iexplore.exe”
Por último, también puede resultar útil añadir entradas en el menú contextual de los ejecutables con los que seleccionar si ejecutar la aplicación con una interfaz de red u otra. Esto lo podríamos hacer con un archivo de registro como el siguiente; sólo tenéis que guardarlo en un archivo de texto con extensión .reg, acordándoos de cambiar las claves de las interfaces por vuestras claves o IPs.
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\exefile\shell\EjecutarWifi]
@="Ejecutar por WiFi"
[HKEY_CLASSES_ROOT\exefile\shell\EjecutarWifi\command]
@="ForceBindIP {11388731-F073-4EC4-A52C-3EFA7F325A1D} \"%l\""
[HKEY_CLASSES_ROOT\exefile\shell\EjecutarLAN]
@="Ejecutar por LAN"
[HKEY_CLASSES_ROOT\exefile\shell\EjecutarLAN\command]
@="ForceBindIP {EAEA78D4-05AA-4421-BD99-0B6C89FB9FC5} \"%l\""
Me ha llevado algo más de tiempo de lo que preveía, pero al fin he terminado de traducir todos los tutoriales del sitio oficial de desarrolladores de Android que enseñan los conceptos básicos para la creación de aplicaciones. En total son 7 clases, en las que se tratan los siguientes temas:
- Construyendo tu primera aplicación
- Gestionando el ciclo de vida de la actividad
- Soportando distintos dispositivos
- Construyendo una interfaz de usuario dinámica con fragmentos
- Guardando información
- Interactuando con otras aplicaciones
- Compartiendo contenido
¿Sabes esas veces en las que algún cacharro no funciona y acabas dándole un golpe, un poco por frustración y un poco con la esperanza de que se arregle sólo? Pues este método tiene hasta un nombre “técnico“, mantenimiento percusivo, y aunque parezca cosa del pasado, con tanta maquinaria de precisión y tanto gadget futurista, siguen existiendo situaciones en las que puede dar resultado. Yo, sin ir más lejos, ¡ya lo he usado dos veces en lo que llevamos de semana!

Se acerca San Valentín y desde LELO este año te lo quieren poner fácil. Participa en nuestro sorteo y el regalo te puede salir gratis: un lujoso set de diseño Amore Me valorado en 139€ y que incluye antifaz de seda, esposas de seda y ante y un discreto vibrador con forma de pintalabios recargable por USB.
Sólo tienes que dejar un comentario explicando qué tecnología aplicarías a los juguetes para adultos (rellenando el campo de correo electrónico para que pueda ponerme en contacto contigo si resultas ganador o ganadora).

El sorteo está abierto para todo el mundo (aunque en algunos países de Sudamérica puede haber aduanas de las que la marca no se haría cargo) y finaliza el día 14 de febrero a las 23:59 hora española. ¡Suerte a todos!
Aunque el inglés es un idioma que yo considero que hablo bastante bien (academia, escuela oficial de idiomas, parte de la carrera en inglés…) siempre es agradable poder leer un texto en tu lengua materna. Esto es un problema cuando se trata de documentación técnica, porque las obras de referencia a menudo no se traducen al castellano o tardan mucho en publicarse, y en ocasiones los textos que podemos encontrar en nuestras tiendas cuentan con muy poca calidad.
En su día ya intenté aportar mi granito de arena publicando el libro “Python para todos” como Creative Commons, una iniciativa que no salió demasiado mal. Desde hace ya bastante tiempo tengo un especial interés por Android, y cuando empecé a dar mis primeros pasos comprobé que la situación no era mucho mejor.
Desde que Google creara el sitio de Android Training este ha sido un recurso que siempre ha estado muy bien considerado por los desarrolladores, hasta el punto de que muchos lo recomiendan como la mejor forma de comenzar con Android. Por eso, y porque una empresa que gana más de 10 000 millones de dólares al año todavía no se ha molestado, me he propuesto traducir estas clases al español, aprovechando su licencia Creative Commons.
Ya podéis encontrar las 3 primeras clases en Formación Android. No os deberían llevar más de 2 horas.
Si tenéis cualquier duda, fallo o sugerencia que comentarme, podéis utilizar, como siempre, el formulario de contacto o los propios comentarios de esta entrada. Y si os gusta la iniciativa y queréis darle un poco de publicidad en las redes sociales, mejor que mejor
Cuando desarrollamos aplicaciones para móviles o tablets y no tenemos acceso a un dispositivo físico, o queremos probar nuestra aplicación en distintos tamaños de pantalla o densidades tenemos dos alternativas principales: los “simuladores”, como el que incluye el SDK de iOS, y los emuladores, como el del SDK de Android.
Emuladores vs simuladores
Un simulador sólo simula el entorno software en que se ejecutará la aplicación. Cuando ejecutamos una aplicación en el simulador de iOS, lo que ocurre realmente es que la aplicación se compila a código máquina nativo y se simulan las llamadas de sistema de iOS. Como la aplicación se ejecuta de manera nativa, es extremadamente rápida, pero a cambio, el resultado es menos fidedigno.
Por otro lado el emulador de Android, que básicamente es una versión modificada de QEMU con un frontend, emula todo el entorno software y hardware de un tablet o teléfono Android, a excepción de que no puede hacer llamadas. Esto permite hacernos una idea mucho más certera de cómo se comportará nuestra aplicación en un dispositivo real, pero a cambio, también es mucho más lento, sobre todo si activamos las funciones de depuración. Tanto es así que, gracias a lo sencillo y conveniente que es un utilizar un dispositivo físico para probar nuestro código en Android, muchos desarrolladores terminan desechando el emulador totalmente y utilizando teléfonos y tablets reales exclusivamente.
Acelerar el emulador de Android
Aunque es una información que se recoge en el sitio web de Android para desarrolladores y numerosas páginas se hacen eco, mucha gente no es consciente de que es posible utilizar imágenes de Android basadas en x86 y hacer uso de la GPU de nuestra máquina y las funciones de virtualización de las CPUs más modernas para mejorar dramáticamente el rendimiento del emulador de Android.
Como ejemplo de cómo pueden afectar estas opciones al rendimiento del emulador, sin ningún tipo de valor estadístico y sólo como curiosidad, aquí tenéis los tiempos obtenidos en el test SunSpider activando cada una de estas opciones de forma consecutiva:

Las imágenes de Android para x86 están disponibles a través del SDK Manager. Sólo es necesario desplegar la rama correspondiente a la versión de Android que estemos utilizando e instalar el paquete “Intel x86 Atom System Image”. Una vez instalado el paquete tendremos la opción de utilizar “Intel Atom (x86)” como CPU/ABI al crear un nuevo AVD.


Si disponemos de un procesador Intel con la tecnología VT-x podemos mejorar aún más el rendimiento utilizando virtualización basada en el propio hardware. Sólo tenemos que descargar el paquete “Intel x86 Emulator Accelerator (HAXM)” mediante el SDK Manager y ejecutar el instalador que encontraremos en \sdk\extras\intel\Hardware_Accelerated_Execution_Manager\IntelHaxm.exe una vez terminada la descarga.
Por último, para activar la aceleración mediante la GPU sólo tenemos que activar la opción “Use Host GPU” al crear un nuevo AVD.
Otras opciones que pueden ayudarnos a mejorar el rendimiento del emulador son utilizar versiones más antiguas de Android, usar resoluciones más bajas o aumentar la RAM que se le da al AVD, si contamos con memoria suficiente.
Unos ladrones se cuelan en las oficinas de Microsoft y deciden que sus productos son tan sumamente malos que no merece la pena ni cargar con ellos. Lo único que terminan robando son varios iPads que los empleados utilizaban para desarrollo.
No es el principio de un chiste ni una noticia de El Mundo Today. Es algo que ocurrió el mes pasado y que comentan en más profundidad en The guardian y The Register. Pobre Steve Ballmer, que no gana para disgustos.
Gracias a Philips y a Bloguzz últimamente he estado probando la Philips 40PFL7007H, una televisión de 40” de gama media-alta, con pantalla LED, 3D activo, ambilight, Smart TV y una excelente conectividad, calidad de imagen y sonido. Ahí es nada.
En estas líneas os comento mis impresiones, y os enseñó cómo conseguirla con un descuento de 1000€ si os interesa.
Diseño

Una de las cosas que más llaman la atención al sacar este modelo de la caja es su fino marco de metal, de sólo 5mm. También lo ajustado de sus dimensiones: a pesar de tratarse de una televisión de 40”, tiene un ancho y un alto similar a una Samsung B651 de 37” y la mitad de grosor (910x524x30mm). Esto, combinado con unas líneas ligeramente redondeadas y unos colores elegantes y limpios, dota a la Philips 7007 de un aspecto muy agradable.
También se nota a primera vista la calidad de materiales y construcción. No estamos ante una típica televisión de plástico, cosa que es de esperar dado el rango de precios en el que nos estamos moviendo.
La única decisión de diseño que no comparto es el escaso espacio disponible para conectar los cables y los dispositivos USB, que puede dificultar o imposibilitar la conexión en algunos casos extremos.

Imagen y audio
La Philips 40PFL7007 cuenta con una gran calidad de imagen: un muy buen nivel de detalle, un contraste excelente y unos colores ricos y vivos. Ver un Blu-ray o cualquier otro vídeo de alta calidad en esta televisión es toda una experiencia.
Así y todo, recomiendo jugar un poco con los ajustes para configurar la imagen a nuestro gusto y, quizás, probar a desactivar la interpolación de fotogramas, filtro al que yo personalmente nunca me he acostumbrado porque da un aspecto demasiado realista a las películas, muy al estilo del culebrón venezolano. En el mundo Philips este filtro recibe el nombre de “Digital Natural Motion“; es el equivalente al “MotionFlow” de Sony o el “Auto Motion Plus” de Samsung.
Por otro lado, ver la TDT española, con su lamentable calidad de imagen, no es una experiencia tan agradable. El reescalado es bastante bueno, pero el aparato, simplemente, no puede hacer milagros.
En lo que respecta al sonido, hay que decir que la Philips PFL7007 ofrece una MUY buena calidad de audio, aunque, evidentemente, si queremos conseguir la experiencia completa, siempre será mejor disponer de un buen sistema de altavoces externo.
3D
Las dos tecnologías principales que suelen utilizarse para engañar a nuestros ojos haciéndonos pensar que la imagen tiene profundidad son el 3D activo y el 3D pasivo.
En el 3D pasivo, como el que podemos encontrar en la gran mayoría de las salas de cine, se utilizan simples gafas polarizadas, como aquellas antiguas gafas con lentes rojas y azules de nuestra infancia. Un filtro en el emisor se encarga de polarizar las líneas de la imagen de forma que sólo vemos las líneas impares en un ojo y las pares en el otro. Esto significa que, en realidad, cada fotograma de una película de 1080p dispone de 540 líneas para un ojo y 540 para el otro, lo que se traduce en una peor calidad de imagen.
Por el contrario, en el 3D activo se utilizan gafas con un pequeño obturador que bloquea el paso de luz en el ojo derecho cuando se está mandando la imagen del ojo izquierdo, y viceversa. Para alimentar este obturador se utiliza una pequeña batería, lo que hace que las gafas sean más pesadas y más caras que las pasivas.

El sistema que utiliza la Philips 40PFL7007 es el 3D activo (3D Max), reservando su sistema de 3D pasivo (Easy 3D) para gamas más bajas. Esto implica que, como hemos visto, cuenta con una mejor calidad de imagen, a cambio de un ligero aumento de peso en las gafas (30gr vs 25gr) y una inversión mayor al comprarlas (50€ vs 10-15€). Otra ventaja que se suele citar para el 3D pasivo, como es el mejor ángulo de visión, apenas es apreciable.
En general es un 3D que me ha dejado un muy buen sabor de boca, aunque esto siempre depende también de la calidad del 3D de la película.
Otro punto a destacar es que la televisión incorpora un sistema de conversión de 2D a 3D por software, que no es ni mucho menos perfecto, pero que es bastante curioso.
Smart TV
De un tiempo a esta parte y debido al éxito de los smartphones, es cada vez más habitual que las televisiones puedan conectarse a Internet y que cuenten con pequeñas tiendas de aplicaciones al estilo de la App Store o de Google Play. Como no podía ser de otra forma, este también es el caso de la Philips PFL7007.
Aunque el catálogo todavía es algo escaso, ya cuenta con unas cuantas aplicaciones muy interesantes: podemos mantener el contacto con nuestros amigos con la aplicación de Facebook, mantenernos informados con las aplicaciones de 20 minutos y Euronews, seguir en tiempo real la cotización en bolsa de nuestros valores, ver vídeos de YouTube, alquilar películas y series, comentar nuestras series favoritas en Twitter, ver trailers de películas, escuchar conciertos, jugar a sencillos juegos o ver la predicción del tiempo.
Realmente el único pero importante que le encuentro en el tema de aplicaciones es que, aunque el navegador de Internet funciona bien y es cómodo de usar gracias al teclado QWERTY que encontramos en la parte inferior del mando, éste no soporta Flash, lo que limita un tanto su utilidad.
Del tablet a la tele, de la tele al tablet

Otra característica que me ha resultado interesante y que creo que merece su propia sección es la posibilidad de mandar imágenes y vídeos fácilmente desde un móvil o tablet Android o iOS a la televisión, con sólo instalar una pequeña aplicación.
Esta aplicación también nos permitirá usar nuestro tablet o smartphone como si de un enorme mando a distancia se tratara (útil, por ejemplo, para tener un teclado aún mayor mientras estamos navegando), ver la guía de programas o, incluso, ver cualquier canal que se esté mostrando en la televisión en nuestro tablet o móvil, un poco al estilo de la Wii U de Nintendo; ideal si tienes que visitar sin falta al baño y no llegan los dichosos anuncios o si tienes que acercarte a la cocina a comprobar cómo va algún guiso.
Cómo ahorrar 1000€ al comprar esta televisión
Si has tenido la paciencia necesaria para leer la review completa, lo más seguro es que estés verdaderamente interesado en este modelo. Si es así y tienes la intención de comprar una, tengo una buena noticia para ti y es que, si tienes un poco de suerte, es posible que te ahorres nada menos que 1000€ al comprarla.
Sólo tienes que conservar tu ticket de compra y comprobar cuando llegues a casa si la hora del ticket coincide con el minuto ganador en el sorteo que Philips celebra cada hora como parte de su promoción La hora Philips TV. Como por ahora seguimos teniendo 60 minutos en cada hora, tienes 1 oportunidad entre 60 de ganar, que es una probabilidad bastante considerable. Y si no tienes suerte, no tires tu ticket, porque también participarás en el sorteo de 3 televisores Philips Smart TV de 32”.
En octubre de 1985 Intel lanzaba al mercado el primer procesador de 32 bits de su familia x86: el Intel 80386. Conocido entre sus amigos como i386 o, simplemente, 386, este procesador era una pequeña bestia que corría a la vertiginosa frecuencia de 12MHz.

Pues bien, con motivo de una más que necesaria limpieza de código, la próxima versión del kernel de Linux dirá adios a este antediluviano procesador.
Y aunque Linus sea frío como el hielo finlandés, a tenor del comentario de su commit (No soy sentimentalista. Ya era hora), un servidor no puede sino derramar una lagrimita por este pedazo de nuestra historia. ¡Que te vaya bonito, 386!
Guy Kawasaki, el que fuera primer gran evangelista de Apple en aquellos lejanos tiempos del Macintosh, parece que ha visto la luz últimamente: hace casi 1 año que se convirtió en fiel seguidor de Android, la religión única y verdadera. Estas son algunas de sus reflexiones al respecto:
Me enamoré de Android con los smartphones, luego me hice con un Nexus 7 y empecé a usar Android en los tablets. Para mí la gran ironía es que el eslogan de Apple era “Piensa diferente” pero hoy en día si piensas diferente lo buscas es un Android
En Apple se consideran la punta de lanza de los smartphones, ¿cómo es posible que todavía usen una red que es de 10 a 20 veces más lenta (que LTE)?
Otra cosa que me gusta de Android es que no tienen un estúpido cable propietario. Puedo ir a la recepción de cualquier hotel y si he olvidado mi cable siempre tendrán algún micro-USB. Puedo usar el mismo cable en mi Nexus 7 y mi Samsung Galaxy S3. ¡Menudo concepto! Un cable estándar…
No voy a volver, porque ahora pienso que Android es mejor
Aprovecho esta entrada para felicitar al smartphone, que cumplió 20 años el pasado viernes. Felicidades también al padre de la criatura, IBM, a pesar de que muchos sigan atribuyéndolo a Apple (ver 5 cosas que Apple no ha inventado).
Aquí una fotografía de este primer smartphone de la historia, el IBM Simon, que fue presentado el 23 de Noviembre de 1992 en el COMDEX de Las Vegas y que, además, ya contaba con interfaz táctil:

Tengo la teoría de que, en la época en que vivimos, estas dos mentiras han reemplazado a grandes clásicos como “no eres tú, soy yo” o “la última y nos vamos“.


¿Si no, por qué iba nadie a aceptar voluntariamente el no poder fabricar armas nucleares con iTunes?
Si por algo es famosa Apple es por el atractivo diseño de sus productos, pero como todo el mundo, los diseñadores de Apple también son humanos y también cometen errores. Como ejemplo, aquí tenéis los 6 productos de Apple con diseño más cuestionable según la revista Fortune.
JLPGA PowerBook 170 (1992)

Edición exclusiva de este portátil creado en honor de la Asociación de Golfistas Profesinales japonesa. Afortunadamente sólo se fabricaron 500.
Flower Power iMac (2001)

El patrón estaba grabado en la carcasa utilizando una nueva técnica que les había llevado perfeccionar 18 meses. Un tiempo que bien podían haber invertido en reconsiderar su diseño.
eMate 300 (1997)

La palabra que mejor define este diseño es “plasticoso”. Como era de esperar, se retiró del mercado en menos de 1 año.
Apple III (1980)

En este caso los fallos de diseño fueron más internos que externos, incluyendo la genial idea de Steve Jobs de eliminar los ventiladores para que la computadora fuera totalmente silenciosa, confiando en su carcasa de aluminio para disipar el calor.
Power Macintosh G3 All-In-One (1997)

Precursor de lo que habría de venir con los iMac. Una de las primeras máquinas lanzadas por Apple tras el regreso de Steve Jobs.
Macintosh Portable (1989)

Esta especie de Nintendo DS gigantesca fue el primer ordenador comercial utilizado para enviar un correo electrónico desde el espacio, en 1991. También podrían haberla olvidado en órbita…









