Selectores dobles con JQuery, aumentando el rendimiento de JQuery

JQueryA menudo suele pasar que al comparar diferentes librerías de Javascript, se habla de JQuery como una librería de muy fácil manejo por utilizar selectores DOM y de CSS pero a la vez se dice que por esto es mas lenta que el resto. Mi objetivo con este artículo no es explicar los diferentes tipos de selectores de JQuery sino como aumentar el rendimiento de JQuery utilizando selectores dobles de contexto.

En JQuery aparte de otras formas como objetos DOM y similares, lo normal es realizar un selector apuntando a una clase de CSS o un id. Antes de nada, comentar que el uso de clases en los selectores de JQuery, es recomendable omitirlo siempre que sea posible (no siempre se puede), ya que JQuery espera encontrar varios nodos y por tanto evaluará todo el código, por lo que es mas lento que utilizar ids, que una vez lo encuentre, dejará de buscar. Tras este miniconsejo de rendimiento de JQuery, me gustaría comentar como funcionan los selectores dobles de contexto de JQuery.

Normalmente  para hacer una selección en JQuery, hacemos algo tal que $(«selector») y seleccionamos el objeto de JQuery. Un selector doble o selector de contexto es básicamente una especie de cache, un contexto donde buscar ese selector pero no en toda la página, sino en una parte de esta. Para utilizar un selector doble o selector de contexto, lo que hacemos es enviarle un parámetro extra a la consulta de selección. En mi caso me gusta enviar un objeto de JQuery que intento cargar en memoria al cargar la página, sacrificando tiempo de carga por velocidad a la hora de interactuar con la propia página. Para utilizar un selector doble o selector de conexto lo que hacemos es por ejemplo hacer $(«selector», objetopreseleccionado), de esta forma, JQuery no buscará el selector en toda la página, sino que se centrará en el contexto donde se encuentra lo preseleccionado.

Para que todo quede un poco mas claro, voy a poner un ejemplo, partamos de la idea que tenemos la página partida en 4 sectores, una cabecera, un contenido dividido en menú lateral y contenido en si, y un pie. Todas estas partes cambiarán dinámicamente, así que al realizar el document ready cargaremos en variables las diferentes secciones de la web con la idea de realizar operaciones de una forma mas rápida y consumiendo menos recursos de procesador al cliente, que ya sabemos que el javascript puede ralentizar mucho una página si no se hace con cuidado.

var header, footer, menu, content;

