viernes, 30 de noviembre de 2007

Formas abreviadas de notación Javascript

Es un hecho: existen varios mitos y leyendas acerca de las capacidades de Javascript.

Ha sido un lenguaje bastante "bastardeado" por los programadores que vienen de otros "mundos". Esto ha provocado (además de toda clase de objeciones y prejuicios frente a su uso) toda clase de mitos y leyendas (también urbanas).

Me ha pasado más de una vez de explicarle a un programador "server-side" las cosas que se pueden hacer con javascript y he obtenido el famoso "ohhhhh...no sabía que se podía hacer eso con Javascript" o bien el clásico "ohhhhh...no sabía que era tan potente!".

Sin ir más lejos ayer en el trabajo estuve con un compañero explicándole como utilizar JSON para comunicarse en forma "liviana" con el servidor, y en un momento fue increíble ver su regocijo frente a las beldades de utilizarlo.

¿Por qué tanto preámbulo?, bueno, es que recientemente me he topado con un artículo escrito por Chris Heilmann en el que resume claramente las notaciones abreviadas de Javascript

Así que a continuación intentaré transcribir dicho artículo:

Notación abreviada de Arrays


¿Quién no ha visto cosas como estas?


var links = new Array();
links[0] = 'http://cuteoverload.com';
links[1] = 'http://icanhascheezburger.com';
links[2] = 'http://pencilsatdawn.wordpress.com';
links[3] = 'http://apelad.blogspot.com';


Esto es bastante entreverado (hay que repetir el nombre del array para cada elemento). Al cambiar el órden de de un elemento hay que cambiar también el número, lo cual no es necesario ya que el número se coloca automáticamente. Tan solo basta con usar "[]":


var links = [
'http://cuteoverload.com',
'http://icanhascheezburger.com',
'http://pencilsatdawn.wordpress.com',
'http://apelad.blogspot.com' // <-- este es el último y NO LLEVA COMA!
];


Esto es mucho más obvio desde un punto de vista visual. La indentación hace más sencillo "espiar" donde comienza y finaliza el array.

Cada elemento debe ser separado por una coma, pero teniendo la precaución de no dejar coma al final. De este modo pueden anidarse arrays:


var links = [
'http://cuteoverload.com',
'http://icanhascheezburger.com',
[100,200,20,'foo'],
'http://pencilsatdawn.wordpress.com',
'http://apelad.blogspot.com' // <-- este es el último y NO LLEVA COMA!
];


NOTA: He aquí otro truco: para agregar un nuevo elemento a los arrays puede usarse tanto el método push() ó la propiedad length:


links.push('http://dailypuppy.com');
links[links.length] = 'http://bigeyedeer.wordpress.com';

¿Arrays asociativos?


Otro mito (del cual fui partícipe lo confieso)que perdura es que Javascript permite crear "arrays asociativos", con lo cual no solo se permite numerar los elementos sino darles nombres! A continuación un ejemplo:


var links = new Array();
links['Cute Overload'] = 'http://cuteoverload.com';
links['I can has cheeseburger'] = 'http://icanhascheezburger.com';
links['Pencils at dawn'] = 'http://pencilsatdawn.wordpress.com';
links['Hobotopia'] = 'http://apelad.blogspot.com';


Esto es en realidad una forma de crear un objecto no un array
¿Quieres una prueba? – Haz un alert(typeof links) o bien alert(links[1]).

Declaraciones simples if-else – pregunta y define con la notación ternaria


Es posible abreviar declaraciones simples if dramaticamente. Ejemplo:


var YUIguy;
if(city === ‘London’){
YUIguy = ‘Chris’;
} else {
YUIguy = ‘Eric’;
};


Nuevamente, mucha repetición. La notación ternaria soluciona el problema:

var YUIguy = city === ‘London’ ? ‘Chris’ : ‘Eric’;

Muchos signos de igual...tal vez algunos paréntesis lo harían más claro:

var YUIguy = (city === ‘London’) ? ‘Chris’ : ‘Eric’;

¿Qué sucede aquí? Defines la variable YUIguy y le asignas un valor. Luego viene la declaración, en este caso una comparación de la variable city y si esta es igual a la string London (=== compara para ambos el valor y el tipo, mucho más seguro que ==).

Entonces preguntas si es verdadero o no usando el signo de interrogación.
La opción a la izquierda de los dos puntos (:) es la respuesta a la pregunta cuando se alcanza la condición y la opción a la derecha de los dos puntos (:) es la respuesta cuando no se alcanza la condición. Cualquier condición que puede ser verdadera o falsa puede ir dentro de paréntesis.


