Downgrade de iOS 6 a iOS 5.1.1

El otro día me instalé iOS 6 beta en mi iPhone y en mi iPad. Aunque ya incluye las novedades anunciadas, todavía es una versión muy beta que tiene ciertos problemas. Uno de los problemas que más guerra me ha dado y que me ha llevado a desinstalarlo han sido las notificaciones push y que el teclado no va todo lo fino como iba en iOS 5.1.1.

A continuación vamos a hacer un downgrade de iOS 6 a iOS 5.1.1. Tener en cuenta que una vez hecho esto, únicamente podremos cargar una copia de seguridad realizada con iOS 5.1.1, de manera que los cambios que hayamos hecho desde que instalamos la versión iOS 6, los perderemos.

Pasos para desinstalarlo

  1. Abrir iTunes y conectar el cable USB al ordenador dejar el extremo del iPhone sin conectar.
  2. Mantenemos el botón de home y sleep pulsados en el iPhone mientras conectamos el cable, hasta que iTunes nos avise de que ha encontrado un iPhone para restaurar.
  3. Pulsamos en restaurar y seguimos los pasos.
  4. Configuramos el iPhone como un teléfono nuevo y restauramos la última copia de seguridad que hicimos mientras teníamos iOS 5.1.1 instalado.

En mi caso el iPhone se restauró con iOS 5.1.1 y puse la copia de seguridad que tenía sin problemas. En caso de que se instale la versión iOS 6 al restaurar, entonces podremos seguir los mismos pasos descritos anteriormente, pero a la hora de pulsar el botón de restaurar en iTunes, mantendremos pulsada la tecla alt y seleccionaremos el archivo de iOS 5.1.1 que previamente habremos descargado.

¿Por que no debemos usar String para almacenar datos sensibles en Java?

Últimamente he tenido que lidiar con datos comprometedores en mis desarrollos con los que se necesita tener especial cuidado, y la conclusión a la que he llegado es que no se debe usar String para datos sensibles.

¿Por que no debemos usar String?

El tipo de datos String es “inmutable”, por lo tanto, no podemos cambiar el valor del objeto una vez que lo hemos creado. Esto hace que el valor de un String se almacene en memoria y su limpieza dependa del garbage collector.

Por esta razón, si usamos un String para almacenar un dato sensible, nunca podremos garantizar que su valor se haya borrado de memoria ya que no tenemos un control sobre la ejecución del garbage collector, y por tanto, nuestro dato será sensible a un volcado de memoria.

¿Que podemos hacer entonces?

Java recomienda usar otros tipos de objetos para almacenar este tipo de valores, como por ejemplo el array de caracteres (char[]).

El char[] es una cadena de caracteres y es “mutable” de manera que cuando terminamos de usarlo podemos asignar un ‘\0’ a cada uno de sus elementos y forzar el borrado del contenido. De esta manera no dependemos de que el garbage collector libere la memoria asignada al objeto.

Cómo instalar el emulador de Android en Windows

Antes de ponerse a programar en Android una de las cosas imprescindibles es instalar el emulador para poder probar las aplicaciones que desarrollemos.

1. Descargar e instalar

