HTML5 Storage
Hasta hace relativamente poco tiempo, la única forma que tenían los desarrolladores web para almacenar fragmentos de información en el lado cliente era a través de las Cookies. El tipo de almacenamiento de las Cookies es muy primitivo y muy limitado ya que hay que tener en cuenta que cada Cookie viaja adjunta a cada petición que realiza el cliente, de forma que va hacia el servidor y vuelve al cliente en cada Request, lo que genera un mayor tráfico y por tanto nos limita la cantidad de información que podemos enviar.
Otro inconveniente asociado al uso de Cookies era el hecho de que el usuario estuviera realizando múltiples transacciones en diversas ventanas del navegador. Por ejemplo, un usuario podría estar comprando dos billetes de avión diferente cada uno en una ventana distinta del navegador. Si el sitio utiliza Cookies para almacenar la información del usuario cuando el usuario comprara uno de los billetes, se podría encontrar con que realmente se están enviando cookies con información de compra de dos billetes, lo que supondría que el usuario ha comprado dos billetes sin darse cuenta.
Una de las cuestiones que se planteó durante el desarrollo del estándar HTML5 era: ¿No habrá una forma más sencilla de almacenar cierta información en el navegador del cliente sin que tenga que viajar en cada petición y evitar que la información de diversas ventanas del navegador se mezcle?
Lion: Habilita la repetición de caracteres
En Mac OS Lion está disponible una nueva característica que nos permite escribir letras con acento simplemente dejando presionada la vocal correspondiente y seleccionando del cuadro de diálogo que se nos abre, el tipo de acento que nos interesa. Esta característica se denomina ‘Selector de Caracteres’.
Al tener habilitado ‘Selector de Caracteres’ cuando queremos escribir un caracter de forma seguida, por ejemplo: aaaaaaaaa, no nos queda más remedio que presionar la ‘a’ tantas veces como nos interese. Personalmente esta característica la veo tremendamente útil en un dispositivo iOS, pero en un Mac con teclado físico y Lion, no me resulta tan necesaria. Así es que buscando por Internet y por los foros de soporte de Apple, he encontrado el comando para deshabilitar ‘Selector de Caracteres’ y dejar la repetición de teclas normal.
Lo único que tenemos que hacer es abrir una ventana de Terminal.app y escribir el siguiente comando:
defaults write -g ApplePressAndHoldEnabled -bool false
Una vez ejecutado el comando, será necesario reiniciar nuestro Mac para que Lion cargue esta nueva configuración.
Para restaurar ‘Selector de Caracteres’ a su estado inicial, bastará con que volvamos a ejecutar el comando anterior, pero cambiando el ‘false’ del final por un ‘true’.
Cualquier duda, sugerencia, mejora,….será siempre bien recibida
Más Info:
Nuevas caracteristicas de Texto en Lion | Apple
Manual del comando defaults | Apple Developer
Lion: Cortar y Pegar archivos