var direction = (x < max) ? 'left' : 'right';


Valores por defecto


Esta si que es buena, y creo que no mucha gente la conoce. También reconozco que cuando lo vi por primera vez (gracias a Nico Sanguinetti aka "Foca") quedé gratamente sorprendido :)

Damas y caballeros con Uds. el operador por defecto "double pipe (||)". Este es terriblemente útil cuando nos queremos asegurar que algo se setea con un valor por defecto. El siguiente ejemplo es algo que no debería mostrarse más:


var section = document.getElementById('special');
if(!section){
section = document.getElementById('main');
}


Nuevamente, repetición innecesaria, ya que lo mismo puede escribirse:


var section = document.getElementById('special') || document.getElementById('main');


Si lo primero no está definido, lo segundo se asigna como valor a la sección.

Bueno, ahora si que no hay excusas para programar en javascript en forma más prolija ;)

Calendar : Una clase de calendarios para Mootools

Calendar logo

Recientemente Aeron Glemann publicó la clase "Calendar" que agrega en forma sencilla, accesible y "degradable" date-pickers o calendarios a formularios.

El autor ha puesto el foco en la accesibilidad y usabilidad de la clase, con el fin de mejorar la experiencia de usuario.

Vista de Calendar en acción

A continuación las características que posee:

  • XHTML semántico y "estilizable"
  • Restricciones de futuro/pasado
  • Uso altamente configrable de tags input and select
  • Suporte multi-calendario
  • Opciones variables de navegación
  • Formato de fecha multi-idioma y con la misma sintaxis que la función date en PHP
Puedes vistar la página de Calendar para Mootools o directamente descargar Calendar para Mootools

miércoles, 28 de noviembre de 2007

Múltiples versiones de Internet Explorer a la vez

Recientemente me he topado con la necesidad de tener varias versiones de Internet Explorer corriendo a la vez.

Sucede que no era tan sencillo lograr esto como lo es ahora gracias a Multiple IE

Este software permite de forma más que sencilla correr un instalador que nos permitirá instalar aquellas versiones de Internet Explorer que nos interesen en particular para testear. La lista comprende:

  • IE 3.0
  • IE 4.0
  • IE 5.0
  • IE 5.5
  • IE 6.0
Vista del instalador de Multiple IE

NOTA: El instalador está hecho para Windows XP.

Cómo diría el amigo "Kike" Echevarría:

"Sencillamente notable"

Aquí les dejo el enlace para descargar Multiple IE.

Saludos y que lo disfruten!

martes, 27 de noviembre de 2007

Iconos de banderas del mundo

Bueno, acá va otro link que sin dudas en algún momento alguien va a tener necesidad de usar.

Se trata de la página de la página de iconos de famfamfam en la cual hay disponible para ser utilizado en forma gratuita un zip con todas las banderas del mundo creadas como iconos

Saludos y que les sean útiles!

HTML Validator: extensión para validar (x)html

Salud gente!

Aquí les dejo una verdadera joyita, una extensión que entre otras cosas permite:

  • Validar nuestro documento (x)html
    • Permite validar documentos locales en nuestro equipo o bien documentos publicados en un servidor
    • Permite establecer el validador contra el cual validar nuestro docuemento

  • Permite ver los errores y brinda feedback al respecto
    • Entre las maravillas que posee está la de usar como base Tidy y OpenSp, con lo cual podemos emprolijar y hasta corregir nuestro código directamente con la extensión.
    • Automáticamente puede corregir errores y aquellos que no entiende o no puede corregir los comunica como avisos.

Pueden descargar html validator para firefox o ver la página de Marc Gueury

Ahora si, después de esto no hay más excusas para no tener un docuemento valido!
Que la disfruten!

domingo, 18 de noviembre de 2007

Lista de tags soportados por XHTML

Bueno, nada nuevo por aquí pero siempre sirve tener a mano una referencia con todas las etiquetas soportadas por XHTML:

http://www.w3schools.com/tags/default.asp


<!--...-->
Define un comentario en el documento

<!DOCTYPE>
Define el tipo de documento

<a>
Define un ancla (hiperv&ícute;nculo)

<acronym>
Define un acrónimo en el documento

<address>
Define una dirección en el documento

<area>
Define un área dentro de un mapa de imagen del documento

<applet>
Deprecado. Define an applet

<area>
Define un área dentro de un mapa de imagen
<b>
Define texto en negrita
<base>
Define una URL base para todos los links en una página

<basefont>
Deprecado. Define una fuente base

<bdo>
Define la dirección del texto a mostrar

