Weblog
DHTML está de moda
Año nuevo, vida nueva. Año nuevo, moda nueva. Así que estamos muy contentos de recibir 2005 con noticias de este tipo. Parece que por fin hay gente que apuesta en serio por DHTML para solucionar problemas de navegación o usabilidad, o simplemente creando aplicaciones dinámicas que usan esta tecnología en lugar del omnipresente Flash. Vamos a ver unos cuantos ejemplos.
- esta impresionante aplicación para visualizar mapas de Suiza, incluye efectos de zoom. No, en serio, no es Flash.
- Google ha desarrollado recientemente dos proyectos interesantes. En el caso de Gmail, nos permite chequear el número de emails recibidos sin recargar toda la página (entre otras muchas cosas), mientras que en Google Suggest al ir escribiendo la búsqueda aparecen sugerencias de los términos más parecidos y su número de documentos, adelantándose a tu intención. Estos dos ejemplos usan el objeto XMLHttpRequest, que nos permite realizar peticiones al servidor sin recargar la página. Aquí podeis ver exactamente cómo funciona el suggest. Podemos esperar más cosas brillantes por parte de Google próximamente, sabiendo que Mr. Boodman se ha pasado a su bando, de momento para mejorar Blogger.
- No es que el uso de scripts remotos en tiempo real sea algo nuevo, hasta ahora se usaban varios métodos como el iframe actuando de buffer, recibiendo datos de una página y escribiendo en una capa, o bien el truco de usar una imagen para añadir scripts, o el menos conocido a la par que elegante método de Dan Pupius (que debo tener por ahí), que representaba una mejora sustancial respecto al pionero. Incluso el ahora de moda XMLHttpRequest es algo viejo, solo que ahora está muy bien implementado en nuevos navegadores. Ya existian los scripts de WebFX y la Sarissa API. Para no seguir aburriendo con tecnicismos y palabrería, ahí va un pequeño resumen con definiciones y ejemplos de uso en este wiki de sourceforge.
- también interesante resulta el Javascript Shell, que nos permite hacer pruebas con el DOM usando una interface tipo linea de comandos.
- también se pondrá de moda el concepto de DHTML no intrusivo, por el cual el script es una mejora en usabilidad y nunca un requisito ni el mecanismo para escribir contenido. Ejemplos hay cada vez más, como el excelente fancy menu, un menú tipo flash basado en listas html, igual que último apaño de un script de Aaron (en este caso el Accelimation) que he hecho para el menú de pixilate, o bien cualquier otro script no intrusivo
Ah, y antes de irme, solamente decir que este año sí que van a fructificar proyectos relacionados con DHTML a nivel local (algo se cuece desde hace un tiempo con Pedro y otros bloggers cercanos) e internacional (13thparallel cambia de formato, el Dojo Toolkit, etc). Otro día seguimos.
Programas gratuitos de uso diario
Últimamente se ha hablado mucho del lanzamiento definitivo de la primera versión terminada de Mozilla Firefox. Sin duda es un buen programa y sobretodo una excelente alternativa a Internet Explorer. Además de la seguridad que ofrece, su navegación por pestañas y su rapidez, lo que a mi entender lo hace tan atractivo (más que Opera, la otra gran alternativa) es la gran cantidad de extensiones que tenemos a nuestra disposición, que nos permiten configurar no solo la apariencia sino también las funciones de nuestro navegador. Yo por ejemplo uso las siguientes:
- Tabbrowser Preferences 1.1.1 para mejorar la navegación por pestañas
- Web Developer 0.8 (basado en el anterior PNH Toolbar, al cual mejora bastante) para todo lo relacionado con el desarrollo web, como deshabilitar estilos, visualizar bordes de tablas, editar las CSS de una página al vuelo, etc.
- greasemonkey permite añadir scripts propios a páginas ajenas, para cambiar su comportamiento. Por ejemplo para hacer que todos las url de una página sean enlaces, o destruir los famosos target _blank
- Adblock permite bloquear elementos no deseables (por ejemplo banners) usando expresiones regulares (para bloquear sitios específicos, carpetas, etc.)
- Page Rank Status añade un pequeño icono en la barra de estado para mostrar el page rank de esa página visitada
- ieview permite mediante el uso del menú contextual abrir esa misma página en Internet Explorer (así no tenemos ni siqueira que copiar y pegar)
- Gmail Notifier para estar al tanto de nuestro buzón de correo en Gmail
- Bloglines Toolkit permite estar informado de las actualizaciones en nuestra lista de subscripciones a noticias
- ForecastFox nos indica el tiempo que hace fuera y nos da una previsión para los próximos días
Asimismo, otra gran noticia ha sido el lanzamiento de la primera versión terminada de Mozilla Thunderbird, un excelente gestor de correo electrónico. También dispone de numerosas extensiones, pero en este caso yo lo uso tal cual viene de fábrica.
Para finalizar, recomendar de nuevo el uso de un buen programa antivirus como es el AVG de Grisoft, que además es gratuito. En esta nueva versión (AVG 7.0 Free) hay una utilidad para asociar el antivirus al gestor de correos, con la novedad de que funciona incluso si usamos el Thunderbird. Pefecto.
Actualización de FLACCESS
Acabo de lanzar la versión 1.3, que incluye algunos cambios respecto a la explicación original de cómo usar el script, parámetros, etc (ya han sido actualizados también ahí):
- Hay una version "ligera", que funciona solamente en navegadores actuales e inserta el flash al vuelo (no tiene la opción de retrasar la carga).
- El id del objeto flash debe pasarse junto al argumento ruta (ej.: "fl1,in,out"). Como la versión ligera solamente funciona en navegadores actuales tansolo requiere el id del flash y de su ancestro (no la ruta completa que necesitábamos para ns4).
- El id se añade al objeto y al embed. Para evitar duplicar id's embed usará el id en el name y "name"+id en el id.
- La cadena ruta también se enviará como flashvar, para que podamos acceder a ella desde javascript.
- El elemento ancestro adquiere el mismo tamaño que el objeto flash (para ajustar el flujo de la página).
Bájate el último archivo comprimido con ejemplos para verlo funcionando.
¡Quiero mi ventana, joder! (o como destruir los target _blank)
Siempre he pensado que el usuario debe poder elegir dónde quiere cargar un nuevo documento desde un enlace. Yo defiendo que como desarrollador puedes usar una cookie y ofrecer esa posibilidad si el usuario quiere, pero solamente si quiere (podeis ver el formulario de preferencias al fondo de la página). Mucha otra gente opina que lo mejor es no dejarles pensar y abrirlo todo en una ventana nueva. Odio esos casos. ¿Qué pasa si a mi no me da la gana irme de mi ventana? Oye, que si me gusta tu web ya volveré, tranquilo... Pues no, se empeñan en usar el target _blank. Bueno, pues todo esto se ha terminado. Adiós a los malditos target _blank. Si quereis saber cómo, seguid leyendo...
Seguir leyendo noticia
Artículo sobre DHTML no intrusivo
Acaba de salir del horno un interesante artículo en diseñorama sobre DHTML y cómo programar páginas web manteniendo la accesibilidad, lo que últimamente se denomina DHTML no intrusivo. Ah, si, se me olvidaba, escrito por el menda, si tienen algún comentario se agradecerá la crítica constructiva, tanto si quieren dejarlo allí como aquí.Poco a poco iré añadiendo más ejemplos por aquí, si el tiempo lo permite.
Cómo añadir números de linea a los bloques de código
Acabo de descubrir cómo añadir números de linea a los bloques de código que están dentro de texto preformateado. Se trata de usar una función javascript que recoge todos los elementos pre, y llama a una expresión regular que devuelve el número de lineas en ese bloque. Entonces, usando innerHTML simplemente añadimos una capa div que contiene los números de linea y se le da estilo usando CSS. El javascript, que forma parte de un espacio propio (un objeto literal para encapsular sus funciones) sería algo del estilo:
// adds line numbers to code sections:
numberCodeTags : function(){
var PRE = document.getElementsByTagName('pre');
var nl = /\n+/mg;
for (var i = 0; i < PRE.length; i++) {
var t = PRE[i].innerHTML;
//mozilla/ff cannot select all lines of a code element
//that is inside a pre element:
if(document.addEventListener && !window.opera) {
Extras.getCodeText(PRE[i]);
}
//will only work in mozilla+op (IE replaces \n by a space so its useless):
var NL = Extras.getMatchArray(t,nl);
if(NL) {
var numeros = "";
for (var lineas = 1; lineas < NL; lineas++)
numeros += lineas +"\n";
PRE[i].innerHTML += "<div class='lines'>"+numeros+"</div>";
}
}
},
// matches a regexp to a string, returns array
getMatchArray : function(myString,myRegExp){
return myString.match(myRegExp).length;
},
// FF hack to make easier select all lines of a
//code element that is inside a pre element:
getCodeText : function(obj){
var color = CSS.getStyle(obj.firstChild,"color");
var bgcolor = CSS.getStyle(obj.firstChild,"backgroundColor");
if(bgcolor=="transparent") bgcolor="white";
obj.onmouseover = function(){
obj.firstChild.style.color = bgcolor;
obj.firstChild.style.backgroundColor = color;
}
obj.onmouseout = function(){
obj.firstChild.style.color = color;
obj.firstChild.style.backgroundColor = bgcolor;
}
},
El CSS podría ser algo parecido a estas lineas:
pre {
position: relative;
color: #913117;
padding: 0px 1em 0px 1em;
margin: 0px;
font-family: Courier, monospace;
font-size: 1em;
}
code {
font-variant: normal;
color: #913117;
}
pre code {
position: relative;
top: 0px;
left: 1.2em;
font-variant: normal;
color: #913117;
padding: 0px;
margin: 0px;
}
pre .lines {
position: absolute;
top: 1em;
left: 0px;
width: 1.2em;
padding: 0px;
margin: 0px 1.2em 0px 0px;
background: #913117;
color: white;
}
La técnica parece funcionar solamente en Mozilla y Opera. IE reemplazaba los saltos de linea por espacios así que lo he ignorado. Los demás navegadores degradan tranquilamente.
Como ya han comentado, en Mozilla hay un fallo que no permite la selección de bloques de código que están dentro de bloques de texto preformateado. He intentado añadir un fondo de color (solamente para Mozilla) al pasar el ratón por encima, porque así parece un poco más fácil de ver cómo poder seleccionar. Aparentemente, si empezamos la selección en el espacio que hay entre el texto preformateado y el bloque de código (el espacio en blanco entre los números y el código), se deja seleccionar.
Algunas etiquetas permitidas en los comentarios
Ayer por la noche pude acabar una modificación en el sistema de gestión de contenidos de este weblog, con la inestimable ayuda de Dan para solucionar una expresión regular. Gracias a eso, ahora los comentarios admiten las siguientes etiquetas: p, a, em, strong, pre, code.
Recomiendo que useis la etiqueta de párrafo para abrir y cerrar un bloque de párrafo, el texto quedará mejor. Si quereis añadir código en linea (dentro de un párrafo) simplemente usad la etiqueta code, el script se encargará de las entidades. Si por lo contrario quereis el código en un bloque aparte, que respete los saltos de línea, etc, podeis usar <pre><code>tu código</ code></pre> pero fuera de un párrafo (pre actua como bloque). Cualquier otra código o etiqueta que no esté dentro de code será destruida.
Bookmarklet para aumentar el tamaño de tus ... textarea
Acabo de hacer un pequeño script que aumenta el tamaño de todos los textarea de una página (incluyendo las páginas interiores de un frame) hasta los 450px de ancho y 250px de alto. Podeis guardarlo como favoritos y usarlo en vuestros gestores de contenidos o en esa típica página que te deja solamente 100 píxeles de ancho para escribir un mensaje. Para ejecutarlo aquí mismo, seguid este enlace. A mi me vendrá de perlas para escribir modificaciones en el phpMyAdmin. Como siempre, si te gusta el script, puedes encontrar más en la sección utilidades.
Presentación de FLACCESS: flash manteniendo la accesibilidad
Detección de flash: métodos anteriores
He intentado descubrir un método que detecte en el servidor la versión instalada del plugin en el navegador, pero a pesar de que a macromedia no le costaría nada añadir la versión a la variable devuelta por el HTTP_ACCEPT, se empeña en obligarnos a usar lenguajes de cliente para detectarlo. Si tuviesemos esa opción podríamos gestionar el contenido alternativo desde el mismo servidor o añadir el método del flash satay sin temor alguno. El problema principal de esa técnica es que nevegadores con plugins antiguos no cargan el flash ni dejan ver el texto alternativo, y en menor medida, que no hace streaming, aunque para eso podemos usar una película lanzadera, como en mi anterior artículo. Además, algunos lectores me han comentado que el método de añadir flash con lanzadera no es suficientemente flexible (por ejemplo no permite pasar variables al flash) y casca en algunos navegadores (como mi Opera 7.23). Por esa razón he intentado un camino distinto.
Concepto
La idea es básicamente similar al concepto del sIFR: tener el contenio alternativo en algún elemento html, luego tener un script que detecte la versión del plugin en el navegador y si es la necesaria entonces sustituir el contenido alternativo por el objeto flash. La ventaja de este método, es que a diferencia de el 99% de los métodos habituales, si el navegador no tiene javascript o no puede cargar el objeto flash, el contenido alternativo sigue estando en el html, por lo cual la accesibilidad es alta. En cambio, en los otros métodos, el javascript se encarga de escribir en el documento el objeto flash y el contenido alternativo, que evidentemente resulta inaccesible en caso de no tener javascript activado. Así pues manos a la obra...
Seguir leyendo noticia
Añadiendo Flash de manera accesible
Método obsoleto en detrimento de este otro. Lo dejo aquí para mantener un archivo de cómo ha ido el tema.
El por qué
Hace poco estaba haciendo una web que tenía que ser accesible, pero que a la vez tenía un menú en flash.
Como yo el flash nunca lo he usado hasta ahora empecé a investigar un poco y descubrí que casi todo el mundo
pasa de dar contenidos alternativos al flash y lo peor de todo, inserta sus películas dentro de etiquetas
object usando javascript para detectar la versión del plugin. Eso representa un grave problema de accesibilidad,
puesto que los usuarios que no tengan javascript activado no podrán insertar la película y además no podrán leer
el contenido alternativo (si lo hay).
Seguir leyendo noticia
Barra de progreso en ... PHP
Situación
Tengo que hacer una importación masiva de datos de Excel a MySQL. Todo muy bien, excepto por dos detalles: debo usar un set_time_limit(600); para sobrepasar el tiempo máximo de ejecución del servidor (ningún problema) y durante todo el proceso los echo que están dentro del bucle interminable no salen por pantalla. Eso ya me preocupa más porque el usuario que haga la importación puede pensar que el proceso se ha quedado congelado en algún punto. Así que me pongo a buscar...
Avances
Parece ser que php trae unas funciones que liberan el contenido de los buffers por pantalla. Se trata de flush() y ob_flush(). Sinceramente no entiendo muy bien la diferencia entre ambos, pero por lo visto en los comentarios del manual es mejor usarlos conjuntamente para asegurarse que el contenido actual de la página de muestra en el navegador. Probamos en cada etapa del bucle y bingo! La cosa funciona! Así que me pongo a pensar si será posible hacer una barra de progreso en PHP... Y lo es! No me lo puedo creer. Claro que bajo ciertas condiciones, pero el efecto es una gozada. Veamos...
Seguir leyendo noticia
¿Alguien tiene los artículos de mysql-hispano?
Parece ser que mysql-hispano ha muerto. La verdad es que es una pena porque los artículos tenían mucho nivel. Y cosas que pasan, leyes de Murphy o lo que quieras, no hace ni una semana que comentaba en este post sobre los que me parecían más interesantes y ahora ya no están... Casi siempre suelo guardarme una copia local de los artículos que puedo necesitar en un futuro, por si las moscas. Curioso, esta vez no lo he hecho.
Así que apelo al compañerismo y las copias de seguridad ajenas... Ya se que es muy ruin, pero si alguien tiene alguno de esos artículos mencionados en el otro post, ¿me puede enviar un email y ya apañaremos el intercambio? (la cesión más bien...). Muchas gracias por adelantado.
Como bien nos informa mur0 en los comentarios, parece que los chicos de mysql-hispano cedieron algunos artículos a la gente de programacion.com. Reproducimos aquí los que se recuperan de la lista del post anterior: Principios de diseño de bases de datos y Transacciones en MySQL. Perdemos los de Tipos de datos en MySQL, Integridad referencial en MySQL e Índices y optimización de consultas. Ya revisando esa sección he encontrado uno también muy interesante: Lo nuevo de MySQL 4.0, traducido por mysql-hispano de un artículo del mismísimo Jeremy Zawodny
Apaño de scroller dhtml de Aaron Boodman (ypSimpleScroll)
Os presento un apaño que hice para la web de mtv españa durante el mes de mayo de 2004. Necesitábamos un scroller dhtml que
funcionase con flechas, con soltar y arrastrar, y además fuese compatible con el explorer de mac. No había manera de encontrar uno
que cumpliese todos los requisitos, así que pillé el ypSimpleScroll de Aaron Boodman y lo modifiqué mezclándolo con su script de soltar y arrastrar.
El script degrada perfectamente en (casi) todos los navegadores, aunque por lo visto en Opera casca y no degrada bien porque aplica el script
a medias. No me he entretenido en buscar el fallo, si alguien tiene tiempo puede enviarme un email. Os dejo con un ejemplo del script usando
texto de mi página de utilidades.
Seguir leyendo noticia
Tutoriales de MySQL y de diseño y normalizacion de bases de datos, Recuperación de Información...
Una de enlaces interesantes. Últimamente me estoy empapando de teoría para una aplicación relativamente potente, para la cual he tenido que meterme con las transacciones y por tanto a leer teoría. Os dejo unas joyitas:
- Principios de diseño de bases de datos:
consejos útiles para construir una base de datos con un buen diseño para que las aplicaciones MySQL sean más eficientes y escalables
- Normalización de bases de datos:
se explican los conceptos de la normalización de bases de datos, mismos que son necesarios para un buen diseño de una base de datos
- Tipos de datos en MySQL:
se presentan las características de cada uno de los tipos de datos que pueden ser usados en las columnas de una tabla en MySQL
- Integridad referencial en MySQL:
se tratan brevemente los conceptos de la integridad referencial, y se explica como aplicarlos en MySQL para la definición de claves foráneas
- Índices y optimización de consultas:
se explican las características de los distintos tipos de índices que pueden ser utilizados en MySQL, y cómo afectan el procesamiento de las consultas
- Transacciones en MySQL:
introducción al uso de las sentencias BEGIN, COMMIT y ROLLBACK para el manejo de transacciones en MySQL con el uso de tablas del tipo InnoDB
- Storage Engine (Table Types): (en inglés)
This chapter covers the MySQL architecture, locking and concurrency, and transactions. It also discusses how to select the right engine and looks at each of MySQL's storage engines in detail
- Recuperar información con el Modelo de Espacio Vectorial:
La recuperación de información es el proceso mediante el cual, partiendo de una colección de textos fija (por ejemplo resúmenes de libros) y una necesidad de información (expresada por ejemplo mediante palabras unidas por operadores booleanos), se devuelven los documentos que mejor satisfacen esa necesidad. Se trata de un proceso con numerosas aplicaciones prácticas, como buscadores web o bibliotecas digitales.
Como veis la mayoría son de un mismo sitio, pero creo que vale la pena fusilarlos tan exageradamente, son excelentes. El último ya lo había enlazado hace tiempo y no tiene mucha relación con el diseño de bases de datos ni con MySQL específicamente, pero he decidido enlazarlo también aquí para tenerlo más a mano, el concepto me parece una obra de arte.
Libros de programación gratis (II)
Acabo de descubrir esta pequeña maravilla: Practical PHP Programming, un libro de PHP online gratuito. Que no os tire para atrás que sea gratuito, el nivel es muy bueno y tiene trucos muy bien explicados.