En Lion tenemos la opción de cortar y pegar archivos en lugar de
sólo copiar y pegar. (aunque realmente siempre hemos podido “cortar” un archivo arrastrándolo a su nueva ubicación).
La opción no aparece a simple vista, pero se desvela en cuanto utilizamos la todopoderosa tecla alt.
La operación es tan sencilla como:
1- Botón derecho sobre el archivo que queremos copiar y seleccionamos: “Copiar“
2- Vamos a la ruta en la que queremos pegar el fichero y: Botón derecho, presionamos la tecla alt y “Trasladar ítem aquí“.
O si preferimos podemos hacerlo mediante atajos de teclado:
Copiar: Cmd + C
Pegar: Cmd + Alt + V
Safari y Chrome. Resaltado de input y textarea. CSS
Por defecto, tanto Safari como Chrome tienen reglas CSS asignadas a los input (cajas de texto) y textarea, que provocan que cada vez que una de ellas recibe el foco de la aplicación se le asigne un borde llamativo para indicarlo.
Este borde puede resultar muy útil en determinadas ocasiones, pero en otras puede desentonar completamente con el diseño de la aplicación web que estemos desarrollando. En este segundo caso puede deshabilitarse añadiendo una regla CSS muy simple (o en lugar de deshabilitarlo podemos adaptarlo a nuestras necesidades si nos interesa):
.sin_resaltado{
outline: none;
}
De esta forma si asignamos esta clase a algun input o textarea, dejarán de mostrar ese resaltado que añaden por defecto Safari y Chrome.
Cualquier mejora, sugerencia, …. será siempre bienvenida
Más Info: Outline Property
Elimina los ficheros .DS_Store desde Terminal.app
Como ya comenté en la entrada Eliminar ficheros .DS_Store con Onyx, los ficheros .DS_Store son unos ficheros ocultos que Mac OS X utiliza para almacenar ciertos metadatos como por ejemplo la posición del icono en pantalla. Como sabéis, estos ficheros en Mac OS X y en Linux permanecen ocultos, pero en Windows se vuelven visibles. Si por ejemplo utilizamos un pendrive USB de un/a compañero/a en nuestro Mac, cuando él/ella lo conecte en su PC con Windows, verá una gran cantidad de ficheros .DS_Store que para él/ella no tienen ninguna utilidad. Por eso, en esta entrada vamos a ver cómo podemos eliminar esos ficheros de una memoria USB (o de cualquier directorio que nos interese) simplemente ejecutando un comando desde Terminal.app.
Oculta ficheros en Mac OS X
En los sistemas UNIX disponemos de una característica en el sistema de ficheros que nos permite añadir modificadores a cada archivo en forma de metadatos. Estos modificadores conocidos como ‘Flags’, nos permiten establecer o modificar propiedades internas de cada fichero sin importar del tipo que sea. De esta forma y mediante estos flags podemos: bloquear un archivo de manera que nadie pueda modificarlo, hacerlo invisible a ojos de nuestro GUI…
En esta ocasión vamos a ver como podemos convertir un fichero en invisible para nuestro Finder. Con este método no vamos a eliminar el fichero, éste va a seguir estando ahí, simplemente vamos a hacer que Finder no lo muestre. Lo primero será abrir Terminal.app y dirigirnos hacia la ruta en la que se encuentra el fichero que queremos ocultar.
Una vez localizado, simplemente ejecutamos el siguiente comando:
chflags hidden miFichero
Y listo, el fichero miFichero ya no es visible desde Finder. Sin embargo si ejecutamos el comando ‘ls’ desde Terminal.app veremos que el fichero sigue ahí.
Si queremos ver qué flags tiene asignadas cada fichero, podemos ejecutar el comando ‘ls’ del siguiente modo:
ls -lhO (es una letra o mayúscula)
Para devolver el fichero a su estado de visibilidad habitual, simplemente debemos ejecutar el primer comando incluyendo el flag ‘nohidden’
chflags nohidden miFichero
Cualquier duda, sugerencia, mejora, ….. será bien recibida
Más Info:
Apple Developer | chflags (1) Mac OS X Man Page
iOS5. Problema con Mail y las cuentas de GMail
![]()
Tras publicar Apple la nueva versión de su sistema operativo para dispositivos iOS (iOS 5), llegó una nueva versión del cliente de correo Mail para iOS que tiene ciertas incompatibilidades con las cuentas de Gmail configuradas mediante IMAP. Los problemas que se producen en mayor medida son los siguientes:
- Parece que Mail no es capaz de interpretar correctamente la información que Gmail envía a través de IMAP y por tanto se hace un poco de lío con los buzones que tenemos habilitados; hasta el punto de que cuando entramos en el buzón de recibidos la pantalla se queda ‘congelada’ y por mucho que toquemos, no responde hasta que volvemos hacia atrás.
- Otro problema que surge es que Mail duplica nuestro buzón de entrada (Inbox), incluso hay usuarios que comentan que les aparece cuatro y cinco veces.

Rebuscando por internet he logrado encontrar un par de hilos dentro de las Comunidades de Soporte de Apple donde mencionan este problema y ofrecen una solución temporal: aqui y aqui.
La solución consiste en entrar en las preferencias de Gmail desde el navegador de escritorio, acceder a la pestaña de IMAP y habilitar la sincronización del buzón ‘Todos’. ‘Todos’ es un buzón especial que posee IMAP donde almacena todos los emails que recibe de los diferentes buzones. Personalmente nunca tengo visible este buzón para IMAP porque el tiempo de sincronización con los clientes de correo aumenta bastante y en ocasiones puedes encontrarte con correos duplicados. Por eso comentaba anteriormente que es una solución temporal, ya que a mi personalmente no me interesa tener este buzón visible. (simples manías)
Una vez configurada nuestra cuenta de Gmail, debemos volver al iPhone, cerrar Mail (del todo) y volver a abrir la aplicación; al sincronizar de nuevo veremos que los buzones se listan correctamente.
Sin duda es un error de iOS 5 que seguro corregirán en las próximas actualizaciones.
iSad
… there’s no more to say, just Thank you!!!!
Eclipse. Breakpoints Condicionales
Una opción que sin duda me ahorra una gran cantidad de tiempo a la hora de depurar los programas en Java son los puntos de ruptura condicionales, es decir, necesito que cuando el programa llegue a una determinada línea del código se detenga, pero sólo si las condiciones que indicamos se cumplen.
Por ejemplo, imaginemos que hemos leído de una base de datos un conjunto de valores de 600 elementos, posteriormente estos 600 elementos iremos procesándolos uno a uno y añadiendo cada elemento leído a una hoja de cálculo dentro de un bucle. Al terminar la ejecución del programa vemos que en el elemento 200 el proceso ha fallado y los datos que se han introducido son erróneos. En este punto, si queremos depurar el programa pondríamos un punto de interrupcion dentro del bucle while que procesa los elementos, pero si el fallo se encuentra en el elemento 200, tendremos que ir manualmente saltando cada iteración del bucle hasta llegar al valor que nos interesa depurar.
Esta idea de por sí ya resulta demasiado tediosa, así es que vamos a tomar una solución mucho más elegante, cómoda y rápida. Vamos a poner un punto de ruptura (breakpoint) condicional. Para ello, simplemente añadimos un breakpoint normal y hacemos click derecho en el globito azul que nos aparece justo encima del número de línea de nuestro código y que indica que ahí hemos colocado el breakpoint. Seleccionamos ‘Breakpoint Properties‘ y seguimos.