<big>
Define un texto grande

<blockquote>
Define una cita extensa

<body>
Define el elemento body (cuerpo) del documento

<br>
Inserta un solo salto de línea

<button>
Define un botón pulsable

<caption>
Define título para una tabla

<center>
Deprecado. Define texto centrado

<cite>
Define una cita

<code>
Define texto de código de computadora

<col>
Define atributos para columnas de tablas

<colgroup>
Define grupos de columnas de una tabla

<dd>
Define una descripción de definición

<del>
Define texto borrado

<dir>
Deprecado. Define una lista de directorio

<div>
Define una división/sección en un documento

<dfn>
Define un término de definición

<dl>
Define una lista de definición

<dt>
Define un término de definición

<em>
Define texto acentuado

<fieldset>
Define un fieldset (caja que agrupa elementos de un formulario)

<font>
Deprecado. Define fuente, tamaño y color para un texto

<form>
Define un formulario

<frame>
Define una sub ventana (un marco)

<frameset>
Define un conjunto de marcos

<h1> to <h6>
Define encabezados del 1 al 6 para el documento

<head>
Define información acerca del documento

<hr>
Define una línea horizontal

<html>
Define un documento html

<i>
Define texto en itálica

<iframe>
Define una sub ventana dentro de la actual (es un marco)

<img>
Define una imagen

<input>
Define un campo de ingreso (utilizado en formularios)

<ins>
Define texto insertado

<isindex>
Deprecado. Define un campo de una sola línea

<kbd>
Define texto de teclado

<label>
Define una etiqueta para un controle de formulario

<legend>
Define un título para un fieldset

<li>
Define un elemento de una lista

<link>
Define una referencia a un recurso

<map>
Define un mapa de imagen

<menu>
Deprecado. Define un menu

<meta>
Define meta información

<noframes>
Define una sección noframe

<noscript>
Define una sección noscript

<object>
Define un objeto embebido

<ol>
Define una lista ordenada

<optgroup>
Define un grupo de options

<option>
Define una opción en una lista de opciones (combo)

<p>
Define un párrafo

<param>
Define un parámetro para un objeto

<pre>
Define texto pre-formateado

<q>
Define una pequeña cita

<s>
Deprecado. Define texto tachado

<samp>
Define código de computadora de ejemplo

<script>
Define un script

<select>
Define una lista seleccionable
<small>
Define texto pequeño

<span>
Define una sección en un documento

<strike>
Deprecado. Define texto tachado

<strong>
Define texto fuerte strong (con mayor énfasis)

<style>
Define una definición bloque style (utilizado para declarar una css embebida en el documento)

<sub>
Define texto en subescript

<sup>
Define text en superscript

<table>
Define una tabla

<tbody>
Define el cuerpo de una tabla

<td>
Define una celda de una tabla

<textarea>
Define un área de texto

<tfoot>
Define el pie de una tabla

<th>
Define el encabezado de una tabla

<thead>
Define el encabezado de una tabla

<title>
Define el título de un documento

<tr>
Define una fila de una tabla

<tt>
Define texto de teletipo

<u>
Deprecado. Define texto subrayado

<ul>
Define una lista desordenada

<var>
Define una variable

<xmp>
Deprecado. Define texto preformateado

miércoles, 14 de noviembre de 2007

Solucionando prolijamente problemas de clear/float en css

A más de uno nos ha tocado a la hora de armar una página la lucha de tratar de transcribir lo que en nuestra mente resultaba más sencillo armarlo con tablas.

Hoy en día las tablas (por suerte) son utilizadas para lo que realmente fueron creadas: mostrar datos tabulados relacionados. Por consiguiente, los "divs" han cobrado cierta importancia sobretodo luego de que verdaderos gurus como Jeffrey Zeldman opinaran que las "tablas estaban muertas".

Emulando el comportamiento gráfico de las tablas


Para llevar a cabo nuestra diagramación, tenemos que recurrir a los elementos html <div> (que representan una división en la pantalla). Deberemos incluir tantos divs como "paneles" tenga nuestro diseño, por lo general un documento posee:

  • Encabezado (se lo suele identificar como "header")
  • Columna izquierda (se la suele identifica como "left")
  • Columna principal(se la suele identifica como "main")
  • Eventualmente una columna derecha (se la suele identifica como "right")


Bien, hasta ahí tendríamos todo más o menos claro, pero, hace falta solucionar problemas de visualización estrictamente para que tomen la apariencia que nosotros queremos.

Uno de los principales problemas a los que nos enfrentaremos suelen ser los "floats" (la propiedad css "float").

