Cosas web, algunas úles, algunas buenas.
Fushioko, tiendas de productos de Asia

martes, febrero 28, 2006

Más sobre SVG

Uno de los problemas que le veo al SVG es que se desconoce, normalmente no es algo de lo que se suela hablar, y menos aún que se suela usar. Buscando más sobre este formato gráfico vectorial, he encontrado tres cosas, que aunque puedan ser antiguas, me han gustado (no tengo demasiado tiempo para dedicarle al SVG y hoy ha sido bastante fructífero para mí). Allá van:

  • Una lista de teléfonos móviles (o celulares, para quien los llame así) que admiten SVG Tiny 1.1, sacada de SVG.org: Nokia (7370, 6282), Sony Ericsson (K610, M600, W950 ), NEC (V703N), ...
  • Un pluggin para Eclipse que sirve para mostrar y trabajar con SVG, basado en Batik
  • Un filtro para importar SVG en documentos dentro de la suite OpenOffice (yo es el que uso en casa, ¡me libré del MS Office!)
Espero que vayáis cogiéndole el gusto al SVG.

lunes, febrero 27, 2006

Zoom automático para imágenes

Realizar un zoom en las imágenes es algo que puede sernos de utilidad, ya sea porque no tenemos demasiado espacio en la página y aún así queremos ponerla a gran resolución, o simplemente para poder apreciar mejor los detalles de la foto. Lo que vamos a hacer es modificar todas las imágenes que queramos (distinguiéndolas por un parámetro) para que aparezca un icono de una lupa, que al pulsarlo hará que la imagen se vea más grande y permitiendo movernos por ella según el movimiento del ratón.

viernes, febrero 24, 2006

Diseño con ventanas de una página web

Muchas veces el diseño de una página web suele regirse por una serie de modelos prefijados que no siempre suele ser lo que más le conviene a nuestro desarrollo. En esta entrada voy a proponer un modelo con ventanas que puede ser apropiado en algunos casos (por ejemplo, en la promoción de un negocio que contiene poca información), pero que puede ser incorrecto usarlo en otras situaciones (por ejemplo, un blog).
La página principal muestra una zona de tamaño fijo que contendrá las ventanas (cuatro en este caso) que serán las que muestren la información. El número de ventanas debe estar limitado y deben ser pocas para que no sobrecarguen la página, por eso he comentado al principio que este modelo puede ser válido para sitios con poco contenido. Las ventanas van a disponer de alguna funcionalidad, lo que da dinamismo y cierta espectacularidad (espero que guste) al diseño, se podrán mover, maximizar y minimizar (creando un efecto thumbnails), efecto imán entre ventanas, etc... No he intentado ver si funciona en Opera debido a que los iframes no admiten el estilo z-index.

Me gustaría poder poner la página directamente, pero me da problemas el sitio donde alojo los archivos y no quiero que cause mala impresión, lo malo es que no se puede apreciar del todo en la imagen, por lo que te recomiendo que te bajes el zip y lo pruebes en tu máquina.

miércoles, febrero 22, 2006

Críticas a los navegadores

No soy un gurú de los navegadores, y no creo que mi opinión vaya a causar una depresión a los responsables del desarrollo de estas aplicaciones, aún así voy a dar mi modesta opinión, eso sí, solo las cosas que no me gustan. Una opinión creada por su utilización, no sacada de lo que he leido sobre ellos, es más, es posible que en algunas cosas esté muy equivocado (si es así ponedme un comentario).
Solo voy a hablar de Opera, Firefox, Internet Explorer (todos bajo Windows), que son los que uso.
Empecemos por Opera. Sólo lo uso para comprobar que lo que desarrollo funciona, para navegar uso el Firefox y cuando no queda más remedio el IE, por eso estos comentarios pueden ser un poco inexactos.

  • El SVG va fatal, pero... ¿a quien le importa?, pues a unos pocos como yo a los que nos gusta el SVG, es una pena. El pluggin de Adobe no funciona a las mil maravillas y el SVG nativo solo soporta SVG Tiny. Eso sí, al menos soporta SVG, cosa que el IE ni se molesta en hacer.
  • En el trabajo tenemos una URL para configuración automática de proxy (no sé si pasa lo mismo con una dirección proxy normal) y cuando pongo el Opera intenta conectarse a internet (supongo que por el tema de actualizaciones) y hasta que no sale la ventanita de autenticación no puedo hacer nada de nada, ni ver páginas locales, y puede llegar a tardar dos minutos en aparecer la ventanita (en los otros navegadores es automático).
  • Se identifica por defecto como si fuera el Internet Explorer, lo cual está bien si el proxy al que te conectas capa el acceso según el programa que se conecta, aunque creo que eso está un poco anticuado y ya no lo suelen hacer. De todas formas, cuando tienes que detectar el navegador mediante Javascript es un poco lio.
    appCodeName: Mozilla appName: Microsoft Internet Explorer appVersion: 4.0 (compatible; MSIE 6.0; Windows NT 5.1; en) userAgent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; en) Opera 8.51
  • Como me hizo ver un lector de display: NONE, fallaba el scrolling de las capas cuando se modificaba la propiedad scrollTop, moviendo todo el documento y no unicamente la capa.
  • Los iframes permanecen siempre encima de los demás objetos del HTML, aunque se modifique el z-index (esto me fastidia un script que estoy haciendo para incluir en display: NONE).
  • Cuando un objeto tiene el estilo display = "none", no puedo realizar ciertas operaciones sobre él.