$(document).ready(function($) {
  header = $("#header");
  footer = $("#footer");
  menu = $("#menu");
  content = $("#content");
}

Una vez que hemos cargado en memoria las diferentes secciones de la web, podremos trabajar con eventos, modificaciones y efectos de una manera mucho mas eficiente, realizando las llamadas utilizando en los selectores esas variables como contexto de JQuery.

$("#logo", header).html("mi html");
$(".article a", content).click(function() { .... });

Si utilizamos los selectores de JQuery como en el ejemplo anterior, usando un contexto para la búsqueda, ahorraremos muchísimo tiempo de proceso porque JQuery no tendrá que buscar en todo el documento, sino que lo realizará en base al contexto que le indiquemos. Quiero aclarar que como todo, hay que estudiar cuando usar o no usar contextos, ya que si la página es muy pequeña no merece la pena cargar en memoria las diferentes secciones, pero si la página es bastante grande y con muchos datos, podemos acelerar el uso de JQuery y aumentar el rendimiento de JQuery en un 250%.

Router Wifi en el móvil o como salir de un apuro sin internet

WifiDesde que tengo un móvil de HTC con Android, nunca pense en que iba a utilizar una aplicación llamada «Router Wifi», hasta la otra noche. «Router Wifi» es una aplicación, en mi caso de HTC para Android, aunque ya casi todos los móviles modernos disponen de alguna opción similar y que básicamente, lo que hace es simular un router como el que podemos tener en casa pero utilizando el teléfono móvil y su red 3G. Al activar esta aplicación se genera una red wifi, a la cual podemos conectarnos desde otros dispositivos entre ellos un portátil.

Os pongo en contexto: 2:30 de la madrugada, subiendo los últimos cambios de un proyecto y pensando en ir a dormir ya que al día siguiente toca estar a las 7 en pie. Cuando solo queda un archivo por subir pero quizás sea mas importante que el resto de archivos que ya había subido, el FTP deja de funcionar, pero me fijo y no funcionaba internet. Me voy del despacho al salón, reinicio el router de Telefónica pero sigue sin funcionar, pero no podía acostarme sin subir ese último archivo.

HTC Android Router Wifi

Medio desesperado y sin saber que hacer, se me ocurre utilizar la aplicación «Router Wifi» del teléfono móvil, ya que pensé que quizás era el momento de utilizarlo por primera vez. Activo el «Router Wifi» de HTC para Android, configuro los datos de seguridad de la red y me conecto con el portátil. Hago una primera prueba con Google y veo que se conecta, vuelvo a abrir la conexión FTP y veo que también, así que termino de subir con éxito el archivo y pruebo el proyecto. Todo funcionaba genial, me salvó de un autentico apuro.

Después de ese momento, estoy un poco mas feliz por tener un Android.

RockMelt el navegador social basado en Chrome

RockMeltLeyendo el otro día a @manoloruiz, descubrí un nuevo navegador social llamado RockMelt, basado en Google Chrome. RockMelt es un navegador, basado en Google Chrome, con una apariencia muy similar al Chrome de Google, salvo por algunos pequeños detalles. Lo que mas me llama la atención es que nada mas iniciar RockMelt, aparece una ventana, similar a la conexión que realiza Chrome con GMail, pero en este caso de acceso a Facebook, para importar nuestra cuenta de Facebook. Una vez lo hallamos realizado el login en Facebook, aparecerá una barra lateral con nuestros contactos de facebook, permitiendonos chatear con ellos. En el otro lateral encontramos una barra con las aplicaciones instaladas, por defecto Facebook y Twitter, aunque de momento también se puede Youtube, donde podremos ver las actualizaciones de nuestras redes sociales y añadir contenido directamente desde esta barra. Por último destaca junto a la barra de direcciones, el botón de compartir, que nos permitirá compartir la página actual en cualquiera de nuestras redes sociales.

La verdad es que este navegador tiene muy buena pinta y creo que se va a convertir en mi navegador secundario para e trabajo, ya que así de un vistazo puedo ver el twitter. Tiene muy buena pinta, el único problema es que aún no esta en español, pero todo se andará.

Os dejo algunas capturas del navegador.

RockMelt página de descarga

RockMelt acceso a Facebook

RockMelt página de inicio

Un rack en la cocina 2: las goteras

Hace tiempo publique el post de «un rack en la cocina» donde se veia entre microondas y neveras un curioso armario que era en realidad un rack de servidores. Hoy os traigo una segunda parte de «un rack en la cocina«.

Una tranquila mañana, como cada día al llegar al trabajo, fui a la cocina a hacerme un café para entrar en calor y despertarme, al ver esta imagen, no pude evitar sacarle una foto. Que cada uno, fregona en mano, saque sus propias conclusiones.

Rack en la cocina, fregona

 

Actualizando Microsoft Windows en todas sus versiones desde Windows 1.0 hasta Windows 7

Os dejo un video que he encontrado de Andriew Tait. El video es un experimento de una actualización de Microsoft Windows en todas sus versiones, desde Windows 1.0 hasta Windows 7. Me llama especialmente la atención este video ya que salvo la versión 1.0 y la versión 2.0, el resto las he instalado cientos de veces, salvo el Windows 7 que solo una vez y la verdad es que ver este video me trae gratos recuerdos de juventud. Os dejo el video donde en la misma maquina instala Windows 1.0, Windows 2.0, Windows 3.0, Windows 3.1, Windows 95, Windows 98, Windows 2000, Windows XP, Windows Vista y Windows 7.

Resaltar como mantiene algunas configuraciones de por ejemplo color de fondo y compatibilidad de programas antiguos como editores y juegos aparte de las pruebas que se realizan en cada versión con el Monkey Island y el Doom 2. También resaltar que se hecha en falta algunas versiones con menos éxito como Windows Millenium mas conocido como Windows Me y bueno no se puede tener todo ya que son de otra rama, pero versiones Windows NT y posteriores Windows Server que sería interesante ver si mantiene la misma compatibilidad.

Por qué usar StringBuilder en lugar de concatenar Strings

Ando un poco liado y llevo una temporada sin escribir. Hay un apunte, que es común para varios lenguajes que son Java y por ejemplo .Net, tanto Visual Basic .Net y C#, así como el resto de lenguajes de la plataforma .Net que es la clase StringBuilder. Hay gente que no sabe por que o cuando utilizar la clase StringBuilder y realmente es uno de esos pequeños detalles de buenas prácticas, que a simple vista en un proyecto pequeño no se aprecian, pero cuando entre manos tenemos un gran proyecto que recibe millones de peticiones diarias, estas pequeñas nuevas practicas pueden suponer un gran referente de ahorro en el consumo de memoria y procesador de un servidor.

Tanto en Java como en .Net, cuando creamos un nuevo String, instanciamos un objeto String en una variable, cuando con la sentencia «+=» vamos concatenando mas texto, lo que hacen estas plataformas es crear una nueva instancia del objeto con la concatenación de las dos variables de texto. Por otro lado, cuando tenemos un StringBuilder instanciamos una clase StrringBuilder, llamando al método «append» en Java y «Append» en .Net, lo que hacemos es realizar una concatenación real de texto en el buffer de texto para luego instanciar un nuevo objeto String cuando llamemos al método «toString» en Java y «ToString» en .Net. A simple vista parece una tontería, cuando tenemos un texto que concatenamos 2 o 3 veces, realmente no merece la pena generar un StringBuilder, pero cuando concatenamos repetidamente texto varias veces el rendimiento es mayor si utilizamos StringBuilder, ya que si tenemos 20 concatenaciones seguidas, utilizando Strings normales concatenados, tendríamos 20 instancias de objetos, mientras que con StringBuilder solo 2. Como he dicho antes, en un pequeño proyecto, esto es prácticamente inapreciable, pero cuando tenemos un proyecto que recibe millones de peticiones diarias, algo tan tonto como utilizar concatenaciones de texto o StringBuilder puede suponer tener que añadir mas memoria al servidor para soportar tantas instancias de objetos e incluso un procesador mas potente para soportar el paso del recolector de basura para tantos objetos instanciados, esto en el mejor de los casos, si no llegamos al caso de tener que añadir un servidor al cluster para soportar todo esto.

Un cumulo de buenas practicas pueden suponer un gran ahorro de recursos, que se traducen en ahorro de dinero, cuando se trata de grandes proyectos.

Próxima actualización de Android Market

Google está preparando una actualización del Android Market con motivo de la nueva versión de Android Gingerbread 2.3. Esta actualización estará disponible en un par de semanas, es decir, antes de finalizar el año 2010 y ademas de mejoras visuales notorias, se han añadido nuevas categorías como widget y livewallpaper. Además de esto, se ha ampliado el tamaño máximo de las aplicaciones hasta los 50MB, lo que permitirá crear juegos para Android más ricos visualmente hablando. También se ha reducido el tiempo de devolución de las aplicaciones compradas desde las 24 horas actuales a los 15 siguientes minutos tras la compra, ya que según Google, los usuarios devuelven las aplicaciones en los 10 minutos tras su compra. Por último se añadirán los vídeos promocionales de las aplicaciones. Todo esto es poco, ya que según Google, aún no han terminado con los cambios aunque seguramente los cambios que tienen en mente realizar, los liberaran en futuras versiones del Android Market.

Os dejo un par de capturas de pantalla del nuevo Android Market de la mano de Google.

Google preview, capturas de pantalla de los resultados en Google

De casualidad, me he encontrado con algo que no habia visto hasta hoy. Últimamente, el buscador Google, ha experimentado ciertos cambios como actualizacion en pocos minutos u horas del contenido sin tener que esperar al Google Dance, Google Instant, que tambien esta para moviles y nos permite ver los resultados intantaneamente ademas de ofrecernos sugerencias de busquedas, una pagina nueva de resultados para imagenes, en fin mil cambios en poco tiempo. De casualidad, me pongo a buscar un texto sobre Bill Gates, y me encuentro con que al pinchar sobre el texto que suele aparecer debajo del link de la pagina en Google, aparece un cuadro a la derecha con una captura de pantalla o snapshot. Que es esto, ni idea y la verdad es que me he puesto a buscar un poco y viendo la hora no me he esforzado mucho, pero no he visto nada. Vamos a llamarlo Google Preview por llamarlo de alguna manera, como siempre Google innovando y mejorando dia a dia. Dejo una captura de pantalla donde se puede ver el snapshot de Google. Por cierto, que tambien resalta el texto buscado.

Google Preview

Un rack de servidores en una cocina

Hace tiempo que llevo con ganas de publicarlo y siempre se me olvida. Hace algún tiempo, mi empresa mudó las oficinas de una plata a otra, haciendo la oficina desde 0. La verdad es que como persona curiosa de cuando en cuando me asomaba a ver como iban las obras, ya que era en el mismo edificio pero otra planta. Al ver que todo el cableado, paredes, mesas, sillas, todo menos los ordenadores era nuevo estábamos todos un tanto expectantes/ilusionados. Al mudarnos en pleno verano y aprovechando el buen tiempo, algunos compañeros nos íbamos a comer a una residencia de ancianos cercana, que nos permitía comer allí y disfrutar aunque sea por un breve espacio de tiempo de sus jardines y poder así relajarnos y desconectar un rato. Es por tanto que en todo el verano algunos compañeros entre los que me incluyo, no llegamos a ver la nueva cocina, denominada por algunos como «la cocina de gran hermano» por el estilo y diseño que tiene. Finalizando el verano, en una oleada de despidos, despidieron a un compañero de departamento y este, en su despedida, trajo algunos aperitivos y cervezas y fuimos todos a la cocina a pasar el rato. Estando allí, un compañero que como yo, aún no había comido nunca allí, fue a abrir lo que pensábamos era una nevera buscando unas cervezas fresquitas y la sorpresa al abrir la supuesta «nevera» fue mayúscula. No comento más, mejor ver las fotos.

Rack de servidores en cocina

Rack de servidores en cocina

Steve Jobs siente miedo por Android

Android vs iPhoneCierto es que iPhone es un gran teléfono móvil con un gran sistema operativo detrás y que la sensación de uso de iPhone es muy superior a la de Android, pero esto no quiere decir que Steve Jobs empiece a sentir miedo por el desarrollo que Android está teniendo en el mercado de la telefonía móvil. Steve Jobs siempre se ha sentido orgulloso de sus productos y salvo cuando realizaba una dura batalla contra IBM y Microsoft, Jobs no se dedicaba a despotricar sobre otros productos sino a alabar los suyos. Desde que se ofrecieron las últimas cifras de mercado, en las cuales Android ya había sobrepasado a iPhone, Steve Jobs esta empezando a preocuparse. Primero fueron declaraciones sobre que su teléfono era mas «puritano» haciendo referencia a la restricción de aplicaciones censurables que realizaba la marca de la manzana y después de varios rifirafes, Steve Jobs se pone en la piel de los desarrolladores criticando la fragmentación que complica el desarrollo de aplicaciones para Android.

Como desarrollador que ha realizado algunas aplicaciones para Android, debo decir que programar para esta plataforma es muy fácil, ya que con unos conocimientos básicos de Java podemos empezar a programar y su desarrollo de interfaz xml que recuerda un poco al html, la verdad es que no es muy complicado. Lo que si he de decir es que la cosa complica un poco cuando tenemos diferentes dispositivos con diferentes características como puede ser con cámara o sin ella, con bluetooth o sin el y mil cosas mas que nos podemos encontrar. La verdad es que esto en iPhone no pasa ya que se trata de un único teléfono que ha ido evolucionando, pero el mundo no se puede detener en un punto y siento tener que decir en contra de las declaraciones de Steve Jobs, que los desarrolladores desde que salieron del DOS, han debido de trabajar para diferentes formatos, escritorios con diferentes velocidades, versiones, resoluciones, colores y no quiero entrar ya en los que realizamos webs para Internet Explorer, Firefox, Safari, Opera, Chorme y un largo etc. Es por ello que un desarrollador que se precie, esta acostumbrado a realizar ciertas modificaciones de fragmentación para diferentes dispositivos.

Las últimas declaraciones de Jobs muestran como su todopoderoso imperio de telefonía con iPhone esta poco a poco cayendo y cada vez mas gente se pasa al más que versátil Android de Google y al no poder alabar sus productos por encima de Android, empieza la encarnizada guerra de criticas contra el rival. Siento ser un poco sensacionalista, y al igual que dije hace algún tiempo que Microsoft llegaba mal y tarde con Windows Phone 7 a esta guerra, tengo que decirle a Jobs que esta guerra la ha perdido pero aún nadie se lo ha dicho. Lo único que puede hacer Apple para mantener viva esta guerra y no acabar perdiendo con el tiempo es un cambio radical en su iPhone como liberar a los desarrolladores de la estricta política de censura o volver a realizar algo revolucionario en el mercado de la telefonía móvil.

Diferentes formas de seleccionar etiquetas hijas en css

Cuando estamos maquetando una web, muchas veces nos vemos en la necesidad o en la comodidad de aplicar estilos a etiquetas o clases hijas directamente pero a veces esto puede convertirse en un problema. Normalmente cuando se maqueta se suele seleccionar directamente todas las etiquetas hija de un tipo por ejemplo, todos los p que haya dentro de un div con una clase, pero que pasa si tenemos una estructura un tanto compleja y no queremos que todas se comporten de una misma manera, como por ejemplo usando listas y sublistas y queremos que las sublistas tengan un margen que la lista normal no queremos que tenga.

En CSS hay varias formas de seleccionar etiquetas hija, la mas común es la de seleccionar todos los hijos de un tipo, como seria el ejemplo:

.clase ul {
    margin: 0px;
    padding: 0px;
    list-style: none;
}

Con esto decimos que todos los li contenidos dentro de un ul, tengan un estilo, pero ¿Y si queremos hacer un listado mas complejo, con sublistados? Lo que debemos de hacer es decirle que aunque los li dentro de ul se comporten de una forma concreta, los primeros li queremos que se comporten de otra forma. En el siguiente ejemplo se usa para formar un listado con li y ul donde queremos que los primeros li no tengan margen alguno, pero que el resto de li que haya tengan un margen a la izquierda para simular un sangrado automático:

.sidebarBox ul > li > ul {
    margin-left: 25px;
}

Y el html sería el siguiente:

  • lista1
    • lista2

Con esto lista1 no tendra sangrado pero lista2 tendra un sangrado de 25px hacia la izquierda. Espero que os sirva de ayuda.

Cuando GMail o GTalk para Android no funcionan

Hace un par de días me dejaron de funcionar las aplicaciones nativas de GMail y GTalk que vienen instaladas por defecto en Android. Puede que otros no las usen, pero para mi el hecho de que GMail y GTalk no funcionaran fue algo que me mató por dentro. GMail por ejemplo me dejó de descargar mensajes y por mucho que le daba a actualizar, no descarga los mensajes nuevos y GTalk directamente no me abría, me cargaba la pantalla de «cargando» y fugazmente desaparecía, es decir, GTalk no se abre. Como solución temporal configuré el correo de HTC e instale el Fring, pero el correo de HTC aunque bastante mejor que GMail, prefiero la ligereza y la velocidad de GMail, y el Fring, directamente no me gusta, ademas de que al rato de tenerlo abierto y estar en la home se me cierra solo no se por que.

Viendo que esto no era algo de algún cambio que estuvieran haciendo desde Google, me decidí a arreglarlo. La solución ha sido bastante mas sencilla de lo que me imaginaba, como siempre, un limpiado del programa es lo mejor, y para ello nos vamos a Ajustes > Aplicaciones > Administrar aplicaciones y una vez aquí, debemos buscar las aplicaciones que se llaman: «GMail«, «Almacenamiento de Gmail«, «Google Talk» y «Almacenamiento de Google Talk«, esta última solo sale «Almacenamiento de Google» pero se ve el icono de GTalk. En cada una de las fichas debemos de borrar los datos del sistema y para ello pulsaremos el botón de «Borrar datos» y listo, pero eso si, en las 2, su programa y su almacenamiento y si os pasa como a mi que no os funcionan ni GMail ni GTalk pues habrá que hacerlo en los 4. Una vez hecho esto, ya podemos abrir de nuevo las aplicaciones y GMail volverá a recibir correos, aunque tendrá que sincronizarse y si tienes muchos correos tardará un ratín, pero el GTalk funcionará a la primera.

Espero que os haya servido esta pequeña ñapa para cuando no funciona GMail para Android o no funciona GTalk para Android.

Scroll al inicio