Cada vez que hacemos que un elemento "flote" el mismo impacta en el resto de la página, siendo necesario revertir dicho comportamiento para restaurar al flujo normal del documento.

La forma que más he visto es la sencilla solución de incluir un div con la propiedad "clear":

<div style="clear: left">

Sucede que eso desde un punto de vista más purista y semántico no es una solución muy correcta que digamos.
¿Por qué? ...bueno, para empezar, estamos agregando código en el documento para simplemente evitar un problema estrictamente relacionado a la visualización de nuestra página.

Claro que podríamos mejorar lo anterior simplemente añadiendo nuestro código inline dentro de un una clase css:

<div class="clearfix">

y en nuestra css copiar lo que anteriormente teníamos en nuestro div:


.clearfix{
clear: left
}


Si bien esto es más prolijo, seguimos teniendo el mismo problema de fondo...estamos agregando código al documento por el mero hecho de querer solucionar un problema "gráfico".

¿Cuál es la solución entonces más prolija y semánticamente más correcta?


Lo más correcto obviamente sería delegar esta responsabilidad a la CSS, ya que es la encargada de controlar el aspecto de nuestro documento.

Pero ¿cómo?, ¿todo esto no se originó justamente por problemas de estilos?
Si, pero también la solución está ahí mismo ;-)

Las CSS poseen una potencia bastante grande y muchas veces se las limita al uso de clases (lo cual genera CSS kilométricas y redundantes...ya hablaremos de ello en otro post).

Aunque Ud. no lo crea, las CSS poseen una capacidad bastante desconocida que les permite generar contenido...sí, así mismo: una css puede "inyectar" contenido a un documento. Por si fuera poco además pueden generar contenido antes o después de un elemento!, por lo tanto, perfectamenet podemos recrear lo anterior pero desde la propia CSS, dejándonos entonces una solución elegante y correcta.

Veamos como quedaría nuestra clase "clearfix" aplicando todo esto:


.clearfix:after {
content: ".";
display: block;
clear: both;
visibility: hidden;
line-height: 0;
height: 0;
}

.clearfix {
display: inline-block;
}

html[xmlns] .clearfix {
display: block;
}

* html .clearfix {
height: 1%;
}



Veamos que es lo que está generando entonces nuestra clase "clearfix" paso a paso:


.clearfix:after {/*after es un pseudo elemento que se generará a continuación de nuestro div con la clase "clearfix"*/
content: ".";/* Esto genera un "." como un texto en el div con la clase "clearfix"*/
display: block;
clear: both;
visibility: hidden;
line-height: 0;
height: 0;
}



El resto del código CSS se encargará de que nuestro querido Internet Explorer en sus distintas versiones interprete correctamente lo que queremos que haga.

Mootools 1.2 Beta 1 liberado!

Realmente hay varias opiniones en cuanto a frameworks javascript...no todo el mundo comparte la misma opinión. Mucha gente se inclina por prototype, jQuery u otras opciones.

En lo personal, soy un gran fanático de Mootools...aquellos que me conocen saben que "tengo mootools tatuado en el pecho" ;-)

Hablando en serio, este framework (del cual ya postearé información más interesante) está liberando la versión 1.2 Beta 1.

Entre las mejoras respecto de la versión anterior están:

  • Mejoras en la clase Hash (esto está buenísimo!)
  • Specs
  • Mejoras en los efectos
  • Nuevo objeto browser con información del navegador
  • Pseudo selectores CSS3!
  • Mejoras en la performance de los selectores css

JSSpec

Recientemente me topé con JSSpec... es un framework Javascript del tipo BDD(Behavior Driven Development o Desarrollo Orientado a Comportamiento) que soporta IE6/7, FF2, Safari3.

Funciona en forma similar a RSpec (un framework BDD para Ruby) pero provee mensajes de fallo más útiles. Por ejemplo, muestra diferencias entre dos strings o arrays.

Realmente interesante y algo a profundizar...que lo disfruten!

viernes, 9 de noviembre de 2007

View Source Chart: Extesión de firefox para ver el código fuente de las páginas en forma mejorada

Excelente extensión para Firefox, la cual permite de forma práctica visualizar el código de una página web en forma gráfica.

No solo destaca los bloques de código indentándolos, sino que además los separa por colores y permitiendo colapsarlos.

https://addons.mozilla.org/es-ES/firefox/addon/655

jueves, 8 de noviembre de 2007

CSSVista, aplicación para diseñar sitios para Internet Explorer y Firefox

Otra herramienta de esas que prometen mucho.