El siguiente es el Firefox, la verdad es que tengo pocas quejas de él, es el que siempre uso y cada vez me gusta más, pero si que hay alguna cosilla que no me gusta del todo.
  • Cuando quiero duplicar una pestaña, tengo que crearme una nueva y luego copiar la dirección. Esto creo que lo comentaba también el diseñador de IE y la verdad es que eso si me gusta de IE. No estoy seguro, pero creo que hay una extensión que te permite eso.
  • El firefox tiene la misma sesión para todas las pestañas/ventanas abiertas, lo cual está muy bien, pero por ejemplo, en mi caso, tengo una dirección de correo de GMail para uso personal y otra para el blog, y si quiero ver las dos a la vez no puedo, tengo que cerrar sesiones todo el tiempo, con el IE se puede hacer creando dos instancias de iexplorer.exe, pero con Firefox no, ya que si lo vuelvo a llamar me usa la misma instancia (si se puede hacer, no lo sé). Si me gustaría que en una pestaña pudiera decir, aquí una sesión distinta. El tema de las cuentas de GMail he sido capaz de resolverlo con la extensión IE Tab.
Y por último el IE.

martes, febrero 21, 2006

Centrado de capas

Una forma de presentar páginas que me gusta bastante, es crear una capa de un tamaño fijo y colocarla en medio de la pantalla y allí mostrar la información. Debo reconocer que lo copié descaradamente (él sabe quién es) y desde entonces lo uso alguna que otra vez. Para realizarlo se usa un div centrado horizontal y verticalmente, hay varias formas de hacerlo, la menos moderna y la que a veces uso por pereza (pero nunca en algo serio) es usar tablas con width 100% y height 100% y centrando el contenido de la única celda que tiene la tabla, vertical y horizontalmente.
La forma limpia es usando estilos, y para ser sinceros, la más rápida (entonces, ¿por qué me da por usar aún lo de las tablas?, supongo que por malas costumbres). Para ello tenemos que tener en cuenta que el ancho y el alto de la capa debe ser fijo. Lo primero que hacemos es colocar la esquina superior izquierda en el centro de la pantalla (top: 50%; left: 50%) y luego mover la capa la mitad del ancho de la capa en pixels hacia la izquierda y la mitad del alto de la capa en pixels hacia arriba (margin-left: -xpx; margin-top: -ypx). Y ya está, con esto tenemos la capa centrada perfectamente y seguirá igual cuando se modifique el tamaño de la ventana.

    div.contenedor {         width: 700px;         height: 500px;         position:absolute;         left:50%;         top:50%;         margin-left:-350px;         margin-top:-250px;     }

lunes, febrero 20, 2006

Modificar el texto del botón de un input="file"

Cuando he estado trabajando en proyectos multi-lenguaje, normalmente piden que el botón del input file tenga el texto que ellos quieren, normalmente traducido al idioma correspondiente y no en inglés. Mi respuesta sería que el texto del botón no se puede modificar y si te viene en inglés es porque quizás el resto del navegador también está en inglés. El tema es que te dicen que el mismo navegador puede ser usado por personas que usan distintos idiomas. ¿Mi respuesta?: "mala suerte, es lo que hay".
A parte de ser un tanto borde, el motivo real es no complicarse la vida. El texto no se puede cambiar y lo único que se puede hacer es simularlo. En Quirksmode se explica una forma de hacerlo que para mí es impresionante, como el resto de su página, que te recomiendo que leas.