Para descargar el emulador iremos a la página oficial de android (http://developer.android.com/sdk/index.html) y descargaremos el SDK para Windows, elegiremos la versión “installer” (si la recomiendan hay que hacerles caso).

Una vez descargado el SDK, lo instalaremos como cualquier otro programa, siguiente, siguiente, siguiente…

2. Crear nuestro primer dispositivo virtual

Ahora que ya tenemos instalada la aplicación, la abriremos, como es la primera vez que la ejecutamos nos preguntará si queremos instalar nuevos componentes, aceptaremos y nos iremos a por un café porque le cuesta un rato.

Cuando ya esté la aplicación instalada veremos un menú como el siguiente:

Para crear un nuevo dispositivo sobre el que probar nuestras aplicaciones haremos click en New y se nos abrirá la siguiente ventana:

En esta ventana rellenaremos la información del terminal.

  • Name: Es el nombre de nuestro dispositivo
  • Target: Es la versión de Android que queremos emular
  • SD Card – Size: Es el tamaño de la tarjeta de memoria
  • Hardware – New: Podemos añadir nuevas características (acelerómetro, etc.)

Finalmente haremos click en Create AVD para crear nuestro terminal. Si todo ha ido correctamente nos aparecerá, la ventana anterior con el terminal que acabamos de crear, tal y como podemos ver en la siguiente imágen:

Ahora, para que se ejecute sólo tendremos que seleccionar el terminal y hacer click en Start y posteriormente en Launch en la ventana que se nos mostrará. Si todo ha ido bien se cargarán varias consolas de windows y finalmente podremos ver una ventana con un teclado a la derecha y a la izquierda la pantalla del terminal, con la pantalla de inicio de Android.

Problema PANIC: Could not open…

Uno de los problemas que nos podemos encontrar es el de “PANIC: Could not open …/avd/prueba.ini”

Esto sucede porque el emulador es incapaz de encontrar el archivo .ini en nuestra carpeta de usuarios. Una de las soluciones es la de copiar y pegar el contenido de la carpeta avd de nuestro directorio .android a la dirección en la que dice que no lo encuentra. Pero esto nos obligará a tener por duplicado los datos de cada uno de los dispositivos. Por lo tanto os recomiendo que hagáis lo siguiente para corregir el error y no duplicar información:

  1. Abrir una terminal en modo administrador: Inicio – Ejecutar – CMD – 2º botón – Ejecutar como administrador
  2. Escribir lo siguiente: En mi caso instalé el Android SDK en D:\
  3. mklink /D %HOMEPATH%\.android D:\.android
    

    De esta manera hemos creado un vínculo virtual, algo así como un acceso directo a la carpeta .android. Así ya no tendremos que duplicar la información de nuestros dispositivos virtuales y no nos volverá a mostrar el error.

Estoy escuchando: Russian Red – Everyday Everynight

Leer un archivo Excel desde PHP

Últimamente me ha tocado exportar e importar archivos Excel usando PHP. En este post explicaré cómo lo hice usando XAMPP y los pasos que seguí.

1. Instalando las librerías necesarias

Para poder leer un archivo Excel vamos a necesitar dos librerías:

La librería Spreadsheet_Excel_Writer es una extensión de PHP que tendremos que instalar usando PEAR. Abriremos una consola y escribiremos:

   pear install Spreadsheet_Excel_Writer

Para instalar la librería Spreadsheet_Excel_Reader iremos a su página principal, descargaremos el paquete y lo descomprimiremos.

Dentro del archivo veremos una carpeta llamada Excel y dentro de ella dos archivos: oleread.inc y reader.php. Copiaremos el archivo reader.php y lo pegaremos en la carpeta “directorio_de_php/pear/Spreadsheet/Excel/”. Luego copiaremos el archivo oleread.inc y lo pegaremos en la carpeta “directorio_de_php/pear/Spreadsheet/Excel/Reader”. Una vez hecho esto, cambiaremos el nombre del archivo oleread.inc a oleread.php.

2. Cargando el archivo Excel en nuestro PHP

	//Cargamos la librería
	require_once 'Spreadsheet/Excel/reader.php';

	//Creamos el objeto y cargamos el fichero Excel
	$data = new Spreadsheet_Excel_Reader();
	$data->read(ruta_del_archivo_excel);

3. Códigos de ejemplo

A continuación os muestro algunos ejemplos de las funciones más sencillas que podemos usar para obtener datos del archivo Excel.

//Obtenemos un libro del Excel
$sheet = $data->sheets[numero_de_libro];

//Obtenemos las celdas
$cells = $data->sheets[0]['cells'];

//Obtenemos una fila determinada
$row = $data->sheets[0]['cells'][numero_de_fila];

//Obtenemos una celda concreta
$data->sheets[0]['cells'][fila][columna];

//Obtenemos el número de filas y columnas del Excel
$nrows = $data->sheets[0]['numRows'];
$ncols = $data->sheets[0]['numCols'];

4. Conclusión

Personalmente, si quieres tratar los datos de un Excel frente a una base de datos, mi recomendación es que importes los datos del Excel a una tabla intermedia en una BD y posteriormente aproveches la potencia de SQL para hacer operaciones con esos datos.

GPU Computing

Hace unos días supe de la mano de @joseluisbriz en una de sus clases que, pese a que nos sorprenda ver ordenadores multi-core de propósito general con 4 núcleos y doble hilo de ejecución como los nuevos i7 de Intel, no estamos hablando de un número bárbaro de núcleos por CPU ya que actualmente nVidia está montando hasta 448 núcleos por GPU en sus nuevos procesadores gráficos destinados a cálculos de alto rendimiento, como el último modelo Tesla C2050/C2070.

Podríamos pensar que el hecho de que se incluyan más de 400 núcleos por GPU podría tratarse de un producto inalcanzable para los usuarios de a pie, pero nada más lejos de la realidad. Vale, es cierto que si nos fijamos en el Tesla C2050 tendríamos que desembolsar unos 2000€, ¿pero qué pasa con otras tarjetas de menor envergadura? Si echamos un vistazo a una Nvidia GT 440, que actualmente está en el mercado por menos de 100€ vemos que tiene 144 núcleos en su GPU. Asombroso.

¿Pero de qué nos puede servir esto? Es cierto que los procesadores gráficos crecen a mayor velocidad que las CPU en relación a número de núcleos, así que Nvidia decidió explotar esta realidad y lanzar en 2007, el SDK de programación CUDA, con el que podemos desarrollar algoritmos destinados a ejecutarse en GPU mediante una sintáxis muy similar a la de C. Este tipo de programación tiene varios inconvenientes frente a la programación general para CPU y es que las GPU tienen algunas limitaciones a la hora de ejecutar ciertos códigos como, recursividad, número de parámetros dinámico, etc. De modo que seguimos necesitando la CPU para realizar ejecutar los algoritmos.

CUDA ofrece una interfaz de desarrollo que abstrae al programador de en qué sitio se está ejecutando cada parte del algoritmo de manera que las partes secuenciales del algoritmo las ejecutará la CPU, mientras que las partes que puedan ejecutarse de forma paralela se realizarán en la GPU, aprovechando así su capacidad para lanzar muchísimos hilos de ejecución aprovechando varios núcleos de la GPU exprimiendo así la potencia de cálculo en paralelo que pueden ofrecer los procesadores gráficos.

En definitiva este era un mundo del cual poco me había informado desde que supe del proyecto [email protected] para encontrar vida extraterrestre gracias a la computación distribuída y el aprovechamiento de la GPU, pero esta es otra historia de la que hablaré en otro momento. Mientras tanto, os diré que no deberíamos perder este asunto de vista porque muy probablemente las aplicaciones se empiecen a programar para aprovechar tanto la CPU como la GPU.

Podéis encontrar más información en los siguientes links:

Actualización:

En la keynote que presentó Nvidia en la Nvidia’s Technical GPU Conference, se mostró el roadmap previsto por la compañía y se vió que los sucesores de Fermi (con 512 núcleos por GPU en la actualidad) serán Kepler yMaxwell llegando a cuatriplicar los GFLOPS por Watio en los próximos 2 años. Una pasada.