La gente de Litmus Labs, liberó una herramienta que puede ser de gran ayuda para los diseñadores web.

Se trata de CSSVista, la cual permite trabajar en forma simultánea editando la css de nuestro sitio siendo posible hacerlo "en vivo", y viendo simultáneamente como va quedando en Internet Explorer a la vez que en Firefox.

Por si alguno se pregunta "¿Para que quiero yo esto si con la firebug me alcanza y sobra?", van aquí una lista de argumentos:

  • Esta aplicación permite a diferencia de firebug visualizar el sitio en dos vistas, una para Internet Explorer y la otra para Firefox, de modo que al ir creando los estilos para tu css puedes ver "en tiempo real". Firebug solo permite esto para Firefox.
  • Es una aplicación que corre sola, de modo que solamente debes instalarla en tu equipo, y en principio solamente está disponible para windows y en una versión bastante preliminar lo cual puede traer acarreado algún problema de visualización (no es 100% fiable).
  • Al igual que Firebug, es completamente gratuita.
Para aquellos más profesionales y con mayor poder adquisitivo, la empresa comercializa Litmus
que permite de manera sencilla y rápida visualizar tu sitio en 12 navegadores populares y detectar los bugs que hubieren en la css.

Para aquellos que no tienen windows como sistema operativo, pueden usar como alternativa la IE tab que es una extensión para Internet Explorer que permite ver dentro de Firefox una instancia de Internet Explorer con nuestra página.

viernes, 2 de noviembre de 2007

Patrones de GUI

Saludos colegas!

Bueno, en un intento más por "evangelizar" tanto a diseñadores como a programadores, hablaremos hoy acerca de los "patrones de diseño en GUI".

Si eres diseñador y estás pensando en patrones como "los tipos que pagan el sueldo", o esas imágenes que se repiten en mosaico para formar un fondo uniforme, ciertamente te estás equivocando.

Si eres desarrollador y estás pensando en programación pura para crear widgets también.

Definición más purista:

Ciertamente estos patrones describen una solución óptima para un problema común dentro de un contexto específico en cuanto a la interacción usuario computadora.

Dicho de forma más sencilla al alcance de todos:
Reusa, recicla pero por favor...No reinventes la rueda!
Mucha gente se ha enfrentado una y otra vez a un mismo problema y se han ido encontrado mejores soluciones una y otra vez, refinando la solución.

Eso es lo que presentamos aquí: soluciones a problemas de GUIcomunes.

Todos estos patrones tiene algo en común:
  1. Un título
  2. Un problema
  3. Un contexto
  4. Una solución
He aquí entonces 3 links como para que vayan viendo:

Vector Magic

En esta oportunidad tengo para compartir otra aplicación "web 2.0", bien como para estar a la moda :-)

Se trata de "vectormagic" la cual puede conocer a través de la página:
http://vectormagic.stanford.edu/

Se trata de una aplicación que permite sencillamente convertir una imagen de mapa de bits (como ser una fotografía) en una archivo vectorial.

Lo curioso del caso, es que los resultados son realmente mejores que los que brindan aplicaciones comerciales como Corel Trace, o Adobe Streamline.

Lo que realmente me sorprendió (gratamente por cierto), es la calidad de la interfase gráfica de usuario (GUI = graphical user interface). Ciertamente del estilo inductivo y no del paleolítico deductivo (este es uno de los errores de UX web2.0).

Que la disfruten!

Photoshop web 2.0

La llamada "web 2.0" parece ser el término de moda hoy en día en el ambiente geek.

Ciertamente creo que era obvio que la gente demandaba una experiencia de usuario similar a las de las aplicaciones de escritorio en internet, ya que últimamente cada vez más se desarrollaban aplicaciones en ambientes web.

Lo cierto es que diversos factores adicionales han contribuido a esta "fiebre" por la web, en donde todo se puede arrastrar, grabar, mostrar su progreso de descarga, etc. Ya habrá tiempo para analizar esto en otro post(no puedo evitar hacer una crítica acerca de los errores de web 2.0 UX que comete), pero por el momento quisiera compartir este link a una reciente aplicación "web 2.0":

http://www.splashup.com/

La misma viene a ser la versión online de photoshop.
Por lo visto sus creadores han aprovechado las capacidades incorporadas por flash (la aplicación está hecha con Flex) para trabajar con mapas de bits y aplicar filtros.

Claro que estamos hablando de una herramienta que "emula" al photoshop y obviamente por diversos factores aún dista mucho de la original. Sin embargo, creo que puede llegar a ser de utilidad para varios usuarios.

NOTA: UX = User eXperience = experiencia de usuario