El método que usa es el siguiente, escribe una caja de texto y al lado un botón (por ejemplo una imagen con el texto que queremos), y encima de ello, tapándolo, escribe el input="file". Por ahora no se consigue nada, porque se sigue viendo el input file y el texto sigue siendo el mismo. Lo que hace a continuación es volver transparente (opacity: 0) el input file, por lo que ya se vería el input file que nosotros hemos diseñado y no el original. ¿Por qué transparente?, porque si se hace invisible (visibility: hidden) o simplemente no se muestra (display: none), no se tiene acceso a él mediante el ratón, por lo que no se podría hacer click en el botón y que nos mostraría la ventana de selección del archivo (en IE si se puede abrir esa ventana con el evento click(), pero en Firefox no se puede por razones de seguridad). Cuando un objeto es transparente, podemos usarlo (hacer click, ...), mientras que en los otros dos casos no se puede.
El resultado final es que vemos un input file que nosotros hemos diseñado, y cuando pinchamos en él, lo que realmente hacemos es pinchar en el original que no vemos porque está transparente. La única pega que le veo es que la propiedad opacity no lo admiten todos los navegadores, e incluso hay que usar distintos estilos según sea el navegador.
Visto en: Quirksmode.

sábado, febrero 18, 2006

Crear gráficas mediante SVG y sin PHP

Ya vimos como crear una gráfica con los datos que obteníamos mediante una consulta a la BD, mientras que la tabla si se reordenaba mediante Javascript, era necesario realizar llamadas al servidor para actualizar los datos. ¿Problemas?, que la llamada puede tardar en responder (dependiendo del servidor y muchas otras cosas) y que se pueden llegar a hacer muchas llamadas al servidor, lo cual tampoco puede llegar a ser muy bueno para el rendimiento de este.
Por ello vamos a realizar la gráfica SVG dinámicamente mediante Javascript, se ahorra uso del servidor, ya que la acción la realiza el navegador (si es Firefox, mejor que mejor), eso sí, sin saturarlo porque las acciones que hace no son muy complejas (dependiendo del tamaño de la tabla). Está claro que este modo de trabajo no se puede usar cuando los datos se actualizan con mucha frecuencia, casi contínuamente, porque entonces la creación de la tabla y de la gráfica debería ser siempre en el servidor (accediendo a los datos actualizados).

¿Usará Google Maps SVG?

Bueno, tanto como usar, lo que se dice usar, no está muy claro, hay el rumor de que es posible que lo usen. Todo esto viene porque en un hilo de una discusión de los grupos de Google, se han metido en la API de Google Maps y han visto que hay dos variables que hacen referencia a SVG, aunque luego más tarde dicen que la versión que están investigando tiene fallos. Ya nos enteraremos de qué es lo que pasa realmente, y si Google Maps admite SVG o no. La verdad es que solo se me ocurriría que quisieran usarlo para cambiar algo de la funcionalidad, porque por lo poco que sé de cómo funciona Google Maps, a mí siempre me ha parecido que usan una BD de imágenes estáticas y no se calcula dinámicamente la imágen que se quiere mostrar como suelen hacer las aplicaciones GIS (como por ejemplo uno de los que ofrece Demis).
Visto en Something Witty Goes Here

viernes, febrero 17, 2006

Historial de Microsiervos [19/07/2001 a 17/02/2006]

El otro día comentaba con un amigo, al que le estaba mostrando display: NONE y que no sabe nada de la blogosfera ni de lo que cuento en mis entradas, que era bastante importante aparecer enlazado en otro blog para que la gente te conozca. Le comentaba el caso de Microsiervos, Error 500 y Denken Über, que me habían enlazado y que en las estadísticas se veía bastante reflejado.
Esta conversación derivó en el tema de las expresiones regulares, qué eran, para qué servían, etc... El caso es que intentando explicárselo con un ejemplo, fuimos al buscador de Microsiervos... ¿resultado?, todas las entradas de Microsiervos desde su inicio (19 de julio de 2001) hasta la actualidad (17 de febrero de 2006).
Lógicamente, no voy a decir cómo lo hicimos, aunque tampoco es muy complicado. Eso sí, quisiera pedir perdón a Microsiervos por si he saturado un poco su servidor (aunque no parecía que diera muchos problemas), voy a ver si les aviso de alguna forma, y para los curiosos os pongo un ZIP con todo lo que me bajé. Como consejillo, perdón otra vez por la arrogancia ;-), les diría que limitaran el número de resultados o que pusieran paginación.
El historial de Microsiervos os lo podéis bajar aquí: ARCHIVO, no me seáis #@%;! y no hagáis nada que vaya en perjuicio de Microsiervos.