Propiedades del Breakpoint
El siguiente paso será definir las opciones para convertir a ese punto de ruptura, en un punto de ruptura condicional. Nos aparece la siguiente pantalla (muy simple de entender):

Configuración del Breakpoint Condicional
Marcamos la casilla ‘Conditional‘ y en el cuadro de texto que nos aparece abajo indicamos la condición. Debemos escribir una sentencia que se evalúe a un valor booleano (true o false), de cualquier otra forma al alcanzar el punto de ruptura, el compilador nos mostrará un error.
Imaginemos que en nuestro bucle while hemos definido un contador que iremos incrementando cada vez que leamos una fila de la base de datos y la almacenemos en el fichero; si hemos comprobado que en el elemento 200 se produce un error, podríamos incluir una condición del siguiente estilo: (cont == 200)
Dentro de la condición se puede utilizar cualquier variable que se encuentre definida dentro del ámbito en el que habéis colocado el breakpoint, de manera que la variable sea visible y accesible para esa zona del programa.
En este ejemplo hemos visto una condición de parada muy muy simple, con el objetivo de conocer los breakpoint condicionales y saber que existen y cómo se utilizan. Por supuesto la condición que pongáis puede (debe) ser mucho más elaborada pero siempre debe evaluarse como un booleano.
Cualquier duda, sugerencia, mejora, …. será siempre bien recibida
En Java existen un par de operadores aritméticos que nos van a permitir incrementar (++) o decrementar (--) en una unidad el valor de una variable. Estos dos operadores pueden colocarse antes (prefijos) o después (sufijos) de la variable. De esta forma, podemos incrementar el valor de una variable de tipo int de la siguiente forma:
int i = 0; i++; //i tendrá el valor 1 ++i; //ahora i tiene el valor 2
Pero, ¿Ambos operadores actúan del mismo modo?¿Hay alguna diferencia en utilizar el operador en forma de prefijo con respecto al sufijo? Obviamente y como habréis deducido, sí existe una diferencia (si no esta entrada no tendría mucho sentido). Esta diferencia es bastante sutil, pero no por ello menos importante y debemos tenerla en cuenta a la hora de utilizar estos operadores.
La regla es la siguiente:
Cuando el operador se utiliza en su forma de sufijo (i++) el valor de ‘i’ se incrementa sólamente después de que el valor actual de ‘i’ haya sido utilizado en la expresión.
Veamos esto mismo con un ejemplo:
int i = 0; System.out.println("El valor de i es: " + i++); //En consola veremos que se ha escrito: El valor de i es: 0 System.out.println("Ahora i vale: " + i); //En consola veremos: Ahora i vale: 1
Como véis el incremento de ‘i’ no sucede hasta que el valor actual de ‘i’ ha sido utilizado en la primera sentencia System.out.println.
En cambio si utilizamos el operador en su forma de prefijo (++i), primero se produce el incremento y después se utiliza el valor incrementado de ‘i’ en la expresión, por ejemplo:
int i = 0; System.out.println("El valor de i es: " + ++i); //En consola veremos que se ha escrito: El valor de i es: 1 System.out.println("Ahora i vale: " + i); //En consola veremos: Ahora i vale: 1
En esta ocasión, como puede apreciarse, primero se incrementa ‘i’ y luego se utiliza su valor en la expresión.
Estas mismas reglas sirven para el operador decremental: --
Debemos tener en cuenta estas reglas, especialmente si utilizamos estos operadores en bucles for, while o sentencias de control de flujo como if, por ejemplo. Vamos a ver otro ejemplo:
int x = 2; int y = 3; if ((y == x++) | (x < ++y)) { System.out.println("x = " + x + " y = " + y); }
¿Qué creeis que imprimirá en consola este código? A primera vista parece un código simple, pero si os fijáis bien, en la sentencia if, puede que no tengamos tan claro qué valores tendrán ‘x’ e ‘y’ en cada momento. Vemos la solución:
La sentencia if de la segunda línea podemos leerla del siguiente modo: Si ((3 == 2) Or (3 < 4)) Entonces …
Por tanto, lo que obtendremos impreso en la consola será: “x = 3 y = 4″
Cualquier duda, mejora, sugerencia…será siempre bien recibida