jueves, febrero 16, 2006

Crear gráficas mediante SVG

Continuando con SVG, vamos a realizar un ejemplo que nos puede ser de utilidad y para que no todo se quede en teoría. Para ello vamos a usar la tabla ordenada mediante Javascript y le vamos a añadir un documento SVG que muestre los habitantes del 2005 en una gráfica de barras. Aunque se podría hacer todo de forma estática, ya que el SVG permite interactuar con la página, lo haremos mediante PHP para que se entienda con mayor claridad.

miércoles, febrero 15, 2006

Ordenar tablas mediante Javascript

A la hora de mostrar tablas, el orden por el cual está ordenada puede ayudarnos a ver con mayor facilidad la información que contiene, ordenada por distintas columnas pueder revelar diferentes aspectos sobre los datos que almacena.
En el caso de que la tabla se genere dinámicamente (consulta a una BD y mostrándola mediante una JSP o una página PHP), cuando se quiere volver a ordenar la tabla por otra columna, se vuelve a cargar la página para que la tabla se actualice. Cuando se trata de una página estática se debería cargar otra página distinta. Todo esto no es necesario si se realiza la ordenación mediante Javascript.

martes, febrero 14, 2006

Miedo me da

Acabo de ver en Genbeta la entrada ¿Que saben las webs que visitamos de nosotros? Con ProjectIp lo sabrás, y aunque conocía la información que se puede obtener, no había caido en la cuenta de que el IE puede leer lo que tienes en tu portapapeles, lo cual me parece bastante inapropiado. Sí, está muy bien tener esa utilidad y poder trabajar con ella, pueden conseguirse cosas interesantes con ello, pero también habrá quién obtenga cosas "interesantes" para ellos de nuestro portapaleles.
Me parece un fallo enorme que mediante el IE se pueda obtener información de nuestro ordenador, la gente normalmente no suele poner nada importante en el portapapeles, pero no todo el mundo tiene esa precaución, muchas veces se usa el copy/paste y no pensamos que pueda ser accesible desde una página web.
No sé, no me parece correcto que está información esté disponible para todo aquel que tenga malas intenciones. Afortunadamente, el Firefox, que es el navegador que uso, no permite esto.
Visto en: Genbeta
Enlace: Project IP

SVG, ese gran desconocido

Soy un apasionado del SVG y me gustaría conocerlo aún más, pero supongo que la falta de tiempo me hace no poder meterme del todo. ¿Qué es el SVG? es un formato de gráficos vectoriales del World Wide Web Consortium (W3C) en formato XML, que si bien se piensa en él para el entorno web, puede ser usado en muchos entornos: diseño, iconos para escritorio, ...
Una definición mejor podría ser (y es) la que nos encontramos en la Wikipedia:

Scalable Vector Graphics (SVG) es un lenguaje para describir gráficos vectoriales bidimensionales, tanto estáticos como animados (estos últimos con ayuda de SMIL), en XML.
Suele haber una disputa entre si es mejor el SVG o el Flash, pero, para mí gusto, es como la discusión entre ciencia y religión, puedes ser científico y tener creencias religiosas y no va a pasar nada. En este caso es lo mismo, más que discutir sobre que es mejor o peor, etc... ¿por qué no aprovecharnos de lo que nos ofrecen los dos formatos?. Aunque no soy muy amante del Flash, sería estúpido negar que se pueden hacer cosas increibles y que con SVG puede ser bastante complicado de hacer, pero también es cierto que con SVG se pueden hacer muchas cosas y más fáciles que con Flash, ya que es texto, no un formato binario.
Le veo mucha utilidad al SVG cuando se quieren mostrar gráficas de estadísticas en nuestra aplicación, una consulta a la base de datos, y un script PHP (por ejemplo) para escribir un sencillo XML y ya tendríamos nuestra gráfica de estadísiticas. Aunque también le veo inconvenientes, como por ejemplo que en IE tengas que instalar un pluggin para poder visualizar el SVG (y la gente no suele estar muy dada a instalar pluggins), Opera y Firefox (a partir de la versión 2) soportarán SVG, pero eso tampoco es bueno, porque cada uno puede sacar distintos resultados (esperemos que no). También echo de menos que el grosor de las líneas en SVG no contemple como en Flash el hilo. Pero también es cierto que los filtros que se pueden efectuar sobre SVG son impresionantes.
Intentaré ir poniendo ejemplos de uso, pero mientras tanto os paso estos enlaces para que vayais cogiéndole el gusto:

domingo, febrero 12, 2006

Contar palabras usando expresiones regulares

Gracias a que Microsiervos (en particular Nacho) ha puesto un enlace a mi blog en una de sus entradas, lo que cuento sobre las expresiones regulares ha sido de lo más leido en display: NONE. [Actualizado: según me cuenta Mario, él visitó la página gracias a Denker, cuando puse la entrada aún no había visto las estadísticas y la verdad es que también tengo que darle las gracias a Denker y a Error 500 por haberme puesto en sus blogs]. Supongo que debido a ello, Caso Patologico me pregunta en un comentario si sé de algún script que cuente palabras. Pues sin irnos del tema, voy a explicar como lo haría yo usando las expresiones regulares.
En el ejemplo que voy a mostrar, lo que hago es pasar a una función como parámetro un objeto HTML (en este caso un DIV), obtendré el código HTML usando la propiedad innerHTML, después quitaré las etiquetas HTML (<...>) y por último contaré las palabras.
Quizás fuera más sencillo pasar directamente el texto que quiero tratar, pero pasando el objeto también muestro como quitar etiquetas HTML usando las expresiones regulares.
El código sería el siguiente:

    function contarPalabras(obj) {         var txt = obj.innerHTML;                  // Borro todo aquello que esté         // contenido entre < y >         txt = txt.replace(/<(\/|\w|\s|=|"|\n)*>/g, "");                  // Almaceno las coincidencias con palabras         // Al hacer copy/paste debeis ponerlo todo en una línea         var palabras = txt.match(/(\w|á|é|í|ó|ú|ü|ñ|Ñ|Á|É|Í|Ó|Ú)+             [\s\n\r\t,\.;:"'\(\)\{\}\[\]$]*/g);         alert(palabras.length);     }

Así, a simple vista, puede ser fácil no comprender mucho, pero si nos detenemos un poco a intentar entender el contenido de las expresiones regulares, veremos que no es tan difícil.

/<(\/|\w|\s|=|"|\n)*>/g

Esta expresión regular es la que se encarga de reconocer las etiquetas HTML:
  • Primero nos encontramos con un <, que es por lo que empieza cualquier etiqueta HTML
  • Después nos encontramos con un conjunto de caracteres entre paréntesis y separados por |, esto quiere decir que el carácter siguiente está dentro de esos posibles valores:
    • \/ representa a /, es necesario escaparla porque tiene significado propio.
    • \w representa cualquier valor alfanumérico
    • \s representa cualquier el espacio en blanco
    • \n representa el retorno de carro
    • " y = se representan a ellos mismos
  • El conjunto anterior está seguido por *, que indica que puede o no aparecer, y en ese caso, aparecer tantas veces como quiera
  • Y por último encontramos un > que es el carácter final de las etiquetas HTML
  • La g al final indica que se hace una búsqueda global, no finaliza al encontrar el primer caso
Al final lo que tenemos es una expresión regular que detecta todo conjunto de palabras (con números), espacios, comillas, iguales y saltos de línea encerrados entre < y >.
La siguiente expresión regular es la que detecta las palabras y si que nos puede parecer complicada de entender, pero es más sencilla aún que la anterior. Vamos a usar la funcion match la cual nos devuelve una lista con las coincidencias de la expresión regular, y viendo el número de elementos que tiene la lista, sabremos cuantas palabras hay.

/(\w|á|é|í|ó|ú|ü|ñ|Ñ|Á|É|Í|Ó|Ú)+[\s\n\r\t,\.;:"'\(\)\{\}\[\]$]*/g

Esta expresión regular encuentra las palabras seguidas por caracteres que separan palabras (espacios, signos de puntuación, ...):
  • Primeramente hay un grupo de caracteres entre paréntesis, seguido de un + (que indica que se repite una vez o varias). Realmente solo debería aparecer el carácter \w que representa a cualquier carácter alfanumérico, pero no sé por qué (quizás solo en Firefox) no reconoce las vocales acentuadas, ...
  • Después hay un conjunto de caracteres separadores de palabras, incluido el final de cadena ($)
Por lo que reconocerá palabras seguidas de caracteres separadores, separando así las palabras.